Einzelnen Beitrag anzeigen

I.A

Registriert seit: 14. Jan 2007
83 Beiträge
 
#1

Typinfo - Klasse

  Alt 29. Mär 2009, 20:01
Hallo,

vor einigen Tagen habe ich mich mit Typinformation zur Laufzeit beschäftigt. Der User _frank_ hat mir freundlicherweise ein Softwareprojrkt zur Verfügung gestellt, aus dem ich 2 Units voraussetze.

Ich hatte meine Frage zur Typinformation in folgendem Thread gestellt:

http://www.delphipraxis.net/internal...ation&start=15

Dort ist auch der Link zum Dfm-Edit Projekt zu finden, aus dem ich 2 Units verwende, um die Typklasse zu realisieren. Letzter Beitrag auf Seite 2 unten.

Hier ist die Unit:

Delphi-Quellcode:
unit TypeInfoClasses;

interface

uses
  Classes, Sysutils, TypInfo, rttifunctions_u, classes_u;

type
  //Stringtyp entweder hier konkret anpassen oder bedingt compilieren,
  //um bedarfsgerechten Stringtyp zu erhalten
  TStringType = String;
  TClassTypeInfo = class(TPersistent)
  private
    FTypeKind: TTypeKind;
    FTypeName: TStringType;
    FMethodName: TStringType;
    FMethodKind: TMethodKind; //auch TTypeKind
    FProperties: TStrings;
    function GetObject: TPersistent;
    function GetTypeKind(Index: Integer): TTypeKind;
    function GetTypeName(Index: Integer): TStringType;
    function GetPropertyByIndex(Index: Integer): TStringType;
    function GetPropertyByName(Name: TStringType): TStringType;
    procedure SetObject(AObject: TPersistent);
  public
    constructor Create;
    constructor CreateForClass(AClass: TPersistent);
     destructor Destroy; override;

    function ItsName(AName: TStringType): Integer;

     property forObject: TPersistent read GetObject write SetObject;

     property MethodKind: TMethodKind read FMethodKind;
    property MethodName: TStringType read FMethodName;

    property PropertyTypeName[Index: Integer]: TStringType read GetTypeName;
    property PropertyTypeKind[Index: Integer]: TTypeKind read GetTypeKind;
    property PropertyByIndex[Index: Integer]: TStringType read GetPropertyByIndex;
    property PropertyByName[Name: TStringType]: TStringType read GetPropertyByName;
  end;


implementation

function TClassTypeInfo.GetObject: TPersistent;
begin

end;

function TClassTypeInfo.GetTypeKind(Index: Integer): TTypeKind;
begin
  Result := TTypeObject(FProperties.Objects[Index]).PropKind;
end;

function TClassTypeInfo.GetTypeName(Index: Integer): TStringType;
begin
  Result := TTypeObject(FProperties.Objects[Index]).TypeName;
end;

function TClassTypeInfo.GetPropertyByIndex(Index: Integer): TStringType;
begin
  Result := FProperties[Index];
end;

function TClassTypeInfo.GetPropertyByName(Name: TStringType): TStringType;
begin
  Result := FProperties[FProperties.IndexOf(Name)];
end;

procedure TClassTypeInfo.SetObject(AObject: TPersistent);
begin
  GetComponentProps(AObject.ClassName, FProperties, true);
end;

constructor TClassTypeInfo.Create;
begin
  inherited Create;
  FProperties := TStringList.Create;
end;

constructor TClassTypeInfo.CreateForClass(AClass: TPersistent);
begin
  inherited Create;
  FProperties := TStringList.Create;
  GetComponentProps(AClass.ClassName, FProperties, true);
end;

destructor TClassTypeInfo.Destroy;
begin
  FProperties.Free;
  inherited Destroy;
end;

function TClassTypeInfo.ItsName(AName: TStringType): Integer;
var Index: Integer;
begin
  Result := FProperties.IndexOf(AName);
end;

end.
Die Units rttifunctions_u und classes_u stammen aus dem dfm-Edit Projekt von _frank_

Was würdet Ihr Euch noch an Funktionalität für so eine Klasse wünschen?

Wollte noch zu _frank_'s SizeControl Demo einen Objektinspektor bauen mit der Funktionalität desjenigen von Delphi, kämpfe aber noch mit dem Einfügen der Editorzeilen. Werd wohl doch noch mal die Jedi-Kompos installieren, fürchte aber, das der dort mitgelieferte Objektinspektor noch schwieriger zu handhaben ist als das TRakObjektinspectorGrid von Kasparsoft. Mit diesen beiden Teilen ließe sich ein eigener Formdesigner bauen.

Aber als kleines Dankeschön für die Hilfe die ich bisher bei dem Problem des Erhaltes der Typinformation erhalten habe, will ich Euch die Typinfo Klasse nicht vorenthalten. Ideen für eine Weiterentwicklung sind jederzeit willkommen. Realisierung hängt von meinen Programmiererfähigkeiten ab.
  Mit Zitat antworten Zitat