Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualStringTree mit "gestreiftem Hintergrund" (https://www.delphipraxis.net/182493-virtualstringtree-mit-gestreiftem-hintergrund.html)

Codehunter 29. Okt 2014 09:36

VirtualStringTree mit "gestreiftem Hintergrund"
 
Hallo!

Ich steh grade ein wenig auf dem Schlauch. Ich möchte den VirtualStringTree mit einem gestreiften Hintergrund versehen. Einfach für bessere Lesbarkeit in langen Listen (ich nutze den VST als Grid). Im OnAfterItemErase pinsle ich dann den Zellhintergrund andersfarbig. Soweit auch ok. Das Problem dabei: Eigentlich müsste ich jede zweite Zeile grau und die anderen weiß machen. Also prüfe ich mit
Delphi-Quellcode:
if Odd(Node.Index) {weiß} else {hellgrau}
die Zeilennummern. Leider ist Node.Index ebenenabhängig. VST.AbsoluteIndex(Node) bezieht aber auch die ausgeblendeten (collapsed) Nodes mit ein. Im Ergebnis habe ich keinen abwechselnd gestreiften Hintergrund sondern wildes Durcheinander. Im Prinzip bräuchte ich sowas wie "AbsoluteVisibleIndex".

Grüße
Cody

Sherlock 29. Okt 2014 10:40

AW: VirtualStringTree mit "gestreiftem Hintergrund"
 
Gnah, hab das Problem nicht erkannt, bitte löschen...


Sherlock

himitsu 29. Okt 2014 10:48

AW: VirtualStringTree mit "gestreiftem Hintergrund"
 
Die Komponente müsste doch einen VisibleIndex von der oberen Komponentenkante, bzw. eine Position von der linken oberen Ecke dir anbieten?

Bei der Position müsste man Y nur noch durch die höhe der Zeilen dividieren.
Allerdings verschiebt sich dann die Farbe beim Scrollen innerhalb den Nodes, aber bleibt im sichtbaren Bereich immer an der selben Stelle.

Codehunter 29. Okt 2014 11:37

AW: VirtualStringTree mit "gestreiftem Hintergrund"
 
Zitat:

Zitat von himitsu (Beitrag 1277830)
Die Komponente müsste doch einen VisibleIndex von der oberen Komponentenkante, bzw. eine Position von der linken oberen Ecke dir anbieten?

Habe ich zumindest noch nicht gefunden. Zumal die Paint-Ereignisse ja heikel sind wenn man innerhalb derer Schleifen laufen lässt die bei anderen Nodes wieder Paint-Ereignisse auslösen. Da ist man schnell bei "Out of GDI Resources" :(

Die Idee, über die Nodes im Viewport zu iterieren hatte ich auch schon, ist aber grad beim Scrollen sehr CPU-lastig.

hathor 29. Okt 2014 19:20

AW: VirtualStringTree mit "gestreiftem Hintergrund"
 
Liste der Anhänge anzeigen (Anzahl: 1)
http://stackoverflow.com/questions/3...al-string-tree
Das lässt sich auch anpassen:
http://code.google.com/p/virtual-tre.../detail?id=224

Für die Komponente VirtualStringTree kann ich jetzt nichts testen -> nicht installiert...

Für eine ListBox sieht das so aus:
Vielleicht kann das jemand anpassen?

Delphi-Quellcode:
procedure TForm2.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with Control as TListBox do begin
chgcol:= not chgcol; //globale Boolean
if chgcol then Canvas.Brush.Color:= clsilver else Canvas.Brush.Color:= clGray;
Canvas.FillRect(Rect);
Canvas.Font.Color := TColor(Items.Objects[Index]);
Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[Index]);
end;
end;

procedure TForm2.Button10Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 99 do
begin
if Odd(i) then
ListBox1.Items.AddObject('Rotes Item', Pointer(clred))
else
ListBox1.Items.AddObject('Grünes Item', Pointer(cllime));
end;
end;

himitsu 29. Okt 2014 19:26

AW: VirtualStringTree mit "gestreiftem Hintergrund"
 
Beim Tree kann man Items mittendrin ein-/ausblenden (zusammenklappen) und wenn das eine ungerade Anzahl ist, dann stimmen die Streifen nicht mehr,
wenn man also mittendrin einige Zeilen "entfernt".

Du müsstest also bei jedem Auf-/Zuklappen und sowieso bei jeder Änderung (hinzufügen oder entfernen von Items) deine Liste neu berechnen (mindestens ab der Stelle der Änderung).

Codehunter 29. Okt 2014 19:49

AW: VirtualStringTree mit "gestreiftem Hintergrund"
 
Ich werde morgen mal die internen Zeichenroutinen vom VST auseinander nehmen. Ich meine dass dort auch nur die Nodes gezeichnet werden die im Viewport liegen und sichtbar sind. Entsprechend muss es auch möglich sein darüber zu iterieren und einen "VisibleIndex" zu bilden.

EWeiss 29. Okt 2014 20:23

AW: VirtualStringTree mit "gestreiftem Hintergrund"
 
Vielleicht hilft dir dieser Link weiter..
Tree View Control Reference


gruss

Jumpy 30. Okt 2014 07:47

AW: VirtualStringTree mit "gestreiftem Hintergrund"
 
In einem anderen aktuellen Thread den ich gerade nicht finde, geht es um Darstellung eines Trees auf mobilen Geräten und da gibt es auch einen Vorschlag jeder "Einrücktiefe" eine eigene Farbe zu geben (Abstufungen von Grau, soll ja nicht total bunt werden) und ich finde das sieht gut und übersichtlich aus und vermittelt neben der Übersichtlichkeit die Information "Einrücktiefe" auf eine zusätzliche Weise.

hathor 30. Okt 2014 11:07

AW: VirtualStringTree mit "gestreiftem Hintergrund"
 
Zitat:

Zitat von Codehunter (Beitrag 1277824)
...Im OnAfterItemErase pinsle ich dann den Zellhintergrund andersfarbig. Soweit auch ok. Das Problem dabei: Eigentlich müsste ich jede zweite Zeile grau und die anderen weiß machen. Also prüfe ich mit
Delphi-Quellcode:
if Odd(Node.Index) {weiß} else {hellgrau}
die Zeilennummern. Leider ist Node.Index ebenenabhängig...
Grüße
Cody

Kann es sein, dass Dein Code in der falschen Procedure gelandet ist?
Teste doch mal OnBeforeItemErase.

Delphi-Quellcode:
// OnBeforeItemErase
procedure TForm2.VSTBeforeItemErase(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect;
  var ItemColor: TColor; var EraseAction: TItemEraseAction);
begin
//  colorG, colorS = globale Boolean, man merkt sich die letzte Farbe
if colorG=true then
  begin
  ItemColor := clSilver; colorS:=true; colorG:=false;
  end
  else
  begin
   ItemColor := clGray; colorG:=true; colorS:=false;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 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