![]() |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zur Sicherheit würde ich immer einfügen ...
Delphi-Quellcode:
data:= Sender.GetNodeData(Node);
if not Assigned(data) // Exit; // Zitat:
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Und der Vollständigkeit halber, so gehts auch
Delphi-Quellcode:
Geschmackssache, was man wählt.
data:= Sender.GetNodeData(Node);
if not data.IsAssigned then Exit; |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
Delphi-Quellcode:
Es müßte eigentlich heissen, oder zumindest bei meiner alten VST Version unter Delphi 2007:
data:= Sender.GetNodeData(Node);
if not Assigned(data) then Exit;
Delphi-Quellcode:
Lg,
data:= Sender.GetNodeData(Node);
if not Assigned(data^.FObject) then Exit; jus |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Liste der Anhänge anzeigen (Anzahl: 1)
So zur späten Stunde noch eine neue Version mit einer kleinen Automatisierung beim Verknüpfen von VST mit TObjectList, indem ich eine neue Methode mit TBindVSTToObjectListHelperClass.BindVST einführe.
Die Code in TForm1.Button1Click ist ein bisschen kürzer geworden und TForm1.vstInitNode wurde entfernt.
Delphi-Quellcode:
Dafür wurde das Verknüpfen in VSTBindObjectListUnit.pas ausgelagert.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Contnrs, StdCtrls, VirtualTrees, VSTBindObjectListUnit; type TNodeDataClass = class private FSpalte1: string; FSpalte2: string; FSpalte3: Integer; public property Spalte1: string read FSpalte1 write FSpalte1; property Spalte2: string read FSpalte2 write FSpalte2; property Spalte3: Integer read FSpalte3 write FSpalte3; end; TForm1 = class(TForm) vst: TVirtualStringTree; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); private { Private-Deklarationen } DataList: TObjectList; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin TBindVSTToObjectListHelperClass.BindVST(VST,DataList); end; procedure TForm1.FormCreate(Sender: TObject); var i: Integer; NodeData: TNodeDataClass; begin DataList := TObjectList.Create; for i := 0 to 3 do begin NodeData := TNodeDataClass.Create; NodeData.Spalte1 := IntToStr(i); NodeData.Spalte2 := 'Spalte '+IntToStr(i); NodeData.Spalte3 := i; DataList.Add(NodeData); end; end; procedure TForm1.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var data: PTreeData; begin data:= Sender.GetNodeData(Node); if not Assigned(data^.FObject) then Exit; case Column of 0: CellText := TNodeDataClass(data^.FObject).FSpalte1; 1: CellText := TNodeDataClass(data^.FObject).FSpalte2; 2: CellText := IntToStr(TNodeDataClass(data^.FObject).FSpalte3); end; end; end.
Delphi-Quellcode:
Wie schon vorher erwähnt für die Leute die noch ein Delphi 2007 im Einsatz haben.
unit VSTBindObjectListUnit;
interface uses Contnrs, VirtualTrees; type PTreeData = ^TTreeData; TTreeData = record FObject : TObject; end; TBindVSTToObjectListHelperClass = class private class var fObList: TObjectList; class var fVST: TVirtualStringTree; class procedure VstInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); public class procedure BindVST(AVST: TVirtualStringTree; AObList: TObjectList); end; implementation { TBindVSTToObjectListHelperClass } class procedure TBindVSTToObjectListHelperClass.BindVST(AVST: TVirtualStringTree; AObList: TObjectList); begin if not assigned(AObList) then exit; fObList := AObList; fVST := AVST; fVST.Clear; fVST.NodeDataSize := SizeOf(TTreeData); fVST.OnInitNode := TBindVSTToObjectListHelperClass.VstInitNode; fVST.RootNodeCount := fObList.Count; end; class procedure TBindVSTToObjectListHelperClass.VstInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var data: PTreeData; begin data := fVST.GetNodeData(Node); data^.FObject := fObList[Node.Index]; end; end. Lg, jus |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Denk dran RootNodeCount neu zu setzen, wenn du einen Eintrag aus deiner ObjectList löschst.
Ich glaube jedenfalls, dass das notwendig ist. |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Code:
Ich sehe immer diesen Quelltext.
PTreeData = ^TTreeData;
TTreeData = record FObject : TObject; end; Wir sehen ein Zeiger auf ein Objekt welches in einen Record gespeichert wird. Also ist der Record genau so groß wie der Zeiger. Wieso speichert Ihr den Objekt Zeiger nicht direkt im VST? Dann braucht ihr die Zwischenklasse TTreeData nicht.
Code:
vst.NodeDataSize= sizeof(TMeinObjekt); // Zeigergröße - es geht auch TObject da alle Objektzeiger gleich groß sind.
vst.addChild(nil, MeinObjektInsatz); // Hinzufügen mit Zeigers var data: TMeinObjekt; begin data := TMeinObjekt(fVST.GetNodeData(Node)^); end; |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
AddChild benutzt man nicht. Das ist eine Todsünde, so wie ich das immer lese.
Wenn man AddChild benutzt, dann kann man auch gleich ein TListView benutzen mit Add(). |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
Zitat:
Bei Anwendungen wie z.B. HeidiSQL, wo der VST hingegen ein Grid für viele Tausende Datensätze bilden kann, da macht das absolut Sinn. Wobei ich mich an der Stelle schon wieder Frage, ob die Vorteile die man mit Rootnodecount gewinnt, nicht durch das ganze Generics-RTTI-Gedönse wieder drauf geht. |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 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 by Thomas Breitkreuz