Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Methode umbiegen (https://www.delphipraxis.net/190658-methode-umbiegen.html)

scrat1979 23. Okt 2016 14:22

Methode umbiegen
 
Liebe Delphianer,

es ist mal wieder Zeit für ein kleines Projekt. Ich scheine aber vor lauter Bäumen den Wald nicht mehr zu sehen. Wie kann ich denn eine Methode eines Objektes, welche ich in meinem eigenen Objekt integriert habe, auf eine Procedure in meinem eigenen Objekt umbiegen. Klingt kompliziert oder ich kann mich nicht richtig ausdrücken, daher ein Beispiel:

1. Ich habe eine Klasse TMeineKlasse, in welcher ich einen Timer dynamisch im Constructor erstelle. Nun möchte ich in MEINER Klasse eine Procedure erstellen, welche im OnTimer-Ereignis ausgeführt wird. Später möchte ich in meiner Klasse ein OnTimer-Event integrieren - sollte aber klappen wenn ich mal die Methode umgebogen habe.

2. Auch wenn ich weiß "Eine Frage - Ein Thema", hängt ja irgendwie damit zusammen daher die Frage hier: Wie kann ich denn in MEINER Klasse eine Property Items (z.B. TStrings) erstellen über die ich dann wiederum auf die Items einer dynamisch erzeugten Klasse zugreifen kann (z.B. TStringList im OnCreate erstelle). Ist der richtige Ansatz ein Getter/Setter zu Schreiben und hier eben die Daten aus der "tieferen" TStringLIste auszulesen und weiterzureichen? Ich habe es nicht versucht da ich mir zunächst mal ein Trial&Error ersparen möchte. Sollte das von mir beschrieben Vorgehen korrekt sein reicht mir als Antwort auch ein "Jupp, so geht das" :-)


Leider wurde ich in der Suche nicht fündig, auch wenn dieses Thema bestimmt schon öfters Gegenstand der Diskussion gewesen sein müsste. Vielleicht habe ich auch einfach die falchen Begriffe verwendet.

Schönen Sonntag allen zusammen :-)

himitsu 23. Okt 2016 14:26

AW: Methode umbiegen
 
Du hast eine Event-Methode in diner Klasse (genauso wie sie in der Form wäre, wenn der Timer auf der Form läge), weist beim Erstellen des Teimer deine Methode dem OnTimer-.Property zu und fertig.

Und wenn du selber ein Event haben willst, dann 'nen Feld und eine Publisched Property FOnTimer/OnTimer in deine Klasse, wo du in deinem Event diese gespeicherte Referenz aufrufst.

Klingt einfacher, als es nicht ist.

nahpets 23. Okt 2016 14:28

AW: Methode umbiegen
 
sowas in der Art:
Delphi-Quellcode:
DeinTimer.OnTimer := DeineOnTimerRoutine;

scrat1979 23. Okt 2016 20:29

AW: Methode umbiegen
 
Vielen Dank,

Ich werde es in den nächsten Tagen versuchen aber ich denke, dass ich noch die eine oder andere Frage zum Event-Handling haben werde :)

Grüße!

DeddyH 24. Okt 2016 07:35

AW: Methode umbiegen
 
Ich hab da mal was vorbereitet :mrgreen: (nur ein Formular mit einem Label drauf):
Delphi-Quellcode:
unit Unit5;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TTest = class(TComponent)
  private
    FTimer: TTimer;
    function GetOnTimer: TNotifyEvent;
    procedure SetOnTimer(const Value: TNotifyEvent);
    function GetEnabled: Boolean;
    procedure SetEnabled(const Value: Boolean);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Enabled: Boolean read GetEnabled write SetEnabled;
    property OnTimer: TNotifyEvent read GetOnTimer write SetOnTimer;
  end;

  TfrmKomponentenTest = class(TForm)
    lblTimerFired: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FTest: TTest;
    FZahl: integer;
    procedure DoOnTimer(Sender: TObject);
  public
    { Public-Deklarationen }
  end;

var
  frmKomponentenTest: TfrmKomponentenTest;

implementation

{$R *.dfm}

{ TTest }

constructor TTest.Create(AOwner: TComponent);
begin
  inherited;
  FTimer := TTimer.Create(self);
  FTimer.Enabled := false;
end;

function TTest.GetEnabled: Boolean;
begin
  Result := FTimer.Enabled;
end;

function TTest.GetOnTimer: TNotifyEvent;
begin
  Result := FTimer.OnTimer;
end;

procedure TTest.SetEnabled(const Value: Boolean);
begin
  FTimer.Enabled := Value;
end;

procedure TTest.SetOnTimer(const Value: TNotifyEvent);
begin
  FTimer.OnTimer := Value;
end;

{ TfrmKomponentenTest }

procedure TfrmKomponentenTest.DoOnTimer(Sender: TObject);
begin
  inc(FZahl);
  lblTimerFired.Caption := IntToStr(FZahl);
end;

procedure TfrmKomponentenTest.FormCreate(Sender: TObject);
begin
  FTest := TTest.Create(self);
  FTest.OnTimer := DoOnTimer;
  FTest.Enabled := true;
end;

end.

Aviator 24. Okt 2016 08:47

AW: Methode umbiegen
 
Zitat:

Zitat von DeddyH (Beitrag 1351814)
Ich hab da mal was vorbereitet :mrgreen: (nur ein Formular mit einem Label drauf):

Und nicht vergessen das FormCreate Event zuzuweisen. Sonst fliegt dir da u.U. was um die Ohren. :mrgreen:

EDIT: Ne, um die Ohren wir dir da nix fliegen, aber es passiert einfach nichts.

DeddyH 24. Okt 2016 08:49

AW: Methode umbiegen
 
Was sollte einem da um die Ohren fliegen? Schlimmstenfalls tut sich nix.

Aviator 24. Okt 2016 08:52

AW: Methode umbiegen
 
Zitat:

Zitat von DeddyH (Beitrag 1351827)
Was sollte einem da um die Ohren fliegen? Schlimmstenfalls tut sich nix.

Siehe mein Edit. :cyclops: :stupid:

Das habe ich dann wohl gemacht, als du deinen Beitrag geschrieben hast. Hatte anfangs nicht genau hingeschaut. :roll:

DeddyH 24. Okt 2016 09:01

AW: Methode umbiegen
 
Passiert gelegentlich ;)

scrat1979 26. Okt 2016 16:29

AW: Methode umbiegen
 
Wow!!! Perfekt, ich werde es heute Abend versuchen so zu integrieren und gebe Euch dann Bescheid.

Hier ist man einfach immer perfekt aufgehoben. Danke :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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