Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Vier VirtualStringTree auf einem Formular - ist das zuviel (https://www.delphipraxis.net/42540-vier-virtualstringtree-auf-einem-formular-ist-das-zuviel.html)

karl der große 20. Mär 2005 15:10

Datenbank: ACCESS • Version: 2000 • Zugriff über: TADOConnection, TBetterADODataset, TDatasource

Vier VirtualStringTree auf einem Formular - ist das zuviel
 
Hab eine Applikation, bei der ich in einem Formular 4 Virtualstringtree benötige, alle mit unterschiedlichen Tabellen.

Bereits wenn ich die zweite einfüge, sehe ich bei der ersten nichts mehr.

Weiss da jemand Rat?

Gruss Karl

etom291272 20. Mär 2005 16:16

Re: Vier VirtualStringTree auf einem Formular - ist das zuvi
 
verwende auch die vst's (sind der hammer :thumb: )bei meinem jetzigen projekt basieren die hauptmasken auf vst's hab einmal 3 verwendet die 1. in treeview die 2. mit colums als Liste mit 5 colums die 3. wieder in treeview hatte keine schwierigkeiten und die komponente kommt mit sehr stabil und sauschnell vor.

wie lädst du denn die items in die vst ? gehst du über die objekte (ADDVSTOBjekt) oder direkt über die records.

karl der große 20. Mär 2005 16:42

Re: Vier VirtualStringTree auf einem Formular - ist das zuvi
 
Mein Code sieht so aus:

Delphi-Quellcode:
function Tkalk.AddVSTObject(avst: TCustomVirtualStringTree; aNode: PVirtualNode;
   aObject: TObject): PVirtualNode;
var
   Data: PTreeData;
begin
   Result := avst.Addchild(aNode);
   data := avst.GetNodeData(Result);
   avst.ValidateNode(Result, False);
   data^.FObject := aObject;
end;

function Tkalk.AddVSTStunden(avsst: TCustomVirtualStringTree; asNode: PVirtualNode;
   aStunden: TObject): PVirtualNode;
var
   Data: PStundenData;
begin
   Result := avsst.Addchild(asNode);
   data := avsst.GetNodeData(Result);
   avsst.ValidateNode(Result, False);
   data^.FStunde := aStunden;
end;

procedure Tkalk.vstFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
   Data: PTreeData;
begin
   Data := vst.GetNodeData(Node);
   if not Assigned(Data) then
      exit;
   Data.FObject.Free;
end;


procedure TKalk.vstCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
   Data1, Data2: PTreeData;
begin
   Data1 := Sender.GetNodeData(Node1);
   Data2 := Sender.GetNodeData(Node2);
   case Column of
      0:
         Result := CompareText(TtreeDataClass(Data1.FObject).FKunde,
            TtreeDataClass(Data2.FObject).FKunde);
   end;
end;

procedure TKalk.vstHeaderClick(Sender: TVTHeader; Column: TColumnIndex;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   if Button = mbLeft then
   begin
      with Sender, TreeView do
      begin
         if SortColumn > NoColumn then
            Columns[SortColumn].Options := Columns[SortColumn].Options + [coParentColor];
            if (SortColumn = NoColumn) or (SortColumn <> Column) then
            begin
               SortColumn := Column;
               SortDirection := sdAscending;
            end
            else
               if SortDirection = sdAscending then
                  SortDirection := sdDescending
               else
                  SortDirection := sdAscending;
            Columns[SortColumn].Color := $F7F7F7;
            SortTree(SortColumn, SortDirection, False);
         end;
   end;
end;

procedure TKalk.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
   Data: PTreeData;
begin
   Data := Sender.GetNodeData(Node);
   if data.FObject <> nil then
   begin
      case Column of
         0:
            begin
               if Node.Parent = Sender.RootNode then
                  celltext := TTreeDataClass(Data.FObject).FKunde
               else
                  celltext := TTreeDataClass(Data.FObject).FKunde
            end;
      end;
   end;
end;

procedure TKalk.FormCreate(Sender: TObject);
var
   TreeObject: TTreeDataClass;
   Wurzel: PVirtualNode;
   Wurzel1: PVirtualNode;
   begin
      vst.BeginUpdate;
      vst.NodeDataSize := SizeOf(TTreeData);
      vst.DeleteChildren(vst.RootNode, true);
      while not db_kunden.Eof do
      begin
         TreeObject := TTreeDataClass.Create;
         TreeObject.Kunde := db_kunden.fieldByName('Suchname').AsString;
         Wurzel := AddVSTObject(VST, Nil, TreeObject);
         while not db_objektkunde.eof do
         begin
            TreeObject := TTreeDataClass.Create;
            TreeObject.Kunde := db_objektkunde.fieldbyname('NummerBeschreibung').AsString;
            Wurzel1 := addvstObject(vst, Wurzel, TreeObject);
            while not db_objektverlauf.eof do
            begin
               TreeObject := TTreeDataClass.Create;
               TreeObject.Kunde := db_objektverlauf.fieldbyName('Bezeichnung').AsString;
               addvstObject(vst, Wurzel1, TreeObject);
               db_objektverlauf.next;
            end;
            db_objektkunde.next;
         end;
         db_kunden.next;
      end;
      vst.EndUpdate;
      db_objektkunde.first;
   end;

procedure TKalk.vstGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
begin
end;

procedure TKalk.vstPaintText(Sender: TBaseVirtualTree;
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);
begin
   with TargetCanvas do
      case Column of
         1: if Sender.FocusedNode = Node then
               Font.Color := clBlue
            else
               Font.Color := clBlack
      end;
end;

procedure TKalk.vstClick(Sender: TObject);
var
   Node: PVirtualNode;
   Data: PTreeData;
begin
   Node:=VST.FocusedNode;
   if not Assigned(Node) then
      Exit;
   Data:=VST.GetNodeData(Node);
   Showmessage(TTreeDataClass(Data.FObject).kunde);
end;

procedure TKalk.vststundenGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
   Data: PStundenData;
begin
   Data := Sender.GetNodeData(Node);
   if data.FStunde <> nil then
   begin
      case Column of
         0:
            begin
               if Node.Parent = Sender.RootNode then
                  celltext := TTreeStundenClass(Data.FStunde).FStunde
               else
                  celltext := TTreeStundenClass(Data.FStunde).FStunde
            end;
      end;
   end;
end;

procedure TKalk.vststundenFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
   Data: PStundenData;
begin
   Data := vst.GetNodeData(Node);
   if not Assigned(Data) then
      exit;
   Data.FStunde.Free;
end;

procedure TKalk.vststundenCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
   Data1, Data2: PStundenData;
begin
   Data1 := Sender.GetNodeData(Node1);
   Data2 := Sender.GetNodeData(Node2);
   case Column of
      0:
         Result := CompareText(TtreeStundenClass(Data1.FStunde).FStunde,
            TtreeStundenClass(Data2.FStunde).FStunde);
   end;
end;

procedure TKalk.vststundenClick(Sender: TObject);
var
   Node: PVirtualNode;
   Data: PStundenData;
begin
   Node:=VSTstunden.FocusedNode;
   if not Assigned(Node) then
      Exit;
   Data:=VSTstunden.GetNodeData(Node);
   Showmessage(TTreeStundenClass(Data.FStunde).Stunde);

end;

procedure TKalk.Button1Click(Sender: TObject);
begin
   db_kunden.first;
   db_objektkunde.First;
end;

procedure TKalk.SeitenwahlChange(Sender: TObject);
var
   TreeObject: TTreeDataClass;
   Wurzel: PVirtualNode;
   Wurzel1: PVirtualNode;
   TreeStunden: TTreeStundenClass;
   StundenWurzel: PVirtualNode;
   StundenWurzel1: PVirtualNode;

begin
   if seitenwahl.ActivePage.Caption = 'Arbeitszeit' then
      begin
         db_mitarbeiter.first;
         db_stunden.first;
         db_stundentag.First;
         vststunden.BeginUpdate;
         vststunden.NodeDataSize := SizeOf(TTreeStundenClass);
         vststunden.DeleteChildren(vststunden.RootNode, true);
         while not db_mitarbeiter.Eof do
            begin
            TreeStunden := TTreeStundenClass.Create;
            TreeStunden.Stunde := db_mitarbeiter.fieldByName('Name').AsString;
            StundenWurzel := AddVSTStunden(vststunden, Nil, TreeStunden);
            while not db_stunden.eof do
            begin
               TreeStunden := TTreeStundenClass.Create;
               TreeStunden.Stunde := db_stundentag.fieldByName('Tag').AsString;
               StundenWurzel1 := addvstStunden(vststunden, StundenWurzel, TreeStunden);
               while not db_stunden.eof do
               begin
                  TreeStunden := TTreeStundenClass.Create;
                  TreeStunden.Stunde := db_stunden.fieldbyName('Menge').AsString;
                  addvstStunden(vststunden, StundenWurzel1, TreeStunden);
                  db_stunden.next;
               end;
               db_stundentag.next;
            end;
            db_mitarbeiter.next;
         end;
         vststunden.EndUpdate;
      end
   else if seitenwahl.ActivePage.Caption = 'Objektauswahl' then
      begin
         db_kunden.first;
         db_objektkunde.first;
         db_objektverlauf.First;
         vst.BeginUpdate;
         vst.NodeDataSize := SizeOf(TTreeData);
         vst.DeleteChildren(vst.RootNode, true);
         while not db_kunden.Eof do
         begin
            TreeObject := TTreeDataClass.Create;
            TreeObject.Kunde := db_kunden.fieldByName('Suchname').AsString;
            Wurzel := AddVSTObject(VST, Nil, TreeObject);
            while not db_objektkunde.eof do
            begin
               TreeObject := TTreeDataClass.Create;
               TreeObject.Kunde := db_objektkunde.fieldbyname('NummerBeschreibung').AsString;
               Wurzel1 := addvstObject(vst, Wurzel, TreeObject);
               while not db_objektverlauf.eof do
               begin
                  TreeObject := TTreeDataClass.Create;
                  TreeObject.Kunde := db_objektverlauf.fieldbyName('Bezeichnung').AsString;
                  addvstObject(vst, Wurzel1, TreeObject);
                  db_objektverlauf.next;
               end;
               db_objektkunde.next;
            end;
            db_kunden.next;
         end;
         vst.EndUpdate;
      end
   end;
Hab den Create in die Seitenauswahl gegeben, aber es funzt nicht
gruss karl

Albi 20. Mär 2005 16:46

Re: Vier VirtualStringTree auf einem Formular - ist das zuvi
 
Hallo,

hast Du den Code für die anderen VST's kopiert? Dann ist es sicher ein Copy&Paste fehler, ist mir auch schon passiert :zwinker: .

Schaue Dir mal den Code noch einmal genau an, dass Du nicht ausversehen noch irgendwo das andere VST drin zu stehen hast.

Bei mir lag der Fehler in der Zeile, ich habe das eine VST mit Daten gefüllt und beim füllen des anderen habe ich dann das erste wieder gelöscht. Dummer fehler.

Code:
  VST1.BeginUpdate;
  VST1.NodeDataSize:= SizeOf(TTreeData);
  VST1.DeleteChildren(VST.RootNode,True);//hier lagt mein Fehler VST1 und VST

karl der große 20. Mär 2005 16:53

Re: Vier VirtualStringTree auf einem Formular - ist das zuvi
 
:hello: :hello: :hello: :hello:

Super das wars - Danke!!!

Albi 20. Mär 2005 17:00

Re: Vier VirtualStringTree auf einem Formular - ist das zuvi
 
Hallo,

schon dass das der Fehler war aber hast Du da keine AV bekommen, beim beenden des Programmes? Wenn ich das mache, dann bekomme ich eine.

Noch was

Zitat:

Code:
procedure TKalk.vststundenFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
   Data: PStundenData;
begin
   Data := vst.GetNodeData(Node); //hier müste doch VSTStunden stehen oder? 
   if not Assigned(Data) then
      exit;
   Data.FStunde.Free;
end;

Kann mich aber auch ihren aber ich denke das jedes VST seine eigene FreeNode braucht.

karl der große 20. Mär 2005 17:06

Re: Vier VirtualStringTree auf einem Formular - ist das zuvi
 
soweit war ich noch nicht - ich meine AV

hab zu früh jubiliert.

aber jetzt auch keine av mehr

danke für deine hilfe

Albi 20. Mär 2005 17:39

Re: Vier VirtualStringTree auf einem Formular - ist das zuvi
 
Ich nochmal,

nur der Formhalber, warum nimmst Du hier

Code:
if seitenwahl.ActivePage.Caption = 'Arbeitszeit' then
      begin
         db_mitarbeiter.first;
         db_stunden.first;
         db_stundentag.First;
         vststunden
nicht ActivePageIndex. Wenn Du später auf die Idee kommst die Caption umzubennen in z.B. Arbeitszeiten, dann wird er die Procedure nicht mehr ausführen, da die Caption ja nicht zu finden.

karl der große 20. Mär 2005 18:09

Re: Vier VirtualStringTree auf einem Formular - ist das zuvi
 
hast eigentlich recht, danke für den Tip, werde ich gleich machen

gruss karl


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 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