| Autor |
Beitrag |
Jens Hartmann
      
Beiträge: 120
XP
Delphi
|
Verfasst: Mo 02.03.09 12:57
Hallo zusammen,
auf wunsch von Matze, stelle ich eine neue Frage ein.(Übrigens hat er ja recht)
Ich habe mich jetzt intensiv mit dem VirtualTreeView beschäftigt, und habe auch mein Programm so weit am laufen, das ich Daten die von der Com Schnittstelle kommen, direkt und sauber in eine Datenbank (Firebird) und in dem VirtualTreeView eingefügt werden.
Jetzt meine Frage, wie kann ich es realisieren, das immer die letzte Zeile, (die letzten Zeilen) vom VirtuallTreeView gezeigt werden.
Normal ist es ja so, das der Datensatz 1 gezeigt wird. Ich möchte aber gern immer die letzten, also aktuellen Datensätze sehen, und über die Scrollfunktion danm auf die vergangen Aufwärts Scrollen.
Außerdem, wäre es wichtig zu wissen, ob ich die Anzahl der Einträge im VST begrenzen sollte, und diesen wie so eine Art Ringspeicher nutzen sollte.
Das heißt, ich begrenzen z.B. irgendwie auf 20000 Datensätze, es kommt der 21001 und im selben Zug wird z.B. dann der älteste aus der Anzeige gelöscht.
Momentan schreibe ich das TreeView (VirtualStringTree) parallel mit der Datenbank.
Ich vermute aber es wäre wahrscheinlich besser an abbild der Datenbank im VST zu zeigen.
Erst schon mal Danke
Bis dann Jens
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 02.03.09 13:28
Also ich habe eine ( selbst entwickelte) Scrollbar mit Farbverlauf in Benutzung. Dort benutze ich diesen Code: Delphi-Quelltext 1:
| vstDisplay.OffsetY := -1 * scbScrollVertical.Position; | Und in OnScroll (was für dich weniger interessant sein dürfte) steht umgekehrt: Delphi-Quelltext 1:
| scbScrollVertical.Position := -1 * vstDisplay.OffsetY; |
Um herauszufinden welchen Wert ich als maximalen Wert für die ScrollBar brauche, musste ich etwas in VirtualTrees.pas ändern: Delphi-Quelltext Dies ist der entsprechende Kommentar in der Dokumentation des Projekts.
Wenn du diese Änderung durchführst, dann solltest du mit diesem Code zur letzten Zeile scrollen können: Delphi-Quelltext 1:
| vstDisplay.OffsetY := -1 * vstDisplay.ScrollRangeY; |
|
|
Jens Hartmann 
      
Beiträge: 120
XP
Delphi
|
Verfasst: Mo 02.03.09 14:15
Also muss ich diese Zeilen in VirtualTree.Pas Auskommentieren, oder wie muss ich das verstehen.
Andere Frage: Kann man deine Scrollbar verwenden, sieht echt stark aus. Und was müsste ich dann noch an meinem Projekt anpassen
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 02.03.09 14:54
Jens Hartmann hat folgendes geschrieben : | | Also muss ich diese Zeilen in VirtualTree.Pas Auskommentieren, oder wie muss ich das verstehen. |
Nein, unkommentiert unter public hinzufügen. Sonst kommt man an die entsprechenden als private deklarierten Werte nämlich nicht heran.
Jens Hartmann hat folgendes geschrieben : | | Andere Frage: Kann man deine Scrollbar verwenden, sieht echt stark aus. Und was müsste ich dann noch an meinem Projekt anpassen |
Die Komponente installieren und einfügen. Den entsprechenden Code habe ich ja schon gepostet, das sollte alles gewesen sein, für horizontal analog. Bei mir sind da Panels wegen der rechten unteren Ecke drunter, außerdem blende ich die Scrollbars aus, wenn sie nicht benötigt werden. Ich könnte ja einmal ein kleines Demoprojekt mit den Virtual Trees erstellen.
Ja, und die Titelleiste der StringTree und die Statusleiste sind natürlich auch selbst gezeichnet, die Statusleiste auch in einer eigenen Komponente. Eigentlich wollte ich diese ganzen Gradient Komponenten auch mal alle veröffentlichen, aber irgendwie komme ich nicht dazu...
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 02.03.09 14:58
Ich weiß die genauen Methoden jetzt nicht auswendig, aber das geht auch ohne Zusatzkomponenten mit dem VST. In etwa so:
Delphi-Quelltext 1:
| myVST.ScrollIntoView(myVST.GetLastNode, True); |
_________________ We are, we were and will not be.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 02.03.09 15:03
Das hatte bei mir leider nicht richtig funktioniert, damit hatte ich auch mal experimentiert. Das ist schon ein paar Jahre her, vielleicht geht es mittlerweile. Ich habe es seitdem nicht wieder ausprobiert.
// EDIT:
Ja, das klappt jetzt:
Delphi-Quelltext 1:
| myVST.ScrollIntoView(myVST.GetLast, True); | Nur das Node war falsch.
Gut zu wissen, das kann ich dann direkt mal einbauen^^.
Außerdem: Das Scrollen geht ja auch direkt ohne Zusatzkomponenten, wenn man die beiden Zeilen hinzufügt oder einen Wert nimmt, der garantiert bis zur letzten Zeile reicht. Ich glaube auch das ging.
|
|
Jens Hartmann 
      
