Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbank in VirtualTreeView anzeigen und auswerten (https://www.delphipraxis.net/130113-datenbank-virtualtreeview-anzeigen-und-auswerten.html)

Jens Hartmann 4. Mär 2009 22:59

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe die DLL schon direkt mit DW geladen. Die gleiche Fehlermeldung wie bei der EXE

mschaefer 4. Mär 2009 23:15

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
@Hansa: Mensch - mußt Du gleich wieder der Keule kommen....

Hansa ist nicht verkehrt, er weiss einiges, gerade über Firebird und ich weiss noch wie er mich mit einem Paukenschlag in meinem 1.Post in der DP begrüßt hat :mrgreen:. Aber um das Ganze mal wieder etwas aufzulösen. Dieser Firebird-Installationskrempel gehört nun wirklich nicht unter die Überschrift.

@Jens mach doch mal mit der Geschichte in Deinem Datenbankthread weiter weiter. Du versuchst hier gleich drei Sachen auf einmal und das geht eigentlich nicht gut (1. Fb-Setup 2.Zeos-Zugriff und 3. VT).

Neige dazu Dir das ADO-Beispiel aus dem Datenbankthread an den Compiler zu legen und Dich hier auf die Ansteuerung des Virtual-Tree-View zu konzentrieren. Da gibt es noch Tücken genug.

Viele Grüße in die Runde !

Martin

Jens Hartmann 4. Mär 2009 23:23

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Da gebe ich Dir recht. Leider ist es ja so, das das eine irgendwie auf dem anderen aufbaut.

Ich habe mich ja intensiv mit dem VST beschäftigt und will halt jetzt an die DB-Anbindung.

Und dabei, ist ja der Fehler aufgetaucht.

Aber trotzdem Danke für den Tip.

Vieleicht sollte ich einfach einen neuen Thread aufmachen. Das Problem ist nur, das ich schon nicht mal mehr weiß, wie ich den überhaupt nennen könnte.

Es ist eben auch nicht gegen Hansa gewesen. Nur ist es halt als Anfänger schwer, wenn man teilweise die Begriffe und Hintergründe nicht kennt, sich darein zu arbeiten. Auch das googeln ist dann nicht so einfach, wenn man nicht genau weiß wonach man eigentlich sucht.

mschaefer 4. Mär 2009 23:38

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Jens nimm Dir doch das Datenbankbeispiel aus dem anderen Thread und bau mal den VT ein. Morgen bin ich auf der CeBit aber am Freitag würde ich Dir dann aus dem Access VT Beispiel aind FB VT Beispiel bauen. Das mach ich nicht ohne Eigensinn. Mit dem VT habe ich bisher kaum gearbeitet und Du leistet da gerade Forschungsarbeit in meinem Sinne :mrgreen:

Grüße // Martin


PS: www.GuteNacht.de

Jens Hartmann 4. Mär 2009 23:52

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Ich habe doch noch ein wenig getestet. Ich habe die Datenbank auch noch in einem anderen Ordner in einem anderen Programm. Auch da habe ich ja eine TZCon und TZQRY. Nur mit dem unterschied, das ich dort über eine DataSource ein DBGrid fülle.

Jetzt habe ich mal in beiden Anwendungen versucht, die Datenbankverbindung im Designmodus zu öffnen. In der mit dem DBGrid geht es und in der anderen, kommt dann schon der Fehler das die dll fehlt.


Und nach langem genauem hinsehen, habe ich den Fehler dann doch noch gefunden. Es läuft. Und zwar, stand das Protokoll der TZConnection nicht auf Firebird2.0 sondern auf Firebirdd2.0.

Wo ist denn da eigendlich der Unterschied.

Jetzt geht alles, sogar meine Anbindung an mein VST.

Yes (Eigeninitiative) :thumb: Sorry Hansa, das musste jetzt sein, ist aber nicht persönlich gemeint.

Gruß und Dank an alle
Jens

PS: Besonderen Dank an Markus und Martin

Jens Hartmann 5. Mär 2009 11:40

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Übrigens,
werden die anderen dll´s auch benötigt.
Nachdem ich die eingefügt hatte, muss ich mir irgendwie ausversehen, die Einstellungen vom Protokoll Firebird 2.0 auf Firebirdd 2.0 umgestellt haben.

So kann es gehen. Fehler der dll´s behoben und in der Zwischenzeit einen neuen eingebaut.

Naja, dies nur noch am Rande zur Information.

Aber vielleicht, kann mir ja jemand mal den Unterschied der beiden Protokolle erleutern.

alex517 5. Mär 2009 13:30

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Zitat:

Zitat von Jens Hartmann
Übrigens,
werden die anderen dll´s auch benötigt.
Nachdem ich die eingefügt hatte, muss ich mir irgendwie ausversehen, die Einstellungen vom Protokoll Firebird 2.0 auf Firebirdd 2.0 umgestellt haben.

So kann es gehen. Fehler der dll´s behoben und in der Zwischenzeit einen neuen eingebaut.

Naja, dies nur noch am Rande zur Information.

Aber vielleicht, kann mir ja jemand mal den Unterschied der beiden Protokolle erleutern.

siehe hier

alex

Jens Hartmann 5. Mär 2009 15:07

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Ah, danke schön, also wird das Protokoll

Embedded : use the firebirdd-2.0 protocol. von Lazarus verwendet

Jens Hartmann 7. Mär 2009 17:37

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo nochmal zusammen.

Habe die ganze Anbindung jetzt am laufen, und wollte jetzt noch das befüllen von einem Record, auf ein Objekt (class) ändern.

Habe das auch soweit alles angepaßt, habe allerdings jetzt beim kompelieren eine Fehlermeldung (siehe Anhang)

Leider, kann ich den Grund dafür nicht finden. Delphi bring auch sonst keine Meldung wie man das so kennt.

z.B. ; erwartet oder so;;;;

Hier der gesamte Quellcode, was das VST angeht inkl. der Objekt Impelmentation...

Delphi-Quellcode:
{Mein Objekt}
type
  TOMB256PLUS = class
    public
    ID        : integer;
    LfdNr     : integer;
    Datum     : String;
    Uhrzeit   : String;
    Ereignis  : String;
    Teilnehmer : String;
    Bereich   : String;
    SysData   : String;
  end;

{Meine Datenbank / VST Anbindung}



{******************************************************************************}
{                                                                              }
{                         VST Zeilen farblich darstellen                      }
{                                                                              }
{******************************************************************************}


procedure TForm1.VSTAfterItemErase(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var
  Daten : TOMB256PLUS;
begin
  Daten := TOMB256PLUS.Create;
  Daten := TOMB256PLUS(VST.GetNodeData(Node)^);


  if Sender.Selected[Node] then
    Exit;
   
  Daten := (VST.GetNodeData(Node));

  if Pos('Extern',Daten.Ereignis) > 0 then
    TargetCanvas.Brush.Color := clAqua;

  if Pos('Unscharf',Daten.Ereignis) > 0 then
    TargetCanvas.Brush.Color := clSkyBlue;

  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 : TOMB256PLUS;
begin
  Daten := TOMB256PLUS(VST.GetNodeData(Node)^);
  Daten.Free;
end;


procedure TForm1.VSTfüllen;
begin
if not QRYMB256PLUS.Active then
  QRYMB256PLUS.Open;
  QRYMB256PLUS.filtered := false;
  QRYMB256PLUS.filter := '';
  VST.BeginUpdate;
  VST.Clear;
  VST.NodeDataSize := Sizeof(TOMB256PLUS);
  QRYMB256PLUS.First;
  VST.RootNodeCount := QRYMB256PLUS.RecordCount;
  VST.SortTree(0,sdAscending,true);
  VST.EndUpdate;
end;


{VST Initialisieren mit den Daten aus der Datenbank}
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  Daten : TOMB256PLUS;
begin
  Daten := TOMB256PLUS.Create;
  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;


{Größe vom Objekt dem VST zuweisen}
procedure TForm1.VSTGetNodeDataSize(Sender: TBaseVirtualTree;
  var NodeDataSize: Integer);
begin
  VST.NodeDataSize := SizeOf(TOMB256PLUS);
end;

{Werte dem VST zuweisen}
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  Daten : TOMB256PLUS;
begin
Daten := TOMB256PLUS.Create;
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;

Jens Hartmann 8. Mär 2009 10:49

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Habe den ganzen Abend noch an meinem Fehler gesucht, nur leider ohne Ergebnis.

Das Einzige, wo ich vermute, wo das her kommt liegt bei dem Event GetOnText.
Kommentiere ich diesen Teil aus, Läuft mein Programm.

Delphi-Quellcode:
var
  Daten : TOMB256PLUS;
begin
Daten := TOMB256PLUS.Create;
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;
Irgenjemand da vieleicht noch eine Idee

generic 8. Mär 2009 13:04

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Zitat:

Zitat von Jens Hartmann
Delphi-Quellcode:
var
  Daten : TOMB256PLUS;
begin
Daten := TOMB256PLUS.Create;

Objekt erzeugen

Zitat:

Zitat von Jens Hartmann
Delphi-Quellcode:
Daten := TOMB256PLUS(VST.GetNodeData(Node)^);

nun den Zeiger wieder überschreiben und die Referenz verlieren.
Somit ist die gerade zuvor erzeugte Instanz von die nicht mehr zu benutzen.
Kurz: Die .Create Zeile ist zuviel und das im ganzen Code.

Es reicht ein mal das Objekt pro Datensatz zu erstellen.
Das machst du ja bereits bei der Init Routine.

Delphi-Quellcode:
 
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  Daten : TOMB256PLUS;

[...]
Daten := TOMB256PLUS.Create;
  VST.NodeHeight[Node] := 35;
  Include(InitialStates, ivsMultiline);
  Initialize(Daten);
Was macht deine "Initialize" Daten Funktion?
Wann weist du den Objektzeiger dem VST-Data Zeiger zu?
Jede Zeile hat ein pVirtualNode Record, an diesem hängt der Datenzeiger. Diesen scheinst du nicht zu setzen. Daher die Schutzverletzung.




Daher geht dein GetText usw. nicht, weil es keine Referenz auf deine TOMB256PLUS Objekte findet.

Jens Hartmann 8. Mär 2009 14:52

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Ich habe das ganze jetzt mal umgebaut, und dazu das Tutorial aus dem DelphiTreff zur Hilfe genommen.

Allerdings, klappt das alles nicht so, wie ich mir das vorstelle.

Delphi-Quellcode:
{VST Initialisieren mit den Daten aus der Datenbank}
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  Daten : TOMB256PLUS;

begin
  VST.NodeDataSize := SizeOf(TOMB256PLUS);
  VST.NodeHeight[Node] := 35;
  while not QryMB256PLUS.Eof do
    begin
        Daten := TOMB256PLUS.Create;
        try
        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;
        VST.AddChild(nil,Daten);
        except
        Daten.Free;
      end;
    end;
end;

Allerdings, habe ich das da auch nicht so ganz verstanden, In einem Video hier in der DP wird das VST einmal mit einem Record und einmal mit einem Object gefüllt. Im Tutorial ist dem Object irgendwie einRecord zugewiesen.

generic 8. Mär 2009 17:16

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Delphi-Quellcode:
VST.AddChild(nil,Daten);
ist an der Stelle auch falsch.

mit addChild fügst du einen neuen Knoten hinzu (Würde auch generell gehen, wäre dein Projekt etwas anders aufgebaut).
Da du das NodeCount setzt, sind die Knoten schon im Baum. Du brauchst also nur noch den Zeiger zeigen lassen ;-)

Also hat du nun 2 Möglichkeiten.

a) du nimmst den code aus dem letzten post und löscht aus deinem projekt die andere initialisierung

