Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - (Sender: TObject) für eigene Prozedur


theevilworm - Mo 16.05.11 10:45
Titel: (Sender: TObject) für eigene Prozedur
Hallo,

mein Programm soll ein Memory Spiel sein. Dazu habe ich viele Images auf der Form. Bei einem Klick auf dieses Image soll eine Prozedur ausgeführt werden, die genau in das Image, von dem sie aufgerufen wurde, ein Bild lädt.
Vorher hatte ich das gelöst, in dem ich eine Funktion

Delphi-Quelltext
1:
aufdecken(nr)                    

hatte. Diese wurde so aufgerufen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Image1Click;
begin
aufdecken(1)
end;

procedure TForm1.Image2Click;
begin
aufdecken(2)
end;


usw. Jedes Image hatte also eine sehr ähnliche Prozedur. Dies wollte ich ein wenig eleganter machen, indem aufdecken() prüft, von welchem Image sie aufgerufen wurde.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TForm1.aufdecken(Sender: TObject);
var i,nr:integer;
    mysender:string;
begin

mysender:=string(sender);
nr:=strtoint(mysender[length(mysender)]);


clickcounter:=clickcounter+1;
label1.Caption:='Klicks: ' +inttostr(clickcounter);
TImage(findcomponent('Image'+inttostr(nr))).Picture.LoadFromFile(karte[nr].pfad);
TImage(findcomponent('Image'+inttostr(nr))).enabled:=false;
if (clickcounter mod 2)=0 then
begin
  if not(karte[nr].pfad=lastclicked.pfad) then
  begin
  delay(1500);
  karte[nr].bild.picture.loadfromfile(rueck);
  lastclicked.bild.picture.LoadFromFile(rueck);
  end;
end
else
begin
lastclicked:=karte[nr];
end;
end;


Ich wollte also mit Sender arbeiten. Ich brauche allerdings nur die Nummer des Senders, wenn also die Prozedur von Image6 aufgerufen wurd, soll einfach die Nummer 6 benutzt werden. Daher wandle ich den Sender in einen String um.

Das Problem: Die Übergabe des Komponentennamens als Sender funktioniert nicht. Wenn ich diesen Ausdruck überwache, wird für Sender nur "" angezeigt. Wenn ich daher auf ein Image klicke, bricht das Programm mit der Fehlermeldung
Zitat:

"-" ist kein gültiger Integerwert.
ab. Keine Ahnung, woher der Bindestrich kommt.

Ich bin davon ausgegangen, dass die Übergabe des Senders automatisch klappt, weil das in jeder von Delphi erstellen Prozedur wie Button1.Click (Sender: TObject) auch automatisch funktioniert.
Was mache ich falsch?


jaenicke - Mo 16.05.11 11:14

user profile icontheevilworm hat folgendes geschrieben Zum zitierten Posting springen:
Ich bin davon ausgegangen, dass die Übergabe des Senders automatisch klappt, weil das in jeder von Delphi erstellen Prozedur wie Button1.Click (Sender: TObject) auch automatisch funktioniert.
Was mache ich falsch?
Du versuchst ein Objekt auf String zu casten. Wie soll das gehen?
Das ist ungefähr so als ob du einen Apfel nimmst, "Kirsche" draufschreibst, durch die Obstpresse schickst und dich wunderst, dass kein Kirschsaft herauskommt...

Den Cast kannst du dir sparen, denn du hast dort ja schon das Bild:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.aufdecken(Sender: TObject);
begin
  if Sender is TImage then
  begin
    TImage(Sender).Picture.LoadFromFile(...);
    TImage(Sender).Enabled := false;
...


Narses - Mo 16.05.11 12:52

Moin!

Wir haben auch ein Memory-Tutorial in der Library [http://www.delphi-library.de/topic_VCL+Memory+Tutorial++fuer+EinUmsteiger_44084.html], da wird auch dieses Problem behandelt. :idea: :les: :think:

cu
Narses


theevilworm - Di 17.05.11 09:29

Zitat:

Du versuchst ein Objekt auf String zu casten.


Ja, das weiß ich. Dazu habe ich gesucht und in einem Thread im Delphi-Treff die selbe Frage gefunden. Da wurde String(Object) als Cast vorgeschlagen und ich habe es auch so benutzt. Ich muss ja irgendwie den Objektnamen zu einem String machen, um per Index auf die Nummer zugreifen zu können.

Ich kann natürlich die findcomponent() aufrufe sparen, indem ich sie gleich durch das übergeben Objekt ersetze. Aber wie soll ich dann die Arrays ansprechen?


Delphi-Quelltext
1:
karte[nr]                    


Ich weiß nicht, ob das Problem im Casten des Objektes zu einem String besteht. Wenn ich den Ausdruck "sender" überwache und die Funktion aufdecken() aufgerufen wird, wird für Sender nur () übergeben anstatt ein richtiger Name.


jaenicke - Di 17.05.11 11:27

Der Name der Komponente ist:

Delphi-Quelltext
1:
(Sender as TImage).Name                    
Du kannst die Eigenschaft Tag zur Nummerierung verwenden und auf Tag statt Name zugreifen.


Delete - Di 17.05.11 11:38

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du versuchst ein Objekt auf String zu casten. Wie soll das gehen?
Das ist ungefähr so als ob du einen Apfel nimmst, "Kirsche" draufschreibst, durch die Obstpresse schickst und dich wunderst, dass kein Kirschsaft herauskommt...

Hast du noch ein paar von den Pillen für mich übrig?`:mrgreen:


jaenicke - Di 17.05.11 11:44

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Hast du noch ein paar von den Pillen für mich übrig?`:mrgreen:
Nee, die habe ich dafür alle verbraucht. :mrgreen:


Delete - Di 17.05.11 11:47

http://www.michael-puff.de/Dateien/Signaturen.shtml (Letzter Eintrag) ;)