Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Typecast Error by Sender As TWhatever (https://www.delphipraxis.net/119931-typecast-error-sender-twhatever.html)

FrankBKK 3. Sep 2008 11:35


Typecast Error by Sender As TWhatever
 
Hilfe, ich sitz' heut etwas auf der Leitung -

wie kann ich sowas realisieren ohne einen Typecast Error zu kriegen:

Delphi-Quellcode:
if ((Sender as TBitBtn).Name = 'bbPrint') or (Sender as TMenuItem).Name = 'miPrint')) then
begin
   ...
end ;

mkinzler 3. Sep 2008 11:38

Re: Typecast Error by Sender As TWhatever
 
Der Sender muss auch von diesem Typ sein! Du könntest einen harten Cast machen, dann könnte es aber sein, dass es richtig knallt!

FrankBKK 3. Sep 2008 11:46

Re: Typecast Error by Sender As TWhatever
 
Zitat:

Zitat von mkinzler
Der Sender muss auch von diesem Typ sein! Du könntest einen harten Cast machen, dann könnte es aber sein, dass es richtig knallt!

Ja, das weiss ich - deshalb wuerd ich gern wissen wie man das eleganter loesen kann ...

mirage228 3. Sep 2008 11:49

Re: Typecast Error by Sender As TWhatever
 
Die könntest das "Name"-Feld auch mittels RTTI abfragen (Delphi-Referenz durchsuchenIsPublishedProp und Delphi-Referenz durchsuchenGetStrProp - Unit Delphi-Referenz durchsuchenTypInfo) :)

mfG
mirage228

mkinzler 3. Sep 2008 11:49

Re: Typecast Error by Sender As TWhatever
 
Delphi-Quellcode:
if Sender is <Typ> then ...

sirius 3. Sep 2008 11:58

Re: Typecast Error by Sender As TWhatever
 
Name ist doch von TComponent abgeleitet.
Also:
Delphi-Quellcode:
var tmp:string;
begin
  tmp:=(Sender as TComponent).Name;
  if ((sender is TBitBtn) and (tmp='xyz1'))or
     ((sender is TBitBtn) and (tmp='xyz2'))or
     ...
  then

mirage228 3. Sep 2008 15:33

Re: Typecast Error by Sender As TWhatever
 
Zitat:

Zitat von sirius
Name ist doch von TComponent abgeleitet.
Also:
Delphi-Quellcode:
var tmp:string;
begin
  tmp:=(Sender as TComponent).Name;
  if ((sender is TBitBtn) and (tmp='xyz1'))or
     ((sender is TBitBtn) and (tmp='xyz2'))or
     ...
  then

Stimmt, so gehts auch. Wenn die Methode auch von nicht-TComponent-Ableitungen aufgerufen wird, müsste man da allerdings noch eine zusätzliche Prüfung einbauen.
Ahja, wenn er sich nur für den Namen interessiert, kann man die Abfrage ob das Objekt ein TBitBtn ist auch weglassen :)

sirius 3. Sep 2008 15:35

Re: Typecast Error by Sender As TWhatever
 
Zitat:

Zitat von mirage228
Wobei man, wenn er sich nur für den Namen interessiert, die Abfrage ob das Objekt ein TBitBtn ist auch weglassen kann.

Er überprüft ja auf unterschiedliche Namen (je nach Klasse) :zwinker:

mirage228 3. Sep 2008 15:37

Re: Typecast Error by Sender As TWhatever
 
Zitat:

Zitat von sirius
Zitat:

Zitat von mirage228
Wobei man, wenn er sich nur für den Namen interessiert, die Abfrage ob das Objekt ein TBitBtn ist auch weglassen kann.

Er überprüft ja auf unterschiedliche Namen (je nach Klasse) :zwinker:

Ja gut, aber wenn er die Methode wirklich nur von zwei Komponenten aus abrufbar machen will kann er gleich gegen die Komponenten-Variable testen.
Delphi-Quellcode:
if (Sender = miPrint) or (Sender = btnWhatEver) then ...

mkinzler 3. Sep 2008 15:41

Re: Typecast Error by Sender As TWhatever
 
Es ist aber besser den Typ und nicht den Namen der Variablen abzufragen


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz