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 Text in Listbox zentrieren (https://www.delphipraxis.net/66911-text-listbox-zentrieren.html)

schuetzejanett 6. Apr 2006 12:43


Text in Listbox zentrieren
 
Hallo,

ich erstelle während der laufzeit eine bestimmte anzahl von Listboxen.
Nun möchte ich das der Inhalt der Listboxen zentriert ist deswegen habe
ich es mit dem Befehl

Delphi-Quellcode:
 setwindowlong(APunkte[i].Handle ,GWL_Style , ES_CENTER);
jetzt haben die listboxen aber nicht mehr die eingestellte größe und sind alle in der mitte zentriert.
Also nicht das was ich wollte wie schaffe ich es nun nur den text(Inhalt) der listboxen zu zentrieren hier noch mal der gesamte quellcode

Delphi-Quellcode:
 APunkte : array of TListbox;

setlength(APunkte,unit1.anz);
 For i :=0 to High(APunkte) do
    begin
      APunkte[i] := TListbox.Create(self);

      with APunkte[i] do
        begin
          parent := TPunkt;
          Items.add (inttostr(aspieler[i].punkte[0]));
          Height := 320;
          Top := 105;
          Width := 85;
          Left := 15 + (i * 90);
          parent := self;
        end;
      setwindowlong(APunkte[i].Handle ,GWL_Style , ES_CENTER);
    end;

DP-Maintenance 6. Apr 2006 12:44

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Multimedia" nach "VCL / WinForms / Controls" verschoben.
Ist eher eine Frage für die VCL-Sparte

schuetzejanett 6. Apr 2006 18:45

Re: Text in Listbox zentrieren
 
hallo,

geht es denn wenn ich statt einer listbox ein memofeld nehme , weil ich ja bloß eine Zahlenreihe anzeigen will, und wenn ja wie schaffe ich es ein memofeld nur read only ist

Hawkeye219 6. Apr 2006 19:31

Re: Text in Listbox zentrieren
 
Hi,

es sollte funktionieren, wenn Du die Einträge der Listboxen selbst zeichnest. Dazu setzt Du die Eigenschaft Style auf den Wert lbOwnerDrawFixed und schreibst eine Behandlungsroutine für das Ereignis OnDrawItem. Diese Routine könnte so aussehen:

Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem (Control: TWinControl; Index: Integer;
                                   Rect: TRect; State: TOwnerDrawState);
  var Breite, x : Integer;
begin
  // Pixelbreite des Eintrags bestimmen
  Breite := ListBox1.Canvas.TextWidth(ListBox1.Items[Index]);
  // x-Position des Eintrags bestimmen
  x := (Rect.Left + Rect.Right - Breite) div 2;
  // Eintrag darstellen
  ListBox1.Canvas.TextRect(Rect, x, Rect.Top, ListBox1.Items[Index]);
end;
Die Erklärung der Parameter findest Du in der Online-Hilfe.

Gruß Hawkeye

Lannes 6. Apr 2006 20:42

Re: Text in Listbox zentrieren
 
Hallo,

kannst auch DrawText nehmen, dann brauchst Du nichts berechnen.
Delphi-Quellcode:
DrawText(ListBox1.Canvas.Handle,
         PChar(ListBox1.Items[Index]),
         Length(ListBox1.Items[Index]),
         Rect,
         DT_CENTER);

MoziGut 31. Mär 2014 15:04

AW: Text in Listbox zentrieren
 
auch wenn es schon etwas älter ist, ist der Code auch anwendbar für Mobile Firemonkey Anwendungen?
Bzw. wie kann ich bei einer MF-Anwendung den Text in einer Listbox zentrieren?

PS: Ich nutzte Delphi XE5, es ist eine Mobile Firemonkey Anwendung und es ist für Android!

Popov 31. Mär 2014 16:49

AW: Text in Listbox zentrieren
 
Ich kenne Firemonkey nicht, aber hat die ListBox eine DrawItem? DrawItem bedeutet, dass du das Item selbst zeichnest.

himitsu 31. Mär 2014 17:21

AW: Text in Listbox zentrieren
 
MSDN-Library durchsuchenDrawText => WinAPI => Antwort: Nein
Ebenso bei MSDN-Library durchsuchenSetWindowLong.


Ein Event ala OnDrawItem dürfte/könnte es aber auch in der FireMonkey-ListBox geben, so das du es selber zeichnen könntest,
falls es dort nicht doch eine Möglichkeit gibt, den ListItems eine entsprechende Formatierungsoption mitzugeben.

Popov 31. Mär 2014 18:37

AW: Text in Listbox zentrieren
 
Hier ein Beispiel, kannst es testen:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  with ListBox1 do
    Style := lbOwnerDrawFixed;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  LB: TListBox;
  dTop, dLeft: Integer;
  Size: TSize;
begin
  if not (Control is TListBox) then Exit;
  LB := Control as TListbox;

  Size := LB.Canvas.TextExtent(LB.Items[Index]);
  dTop := (LB.ItemHeight - Size.cy) div 2;
  dLeft := ((Rect.Right - Rect.Left) - Size.cx) div 2;

  LB.Canvas.TextRect(Rect, Rect.Left + 2 + dLeft, Rect.Top + dTop, LB.Items[Index]);
end;

Volker Z. 31. Mär 2014 23:53

AW: Text in Listbox zentrieren
 
Hallo,

Zitat:

[...] Bzw. wie kann ich bei einer MF-Anwendung den Text in einer Listbox zentrieren?
Hast Du Dir schon mal die Eigenschaft TextAlign*) eines TListBoxItem angesehen? Oder gibt es einen besonderen Grund den Text selbst zu zeichnen?