oder

b) du entfernst die schleife aus der init routine und lässt bei dem node den datenzeiger auf dein objekt zeigen.

Jens Hartmann 9. Mär 2009 17:51

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Also irgendwie bin ich scheinba zu doof da zu.

Diese ganzen Möglichkeiten von Records, Objecten oder Objecten mit Records, hat mich total durcheinander gebracht.
Ich poste Euch jetzt nochmal, meinen zur Zeit aktiven geamten Code der das VST angeht. Vieleicht, kann mir da dann ja mal jemand dran erklären, wo mein Fehler ist, und vorallem warum.

Delphi-Quellcode:
//Wird so in der Funktion aufgerufen, die meine Daten verwaltet.
 
  QryMB256PLUS.Close;
  QryMB256PLUS.SQL.Text := 'SELECT * FROM MB256PLUS';//'SELECT * FROM MB256PLUS';
  QryMB256PLUS.Open;

  Form1.VSTfüllen;  //Eigene Procedure
end;

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);
  Daten := TOMB256PLUS.Create;
  QRYMB256PLUS.First;
  VST.RootNodeCount := QRYMB256PLUS.RecordCount;
  VST.SortTree(0,sdAscending,true);
  VST.EndUpdate;
end;

{Größe vom Objekt dem VST zuweisen}
procedure TForm1.VSTGetNodeDataSize(Sender: TBaseVirtualTree;
  var NodeDataSize: Integer);
