AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Automatischer Programmstart mit Übergabeparameter
Thema durchsuchen
Ansicht
Themen-Optionen

Automatischer Programmstart mit Übergabeparameter

Ein Thema von Wilfried Stief · begonnen am 23. Aug 2017 · letzter Beitrag vom 23. Aug 2017
Antwort Antwort
Wilfried Stief

Registriert seit: 6. Jul 2017
5 Beiträge
 
#1

Automatischer Programmstart mit Übergabeparameter

  Alt 23. Aug 2017, 09:10
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Automatischer Programmstart mit Übergabeparameter

  Alt 23. Aug 2017, 09:18
Wenn Du längere Aufgaben (beim Programmstart) durchführst solltest Du die in einen Thread auslagern. Das ist mittlerweile überhaupt kein Hexenwerk mehr.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Automatischer Programmstart mit Übergabeparameter

  Alt 23. Aug 2017, 09:25
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
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#4

AW: Automatischer Programmstart mit Übergabeparameter

  Alt 23. Aug 2017, 09:27
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Aug 2017 um 09:34 Uhr)
  Mit Zitat antworten Zitat
Wilfried Stief

Registriert seit: 6. Jul 2017
5 Beiträge
 
#5

AW: Automatischer Programmstart mit Übergabeparameter

  Alt 23. Aug 2017, 14:07
Danke an alle für die schnellen Reaktionen.
Insbesondere an Frank!
Der Event 'OnIdle' war der Schlüssel zum Erfolg.
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#6

AW: Automatischer Programmstart mit Übergabeparameter

  Alt 23. Aug 2017, 17:29
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.
Miniaturansicht angehängter Grafiken
delphi-ereignisse.jpg  
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:27 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