Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Große Probleme mit VirtualStringTree (https://www.delphipraxis.net/193070-grosse-probleme-mit-virtualstringtree.html)

SneakyBagels 17. Jun 2017 18:25

AW: Große Probleme mit VirtualStringTree
 
Liste der Anhänge anzeigen (Anzahl: 1)
Aktuell verwende ich ein TListView welches ich eigentlich bearbeiten wollte, um Data mit hinterlegter Liste zu verwenden.
Das hätte für mich den Vorteil, dass ich an verschiedenen Stellen nicht mehr extra in meine Ini-Datei gehen muss oder noch blöder die SubItems auslesen muss.

Und wenn-schon-denn-schon dachte ich mir, baue ich alles komplett auf VST um.
Also ja, die Daten werden noch woanders verwendet (nur lesend).

Hier meine aktuelle Demo. Sortieren funktioniert, aber löschen danach nicht mehr.
Folgendes lößt das Problem vorzeitig, aber ist es auch -richtig-?
Delphi-Quellcode:
 // Zu TVSTData hinzufügen
 Index: Integer;

 // Index beim Erstellen der Nodes setzen
 aVSTData := TVSTData.Create;
 aVSTData.Index := i;
 // ....

 // Einen Node und dessen Daten löschen
 ShowMessage('VST-Index: ' + IntToStr(VST.FocusedNode.Index) + sLineBreak + 'List-Index: ' + IntToStr(Data.Index));
 aVSTDataClasses.Delete(Data.Index); // Daten des Nodes aus ObjectList löschen
 VST.DeleteNode(VST.FocusedNode); // Node "visuell" löschen

DeddyH 17. Jun 2017 18:38

AW: Große Probleme mit VirtualStringTree
 
Nimm doch beim Löschen einfach den Index innerhalb der Objektliste, dann kann doch nichts schiefgehen. Pseudo-Code:
Delphi-Quellcode:
idx := Liste.IndexOf(VST.NodeData);
if idx > -1 then
  Liste.Delete(idx);

Aviator 17. Jun 2017 23:10

AW: Große Probleme mit VirtualStringTree
 
Ich habe mir dein Testprojekt jetzt mal angeschaut. Es ist natürlich wenig programmfluss drin der sich selbst erklärt. Also wann soll man welchen Button drücken damit nichts kaputt geht. Aber das ist ja bei einem Testprojekt normal.

Prinzipiell sieht es schonmal nicht falsch aus. Auch wenn da noch einige Dinge drin sind die man verbessern könnte. Nur will ich hier jetzt kein großes Fass aufmachen da ich nicht weiß, wie ausführlich du dein Testprojekt jetzt programmiert hast.

Ich denke es wäre sinnvoller, wenn du schon ein etwas fortgeschritteneres Programm zum "Probelesen" anbieten würdest, in dem du auch schon ein gewisses Errorhandling drin hast. Fehler im Keim zu ersticken ist zwar immer besser, aber bei reinen Testanwendung schreibt man ja auch schnell mal was hin ohne großartig Wert darauf zu legen wie es aussieht. Hauptsache der Test funktioniert.

Das Problem mit dem Löschen deiner Nodes haben wir ja in dem anderen Thread geklärt. :wink:

SneakyBagels 17. Jun 2017 23:13

AW: Große Probleme mit VirtualStringTree
 
Ich kann dir später gerne mal mein aktuelles Testprojekt hier anbieten.
Es wird aber noch über Wochen ein Testprojekt bleiben.
Fehlerbehandlung kommt erst, wenn ich den Testcode in mein eigentliches Projekt einbaue, da mir im Testprojekt dafür gewisse Units fehlen.

Mit diesem Testprojekt ohne Fehlerbehandlung komme ich vollkommen klar. Ich setze es demnächst aber nochmal neu hier rein mit einer kurzen Erklärung.

Aviator 17. Jun 2017 23:28

AW: Große Probleme mit VirtualStringTree
 
Zitat:

Zitat von SneakyBagels (Beitrag 1374781)
Ich kann dir später gerne mal mein aktuelles Testprojekt hier anbieten.
Es wird aber noch über Wochen ein Testprojekt bleiben.
Fehlerbehandlung kommt erst, wenn ich den Testcode in mein eigentliches Projekt einbaue, da mir im Testprojekt dafür gewisse Units fehlen.

Mit diesem Testprojekt ohne Fehlerbehandlung komme ich vollkommen klar. Ich setze es demnächst aber nochmal neu hier rein mit einer kurzen Erklärung.

Ist ja auch in Ordnung so. Ich habe jetzt einfach mal nur die Art deiner Programmierung, also der Zuweisung der Daten zum Tree und die Verarbeitung der Daten, beachtet. Ausgeführt habe ich das Programm nur kurz und mal nacheinander verschiedene Dinge probiert.

Mir ist jetzt nicht direkt irgendetwas aufgefallen was du evtl. falsch machst bis auf eine Kleinigkeit:

Delphi-Quellcode:
procedure TForm2.VSTCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
 Data1: TVSTData;
 Data2: TVSTData;
begin
 Data1 := Node1.GetData<TVSTData>;
 Data2 := Node2.GetData<TVSTData>;

 Result := CompareText(Data1.Col1, Data2.Col2);
end;

Hier vergleichst du Col1 immer mit Col2 von unterschiedlichen Nodes. Ich denke, dass das richtigerweise beide Male Col1 sein sollte. Aber dazu kann ich nicht mehr sagen.

Ein Hinweis vielleicht noch zu dem DrawText. Hier geht es dir scheinbar darum, dass du einen bestimmten Text hinter eine Node setzen willst, wenn eine Beschreibung vorliegt. Das könntest du evtl. auch mit dem StaticText umsetzen was du wiederum über das GetText lösen könntest. Dafür benötigst du dann kein extra DrawText Event.

SneakyBagels 17. Jun 2017 23:36

AW: Große Probleme mit VirtualStringTree
 
Zitat:

Das könntest du evtl. auch mit dem StaticText umsetzen was du wiederum über das GetText lösen könntest. Dafür benötigst du dann kein extra DrawText Event.
Ich nehme jegliche Verbesserungsvorschläge an.

Ich führe jaenike's Beitrag hier mal fort wenn ich darf: #4: http://www.delphipraxis.net/1374783-post4.html
Das hieße, ich bräuchte keine extra TObjectList zum Halten der Daten.

Daher eine generelle Frage:
ObjectList ja oder nein. Das Projekt hat rund 120.000 Zeilen und das VST wird das Control sein, welches zu 99% verwendet wird.

jaenicke 18. Jun 2017 06:38

AW: Große Probleme mit VirtualStringTree
 
Es ist immer besser die Daten außerhalb der GUI zu halten und dort nur zu referenzieren.

SneakyBagels 18. Jun 2017 11:03

AW: Große Probleme mit VirtualStringTree
 
Ich habe eben mal ein bisschen mit toShowStaticText rumprobiert, bekomme das aber leider nicht hin, dass ich zwei Zeilen Text pro Node habe.
Aktuell verwende ich ja TargetCanvas.TextOut im OnDrawText zweimal, da klappt es. Winapi.Windows.DrawTextW wäre mir eigentlich lieber.

Aktuell ist es so
Delphi-Quellcode:
procedure TForm2.VSTDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: string; const CellRect: TRect;
 var DefaultDraw: Boolean);
