![]() |
Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms
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:
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. :gruebel:
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.
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; |
AW: Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms
Da rätsle ich die ganze Zeit rum dabei habe ich die Lösung schon da. :roll:
Delphi-Quellcode:
Wobei ich mich Frage ob es nicht doch möglich ist einen direkteren Zugriff über einen weiteren Parameter zu bekommen.
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; Sowas wie ..
Delphi-Quellcode:
procedure TfrmMain.Progress(Sender: TObject; Caption: TCaption; Progress: TProgressBar);
|
AW: Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms
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; |
AW: Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms
Zitat:
|
AW: Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms
Delphi-Quellcode:
aber...
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; guck mal hier: ![]() Diese Form hat einen eigenen Thread, d.h. Deine Arbeit kann unabhängig vom Form ablaufen. Halte ich für eleganter und richtiger ;-) |
AW: Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms
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; |
AW: Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms
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 ;-) |
AW: Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms
Zitat:
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. |
AW: Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms
Zitat:
|
AW: Eigenes Ereignis/Event in TForm mit Zugriff auf Steuerelemente des Forms
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz