Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objektinspektor Programmieren (https://www.delphipraxis.net/57653-objektinspektor-programmieren.html)

igel457 24. Nov 2005 17:58


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:
type
  TEackBase = class (TImageSpriteEx)
  public
    settings : TPropList;
    events : TStringlist;
    focus:boolean;
    name:string;
    constructor Create(AOwner:TSprite);
end;
"settings" ist vom Typ TPropList:
Delphi-Quellcode:
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;
Hier der Code der Liste:
Delphi-Quellcode:
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;
Um "Eigenschaften" in meine Liste zu schreiben, habb ich ja nun Add. Diese funktion will ich z.B. so aufrufen:

Delphi-Quellcode:
Settings.Add('name',etstring,nil,@myobjectid,nil)
Leider bekomme ich beim Abfragen meiner Settings eine AV. :gruebel:

Was mache ich falsch? Gibt es vielleicht einen anderen Weg?

Grüße Igel457

igel457 24. Nov 2005 18:27

Re: Objektinspektor Programmieren
 
Ähm... scheit doch zu gehen... :oops:

Da kommt aber die frage auf warum es jezt geht:

Vorher:
Delphi-Quellcode:
    valuelisteditor1.Strings.clear;
    for i := 0 to base.settings.Count-1 do
    begin
      valuelisteditor1.Add(base.settings.items[i].name+'=');
    end;
Nachher:
Delphi-Quellcode:
    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;
Komisch...

Khabarakh 24. Nov 2005 18:30

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?

igel457 24. Nov 2005 18:41

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:
settings.add('name',teString,nil,@name,nil);
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.

Ich hoffe so ist es verständlich...

jim_raynor 24. Nov 2005 18:54

Re: Objektinspektor Programmieren
 
Hast du dir schonmal den JVInspector aus der JVCL angeschaut?

igel457 24. Nov 2005 19:13

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:
type PInt = ^integer;
.
.
testvalue := 0;
aPInt := testvalue;
showmessage(inttostr(integer(apint))); // '13213213'
Mit Pointern hab ich so explizit noch nie gearbeitet... hofe, ihr könnt mir dabei helfen

jim_raynor 25. Nov 2005 08:45

Re: Objektinspektor Programmieren
 
Wo ist denn jetzt eigentlich noch das Problem? Immernoch die Access Violations?

Theoretisch würde es reichen, wenn du

Delphi-Quellcode:
TEackItem = class
    name:string;
    typ:TETyp;
    int:pint;
    str:pstr;
    bol:pbol;
end;
In
Delphi-Quellcode:
TEackItem = class
    name:string;
    typ :TETyp;
    ptr : Pointer;
end;
änderst. Dann sparst du dir so viele Parameter bei Add und bist flexibler, wenn doch mal ein neuer Typ hinzukommt.

Schreiben würde dann in etwa so aussehen (Achtung ungetest):

Delphi-Quellcode:
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;
Lesen geht dann ähnlich:

Delphi-Quellcode:
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;
Bei Strings muss ich aber ehrlich sagen, dass ich mir nicht ganz sicher bin, ob es so funktioniert. Vielleicht erstmal mit Integer/Boolean probieren.

P.S: Hoffe das hilft ;)

igel457 25. Nov 2005 08:52

Re: Objektinspektor Programmieren
 
Ja, danke das sollte mir helfen. :gruebel:
Die AV's habe ich schon gelöst...

igel457 25. Nov 2005 09:02

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.

igel457 25. Nov 2005 15:00

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 22:46 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