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
Aviator

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

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 23: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
 
#2

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 23: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
10.043 Beiträge
 
Delphi 12 Athens
 
#3

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 06:38
Es ist immer besser die Daten außerhalb der GUI zu halten und dort nur zu referenzieren.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#4

AW: Große Probleme mit VirtualStringTree

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

Registriert seit: 10. Jun 2003
Ort: Berlin
10.043 Beiträge
 
Delphi 12 Athens
 
#5

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 18:41
Warum benutzt du denn DT_SINGLELINE? Es können doch direkt mehrere Zeilen ausgegeben werden.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#6

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 18: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 19:03 Uhr)
  Mit Zitat antworten Zitat
Aviator

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

AW: Große Probleme mit VirtualStringTree

  Alt 18. Jun 2017, 19:06
Für den Fall könntest du mal den Automatismus vom VST ausprobieren. Aktiviere hierzu toAutoSpanColumns (glaube so heißt es) in den TreeOptions und füge dann nur in Col1 (bzw. in der Column, ab der der Text angezeigt werden soll) den Text ein. Bei den nachfolgenden Columns lässt du den CellText leer.

Der VST verlängert dann automatisch den Text über die anderen Spalten hinweg. Ob das mit Multiline funktioniert weiß ich nicht. Die Node Höhe sollte da aber keine Rolle spielen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:23 Uhr.
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-2025 by Thomas Breitkreuz