Beiträge: 120
XP
Delphi
|
Verfasst: Mo 02.03.09 15:20
Erstmal, wie der besten Dank an Euch alle.
da habe ich ja gleich den Feierabend gerettet und kann mal damit spielen.
Wie ist das denn mit meiner anderen Frage, die Anbindung an die Datenbank und die max. Anzahl.
Muss, oder sollte ich dabei was beachten, oder so.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 02.03.09 15:34
Bei der VirtualTreeView ist die maximale Anzahl an Einträgen praktisch unbegrenzt, du musst nur die Datenverwaltung dahinter entsprechend implementieren. Da die Daten eben gerade nicht mit in der Komponente liegen wie bei der Originallistview, gehen eben auch extrem viele Einträge sehr schnell zu verarbeiten.
|
|
Jens Hartmann 
      
Beiträge: 120
XP
Delphi
|
Verfasst: Mo 02.03.09 15:51
Momentan füge ich die Daten in mein VST über mein Objekt ein.
Ist das so OK. ohne gehe ich direkt an die Datenbank 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| procedure TForm1.TreeViewResult(ParserTreeView: TMyBaseParser); var Daten : TOMB256PLUS; i: Integer; Temp1 : Integer; Temp2 : String; Temp3 : String; Temp4 : String; Temp5 : String; Temp6 : String; 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'; QryMB256PLUS.Open;
Daten:= TOMB256PLUS.Create; with Daten do begin LfdNr := Temp1; Datum := Temp2; Uhrzeit := Temp3; Ereignis := Temp4; Teilnehmer := Temp5; Bereich := Temp6; end; VST.AddChild(nil, Daten); DataMB256plus := ''; end; |
Die Text setzte ich so Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| 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:= ''; 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; |
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 02.03.09 15:58
Solange der Speicherverbrauch im Rahmen bleibt, ist das ja völlig in Ordnung. Und bei deinem Verwendungszweck sollte das so auch keine Probleme machen.
Bei extrem vielen Einträgen wäre es eher sinnvoll, nur eine ID einzufügen und die Daten selbst abzurufen, wenn sie gebraucht werden. Das müsste allerdings sehr effizient passieren, damit das nicht träge wirkt.
|
|
Jens Hartmann 
      
Beiträge: 120
XP
Delphi
|
Verfasst: Mo 02.03.09 16:13
Das hört sich ja so an, als wäre das schon so weit in Ordnung.
Ich habe halt nur das Problem, das wenn ich mein Programm starte, das nur die dann Empfangen Einträge Angezeigt werden.
Gibt es denn ne Möglichkeit, das ich immer die letzte z.B. 20000 Einträge aus der Datenbank hole, damit der Kunde nur eine Oberfläche hat, wo er suchen und arbeiten kann.
Das heißt für mich, Programm startet, Datenbank wird initialisiert und die letzten 20000 vorhanden Einträge aus der Datenbank werden im VST angezeigt.
Starte ich jetzt meinen Datentransfer, soll die Größe von 20000 Einträgen des VST bleiben, aber die ältesten verschwinden und durch die neu gelesenen ersetzt werden.
Die Datenbank soll allerdings weiter gesamt gefüllt werden.
Ist das so irgendwie möglich, und wenn wo fangn ich da an.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 02.03.09 16:17
Das ist dann eine Datenbankfrage, die mit der Zeile nix mehr zu tun hat.
Mittels eines Limits der auszulesenden Einträge solltest du per SQL recht einfach bis zu 20000 Einträge auslesen können:
troels.arvin.dk/db/rdbms/#select-limit
|
|
Jens Hartmann 
      
Beiträge: 120
XP
Delphi
|
Verfasst: Mo 02.03.09 18:05
Hallo,
ich habe das jetzt mal probiert, allerdings mit einer Fehlermeldung.
SQL-Anweisung 1:
| 'SELECT * FROM MB256PLUS FETCH FIRST 10 ROWS ONLY' |
Wenn ich das richtig gelesen habe, ist das für den SQL Standart 2008. Ich vermute, das die Firebird 2.1 noch nicht damit arbeitet.
Die anderen 2 Funktionen oder SQL Code´s versteh ich allerdings nicht so richtig.
|
|
Jens Hartmann 
      
Beiträge: 120
XP
Delphi
|
Verfasst: Di 03.03.09 06:04
Morgen,
so habe gestern noch folgendes probiert, und bin aber auch damit nicht erfolgreich gewesen. Vieleicht hat ja nochjemand einen Tipp.
SQL-Anweisung 1:
| SELECT 1 OVER ORDER BY ID FROM MB256PLUS WHERE <= 20000 |
Aber das ist mir eigendlich klar, weil mein SQL ist noch total mies.
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Di 03.03.09 09:15
Neue Frage: Neues Topic bitte!
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
Jens Hartmann 
      
Beiträge: 120
XP
Delphi
|
Verfasst: Di 03.03.09 10:07
Hallo Matze,
kannst Du dann eventuell, den Beitrag ab...
| Zitat: |
Erstmal, wie der besten Dank an Euch alle.
da habe ich ja gleich den Feierabend gerettet und kann mal damit spielen.
Wie ist das denn mit meiner anderen Frage, die Anbindung an die Datenbank und die max. Anzahl.
Muss, oder sollte ich dabei was beachten, oder so.
|
teilen.
Und den neune eventuell VirtualTreeView an Datenbank anbinden nennen.
Danke Gruß Jens
|
|
|