![]() |
Objektinspektor Programmieren
Hallöchen....
ich hab da ein kleines Problemchen... Ich hab eine Art "Objektinspektor" mit dem ich Eigenschaften von meinenen Objekten umändern kann. Jedes Objekt mit Eigenschaften stammt von "TEackBase" ab:
Delphi-Quellcode:
"settings" ist vom Typ TPropList:
type
TEackBase = class (TImageSpriteEx) public settings : TPropList; events : TStringlist; focus:boolean; name:string; constructor Create(AOwner:TSprite); end;
Delphi-Quellcode:
Hier der Code der Liste:
type
TEtyp = (etInteger,etBoolean,etString); type PInt=^integer; PStr=^string; Pbol=^boolean; type TEackItem = class name:string; typ:TETyp; int:pint; str:pstr; bol:pbol; end; type TPropList = class(TList) protected function GetItem(Index: Integer): TEackItem; procedure SetItem(Index: Integer; AItem: TEackItem); public function Add(name:string;typ:TETyp;intptr:pint=nil;strptr:pstr=nil;boolptr:pbol=nil):Integer;overload; function Remove(Index:integer): Integer; overload; property Items[Index: Integer]: TEackItem read GetItem write SetItem; default; end;
Delphi-Quellcode:
Um "Eigenschaften" in meine Liste zu schreiben, habb ich ja nun Add. Diese funktion will ich z.B. so aufrufen:
procedure TPropList.SetItem(Index:integer; AItem:TEackItem);
begin inherited Items[Index] := AItem; end; function TPropList.GetItem(Index:Integer):TEackItem; begin Result := inherited Items[Index]; end; function TPropList.Add(name:string;typ:TETyp;intptr:pint=nil;strptr:pstr=nil;boolptr:pbol=nil):Integer; var item:TEackItem; begin item := TEackItem.Create; item.name := name; item.typ := typ; item.int := intptr; item.str := strptr; item.bol := boolptr; Result := inherited Add(Item); end; function TPropList.Remove(Index:Integer):integer; begin Result := inherited Remove(Items[index]); end;
Delphi-Quellcode:
Leider bekomme ich beim Abfragen meiner Settings eine AV. :gruebel:
Settings.Add('name',etstring,nil,@myobjectid,nil)
Was mache ich falsch? Gibt es vielleicht einen anderen Weg? Grüße Igel457 |
Re: Objektinspektor Programmieren
Ähm... scheit doch zu gehen... :oops:
Da kommt aber die frage auf warum es jezt geht: Vorher:
Delphi-Quellcode:
Nachher:
valuelisteditor1.Strings.clear;
for i := 0 to base.settings.Count-1 do begin valuelisteditor1.Add(base.settings.items[i].name+'='); end;
Delphi-Quellcode:
Komisch...
valuelisteditor1.Strings.clear;
ass := TStringlist.Create; for i := 0 to base.settings.Count-1 do begin ass.Add(base.settings.items[i].name+'='); end; valuelisteditor1.Strings.Assign(ass); ass.Free; |
Re: Objektinspektor Programmieren
Dein Problem ließe sich per RTTI wahrscheinlich um Einiges einfacher (und generischer) lösen. Kannst du dein Ziel noch einmal genau beschreiben?
|
Re: Objektinspektor Programmieren
Ok. Ich hab sowieso noch ein Problem.
Ich hab ja mein Strategiespiel... Und in dem Editor dafür kann ich Objekte hinsetzten. Diese Objekte haben Verschiedene Eigenschaften. Es gibt allerdings nur drei Eigenschafts-Typen: boolean,string,integer Klicke ich ein Objekt an so werden die Objekt-Speziefischen Eigenschaften angezeigt. Nun habe ich eine Liste Programmiert die alle Eigenschaften eines Objektes zusammenfassen soll. Jedes Objekt hat so eine Liste und fügt in "Create" alle Eigenschaften hinzu. Zum Beispiel
Delphi-Quellcode:
Dadurch soll eine Eigenschaft (name) hinzugefügt werden und die entsprechende Variable des "echten" objektes mit meinem Inspektor verlinkt werden. Ändere ich was in meinem Inspektor, so soll sich automatisch mein Objekt anpassen.
settings.add('name',teString,nil,@name,nil);
Ich hoffe so ist es verständlich... |
Re: Objektinspektor Programmieren
Hast du dir schonmal den JVInspector aus der JVCL angeschaut?
|
Re: Objektinspektor Programmieren
Nein, habe ich noch nicht.
Ich würde gerne aber auch erst im "Notfall" auf andere Komponenten ausweichen. Und besonders das mit den Jedis... Da hab ich Probelme mit dem Installieren. Mein monentanes Problem besteht eigendlich "nur" in folgendem: Möchte ich zum Beispiel einen Integer zuweisen dann mach ich im Prinzip folgendes
Delphi-Quellcode:
Mit Pointern hab ich so explizit noch nie gearbeitet... hofe, ihr könnt mir dabei helfen
type PInt = ^integer;
. . testvalue := 0; aPInt := testvalue; showmessage(inttostr(integer(apint))); // '13213213' |
Re: Objektinspektor Programmieren
Wo ist denn jetzt eigentlich noch das Problem? Immernoch die Access Violations?
Theoretisch würde es reichen, wenn du
Delphi-Quellcode:
In
TEackItem = class
name:string; typ:TETyp; int:pint; str:pstr; bol:pbol; end;
Delphi-Quellcode:
änderst. Dann sparst du dir so viele Parameter bei Add und bist flexibler, wenn doch mal ein neuer Typ hinzukommt.
TEackItem = class
name:string; typ :TETyp; ptr : Pointer; end; Schreiben würde dann in etwa so aussehen (Achtung ungetest):
Delphi-Quellcode:
Lesen geht dann ähnlich:
procedure SetInteger(var Item: TEackItem; Int: Integer);
begin // Prüfen, ob es wirklich vom Typ Integer ist. Assert(Item.typ=etInteger); PInteger(Item.Ptr)^:=Int; end; procedure SetBoolean(var Item: TEackItem; Bool: Boolean); begin // Prüfen, ob es wirklich vom Typ Boolean ist. Assert(Item.typ=etBoolean); PBoolean(Item.Ptr)^:=Bool; end; procedure SetString(var Item: TEackItem; Str: String); begin // Prüfen, ob es wirklich vom Typ Integer ist. Assert(Item.typ=etString); PString(Item.Ptr)^:=Str; end;
Delphi-Quellcode:
Bei Strings muss ich aber ehrlich sagen, dass ich mir nicht ganz sicher bin, ob es so funktioniert. Vielleicht erstmal mit Integer/Boolean probieren.
function GetInteger(const Item: TEackItem): Integer;
begin // Prüfen, ob es wirklich vom Typ Integer ist. Assert(Item.typ=etInteger); result:=PInteger(Item.Ptr)^; end; procedure GetBoolean(const Item: TEackItem): Boolean; begin // Prüfen, ob es wirklich vom Typ Boolean ist. Assert(Item.typ=etBoolean); result:=PBoolean(Item.Ptr)^; end; procedure GetString(constItem: TEackItem: string; begin // Prüfen, ob es wirklich vom Typ Integer ist. Assert(Item.typ=etString); result:=PString(Item.Ptr)^; end; P.S: Hoffe das hilft ;) |
Re: Objektinspektor Programmieren
Ja, danke das sollte mir helfen. :gruebel:
Die AV's habe ich schon gelöst... |
Re: Objektinspektor Programmieren
und du hast recht... mit Strings geht es nicht! Hat da jemand eine Lösung?
EDIT: Ich mach mal einen neuen Beitrag auf, mit der ausgangsfrage hat das IMHO nichts mehr zu tun. |
Re: Objektinspektor Programmieren
Das hat jetzt wieder mehr mit der Ausgangsfrage zu tun:
Kennt sich jemand mit dem JVInspector aus? Wenn ich insoectedObject auf eine Komponente sezte zeigt der mir brav die published eigenschaften an. Leider nicht bei Objekten die keine Kompontnten sind. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 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