Gruß

*) Die Angabe in der Hilfe taCenter sei der Defaultwert, ist für XE4 - vermutlich auch für XE5 - falsch (Default ist taLeading).

MoziGut 1. Apr 2014 09:22

AW: Text in Listbox zentrieren
 
@Popov: Sicher das der Code auch für MF-Anwendungen funktioniert?
@Volker Z.: Wenn es möglich ist ohne selber zu zeichnen/schreiben, gerne. Allerdings funktioniert TTextControl für Listboxen nicht.
Und wenn ich den TextAlign für ein Item umstelle, wird das doch noch lange nicht auch für die folgenden Items übernommen!?!

Popov 1. Apr 2014 11:59

AW: Text in Listbox zentrieren
 
Zitat:

Zitat von MoziGut (Beitrag 1254274)
@Popov: Sicher das der Code auch für MF-Anwendungen funktioniert?

Das weiß ich nicht, aber falls da ItemDraw ist, warum nicht? Ist nur zeichnen auf Canvas.

MoziGut 3. Apr 2014 08:27

AW: Text in Listbox zentrieren
 
Nope soweit ich das sehe, funktioniert "ItemDraw" bei MF-Anwendunge nicht! Hat noch jemand eine Idee?

Volker Z. 4. Apr 2014 00:28

AW: Text in Listbox zentrieren
 
Hallo,

Zitat:

[...] Allerdings funktioniert TTextControl für Listboxen nicht. [...]
Was meinst Du mit: funktioniert nicht? TTextControl ist erst mal eine Klasse. Ein TListBoxItem ist eine abgeleitete Klasse von TTextControl. In eine Instanz von TListBox kann man - u. a. - Einträge vom Typ TListBoxItem einfügen und sich diese in der Listbox anzeigen lassen (zumindest unter XE4, wahrscheinlich auch unter XE5); was sollte daran nicht funktionieren?

Zitat:

Und wenn ich den TextAlign für ein Item umstelle, wird das doch noch lange nicht auch für die folgenden Items übernommen!?!
Ja, das stimmt schon. Aber: Was man mit einem Item machen kann, geht auch mit zwei, drei, ..., vielen oder gar mit allen.
Wenn ich obige Aussage richtig interpretiere, dann schein es so zu sein, dass Du zumindest einen Listeneintrag zentriert hinbekommst; oder liege ich da falsch?

Zitat:

[...] Hat noch jemand eine Idee?
Vielleicht beschreibst Du mal Dein Problem genauer, also: das sollte am Ende bei rauskommen, dieses und jenes habe ich bereits versucht (siehe Sourcecode), leider sieht es noch nicht so aus wie ich möchte (siehe Screenshot), hat jemand eine Idee, die mir weiterhelfen könnte?

Gruß


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