Einzelnen Beitrag anzeigen

TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#1

Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms

  Alt 18. Mai 2017, 10:29
Hallo,

die Überschrift klingt vielleicht komplizierter als es tatsächlich ist. Aber fangen wir erst mal damit an was ich vorhabe. Ich habe einen einfachen Dialog mit einem Fortschrittsbalken und zwei Label erstellt, diesen Dialog möchte ich jetzt universal in einem Programm an mehreren Stellen verwenden. Ich hatte daraufhin überlegt ob ich das über ein Event regeln kann, das hätte den Vorteil ich müsste nicht alle Fortschrittsanzeigen die ich benötige in den Dialog verlagern oder für jeden Fall einen komplett eigenen Dialog erstellen und das beste wäre das die Aufgabe die abgearbeitet werden soll auch in der Unit verbleiben kann wo sie hingehört. Ich habe nur keine Ahnung wie ich den Zugriff auf die Steuerelemente des Dialogs realisieren soll und ob es überhaupt eine Möglichkeit gibt dies so zu tun.

Delphi-Quellcode:
unit uProgressDialog;

interface

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

type
  TOnProgressEvent = procedure(Sender: TObject) of Object;

  TfrmProgressDialog = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    ProgressBar1: TProgressBar;
    Button1: TButton;
    TimerStartOnProgress: TTimer;
    function GetOnProgress: TOnProgressEvent;
    procedure SetOnProgress(Event: TOnProgressEvent);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TimerStartOnProgressTimer(Sender: TObject);
  private
    { Private-Deklarationen }
    FOnProgress: TOnProgressEvent;
  public
    { Public-Deklarationen }
    property OnProgress: TOnProgressEvent read GetOnProgress write SetOnProgress;
  end;

var
  frmProgressDialog: TfrmProgressDialog;

implementation

{$R *.dfm}

{ TfrmProgressDialog }

procedure TfrmProgressDialog.FormCreate(Sender: TObject);
begin
  //init
  TimerStartOnProgress.Enabled := False;
  TimerStartOnProgress.Interval := 250;
end;

procedure TfrmProgressDialog.FormShow(Sender: TObject);
begin
  //Timer aktivieren
  TimerStartOnProgress.Enabled := True;
end;

function TfrmProgressDialog.GetOnProgress: TOnProgressEvent;
begin
  result := FOnProgress;
end;

procedure TfrmProgressDialog.SetOnProgress(Event: TOnProgressEvent);
begin
  FOnProgress := Event;
end;

procedure TfrmProgressDialog.TimerStartOnProgressTimer(Sender: TObject);
begin
  //Timer deaktivieren
  TimerStartOnProgress.Enabled := False;

  //Ereignis ausführen...
  if Assigned(FOnProgress) then FOnProgress(Self);
end;

end.
Der Aufruf würde dann jeweils wie folgt statt finden. Es wird in der Unit in der der Fortschrittsbalken benötigt wird ein Ereignis erstellt und dann wird nur noch der Dialog aufgerufen und die vorher definierte Aufgabe wird ausgeführt. Die Schwierigkeit ist nur wie bekomme ich innerhalb der Prozedur zugriff auf die Steuerelemente des Dialogs.

Delphi-Quellcode:
procedure TfrmMain.Button1Click(Sender: TObject);
begin
  //Dialog erzeugen
  if frmProgressDialog = nil then frmProgressDialog := TfrmProgressDialog.Create(Application);
  try
    //Ereignis zuweisen
    frmProgressDialog.OnProgress := Progress;

    //Dialog anzeigen und das Ereignis verzögert ausführen
    frmProgressDialog.ShowModal;
  finally
    frmProgressDialog.Free;
  end;{try..finally}
  
end;

procedure TfrmMain.Progress(Sender: TObject);
begin
  {
  Hier müsste der Zugriff auf die verschiedenen Steuerelemente des Dialogs möglich sein

    - Fenster Überschrift (TFrom.Caption)
    - 2x Label (TLabel.Caption)
    - Fortschrittsbalken (TProgressBar)   
  }
   
end;
  Mit Zitat antworten Zitat