ich brauche zwei synchronisierte TreeViews. Dazu kopiere ich den Inhalt des ersten per Items.Assign in den zweiten, was soweit auch funktioniert. Laut Doku sollen dabei auch die mit den Items verknüpften Objekte 'kopiert' werden. Allerdings erhalte ich einen SIGSEGV, wenn ich auf die Daten des zweiten zugreifen will.
Zur Verdeutlichung erstelle ich eine Beispielklasse, hänge eine erstellte Instanz an einen Knoten im TreeView1 und lasse mir im onChange Ereigniss eine Info in einem Label anzeigen. Das funktioniert, wenn ich einen Eintrag im TreeView1 auswähle, im zweiten nicht.
Offensichtlich mache ich etwas falsch!?
Gruß
Alex
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
ComCtrls, StdCtrls;
type
TTestClass = class(TObject)
private
FText: String;
public
constructor Create;
destructor Destroy; override;
procedure ShowInfo;
end;
{ TForm1 }
TForm1 = class(TForm)
Label1: TLabel;
TreeView1: TTreeView;
TreeView2: TTreeView;
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
procedure TreeView2Change(Sender: TObject; Node: TTreeNode);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
tc: TTestClass;
begin
for i := 0 to 9 do
begin
tc := TTestClass.Create;
tc.FText := 'Node Info Nr.' + IntToStr(i);
TreeView1.Items.AddObject(TreeView1.Items.GetLastNode, 'node' + inttostr(i), tc);
end;
TreeView2.Items.Assign(TreeView1.Items);
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
i: Integer;
begin
for i := 0 to TreeView1.Items.Count-1 do
begin
TTestClass(TreeView1.Items[i].Data).Free;
end;
end;
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if Assigned(Node.Data) then TTestClass(Node.Data).ShowInfo;
end;
procedure TForm1.TreeView2Change(Sender: TObject; Node: TTreeNode);
begin
if Assigned(Node.Data) then TTestClass(Node.Data).ShowInfo; // ********* Hier rumpelts
end;
constructor TTestClass.Create;
begin
inherited Create;
end;
destructor TTestClass.Destroy;
begin
inherited Destroy;
end;
procedure TTestClass.ShowInfo;
begin
Form1.Label1.Caption := FText;
end;
end.