AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Große Probleme mit VirtualStringTree
Thema durchsuchen
Ansicht
Themen-Optionen

Große Probleme mit VirtualStringTree

Ein Thema von SneakyBagels · begonnen am 17. Jun 2017 · letzter Beitrag vom 19. Jun 2017
Antwort Antwort
Seite 3 von 4     123 4      
SneakyBagels
(Gast)

n/a Beiträge
 
#21

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 19:25
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
Angehängte Dateien
Dateityp: zip VST-Test.zip (2,8 KB, 6x aufgerufen)

Geändert von SneakyBagels (17. Jun 2017 um 19:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#22

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 19:38
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);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#23

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 00:10
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.
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#24

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 00:13
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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#25

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 00:28
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.
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#26

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 00:36
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.592 Beiträge
 
Delphi 11 Alexandria
 
#27

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 07:38
Es ist immer besser die Daten außerhalb der GUI zu halten und dort nur zu referenzieren.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#28

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 12:03
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;

Geändert von SneakyBagels (18. Jun 2017 um 12:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.592 Beiträge
 
Delphi 11 Alexandria
 
#29

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 19:41
Warum benutzt du denn DT_SINGLELINE? Es können doch direkt mehrere Zeilen ausgegeben werden.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#30

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 19:56
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.

Geändert von SneakyBagels (18. Jun 2017 um 20:03 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 Uhr.
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