Spalten und zeilen zur laufzeit
Hi leuts,
ich möchte eine Fläche mit Buttons füllen. Dazu habe ich ein TStrings. Mit count erhalte ich die anzahl x der einträge. jetzt sollen x buttons erstellt werden. aber nicht mehr als 5 untereinander, ab dem 5. eine neue spalte und wieder 5. Da die anzahl im TString variiert kann ich die Zahlen nicht festlegen. wie muss das aussehen? greetz Privateer3000 |
Re: Spalten und zeilen zur laufzeit
mit DIV kannst du dir die nötigen Zeilen ausrechen, ansonsten gibt's noch MOD.
Delphi-Quellcode:
(Letzeres ist vorallem gut, wenn man mit veränderlichen Spalten arbeiten will)
nötigeZeilen := (Strings.Count + 4) div 5;
//oder nötigeZeilen := (Strings.Count - 1) div 5 + 1;
Delphi-Quellcode:
Button.Left := (Strings.Count mod 5) * AbstandX + OffsetX;
Button.Top := (Strings.Count div 5) * AbstandY + OffsetY; |
Re: Spalten und zeilen zur laufzeit
Mit DIV und MOD kannst du die Position im Raster berechnen.
[Edit: Zu langsam] |
Re: Spalten und zeilen zur laufzeit
ich raffs nich...
Delphi-Quellcode:
wiev ist der strings.count
for ii:=0 to wiev -1 do
begin kk:=stlist.Strings[ii]; AButton:=TButton.Create(Self); AButton.Parent:=Form2; AButton.Width:=100; AButton.Height:=40; Abutton.Top:=(AButton.Height*ii)+ii; AButton.Left:=btleft; AButton.Caption:=kk; AButton.Tag:=ii; end; |
Re: Spalten und zeilen zur laufzeit
das verstehe ich nicht:
Delphi-Quellcode:
wo soll das untergebracht werden?
nötigeZeilen := (Strings.Count + 4) div 5;
//oder nötigeZeilen := (Strings.Count - 1) div 5 + 1; Danke leuts |
Re: Spalten und zeilen zur laufzeit
Schau mal her:
Delphi-Quellcode:
Grüße vom marabu
procedure CreateButtonField(s: TStrings; wcParent: TWinControl; maxRows: Integer;
onClick: TNotifyEvent); const BTN_WIDTH = 100; BTN_HEIGHT = 40; TOP_MARGIN = 10; LEFT_MARGIN = 10; VERT_SPACE = 10; HORZ_SPACE = 10; var i, iCol, iRow: Integer; btn: TButton; begin for i := 0 to Pred(s.Count) do begin iCol := i div maxRows; iRow := i mod maxRows; btn := TButton.Create(wcParent.Owner); btn.Caption := s[i]; btn.Width := BTN_WIDTH; btn.Height := BTN_HEIGHT; btn.Parent := wcParent; btn.Top := TOP_MARGIN + (BTN_HEIGHT + VERT_SPACE) * iRow; btn.Left := LEFT_MARGIN + (BTN_WIDTH + HORZ_SPACE) * iCol; btn.OnClick := onClick; s.Objects[i] := btn; end; end; procedure TMainForm.InitButtonClick(Sender: TObject); var i: Integer; begin with ListBox do begin for i := 0 to Pred(Items.Count) do TButton(Items.Objects[i]).Free; Clear; for i := 0 to 20 + Random(5) do ListBox.Items.Add(IntToStr(i)); end; CreateButtonField(ListBox.Items, Panel, 5, DemoButtonClick); end; procedure TMainForm.DemoButtonClick(Sender: TObject); begin with Sender as TButton do ShowMessage(Caption); end; |
Re: Spalten und zeilen zur laufzeit
Danke!
es setzt jetzt richtig! @marabu in deinem quelltext wird auch das onclick ereignis ausgewertet. Kann man auch den die button.caption senden um diese weiter zu verarbeiten. Aber ich weiß schon...neues Thema -> neuer Thread danke nochmal an alle |
Re: Spalten und zeilen zur laufzeit
Ich zeige die Caption im Ereignis onClick() mit ShowMessage() an, aber du kannst damit machen was du willst. Übrigens habe ich die Caption des Button aus einer StringList geholt und den Button in deren Objects-Liste eingetragen - für den Fall der Fälle ...
marabu |
Re: Spalten und zeilen zur laufzeit
Danke für die Hilfe
Ja, die caption habe ich auch benutzt, funktioniert das auch wenn in den Captions Leerzeichen sind? |
Re: Spalten und zeilen zur laufzeit
Zitat:
Aber warum probierst Du das nicht erst selbst aus, bevor Du die Allgemeinheit fragst? (Selber machen ist beim Lernen äußerst wichtig!) Jürgen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz