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 Form nicht mehr bedienbar (https://www.delphipraxis.net/63232-form-nicht-mehr-bedienbar.html)

bluescreen25 15. Feb 2006 18:23


Form nicht mehr bedienbar
 
Hallo,

ich nutze eine Form in Größe einer Appbar am oberen Bildschirmrand. (formstyle :=fsStayOnTop)

Von meiner Hauptform setze ich über einen Button diese Form auf show

Mit der AppBar starte ich zudem noch das Navigationsproramm "Navigon Navigator Notebook" welches direkt maximiert dargestellt wird.

Jetzt mein Problem:

Ich sehe meine AppBar weiterhin über dem Navigon, kann diese aber nicht bedienen. Nur das Navigon ist bedienbar. wenn ich trotzdem auf der Appbar einen Button drücke, welcher aber nicht wirklich runtergeht und danach das Navigon beende, dann wird der Buttonbefehl ausgeführt.

Was kann ich tun ?


PS: wenn ich Notepad vom Windows da einbinde, dann klappt es. Navigon arbeitet nur min/maximiert.

bluescreen25 16. Feb 2006 14:32

Re: Form nicht mehr bedienbar
 
keiner eine Idee ?
Hier mal der Code:
Zum starten vom Hauptmenü über einen Button (als Image mit OnmouseDown,Up,Click) zeige ich meine Form (navigation_frm) als kleine Leiste am oberen Bildschirmrand und startete gleichzeitig das ext Prog.
Hier kam es schon dazu, das meine form gar nicht zu Ende gezeichnet wurde, als das ext Prog startete.
Deshalb einen Delay-Timer von 3 sek.
Delphi-Quellcode:
procedure TMain_frm.Image5Click(Sender: TObject);
begin
   extApps_frm.timer1.Interval:=3000;
   extApps_frm.timer1.Enabled:=true;
   Main_frm.Hide;
   mediaplayer_frm.Hide;
   navigation_frm.FormStyle := fsStayOnTop;
   navigation_frm.Show;
   //SetForegroundWindow(navigation_frm.Handle);
end;
Delphi-Quellcode:
procedure TextApps_frm.Timer1Timer(Sender: TObject);
var app: String;
    appWithPfad : String;
begin
  begin
   app := ExtractFileName(config_frm.navigation_root_edit_Fld.Text);
   appWithPfad := config_frm.navigation_root_edit_Fld.Text;
   Wnd := FindWindow(PChar(app), nil);
   if IsEXERunning(app, False) then
    begin
      timer1.Enabled:=false;
      SetWindowPos(Wnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
     //ShowMessage('Läuft schon...)
    end
  else
    begin
     timer1.Enabled:=false;
     extApps_frm.RunApp(appWithPfad,0,40,800,530);
     //ShowMessage('Läuft nicht...);
    end;
 end;
end;
Diese procedure ist übernommen, da ich in API noch gar keine Kentnisse habe, auch überall in meinem Code mal Testversuche.
Delphi-Quellcode:
procedure TextApps_frm.RunApp(const FileName: String; Left, Top, Width, Height: Integer);

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
  begin
    TList(lParam).Add(Pointer(hWnd));
    Result := True;
  end;

  function GetWndHandle(ProcessId: DWORD): HWND;
  var
    List: TList;
    I: Integer;
    PID: DWORD;
  begin
    Result := 0;
    List := TList.Create;
    try
      EnumWindows(@EnumWindowsProc, LPARAM(List));
      for I := 0 to List.Count - 1 do
        if GetWindowThreadProcessId(HWND(List.Items[I]), @PID) <> 0 then
          if PID = ProcessId then
          begin
            Result := HWND(List.Items[I]);
            Break;
          end;
    finally
      List.Free;
    end;
  end;

var
  SI: TStartupInfo;
  PI: TProcessInformation;

begin
  FillChar(SI, SizeOf(TStartupInfo), 0);
  SI.cb := SizeOf(TStartupInfo);
  if CreateProcess(nil, PChar(FileName), nil, nil, False, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, INFINITE);
    AppHWnd := GetWndHandle(PI.dwProcessId);
    if IsWindow(AppHWnd) then
     if IsWindowVisible(AppHWnd) then
      begin
      Application.ProcessMessages;
      //ShowWindow(AppHWnd,SW_SHOWMINNOACTIVE);
      MoveWindow(AppHWnd, Left, Top, Width, Height, True);
      //windows.SetParent(AppHWnd,main_frm.Handle);
      //SetWindowPos(AppHWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
      SetWindowPos(AppHWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
      //SendMessage(AppHWnd, WM_SYSCOMMAND, SC_Minimize, 0);
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
     end;
   end;
end;
Wie gesagt, mit Notepad funktioniert es wunderbar, nur mit dem Navigator Notebook nicht, wenn es startet, dann öffnet sich dabei erst ein kleines Fenster mit Infos, danach erst das maximierte Programmfenster selbst. Irgendwie bekomme ich auch das Handle von diesem Prog nicht in den Griff. Abgesehen davon ist mein Hauptproblem, das ich meine Form (Leiste) oben sehe, und ich auch den Focus vom Navigon wegbekomme, aber irgendwie meine Buttons nicht betätigen kann solange das ext.Prog läuft.Ich denke das nicht zu ende zeichnen der Leiste,wenn ich den Timer weglasse, muss auch damit zusammenhängen.


:?:

turboPASCAL 16. Feb 2006 14:53

Re: Form nicht mehr bedienbar
 
Warum verwendest du nicht Delphi-Referenz durchsuchenshellexecute ?
Delphi-Quellcode:
shellexecute(handle, 'open', 'c:\...\wasauchimmer.exe', '', '', sw_maximize);
und das im FormCreate, ggf. "handle" durch "0" ersetzen.
:gruebel:

bluescreen25 16. Feb 2006 15:11

Re: Form nicht mehr bedienbar
 
Zitat:

Zitat von turboPASCAL
Warum verwendest du nicht Delphi-Referenz durchsuchenshellexecute ?
Delphi-Quellcode:
shellexecute(handle, 'open', 'c:\...\wasauchimmer.exe', '', '', sw_maximize);
und das im FormCreate, ggf. "handle" durch "0" ersetzen.
:gruebel:

Hmm,jetzt setzt sich das ext. Prog über meine Form (nicht mehr sichtbar).

Luckie 16. Feb 2006 15:14

Re: Form nicht mehr bedienbar
 
Dann programmier eine richtige Hier im Forum suchenAppBar und es sollte gehen.

turboPASCAL 16. Feb 2006 15:23

Re: Form nicht mehr bedienbar
 
Zitat:

Zitat von Luckie
Dann programmier eine richtige Hier im Forum suchenAppBar und es sollte gehen.

Jupp, oder guck mal hier: Mini DeskTop- Toolbar ;)

bluescreen25 16. Feb 2006 15:28

Re: Form nicht mehr bedienbar
 
Hmm habe wohl gerade festgestellt , das mit shellexecute gestartet, das ext. prog zwar erstmal meine Form überdeckt, ich aber über die Windoof-Taste die Taskleiste aufrufen kann und meine Form so wiedrum funktional über das ext kommt. Nur es bleibt nicht StayOnTop ,wenn ich wieder auf das ext. Prog klicke.

Aber nun muss es doch eine Lösung geben, wenn ich schon meine Form wieder greifen kann????

@Luckie : die richtige AppBar nimmt sich den Platz,den es braucht und die ext.Prog können unweigerlich nur darunter arbeiten wie ne Taskleiste oder? muss mal testen, aber wollte eigendlich nur mit meiner Leiste (MP3-Player Buttons) solange überlappen, wie die Navigation läuft, so das man beides bedienen kann.

bluescreen25 16. Feb 2006 15:31

Re: Form nicht mehr bedienbar
 
Zitat:

Zitat von turboPASCAL
Zitat:

Zitat von Luckie
Dann programmier eine richtige Hier im Forum suchenAppBar und es sollte gehen.

Jupp, oder guck mal hier: Mini DeskTop- Toolbar ;)

Das schaut ja ganz gut aus, nur bleibt diese Bar denn auch bei meinem ext. maximierten Prog obenauf? Oder kommen da die gleichen Probleme, das die verdeckt wird ? Ansonsten wäre ich ja wieder bei meiner Leiste....

Sagenhaft, gerade getestet, die Desktop Toolbar bleibt immer schon oben !!! :shock:

turboPASCAL 16. Feb 2006 15:36

Re: Form nicht mehr bedienbar
 
Wenn dein Programm "StayOnTop" hat und das startende Programm ebenfalls wird dieses über das bereits existierende gesetzt.
Was gemacht werden kann ist, das deine Anwendung regelmäsig prüft ob es das oberste Fenster ist. Wenn nicht muss es sich wieder als "StayOnTop" setzen.

bluescreen25 16. Feb 2006 15:53

Re: Form nicht mehr bedienbar
 
Zitat:

Zitat von turboPASCAL
Wenn dein Programm "StayOnTop" hat und das startende Programm ebenfalls wird dieses über das bereits existierende gesetzt.
Was gemacht werden kann ist, das deine Anwendung regelmäsig prüft ob es das oberste Fenster ist. Wenn nicht muss es sich wieder als "StayOnTop" setzen.

damit gehts nicht, aber mit einem Dauertimer (alle 1 sek) habe ich folgendes erfolgreich getestet:
Delphi-Quellcode:
SetWindowPos(navigation_frm.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
.....obwohl mich die Desktop ToolBar schon reizt, damit könnte ich überall im Programm die MP3-Funktionen nutzen und auch Navigation.


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