Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi procedure nach Application.run (https://www.delphipraxis.net/140390-procedure-nach-application-run.html)

Bomberbb 17. Sep 2009 10:53


procedure nach Application.run
 
So nun hab ich mal ne Frage, ob das richtig ist, was ich hier gemacht habe...
Ich will in Abhängigkeit von den Übergabeparametern eine anderes Formular als das Hauptformular Anzeigen lassen und hab das jetzt so gelöst.

Delphi-Quellcode:
//dpr
  Application.Initialize;
  Application.CreateForm(THauptform, Hauptform);
  if (AnsiStrLiComp(PChar(ParamStr(1)),'open',4)=0) then
    Application.ShowMainForm := false; //Hauptformular nicht anzeigen
  PostMessage(Hauptform.Handle, $0433, 0, 0); //Benutzerdefinierte Message an Hauptformular senden
  Application.Run;

//Hauptform
procedure THauptform.WndProc(var Msg: TMessage);
begin
  case Msg.Msg of
    $0433:
      begin //soll auf jeden Fall nach Application.Run laufen
        NebenForm:= TNebenForm.Create(Self);
        NebenForm.NachFormCreate(Self);
        NebenForm.ShowModal;
      end;
  end;
  inherited;
end;
Gibt es da noch eine einfachere Lösung? Gibt es eine Procedure, die auf jeden Fall nach Application.run ausgeführt wird?

Gruß

BBB

nahpets 17. Sep 2009 11:06

Re: procedure nach Application.run
 
Hallo,

ob's so geht weiß ich nicht, versuche es bitte einmal in dieser Art:
Delphi-Quellcode:
//dpr
  Application.Initialize;
  Application.CreateForm(THauptform, Hauptform);
  if (AnsiStrLiComp(PChar(ParamStr(1)),'open',4)=0) then begin
    Application.ShowMainForm := false; //Hauptformular nicht anzeigen
    Hauptform.NebenformShow;
  end;
  Application.Run;

//Hauptform
procedure THauptform.NebenformShow;
begin
  Hide;
  NebenForm:= TNebenForm.Create(Self);
  NebenForm.NachFormCreate(Self);
  NebenForm.ShowModal;
end;

Bomberbb 17. Sep 2009 11:11

Re: procedure nach Application.run
 
Das hatte ich auch schon überlegt, aber dann wird das Formshow ja vor Application.run ausgeführt und das wollte ich möglichst vermeiden ( da würde ja mein ganzes Programm vor Application.run laufen).

mkinzler 17. Sep 2009 11:15

Re: procedure nach Application.run
 
Application.Run ist ja die Hauptprogrammschleife, danach ist erst beim Beenden des Programmes

nahpets 17. Sep 2009 11:23

Re: procedure nach Application.run
 
Hallo,

dachte bisher immer, das Application.Run erst das Programm "zum Laufen" bringt. Eventuell setzt Du für's Hauptform im Objectinspektor Visible auf False und passt den Quelltext noch ein bisserl an:
Delphi-Quellcode:
if (AnsiStrLiComp(PChar(ParamStr(1)),'open',4)=0) then begin
  Application.ShowMainForm := false; // Hauptformular nicht anzeigen
  Hauptform.NebenformShow;
end else begin
  Application.ShowMainForm := True; // Hauptformular anzeigen
end;
In dieser Form mache ich es immer bei solchen Programmen, die einerseits als "bedienbare" Programme mit Oberfläche laufen sollen, aber, wenn sie mit Paramter aufgerufen werden, sich wie Batchprogramme verhalten sollen. Bei diesen "Psuedobatchprogrammen" sorge ich dann dafür, dass Application.Run nicht aufgerufen wird, sondern irgendeine andere Methode im Hauptformular, die die entsprechende Logik enthält. D. H.: Das Application.Run befindet sich im Else-Zweig der If-Abfrage.

Bomberbb 17. Sep 2009 12:11

Re: procedure nach Application.run
 
Und Application.run soll in meinem Fall immer ausgeführt werden. Nur hab ich leider keine Procedure gefunden, die bei Application.run ausgeführt wird, wenn Application.ShowMainForm false ist.

nahpets 17. Sep 2009 12:26

Re: procedure nach Application.run
 
Hallo,
Zitat:

Zitat von Bomberbb
Und Application.run soll in meinem Fall immer ausgeführt werden. Nur hab ich leider keine Procedure gefunden, die bei Application.run ausgeführt wird, wenn Application.ShowMainForm false ist.

wüsste nicht, das es die gibt.

Meiner Meinung nach musst Du vor dem Application.Run "nur" sicherstellen, dass das von Dir gewünschte Formular angezeigt wird.

Okay, habe mal ein bisserl rumgedaddelt, mit den bisherigen Vorschlägen ist Dein Wunsch nicht umzusetzen, deshalb mal folgender Ansatz:

dpr
Delphi-Quellcode:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Hauptformular},
  Unit2 in 'Unit2.pas' {Nebenformular};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(THauptformular, Hauptformular);
  Application.CreateForm(TNebenformular, Nebenformular);
  If ParamStr(1) = 'open' then begin
    Application.MainForm.WindowState := wsMinimized;
    NebenFormular.ShowModal;
  end;
  Application.Run;
end.
Hauptformular
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  THauptformular = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Hauptformular: THauptformular;

implementation

{$R *.dfm}

procedure THauptformular.FormActivate(Sender: TObject);
begin
  If ParamStr(1) = 'open' then begin
    Hauptformular.WindowState := wsMinimized;
  end;
end;

end.
Nebenformular
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TNebenformular = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Nebenformular: TNebenformular;

implementation

{$R *.dfm}

procedure TNebenformular.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  If ParamStr(1) = 'open' then begin
    Close;
    Application.MainForm.Close;
  end;
end;

end.
Eventuell hilft das ja weiter.

Uwe Raabe 17. Sep 2009 12:43

Re: procedure nach Application.run
 
Das MainForm ist immer das, was als erstes erzeugt wird (genauer: mit Application als Owner erzeugt wird). Ich löse das immer folgendermaßen:

In der DPR werden gar keine Formulare erzeugt, sondern lediglich ein Datenmodul. Dieses Datenmodul erzeugt dann im OnCreate die benötigten Formulare je nach Gusto.

Theoretisch kann man diese Mimik eigentlich auch in der DPR unterbringen, allerdings haut einem die IDE mit ihren Automatismen häufig alles kaputt.

Bomberbb 17. Sep 2009 13:54

Re: procedure nach Application.run
 
Bei den Posts hier wird ja Apllication.run nicht ausgeführt, wenn Application.ShowMainForm auf false steht.
Habe noch weiter rumgesucht. Zumindest eine nachfolgende Funktion hab ich nicht gefunden. Wie es aussieht bleiben 4 Möglichkeiten in Application.run weiterzumachen:

1-Windows-Botschaft
2-neuer Thread
3-Timer
4-Application.onidle

Wirklich gefallen tut mir keinee der Alternativen, aber ich muss mich wohl für eine entscheiden...

himitsu 17. Sep 2009 14:00

Re: procedure nach Application.run
 
Es kommt drauf an, was du willst ... hab das irgendwie nicht so richtig verstanden.

Du kannst z.B. auch das Nebenformular zum Hauptformular machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 Uhr.
Seite 1 von 2  1 2      

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