[gelöst] Objekte in Schleifen ansprechen und ändern

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

[gelöst] Objekte in Schleifen ansprechen und ändern

Beitrag von Theozh »

Hallo,
in einem Programm habe ich auf dem GUI sehr viele ToggleBoxes,
z.B. in einer 10x10 Matrix angeordnet.
Die heissen z.B. B00, B01, ... B99
Nun möchte ich einen Teil davon je nach Input 'true' oder 'false' setzen.
Wie kann ich das mit Schleifen erledigen?

Das untere Beispiel funktioniert (natürlich) nicht, aber macht vielleicht deutlich was ich erreichen möchte.
Wie kann ich den Namen eines Objektes generieren und eine Eigenschaft davon ändern?

Code: Alles auswählen

 
procedure TForm1.BC01Change(Sender: TObject);
var BName: string;
begin
  p:= BInput.checked;
  for y:= 0 to 9 do
  begin
    for x:= 0 to 9 do
    begin
      BName:= 'B' + IntToStr(y) + IntToStr(x);
      BName.checked:=p;        // hier kommt natürlich eine Fehlermeldung weil Lazarus BName nicht durch B00, ... B99 ersetzt 
    end;
  end;
end;
 
Zuletzt geändert von Theozh am Fr 21. Jun 2013, 22:48, insgesamt 1-mal geändert.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Objekte in Schleifen ansprechen und ändern

Beitrag von DonMigos »

So was ähnliches hatte ich mal gemacht, dass könntest du dann für deinen Fall anpassen:

Code: Alles auswählen

  //Komponenten in Form1 durchsuchen und ändern
  for i:=0 to Form1.ComponentCount-1 do
    begin
      if (Form1.Components[i] is TBitBtn) then
        (Form1.Components[i] as TBitBtn).Font.Color := clblack;
      if (Form1.Components[i] is TLabel) then
        (Form1.Components[i] as TLabel).Font.Color := clred;
    end;
Mfg
Zuletzt geändert von DonMigos am Sa 22. Jun 2013, 00:12, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Objekte in Schleifen ansprechen und ändern

Beitrag von wp_xyz »

Nicht getestet...

Code: Alles auswählen

 
procedure TForm1.BC01Change(Sender: TObject);
var 
  c: TComponent;
  BName: String;
  p: Boolean;
begin
  p:= BInput.checked;
  for y:= 0 to 9 do
  begin
    for x:= 0 to 9 do
    begin
      BName:= 'B' + IntToStr(y) + IntToStr(x);
      c := FindComponent(BName);
      if c is TToggleBox then
        TToggleBox(c).checked:=p;   
    end;
  end;
end;
 

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Objekte in Schleifen ansprechen und ändern

Beitrag von Theozh »

Wow, das ging ja schnell.
@DonMigos: ein interessantes Konstrukt mit 'is' und 'as', ist mir völlig neu...
@wp_xyz: es funktioniert... :-)
Danke!

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: [gelöst] Objekte in Schleifen ansprechen und ändern

Beitrag von Theozh »

wenn ich sicher weiss, dass die TToggleBoxes existieren, kann man es etwas verkürzen zu...

Code: Alles auswählen

 
  BName:= 'B'+ IntToStr(y)+IntToStr(x);
  TToggleBox(FindComponent(BName)).Checked:=BInput.Checked;
 
Zusatzfrage:
Wenn ich einen von diesen vielen Knöpfen drücke, soll eine bestimmte Aktion ausgeführt werden.
Anstatt hunderte Prozeduren B00Change, B01Change, ... B99Change
zu schreiben, kann man die Aktion in einer einzigen Prozedur "berechnen" lassen?
So à la:

Code: Alles auswählen

 
If AnyButtonPressed then GetNameOfButton;  // gibt z.B. C5 zurück
Depending on ButtonName Do Something;     // setzt z.B. alle B05, B15,B25,...B95 auf 'true'
 

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: [gelöst] Objekte in Schleifen ansprechen und ändern

Beitrag von DonMigos »

Du kannst das OnChange Ereignis auch für mehrer ToggleBoxen verwenden. Man braucht dann nicht für jede ein neues zu machen, man kann eins mehrfach zuweisen. Aber ich weis nicht genau ob es das ist was du meinst...

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: [gelöst] Objekte in Schleifen ansprechen und ändern

Beitrag von Theozh »

ja, aber wie finde ich dann den Namen des Buttons heraus, auf den ich gedrückt habe?

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: [gelöst] Objekte in Schleifen ansprechen und ändern

Beitrag von DonMigos »

So z.B.

Code: Alles auswählen

type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    C5: TToggleBox;
    ToggleBox2: TToggleBox;
    procedure C5Change(Sender: TObject);
    procedure MyToggleBoxChange(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.MyToggleBoxChange(Sender: TObject);
begin
  if TToggleBox(Sender).Name = 'C5' then
  begin
    ToggleBox2.Checked:= True;
  end;
end;  
MyToggleBoxChange muss dann unter Ereignisse jeder ToggleBox hinzugefügt werden.

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: [gelöst] Objekte in Schleifen ansprechen und ändern

Beitrag von Theozh »

DonMigos hat geschrieben: MyToggleBoxChange muss dann unter Ereignisse jeder ToggleBox hinzugefügt werden.
Dann bin ich aber eine Weile beschäftigt bei mehreren hundert Knöpfen, die Ereignisse zu definieren... Wehe, wenn ich dann was ändern muss.
Gibt es nicht eine "zentrale Instanz": es ist etwas passiert... und jetzt schaue ich genauer, was und wer es war...?

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: [gelöst] Objekte in Schleifen ansprechen und ändern

Beitrag von DonMigos »

Dann wäre das noch eine Hilfe:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
   for i:=0 to Form1.ComponentCount-1 do
    begin
      if (Form1.Components[i] is TToggleBox) then
        (Form1.Components[i] as TToggleBox).OnChange:= @MyToggleBoxChange;
    end;
end;   
Eine andere Möglichkeit fällt mir gerade nicht ein. Damit musst du es nicht von Hand jeder Box zuweisen.
Wobei es in deinem Fall vielleicht sinnvoler wäre direkt ein Array von TToggleBoxen anzulegen, dann wäre der Zugriff denke ich leichter (wobei man sich dann aber um das Erstellen und Freigeben kümmern muss und die Positionen berechnen muss, also auch nicht unbedingt weniger arbeit).

Antworten