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
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.
und willst diese so
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
zuma hat folgendes geschrieben : |
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
passiv hat folgendes geschrieben : |
| 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?
passiv - Mi 08.04.09 12:56
Luckie hat folgendes geschrieben : |
| 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
matze: Delphi-Tags hinzugefügt
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.
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!