![]() |
Ungültige Typenumwandlung bei TComponentNAME
Hi,
ich bastel mir gerade eine Listbox um die verschiedenen Sprachen die das Programm anwenden kann darzustellen. Dabei soll ein klick auf ein Panel das selbige markieren. Da die Panels zur Laufzeit erstellt werden weiße ich diesen ein OnClick-Event zu. Dieses sieht wie folgt aus:
Delphi-Quellcode:
Selected ist eine globale Variable vom Typ String. Egal ob ich diese Routine ausführe wenn schon was in Selected drin ist oder nicht, schmiert die procedure an den markierten Stellen ab. Es kommt eine Exception mit der Meldung: "Ungültige Typenumwandlung". Kann es sein das Sender: TObject gar nicht von selbst übergeben wird? Oder was stimmt nicht? TComponentName = String, oder?
procedure Tfrmwelcome.SelectLanguageClick(Sender: TObject);
begin if selected > '' then begin (frmwelcome.frmLanguages.FindComponent('pnl'+selected) as TPanel).Color:=clWhite; Selected:=(Sender as TPanel).Name; //Fehler (Sender as TPanel).color:=clActiveCaption; end else begin Selected:=(Sender as TPanel).Name; //Fehler (Sender as TPanel).color:=clActiveCaption; end; end; |
Re: Ungültige Typenumwandlung bei TComponentNAME
Es gibt da solche Dinge wie einen integrierten Source-Debugger mit Breakpoints in Delphi.
Setzte duch einfach mal einen Breakpoint auf die Zeile und schaue dir an was in Sender drin steht.... |
Re: Ungültige Typenumwandlung bei TComponentNAME
Zitat:
|
Re: Ungültige Typenumwandlung bei TComponentNAME
Zitat:
Rechtsklick und und "Inspect BlaBla" öffnet den Debug inspector, der dir wirklich sagt was drin ist. ed: hint vergessen :wall: |
Re: Ungültige Typenumwandlung bei TComponentNAME
Hallo onlinehome,
der Fehler dürfte in der Zeile davor auftreten. Wahrscheinlich ist die von FindComponent gelieferte Komponente kein TPanel. Gruß Hawkeye |
Re: Ungültige Typenumwandlung bei TComponentNAME
Zitat:
Zitat:
Zitat:
![]() Zitat:
1. Welche Panels werden erstellt und wie; und wie weist Du ihnen das OnClick-Ereignis zu?
Delphi-Quellcode:
2. Meinst Du '<>' (also nur ein Tippfehler)?
if selected > '' then
3. Von welcher Textstruktur soll eigentlich 'Selected' sein? Für solche Fälle empfehlen sich die ISO-Kürzel 'DE' oder 'DEU'; die Langfassung 'Deutsch' kann zwar z.B. in der Listbox angezeigt werden, sollte aber für Eingabeprüfungen nicht benutzt werden. Außerdem habe ich die dringende Empfehlung: Eine Variable soll keinen Namen bekommen, der durch Standard-Controls vorbelegt ist. Beispielsweise erhält man mit
Delphi-Quellcode:
die Angabe, ob das Element 2 ausgewählt ist.
bDESelected := ListBox1.Selected[2]
Vielleicht helfen Dir diese Hinweise. Jürgen |
Re: Ungültige Typenumwandlung bei TComponentNAME
Also erstmal möchte ich klarstellen das es sich nicht um eine richtige Listbox handelt sondern um eine Art Nachbau. Dies habe ich wie folgt realisiert:
Code:
Ich habe einen Haltepunkt bei
Panel
-frame -panel <--hier soll die onclick routine aufgerufen werden -panel <-- "
Delphi-Quellcode:
gesetzt. Sobald der Debugger diesen erreicht und die Anwendung stoppt klicke ich mit der rechten Maustaste auf Sender und dann Fehlersuche > Auswerten/Ändern... Inspect bzw. Inspizieren gibts bei meinen Delphi nicht. Ich habe Delphi 7 Personal. Oder ist der genannte Menüpunkt woanders versteckt?
Selected:=(Sender as TPanel).Name;
EDIT: Wenn ich den Debugger nach den Haltepunkt weiterlaufen lasse und dann die obengenannte Prozedur mache steht im Auswserten/Ändern-Fenster "Undefinierter Bezeichner: 'Sender'". |
Re: Ungültige Typenumwandlung bei TComponentNAME
Zitat:
2. Untersuche Sender im Tool-Fenster 'Überwachte Ausdrücke', und zwar für die Angaben, die zunächst interessant sind - siehe ![]() Zu Deinem EDIT: Der Compiler sorgt dafür, dass innerhalb einer Prozedur ein Element (hier: Sender) nur solange bekannt ist, wie damit noch etwas damit gemacht wird; danach wird das Element intern entfernt. Ich hoffe, das hilft. Jürgen |
Re: Ungültige Typenumwandlung bei TComponentNAME
Hallo!
Du möchtest den Namen des angeclickten Panels in Selected übernehmen. Daher mal die kätzerische Frage: Hast Du den Panels überhaupt Namen zugewiesen? Wenn nicht, dann ist klar, daß der leer ist. Bei dynamischer Generierung wird der Name nicht wie in der IDE automatisch vergeben. Hope it helps onlinekater [Edit] Ach ja, bei solchen Routinen überprüfe ich immer erst einmal, ob der Sender denn <> nil ist und ob der Sender von der entsprechenden Klasse ist. Ansonsten lasse ich die Routine direkt per exit beenden. Das hat den Grund, daß aus mir noch unbekannten Gründen einige Ereignisroutinen beim Programmstart einmal ausgeführt werden, ohne daß ein Sender mitgegeben wird. Der spätere Aufruf, wenn das Ereignis im Programmablauf auftritt, funktioniert dann korrekt. Das Problem kenne ich hauptsächlich von DB-Komponenten, könnte mir aber durchaus vorstellen, daß das auch bei anderen Komponenten passiert. [/Edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz