AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Objektinspektor Programmieren

Ein Thema von igel457 · begonnen am 24. Nov 2005 · letzter Beitrag vom 25. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

Objektinspektor Programmieren

  Alt 24. Nov 2005, 17:58
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:

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

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

Grüße Igel457
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Objektinspektor Programmieren

  Alt 24. Nov 2005, 18:27
Ähm... scheit doch zu gehen...

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...
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: Objektinspektor Programmieren

  Alt 24. Nov 2005, 18:30
Dein Problem ließe sich per RTTI wahrscheinlich um Einiges einfacher (und generischer) lösen. Kannst du dein Ziel noch einmal genau beschreiben?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Objektinspektor Programmieren

  Alt 24. Nov 2005, 18:41
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

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...
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#5

Re: Objektinspektor Programmieren

  Alt 24. Nov 2005, 18:54
Hast du dir schonmal den JVInspector aus der JVCL angeschaut?
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Objektinspektor Programmieren

  Alt 24. Nov 2005, 19:13
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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#7

Re: Objektinspektor Programmieren

  Alt 25. Nov 2005, 08:45
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
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Objektinspektor Programmieren

  Alt 25. Nov 2005, 08:52
Ja, danke das sollte mir helfen.
Die AV's habe ich schon gelöst...
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Objektinspektor Programmieren

  Alt 25. Nov 2005, 09:02
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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Objektinspektor Programmieren

  Alt 25. Nov 2005, 15:00
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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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