AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi VirtualStringTree mit "gestreiftem Hintergrund"

VirtualStringTree mit "gestreiftem Hintergrund"

Ein Thema von Codehunter · begonnen am 29. Okt 2014 · letzter Beitrag vom 30. Okt 2014
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

VirtualStringTree mit "gestreiftem Hintergrund"

  Alt 29. Okt 2014, 10:36
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 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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.753 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: VirtualStringTree mit "gestreiftem Hintergrund"

  Alt 29. Okt 2014, 11:40
Gnah, hab das Problem nicht erkannt, bitte löschen...


Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#3

AW: VirtualStringTree mit "gestreiftem Hintergrund"

  Alt 29. Okt 2014, 11:48
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: VirtualStringTree mit "gestreiftem Hintergrund"

  Alt 29. Okt 2014, 12:37
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

AW: VirtualStringTree mit "gestreiftem Hintergrund"

  Alt 29. Okt 2014, 20:20
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;
Miniaturansicht angehängter Grafiken
changecolor.jpg  

Geändert von hathor (29. Okt 2014 um 20:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#6

AW: VirtualStringTree mit "gestreiftem Hintergrund"

  Alt 29. Okt 2014, 20:26
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).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Okt 2014 um 20:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: VirtualStringTree mit "gestreiftem Hintergrund"

  Alt 29. Okt 2014, 20:49
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: VirtualStringTree mit "gestreiftem Hintergrund"

  Alt 29. Okt 2014, 21:23
Vielleicht hilft dir dieser Link weiter..
Tree View Control Reference


gruss
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: VirtualStringTree mit "gestreiftem Hintergrund"

  Alt 30. Okt 2014, 08:47
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.
Ralph
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#10

AW: VirtualStringTree mit "gestreiftem Hintergrund"

  Alt 30. Okt 2014, 12:07
...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 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;

Geändert von hathor (30. Okt 2014 um 13:25 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:03 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