Discussion:
Columns der TListbox/TCombobox füllen ?
(zu alt für eine Antwort)
Stefan Klecha
vor 20 Jahren
Permalink
Hallo zusammen, ich verzweifele an dem Problem meine Listbox zu füllen:

Mit der Eigenschaft Columns kann ich wohl sagen wieviele Spalten ich haben
möchte.
Über .items.add() oder .additem() kann ich aber nur in die erste Spalte der
Listbox schreiben.
Ich will aber in einer FOR-Schleife die einzelnen Spalten füllen.

Ich möchte beispielsweise meine Listbox mit so etwas füllen:
ID Vorname Nachname

Hat jemand das schon mal gemacht ?

Ich möchte möglichst auch keine anderen Komponenten einsetzen. (die LMD
Listbox kann das wohl...)


Vielen Dank im Voraus für die Antworten,
Stefan
Achim Kalwa
vor 20 Jahren
Permalink
Hallo,
Post by Stefan Klecha
Mit der Eigenschaft Columns kann ich wohl sagen wieviele Spalten ich haben
möchte.
Über .items.add() oder .additem() kann ich aber nur in die erste Spalte der
Listbox schreiben.
Korrekt. Die Eigenschaft Columns sorgt nur dafür, dass Einträge die
"unten" aus der Listbox herauslaufen würden, in weiteren Spalten
angezeigt werden. Schau' Dir nochmal den Text in der Hilfe an.
Post by Stefan Klecha
ID Vorname Nachname
Du brauchst einen TListView (Palettenseite Win32). Setze ViewStyle auf
vsReport und lege in der Eigenschaft "Columns" drei Spalten an. Schreibe
die Daten wie folgt in den ListView:

var
aItem : TListItem;
ID : Integer;

for ID := 1 to 9 do begin
aItem := ListView1.Items.Add;
aItem.Caption := IntToStr(ID); // erste Spalte
aItem.SubItems.Add('Vorname'); // zweite Spalte
aItem.SubItems.Add('Nachname'); // dritte Spalte
end;


HTH
Achim
Frank Steinmetzger
vor 20 Jahren
Permalink
Post by Stefan Klecha
Mit der Eigenschaft Columns kann ich wohl sagen wieviele Spalten ich haben
möchte.
Über .items.add() oder .additem() kann ich aber nur in die erste Spalte der
Listbox schreiben.
Ich will aber in einer FOR-Schleife die einzelnen Spalten füllen.
ID Vorname Nachname
Hat jemand das schon mal gemacht ?
Ich möchte möglichst auch keine anderen Komponenten einsetzen. (die LMD
Listbox kann das wohl...)
Vielen Dank im Voraus für die Antworten,
Stefan
Die Columns-Eigenschaft hat was damit zu tun, in wieviel Spalten die
Einträge angezeigt werden. In dem Modus wird dann horizontal
gescrollt. Wenn Du Einträge mit mehreren Spalten haben willst, müßte
es schon ein ListView sein.
--
Gruß | Greetings | Qapla'
"All I ask is a tall ship and a star to steer her by."
http://www.stud.tu-ilmenau.de/~frst-ii/
Holger Schieferdecker
vor 20 Jahren
Permalink
Stefan Klecha says...
Post by Stefan Klecha
Mit der Eigenschaft Columns kann ich wohl sagen wieviele Spalten ich haben
möchte.
Über .items.add() oder .additem() kann ich aber nur in die erste Spalte der
Listbox schreiben.
Ich will aber in einer FOR-Schleife die einzelnen Spalten füllen.
ID Vorname Nachname
Hat jemand das schon mal gemacht ?
Ich möchte möglichst auch keine anderen Komponenten einsetzen. (die LMD
Listbox kann das wohl...)
Nein, das habe ich noch nicht gemacht, trotzdem, das klingt so, als wäre
ein TListView mit ViewStyle:=vsReport geeignet.

Gruß
Holger
--
Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand
ginge, um zu sehen, wohin wir kämen, wenn wir gingen...
Michael Winter
vor 20 Jahren
Permalink
Post by Stefan Klecha
Mit der Eigenschaft Columns kann ich wohl sagen wieviele Spalten ich haben
möchte.
Über .items.add() oder .additem() kann ich aber nur in die erste Spalte der
Listbox schreiben.
Ich will aber in einer FOR-Schleife die einzelnen Spalten füllen.
ID Vorname Nachname
Hat jemand das schon mal gemacht ?
Ich möchte möglichst auch keine anderen Komponenten einsetzen. (die LMD
Listbox kann das wohl...)
Wie du bereits weißt, hat Columns für eine ListBox eine andere als die von
dir gewünschte Bedeutung. Du kannst statt dessen beispielsweise ein
ListView einsetzen.

Allerdings kann auch eine ListBox mit Tab getrennte Texte darstellen, wenn
ihr Style entsprechend eingestellt ist:

TListBox = class(StdCtrls.TListBox)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;

procedure TListBox.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or LBS_USETABSTOPS;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
ListBox1.Items.Add('ID'#9'Vorname'#9'Nachname');
end;

Eine weitere Alternative ist es, die einzelnen Zeilen selber zu zeichnen.
Dafür ist das Ereignis OnDrawItem zuständig.

-Michael
Joe Galinke
vor 20 Jahren
Permalink
Hallo Michael,
Post by Michael Winter
TListBox = class(StdCtrls.TListBox)
protected
procedure CreateParams(var Params: TCreateParams); override;
^^^^^^^^^^^^ ^^^^^^^^
Daran hätte ich jetzt nicht gedacht.
Post by Michael Winter
procedure TForm1.Button7Click(Sender: TObject);
begin
ListBox1.Items.Add('ID'#9'Vorname'#9'Nachname');
Jetzt sollte ich mir doch einmal anschauen, wie dort die Tabulatoren
gesetzt werden (wie ergeben sich die Spaltenbreiten?).

Bisher habe ich solche Anforderungen mit OnDrawIten erschlagen.

Gruß, Joe
--
Michael Winter
vor 20 Jahren
Permalink
Post by Joe Galinke
Jetzt sollte ich mir doch einmal anschauen, wie dort die Tabulatoren
gesetzt werden (wie ergeben sich die Spaltenbreiten?).
Da gibt das SDK recht bereitwillig Auskunft:

"The default tab positions are 32 dialog box units. A dialog box unit is a
horizontal or vertical distance. One horizontal dialog box unit is equal to
0.25 of the current dialog box base-width unit. Windows calculates these
units based on the height and width of the current system font. The
GetDialogBaseUnits function returns the current dialog box base units in
pixels."
Post by Joe Galinke
Bisher habe ich solche Anforderungen mit OnDrawIten erschlagen.
Ist auch besser so.

-Michael
Joe Galinke
vor 20 Jahren
Permalink
Hallo Michael,
Post by Michael Winter
Post by Joe Galinke
Jetzt sollte ich mir doch einmal anschauen, wie dort die Tabulatoren
gesetzt werden (wie ergeben sich die Spaltenbreiten?).
[...Erklärung gesnippt...]

Danke, aber jetzt hast Du meine Bequemlichkeit unterstützt. :-)
Post by Michael Winter
Post by Joe Galinke
Bisher habe ich solche Anforderungen mit OnDrawIten erschlagen.
Ist auch besser so.
Das empfinde ich auch so.

Gruß, Joe

Loading...