AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit TObject.Classname

Ein Thema von implementation · begonnen am 20. Feb 2009 · letzter Beitrag vom 6. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#1

Problem mit TObject.Classname

  Alt 20. Feb 2009, 16:01
In meiner Funktion habe ich einen Zeiger auf ein TObject.
Ich möchte dort den Klassennamen als String auslesen.
Delphi-Quellcode:
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;
Doch beim Aufruf hält das Programm mittendrin an.
Es bricht nicht ab. Es stoppt einfach nur.
Es passiert nichts weiter.
Wenn ich
item^.Classname entferne, läuft das Programm weiter, aber natürlich wird nur "WSID 0001 is stored for a " ausgegeben.

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.
Marvin
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem mit TObject.Classname

  Alt 20. Feb 2009, 16:05
Klassenvariablen sind schon Zeiger (Referenzen)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Problem mit TObject.Classname

  Alt 20. Feb 2009, 16:10
@mkinzler: dann mach ich eben einen Zeiger auf den Klassenzeiger.
war wohl nicht das problem... [siehe oben]
Marvin
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Problem mit TObject.Classname

  Alt 20. Feb 2009, 16:21
Und was soll der Sinn sein?
Markus Kinzler
  Mit Zitat antworten Zitat
Hawkeye219

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

Re: Problem mit TObject.Classname

  Alt 20. Feb 2009, 16:32
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
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Problem mit TObject.Classname

  Alt 20. Feb 2009, 16:35
Zitat von implementation:

Wo liegt das Problem bei TObject.Classname?
Was gibt es für Alternativen?

----------[EDIT]------------

Problem seltsam gelöst.
Ja, funktioniert tadellos. Ich würde TObject statt PObject bevorzugen. Vielleicht ist das aber auch eine interne Codeverschleierungsmethode, vorgeschrieben von einem C(++)-Programmierer

Cheers,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Problem mit TObject.Classname

  Alt 20. Feb 2009, 17:35
Zitat von Hawkeye219:
Was passiert eigentlich in deiner Routine, wenn alle Elemente im Feld ItemUsed besetzt sind?
Das wird nicht passieren.
ItemUsed und Serverlist sind Arrays von 0 bis 1023, und so viele Elemente wird das Programm niemals benötigen.
Marvin
  Mit Zitat antworten Zitat
Benutzerbild von phreax
phreax

Registriert seit: 1. Mai 2006
Ort: Dresden
147 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Problem mit TObject.Classname

  Alt 20. Feb 2009, 17:57
Zitat von implementation:
Das wird nicht passieren.
ItemUsed und Serverlist sind Arrays von 0 bis 1023, und so viele Elemente wird das Programm niemals benötigen.
Da Du deine lokale Variable nicht initialisierst, kann diese im Zweifelsfall einen beliebigen Wert annehmen, und du bekommst einen falschen Index....

Besser so:
Delphi-Quellcode:
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;
Grüße phreax
Und dann war da noch der junge Mann ....
... der unbedingt Schriftsteller werden wollte.
Er wollte Emotionen wecken und die Leute zum weinen bringen.
Sein Traum wurde wahr, er verfasst heute die Fehlermeldungen bei Microsoft!
  Mit Zitat antworten Zitat
Hawkeye219

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

Re: Problem mit TObject.Classname

  Alt 20. Feb 2009, 18:35
@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:
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;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

Re: Problem mit TObject.Classname

  Alt 20. Feb 2009, 19:03
nja, wenn er sich den Speicher für den Zeiger noch mit anlegt, dann würde es auch damit gehn.
Delphi-Quellcode:
procedure TestProc;
var
  Server : TServer;
  P: PObject;
begin
  :
  New(P);
  P^ := Server:
  NotifyToList(P);
  :
end;
Aber wie bereits gesagt, ist TObject (nnd Nachkommen) schon ein Zeiger(Refferenz) auf die Objectdaten.
Also würde ein Cast ausreichend sein.
Delphi-Quellcode:
procedure TestProc;
var
  Server : TServer;
begin
  :
  NotifyToList(Pointer(Server));
  :
end;
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:21 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