begin
  VST.NodeDataSize := SizeOf(TOMB256PLUS);
end;

{Werte dem VST zuweisen}
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  Daten : TOMB256PLUS;
begin
//Daten := TOMB256PLUS.Create;
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;



procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  Daten : TOMB256PLUS;
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;

procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  Daten : TOMB256PLUS;
begin
  Daten := TOMB256PLUS(VST.GetNodeData(Node)^);
  Daten.Free;
end;
Das müssten alle Funktionen sein.

generic 9. Mär 2009 21:02

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Delphi-Quellcode:
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);
  Daten := TOMB256PLUS.Create;
  QRYMB256PLUS.First;
  VST.RootNodeCount := QRYMB256PLUS.RecordCount;
  VST.SortTree(0,sdAscending,true);
  VST.EndUpdate;
end;
Wofür brauchst du da ein neues Daten Objekt? Was passiert damit?

Delphi-Quellcode:
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  Daten : TOMB256PLUS;
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;
So jetzt weisst du hier einen nicht initialisierten Objekt dazu zu.
Müsste sogar in der IDE eine Warnung stehen.

Wie wäre es HIER das Datenobjekt zu erzeugen (.Create) und anschließend den Zeiger zu dem Objekt an den Node-Datenzeiger hängen bzw. zuweisen.
Wobei ich persönlich das arbeiten über InitNode vermeide, da etwas komplizierter und die Knotenanzahl fest stehen muss.
InitNode ist aber performanter als eine iteratives vorgehen.

