Koordinaten übernehmen
-
- 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
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?
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?
-
- 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
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);
-
- 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
Dankeschön! Du hilfst mir hier echt gut weiter.
-
- 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
Bitte erlaube kleine Korrekturen:compmgmt hat geschrieben:mit dem Parameter SenderCode: 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
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;
-
- 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
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.

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);
-
- 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
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 hat geschrieben:Ich finde es sauberer auch wenn es sinnlos ist![]()
-
- 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
Da hast du schon recht. So hat es mir damals allerdings mein Vater (Diplom-Informatiker) beigebracht. Auch studierte Leute sind eben nicht perfektmse 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.

Code: Alles auswählen
InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
-
- 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
Wenn das Click-Ereignis von einem TButton stammen muss und alles andere ein Programmfehler ist bietet sich
an.
Wenn man sicher ist, dass keine Programmierfehler vorliegen, lässt sich der Code nochmals vereinfachen:
Wobei die Verwendung von "with" vielfach verpönt ist.

Code: Alles auswählen
procedure TForm1.ButtonClick(Sender: TObject);
begin
with Sender as TButton do begin
ShowMessage(IntToStr(Left));
end;
end;
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;