var
 Data: TVSTData;
 DrawFormat: Cardinal;
 R: TRect;
 s: string;
begin
 DefaultDraw := False;
 R := CellRect;
 R.Left := R.Left + VST.Indent;

 Data := Node.GetData<TVSTData>;

 // TargetCanvas.TextOut(CellRect.Left, CellRect.Top + 2, Text);

 DrawFormat := DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE;
 if Data.bHasDescription then
  R.Top := R.Top - 14;

 Winapi.Windows.DrawTextW(TargetCanvas.Handle, PWideChar(Text), Length(Text), R, DrawFormat);

 if Data.bHasDescription and (Column = 0) then
  begin
   // TargetCanvas.TextOut(CellRect.Left, CellRect.Top + 18, '123');
   s:='123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 '; // wird leider nicht komplett gezeichnet - nur "123 "
   R.Top := R.Top + 28;
   Winapi.Windows.DrawTextW(TargetCanvas.Handle, PWideChar(s), Length(s), R, DrawFormat);
  end;
end;

jaenicke 18. Jun 2017 18:41

AW: Große Probleme mit VirtualStringTree
 
Warum benutzt du denn DT_SINGLELINE? Es können doch direkt mehrere Zeilen ausgegeben werden.

SneakyBagels 18. Jun 2017 18:56

AW: Große Probleme mit VirtualStringTree
 
Im Prinzip möchte ich folgendes weiß aber nicht ob das möglich ist
.,.. keine Ahnung wie man eine Tabelle macht daher so

Header | Header | Header | Header
---------------------------------
-Col1--|--Col2--|--Col3--|--Col4 <== Node: Default Höhe

-Col1--|--Col2--|--Col3--|--Col4 <== Node: doppelte Höhe
-hier ein string von Col1 bis Col4

Ich dachte erst AutoSpan der Cols könnte helfen aber leider nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz