Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit Pointer beim VirtualStringTree (https://www.delphipraxis.net/144292-problem-mit-pointer-beim-virtualstringtree.html)

Jens Hartmann 5. Dez 2009 23:55

Re: Problem mit Pointer beim VirtualStringTree
 
Liste der Anhänge anzeigen (Anzahl: 2)
Schönen guten Abend nochmal zusammen,

Ich bin jetzt ein Stück weiter, allerdings denke ich das es der falsche Weg ist, und außerdem ist auch noch eine Fehler drin.

Ich habe jetzt einfach mal so zum Test 4 GLOBALE Variablen angelegt, die ich beim CREATE initialisiere und in die GetText Methode einbinde.
Funktioniert auch jetzt genau so wie ich mir das vorstelle (siehe ScreenShot1), bis auf wenn ich eine Ebene über das - Zeichen Expandiere, kann ich diese Ebene nie wieder FullExpanded setzen(siehe Anhang 2).

Außerdem, gefällt mir das mit den GLOBALEN Var. nicht.

hier mal der aktuelle Code...
Delphi-Quellcode:
procedure TForm1.VSTSystemCreate;
var
  pNode :pVirtualNode;
begin
  DM_PS.ConPSConfig.Connect;
  DM_PS.Qry_VSTSystemCreate.Open;
  Objekt := DM_PS.Qry_VSTSystemCreate.FieldByName('KUNDE').AsString;
  case DM_PS.Qry_VSTSystemCreate.FieldByName('ZENTRALENTYP').AsInteger of
        0: Zentrale := 'NOVAR HB/MB 24';
        1: Zentrale := 'NOVAR HB/MB 48';
        2: Zentrale := 'NOVAR MB100';
        3: Zentrale := 'NOVAR MB256';
        4: Zentrale := 'BOSCH UEZ2000';
        5: Zentrale := 'NOVAR BMC 1024';
        6: Zentrale := 'ESSER IQ8 Control';
        7: Zentrale := 'SONSTIGE';
      end;
  COMPort := 'COM 1, 9600,8,1';
  IPPort := '192.168.100.101';
  DM_PS.Qry_VSTSystemCreate.Close;
 
  VSTSystem.BeginUpdate;
  pNode := VSTSystem.AddChild(nil);
  pNode := VSTSystem.AddChild(pNode);
  VSTSystem.AddChild(pNode);
  VSTSystem.AddChild(pNode);
  VSTSystem.EndUpdate;
end;

procedure TForm1.VSTSystemGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  Level : Integer;
begin
Level := VSTSystem.GetNodeLevel(Node);
if Column = 0 then
  begin
    if Level = 0 then
      CellText := Objekt;
    if Level = 1 then
      CellText := Zentrale;
    if Level = 2 then
      begin
        if Node.Index = 0 then
          CellText := IPPort
        else
          CellText := COMPort
      end;
  end;
end;
Gruß Jens

Jens Hartmann 6. Dez 2009 11:24

Re: Problem mit Pointer beim VirtualStringTree
 
Einen wunderschönen guten Morgen zusammen,

so nach einer langen Nacht und viel Geduld, habe ich meine Problem jetzt gelößt. Die Lösung habe ich jetzt über ein Record gemacht und die Daten über folgende Ausführung zugewiesen. Ich bin mir allerdings nicht sicher, ob es so gut gelößt ist,das ich nicht irgendwo Probleme bekomme.

Die Lösung funktioniert zwar, aber vieleicht kann ja mal jemand von Euch sich den Weg dazu ansehen.

Hier meine Lösung...

Delphi-Quellcode:
type pNodeData = ^rNodeData;
     rNodeData = record
        Objekt : String;
        Zentrale : String;
        IPPort : String;
        COMPort : String;
end;

...

implementation

....

function GetLocalIPs(const Lines:TStrings):Boolean;
type
  PPInAddr= ^PInAddr;
var
  wsaData: TWSAData;
  HostInfo: PHostEnt;
  HostName: Array[0..255] of Char;
  Addr: PPInAddr;
begin
  Result:=False;
  Lines.Clear;
  if WSAStartup($0102, wsaData)=0 then
  try
    if gethostname(HostName, SizeOf(HostName)) = 0 then Begin
       HostInfo:= gethostbyname(HostName);
       if HostInfo<>nil then Begin
          Addr:=Pointer(HostInfo^.h_addr_list);
          if (Addr<>nil) AND (Addr^<>nil) then
             Repeat
                    Lines.Add(StrPas(inet_ntoa(Addr^^)));
                    inc(Addr);
             Until Addr^=nil;
       end;
    end;
    Result:=True;
  finally
    WSACleanup;
  end;
end;

...

procedure TForm1.Create;
begin
...
VSTSystemCreate;
...
end;

procedure TForm1.VSTSystemCreate;
var
  pNode :pVirtualNode;
begin
  VST.Clear;
  VSTSystem.BeginUpdate;
  pNode := VSTSystem.AddChild(nil);
  pNode := VSTSystem.AddChild(pNode);
  VSTSystem.AddChild(pNode);
  VSTSystem.AddChild(pNode);
  VSTSystem.EndUpdate;
end;

procedure TForm1.VSTSystemFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  pdata : pNodeData;
begin
  pdata := Sender.GetNodeData(Node);
    if Assigned(pdata) then
      begin
        pdata.Objekt := '';
        pdata.Zentrale := '';
        pdata.COMPort := '';
        pdata.IPPort := '';
      end;
end;

procedure TForm1.VSTSystemGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  Level : Integer;
  pdata : pNodeData;
begin
  pdata := Sender.GetNodeData(Node);
  Level := VSTSystem.GetNodeLevel(Node);
    if Level = 0 then
      CellText := pdata.Objekt;
    if Level = 1 then
      CellText := pdata.Zentrale;
    if Level = 2 then
      begin
        if Node.Index = 0 then
          CellText := pdata.IPPort
        else
          CellText := pdata.COMPort;
      end;
end;

procedure TForm1.VSTSystemInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  pdata : pNodeData;
  BaudRate : String;
  Stopbit : String;
  Databit : String;
  IPLokal : TStringList;
begin
  DM_PS.ConPSConfig.Connect;
  DM_PS.Qry_VSTSystemCreate.Open;

  pdata := Sender.GetNodeData(Node);

  pdata.Objekt := DM_PS.Qry_VSTSystemCreate.FieldByName('KUNDE').AsString;
  case DM_PS.Qry_VSTSystemCreate.FieldByName('ZENTRALENTYP').AsInteger of
        0: pdata.Zentrale := 'NOVAR HB/MB 24';
        1: pdata.Zentrale := 'NOVAR HB/MB 48';
        2: pdata.Zentrale := 'NOVAR MB100';
        3: pdata.Zentrale := 'NOVAR MB256';
        4: pdata.Zentrale := 'BOSCH UEZ2000';
        5: pdata.Zentrale := 'NOVAR BMC 1024';
        6: pdata.Zentrale := 'ESSER IQ8 Control';
        7: pdata.Zentrale := 'SONSTIGE';
      end;

  BaudRate := IntToStr(ComPort1.CustomBaudRate);
  Stopbit := StopBitsToStr(ComPort1.StopBits);
  Databit := DataBitsToStr(ComPort1.DataBits);
  pdata.COMPort := ComPort1.Port+', '+BaudRate+', '+Stopbit+', '+Databit;

  IPLokal := TStringList.Create;
  GetLocalIPs(IPLokal);
  pdata.IPPort := IPLokal.Text;
  IPLokal.Free;

  DM_PS.Qry_VSTSystemCreate.Close;
end;
Danke schon mal,

Gruß

Jens


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 Uhr.
Seite 3 von 3     123   

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