Der Rest deines Codes sieht ganz gut aus. Aber ich habe den Eindruck das du noch nicht viel mit Objekten und Zeiger gearbeitet hast.

Jens Hartmann 9. Mär 2009 22:37

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
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;

Jens Hartmann 10. Mär 2009 16:39

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
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

generic 10. Mär 2009 22:00

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Sieht ganz gut aus, aber einen müssen wir abziehen, hätten die bei Rosental gesagt.

Du hast ein
Delphi-Quellcode:
VST.NodeDataSize := SizeOf(TOMB256PLUS);
doppelt.

Eigentlich reicht der eine im CreateForm.

Wenn du einen Datensatz hinzufügst, würde ich die Daten direkt in das VST Objekt schreiben und dem VST hinzufügen.
Erst in die DB schreiben und dann wieder alle DS laden, um dann zum letzten zu springen um diesen dann in das Objekt zu kopieren
erscheint mir etwas umständlich.


Kleine Anmerkung noch zu der Recordlösung.
Dort nutzt du die Datentype String und Widestring. Dieses sind Zeigertypen.

Records sind einfach ausdrückt zusammenhängende Speicherblöcke optimal ohne Zeiger drin.
So kann dieser Speicherblock direkt z.B. von/auf Festplatte geschrieben/geladen werden ohne die Daten im Speicher zu suchen zu müssen.

Der VST z.B. nutzt die Records um Geschwindigkeit gut zu machen.
Bei 100 Datensätzen wird nur 1 mal Speicher belegt. Dadurch geht das sehr schnell.
Nutzt du nun Huge-/Wide-Strings dann wird im Record nur ein Zeiger zu dem String abgelegt.

Der kann zwar ganz normal genutzt werden, wird aber vom VST nicht mehr freigegeben und du erhälst Speicherlöcher.
Das kannst du mit dem FastMM kontrollieren. Ein Beispiel befindet sich auch im DP Stammtischvideo #2.

Es gibt 2,5 Möglichkeiten da drum rum zu kommen.
1) Shortstrings verwenden z.B. String[255] wobei die Stringlänge =<255 sein muss
2) du gibts den Huge-/Wide-String frei bei dem onFreeNode Ereignis
2,5) du schaltest die Hugestrings im Compiler aus

Die Objektmethode ist dort anders.
Im onFreeNode wird das komplett Objekt freigegeben also ist das gut.
Nachteil bei 100 Datensätzen fordert der VST 100 mal Speicher für den Knoten im addNode an. Dauert dadurch etwas länger.

Jens Hartmann 10. Mär 2009 22:42

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Hallo generic,

Erstmal großes Dankeschön, für die gute Erklärung. Die VSTFüllen, habe ich abgewandelt.

