AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms

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

Ein Thema von TUX_der_Pinguin · begonnen am 18. Mai 2017 · letzter Beitrag vom 19. Mai 2017
Antwort Antwort
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
602 Beiträge
 
Delphi 10.4 Sydney
 
#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
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
602 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 18. Mai 2017, 10:58
Da rätsle ich die ganze Zeit rum dabei habe ich die Lösung schon da.

Delphi-Quellcode:
procedure TfrmMain.Progress(Sender: TObject);
var
  Idx: Integer;
  
begin

  with TfrmProgressDialog(Sender) do
  begin

    Caption := 'bla bla';

    Label1.Caption := 'ldkfdlkfdo';

    ProgressBar1.Min := 0;
    ProgressBar1.Max := 100;
    ProgressBar1.Step := 1;
 
    for Idx := 1 to 100 do
    begin
      ProgressBar1.StepIt;
      Application.ProcessMessages;
      Sleep(500);
    end;
    
    Close;

  end;
end;
Wobei ich mich Frage ob es nicht doch möglich ist einen direkteren Zugriff über einen weiteren Parameter zu bekommen.

Sowas wie ..
procedure TfrmMain.Progress(Sender: TObject; Caption: TCaption; Progress: TProgressBar);
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
666 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 18. Mai 2017, 11:19
ok, wenn ich das richtig verstehe....
1. Du erzeugst deinen Progressdialog und weist ihm einen Event zu.
2. Du rufst den Dialog "Modal" auf
3. Dein Timer feuert, ruft den Event auf.
4 Der Event ändert die properties
5. Der Event schließt den Dialog?

Ganz ehrlich den Flow verstehe ich nicht.

Delphi-Quellcode:
procedure TfrmMain.Progress(Sender: TObject);
var
  Idx: Integer;
  
begin

  with TfrmProgressDialog(Sender) do
  begin

    Caption := 'bla bla';

    Label1.Caption := 'ldkfdlkfdo';

    ProgressBar1.Min := 0;
    ProgressBar1.Max := 100;
    ProgressBar1.Step := 1;
 
    for Idx := 1 to 100 do
    begin
      ProgressBar1.StepIt;
      Application.ProcessMessages;
      Sleep(500);
    end;
    
    Close;

  end;
end;
Fritz Westermann
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
602 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 18. Mai 2017, 11:26
ok, wenn ich das richtig verstehe....
1. Du erzeugst deinen Progressdialog und weist ihm einen Event zu.
2. Du rufst den Dialog "Modal" auf
3. Dein Timer feuert, ruft den Event auf.
4 Der Event ändert die properties
5. Der Event schließt den Dialog?

Ganz ehrlich den Flow verstehe ich nicht.
Das mit dem Timer habe ich nur gemacht damit der Dialog auch sichtbar ist, würde ich das Ereignis schon in OnCreate oder OnShow des Dialogs aufrufen wird dieser zwar ausgeführt aber der Anwender sieht davon nichts.
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
439 Beiträge
 
Delphi 10.3 Rio
 
#5

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

  Alt 18. Mai 2017, 12:52
Delphi-Quellcode:
public TfrmProgressDialog.SetProperties(const AFormCaption: string; const ALabel01Caption: string; ...; AProgressMax: integer);
begin
  Self.Caption := AFormCaption;
  ...
end;


with TfrmProgressDialog(Sender) do
begin
  SetProperties('blah', 'ldkf', ..., 100);
end;
aber...

guck mal hier: TPBThreadedSplashscreen
Diese Form hat einen eigenen Thread, d.h. Deine Arbeit kann unabhängig vom Form ablaufen.
Halte ich für eleganter und richtiger
Nr.1 Delphi-Tool: [F7]

Geändert von ConnorMcLeod (18. Mai 2017 um 15:29 Uhr)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
887 Beiträge
 
#6

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

  Alt 18. Mai 2017, 13:57
Und ich würde dieses grauenvolle with weglassen.
Ich bin damit auch so oft auf die Fresse gefallen....gerade beim Debuggen, aber auch beim lesen vom Code weiß man schneller worauf sich z.B. das Close bezieht, wenn man vlt. den oberen Teil der Procedure nicht sehen kann.

Vielleicht so:
Delphi-Quellcode:
procedure TfrmMain.Progress(Sender: TObject);
var
   Idx: Integer;
   ProgressFrm: TForm;
begin
   if Sender is TfrmProgressDialog then
   begin
     ProgressFrm:=(Sender as TfrmProgressDialog);
     ProgressFrm.Caption := 'bla bla';

     ProgressFrm.Label1.Caption := 'ldkfdlkfdo';

     ProgressFrm.ProgressBar1.Min := 0;
     ProgressFrm.ProgressBar1.Max := 100;
     ProgressFrm.ProgressBar1.Step := 1;
  
     for Idx := 1 to 100 do
     begin
       ProgressFrm.ProgressBar1.StepIt;
       Application.ProcessMessages;
       Sleep(500);
     end;
     
     ProgressFrm.Close;
    
   end;

end;
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
439 Beiträge
 
Delphi 10.3 Rio
 
#7

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

  Alt 18. Mai 2017, 15:28
Ja, klar. Ich wollte nur so nah am Original bleiben, wie möglich.
Soweit ich informiert bin, macht der Compiler nichts anderes, als im Falle von WITH eben so eine Hilfsvariable anzulegen. Kann man also genausogut gleich selber machen und die Lesbarkeit boosten
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
887 Beiträge
 
#8

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

  Alt 18. Mai 2017, 16:17
Ja, klar. Ich wollte nur so nah am Original bleiben, wie möglich.
Soweit ich informiert bin, macht der Compiler nichts anderes, als im Falle von WITH eben so eine Hilfsvariable anzulegen. Kann man also genausogut gleich selber machen und die Lesbarkeit boosten
Du warst damit gar nicht gemeint Das ging eher an TUX.
Aber unabhängig von der Lesbarkeit wird's beim debuggen dann mal richtig interessant. Wenn du dann nämlich Stundenlang nach einem Fehler suchst, den du a) ohne with gar nicht erst gemacht hättest und b) trotz allem dann in wenigen Sekunden gefunden hättest. Ist mir selber schon passiert.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
602 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 19. Mai 2017, 07:48
Ja, klar. Ich wollte nur so nah am Original bleiben, wie möglich.
Soweit ich informiert bin, macht der Compiler nichts anderes, als im Falle von WITH eben so eine Hilfsvariable anzulegen. Kann man also genausogut gleich selber machen und die Lesbarkeit boosten
Du warst damit gar nicht gemeint Das ging eher an TUX.
Aber unabhängig von der Lesbarkeit wird's beim debuggen dann mal richtig interessant. Wenn du dann nämlich Stundenlang nach einem Fehler suchst, den du a) ohne with gar nicht erst gemacht hättest und b) trotz allem dann in wenigen Sekunden gefunden hättest. Ist mir selber schon passiert.
Ich weiß ich bin auch schon das ein oder andere mal über ein 'with' gestolpert aber den Rest der Zeit sehe ich es eher als Vorteil und nicht als einen Nachteil.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.608 Beiträge
 
Delphi 10.3 Rio
 
#10

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

  Alt 19. Mai 2017, 10:17
Hast du mal über Frames nachgedacht? Vorteil ist, dass du dir das Frame nur einmal basteln musst und kannst es dann im ganzen Programm immer wieder verwenden. Die Logik kann komplett im Frame verschwinden. Dann gibst du dem Frame ein paar public Proceduren mit denen du die minimale, maximale und aktuelle Position der ProgressBar setzen kannst und schon bist du fertig.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf