AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ungültige Typenumwandlung bei TComponentNAME
Thema durchsuchen
Ansicht
Themen-Optionen

Ungültige Typenumwandlung bei TComponentNAME

Ein Thema von Andreas L. · begonnen am 19. Aug 2006 · letzter Beitrag vom 19. Aug 2006
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

Ungültige Typenumwandlung bei TComponentNAME

  Alt 19. Aug 2006, 12:03
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?
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Ungültige Typenumwandlung bei TComponentNAME

  Alt 19. Aug 2006, 12:13
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....
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#3

Re: Ungültige Typenumwandlung bei TComponentNAME

  Alt 19. Aug 2006, 12:16
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?
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Ungültige Typenumwandlung bei TComponentNAME

  Alt 19. Aug 2006, 13:05
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
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Ungültige Typenumwandlung bei TComponentNAME

  Alt 19. Aug 2006, 13:15
Hallo onlinehome,

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

Gruß Hawkeye
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#6

Re: Ungültige Typenumwandlung bei TComponentNAME

  Alt 19. Aug 2006, 13:35
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 von onlinehome:
ich bastel mir gerade eine Listbox um die verschiedenen Sprachen die das Programm anwenden kann darzustellen.
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 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?

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

Vielleicht helfen Dir diese Hinweise. Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#7

Re: Ungültige Typenumwandlung bei TComponentNAME

  Alt 19. Aug 2006, 18:14
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 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'".
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#8

Re: Ungültige Typenumwandlung bei TComponentNAME

  Alt 19. Aug 2006, 20:59
Zitat von onlinehome:
Ich habe einen Haltepunkt bei 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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.889 Beiträge
 
Delphi 12 Athens
 
#9

Re: Ungültige Typenumwandlung bei TComponentNAME

  Alt 19. Aug 2006, 21:08
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]
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr.
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