Entwickler-Ecke

Multimedia / Grafik - TObject zu TImage


DMDADKT - Fr 09.01.09 03:34
Titel: TObject zu TImage
Hachja, ich nochmal..

Ich habe eine prozedur OnMouseDown. diese bringt einen sender(tobject) mit sich, den ich gerne auf diese [http://www.delphi-forum.de/topic_Nur+belegten+Bildbereich+klickbar+machen_89269.html] weise weiterverwenden würde. aber: das geht nur mit TImage, jedoch nicht mit TObject.

Wie kann ich dem Programm beibringen, dass es wirklich ein TImage ist, was ich ihm da gebe? oder anders: wie kann ich das ganze konvertieren?


danke schonmal! sphenox


E: so simpel mal wieder (: danke!


jaenicke - Fr 09.01.09 04:11


Delphi-Quelltext
1:
2:
if Sender is TImage then
  TImage(Sender).Picture...
;-)


mkinzler - Fr 09.01.09 08:54

Oder die Softcast-Vaiante:
(Sender as TImage).Picture ...


JayEff - Fr 09.01.09 10:09

user profile iconmkinzler hat folgendes geschrieben Zum zitierten Posting springen:
Oder die Softcast-Vaiante:
(Sender as TImage).Picture ...
...Die ich immer nutze. Was mich mal interessieren würde: Was ist der unterschied?

Edit: "neue frage neues topic"? :mrgreen:


Nersgatt - Fr 09.01.09 10:17

user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconmkinzler hat folgendes geschrieben Zum zitierten Posting springen:
Oder die Softcast-Vaiante:
(Sender as TImage).Picture ...
...Die ich immer nutze. Was mich mal interessieren würde: Was ist der unterschied?

Bei der Softcastmethode bekommst Du eine Exception, falls Sender wider erwarten doch kein TImage ist. Bei der anderen Methode Gnade Dir Gott... ;-)

Gruß,
Jens


Bernhard Geyer - Fr 09.01.09 10:25

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Bei der Softcastmethode bekommst Du eine Exception, falls Sender wider erwarten doch kein TImage ist. Bei der anderen Methode Gnade Dir Gott... ;-)

Beim gestorbenen Delphi.NET auch bei Verwendung der Syntax eines harten Castes ein Softcast durchgeführt worden.


Xentar - Fr 09.01.09 11:06

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconmkinzler hat folgendes geschrieben Zum zitierten Posting springen:
Oder die Softcast-Vaiante:
(Sender as TImage).Picture ...
...Die ich immer nutze. Was mich mal interessieren würde: Was ist der unterschied?

Bei der Softcastmethode bekommst Du eine Exception, falls Sender wider erwarten doch kein TImage ist. Bei der anderen Methode Gnade Dir Gott... ;-)

Gruß,
Jens


Dafür ist doch die Abfrage vorher

Delphi-Quelltext
1:
if Sender is TImage then                    

also wäre doch der einzige Unterschied, dass man weniger schreiben muss.


JayEff - Fr 09.01.09 11:47

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Bei der Softcastmethode bekommst Du eine Exception, falls Sender wider erwarten doch kein TImage ist. Bei der anderen Methode Gnade Dir Gott... ;-)

Ich halte es für ausserordentlich interessant, ein Objekt einfach mal als String zu interpretieren: Label1.Caption := String(Button1); :mrgreen: Ich vermute aber, dass der da EOTs drin hat und man nich viel sieht :(


jaenicke - Fr 09.01.09 14:36

Um das einmal nochmal zusammenzufassen: ;-)
Man kann sich auch darauf verlassen, dass in Sender nur die richtige Komponente übergeben wird. Wenn man die Prozedur nicht falsch zuweist oder selbst mit einem falschen Parameter aufruft, dann wird das auch immer funktionieren und man kann einen harten Cast machen.

Delphi-Quelltext
1:
TImage(Sender).                    
Wenn dann aber doch eine falsche Komponente drin ist, dann bekommt man eine allgemeine Zugriffsverletzung, die man nicht so einfach zuordnen kann.

Deshalb sollte man dafür sorgen, dass eine EInvalidTypecast Exception ausgelöst wird, an der man dann zumindest sehen kann was das Problem ist. Dafür kann man dann einen weichen Cast durchführen.

Delphi-Quelltext
1:
(Sender as TImage).                    
Dann kommt bei einem falschen Cast eine entsprechende Exception.

Noch besser ist natürlich gleich einen falschen Cast gar nicht erst zu versuchen und vorher abzufragen, ob der Cast erfolgreich sein wird.

Delphi-Quelltext
1:
2:
if Sender is TImage then
  TImage(Sender).
So habe ich es ja auch oben gemacht. Nach der Abfrage kann man natürlich immer einen harten Cast durchführen, da man sich dann sicher sein kann, dass es auch wirklich der passende Typ ist.

Mit dem is Operator kann man auch mehreren Komponententypen den selben Handler zuweisen.

Delphi-Quelltext
1:
2:
3:
4:
if Sender is TLabel then
  ShowMessage(TLabel(Sender).Caption)
else if Sender is TEdit then
  ShowMessage(TLabel(Sender).Text);


Ich hoffe ich habe damit alle Klarheiten restlos beseitigt. :mrgreen: ;-)


Nersgatt - Fr 09.01.09 14:45

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wenn dann aber doch eine falsche Komponente drin ist, dann bekommt man eine allgemeine Zugriffsverletzung, die man nicht so einfach zuordnen kann.

Wobei die allgemeiner Zugriffsverletzung nicht unbedingt erscheint.

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm2.Button1Click(Sender: TObject);
begin
  showmessage(TEdit(sender).Text);
end;

Gibt bei mir die Caption von dem Button zurück. Daher ist es so gefährlich. Man denkt, es funktioniert, aber beim Kunden knallt es dann und man hat keine Ahnung, woran es liegt. Daher muss man sich bei harten Casts 110% sicher sein, was man macht.