Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Items in ListBox bündig ( formattiert ) anzeigen


missi1 - Sa 28.03.09 11:40
Titel: Items in ListBox bündig ( formattiert ) anzeigen
Hi ,

wie kann man in einer ListBox die Ausgabeitems strukturiert anzeigen lassen.

Gruß Missi1.


Keldorn - Sa 28.03.09 11:52

Hallo,

du kannst die Items selber im Suche in: Delphi-Forum, Delphi-Library ONDRAWITEM selbst zeichnen. Im Forum solltest Du genügend Beispiele dazu finden.
Ansonsten nochmal nachfragen und genau sagen, wie die Formatierung aussehen soll.

Gruß Frank


missi1 - Do 02.04.09 09:20

Hallo Frank ,
also in den verschieden ListBoxen sollte der Inhalt mit unterschiedlich "langen" Einträgen ähnlich einer Tabellen-Kalkulation sichbar gestaltet werden.

Viele eigene Experimente mit Stinglängen-Formaten scheiterten.

Gruß Missi1.


zuma - Do 02.04.09 10:04

ich nehme mal an, du meinst zahlenwerte, die du dort alphanumerisch darstellst ?

z.b.

Delphi-Quelltext
1:
2:
3:
4:
1 
10
100
1000


und willst diese so

Delphi-Quelltext
1:
2:
3:
4:
   1
  10
 100
1000


darstellen ?

dann könntest du die größte (= als String längste) Zahl ermitteln,
diese größe merken und allen anderen Zahlen
z.b Leerzeichen oder nullen voranstellen. mit

length(IntToStr(1000))

erfährst du die Länge einer Zahl, mit

