Button in einem anderen UP abfragen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Olaf_78
Beiträge: 3
Registriert: Sa 16. Aug 2014, 17:32

Button in einem anderen UP abfragen

Beitrag von Olaf_78 »

Hallo,

ich habe mein Formular mit vielen (26, alle Buchstaben des Alphabets) Buttons bestückt.

Nun möcht ich nicht 26 UP's schreiben sondern in einem einzigen UP alle Buttons abfragen. Also etwa " if Button1.checked then Buchstabe :='A' ... Aber dies geht so nichtel. Wer kann mir helfen ????

Dankea

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Button in einem anderen UP abfragen

Beitrag von Heinrich Wolf »

Olaf_78 hat geschrieben:Nun möcht ich nicht 26 UP's schreiben sondern in einem einzigen UP alle Buttons abfragen. Also etwa " if Button1.checked then Buchstabe :='A' ... Aber dies geht so nichtel.
Natürlich geht das! Erstelle bei einem Button die Funktion. Ich hoffe, Button1.checked tut das was Du Dir vorstellt. Einfach mal mit Buttons vertraut machen. Dann im Objektinspektor unter Komponenten die anderen Buttons aufrufen und den Namen des Ereignisses dort hinein duplizieren.

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Button in einem anderen UP abfragen

Beitrag von Soner »

So geht's:

Code: Alles auswählen

 
var i: integer;
begin
  for i:=0 ControlCount-1 do
    if Controls[i] is TButton then
      if TButton(Controls[i]).Checked then begin
        //tue etwas
      end;         
 
Für TButton kommt der Typ deines Buttons.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Button in einem anderen UP abfragen

Beitrag von mse »

Falls der Zweck die Zeicheneingabe mittels Maus ist, kann man die numerische Entsprechung der Zeichen in die "TButton.Tag" properties eintragen. Dann in alle OnClick Ereignisse eine gemeinsame Ereignisbehandlungsroutine einhängen:

Code: Alles auswählen

 
procedure TForm1.clickexe(Sender: TObject);
var
 pressedchar: string;
begin
 pressedchar:= utf8encode(unicodechar(tbutton(sender).tag));
end;
 
Oder in einem UnicodeString System:

Code: Alles auswählen

 
procedure TForm1.clickexe(Sender: TObject);
var
 pressedchar: unicodechar;
begin
 pressedchar:= unicodechar(tbutton(sender).tag);
end;
 
Die numerischen Werte sind hier:
http://www.unicode.org/charts/
z.B. mitteleuropäische Zeichen:
http://www.unicode.org/charts/PDF/U0000.pdf
http://www.unicode.org/charts/PDF/U0080.pdf

Olaf_78
Beiträge: 3
Registriert: Sa 16. Aug 2014, 17:32

Re: Button in einem anderen UP abfragen

Beitrag von Olaf_78 »

Hallo, danke für die vielen Tipps. Werde jetzt alles mal ausprobieren.

Olaf

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Button in einem anderen UP abfragen

Beitrag von Antrepolit »

Für TButtons gibt des den EventHandler OnClick. Die Lazarus IDE erzeugt bei Doppelclick auf einen Button automatisch einen Eventhandler im Form, der mit dem Button verknüpft ist. Diese Methode heitß etwa

Code: Alles auswählen

Form1Button1Click(Sender: TObject);
. Der Code, den du dabei nicht siehst, sieht wie folgt aus:

Code: Alles auswählen

Button1.OnClick := @Form1Button1Click;
Bei 26 Buttons (du hast die Umlaute und die Ligatur ß vergessen), fügst du also für jeden Button die Zeile

Code: Alles auswählen

ButtonXY.OnClick := @Form1Button1Click;
ein. Dann wird - egal, welchen Button du clickst - der EventHandler des Forms ausgeführt. Dort musst du nur noch feststellen, welcher Button den Handler aufgerufen hat. Dazu castest du das Object Sender zu einem TButton und prüfst z.B. den Namen des Buttons:

Code: Alles auswählen

if (TButton(Sender).Name = "ButtonX") then ...
Grüße, Antrepolit

care only if your os is really burning

Mathias
Beiträge: 6910
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Button in einem anderen UP abfragen

Beitrag von Mathias »

Die Button-Erzeugung kannst du auch automatisieren, der kleine Programm-Auschnitt erzeugt alle Zeichen von 32-128.
Für Umlaute können gut noch manuelle Anpassungen gemacht werden.

Code: Alles auswählen

  TForm1 = class(TForm)
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { private declarations }
    Button: array of TButton;
    const
    anzButton = 128 - 32;
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
const
  w = 32;
  h = 32;
begin
  SetLength(Button, anzButton);
  for i := 0 to anzButton - 1 do begin
    Button[i] := TButton.Create(Self);
    Button[i].Parent := Self;
    Button[i].Width := w;
    Button[i].Height := h;
    Button[i].Left := (i mod 16) * (w + 2);
    Button[i].Top := (i div 16) * (h + 2);
    Button[i].Caption := char(i + 32);
    Button[i].OnClick := @Button1Click;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := TButton(Sender).Caption;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to anzButton - 1 do begin
    Button[i].Free;
  end;
end;
 
end.  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Olaf_78
Beiträge: 3
Registriert: Sa 16. Aug 2014, 17:32

Re: Button in einem anderen UP abfragen

Beitrag von Olaf_78 »

Vielen Dank für eure vielen Hinweise. Schönen Sonntagabend! :D

Antworten