Mir ist nicht klar für was du überhaupt ein angedocktes Fenster benötigst.
Ich vermute du vermischt die Anzeige und das Halten der Daten.
Wenn zum Bild zusätzliche Einstellungen gehören, dann erweitere einfach die Klasse.
Delphi-Quellcode:
TMyColorStyle = (mycsDefault, mycsGray, mycsBlackAndWhite);
TMyPicture = class(TPicture)
private
FColorStyle: TMyColorStyle;
protected
procedure Draw(ACanvas: TCanvas; const Rect: TRect); override;
procedure DrawBlackAndWhite((ACanvas: TCanvas; const Rect: TRect);
procedure DrawGray(ACanvas: TCanvas; const Rect: TRect);
published
property ColorStyle: TMyColorStyle read FColorStyle write FColorStyle;
end;
TMyPictureList = TObjectList<TMyPicture>;
procedure TMyPicture.Draw(ACanvas: TCanvas; const Rect: TRect);
begin
case FColorStyle of
mycsGray: DrawGray(ACanvas, Rect);
mycsBlackAndWhite: DrawBlackAndWhite(ACanvas, Rect);
else
inherited Draw(ACanvas, Rect);
end;
end;
Für die Anzeige genügt eine Paintbox, im OnPaint wird das aktuell ausgewählte Bild mit seinen Einstellungen gezeichnet.
Den Steuerelementen werden die zum Bild gehörenden Einstellungen zugewiesen.
Vereinfacht:
Delphi-Quellcode:
TMyForm = class(TForm)
procedure DoOnTabChanged(Sender: TObject);
procedure DoOnRadioClick(Sender: TObject);
procedure DoOnPaintBoxPaint(Sender: TObject);
private
FPictureList: TMyPictureList;
function GetCurrentPicture: TMyPicture;
end;
procedure TMyForm.DoOnTabChanged(Sender: TObject);
var
Picture: TMyPicture;
ColorStyle: TMyColorStyle;
begin
Picture := GetCurrentPicture;
if Assigned(Picture) then
ColorStyle := Picture.ColorStyle
else
ColorStyle := mycsDefault;
RBtnDefault.Checked := ( ColorStyle = mycsDefault );
RBtnGray.Checked := ( ColorStyle = mycsGray );
RBtnBW.Checked := ( ColorStyle = mycsBlackAndWhite );
{neu zeichnen}
PaintBox.Invalidate;
end;
procedure TMyForm.DoOnRadioClick(Sender: TObject);
var
Picture: TMyPicture;
ColorStyle: TMyColorStyle;
begin
ColorStyle := mycsDefault;
Picture := GetCurrentPicture;
if Assigned(Picture) then
begin
if RBtnBW.Checked then ColorStyle := mycsBlackAndWhite
else if RBtnGray.Checked then ColorStyle := mycsGray;
end;
Picture.ColorStyle := ColorStyle;
{neu zeichnen}
PaintBox.Invalidate;
end;
procedure TMyForm.DoOnPaintBoxPaint(Sender: TObject);
begin
PaintBox.Canvas.StretchDraw(PaintBox.ClientRect, GetCurrentPicture);
end;
function TMyForm.GetCurrentPicture: TMyPicture;
var
idx: Integer;
begin
idx := TabControl.TabIndex;
if (idx >= 0) and (idx < FPictureList.Count) then
Result := FPictureList[idx]
else
Result := nil;
end;