längsteZahl - length(IntToStr(eineZahl)

ermittelst du, wie viele Zeichen dir fehlen, die brauchst du dann nur noch deinem Eintrag voranstellen.


elundril - Do 02.04.09 11:12

user profile iconzuma hat folgendes geschrieben Zum zitierten Posting springen:
ich nehme mal an, du meinst zahlenwerte, die du dort alphanumerisch darstellst ?
dann könntest du die größte (= als String längste) Zahl ermitteln,
diese größe merken und allen anderen Zahlen
z.b Leerzeichen oder nullen voranstellen. mit

length(IntToStr(1000))

erfährst du die Länge einer Zahl, mit

längsteZahl - length(IntToStr(eineZahl)

ermittelst du, wie viele Zeichen dir fehlen, die brauchst du dann nur noch deinem Eintrag voranstellen.


das geht allerdings nur bei schriftarten bei denen alle Zeichen die gleiche breite haben. ;)

wenn das nicht der Fall ist, würde ich die methode von Keldorn nochmal in betracht ziehen.


Delete - Do 02.04.09 23:20

Methode von Keldorn, also selber zeichnen und Textausgabe mit DrawText und dem Flag DT_RIGHT.


missi1 - Di 07.04.09 12:27

Hallo,

vielen Dank für die Antworten.
Auf die Methode zuma war ich auch schon mal gekommen , leider geht das nicht , da die Zahlen und Zeichen verschiedene Breiten haben ( 12,44 od. 232D4 oder ...Lösung etc).

Die Methode Keldorn verstehe ich leider nicht.Kleine Hilfe (?).

Gruß Missi1.


passiv - Di 07.04.09 12:33

naja, es gibt ja auch noch die TextOut-Methode für Canvas-Objekte (ListBox ist auch eines :D ). Und da sagt man dem den Text und die X- und Y-Koordinaten. Die Y kriegst du über das mitgelieferte Rect.Top, den X-Wert rechnest du dir aus, indem du ListBox1.Canvas.TextWidth(TextZumAusgeben) von deinem rechtesten Punkt abziehst.

Bis dann


Delete - Mi 08.04.09 12:27

user profile iconpassiv hat folgendes geschrieben Zum zitierten Posting springen:
den X-Wert rechnest du dir aus, indem du ListBox1.Canvas.TextWidth(TextZumAusgeben) von deinem rechtesten Punkt abziehst.

Und was ist daran jetzt anders als DrawText mit DT_RIGHT?


Mitmischer 1703 - Mi 08.04.09 12:42

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconzuma hat folgendes geschrieben Zum zitierten Posting springen:
ich nehme mal an, du meinst zahlenwerte, die du dort alphanumerisch darstellst ?
dann könntest du die größte (= als String längste) Zahl ermitteln,
diese größe merken und allen anderen Zahlen
z.b Leerzeichen oder nullen voranstellen. mit

length(IntToStr(1000))

erfährst du die Länge einer Zahl, mit

längsteZahl - length(IntToStr(eineZahl)

ermittelst du, wie viele Zeichen dir fehlen, die brauchst du dann nur noch deinem Eintrag voranstellen.


das geht allerdings nur bei schriftarten bei denen alle Zeichen die gleiche breite haben. ;)

wenn das nicht der Fall ist, würde ich die methode von Keldorn nochmal in betracht ziehen.


Oder als Schriftart Lucida Console nehmen! :8


passiv - Mi 08.04.09 12:56

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Und was ist daran jetzt anders als DrawText mit DT_RIGHT?

Ähmm, kA ... hab das von missi1 falsch verstanden, hab gedacht, da wäre schon das DrawText ausprobiert worden. Dabei scheints am Grundsatz zu fehlen ...

@missi1: weißt du denn, wie man die OnDrawItem-Prozedur kreiert und dann benutzt?

@Mitmischer 1703: oder Courier New :wink:


missi1 - Sa 18.04.09 17:52

Hi,

nach einigen Versuchen mit mit der OnDrawItem-Procedure


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var 
  text : string;

  begin
     ListBox1.CanVas.TextOut(20,Rect.top,Items[index]);
  end;

procedure TForm1.AReiheClick(Sender: TObject);
  var ii:integer;
begin
 for ii:=1 to 5 do
   begin
    ListBox1.items.Add(FloatToStr(y)+'...ein 1.Satz'+'...2.Satz');
    y:=y+100;
   end;
end;


kann man jetzt an eine beliebige Position das Element im ListFeld setzen,doch
ein zweites oder drittes unabhäniges Element zu positionieren ist mir nicht
gelungen.

Vielleicht hat jemand eine Lösung.

Gruß Missi1.

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


Mitmischer 1703 - Sa 18.04.09 18:10

user profile iconpassiv hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Und was ist daran jetzt anders als DrawText mit DT_RIGHT?

Ähmm, kA ... hab das von missi1 falsch verstanden, hab gedacht, da wäre schon das DrawText ausprobiert worden. Dabei scheints am Grundsatz zu fehlen ...

@missi1: weißt du denn, wie man die OnDrawItem-Prozedur kreiert und dann benutzt?

@Mitmischer 1703: oder Courier New :wink:


Stimmt :mrgreen:...


Keldorn - Sa 18.04.09 18:36

Hallo

setze bitte deinen Code in delphi-tags, das ließt sich besser.

Zitat:

ListBox1.items.Add(FloatToStr(y)+'...ein 1.Satz'+'...2.Satz');

ich dann jetzt davon aus, das Du sowas haben willst:
Zitat:

12,44 xyz abc
18,45 zxy vvcxyv
136,63 vgcx gfgdfgdf
...

Wenn ja, dann ist eine Listbox das ungeeigneste. Nimm ein Listview im viewstyle vsreport und füge per columns eigenschaft die Spalten hinzu, die kannst du auch rechts/linksbündig setzen.
Ein Bsp, wie du zur Listview Zeilen hinzufügst, findest du in der Delphi-Hilfe.

Wenn die Daten geändert werden sollen können, nimm ein stringgrid
Gruß Frank


ffgorcky - Fr 01.05.09 15:36

Zum Thema mit den Leerzeichen davor:
Kann man da in der ListBox nicht unter Font einen Schriftsatz einstellen, bei dem alle Zeichen die gleiche Länge/Breite haben?


hansa - Fr 01.05.09 20:10

Ja, das geht schon und nennt sich Proportionalschriften. Z.B. Courier. Da ginge ohne Verrenkungen auch die Listbox. Ansonsten gibts noch Stringgrid, aber da müssten alle Zellen einzeln formatiert werden.


Lannes - Fr 01.05.09 22:55

Hallo,

user profile iconhansa hat folgendes geschrieben Zum zitierten Posting springen:
Ja, das geht schon und nennt sich Proportionalschriften. Z.B. Courier. ...

da war doch mal was :gruebel:
:arrow: http://www.delphi-forum.de/viewtopic.php?p=482994#482994 kann jedem mal passieren :mrgreen:


Martok - Sa 02.05.09 15:39

Du hast hier mehrere Möglichkeiten... zum einen, wie schonmal von Keldorn gesagt, gleich ein TListView nehmen, das ist dafür gedacht.
Ansonsten findet man da auch Fertig-Komponenten, falls man das für irgendwas mit einer TListBox machen muss. Stichwort ist hier "TabListBox".
Tja, und ansonsten selber schreiben. Grundgedanke ist, dass du deinen Text aufteilst und per TextOut mit an verschiedenen X-Positionen in der Zeile ausgibst. Da kannst du dann auch noch Alignment & co implementieren.
Ist aber wie gesagt in einem Listview alles schon drin.