Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ungültige Typenumwandlung bei TComponentNAME (https://www.delphipraxis.net/75454-ungueltige-typenumwandlung-bei-tcomponentname.html)

Andreas L. 19. Aug 2006 11:03


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:
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;
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?

Elvis 19. Aug 2006 11:13

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....

Andreas L. 19. Aug 2006 11:16

Re: Ungültige Typenumwandlung bei TComponentNAME
 
Zitat:

Zitat von Elvis
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....

Hmm, das ist nix drin. Und wie bekomme ich nun den Sender da rein?

Elvis 19. Aug 2006 12:05

Re: Ungültige Typenumwandlung bei TComponentNAME
 
Zitat:

Zitat von onlinehome
Hmm, das ist nix drin. Und wie bekomme ich nun den Sender da rein?

Nix im Sinne von nüschts aka nil oder nix im Sinne von "der Debug hint war leer"?
Rechtsklick und und "Inspect BlaBla" öffnet den Debug inspector, der dir wirklich sagt was drin ist.

ed: hint vergessen :wall:

Hawkeye219 19. Aug 2006 12:15

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

Jürgen Thomas 19. Aug 2006 12:35

Re: Ungültige Typenumwandlung bei TComponentNAME
 
Zitat:

Zitat von Hawkeye219
der Fehler dürfte in der Zeile davor auftreten. Wahrscheinlich ist die von FindComponent gelieferte Komponente kein TPanel.

Ich verstehe Code-Fragment und Erläuterung so, dass SelectLanguage eine ListBox ist:
Zitat:

Zitat von onlinehome
ich bastel mir gerade eine Listbox um die verschiedenen Sprachen die das Programm anwenden kann darzustellen.

Zitat:

Zitat von onlinehome
Dabei soll ein klick auf ein Panel das selbige markieren.

Die einzelnen Einträge einer TListBox heißen Items, siehe Delphi-Referenz durchsuchenTListbox.
Zitat:

Zitat von onlinehome
Da die Panels zur Laufzeit erstellt werden weiße ich diesen ein OnClick-Event zu.

Deshalb stellen sich mir beim Lesen des Code-Fragments folgende Fragen:

1. Welche Panels werden erstellt und wie; und wie weist Du ihnen das OnClick-Ereignis zu?

Delphi-Quellcode:
if selected > '' then
2. Meinst Du '<>' (also nur ein Tippfehler)?

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:
bDESelected := ListBox1.Selected[2]
die Angabe, ob das Element 2 ausgewählt ist.

Vielleicht helfen Dir diese Hinweise. Jürgen

Andreas L. 19. Aug 2006 17:14

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:
Panel
-frame
  -panel <--hier soll die onclick routine aufgerufen werden
  -panel <-- "
Ich habe einen Haltepunkt bei
Delphi-Quellcode:
Selected:=(Sender as TPanel).Name;
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?

EDIT: Wenn ich den Debugger nach den Haltepunkt weiterlaufen lasse und dann die obengenannte Prozedur mache steht im Auswserten/Ändern-Fenster "Undefinierter Bezeichner: 'Sender'".

Jürgen Thomas 19. Aug 2006 19:59

Re: Ungültige Typenumwandlung bei TComponentNAME
 
Zitat:

Zitat von onlinehome
Ich habe einen Haltepunkt bei
Delphi-Quellcode:
Selected:=(Sender as TPanel).Name;
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?

EDIT: Wenn ich den Debugger nach den Haltepunkt weiterlaufen lasse und dann die obengenannte Prozedur mache steht im Auswserten/Ändern-Fenster "Undefinierter Bezeichner: 'Sender'".

1. Gibt es den Punkt 'Untersuchen'? Das wäre das gleiche und liefert Informationen über die betreffende Klasse mit einem Aufbau ähnlich dem Objektinspektor.

2. Untersuche Sender im Tool-Fenster 'Überwachte Ausdrücke', und zwar für die Angaben, die zunächst interessant sind - siehe Delphi-Referenz durchsuchenTObject Methoden. Ich empfehle zunächst Sender.ClassName, damit Du weißt, wer das Ereignis ausgelöst hat. (Ich hoffe, dass Deine Struktur so aufgebaut ist, dass diese Information Auskunft gibt.) Vergiss dabei nicht, 'Funktionsaufrufe gestatten' einzuschalten (weil in TObject nur Methoden, keine Eigenschaften deklariert sind).

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

TBx 19. Aug 2006 20:08

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