AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

GetPropList weigert sich

Ein Thema von Medium · begonnen am 10. Jan 2012 · letzter Beitrag vom 5. Jun 2019
Antwort Antwort
Seite 1 von 3  1 23   
Medium

Registriert seit: 23. Jan 2008
3.473 Beiträge
 
Delphi 2007 Enterprise
 
#1

GetPropList weigert sich

  Alt 10. Jan 2012, 10:43
Delphi-Version: 2007
Mahlzeit!

Vorab: Delphi 2007

Ich bräuchte eine Liste aller Properties von einer Instanz, wozu sich GetPropList() ja prima eignen sollte. Ich habe auch zig Codeschnipsel gefunden, die das scheinbar völlig problemlos verwenden, bei mir springt leider der Compiler raus.
Delphi-Quellcode:
function TMyObject.GetPropTexts(aObj: TMyObject): String;
var
  list: TPropList;
  propCount, i: Integer;
begin
  propCount := GetPropList(aObj, @list); // "Es gibt keine überladene Version von 'GetPropList', die man mit diesen Argumenten aufrufen kann"
  for i := 0 to propCount do
  begin
    ...
Auch probiert, mit dem selben Ergebnis: propCount := GetPropList(PTypeInfo(aObj.ClassInfo), @list); und propCount := GetPropList(aObj, PPropList(@list)); Wenn ich statt des Arrays gleich einen Pointer nehme:
Delphi-Quellcode:
function TMyObject.GetPropTexts(aObj: TMyObject): String;
var
  pList: PPropList;
  propCount, i: Integer;
begin
  propCount := GetPropList(aObj, pList);
  ...
Dann kompiliert das ganze zwar, läuft aber auf eine AV an Adresse $00000001. Ich hab nachgesehen: GetPropInfo alloziert die Liste via GetMem() selbst. Sollte also an sich auch gehen, und habe ich auch in manchen Quellfetzen im Netz gesehen!

Was mache ich hier verkehrt?

Besten Dank schon mal!


