AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

InputBox nach vorne bringen?

Ein Thema von PeterPanino · begonnen am 6. Jan 2006 · letzter Beitrag vom 6. Jan 2006
Antwort Antwort
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#1

InputBox nach vorne bringen?

  Alt 6. Jan 2006, 12:29
Wenn beim Aufruf von InputBox aus meinem Programm ein Fenster eines anderen Programmes im Vordergrund ist, ist die Input-Box möglicherweise hinter diesem Fenster versteckt.

Was kann man machen, um die Input-Box in den Vordergrund zu bringen?

Ich habe bereits versucht, vor dem Aufruf von InputBox Application.BringToFront aufzurufen, aber das wirkt nicht:

Delphi-Quellcode:
Application.BringToFront;
MyVar:= InputBox('Titel', 'Frage:', 'Vorgabe');
Wer weiß eine Lösung?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: InputBox nach vorne bringen?

  Alt 6. Jan 2006, 13:32
Herzlich Willkommen in der Delphi-PRAXiS, PeterPanino.

Du wirst es nicht immer schaffen, dass ein bestimmtes Fenster im Vordergrund ist. Mit fortschreitender Windows-Version verlagerte MS die Kontrolle immer mehr nach innen. Aber in deinem Fall sollte TForm.BringToFront (manipuliert die Z-Order) oder Windows.SetForegroundWindow (wird von Application.BringToFront verwendet, aber nicht unbedingt) helfen. Wenn nicht, dann wäre interessant, welche Fenster deine Box verdecken. Im Windows Platform SDK kannst du Näheres zum Thema lesen.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: InputBox nach vorne bringen?

  Alt 6. Jan 2006, 15:00
Zitat von marabu:
Herzlich Willkommen in der Delphi-PRAXiS, PeterPanino.

Du wirst es nicht immer schaffen, dass ein bestimmtes Fenster im Vordergrund ist. Mit fortschreitender Windows-Version verlagerte MS die Kontrolle immer mehr nach innen. Aber in deinem Fall sollte TForm.BringToFront (manipuliert die Z-Order) oder Windows.SetForegroundWindow (wird von Application.BringToFront verwendet, aber nicht unbedingt) helfen. Wenn nicht, dann wäre interessant, welche Fenster deine Box verdecken. Im Windows Platform SDK kannst du Näheres zum Thema lesen.

Freundliche Grüße vom marabu
Danke für die freundliche Aufnahme! Ebenfalls freundliche Grüße!

Bez. TForm.BringToFront/Windows.SetForegroundWindow: Wie soll das konkret funktionieren? Der Aufruf von InputBox gibt ja kein Handle zurück, mit dem ich die InputBox ansprechen könnte. Außerdem kehrt InputBox erst zurück, wenn die InputBox schon wieder geschlossen ist.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: InputBox nach vorne bringen?

  Alt 6. Jan 2006, 15:31
Es reicht, wenn du das aktuelle Fenster deiner Anwendung in den Vordergrund zerrst - die InputBox setzt sich dann selbst noch davor. Ich fürchte allerdings, dass ein anderes Fenster immer noch weiter im Vordergrund sein wird. Nimm als Beispiel den Task-Manager. Du kannst für sein Fenster AlwaysOnTop festlegen und durch unsere Bemühungen wirst du deine InputBox da auch nie davor schieben können. Wie ich schon erwähnte bietet der Windows Platform SDK da einiges an Informationen.

marabu
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: InputBox nach vorne bringen?

  Alt 6. Jan 2006, 16:08
Zitat von marabu:
Es reicht, wenn du das aktuelle Fenster deiner Anwendung in den Vordergrund zerrst - die InputBox setzt sich dann selbst noch davor. Ich fürchte allerdings, dass ein anderes Fenster immer noch weiter im Vordergrund sein wird. Nimm als Beispiel den Task-Manager. Du kannst für sein Fenster AlwaysOnTop festlegen und durch unsere Bemühungen wirst du deine InputBox da auch nie davor schieben können. Wie ich schon erwähnte bietet der Windows Platform SDK da einiges an Informationen.

marabu
Zu dem Zeitpunkt, an dem dieser Aufruf von InputBox erfolgt (FormCreate des Hauptfensters, hatte ich eingangs vergessen zu erwähnen) ist noch kein Fenster sichtbar bzw. aktiv. Deswegen funktioniert Application.BringToFront ja nicht. Bei bereits erfolgter Initialisierung der Fenster - Form Create und Show - funktioniert Application.BringToFront ja wunderbar.
Das verdeckende Fenster ist übrigens kein StayOnTop-Fenster wie der TaskManager, sondern ein ganz gewöhnliches WindowsExplorer-Fenster. (Beim Endanwender könnten es auch andere normale Fenster sein, welche die InputBox verdecken).
Aus programmtechnischen Gründen muss der Aufruf von InputBox leider schon an dieser Stelle erfolgen. Deshalb kann ich auch nicht ein eigenes TForm-Formular für die Eingabe verwenden, weil zu diesem Zeitpunkt die anderen Formulare noch nicht erzeugt wurden.

Der einzige Ausweg, den ich hier sehe, wäre die Erstellung einer eigenen DLL mit einem Formular für die Eingabe und diese dynamisch aufzurufen. Kann eine DLL denn ihr eigenes Fenster mit BringToFront in den Vordergrund bringen?

Die Verwendung einer DLL ist aber wiederum fehleranfällig, denn sie könnte beim Endanwender aus irgendwelchen Gründen abhanden kommen usw.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: InputBox nach vorne bringen?

  Alt 6. Jan 2006, 18:20
Deine Beschreibung klärt jetzt doch einiges auf. InputQuery (InputBox ruft InputQuery) erzeugt ein ganz normales Dialogfenster - sonst nichts. Das, in Verbindung mit dem Zeitpunkt des Aufrufs (MainForm.OnCreate), ist ungeeignet für deine Zwecke. Erstelle einfach ein eigenes Dialogfenster und setze dessen FormStyle auf fsStayOnTop und du solltest zufrieden sein.

marabu
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: InputBox nach vorne bringen?

  Alt 6. Jan 2006, 18:22
Ich habe jetzt einen gut funktionierenden Workaround für das Problem gefunden: Einfach vor dem Aufruf von InputBox alle Fenster auf dem Desktop minimieren! Natürlich nicht manuell ;-] sondern so:

Delphi-Quellcode:
//Minimiert alle Fenster auf dem Desktop. Benötigt ShlObj UND ComObj.
//Hat den gleichen Effekt wie Rechtsklick auf die Taskleiste -> Desktop anzeigen:
procedure Shell_MinimizeAll;
var
   Shell: OleVariant;
begin
   Shell := CreateOleObject('Shell.Application');
   Shell.MinimizeAll;
end;
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: InputBox nach vorne bringen?

  Alt 6. Jan 2006, 18:27
Zitat von marabu:
Deine Beschreibung klärt jetzt doch einiges auf. InputQuery (InputBox ruft InputQuery) erzeugt ein ganz normales Dialogfenster - sonst nichts. Das, in Verbindung mit dem Zeitpunkt des Aufrufs (MainForm.OnCreate), ist ungeeignet für deine Zwecke. Erstelle einfach ein eigenes Dialogfenster und setze dessen FormStyle auf fsStayOnTop und du solltest zufrieden sein.

marabu
Leider kann ich ein Formular in MainForm.OnCreate noch nicht aufrufen, weil das Hauptfenster per Definition als erstes erzeugt werden muss und deshalb in MainForm.OnCreate die anderen Fenster noch gar nicht erzeugt wurden.

Oder weißt du eine konkrete Möglichkeit?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: InputBox nach vorne bringen?

  Alt 6. Jan 2006, 18:45
Du musst dieses Fenster (InputDialog) einfach aus der Liste der automatisch erzeugten Fenster heraus nehmen.

Delphi-Quellcode:
procedure TMainForm.FormCreate();
begin
  with TInputDialog.Create(Application) do
  begin
    ShowModal;
    Free;
  end;
end;
marabu
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: InputBox nach vorne bringen?

  Alt 6. Jan 2006, 19:58
Zitat von marabu:
Du musst dieses Fenster (InputDialog) einfach aus der Liste der automatisch erzeugten Fenster heraus nehmen.

Delphi-Quellcode:
procedure TMainForm.FormCreate();
begin
  with TInputDialog.Create(Application) do
  begin
    ShowModal;
    Free;
  end;
end;
marabu
Ist klar - funktioniert, vielen Dank!
  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 19: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