Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Eigene Funktion über ereigniss aufrufen (https://www.delphipraxis.net/56955-eigene-funktion-ueber-ereigniss-aufrufen.html)

Tigermoon 14. Nov 2005 09:01


Eigene Funktion über ereigniss aufrufen
 
Guten Morgen,

Nach klick auf einen Button erzeuge ich 24 Bilder
diesen Bilder möchte ich per OnClickeieigniss eine eigengeschriebene Funktion übergeben mit einem Parameter

Delphi-Quellcode:
   while zaehlen <= 24 do
   begin

      Bild[zaehlen] := TImage.Create(Memoryfeld);
      Bild[zaehlen].Parent := Memoryfeld;
      Bild[zaehlen].Picture.loadfromfile('back.jpg');
      Bild[zaehlen].Top := top;
      Bild[zaehlen].left := left;
      Bild[zaehlen].Visible := true;
      Bild[zaehlen].Cursor := crHandPoint;
      // -->> Bild[zaehlen].OnClick := aufdeckenOnClick(zaehlen);

      left := left + 120;

      if anzahl = 6
      then begin
        top := top + 100;
        left := 50;
        anzahl := 0;
      end;
     
      anzahl := anzahl + 1;
      zaehlen := zaehlen + 1;

   end;
Frage
was ist daran falsch?

als fehlermeldung erhalte ich das hier
[Fehler] Spielfeld.pas(69): Inkompatible Typen: 'TNotifyEvent' und 'procedure, untyped pointer or untyped parameter'

die Funktion ist vorhanden und deklariert...

Tigermoon

WoTo 14. Nov 2005 09:25

Re: Eigene Funktion über ereigniss aufrufen
 
Hallo,
du mußt einfach den Klammerausdruck weglassen, da du dem ONCLICK-Ereigniss nur die Adresse der FDunktion zuweisen mußt.
Also so etwa:
Bild[zaehlen].OnClick := aufdeckenOnClick;

MfG
Wolfgang

Waldteufel 14. Nov 2005 09:27

Re: Eigene Funktion über ereigniss aufrufen
 
Hi.

Genau. Ereignisse (OnClick) sind nicht gespeicherte Aufrufe von Prozeduren und Funktionen "für später", sondern Zeiger auf Methoden. Deshalb funktioniert der Code so, wie du ihn eingegeben hast nicht.

So sollte es funktionieren:

Delphi-Quellcode:
procedure TMainFrm.BilderErstellen;
begin
  while zaehlen <= 24 do
    begin
      Bild[zaehlen] := TImage.Create(Memoryfeld);
      Bild[zaehlen].Parent := Memoryfeld;
      Bild[zaehlen].Picture.loadfromfile('back.jpg');
      Bild[zaehlen].Top := top;
      Bild[zaehlen].left := left;
      Bild[zaehlen].Visible := true;
      Bild[zaehlen].Cursor := crHandPoint;
      Bild[zaehlen].OnClick := aufdeckenOnClick; // <-- ZEIGER auf die Prozedur
      Bild[zaehlen].Tag := zaehlen; // <-- Bildnummer speichern

      left := left + 120;

      if anzahl = 6 then
      begin
        top := top + 100;
        left := 50;
        anzahl := 0;
      end;
     
      anzahl := anzahl + 1;
      zaehlen := zaehlen + 1;
  end;
end;
Und so kommst du später noch an die Nummer des Bilds:
Delphi-Quellcode:
procedure TMainFrm.aufdeckenOnClick(Sender: TObject);
var
  BildNummer : integer;
begin
  BildNummer := (Sender as TImage).Tag;
  { und so weiter... }
end;
ACHTUNG: Prozeduren und Funktionen, die auf Events (OnClick, OnMouseOver, usw...) reagieren, müssen Methoden von Klassen sein!

pszopp 14. Nov 2005 09:32

Re: Eigene Funktion über ereigniss aufrufen
 
Du musst dem OnClick Event eine Methode(Prozedur) zuweisen, die als Übergabewert eine Variable vom Typ
TObject erwartet.

Sobald jemand auf das Image klickt, wird diese Methode aufgerufen.
Dabei steht in Sender eine Referenz auf das Image, auf das geklickt wurde.

schreibe also am besten so eine Methode:
Delphi-Quellcode:
PROCEDURE TForm1.OnImageClick(Sender:TObject);
BEGIN
  IF (Sender IS TImage) THEN BEGIN
//    (Sender AS TImage).
//    Hier kannst du etwas mit dem Bild machen.
  END;
END;

Eine solche Methode solltest du dann an das Image zuweisen können.
Bild[zaehlen].OnClick := OnButtonClick;

Tigermoon 14. Nov 2005 09:34

Re: Eigene Funktion über ereigniss aufrufen
 
Vielen Dank für die schnelle hilfe

versuche das mal
wenns ned geht komme ich wieder... :-)

Oxmyx 14. Nov 2005 09:48

Re: Eigene Funktion über ereigniss aufrufen
 
Zitat:

Zitat von pszopp
Du musst dem OnClick Event eine Methode(Prozedur) zuweisen, die als Übergabewert eine Variable vom Typ
TObject erwartet.

Sobald jemand auf das Image klickt, wird diese Methode aufgerufen.
Dabei steht in Sender eine Referenz auf das Image, auf das geklickt wurde.

schreibe also am besten so eine Methode:
Delphi-Quellcode:
PROCEDURE TForm1.OnImageClick(Sender:TObject);
BEGIN
  IF (Sender IS TImage) THEN BEGIN
//    (Sender AS TImage).
//    Hier kannst du etwas mit dem Bild machen.
  END;
END;

Wenn du schon weißt, dass es ein Bild ist (Sender is TImage), dann kannst du gleich direkt casten mit TImage(Sender). Die Überprüfung des as-Operators hat sich dann ja erledigt.

pszopp 14. Nov 2005 09:51

Re: Eigene Funktion über ereigniss aufrufen
 
sicher ist sicher!

Oxmyx 14. Nov 2005 18:05

Re: Eigene Funktion über ereigniss aufrufen
 
Zitat:

Zitat von pszopp
sicher ist sicher!

So ein Unsinn.

pszopp 15. Nov 2005 10:11

Re: Eigene Funktion über ereigniss aufrufen
 
In dem kleinen Beispiel mag es unsinnig sein, aber wenn ein Programm wächst,
könnte es schonmal vorkommen, dass das Event mit anderen Sender-Typen aufgerufen wird.

pszopp 15. Nov 2005 10:40

Re: Eigene Funktion über ereigniss aufrufen
 
Zitat:

Wenn du schon weißt, dass es ein Bild ist (Sender is TImage), dann kannst du gleich direkt casten mit TImage(Sender). Die Überprüfung des as-Operators hat sich dann ja erledigt.
Das habe ich anscheinend falsch verstanden:
Ich nehme an, dass folgendes Beispiel gemeint war:


Delphi-Quellcode:
IF (Sender IS TImage) THEN BEGIN
  TImage(Sender).Visible:=False;
END;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:49 Uhr.
Seite 1 von 2  1 2      

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