Einzelnen Beitrag anzeigen

Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#57

Re: Datenbank in VirtualTreeView anzeigen und auswerten

  Alt 10. Mär 2009, 16:39
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat