Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Virtual treeview und Daten (https://www.delphipraxis.net/72312-virtual-treeview-und-daten.html)

wwild0473 28. Jun 2006 13:50


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

semo 28. Jun 2006 13:57

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!

generic 28. Jun 2006 14:34

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.

wwild0473 28. Jun 2006 14:45

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.

dimo 30. Jun 2006 13:54

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 04:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz