![]() |
Form auf Form (nötig?)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
unter besonderen Umständen soll eine Form "disabled" sein, aber auf meine ganz eigene Weise. Das heißt: Es soll sich über die ganze Form ein weißer "Schleier" legen, wie im Bild im Anhang dargestellt (mit einem Bildbearbeitungsprogramm realisiert). Mit einem TImage klappt dies nicht, weil ich keine halbtransparente Grafik ohne den Effektverlust laden kann. Mein nächster Ansatz war nun, selbst eine Komponente zu erstellen, ich habe an TForm gedacht. Mein bisheriger Versuch sieht so aus:
Delphi-Quellcode:
Allerdings hat sich optisch noch nichts getan. Woran liegt das?
Form := TForm.Create(Self);
Form.Parent := Self; Form.Name := 'FormTest'; Form.BorderStyle := bsNone; Form.Position := poMainFormCenter; Form.AlphaBlend := False; Form.Caption := ''; Form.Left := 10; Form.Top := 10; Form.Width := 100; Form.Height := 100; Form.Color := clBlack; Und fahre ich mit einer eigenen TForm-Komponente am besten. Oder doch vielleicht eine ganz anderen? - Und wenn ja, welche? mfg. |
AW: Form auf Form (nötig?)
Dürfte sich IMHO nur über ein rahmenloses "Alphaform" realisieren lassen welches über den Clientbereich gelegt wird, Focuswechsel, Moving, Resizing etc. werden dann die nächsten Kandidaten, wenn kein modaler Dialog drübergelegt, oder das Hauptform diabled wird.
|
AW: Form auf Form (nötig?)
Wie genau realisiere ich denn eine "'randlose' Alphaform"?. Heißt doch: "AlphaBeld" auf "True" und dann den Wert "AlphaBlendValue" auf einen gewünschten Wert einstellen, oder?
Wenn dem so ist, dann habe ich daran ja auch schon gedacht. Das Problem ist eben, dass ich die Form nicht erstellt bekomme und weiß nicht weshalb. Denn wenn das klappt, sind ja die "AlphaBlend" Properties nur noch Einstellungssache. |
AW: Form auf Form (nötig?)
Ok, bei obigem Code fehlte noch das "Form.Show". Jetzt wird mir immerhin schonmal die gewünschte Form angezeigt.
Doch damit sind meine Probleme noch nicht gelöst: Die Form wird mir nur angezeigt, wenn "BoderStyle" auf "bsDialog" steht, ein anderer Style wird nicht toleriert ("bsNone" bräuchte ich). Natürlich komme ich mit "AlphaBlend" und "AlphaBlendValue" dem gewünschten Ergebnis näher - man kann ja das verschieben der Form verhinden, die Caption der Hauptform übernehmen, weil die ja immer überlagert wird. Was das nächste Problem darstellt, mit dem "Schließen-X" oben rechts (man muss zweimal klicken, um die Hauptanwendung zu schließen...). Richtig elegant und das herbeigesehnte Ergebnis ist es also noch nicht. Was kann ich anders / besser machen? |
AW: Form auf Form (nötig?)
Denkanstoß:
Das darübergelegte Form als Kind des MainForms gestalten (Form.Parent:=MainForm), Borderstyle:=bsNone, die Größe nur so, dass der Clientbereich des Hauptforms bedeckt ist (Top:=0, Left:=0, Width:=MainForm.Clientwidth, Height:=MainForm.ClientHeight) und das ganze über Show anzeigen. |
AW: Form auf Form (nötig?)
mit
Delphi-Quellcode:
ist das Alphablend weg....
Form.Parent:=MainForm
Show geht auch mit Borderstyle=bsNone Die Position und Größe musst Du Dir rausrechnen, dies auch beim "Sizen" und "Moven" des Mainforms + BringToFront, wenn Du nicht Modal anzeigst. |
AW: Form auf Form (nötig?)
Zitat:
Andere Möglichkeit: Kein zweites Form, sondern ein TImage. In die Uses TPNGImage eintragen und das TImage mit einem entsprechenden png-Bild mit einer bestimmten Transparenz laden. So würde ich vorgehen :-) |
AW: Form auf Form (nötig?)
Auch nicht, Wincontrols bekommst Du so nicht abgedeckt....
|
AW: Form auf Form (nötig?)
Ich hab es jetzt geschafft. Ich poste mal den ganzen dazugehörigen Code:
Delphi-Quellcode:
Die einzige noch bestehende "Schwachstelle": Wenn man unter Windows 7 mit dem Fenster wackelt, sodass sich alle vorher auf diese Weise minimierten Fenster wieder einblenden, bleibt die schwarze "Folie" über der Form in paar Pixel weiter weg. Aber damit kann ich leben. Bewegt oder verändern man die Größe ist alles wieder korrekt
procedure TFormMain.ShowDarkLayer;
(*Create a new form that covers all components (except the status bar). Set black background but transparent*) var Buffer: Integer; //Pseudo variable since the parameter list of "FormConstrainedResize" requires a variable begin FormLayer := TForm.Create(FormMain); FormLayer.Name := 'FormLayer'; FormLayer.BorderStyle := bsNone; FormLayer.AlphaBlend := True; FormLayer.AlphaBlendValue := 100; FormLayer.Color := clBlack; FormLayer.BringToFront; FormLayer.Cursor := crNo; FormLayer.Show; FormLayer.Hint := 'This form is closed since no connection is established'; FormLayer.ShowHint := True; Application.HintPause := 0; FormConstrainedResize(Self, Buffer, Buffer, Buffer, Buffer); end; procedure TFormMain.FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight, MaxWidth, MaxHeight: Integer); (*This procedure is necessary if the dark layer is available and the form is resized or moved!*) begin if FormLayer <> nil then begin FormLayer.Left := Left + 7; FormLayer.Top := Top + 28; FormLayer.Width := ClientWidth+2; FormLayer.Height := ClientHeight + 5 end end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 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 by Thomas Breitkreuz