Koordinaten übernehmen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Minits
Beiträge: 30
Registriert: So 30. Okt 2016, 21:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Koordinaten übernehmen

Beitrag von Minits »

Hallo zusammen,

ich habe folgendes Problem mit Lazarus. Ich habe 100 Buttons und möchte nicht die gleiche Prozedur in jeden reinschreiben und benutze deshalb sozusagen Pointer, indem ich z.B. Button2 die Aktion von Button 1 auführen lasse.
Nun möchte ich, dass ein Panel erzeugt wird, wenn man auf den Button klickt. Doch ich weiß nicht, wie ich height und left für jeden Button übergeben kann, ohne für jeden der 100 Buttons eine Prozedur zu erstellen, in der ich ja lediglich die Koordinaten als Variablen speichern würde. Hat jemand von euch eine Idee?

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Koordinaten übernehmen

Beitrag von compmgmt »

mit dem Parameter Sender

Code: Alles auswählen

procedure TForm1.ButtonClick(Sender: TObject);
var
  btn: TButton;
begin
  if Sender is TButton then begin // Prüfen ob Sender ein Button ist
    btn := Sender as TButton; // Button auf Variable zuweisen
    if btn <> nil then begin // Existiert der Button (Sicherheitsabfrage)
      // Ab hier kannst du mit dem Button (btn) arbeiten. z.B.:
      ShowMessage(IntToStr(btn.Left)); // gibt die Position auf der x-Achse an.
    end;
    btn := nil; // Variable freigeben
  end;
end;

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Minits
Beiträge: 30
Registriert: So 30. Okt 2016, 21:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Koordinaten übernehmen

Beitrag von Minits »

Dankeschön! Du hilfst mir hier echt gut weiter.

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: Koordinaten übernehmen

Beitrag von mse »

compmgmt hat geschrieben:mit dem Parameter Sender

Code: Alles auswählen

procedure TForm1.ButtonClick(Sender: TObject);
var
  btn: TButton;
begin
  if Sender is TButton then begin // Prüfen ob Sender ein Button ist
    btn := Sender as TButton; // Button auf Variable zuweisen
    if btn <> nil then begin // Existiert der Button (Sicherheitsabfrage)
      // Ab hier kannst du mit dem Button (btn) arbeiten. z.B.:
      ShowMessage(IntToStr(btn.Left)); // gibt die Position auf der x-Achse an.
    end;
    btn := nil; // Variable freigeben
  end;
end;

Bitte erlaube kleine Korrekturen:

Code: Alles auswählen

 
procedure TForm1.ButtonClick(Sender: TObject);
var
  btn: TButton;
begin
  if Sender is TButton then begin // Prüfen ob Sender ein Button ist
//    btn := Sender as TButton; // Button auf Variable zuweisen
 // "as" ist nicht notwendig da "if x is TButton " sicherstellt, dass Sender vom Typ TButton ist.
 // "x as TButton" wird intern als "if not (x is TButton) the raise ..." ausgeführt. Also:
    btn:= TButton(Sender);
 
//    if btn <> nil then begin // Existiert der Button (Sicherheitsabfrage)
 //nicht notwendig, da "if nil is TButton" immer "false" liefert
      // Ab hier kannst du mit dem Button (btn) arbeiten. z.B.:
    ShowMessage(IntToStr(btn.Left)); // gibt die Position auf der x-Achse an.
  end;
//   btn := nil; // Variable freigeben
 //nicht notwendig da "btn" eine lokale Variable ist welche beim Verlassen der Prozedur automatisch verschwindet.
 //Zudem wird durch Zuweisung von "nil" zu einer Klassen-Variable nichts freigegeben.
 //Dies im Gegensatz zu dynamischen Arrays wo "<dynamicarrayvar>:= nil" den Speicher des
 //dynamischen Arrays freigibt. Wobei die Freigabe von dynamischen Arrays vom Compiler
 //automatisch erledigt wird.
end;
 

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Koordinaten übernehmen

Beitrag von compmgmt »

Das Übergeben eines nil-Zeigers in einer lokalen Variable ist bedingt notwenig. Du hast Recht, hier in diesem Fall nicht, allerdings bspw. in einer For-Schleife wenn man mehrere Objekte erstellt. Ich finde es sauberer auch wenn es sinnlos ist ;)

EDIT: Ok, ist es doch nicht bei einer for-schleife. Ich erinnere mich aber deswegen mal eine exception gehabt zu haben... ist aber auch schon eine ganze Weile her.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

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: Koordinaten übernehmen

Beitrag von mse »

compmgmt hat geschrieben:Ich finde es sauberer auch wenn es sinnlos ist ;)

Sinnlose Sachen sind *nie* sauber. Beim Lesen des Codes erzeugen sie einem Nachvollzieher das Gefühl, dass er den Code nicht verstanden hat und macht zeitraubende Abklärungen notwendig.

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Koordinaten übernehmen

Beitrag von compmgmt »

mse hat geschrieben:Sinnlose Sachen sind *nie* sauber. Beim Lesen des Codes erzeugen sie einem Nachvollzieher das Gefühl, dass er den Code nicht verstanden hat und macht zeitraubende Abklärungen notwendig.

Da hast du schon recht. So hat es mir damals allerdings mein Vater (Diplom-Informatiker) beigebracht. Auch studierte Leute sind eben nicht perfekt ;)

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

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: Koordinaten übernehmen

Beitrag von mse »

Wenn das Click-Ereignis von einem TButton stammen muss und alles andere ein Programmfehler ist bietet sich

Code: Alles auswählen

 
procedure TForm1.ButtonClick(Sender: TObject);
begin
 with Sender as TButton do begin
  ShowMessage(IntToStr(Left));
 end;
end;
 

an.
Wenn man sicher ist, dass keine Programmierfehler vorliegen, lässt sich der Code nochmals vereinfachen:

Code: Alles auswählen

 
procedure TForm1.ButtonClick(Sender: TObject);
begin
 with TButton(Sender) do begin
  ShowMessage(IntToStr(Left));
 end;
end;
 

Wobei die Verwendung von "with" vielfach verpönt ist.
;-)

Antworten