ich versuche mich daran in einer Komponente einen Property Editor zu erzeugen um eine PNG mittels Objekt Inspektor zu laden. Vorgegangen bin ich nach folgendem Wiki Artikel:
https://wiki.freepascal.org/How_To_Writ ... ty_editors
Ich bin nun soweit das ich beim Klicken in den OI in der Edit Procedure des Editors lande. Dort öffne ich einen Dialog um eine PNG zu wählen. Leider begreife ich nicht wie ich nun die PNG an die Set-Procedure der Komponente übergeben muss. Ich hab auch nichts zu den Befehlen "GetObjectValue" und "SetPtrValue" gefunden um deren Funktion zu ergründen.
Hier mal einer meiner erfolglosen Versuche, ich würde mich sehr freuen wenn mir jemand sagen könnte was ich da ändern muss:
Code: Alles auswählen
unit EditTest;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
  PropEdits;
  //Neue Anforderung IDEIntf
type
  { TPNGProperty }
  TPNGProperty = class (TClassPropertyEditor)
  public
   procedure Edit; Override;
   function  GetValue: string;Override;
   function  GetAttributes: TPropertyAttributes; Override;
  end;
type
  { TEditTest }
  TEditTest = class(TCustomControl)
  private
    FPNG: TPortableNetworkGraphic;
    procedure SetPNG(AValue: TPortableNetworkGraphic);
  protected
  public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   procedure Paint; override;
  published
   property PNG : TPortableNetworkGraphic read FPNG write SetPNG;
  end;
procedure Register;
implementation
procedure Register;
begin
  {$I edittest_icon.lrs}
  RegisterComponents('Standard',[TEditTest]);
  RegisterPropertyEditor(TypeInfo(TPortableNetworkGraphic),nil,'PNG',TPNGProperty);
end;
{ TPNGProperty }
procedure TPNGProperty.Edit;
var OpenDialog : TOpenDialog;
    TmpPng     : TPortableNetworkGraphic;
    TmpEditTest: TEditTest;
begin
  //inherited Edit;
  //showmessage('Edit');
  try
   TmpEditTest := TEditTest.Create(nil);
    //showmessage('1');
   TmpEditTest := TEditTest(GetObjectValue(TEditTest));
    //showmessage('2');
   TmpPNG      := TPortableNetworkGraphic.Create;
    //showmessage('3');
   OpenDialog  := TOpenDialog.Create(nil);
    //showmessage('4');
   if OpenDialog.Execute then
   TmpPNG.LoadFromFile(OpenDialog.FileName);
    //showmessage('5');
   TmpEditTest.FPNG.Assign(TmpPNG);
   SetPtrValue(TmpEditTest.PNG);
  finally
   OpenDialog.Free;
   TmpPng.Free;
   TmpEditTest.Free;
  end;
end;
function TPNGProperty.GetValue: string;
begin
  //Result:=inherited GetValue;
  result := 'TPortableNetworkGraphic';
end;
function TPNGProperty.GetAttributes: TPropertyAttributes;
begin
  //Result:=inherited GetAttributes;
  Result := [paMultiSelect, paDialog];
end;
{ TEditTest }
procedure TEditTest.SetPNG(AValue: TPortableNetworkGraphic);
begin
  if FPNG=AValue then Exit;
  FPNG.Assign(aValue);
  //showmessage('SetPng');
  Invalidate;
end;
constructor TEditTest.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  width  := 40;
  height := 40;
  FPNG   := TPortableNetworkGraphic.Create;
end;
destructor TEditTest.Destroy;
begin
  inherited Destroy;
  FPNG.Free;
end;
procedure TEditTest.Paint;
begin
  inherited Paint;
  canvas.Brush.Color:= clwhite;
  canvas.FillRect(0,0,width,height);
  canvas.Draw(0,0,FPNG);
end;
end.
Bernd
 
  Verein
Verein 
 Links
Links Suche
Suche