Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars (https://www.delphipraxis.net/187615-fremde-anwendung-modal-starten-neuzeichnen-des-eigenen-formulars.html)

ernschd 15. Dez 2015 08:55

Delphi-Version: 2007

Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

mit folgendem Code öffne ich erfolgreich ein fremdes Programm "modal":

Delphi-Quellcode:
FillChar(info, sizeof(info), 0);
  info.cbSize := sizeOf(info);
  info.lpVerb := 'open';
  info.lpFile := PChar(CmdLine);
  info.lpParameters := PChar(parameters);
  info.nShow := SW_SHOW;
  info.fMask := SEE_MASK_NOCLOSEPROCESS;

  ShellExecuteEx(@info);
  WaitForSingleObject(info.hProcess, Infinite);
Leider friert mir dabei mein Hauptformular ein, bzw. benötigt ein Refresh, wenn das fremde Programm im Fenster darüber gezogen wird (siehe Screenshot).

Wie kann ich das Formular neu zeichnen lassen oder dieses Verhalten umgehen? Ich habe auch schon vor dem ShellExecuteEx das Hauptformular ausgeblendet, aber das könnte den Anwender verwirren.

Danke und Grüße

mm1256 15. Dez 2015 09:05

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Delphi-Quellcode:
    if info.hProcess > 32 then begin
      WaitForInputIdle(info.hProcess, INFINITE);
      WaitForSingleObject(info.hProcess, INFINITE);
    end;

ernschd 15. Dez 2015 09:09

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Funktioniert leider nicht bei mir, es sieht noch genau so aus :(

himitsu 15. Dez 2015 09:26

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Wenn DU sagst "Warte bis fertig und mache nix Anderes", dann macht Delphi das auch.

Code in einen Thread auslagern
ODER
kein INFINITE, sondern ab und an mal
Delphi-Quellcode:
Application.ProcressMessage;
, in einer Schleife. :roll:

ernschd 15. Dez 2015 09:47

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Ok, danke, ich habe es so gelöst:

Delphi-Quellcode:
while WaitForSingleObject(info.hProcess, 50) = Wait_Object_0 do
    Application.ProcessMessages;
Edit
Die Lösung hat nur den kleinen Nachteil, dass die fremde Anwendung nicht mehr modal ist. Ich kann also munter in meinem Hauptformular rumklicken...

Sir Rufo 15. Dez 2015 10:02

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Wie schaltet man die eigene Anwendung in so einen modalen Zustand?

In dem man eine Form modal anzeigt?

himitsu 15. Dez 2015 10:03

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
In einem "modalen" Fenster kann man auch rumklicken, wenn die Anwendung richtig läuft. :angle:


PS: vorher z.B. Enabled der Form auf False setzen :zwinker:
(oder den/die Button)

Sir Rufo 15. Dez 2015 10:11

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Zitat:

Zitat von himitsu (Beitrag 1324491)
In einem "modalen" Fenster kann man auch rumklicken, wenn die Anwendung richtig läuft. :angle:


PS: vorher z.B. Enabled der Form auf False setzen :zwinker:
(oder den/die Button)

Natürlich kann man da rumklicken ... und es passiert dort nur das, was ich auch zulasse ... ist ja mein Formular, da kann ich mit machen was ich will ... ;)

himitsu 15. Dez 2015 10:22

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Wollte nur sagen:

Modal bezieht sich nicht auf das Fenster selber, sondern auf andere Fenster der Anwendung ... bin ich "modal", dann sind vorherrige Fenster "Disabled".

ernschd 15. Dez 2015 10:42

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Genau, ich meine damit, dass die fremde Anwendung ganz normal bedienbar sein soll, mein Hauptformular aber so lange nicht, bis die fremde Anwendung wieder beendet wird.
So wie das Verhalten von ShowModal beim Anzeigen eines Formulars (die Hintergrundanwendung ist nicht anklickbar).

Sir Rufo 15. Dez 2015 11:04

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Und was hindert dich jetzt daran ein Formular mit ShowModal aufzurufen, das so lange angezeigt wird, wie die externe Anwendung läuft?

ernschd 15. Dez 2015 12:12

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Ich glaube, wir reden aneinander vorbei:

meine Anwendung (z.B. myApp) soll eine andere Anwendung starten (z.B. secApp). Dabei soll secApp im Vordergrund geöffnet werden, und myApp sichtbar bleiben, aber nicht bedienbar sein, so lange secApp läuft.

Das habe ich mittlerweile auch hinbekommen.

Sir Rufo 15. Dez 2015 13:12

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Wir reden nicht aneinander vorbei, du verstehst mich nur nicht ;)

Stell dir vor, du hast eine
Delphi-Quellcode:
TStarteExterneAnwendungForm
und die verwendest du wie folgt:
Delphi-Quellcode:
procedure DoRun( const CmdLine, Parameters : string );
var
  LDialog: TStarteExterneAnwendungForm;
begin
  LDialog := TStarteExterneAnwendungForm.Create( nil );
  try
    LDialog.CmdLine := CmdLine;
    LDialog.Parameters := Parameters;
    LDialog.ShowModal;
  finally
    LDialog.Free;
  end;
end;
und diese Form startet jetzt diese externe Anwendung ... und schliesst sich automatisch, wenn die externe Anwendnung beendet wurde.

Wird es jetzt klarer?

hoika 16. Dez 2015 06:50

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Hallo,
warum machst du vor dem Aufruf des fremden Programmes kein

Delphi-Quellcode:
Self.Enabled:= False;
?


Heiko

mm1256 16. Dez 2015 08:29

AW: Fremde Anwendung modal starten, Neuzeichnen des eigenen Formulars
 
Zitat:

Zitat von hoika (Beitrag 1324592)
Hallo,
warum machst du vor dem Aufruf des fremden Programmes kein

Delphi-Quellcode:
Self.Enabled:= False;
?
Heiko

Ich vermute mal, weil das am ursprünglichen Problem nichts oder nicht viel ändert, siehe Grafik in #1.

Auch das "Zwischenschalten" eines modalen Fensters ist keine "optimale" Lösung, weil das Problem ganz einfach beseitigt werden kann....


Zitat:

Zitat von ernschd (Beitrag 1324481)
Funktioniert leider nicht bei mir, es sieht noch genau so aus :(

Sorry, hat ne Weile gedauert. Das funktioniert schon genau so, und wenn es bei mir geht, muss es bei dir auch gehen. Es fehlt schlichtweg die Angabe des aufrufenden Fenster-Handles:

Delphi-Quellcode:
  info.Wnd := ....das Handle des aufrufenden Fensters


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