\\Edit: Mehr Infos.
Komisches passiert in dieser Funktion, die die Überladung mit PPropList-Parameter (also die kompilierende) aufruft:
Delphi-Quellcode:
function GetTypeData(TypeInfo: PTypeInfo): PTypeData; assembler;
asm
        { ->    EAX Pointer to type info }
        { <-    EAX Pointer to type data }
        {       it's really just to skip the kind and the name  }
        XOR EDX,EDX
        MOV DL,[EAX].TTypeInfo.Name.Byte[0]
        LEA EAX,[EAX].TTypeInfo.Name[EDX+1]
end;
In der 2. Zeile springt der Debugger auf einmal in die Classes.pas, und zwar in die Methode TThreadList.LockList. Was zum Henker will der DA!? Da jodelt der 2 Mal durch, und hängt dann was länger in der StdWndProc rum, und dann gibts irgendwann die o.g. AV. Wattatten?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (10. Jan 2012 um 10:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.032 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: GetPropList weigert sich

  Alt 10. Jan 2012, 10:53
Hallo,

Also bei mir funktioniert das hier ohne Probleme:

Delphi-Quellcode:
uses
  TypInfo;

procedure TForm1.FormCreate(Sender: TObject);
var plist: PPropList;
    i, n: Integer;
begin
  n := GetPropList(Self,plist);
  try
    for i := 0 to n-1 do
      Memo1.Lines.Add(plist^[i]^.Name);
  finally
    FreeMem(plist);
  end;
end;
Wie sieht denn die Klasse des Objekts aus, dass du übergibst?
Sind generische Properties drin?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: GetPropList weigert sich

  Alt 10. Jan 2012, 10:53
http://www.swissdelphicenter.ch/torr...de.php?id=1084
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.473 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: GetPropList weigert sich

  Alt 10. Jan 2012, 11:02
Danke euch! Beide bringen mich nach wie vor zu oben genanner AV. Folglich ist entweder mein Delphi matsche, oder es ist damit überfordert die RTTI in einer Win7 VM zu bemühen. Ich starte hier erstmal alles neu, und dann mal sehen. Sowas blödes
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.473 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: GetPropList weigert sich

  Alt 10. Jan 2012, 11:39
Leider auch nach Neustart keine Besserung, und das Kompilat zeigt auch auf einem "echten" PC die AV. Die Klasse ist völlig unspektakulär, da ich gerade genau am Anfang bin eine Idee umzusetzen.

Delphi-Quellcode:
  TTestDrawObject = class
  private
    FWidth: Single;
    FHeight: Single;
    FTop: Single;
    FLeft: Single;
    procedure SetHeight(const Value: Single);
    procedure SetWidth(const Value: Single);
    function GetIntHeight: Integer;
    function GetIntWidth: Integer;
  protected
    procedure Paint; virtual;
    function PropText(aPropName: String; aValue: Integer): String; overload;
    function PropText(aPropName: String; aValue: Single): String; overload;
    function PropText(aPropName: String; aValue: String): String; overload;
    function PropText(aPropName: String; aValue: TTestDrawObject): String; overload;
  public
    property Left: Single read FLeft write FLeft;
    property Top: Single read FTop write FTop;
    property Width: Single read FWidth write SetWidth;
    property Height: Single read FHeight write SetHeight;
    property IntWidth: Integer read GetIntWidth;
    property IntHeight: Integer read GetIntHeight;
    procedure SetSize(aWidth, aHeight: Single);
    function ToText: String;
    constructor Create;
    destructor Destroy; override;
  end;
Alle Getter bzw. Setter machen nichts als die Felder zurückgeben (bzw. vorher aufzurunden bei den GetInt*) oder zu setzen - da soll später mehr rein. die PropText() Methoden sind auch leere Rümpfe bis auf den letzten, welcher eben die problematische Funktion beinhaltet. Aufgerufen wird diese von "ToText" mit den Parametern (self.ClassName, self).

PropText() ist bislang auch eher wenig imposant:
Delphi-Quellcode:
function TMyDrawObject.PropText(aPropName: String; aValue: TMyDrawObject): String;
var
  List: PPropList;
  size, propCount, i: Integer;
begin
  propCount := GetPropList(aValue.ClassInfo, tkAny, nil);
  size := propCount * SizeOf(Pointer);
  GetMem(List, size);
  propCount := GetPropList(aValue.ClassInfo, tkAny, List); // AV nach dieser Zeile
  result := '';
end;
Das ganze soll eine kleine Serialisierung von Zeichenobjekten werden. Als Eigenbau, weil ich (viel) später mal ein paar Speziellere Dinge brauchen werde, so dass es mir wesentlich einfacher erschien diese an sich ja einfach Funktion fix selbst hinzutippern, als mich erst lange in Fremdlösungen eindenken zu müssen um sie anzupassen, und ich das Format gerne möglichst schlank halten will, weil davorn nachher einiges übers Netzwerk flitzen soll. "fix selbst hintippern" - denkste

Bin keinen Schritt weiter Mich irritiert der Sprung in die TThreadList-Methode total. Mein Testprogramm tut aber auch nichts böses: Ein Button, ein Memo, ein TMyDrawObject wird erzeugt, und Memo1.Lines.Add(obj.ToText); aufgerufen. Ansonsten ist das ein frisches Projekt.


\\Edit: TMyDrawObject auf nur eine Property und eine nicht-überladene PropText()-Methode reduziert, komplett neues Testprojekt mit Button+Memo gemacht, und der Fehler bleibt. So langsam werd ich knüsselich

\\Edit2: Ich hab mal ein Testprojekt gebaut. Wäre prima, wenn das mal wer testen würde! Am liebsten natürlich auch mit D2007, aber auch generell würd ich's gern wissen. Ich habe mein Kompilat mit drin gelassen - wäre ja nicht unspannend, ob das auf einem anderen PC eventuell tut!
Angehängte Dateien
Dateityp: zip GetPropList.zip (222,1 KB, 5x aufgerufen)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (10. Jan 2012 um 12:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: GetPropList weigert sich

  Alt 10. Jan 2012, 14:04
Zitat:
Ermittelt eine Liste mit den Komponenteneigenschaften
Du sitzt aber direkt auf Class
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.473 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: GetPropList weigert sich

  Alt 10. Jan 2012, 14:48
Die 3. Überladung von GetPropList hat explizit "TObject" als Parameter, kein TComponent, kein TPersistent, kein nix. Die Hilfe erwähnt auch nirgends, dass da doch kein TObject übergeben werden darf, und somit würde ich eigentlich annehmen, dass das so okay ist. Ist das am Ende wieder nur eine Verwirrung dank genialer Dokumentation (und irreführender Parameterliste) seitens Emba?
Was wäre denn die "kleinste" Basisklasse, für die ich GetPropInfo() benutzen kann?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#8

AW: GetPropList weigert sich

  Alt 10. Jan 2012, 14:57
Gehen bei den "Alten" Delphi's nicht nur Published-Properties ?
Glückauf
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.473 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: GetPropList weigert sich

  Alt 10. Jan 2012, 15:08
Das habe ich mittlerweile auch probiert, weil mir so etwas im Hinterkopf war. Zwar hätte dann der Rückgabewert von GetPropList() einfach nur 0 sein dürfen, und keine AV auslösen, aber einen Versuch war es dennoch wert. Leider mit dem selben Ergebnis: AV

Mag keiner fix mein kleines Testprojekt von weiter oben mal anfahren? Ich würde gerne klären, ob es eventuell an meinem Delphi bzw. sonstigem Setup liegt, oder ich wirklich ein tiefgreifendes Verständnisproblem hier habe
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#10

AW: GetPropList weigert sich

  Alt 10. Jan 2012, 15:12
Das habe ich mittlerweile auch probiert, weil mir so etwas im Hinterkopf war. Zwar hätte dann der Rückgabewert von GetPropList() einfach nur 0 sein dürfen, und keine AV auslösen, aber einen Versuch war es dennoch wert. Leider mit dem selben Ergebnis: AV
Hast du dabei auch von TPersistent abgeleitet ? Published macht darunter keinen Sinn
Glückauf
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf