Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Automatischer Programmstart mit Übergabeparameter (https://www.delphipraxis.net/193626-automatischer-programmstart-mit-uebergabeparameter.html)

Wilfried Stief 23. Aug 2017 09:10

Automatischer Programmstart mit Übergabeparameter
 
Hallo an alle,

ich habe ein Problem mit einem bestehenden Programm das ich auf Delphi 5 und Windows 10 zurückgeführt habe. Nun muss ich feststellen diese Problem tritt auch unter Delphi 10.2 auf.
Zur Programmbeschreibung.
Das Programm hat ein Bedienfenster in dem die Aufgaben für den Programmablauf eingegeben werden. Der Ablauf der Aufgabe wird dann mit der Start-Button gestartet. Vom Eingabefenster aus kann auch ein Statusfenster zur Anzeige des Programmablaufes aufgerufen werden.
Das Programm bietet die Möglichkeit auch mit Übergabeparametern aufgerufen zu werden. Die Aufgabe wird dann sofort gestartet, das Eingabefenster und das Statusfenster werden dabei angezeigt.
Nun zum Problem.
Wird nach dem Parameterstart das Statusfenster aus und wieder eingeschaltet, dann reagiert das Programm danach auf keine weiteren Ereignisse über Buttons oder ähnliches mehr. Die Ausführung wird fortgesetzt und kann nur zwangsweise über den Taskmanager oder den Debugger beendet werden.
Beim Start des Programmes über den Start-Button (nach vollständigem Ablauf von FormActive) tritt dieser Effekt nicht auf.

Meine Vermutung ist, dass für dieses Verhalten beim Parameterstart, die nicht vollständig abgelaufene FormActivate-Prozedur verantwortlich ist da dort, ziemlich am Ende, der Parameterstart aufgerufen wird.

Kennt jemand das Problem oder kann man den Parameterstart auch anders auslösen ?

Sherlock 23. Aug 2017 09:18

AW: Automatischer Programmstart mit Übergabeparameter
 
Wenn Du längere Aufgaben (beim Programmstart) durchführst solltest Du die in einen Thread auslagern. Das ist mittlerweile überhaupt kein Hexenwerk mehr.

Sherlock

dataspider 23. Aug 2017 09:25

AW: Automatischer Programmstart mit Übergabeparameter
 
Ich habe diese Konstellation auch in einigen Tools.

Zum Start nutze ich Application.OnIdle.
Das funktioniert sicher...

Delphi-Quellcode:
...
procedure TfrmMain.AfterConstruction;
begin
  inherited;
  Application.OnIdle := ApplicationIdle;
end;
...
procedure TfrmMain.ApplicationIdle(Sender: TObject; var Done: Boolean);
begin
  Application.OnIdle := nil;
  BeginneAktionen;
end;
Frank

himitsu 23. Aug 2017 09:27

AW: Automatischer Programmstart mit Übergabeparameter
 
Und es kommt auch drauf an wo und wie due die Parameter auswertest und wie/wo dann die Aktionen ausgeführt werden.


PS: Wenn es sonst alles geht, dann könnte man fast auf die blöde Idee kommen, dass Auswerten der Start-Parameter im OnActivate OnShow zu erledigen.

Und was ist eigentlich im OnActivate schon alles drin?
Du weißt hoffentlich, dass dieses nicht "Programm gestartet", sondern "Form hat Eingabefokus bekommen" heißt und OnActivate jedesmal ausgeführt wird, wenn die Form den Fokus bekommt. (beim Wechsel von Forms innerhalb der Anwendung ... Application.OnActivate von/zu Forms anderer Anwendungen)


Wenn beim Programmstart mehrere Forms/Datenmodule "automatisch" geladen werden, dann sollte man auch auf die Erstellungsreihenfolge Derer achten. (siehe Projektoptionen oder in der DPR)

Auch zu Beachten ist die veränderte Behandlung von OnCreate bei Forms.
In alten Delphiversionen am Ende des Constructors, nach dem Laden der DFM.
In neueren Delphiversionen erst im AfterConstruction. (beim Upgrade von alten Projekten muß man die OldCreaeOrder erst umschalten, für das neue Verhalten)
Delphi-Referenz durchsuchenVcl.Forms.TCustomForm.OldCreateOrder
Delphi-Referenz durchsuchenVcl.Forms.TForm.OnCreate

Wilfried Stief 23. Aug 2017 14:07

AW: Automatischer Programmstart mit Übergabeparameter
 
Danke an alle für die schnellen Reaktionen.
Insbesondere an Frank!
Der Event 'OnIdle' war der Schlüssel zum Erfolg.

t.roller 23. Aug 2017 17:29

AW: Automatischer Programmstart mit Übergabeparameter
 
Liste der Anhänge anzeigen (Anzahl: 1)
Man kann sich anzeigen lassen, wann welche Ereignisse auftreten:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure ApplicationIdle(Sender: TObject; var Done: Boolean);
    procedure FormActivate(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure FormDblClick(Sender: TObject);
    procedure FormHide(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseEnter(Sender: TObject);
    procedure FormMouseLeave(Sender: TObject);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormResize(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationIdle(Sender: TObject; var Done: Boolean);
begin
  Application.OnIdle := nil;
  Memo1.Lines.Add('ApplicationIdle: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
Memo1.Lines.Add('Activate: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormClick(Sender: TObject);
begin
Memo1.Lines.Add('OnClick: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.Add('Create: '+formatdatetime('hh:nn:ss.zzz', TIME));
Application.OnIdle := ApplicationIdle;
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
Memo1.Lines.Add('OnDblClick: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormHide(Sender: TObject);
begin
Memo1.Lines.Add('OnHide: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
Memo1.Lines.Add('OnKeyDown: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
Memo1.Lines.Add('OnKeyPress: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Memo1.Lines.Add('OnKeyUp: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Memo1.Lines.Add('OnMouseDown: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormMouseEnter(Sender: TObject);
begin
Memo1.Lines.Add('OnMouseEnter: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormMouseLeave(Sender: TObject);
begin
Memo1.Lines.Add('OnMouseLeave: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Memo1.Lines.Add('OnMouseUp: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormResize(Sender: TObject);
begin
Memo1.Lines.Add('OnFormResize: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Memo1.Lines.Add('Show: '+formatdatetime('hh:nn:ss.zzz', TIME));
end;

end.


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