![]() |
Problem mit TObject.Classname
In meiner Funktion habe ich einen Zeiger auf ein TObject.
Ich möchte dort den Klassennamen als String auslesen.
Delphi-Quellcode:
Doch beim Aufruf hält das Programm mittendrin an.
function NotifyToList(item: PObject): Word;
var i: Word; begin while ItemUsed[i] do Inc(i); ItemUsed[i]:=true; ServerList[i] := item; Result := i; OutputLine('WSID '+IntToHex(i,4)+' is stored for a '+item^.ClassName); end; Es bricht nicht ab. Es stoppt einfach nur. Es passiert nichts weiter. Wenn ich
Delphi-Quellcode:
entferne, läuft das Programm weiter, aber natürlich wird nur "WSID 0001 is stored for a " ausgegeben.
item^.Classname
Wo liegt das Problem bei TObject.Classname? Was gibt es für Alternativen? ----------[EDIT]------------ Was ist das für'n S*#%§ß? Nachdem ich den Teil wieder weggenommen hatte, habe ich ihn nun noch einmal wieder eingefügt. Und? Was dann? Es hat funktioniert!!! Und warum musste ich das jetzt erst posten, damit das funzt? Das müllt doch nur die DP voll... Problem seltsam gelöst. |
Re: Problem mit TObject.Classname
Klassenvariablen sind schon Zeiger (Referenzen)
|
Re: Problem mit TObject.Classname
@mkinzler: dann mach ich eben einen Zeiger auf den Klassenzeiger. ;-)
war wohl nicht das problem... [siehe oben] |
Re: Problem mit TObject.Classname
Und was soll der Sinn sein?
|
Re: Problem mit TObject.Classname
Hallo,
vielleicht hilft es auch schon, wenn du die lokale Variable i geeignet initialisierst. Dann schreibst du nicht unkontrolliert im Speicher herum. Was passiert eigentlich in deiner Routine, wenn alle Elemente im Feld ItemUsed besetzt sind? Gruß Hawkeye |
Re: Problem mit TObject.Classname
Zitat:
Cheers, |
Re: Problem mit TObject.Classname
Zitat:
ItemUsed und Serverlist sind Arrays von 0 bis 1023, und so viele Elemente wird das Programm niemals benötigen. |
Re: Problem mit TObject.Classname
Zitat:
Besser so:
Delphi-Quellcode:
Grüße phreax
function NotifyToList(item: PObject): Word;
var i: Word; begin i := 0; while ItemUsed[i] do Inc(i); ItemUsed[i]:=true; ServerList[i] := item; Result := i; OutputLine('WSID '+IntToHex(i,4)+' is stored for a '+item^.ClassName); end; |
Re: Problem mit TObject.Classname
@implementation
Wenn du auf die PObject-Zeiger nicht verzichtest, kannst du sehr leicht in die nächste Falle geraten. Solltest du die Adresse einer lokalen Objektreferenz an deine Routine NotifyList übergeben, könnte das Array ServerList bald ungültige Referenzen enthalten. Dies passiert immer dann, wenn die aufrufende Routine beendet wird und ihre lokalen Variablen somit zerstört werden:
Delphi-Quellcode:
Gruß Hawkeye
procedure TestProc;
var Server : TServer; begin : NotifyToList(@Server); : // Nach dem Beenden der Routine TestProc existiert die Variable "Server" nicht mehr. // Die in "ServerList" eingetragene Adresse verweist also auf undefinierte Daten. end; |
Re: Problem mit TObject.Classname
nja, wenn er sich den Speicher für den Zeiger noch mit anlegt, dann würde es auch damit gehn. :roll:
Delphi-Quellcode:
Aber wie bereits gesagt, ist TObject (nnd Nachkommen) schon ein Zeiger(Refferenz) auf die Objectdaten.
procedure TestProc;
var Server : TServer; P: PObject; begin : New(P); P^ := Server: NotifyToList(P); : end; Also würde ein Cast ausreichend sein.
Delphi-Quellcode:
procedure TestProc;
var Server : TServer; begin : NotifyToList(Pointer(Server)); : end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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