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 Listboxitem zentrieren? (https://www.delphipraxis.net/180998-listboxitem-zentrieren.html)

Mattze 7. Jul 2014 13:31

Listboxitem zentrieren?
 
Hallo,

wie zentriert man einen Listboxeintrag bzgl. clientwidth der Listbox?
Nicht grinsen!!! Das wäre recht einfach, wenn man nur einmal canvas.textout hätte.
Aber:
items[index] sei irgendwie zerlegt in s1, s2 und s3.
Und zwar erst in DrawItem!
(items[index]:=s1+s2+s3;)
Alle diese Teile werden zwar auf der gleichen Zeile, aber eben unterschiedlich formatiert ausgegeben.
(Anderer canvas.font, anderer canvas.brush, Leerzeichen dazwischen usw.)
Also hat man nicht einen kompakten String und deshalb die Ausgabelänge, sondern 3 mal canvas.textout.
Man kennt die Ausgabelänge nicht, bevor man das alles ausgegeben hat.
Wie das dann zentrieren?
Mir fehlt da die Idee.
Evtl. erst auf eine Bitmap zeichnen, dann hat man die Gesamtlänge. Die richtige Position auf der Listbox setzen und zuletzt die Bitmap auf die Listbox schieben
oder alles dort neu hinzeichnen? Was wäre besser?

Gruß
Mattze

mkinzler 7. Jul 2014 13:34

AW: Listboxitem zentrieren?
 
Eine anderes Control verwenden?

Mattze 7. Jul 2014 14:34

AW: Listboxitem zentrieren?
 
Hallo,

diese Variante steht leider nicht zur Diskussion!

Sonst noch irgendwelche Vorschläge?

Gruß
Mattze

baumina 7. Jul 2014 14:46

AW: Listboxitem zentrieren?
 
Meiner Meinung nach weißt du vor den einzelnen Textouts sehr wohl wie breit der einzelne Textout wird, denn du musst ja auch die anderen beiden Textouts richtig links anfangen lassen. Also kannst doch dann von der Summe der Breiten die Mitte finden, oder nicht?

p80286 7. Jul 2014 15:00

AW: Listboxitem zentrieren?
 
Das richtige Stchwort ist wohl
Delphi-Quellcode:
Textwidth
und/oder
Delphi-Quellcode:
Textrect
Gruß
K-H

Mattze 7. Jul 2014 15:23

AW: Listboxitem zentrieren?
 
Hallo,

vielen Dank für die Antworten.
Das ist alles richtig! Im Prinzip!
Da kann bloß zwischen s1, s2 und s3 noch eine verschiedene Anzahl von "leeren Pixeln" stehen. Im Grunde ein Tabulator, der eben durchaus auch verschieden sein kann.
Aber Ihr gebt mir da einen Gedanken ein. Vielleicht geht es doch mit den "normalen" Sachen (Textwidth usw.).
Wird nur eine elende Rechnerei und ob das nicht zuviel Zeit kostet.
Nun, schaun mer mal...

Gruß
Mattze

PS: Ich bin immer noch bei der Idee, das vorher auf eine Bitmap zu zeichnen und dann nur entsprechen zu kopieren.
Mal sehen...

himitsu 7. Jul 2014 15:31

AW: Listboxitem zentrieren?
 
Nein, das ist kein Tabulator.
In der List-Ansicht ist das ein Grid, nur daß man die Spaltentrennung nicht immer sieht.

Das sind halt mehrere "getrennte" Spalten, weswegen der Vorschlag mit einer "passenden" Komponente schon der Richtigere war.

Mattze 7. Jul 2014 17:02

AW: Listboxitem zentrieren?
 
Hallo himitsu,

bitte nicht mehr hineininterpretieren als ist.
Es geht wirklich um eine Listbox mit Columnen:=0!
Und EINEN String, der eben zur Laufzeit so aufgeteilt wird, dass irgendwo dazwischen einige Leerzeichen (oder eben mehrere verschiedene Tabulatoren - siehe bei den Schweizern) eingebaut werden.
Das kann bei jedem Listbox.item ganz woanders sein.

Gruß
Mattze

himitsu 7. Jul 2014 17:21

AW: Listboxitem zentrieren?
 
Ups, hast Recht.

Ich war irgendwie auf 'nem ListView gekommen, da eine ListBox ja eigentlich nur eine Spalte hat und ich garnicht erst auf die Idee gekommen bin da würde jemand mehrere Spalten reinmachen. :stupid:


Nja, wenn mehrere Formate, dann mußt du eben jedes Textstück einzeln berechnen müssen (je Font-Style).
Die Text-Widths werden dann zusammengerechnet, der Anfang für die Zentrierung berechnet und dann jedes Stück ab da einzeln gezeichnet, was doch eh nicht anders zu machen ist. :gruebel:

Mattze 8. Jul 2014 06:54

AW: Listboxitem zentrieren?
 
Hallo himitsu,

eben! Eklige Rechnung!
Dazu kommt noch, dass einige Zeichen vor dem Ausschreiben entfernt oder dazugefügt werden und noch mehr.
Eine irre Sache, da die tatsächlich "Ausgabelänge" zu ermitteln!
Ob das vom Zeitbedarf noch sinnvoll wird oder die Listbox da zu langsam wird?!

Gruß
Mattze

Mikkey 8. Jul 2014 07:22

AW: Listboxitem zentrieren?
 
Zitat:

Zitat von Mattze (Beitrag 1264786)
Ob das vom Zeitbedarf noch sinnvoll wird oder die Listbox da zu langsam wird?!

Das ist das geringste Problem.

Ich habe früher (r), als es noch keine Listviews gab, (in C++) so etwas häufig gemacht und dabei sogar die (über der Listbox plazierten) Label richtig hingeschoben.

Wahrscheinlich suchst Du eher nach einer Möglichkeit, die "eklige Rechnung" nicht durchzuführen. Aber - wenn Du denn die Anforderungen erfüllen willst - da wirst Du nicht drumherum kommen.

Geht es jeweils nur um eine Zeile oder können sich die "Tabstops" für die ganze Listbox durch einen besonders langen Textteil verschieben?

himitsu 8. Jul 2014 09:43

AW: Listboxitem zentrieren?
 
Man könnte notfalls das Zeichnen und Berechnen zusammen durchführen.

- ein Bitmap im Hintergrund
- das wird so groß gemacht, wie die zu zeichnende Zelle
- da wird dann der Text draufgezeichnet und dabei lässt man sich auch gleich die Größe geben, um den nächsten Text hinten anzuhängen
- am Ende hat man die Gesamtlänge (abgerundet auf die Zellenbreite, wenn breiter)
- berechnet nun den Zentrierungsanfang
- und kopiert das Bitmap ins Canvas der ListBox

Oder man berechnet die Breite schon beim Einfügen/Ändern der Texte, bzw. spätestens beim/vorm ersten Zeichnen, und speichert sie für die nachfolgende Zeichenoperationen.

Mattze 8. Jul 2014 13:29

AW: Listboxitem zentrieren?
 
Hallo himitsu,

ich danke Dir!!!
Das ist nämlich die Idee, die ich im ersten Post hatte, aber an der ich selber noch etwas zweifelte. obei die gleichzeitige Ausgabe und Längenberechnung auf der Bitmap genau der zusätzliche Kick war, den ich brauchte.
(Mich störte einfach, dass ich das zweimal machen sollte. Einmal die Ausgabe und einmal die Längenberechnung.)

Diese Möglichkeit hast Du mir bestätigt, also ran...
WMal sehen, wie das am besten ist...

Gruß
Mattze

Mattze 11. Jul 2014 06:19

AW: Listboxitem zentrieren?
 
Hallo Allerseits,

ich habe noch eine einfachere Methode gefunden, um einen Listboxeintrag bzgl. Listbox.clientwidth zu zentrieren:
Im Drawitem habe ich hinzugefügt:
(crect ist eine TRECT-Variable. Unnötig, aber so brauche ich das nur einmal berechnen.
l ist die letzte penpos.x. Am besten nimmt man etwas mehr oder berechnet l exakt. Damit "kursive TTs" beachtet werden.)

Delphi-Quellcode:
      bmp:=Tbitmap.create;
      with bmp do
        try
          height:=itemheight;
          width:=324;
          crect:=classes.rect(0,0,l,height);
          canvas.CopyRect(crect,self.canvas,classes.rect(0,rect.top,l,rect.top+itemheight));
          self.Canvas.FillRect(rect);
          i:=(clientwidth-l) Div 2;
          if i<0 then i:=0;
          self.Canvas.CopyRect(classes.rect(i,rect.top,i+l,rect.Top+itemheight),bmp.canvas,crect);
        finally
          bmp.free
        end;
Das geht schnell und einfach.

Gruß
Mattze


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