Genau, das ist mein Problem, und das verstehe ich auch irgendwie nicht so recht, und um ehrlich zu sein, habe ich bislang noch gar nicht mit Objekten gearbeitet. Das ist jetzt durch das VST entstanden.
In einem Übungsbeispiel, wurde damit gearbeitet. In einem anderen Übungsbeispiel mit Records.
Und durch diese Geschichte bin ich auch total verwirrt mittlerweile. Ich habe mein Programm jetzt wieder umgebaut auf einen Record, und damit Funktioniert es so wie ich es mir vorstelle.
Hier der Quellcode.
Die Frage ist nur, ob es der Richtige und sichere Weg ist. Ich lese Daten von einer
COM Schnittstelle, die in einer undefinierbaren Menge auftreten können.
Das VST nutze ich zur Anzeige dieser Datensätze, die unter diversen Umständen im Sekunden Takt auftreten könne.
Delphi-Quellcode:
type
PVSTRec = ^VSTRec;
VSTRec = packed record
ID, LfdNr : integer;
Datum, Uhrzeit, Ereignis, Teilnehmer, Bereich : WideString;
SysDatum : String;
end;
procedure TForm1.VSTFüllen; //Das VSTFüllen wird bei jedem neuen Datensatz aufgerufen,
begin //dadurch realisiere ich, das die Anzeige immer aktuell ist.
if not QryMB256PLUS.Active then
QryMB256PLUS.Open;
QryMB256PLUS.filtered := false;
QryMB256PLUS.filter := '';
VST.BeginUpdate;
VST.Clear;
VST.NodeDataSize := SizeOf(VSTRec);
QryMB256PLUS.First;
VST.RootNodeCount := QryMB256PLUS.RecordCount;
VST.SortTree(0,sdAscending,true);
VST.EndUpdate;
end;
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree;
ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
Daten : PVSTRec;
begin
Daten := Sender.GetNodeData(Node);
VST.NodeHeight[Node] := 35;
Include(InitialStates, ivsMultiline);
Initialize(Daten^);
Daten.ID := QryMB256PLUS.FieldByName('ID').AsInteger;
Daten.LfdNr := QryMB256PLUS.FieldByName('LfdNr').AsInteger;
Daten.Datum := QryMB256PLUS.FieldByName('Datum').AsString;
Daten.Uhrzeit := QryMB256PLUS.FieldByName('Uhrzeit').AsString;
Daten.Ereignis := QryMB256PLUS.FieldByName('Ereignis').AsString;
Daten.Teilnehmer := QryMB256PLUS.FieldByName('Teilnehmer').AsString;
Daten.Bereich := QryMB256PLUS.FieldByName('Bereich').AsString;
if not QryMB256PLUS.eof then
QryMB256PLUS.Next;
end;
procedure TForm1.VSTPaintText(Sender: TBaseVirtualTree;
const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType);
var
Daten : PVSTRec;
begin
Daten := Sender.GetNodeData(Node);
if Sender.Selected[Node] then
Exit;
Daten := (VST.GetNodeData(Node));
if Pos('Extern',Daten.Ereignis) > 0 then
TargetCanvas.Font.Color := clYellow;
end;
procedure TForm1.VSTAfterItemErase(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var
Daten : PVSTRec;
begin
Daten := Sender.GetNodeData(Node);
if Sender.Selected[Node] then
Exit;
Daten := (VST.GetNodeData(Node));
if Pos('Extern',Daten.Ereignis) > 0 then
TargetCanvas.Brush.Color := clblue;
if Pos('Unscharf',Daten.Ereignis) > 0 then
TargetCanvas.Brush.Color := clLime;
if Pos('Störung',Daten.Ereignis) > 0 then
begin
if Pos('EIN', Daten.Ereignis) > 0 then
TargetCanvas.Brush.Color := clYellow;
end;
if Pos('Alarm',Daten.Ereignis) > 0 then
begin
if Pos('EIN', Daten.Ereignis) > 0 then
TargetCanvas.Brush.Color := clRed;
end;
if Pos('Hauptalarm',Daten.Ereignis) > 0 then
begin
if Pos('EIN', Daten.Ereignis) > 0 then
TargetCanvas.Brush.Color := clRed;
end;
if Pos('Überfall',Daten.Ereignis) > 0 then
begin
if Pos('EIN', Daten.Ereignis) > 0 then
TargetCanvas.Brush.Color := clRed;
end;
if Pos('Einbruch',Daten.Ereignis) > 0 then
begin
if Pos('EIN', Daten.Ereignis) > 0 then
TargetCanvas.Brush.Color := clRed;
end;
if Pos('Sabotage',Daten.Ereignis) > 0 then
begin
if Pos('EIN', Daten.Ereignis) > 0 then
TargetCanvas.Brush.Color := clRed;
end;
if Pos('Voralarm',Daten.Ereignis) > 0 then
begin
if Pos('EIN', Daten.Ereignis) > 0 then
TargetCanvas.Brush.Color := clRed;
end;
TargetCanvas.FillRect (ItemRect);
end;
procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
Daten : PVSTRec;
begin
Daten := Sender.GetNodeData(Node);
if Assigned(Daten) then
Finalize(Daten^);
end;
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
Daten : PVSTRec;
begin
Daten := Sender.GetNodeData(Node);
case Column of
0: CellText:= IntToStr(Daten.ID);
1: CellText:= IntToStr(Daten.LfdNr);
2: CellText:= Daten.Datum;
3: CellText:= Daten.Uhrzeit;
4: CellText:= Daten.Ereignis;
5: CellText:= Daten.Teilnehmer;
6: CellText:= Daten.Bereich;
end;
end;
procedure TForm1.VSTHeaderClick(Sender: TVTHeader;
Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
if Button = mbLeft then
with Sender do
begin
if SortColumn <> Column then
SortColumn := Column;
if SortDirection = sdAscending then
SortDirection := sdDescending
else SortDirection := sdAscending;
VST.SortTree(Column,SortDirection,true);
end;
end;