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
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
theevilworm hat folgendes geschrieben : |
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; ... |
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?
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
jaenicke hat folgendes geschrieben : |
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
Luckie hat folgendes geschrieben : |
Hast du noch ein paar von den Pillen für mich übrig?`:mrgreen: |
Nee, die habe ich dafür alle verbraucht. :mrgreen:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!