![]() |
Virtual treeview und Daten
Hallo,
ich arbeite mit Delphi2005 Personal und dem Virtuell Treeview. Um das Füllen der Knotendaten später in eine DLL auslagern zu können, nutze ich im Datenrecord pchar. Ich lese die Daten also aus den editfeldern aus, und speichere sie im record. Wenn ich sie später wieder aus dem Knoten einlese und an die Editfelder übergebe´, habe ich nur noch Müll. Echt zum Haare raufen. Hat jemand eine Idee? Interessanterweise habe ich keine Probleme, wenn ich im record nur strings verwende, und auf die Umwandlung verzichte. Hier der Quellcode: ##################################################
Delphi-Quellcode:
##################################################
unit Unit5;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, VirtualTrees,shellapi; type ttreedata = record fcaption:pchar; fcolumnn1:pchar; text1: pchar; text2:pchar; text3:pchar; end; type TForm5 = class(TForm) vst: TVirtualStringTree; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; insertnodebutton: TButton; exitbutton: TButton; insertdatabutton: TButton; getdatabutton: TButton; procedure vstClick(Sender: TObject); procedure getdatabuttonClick(Sender: TObject); procedure exitbuttonClick(Sender: TObject); procedure insertdatabuttonClick(Sender: TObject); procedure insertnodebuttonClick(Sender: TObject); procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form5: TForm5; implementation var ptreedata:^ttreedata; knoten,knotenparent:pvirtualnode; insertmode,insertdata,getdata:boolean; benutzer:string; {$R *.dfm} procedure TForm5.FormShow(Sender: TObject); begin insertmode:=false; end; procedure TForm5.insertnodebuttonClick(Sender: TObject); begin if not insertmode then begin insertmode:=true; insertdatabutton.Enabled:=false; getdatabutton.Enabled:=false; end else begin insertmode:=false; insertdatabutton.Enabled:=true; insertdatabutton.Enabled:=true; end; end; procedure TForm5.insertdatabuttonClick(Sender: TObject); begin if not insertdata then begin insertdata:=true; insertnodebutton.Enabled:=false; getdatabutton.Enabled:=false; end else begin insertdata:=false; insertnodebutton.Enabled:=true; getdatabutton.Enabled:=true; end; end; procedure TForm5.exitbuttonClick(Sender: TObject); begin form5.close; end; procedure TForm5.getdatabuttonClick(Sender: TObject); begin if not getdata then begin getdata := true; insertnodebutton.Enabled:=false; insertdatabutton.Enabled:=false; end else begin getdata := false; insertnodebutton.Enabled:=true; insertdatabutton.Enabled:=true; end; end; procedure TForm5.vstClick(Sender: TObject); begin if insertmode then begin knoten:=vst.addchild(vst.FocusedNode); vst.NodeDataSize:=sizeof(ttreedata); insertmode:=false; insertdatabutton.enabled:=true; getdatabutton.enabled:=true; end; //von if insertmode ja if insertdata then begin insertdata:=false; insertnodebutton.Enabled:=true; getdatabutton.Enabled:=true; knoten:=vst.FocusedNode; vst.NodeDataSize:=sizeof(ttreedata); ptreedata:=vst.GetNodeData(knoten); ptreedata^.fcaption:=pchar(edit1.Text); showmessage(ptreedata^.fcaption); ptreedata^.text2:=pchar(edit2.Text); ptreedata^.text3:=pchar(edit3.Text); end; if getdata then begin getdata:=false; insertnodebutton.Enabled:=true; insertdatabutton.Enabled:=true; vst.NodeDataSize:=sizeof(ttreedata); knoten:=vst.FocusedNode; ptreedata:=vst.GetNodeData(knoten); edit1.Text:=string(ptreedata^.fcaption); edit2.Text:=string(ptreedata^.text2); edit3.Text:=string(ptreedata^.text3); //showmessage( knotendaten^.fcaption); end; insertnodebutton.enabled:=true; insertdatabutton.Enabled:=true; getdatabutton.Enabled:=true; end; end. Vielen Dank schon jetzt für die Mühen |
Re: Virtual treeview und Daten
*räusper*
könntest du bitte deine quelltext als "Delphi-Code" formatieren (mit den buttons oben) wäre ein entgegenkommen an alle, die diesen thread lesen, danke! |
Re: Virtual treeview und Daten
pchar steht für point of char.
d.h. ein zeiger der auf ein speicherraum zeigt wo chars liegen. mit deinem typcast pchar(edit.text) machst du einen zeiger auf den inhalt des edits. dieses gibts du frei bzw. überschreibst du wieder. besser wäre wenn du speicher mit alloc belegst und die strings dann dort reinkopierst. nicht vergessen hinterher den speicher weider freigeben! eine andere variante wäre du nutzt shortstrings. |
Re: Virtual treeview und Daten
Hallo,
danke für deine schnelle Antwort. Mache Delphi noch nicht so lange, kann aber mit deiner Antwort Ansatzweise schon was anfangen. Shortstring kann ich nicht nehmen, da ich einen Pfad aus shelltreeview später mal dort hinterlegen will. Kann ich das Problem mit den Strings in dem Ex/Import in DLL-Funktionen denn mit einem Record umgehen, daß strings enthält? Ich werde diese DLL ja ausschließlich in Delphi verwenden. |
Re: Virtual treeview und Daten
Delphi-Quellcode:
ptreedata^.fcaption:=StrAlloc(length(edit1.Text)+1);
StrPCopy(ptreedata^.fcaption, edit1.text); ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz