Delphi-PRAXiS

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 Minimieren geht nicht mehr (https://www.delphipraxis.net/87185-minimieren-geht-nicht-mehr.html)

Berni68 24. Feb 2007 17:57


Minimieren geht nicht mehr
 
Salü zusammen. :)

Hab nur ich ein Problem mit fogendem Programm, oder gibt es da ein prinzipielles Problem?
1. Programm starten und minimieren.
2. Programm nochmals starten. Wie erwartet wird die erste Instanz aktiviert.
Nur, jetzt läßt sich das Ding nicht mehr minimieren.

Delphi-Quellcode:
unit Unit1;
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
  TForm1 = class(TForm)
  private
  public
  end;
var
  Form1: TForm1;
  Handle: THandle;
implementation
{$R *.DFM}

initialization
begin
  Handle:= CreateMutex(nil, true, 'Form1');
  if GetLastError=ERROR_ALREADY_EXISTS then Halt;
end;
finalization
begin
  if Handle<>0 then CloseHandle(Handle);
  Handle:= FindWindowEx(0, 0, 'TForm1', nil);
  If Handle<>0 then begin
    if IsIconic(Handle)=true then showmessage('IsIconic'); // funktioniert NICHT
    if IsZoomed(Handle)=true then showmessage('IsZoomed'); // funktioniert, wird allerdings auch bei minimiertem Fenster angezeigt
    if IsWindowVisible(Handle)=false
      then SendMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, Handle)
      else SendMessage(Handle, WM_SYSCOMMAND, SC_DEFAULT, Handle);
//    ShowWindow(Handle, SW_SHOWMAXIMIZED); // gleiches Ergebnis minimieren nicht mehr möglich, wenns minimiert war.
    SetForegroundWindow(Handle);
  end;
end;
end.

hedie 24. Feb 2007 18:00

Re: Minimieren geht nicht mehr
 
also ich hab bemerkt (korigier mich wen ich falsch liegen sollte)

das man fenster nicht minimieren kann bevor sie komplett geladen worden sind...

Ich löse das problem immer etwas unschön mit einem timer:

setze den timer auf 1MS und gib ihm den befehl die Form zu minimieren und sich selbst danach zu disabeln das klappt bei mir zu 100%


grüsschen

Berni68 24. Feb 2007 18:14

Re: Minimieren geht nicht mehr
 
Das sollte nicht das Problem sein. Das Fenster des ersten Aufrufes ist ja komplett da, und das Fenster des zweiten Aufrufes ist zu diesem Zeitpunkt schon 'abgewürgt'.

SirThornberry 24. Feb 2007 18:49

Re: Minimieren geht nicht mehr
 
Das Problem ist das du sicher nicht das Form minimieren willst sondern die ganze Application. Oder willst du nur ein Fenster minimieren so das es über der Taskleiste hängt?

Berni68 24. Feb 2007 19:14

Re: Minimieren geht nicht mehr
 
:?: Also, jetzt muss ich vorsichtig werden. Könnte sein, daß das was damit zu tun hat, aber genaugenommen hab ich es nicht verstanden.

Also erklär ich mal was ich eigentlich will:
1. Das Programm soll nur einmal gestartet werden können.
2. Startet der Anwender das Programm nochmal soll die zuert gestartete Instanz
aktiviert werden, und zwar in dem Zustand wie sie den Focus abgegeben hat.

Ergebnis des Quelltextes:
zu 1. Funktioniert einwandfrei. (den Quelltext dazu hab ich allerdings auch nur hier im Forum abgeschrieben :oops:)
zu 2: Ist die Anwendung nur von einem anderen Programm verdeckt, funktioniert alles wie gewünscht, auch wenn 'meine'
Anwendung maximiert war.
War meine Anwendung, also der erste Aufruf, minimiert (was wohl häufig vorkommt: Fenster/Anwendung minimieren um zu
sehen was dahinterliegt) funktioniert das ganze ja auch noch: Die ursprüngliche Instanz wir wiederhergestellt und
erhät den Focus, läßt sich aber jetzt Nicht mehr minimieren. Wenn man auf den Butten in der Fensterleiste drückt,
passiert einfach nichts mehr :evil:

P.S. Konnte das Verhalten inzwischen auf einem anderen PC ausprobieren: genau das gleiche! d.h. der Quelltext macht die Anwendung kaputt!
Bin für jede Info dankbar :!:

SirThornberry 24. Feb 2007 19:25

Re: Minimieren geht nicht mehr
 
genau das was ich dachte. Wenn du bei deinem Form auf den minimieren-button klickst wird Applicaiton.Minimize ausgelöst (alle Forms werden somit minimiert). Wenn du aber mit deinen Messages nicht über das Application.Handle gehst passieren eben die tollen Effekte. Nimm einfach eine eigene Message und rufe beim Aufruf dieser Message Application.Restore auf.

Berni68 24. Feb 2007 21:06

Re: Minimieren geht nicht mehr
 
Vielen Dank für den Hinweis. Jetzt funktioniert es wie es soll! :dancer:

Delphi-Quellcode:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
const
    CM_aktivieren=WM_APP+400;
type
  TForm1 = class(TForm)
  private
    procedure CMtest(var Message: TMessage); message CM_aktivieren;
  public
  end;
var
  Form1: TForm1;
  Handle: THandle;
implementation
{$R *.DFM}
procedure TForm1.CMtest(var Message: TMessage);
begin
  Application.Restore;
end;
initialization
begin
  Handle:= CreateMutex(nil, true, 'Form1');
  if GetLastError=ERROR_ALREADY_EXISTS then Halt;
end;
finalization
begin
  if Handle<>0 then CloseHandle(Handle);

  Handle:= FindWindow(nil, 'Form1');
  SetForegroundWindow(Handle);
  SendMessage(Handle, CM_aktivieren, 0, Handle);
end;
end.
Wenn ich allerdings ganz ehrlich bin, hab ich die Lösung mehr durch probieren als durch Verstehen gefunden.
Aber was soll's, das Ergebnis zählt.
Jetzt muss ich 'nur' noch dafür sorgen, daß nicht der ganze Fenstertitel (meistens ja nicht vollständig bekannt) benötigt wird.

SirThornberry 24. Feb 2007 21:17

Re: Minimieren geht nicht mehr
 
ok, ich versuchs das nächste mal verständlicher, eventuell mit Beispiel, zu formulieren.


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