Delphi-Quellcode:
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;
Allerdings, mit der anderen, denke ich muss das so bleiben. Den Grund dafür, sehe ich, da beim schreiben in die Datenbank, ein ID erzeugt wird. (Generator der Firebird als Zähler).

Delphi-Quellcode:
  //QryMB256PLUS.ParamByName('ID') wird durch die Datenbank erzeugt!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
  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;
Was für mich bedeuten tut, will ich die ID im VST sehen, muss ich diese ja aus der Datenbankabfragen, Oder?
Delphi-Quellcode:
  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;
Da ich keine Zeitprobleme habe, und es kein Problem ist die Datenbank bei Programmstart zu laden, müsste die Variante mit den Objecten ja die bessere sein.

Gibt es den da irgendeine Beschränkung der Anzahl der Datensätz, wo das keinen Sinn mehr macht, oder anders gefragt. Sollte ich das VST auf irgendeine bestimmte Anzahl Datensätze Begrenzen und nur bei Abfrage durch den Kunden die anderen sichbar machen.

Ich denke da an so was...
Delphi-Quellcode:
  Count := QryMB256PLUS.RecordCount-10000;
  QryMB256PLUS.RecNo := Count;

  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;

Jens Hartmann 15. Mär 2009 09:18

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Hallo nochmal zusammen,

habe das ganze jetzt ausgiebig geprüft, und habe leider festgestellt, das da noch irgendein zeitliches Problem bestehen muss.

Starte ich meine Verbindung um Daten von der COM Schnittstelle zu holen, geht das, möchte ich diese allerdings wieder trennen, kommen zwar keine weiteren Daten ins VST, aber mein Programm scheint an irgendeiner Stelle hängen zu bleiben. Oder was ich eher Vermute, weil wenn ich lange Daten hole, und mein Programm minimiere, und später wieder vergrößern will, dauert das unwahrscheinlich lange bis das VST neu gezeichnet ist oder es hgeht gar nicht.

Daher vermute ich, das ich mir irgendwo den Speicher zu mülle.

Mein Object gebe ich allerdings wieder frei.

Hier mal der Code..

Delphi-Quellcode:
{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;
  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);

          if Pos('Einbruch',Daten.Ereignis)
            or Pos('EINBRUCH',Daten.Ereignis) > 0 then
          begin
          CBAlarme.Items.Add(Daten.Ereignis);
          CBAlarme.ItemIndex := 0;
          CBAlarmeDatum.Items.Add(Daten.Datum);
          CBAlarmeDatum.ItemIndex := 0;
          end;

          if Pos('Störung',Daten.Ereignis)
            or Pos('STÖRUNG',Daten.Ereignis) > 0 then
          begin
          CBStoerungen.Items.Add(Daten.Ereignis);
          CBStoerungen.ItemIndex := 0;
          CBStoerungenDatum.Items.Add(Daten.Datum);
          CBStoerungenDatum.ItemIndex := 0;
          end;

          if Pos('Extern',Daten.Ereignis) > 0 then
          begin
          CBExtern.Items.Add(Daten.Ereignis);
          CBExtern.ItemIndex := 0;
          CBExternDatum.Items.Add(Daten.Datum);
          CBExternDatum.ItemIndex := 0;       end;

          if Pos('Intern',Daten.Ereignis) > 0 then
          begin
          CBIntern.Items.Add(Daten.Ereignis);
          CBIntern.ItemIndex := 0;
          CBInternDatum.Items.Add(Daten.Datum);
          CBInternDatum.ItemIndex := 0;
          end;

  VST.ScrollIntoView(VST.GetLast, true);
  VST.EndUpdate;
  QRyMB256PLUS.Close;
  DataMB256plus := '';
end;


procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  Daten : TOMB256PLUS;
begin
  Daten := TOMB256PLUS(VST.GetNodeData(Node)^);
  Daten.Free;
end;
Leider kann ich mit Haltepunkten nichts anfangen. Da ich bei den vielen bereits gesetzten nichts falsches Enddecken kann.

Hat vieleicht jemand eine Idee.

Gruß und Danke Jens

Jens Hartmann 15. Mär 2009 20:38

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Push

hoika 17. Mär 2009 13:05

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Hallo,

wie sieht denn dein OnGetText jetzt aus ?
Hoffentlich nur so was wie


Delphi-Quellcode:
var
  Daten : TOMB256PLUS;
begin
  Daten := TOMB256PLUS(VST.GetNodeData(Node)^);
ohne das .Create


Zum zumüllen:
- Task-Manager benutzen
- MemCheck benutzen


Ausserdem habe ich gesehen, verwendest du RecordCount und Last, das ist schlecht,
wozu brauchst du das Count ?
Besser wäre es, es selber zu zählen.

RecordCount:
============
Select * from Tabelle und alle Datensätze übers Netz ziehen
und dabei laaaangsam zählen
-> durch Select Count(*) ersetzen

Last
====:
Ähnlich wie RecordCount


was benutzt du zum Zugriff auf Firebird ?
-> SQL-Monitor benutzen


Update
======
Jetzt habe ich mir mal die vorige eite angesehen.
Du bekommst über Generator/Trigger eine neue ID
und benutzt Select * -> Last, um an die Id ranzukommen.

Ist "Suboptimal".

Wenn du wirklich der einzige bist, der in die DB schreibt,
reicht ein Select Max(Id) As ID_Max From TableX

Das erneute Auslesne der Daten ist nicht nötig,
die hast du (abgesehen von der ID) ja gerade eingetragen.


Bist du nicht der einzige, holst du dir per select Gen_Id(Generator_Variable,1)
den nächstgößten ID-wert (der Generator wird hier auch gleichzeitg mit erhöht)
und trägst den Datensatz incl. der ID ein.


Heiko






Heiko

Jens Hartmann 18. Mär 2009 19:16

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Hallo Heiko,

Danke erstmal für die vielen Bemühungen. Habe alles so weit verstanden. In der Get Text ist natürlich kein Create mehr.

Allerdings, habe ich das mit der Selekt Funktion jetzt mal versucht, allerdings mit dem Fehler, das das Feld ID nicht bekannt ist.

SQL-Code:
Select Max(Id) From MB256PLUS
Die selbe Meldung, kommt bei deiner Variante

SQL-Code:
Select Max(Id) As ID_Max From TableX
Das Feld existiert aber und ist ein Generator.

Irgendeine Idee

Gruß

Jens

mkinzler 18. Mär 2009 19:26

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Das Feld heit ja auch nicht mehr id sondern max1 oder max_id

hoika 18. Mär 2009 20:11

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Hallo,

oder du liest das Feld aus über Fields[0].AsInteger

schöner ist halt das mit as einem netten Namen zu geben


Heiko

Jens Hartmann 18. Mär 2009 20:41

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Sorry, aber das versteh ich nicht.

Das Feld heißt in meiner Datenbank ID und nicht MAX_ID

Kann mir mal jemand das erklären. mit dem AS

mkinzler 18. Mär 2009 20:53

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
In deiner Tabelle heisst es vielleicht ID, in der Ergebnismenge aber nicht. Mit AS kann man den Namen in der Ergebnimenge setzen.

Jens Hartmann 18. Mär 2009 21:11

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Ja, das hatte ich mir durch das AS gedacht, aber was bedeutet das.

Wie wende ich dann sowas an.

SQL-Code:

Select Max(Id) As ID_Max From MB256PLUS
heißt das, das mein Feld ID jetzt eine zusätzliche Bezeichnung hat, nämlich ID_Max.

Aber wenn ich das eintrage, kommt die Meldung das das Feld ID nicht vorhanden ist. Ich habe die Select Funktion auch mal mit anderen Feldern versucht. Aber da kommt der selbe Fehler mit dem entsprechenden Feld.

Delphi-Quellcode:
    QRyMB256PLUS.Close;
    QryMB256PLUS.SQL.Text := 'Select * From MB256PLUS';
    QryMB256PLUS.Open;
Irgendwie klappt mir nur die gesamte Abfrage

mkinzler 18. Mär 2009 21:35

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Die Ergebnismenge hat auch nur ein Feld mit der Bezeichnung ID_Max

hoika 19. Mär 2009 08:26

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Hallo,

Bsp.

Select Max(Id), Min(Id) From Tabelle

Wie sollen denn die beiden Felder heissen ?, 2mal ID geht nicht.
Das As gibt dem Teil einen neuen Namen

SQL-Code:
Select Max(Id) As Max_Id, Min(Id) As Heiko From Tabelle
ergibt

Max_Id Heiko
100 1

Mit FieldByName('Max_Id').AsInteger bzw. FieldByName('Heiko').AsInteger
kommst du an die beiden Werte ran.

