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/)
-   -   Form auf Form (nötig?) (https://www.delphipraxis.net/157193-form-auf-form-noetig.html)

Mysterio08 2. Jan 2011 15:48

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:
  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;
Allerdings hat sich optisch noch nichts getan. Woran liegt das?
Und fahre ich mit einer eigenen TForm-Komponente am besten. Oder doch vielleicht eine ganz anderen? - Und wenn ja, welche?

mfg.

Bummi 2. Jan 2011 16:16

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.

Mysterio08 3. Jan 2011 08:26

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.

Mysterio08 3. Jan 2011 15:52

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?

Progman 3. Jan 2011 16:32

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.

Bummi 3. Jan 2011 16:48

AW: Form auf Form (nötig?)
 
mit
Delphi-Quellcode:
Form.Parent:=MainForm
ist das Alphablend weg....
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.

Progman 3. Jan 2011 17:15

AW: Form auf Form (nötig?)
 
Zitat:

Zitat von Bummi (Beitrag 1072013)
mit
Delphi-Quellcode:
Form.Parent:=MainForm
ist das Alphablend weg....

Stimmt.
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 :-)

Bummi 3. Jan 2011 17:23

AW: Form auf Form (nötig?)
 
Auch nicht, Wincontrols bekommst Du so nicht abgedeckt....

Mysterio08 4. Jan 2011 15:04

AW: Form auf Form (nötig?)
 
Ich hab es jetzt geschafft. Ich poste mal den ganzen dazugehörigen Code:
Delphi-Quellcode:
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;
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


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