Autor Beitrag
jackle32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Mo 07.01.08 10:10 
Morgen,

ich hab eine Frage bezügliche der Anzeige eines modal aufgerufenen Fensters. Meine Anwendung hat mehrere Fenster. Jetzt will ich eine bestimmtes Fenster öffnen, in dem Standardwerte gesetzt werden. Da ich nicht will, das während dieses Rücksetzens irgendwas im Programm gemacht werden kann ruf ich das mit Form.ShowModal auf.

Jetzt ist es aber so, dass ich in der Taskleiste die anderen Fenster trotzdem anklicken kann und diese dann in den Vorgrund kommen (kann natürlich dort nichts ändern). Wie schaff ich es, dass mir das Modal angezeigte Fenster wenn das entsprechende Programm aktiv, im Vorgrund angezeigt wird. Alle anderen Programme sollen natürlich drüber blenden dürfen.

Gruß Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 07.01.08 17:02 
Wenn das Fenster aufgerufen wird, kannst du im Ereigniss OnShow alle Visibles der anderen Formularen auf False setzen. Dann können diese nicht mehr den Fokus erhalten.

Im OnHide-Ereigniss musst du selbst verständlich wieder alle Fenster freigeben, da der User sonst nichts mehr machen kann :wink: Vielleicht solltest du das Fenster nicht mit ShowModal; aufrufen, sondern normal. Nur, falls irgendwelche komischen Sachen auftreten :lol:

Wenn dein Fenster für immer im Vordergrund bleiben soll, kannst du FormStyle auf StayOnTop setzen.
jackle32 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Mo 14.01.08 11:09 
Die Ideen waren schon nicht schlecht aber nicht das was ich wollte. Ich will die anderen Fenster schon sichtbar halten, nur eben nicht zum auswählbar.

Die FormStyle Möglichkeit hab ich auch schon gefunden gehabt, aber dann bleibt es ja immer im Vordergrund vor allem.

Nach kurz zur weiteren Erklärung:

Ich kann nicht auf alle Visible Eigenschaften der aller Fenster zugreifen, da ich eine Oberfläche schreibe, die als dll in ein sehr großer Projekt eingebunden wird und das auch nur nach bedarf. D. h. ich bräuchte eine Möglichkeit auch das Hauptprogramm mit zu sperren, das wär optimal. Das das nicht so leicht geht kann ich mir schon denken, was ich aber auf jeden Fall bräuchte wäre die Möglichkeit zumindest das Fenster zu sperren von dem aus ich das zweite aufrufe (in der dll selber).
Ich stell mir das so vor, dass ich wenn beide Fenster offen sind, dass diese dann nur zusammen angezeigt werden können und das kleinere mit der Initialisierung dabei immmer vor dem eigentlichen Treiberfenster liegt. Dabei möchte ich aber die beiden schon von anderen Programmen überblenden lassen können.

Hoffe mein Anliegen ist jetzt klaren

gruß Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 14.01.08 19:15 
Da habe ich mich wohl gewaltig verschrieben. Ich meinte eigentlich, du sollst Enabled der Fenster deaktivieren, nicht Visible.

Wenn du nur das Hauptprogramm ausschalten willst, kannst du das mit Application.MainForm machen. Aber so ganz verstehe ich deine Frage auch nicht :roll:
jackle32 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Di 15.01.08 11:24 
Ich geb zu aus meiner Erklärung wäre ich glaube ich auch nicht schlau geworden...

Also ich versuche es jetzt mal verständlich.

Ich habe ein Hauptprogramm (das ich nicht selber geschrieben hab) in diese können beliebe Treiber eingebunden werden, die zur Steuerung spezieller Geräte gehören. Ich schreibe jetzt so einen Treiber.
Also wenn ich jetzt das Hauptprogramm starte hab ich eben dieses Hauptfenster. In diesem eine Menüleiste über die ich meinen Treiberoberfläche aufrufen kann (also jetzt sind zwei Fenster offen). In diesem Treiberfenster gibt es einen Button, mit dem ich die wichtigsten Einstellungen des Geräts das gesteuert wird setze, also den Grundzustand herstelle. Während der Initialisierung ist ein weiteres Fenster offen, in dem der Fortschritt der Initialisierung angezeigt wird (nötig, da die Initialisierung ca. drei Minuten dauert). Wenn jetzt dieses dritte Fenster offen ist möchte ich, das nicht auf das zweite (Treiber-) Fenster zugeriffen werden und somit keine Einstellungen währen der Initialisierung geändert werden können. D.h. das zweite Fenster sollte so gesperrt werden, das man nichts ändern kann und gleichzeitig sollte auch wenn das gesperrte Fenster angezeigt wird, das dritte Fenster immer davor angezeigt werden (und somit nicht das Problem zu schaffen, das sich der Benutzer wundert, das er im zweiten Fenster nichts ändern kann, sondern dann sofort sieht das ja noch das Initialisierungfenster offen ist)

Hoffe jetzt wird mein Anliegen klarer

Hab jetzt schon mal eine Lösung gefunden, in dem ich immer wenn das dritte Fenster offen ist, diesem den Focus gebe sobald das zweite Fenster aktiviert wird.

Hier mal der Quellcode ist vielleicht verständlicher:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TI16I32Dialog.FormActivate(Sender: TObject);
begin
if assigned(StatusDialog) then
    if StatusDialog.Showing then
      StatusDialog.SetFocus;
end;


Weiß allerdings nicht ob das so recht sinnvoll programmiert ist oder ob es vielleicht eine bessere Alternative gibt.

@Yogu: Danke schon mal für die Mühen

Gruß Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 15.01.08 19:00 
Stelle für das Warten-Dialogfeld die Eigenschaft FormStyle auf fsStayOnTop. Das heißt, das Fenster bleibt innerhalb der Anwendung immer ganz oben.

Jetzt kannst du das Warten-Dialogfeld aufrufen, wenn es klappt mit ShowModal. Wenn es nicht klappt, kannst du auch die anderen Fenster deaktivieren. Das Hauptformular erreichst du mit Application.MainForm, dein jetziges Fenster ist ja das Treiberfenster, also hast du eigentlich alle, die du brauchst.