Autor Beitrag
theevilworm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Mo 16.05.11 10:45 
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
ausblenden Delphi-Quelltext
1:
aufdecken(nr)					

hatte. Diese wurde so aufgerufen:
ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 16.05.11 12:52 
Moin!

Wir haben auch ein Memory-Tutorial in der Library, da wird auch dieses Problem behandelt. :idea: :les: :think:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
theevilworm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 17.05.11 11:27 
Der Name der Komponente ist:
ausblenden Delphi-Quelltext
1:
(Sender as TImage).Name					
Du kannst die Eigenschaft Tag zur Nummerierung verwenden und auf Tag statt Name zugreifen.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 17.05.11 11:47