So, war zwar ne schwere Geburt, aber ich habe es doch noch hinbekommen, meine VST Anbindung ohne InitFunktion und mit Object zu gestalten.
Ich hoffe, das jemand diesen Beitrag ließt, und eventuell mal sagen kann, ob ich das jetzt so richtig gemacht habe oder, ob ich noch was ändern muss oder sollte.
Die Funktion ist komplett da und in Ordnung.
Ich weiß nur nicht so genau, ob das mit den Einträgen einfügen und so alles so OK ist, ohne das ich nachher irgendwelche Performance Problem bekomme.
Hier mal meine jetzige und hoffendlich fertige Lösung..
Delphi-Quellcode:
//Mein Object
type
TOMB256PLUS = class
private
ID : integer;
LfdNr : integer;
Datum : String;
Uhrzeit : String;
Ereignis : String;
Teilnehmer : String;
Bereich : String;
SysData : String;
end;
//Eintrag in Form.Create
VST.NodeDataSize := SizeOf(TOMB256PLUS);
VSTFüllen;
VST.ScrollIntoView(VST.GetLast, true);
//Funktion VSTFüllen die durch FormCreate ausgelößt wird
procedure TForm1.VSTFüllen;
var
Daten : TOMB256PLUS;
begin
if not QryMB256PLUS.Active then
QryMB256PLUS.Open;
QryMB256PLUS.filtered := false;
QryMB256PLUS.filter := '';
VST.BeginUpdate;
VST.Clear;
VST.NodeDataSize := SizeOf(TOMB256PLUS);
while not QryMB256PLUS.EOF do
begin
Daten := TOMB256PLUS.Create;
with Daten do
begin
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;
end;
VST.AddChild(nil,Daten);
QryMB256PLUS.Next;
end;
VST.EndUpdate;
end;
//Einträge in VST einfügen, wenn neue Datensätze kommen.
{Datensatzverarbeitung}
procedure TForm1.TreeViewResult(ParserTreeView: TMyBaseParser);
var
i: Integer;
Temp1 : Integer;
Temp2 : String;
Temp3 : String;
Temp4 : String;
Temp5 : String;
Temp6 : String;
Daten : TOMB256PLUS;
begin
Temp1 := ParserTreeView.Entries[0].LfdNr;
Temp2 := ParserTreeView.Entries[0].Datum;
Temp3 := ParserTreeView.Entries[0].Uhrzeit;
Temp4 := ParserTreeView.Entries[0].Ereignis;
Temp5 := ParserTreeView.Entries[0].Teilnehmer;
Temp6 := ParserTreeView.Entries[0].Bereich;
Application.ProcessMessages;
QryMB256PLUS.Close;
QryMB256PLUS.SQL.Text := 'INSERT INTO MB256PLUS'+
'("LfdNr", "Datum", "Uhrzeit", "Ereignis", "Teilnehmer", "Bereich")'+
'VALUES(:LfdNr,:Datum,:Uhrzeit,:Ereignis,:Teilnehmer,:Bereich)';
QryMB256PLUS.ParamByName('LfdNr').AsInteger := Temp1;
QryMB256PLUS.ParamByName('Datum').AsString := Temp2;
QryMB256PLUS.ParamByName('Uhrzeit').AsString := Temp3;
QryMB256PLUS.ParamByName('Ereignis').AsString := Temp4;
QryMB256PLUS.ParamByName('Teilnehmer').AsString := Temp5;
QryMB256PLUS.ParamByName('Bereich').AsString := Temp6;
QryMB256PLUS.ExecSQL;
ConMB256PLUS.Commit;
QryMB256PLUS.Close;
QryMB256PLUS.SQL.Text := 'SELECT * FROM MB256PLUS';//'SELECT * FROM MB256PLUS';
QryMB256PLUS.Open;
VST.BeginUpdate;
Daten := TOMB256PLUS.Create;
QryMB256PLUS.Last;
with Daten do
begin
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;
end;
VST.AddChild(nil, Daten);
VST.ScrollIntoView(VST.GetLast, true);
VST.EndUpdate;
DataMB256plus := '';
end;
//Celltext Zuweisung
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
Daten : TOMB256PLUS;
begin
Daten := TOMB256PLUS(VST.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;
//Objectdaten freigeben
procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
Daten : TOMB256PLUS;
begin
Daten := TOMB256PLUS(VST.GetNodeData(Node)^);
Daten.Free;
end;
//Zeilen, je nach Ereignis einfärben
procedure TForm1.VSTAfterItemErase(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var
Daten : TOMB256PLUS;
begin
Daten := TOMB256PLUS(VST.GetNodeData(Node)^);
if Sender.Selected[Node] then
Exit;
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;
//Textfarbe bei blauen Zellen auf gelb setzen
procedure TForm1.VSTPaintText(Sender: TBaseVirtualTree;
const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType);
var
Daten : TOMB256PLUS;
begin
Daten := TOMB256PLUS(VST.GetNodeData(Node)^);
if Sender.Selected[Node] then
Exit;
if Pos('Extern',Daten.Ereignis) > 0 then
TargetCanvas.Font.Color := clYellow;
end;
Ich bedanke mich schon mal, und hoffe auf Eure antworten.
Gruß Jens