ツリービューの親フォームを変更するとノードのデータがおかしくなるのですが何故でしょうか?
教えていただけますか?
もう少し詳しく書いて頂いた方がレスが付くと思いますよ。
TTreeviewのItems[i]のTNodeのDateにPStringを関連付けたのですがTTreeViewのParentを変更すると、PString(Node.Data)の値が参照できなくなります
ご教授お願します
PCHARにして、バッファを確保して文字列を入れてみてください。
OnDeletionイベントで解放するようにしておくと、けっこう簡単に実装できると思います。
パネルをフォームに一つ置き、
ボタンを2つフォームに置きます。
下記のコードを挿入して実行したところ、Dataプロパティも読み込めました。
private
{ Private 宣言 }
SL:TStringList;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.TreeView1Click(Sender: TObject);
begin
ShowMessage(String( TreeView1.Selected.Data))
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
NewNode:TTreeNode;
begin
for i := 0 to 10 do begin
SL.Add(IntTostr(i));
NewNode := TreeView1.Items.Add(nil,IntToStr(i));
NewNode.Data := Pointer(SL[i]);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SL := TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SL.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TreeView1.Parent := Panel1;
end;
実行手順を書き忘れました。
1.ボタン1を押すとツリーノードが作成されます。
2.次にツリーをクリックしてDataプロパティの中身を確認します。
3.ボタン2を押してParentをパネルに変更します
4.ツリーをクリックしてDataプロパティの中身を確認します
試してみます
すみません
元質問と異なりますがデータが構造体の場合はどうすれば良いでしょうか?
こうしても再現できないですね。
LuppinIIIさんのコードを少し変えただけです。
PStringの値、ということでしたので。さらに、親フォームということなので、コントロールでなくTForm2を用意。
でも、言わんとしたいことは何となくわかります。
Stringはプリミティブでないので、PCHARにしたほうがよいです。
private
{ Private 宣言 }
s: array[0..10] of string;
procedure TForm1.TreeView1Click(Sender: TObject);
begin
ShowMessage(PString(TreeView1.Selected.Data)^);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
NewNode:TTreeNode;
begin
for i := 0 to 10 do begin
s[i] := IntTostr(i);
NewNode := TreeView1.Items.Add(nil,s[i]);
NewNode.Data := @s[i];
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TreeView1.Parent := Form2;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Form2.Show;
end;
構造体でも同じです。
ただし、構造体の中にオブジェクトを入れるのはよろしくないかもしれません。
TTest=record
a: string;
b: string;
c: string;
end;
でしたら、
TTest=record
a: PCHAR;
b: PCHAR;
c: PCHAR;
end;
として、それぞれバッファを確保して入れましょう。
>s: array[0..10] of string;
は動的配列でも良いですか?
とりあえず試してみます
私は構造体配列のインデックスをPointer(i)のようにしてDataプロパティに入れています。
TTreeNode継承のクラスを作ったほうが良いですか?
作らなくても実現出来るので私は作っていません。
訳が分からなくなってきましたので、ちょっと確認。
>ツリービューの親フォームを変更するとノードのデータがおかしくなるのですが何故でしょうか?
これは再現しないのでOKですよね? > 質問者さん
動的配列なら、LupinⅢさんのようにインデックスをポインタにキャストする、に一票。
レコード型のフィールドでは string でもOKだと思います。
蛇足ですが、わたしだったら実行中にコンポーネントの Parent を変えるような
ことはしたくありません。
配列で解決しました
ツイート | ![]() |