Alternativ Fields[0].AsInteger und Fields[1].AsInteger


Das nennt sich übrigens Feld-Alias.

Lade dir doch mal IBExpert (Personal) runter,
gebe die betreffende Query, dann siehst du auch, was rauskommt.



Heiko

generic 19. Mär 2009 10:06

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Zitat:

Zitat von Jens Hartmann
Was für mich bedeuten tut, will ich die ID im VST sehen, muss ich diese ja aus der Datenbankabfragen, Oder?

Ich würde die Daten in das Objekt für den VST kopieren.
Dann denn DB Insert ausführen und die letzte eingefügte ID auslesen.
Jedes DB System hat dafür Funktionen. Bei MYSQL ist last_insert_id und bei MSSQL Identity. Bei FB/IB weis ich es leider nicht, aber es wird sowas geben.
Die Id kopierst du auch in das Objekt und fügst das OBJ dem VST hinzu.

Der VST schert sich eigentlich nicht um die paar Knoten die du hast. Intensiver wird es mit einer halben Mio an Knoten.
Das ist dann aber auch eine Menge die kein Mensch mehr ansehen/auswerten wird.

Das Speicherproblem kannst du mit auch mit dem FastMM finden.
Ist kurz im Video erklärt bzw. in einen Entwickler ist ein Artikel (05/08) dazu.

hoika 19. Mär 2009 11:08

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Hallo,

Unter FB ab 2.0 gibt es die Returning Clause.

Bsp.
Tabelle mit Feldern ID, Name, ID wird über Trigger gesetzt.
Delphi-Quellcode:
with Query do
begin
  SQL.Clear;
  SQL.Add('Insert Into Table1(Name) Values(:Name) Returning Id');
  ParamByName('Name').AsString:= 'jippi';
  ExecSQL;   // oder Open, ausprobieren
  iNewId:= FieldByName('Id').AsInteger;
end;

Heiko

mkinzler 19. Mär 2009 11:13

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Muss .ExecSQL heissen
Parameter heisst RET_ID
Delphi-Quellcode:
iNewId:= ParamByName('RET_ID').AsInteger;
Besser per Position
Delphi-Quellcode:
iNewId:= Params[1].AsInteger;

Jens Hartmann 19. Mär 2009 17:55

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Hallo zusammen,

Danke erstmal für die vielen, vielen antworten. Ich muss leider momentan immer viel arbeiten, und konnte mich bislang noch nicht intensiv mit den anworten befassen. Ich habe sie zwar alle gelesen, nur noch nicht intensiv versucht Sie umzusetzen. Also, bitte nicht glauben ich hätte kein Interesse an Euren antworten.

Gruß Jens

PS. Heute und Morgen Abend, werde ich mich dem Problem mal wieder widmen.

Jens Hartmann 19. Mär 2009 20:07

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, habe jetzt mal alles so weit durchgesehen, und versuche gerade, mich in die SQL Sprache zu arbeiten. Leider scheitert meine Abfragende Eingrenzung von Daten schon bei der einfachen Eingrenzung auf ein Spalte der Datenbank.

Ich habe vrsucht, zu Übungszwecken folgenden Aufruf über Button zu realisieren. Und bekomme unten angehangene Fehlermeldung.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
    QRyMB256PLUS.Close;
    QryMB256PLUS.SQL.Text := 'Select ID From MB256PLUS';
    QryMB256PLUS.Open;
end;
Seltsamer weise frage ich nach dem Spalte ID, bekomme aber einen Fehler auf die Spalte LfdNr :gruebel:

Gruß

Jens

mkinzler 19. Mär 2009 20:09

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Du wirst ein persistentes Zugriffsfeld für die Spalte 'LfdNr' angelegt haben, welches nun keine Entsprechung im DataSet mehr hat.

Jens Hartmann 19. Mär 2009 20:10

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Was heißt das. Womit leg ich sowas an.

mkinzler 19. Mär 2009 20:12

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Doppelklick auf DataSet (Table, Query)

Jens Hartmann 19. Mär 2009 20:13

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
HierVieleicht sowas hier...

mkinzler 19. Mär 2009 20:15

Re: Datenbank in VirtualTreeView anzeigen und auswerten
 
Die Frage ist, ob du mit persistenten Felder arbeitest, wenn ja darf die Struktur der Ergebnismenge nicht geändert werden


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 Uhr.
Seite 2 von 3     12 3      

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