Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Neue TPanel-Klasse (https://www.delphipraxis.net/23155-neue-tpanel-klasse.html)

alcaeus 29. Mai 2004 19:08


Neue TPanel-Klasse
 
Hi! Ich leite eine Klasse von TPanel ab, die beim Resizen etwas bestimmtes machen soll. Zusätzlich soll der Programmierer immer noch das "normale" OnResize behandeln können, ohne dass dabei das vorherige überschrieben wird. Ich hoffe es war einigermaßen verständlich. Kann mir bitte jemand weiterhelfen?

Greetz
alcaeus

Nikolas 29. Mai 2004 19:45

Re: Neue TPanel-Klasse
 
Kannst du nicht per inherited das alte OnReszise übernehmen und dahinter schreiben, was ausserdem noch gemacht werden soll?

SirThornberry 29. Mai 2004 19:55

Re: Neue TPanel-Klasse
 
das einfachste ist "SetBounds" zu überschreiben und wenn sich "width" oder "height" ändert dann kannst du ja reagieren...

Delphi-Quellcode:
  TYourpanel = class(TPanel)
  protected
    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
[...]

procedure TYourpanel.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var Sizechanged: Boolean;
begin
  sizechanged := (AWidht <> Width) or (AHeight <> AHeight);
  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
  if sizechanged then
  begin
    //do something you want todo onResize
  end;
end;

Skiron 29. Mai 2004 19:59

Re: Neue TPanel-Klasse
 
Wenn ich dein Problem richtig verstanden habe, dann ist das folgendes:

du hast 'ne klasse, abbgeleitet von TPanel
Du selbst möchtest das OnResize verwenden, d.h. in der Klasse drinnen. Trotzdem sollte es dem User möglich sein, sein OnResize zu verwenden.
Das Eigentliche Problem ist dann halt ein Namenproblem, z.B. das Resize-Event des benutzers könnte dann OnNewResize heißen, dann könntest du folgendes machen:

Delphi-Quellcode:
type
  TMyPanel = class(TPanel)
  protected
    FOnNewResize: TNotifyEvent;
    property OnResize;
    procedure InternResize(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property OnNewResize read FOnNewResize write FOnNewResize;
  end;

implementation

constructor TMyPanel.Create(AOwner: TComponent);
begin
  inherited;
  OnResize := InternResize;
end;

procedure TMyPanel.InternResize(Sender: TObject);
begin
  if Assigned(OnNewResize) then
    FOnNewResize(Sender);
end;
hab aber keine garantie, dass alles funzt, müsst aber ein lösungsansatz sein...


[Edit] Zu langsam.... [/Edit]

SirThornberry 29. Mai 2004 20:07

Re: Neue TPanel-Klasse
 
@Skyron: das mit dem namen ist nicht so ein problem, auf deine art und weise kann man das so lösen
Delphi-Quellcode:
  TMyPanel = class(TPanel)
  private
    FOnResize: TNotifyEvent;
    procedure FOnResizeProc(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property OnResize read FOnResize write FOnResize;
  end;

implementation

constructor TMyPanel.Create(AOwner: TComponent);
begin
  inherited;
  inherited OnResize := FOnResizeProc;
end;

procedure TMyPanel.FOnResizeProc(Sender: TObject);
begin
  if Assigned(FOnResize) then FOnResize(Self);
  //do something you want....
end;
man überschreibt im prinzip das orginale "OnResize" und weißt dem orginalen OnResize mit inherited die procedure zu

Skiron 29. Mai 2004 20:10

Re: Neue TPanel-Klasse
 
Das versteh ich jetzt nicht...
Sind da dann 2 OnResize? wird beim überschreiben das alte nicht überschrieben?

SirThornberry 29. Mai 2004 20:21

Re: Neue TPanel-Klasse
 
das alte wird schon überschrieben aber ich kann ja auf das alte noch mit "inherited" zugreifen. Wenn du in den Constructor schaust wirst du sehen das ich dem "inherited OnResize" die Procedure zuweise..

alcaeus 29. Mai 2004 20:38

Re: Neue TPanel-Klasse
 
Also, kann ich jetzt davon ausgehen dass der Code von SirThornberry funktioniert? Wenn ja, heißt das für den Programmierer sichtbare Ereignis immer noch OnResize? Das heißt ich kann im Benutzer-Resize ganz normalen Code schreiben, ohne lang ein inherited davor setztn zu müssen, oder? Bitte sagt mir was richtig ist, ich kenne mich bei den Sachen noch nicht so richtig aus.

Greetz
alcaeus

alcaeus 29. Mai 2004 21:13

Re: Neue TPanel-Klasse
 
Dankeschön SirT, dein Code hat funktioniert. Füge ich nun die Behandlungsroutine für das neue Panel ein, so erscheint automatisch das Wort inherited. Gute Arbeit, danke nochmals :thumb:

Greetz
alcaeus

teebee 29. Mai 2004 21:15

Re: Neue TPanel-Klasse
 
Das einfachste ist, das Standard-Resize zu überschreiben, darin wird nämlich OnResize aufgerufen, falls es nicht Nil ist.
Delphi-Quellcode:
...
Procedure Resize; override;
...
Procedure TMyPanel.Resize;
Begin
 // alles tun, was zu tun ist
 // dann das Original-Resize
 inherited;
End;
Gruß, teebee


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr.
Seite 1 von 2  1 2      

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