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