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
mkinzler hat folgendes geschrieben : |
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
JayEff hat folgendes geschrieben : |
mkinzler hat folgendes geschrieben : | 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
Nersgatt hat folgendes geschrieben : |
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
Nersgatt hat folgendes geschrieben : |
JayEff hat folgendes geschrieben : | mkinzler hat folgendes geschrieben : | 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
Nersgatt hat folgendes geschrieben : |
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.
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.
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
jaenicke hat folgendes geschrieben : |
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.
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!