Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TImage Ableitung: Picture property (https://www.delphipraxis.net/132343-timage-ableitung-picture-property.html)

kurtm1 10. Apr 2009 13:55


TImage Ableitung: Picture property
 
Ich muss ein TImage abwandeln und dabei auf Änderung des Properties "Picture" reagieren können.

Sprich falls das Picture geändert wird, soll zusätzlich noch eine Prozedur aufgerufen werden, in der weiterer Code ausgeführt wird.

Weiß wer wie das zu bewerkstelligen ist?

mkinzler 10. Apr 2009 14:00

Re: TImage Ableitung: Picture property
 
Überlade den Setter

kurtm1 10. Apr 2009 14:05

Re: TImage Ableitung: Picture property
 
ok, das ist klar, aber wie ist die korrekte Deklaration dafür?

(Eigentlich reicht es mir auch Picture.Bitmap abzufangen)

mkinzler 10. Apr 2009 14:10

Re: TImage Ableitung: Picture property
 
Zitat:

ok, das ist klar, aber wie ist die korrekte Deklaration dafür?
http://www.delphipraxis.net/internal...t.php?t=126030
Zitat:

(Eigentlich reicht es mir auch Picture.Bitmap abzufangen)
Dann müsstest du TPicture ableiten und mit der abgeleiteten arbeiten

kurtm1 27. Apr 2009 15:46

Re: TImage Ableitung: Picture property
 
Werde daraus noch immer nicht schlau...

Timage.Picture ist folgendermaßen deklariert:
Delphi-Quellcode:
published property Picture: TPicture read FPicture write SetPicture;
Muss ich "FPicture" auch anlegen, wenn ich eigentlich nur die "write" Methode ändern möchte?

Andreas L. 27. Apr 2009 15:57

Re: TImage Ableitung: Picture property
 
Zitat:

Zitat von kurtm1
Werde daraus noch immer nicht schlau...

Timage.Picture ist folgendermaßen deklariert:
Delphi-Quellcode:
published property Picture: TPicture read FPicture write SetPicture;
Muss ich "FPicture" auch anlegen, wenn ich eigentlich nur die "write" Methode ändern möchte?

Nein brauchst du nicht:

Delphi-Quellcode:
type
  TMyImage = class(TImage)
  protected
    function GetPicture:TPicture;
    procedure SetPicture(Value: TPicture);
  published
    property Picture: TPicture read GetPicture write SetPicture;
  end;

...
...

function TMyImage.GetPicture:TPicture;
begin
  Result := inherited Picture; //u. U. mit .Assign()
end;

procedure TMyImage.SetPicture(Value: TPicture);
begin
  //mach irgendwas besonderes
  inherited Picture := Value;
end;
Edit: Über inherited kannst du auf Eigenschaften und Methoden der Vorfahrenklasse zugreifen

kurtm1 27. Apr 2009 16:06

Re: TImage Ableitung: Picture property
 
perfekt, danke!!

kurtm1 27. Apr 2009 16:45

Re: TImage Ableitung: Picture property
 
Noch eine Frage:
Kann man das selbe auch irgendwie direkt für Timage.Picture.Bitmap machen?

Andreas L. 27. Apr 2009 16:52

Re: TImage Ableitung: Picture property
 
Zitat:

Zitat von kurtm1
Noch eine Frage:
Kann man das selbe auch irgendwie direkt für Timage.Picture.Bitmap machen?

Siehe
Zitat:

Zitat von mkinzler
Dann müsstest du TPicture ableiten und mit der abgeleiteten arbeiten


shmia 27. Apr 2009 17:12

Re: TImage Ableitung: Picture property
 
Man sollte eigentlich keine VCL Controls nur deshalb ableiten, um "Businesslogik" der eigenen Anwendung dort unterzubringen.
Jede Ableitung von VCL Controls bringt nur später Probleme mit sich. (z.B. wenn man den Sourcecode weitergeben möchte)
Wenn man völlige neue Funktionalitäten bereitstellen möchte, die man im Prinzip in jeder Anwendung gebrauchen könnte,
dann ist das Ableiten und erstellen neuer Controls bzw. Komponenten natürlich erlaubt.


Der richtige Weg wäre eine eigene Klasse, die das alleinige Recht hat auf dem Image etwas zu zeichen.
Jeder, der etwas auf dem Image zeichnen möchte, macht das nicht direkt, sondern "sagt" das dieser neuen Klasse.
Diese Klasse könnte z.B. folgende Methoden haben:
Delphi-Quellcode:
TMyImageProxy = class(TObject)
private
  FImage : TImage;
...
protected
  procedure ZusaetzlicheArbeitAmBild;
public
  function BeginPaint:TCanvas;
  procedure EndPaint;
  procedure SetPicture(APicture:TPicture);

  property Image:TImage read FImage write SetImage;
end;
Wenn man jetzt auf dem Image etwas zeichnen möchte, ruft man BeginPaint() auf, zeichnet was man möchte und ruft zum Schluss EndPaint auf.
Die Methode EndPaint() ruft dann noch ZusaetzlicheArbeitAmBild() auf.

Du wirst sehen, dass diese zusätzliche Klasse deine Programmlogik viel besser abbilden und kanalisieren kann, als das durch Ableiten von TImage möglich wäre.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz