Autor Beitrag
DMDADKT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Fr 09.01.09 03:34 
Hachja, ich nochmal..

Ich habe eine prozedur OnMouseDown. diese bringt einen sender(tobject) mit sich, den ich gerne auf diese 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!

_________________
"Sicher spinne ich, was aber nicht heißt, dass ich mich irre. Ich bin verrückt, nicht krank" -Robert Anton Wilson


Zuletzt bearbeitet von DMDADKT am Fr 09.01.09 19:27, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 09.01.09 04:11 
ausblenden Delphi-Quelltext
1:
2:
if Sender is TImage then
  TImage(Sender).Picture...
;-)
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Fr 09.01.09 08:54 
Oder die Softcast-Vaiante:
(Sender as TImage).Picture ...

_________________
Markus Kinzler.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



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

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
if Sender is TImage then					

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

_________________
PROGRAMMER: A device for converting coffee into software.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

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


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.
ausblenden 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)