Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Klassentyp nicht verfügbar (https://www.delphipraxis.net/60399-klassentyp-nicht-verfuegbar.html)

WoTo 6. Jan 2006 12:09


Klassentyp nicht verfügbar
 
Hallo zusammen,
ich habe folgendes Problem:
mit folgendem Befehl speichere ich Objekte in einer StringList:

Delphi-Quellcode:
if (ACB <> nil) and (ACB is TGridCheckBoxExt)
  then AJob.ObjectList.AddObject(ACB.Name,ACB);
wobei ACB vom Typ TGridCheckBoxExt ist.

Anschließend kopiere ich den Inhalt der StringListe ObjectList mit

Delphi-Quellcode:
sgGrid.ObjectList.Assign(AJob.ObjectList)
.

Nun lese ich die einzelnen Objekte wieder aus und überprüfe deren Klassentyp mit
Delphi-Quellcode:
for index:= 0 to Pred(sgGrid.ObjectList.Count) do
begin
  sgGrid.ObjectList.Objects[index] is TGridCheckBoxExt
  then begin
   
  end;
end;
Leider wird das Objekt nicht als TGridCheckBoxExt erkannt ! :wall:

Was mache hier nun wieder falsch ? :gruebel:

Igotcha 6. Jan 2006 12:13

Re: Klassentyp nicht verfügbar
 
Zitat:

Zitat von WoTo
Nun lese ich die einzelnen Objekte wieder aus und überprüfe deren Klassentyp mit
Delphi-Quellcode:
for index:= 0 to Pred(sgGrid.ObjectList.Count) do
begin
  sgGrid.ObjectList.Objects[index] is TGridCheckBoxExt // wo ist das "if"?
  then begin
   
  end;
end;

Fehlt da nicht ein "if"?

Und dann pack da mal ein ShowMessage oder so zwischen begin und end. Evtl. wird das Ganze vom Compiler wegrationalisiert, da dort eh nix passiert.

Gruß Igotcha

WoTo 6. Jan 2006 12:28

Re: Klassentyp nicht verfügbar
 
Hallo Igotcha,
vielen Dank für deine Antwort.

Das if ist in der Originalversion vorhanden und zwischen dem Begin und End deklariere ich dann das Objekt mit

Delphi-Quellcode:
ACB := TGridCheckBoxExt(sgGrid.ObjectList.Objects[index]);
Self.SetCheckBoxAlignment(ACB,ACol,ARow);
Nur da kommt das Programm erst gar nicht hin, da das Object nicht als TGridCheckBoxExt erkannt wird.

Gruß
Woto

freak4fun 6. Jan 2006 12:32

Re: Klassentyp nicht verfügbar
 
Hallo :hi:,
kannst du dir nicht mit .CalssName oder etwas Änlichen den KLassentyp ausgeben lassen?

MfG
freak

jim_raynor 6. Jan 2006 13:01

Re: Klassentyp nicht verfügbar
 
Wenn du auf ein Objekt in der Liste zugreifst musst du dem Compiler IMMER den Typ angegeben:


entweder so:

Delphi-Quellcode:
TGridCheckBoxExt(TsgGrid.ObjectList.Objects[index]).Eigenschaft
wenn du den Typ vorher mit is geprüft hat oder mit

Delphi-Quellcode:
(TsgGrid.ObjectList.Objects[index] as TGridCheckBoxExt).Eigenschaft
wenn der Typ vorher nicht geprüft wurde. as behinhaltet ein is, heisst er prüft bei as den Typ nochmal und löst eventuell eine Exception aus.

SirThornberry 6. Jan 2006 13:07

Re: Klassentyp nicht verfügbar
 
@jim_raynor: Der Typ ist ja schon von der Stringliste her vorgegeben. Und zwar ist das Property Objects vom Typ TObject und somit kann überprüft werden ob dieses TObject vom Typ TGridCheckBoxExt ist.
@Igotcha: Dort wo die Prüfung mit "is" fehlschläft könntest du dir doch mal in den watsches
sgGrid.ObjectList.Objects[index].Classname
ausgeben lassen

WoTo 6. Jan 2006 13:20

Re: Klassentyp nicht verfügbar
 
Hallo SirThornberry,
genau das habe ich schon probiert und als Wert wird "nicht verfügbar" ausgegeben.

zu jim_raynor:
ich caste das Objekt mit
Delphi-Quellcode:
ACB := TGridCheckBoxExt(sgGrid.ObjectList.Objects[index]);
MfG
Woto

jim_raynor 6. Jan 2006 13:25

Re: Klassentyp nicht verfügbar
 
Zitat:

Zitat von WoTo
genau das habe ich schon probiert und als Wert wird "nicht verfügbar" ausgegeben.

Deutet darauf hin, dass das Object nil oder Funktionsaufrufe nicht gestatte sind (doppelklick auf den Ausdruck in der Ausdrucksliste) ist.
Werden vielleicht die Objekte nicht bei Assign nicht übernommen?

Zitat:

Zitat von WoTo
zu jim_raynor:
ich caste das Objekt mit

Hatte deinen Frage falsch interpretiert, von daher vergiss was ich geschrieben hab :mrgreen:

SirThornberry 6. Jan 2006 14:12

Re: Klassentyp nicht verfügbar
 
@woto: Hast du "Allow Functioncalls" oder wie auch immer das in der deutschen Version heißt bei dem eintrag in den watches ausgegeben? Wenn das auch nicht hilft könntest du das ja mal mit ShowMessage ausgeben oder in eine Listbox etc. schreiben lassen.

WoTo 7. Jan 2006 10:55

Re: Klassentyp nicht verfügbar
 
Hallo zusammen,
danke für den Hinweis mit der "Funktionsaufrufe gestatten"-Option bei den Watches. Ich kannte diese noch nicht. :bounce2:
Nachdem ich die Option enabled hatte, wird mir im Watchfenster für die Variable

sgGrid.ObjectList.Objects[index].Classtype.Classname

eine Zugriffsverletzung ausgegeben.
Ich habe mal die Adressen des 1. Objektes in beiden Stringlisten verglichen und festgestellt, daß diese ungleich sind ! :duck:

Ich vermute, daß ich irgendwie aus einer falschen StringList die Objekte auslese.
Werde dies überprüfen und mich wieder melden. :coder:

Gruß
Woto


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 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