Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - [FEHLER] Undefeinierter Bezeichner: 'FindComponent' (?)


Helmut - Mo 25.11.02 21:16
Titel: [FEHLER] Undefeinierter Bezeichner: 'FindComponent' (?)
Hi,

da ich ein Programmteil ziemlich oft brauche habe ich ihn als prozedur geschrieben:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure deselect; //deselektiert alle würfel
var i: integer;
begin
 for i:=1 to 6 do
 if (wuerfel[i].selected) then
 wuerfel[i].selected:=false;
 TImage(FindComponent('wuerfel'+IntToStr(i))).Picture.LoadFromFile(IntToStr(wuerfel[i].zahl)+'.bmp');
end;


Allerdings bringt Delphi beim compilieren immer die oben genannte Fehlermeldung.
In dem normalen programm funktioniert der programmtext, nurnicht in einer extra prozedur.
Gibt es eine andere Möglichkeit den namen "wuerfel" mit der laufvariablen [i] zu kombinieren?

Hinweiss: nicht das es zu irreführungen kommt, das arrayr wuerfel[i] hat nix mit den images wuerfel1 bis wuerfel6 zu tun. Der programmtext funzt auf jeden fall.

Hoffntlich hat jemand dafür ne Lösung. Konnte bisher nichts wieter finden und in der delphi-hilfe ist findcomponent nichtmal aufgeführt.

mfg
Helmut


Delete - Mo 25.11.02 21:27

"FindComponent" ist eine Form-bezogene Funktion:

Quelltext
1:
Form1.FindComponent ...                    

Du solltest also den Namen der Form voranstellen (damit wäre allerdings der Vorteil bezüglich Wiederverwendbarkeit dahin), oder du übergibst der Funktion eine Referenz auf die Form.

Und doch: es steht in der Hilfe. :)


Helmut - Mo 25.11.02 21:55

ok, so klappt es! Ich brauchte die prozedur eh nur in form1.

Aber ich versteh immernochnicht warum er bei der einen prozedur self.Findcomponent gemacht hat (is ja das selbe wie form1.findcomponent) und bei der die ich selber geschrieben hab (die nicht durch ein ereignis aufgerufen wird), nicht.
Vielleicht setzt er das self nur imemr dann hin wenn das ereignis von einem objekt aufgerufen wurde (das in einem formular liegt)...
würd ich mal so schätzen :)

Danke für die Hilfe!

mfg
Helmut


Anonymous - Mo 25.11.02 22:13

Nein.

Wenn du das stehen hast:


Quelltext
1:
procedure [b]TForm1[/b].Button1Click(Sender: TObject);                    


Dann weiss Self was es ist. Eben Form1. Das Self kannst du dir auch sparen. Bei


Quelltext
1:
Label1.Caption := ...                    


Setzt der Compiler beim Kompilieren das Self selbst vor.

Wenn aber nur das steht:


Quelltext
1:
procedure Button;                    


dann weiss Self nicht was es ist.

du kannst aber auch so machen:


Quelltext
1:
2:
3:
4:
5:
6:
procedure Button;
begin 
  with Form1 do begin
  ...
  end;
end;


Dann brauchst du dazwischen kein Form1 davorzustellen.[/code]


Helmut - Mo 25.11.02 22:32

ahhh
Danke für die Erklärung! :oops:
Jetzt ist mir alles klar :roll: :beer:

thx!

Helmut