Zitat von
sx2008:
Dein Fehler ist schon mal, dass du eine ganz konkrete Klasse TPngObject verwendest.
Richtig wäre, die Klasse
TPicture zu verwenden:
property UpPicture: TPicture read FUpPic write SetUpPic;
Durch die Verwendung von TPicture kann man beliebige Bilder BMP, GIF, JPEG, PNG,... laden.
Vorraussetzung zum Laden von PNG-Bildern ist aber, dass die
Unit pngimage eingebunden ist.
Diese
Unit wird aber auch schon zur Entwicklungszeit benötigt!!!
Daher musst du dir ein Designtime-
Package erstellen, die
Unit pgnimage hinzufügen und in der
IDE installieren.
Dazu muss man wissen, dass Delphi ein Plugin-System für Grafiken hat.
Nur wenn die
Unit pngimage dieses Plugin-System richtig verwendet, kann die ganze Sache funktionieren.
Neue Grafiktypen müssen über TPicture.RegisterFileFormat in der
VCL registriert werden.
Wenn also RegisterFileFormat im Abschnitt Initialization der
Unit pngimage nicht aufgerufen wird, dann läuft etwas falsch.
Diese Aussage stimmt zwar schon - jedoch nicht in diesem Fall: er benutzt TPngImage zur Laufzeit, somit wird kein DesignTime-
Package benötigt. Ich glaube eher, dass es für den JvInspector keinen Editor für das TPngObject gibt. Somit musst du dem JvInspector erstmal einen Editor für TPngObjects bastelt. Wie genau das funktioniert, kannst du im Source vom JvInspector nachschauen - anhand der bereits eingebundenen Objekte.
So würde es jedenfalls ungefähr ausschauen:
Delphi-Quellcode:
type
TJvInspectorPngImage = class(TJvInspectorStringItem)
protected
procedure Edit; override;
function GetDisplayValue: string; override;
procedure SetFlags(const Value: TInspectorItemFlags); override;
end;
procedure TJvInspectorPngImage.Edit;
begin
// Hier musst du eine Handling-Routine für ein TPngObject einbauen
end;
procedure TJvInspectorPngImage.SetFlags(const Value: TInspectorItemFlags);
var
NewValue: TInspectorItemFlags;
begin
// Dieser Editortyp hat einen Editor-Button (...) und der Text ist ReadOnly
NewValue := Value + [iifEditButton, iifEditFixed];
inherited SetFlags(NewValue);
end;
function TJvInspectorPngImage.GetDisplayValue: string;
begin
if TPngImage(Pointer(Data.AsOrdinal)).Empty then
result := '(leer)'
else
result := 'TPngImage';
end;
initialization
TJvCustomInspectorData.ItemRegister.Add(
TJvInspectorTypeInfoRegItem.Create(TJvInspectorPngImage, TypeInfo(TPngObject))
);
Ich weiß jetzt nicht, ob das so alles funktioniert, ist jetzt einfach so aus dem Kopf heraus geschrieben. Ist ja nur zur verdeutlichung