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 Spalten und zeilen zur laufzeit (https://www.delphipraxis.net/74772-spalten-und-zeilen-zur-laufzeit.html)

Privateer3000 8. Aug 2006 14:52


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

himitsu 8. Aug 2006 14:59

Re: Spalten und zeilen zur laufzeit
 
mit DIV kannst du dir die nötigen Zeilen ausrechen, ansonsten gibt's noch MOD.

Delphi-Quellcode:
nötigeZeilen := (Strings.Count + 4) div 5;
//oder
nötigeZeilen := (Strings.Count - 1) div 5 + 1;
(Letzeres ist vorallem gut, wenn man mit veränderlichen Spalten arbeiten will)

Delphi-Quellcode:
Button.Left := (Strings.Count mod 5) * AbstandX + OffsetX;
Button.Top := (Strings.Count div 5) * AbstandY + OffsetY;

mkinzler 8. Aug 2006 15:01

Re: Spalten und zeilen zur laufzeit
 
Mit DIV und MOD kannst du die Position im Raster berechnen.

[Edit: Zu langsam]

Privateer3000 8. Aug 2006 15:17

Re: Spalten und zeilen zur laufzeit
 
ich raffs nich...

Delphi-Quellcode:
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;
wiev ist der strings.count

Privateer3000 8. Aug 2006 16:02

Re: Spalten und zeilen zur laufzeit
 
das verstehe ich nicht:
Delphi-Quellcode:
nötigeZeilen := (Strings.Count + 4) div 5;
//oder
nötigeZeilen := (Strings.Count - 1) div 5 + 1;
wo soll das untergebracht werden?

Danke leuts

marabu 8. Aug 2006 16:32

Re: Spalten und zeilen zur laufzeit
 
Schau mal her:

Delphi-Quellcode:
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;
Grüße vom marabu

Privateer3000 8. Aug 2006 16:42

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

marabu 8. Aug 2006 18:51

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

Privateer3000 9. Aug 2006 10:07

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?

Jürgen Thomas 9. Aug 2006 10:46

Re: Spalten und zeilen zur laufzeit
 
Zitat:

Zitat von Privateer3000
funktioniert das auch wenn in den Captions Leerzeichen sind?

Da bin ich mir sicher (auch wenn ich dies nicht teste): Captions sind Strings; ShowMessage übernimmt einen String; Strings dürfen Leerzeichen enthalten.

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