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/)
-   -   Delphi Lightbox-Effekt für Form (https://www.delphipraxis.net/140886-lightbox-effekt-fuer-form.html)

Codewalker 28. Sep 2009 11:42


Lightbox-Effekt für Form
 
Ich möchte gerne in einem kleinen Dateimanager für Bilder ein Vorschau anbieten, wie man sie von Webseiten kennt. Dabei soll der Hauptbereich des Formulars (ohne Menüleiste) abgedunkelt werden und zentral das Bild angezeigt werden. Bei Webseiten läuft das afaik unter dem Namen "Lightbox". Wie würdet ihr einen solchen Effekt in Delphi umsetzen?

Meine Versuche bisher:
:arrow: Ein halbtransparentes PNG in einem TImage: Klappt nicht, weil TImage kein echtes Fenster und hinter anderen Komponenten verschwindet
:arrow: Das ganze mit TImage32 von Graphics32: Klappt nicht. TImage32 bleibt zwar im Vordergrund, ist aber selbst nicht durchsichtig.

Grolle 28. Sep 2009 13:08

Re: Lightbox-Effekt für Form
 
Hi,

wie wäre es mit Alpha Blend? - Auf eine Form und die andere Form dann im Vordergrund anzeigen.

Viele Grüße ...

// Edit - kann man in einer Schleife auch sehr schön stufenweise machen

Brainshock 28. Sep 2009 15:13

Re: Lightbox-Effekt für Form
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,

ich hab das mal für modale Fenster gemacht, d.h. wenn ein modales Fenster geöffnet wird, legt sich ein halbtransparentes graues Formular zwischen Hauptfenster und modales Fenster.

Den Quellcode (Demoexe) hab ich mal in den Anhang gepackt, vielleicht hilft dir das weiter.

Gruß,
Matthias

Uwe Raabe 28. Sep 2009 18:16

Re: Lightbox-Effekt für Form
 
Ich habe dafür mal folgende Funktion geschrieben:

Delphi-Quellcode:
function ShowModalDimmed(Form: TForm; Centered: Boolean = true): TModalResult;
var
  Back: TForm;
begin
  Back := TForm.Create(nil);
  try
    Back.Position := poDesigned;
    Back.BorderStyle := bsNone;
    Back.AlphaBlend := true;
    Back.AlphaBlendValue := 192;
    Back.Color := clBlack;
    Back.SetBounds(0, 0, Screen.Width, Screen.Height);
    Back.Show;
    if Centered then begin
      Form.Left := (Back.ClientWidth - Form.Width) div 2;
      Form.Top := (Back.ClientHeight - Form.Height) div 2;
    end;
    result := Form.ShowModal;
  finally
    Back.Free;
  end;
end;

chris 19. Okt 2009 13:54

Re: Lightbox-Effekt für Form
 
Huhu,

genau sowas brauchte ich mal für die aufrufende Form, nicht den ganzen Desktop.

Vielleicht kann es jemand gebrauchen:

Delphi-Quellcode:
function ShowModalDimmed(Form, ParentForm: TForm): TModalResult;
var
  Back: TForm;
  i: Byte;
begin
  Back := TForm.Create(nil);
  try
    Back.Position := ParentForm.Position;
    Back.BorderStyle := ParentForm.BorderStyle;
    Back.BorderIcons := [];
    Back.AlphaBlend := true;
    Back.AlphaBlendValue := 0;
    Back.Color := clBlack;
    with ParentForm do Back.SetBounds(Left, Top, Width, Height);
    Back.Show;
    for i := 1 to 185 do
    begin
      Back.AlphaBlendValue := i;
      Sleep(2)
    end;
    Form.Left := ParentForm.left + ((ParentForm.Width - Form.Width) div 2);
    Form.Top := ParentForm.Top + ((ParentForm.Height - Form.height) div 2);
    Result := Form.ShowModal
  finally
    Back.Free;
    ParentForm.BringToFront
  end
end;

xOli30 25. Aug 2011 09:06

AW: Lightbox-Effekt für Form
 
Hallo

Ich möchte dieses veraltete Thema noch mal eben aufgreifen, da ich das hier beschriebene gerade benötige. Kann mir evt jemand sagen wie und mit welchen Argumenten die Funktion aufgerufen werden muß? Ich will die "LightBox" Effect als Loading Anzeige nutzen. Wenn also geladen wird, soll sich der "Fenster-Bereich" dimmen und zentral ein Loading-Image angezeigt werden.

Vielen Dank

DeddyH 25. Aug 2011 09:16

AW: Lightbox-Effekt für Form
 
Welche Version denn? Bei der von Uwe gibst Du lediglich das Formular an, das Du anzeigen möchtest, bei der von cris zusätzlich noch das abzudunkelnde dahinterliegende Formular.

xOli30 25. Aug 2011 09:18

AW: Lightbox-Effekt für Form
 
Hallo

Was meinst du mit Version?
Das heisst also wenn ich im aktuellen Fenster einen Loading-Bereich simulieren will geb ich einfach als Übergabe Form1 (z.B.) ?

lg

DeddyH 25. Aug 2011 09:23

AW: Lightbox-Effekt für Form
 
Ich meinte, welche Funktion Du denn verwendest, es wurden ja verschiedene gepostet.

xOli30 25. Aug 2011 09:27

AW: Lightbox-Effekt für Form
 
ah ok. Ich bin an der von Chris da ich den Dimmbereich nur im aktuellen Fenster haben will und nicht über den ganzen Desktop.

xOli30 25. Aug 2011 09:30

AW: Lightbox-Effekt für Form
 
Ich bekomme die Fehlermeldung "Aus einem sichtbaren Fenster kann kein modales gemacht werden" ?!

Was is denn überhaupt mit parent Form gemeint?
Ich hab doch nur 1 Form ?!

DeddyH 25. Aug 2011 10:05

AW: Lightbox-Effekt für Form
 
Das Parent Form soll wohl das sein, das abgedunkelt wird. Das eigentlich anzuzeigende ist dann das Form.

xOli30 25. Aug 2011 10:12

AW: Lightbox-Effekt für Form
 
Habs hinbekommen.
Hab das ShowModal rausgenommen und auch die 2 Zeilen bei "finally", da ich den Dimmeffekt ja erst ausschalten will, wenn die ladeaktion beendet ist. Die dynamisch erstellte Form geb ich dann frei wenn das Programm zu Ende geladen hat.

Delphi-Quellcode:
function TForm1.ShowModalDimmed(Form, ParentForm: TForm): TModalResult;
var
  Back: TForm;
  i: Byte;
begin
  Back := TForm.Create(nil);
  try
    Back.Position := ParentForm.Position;
    Back.BorderStyle := ParentForm.BorderStyle;
    Back.BorderIcons := [];
    Back.AlphaBlend := true;
    Back.AlphaBlendValue := 0;
    Back.Color := clBlack;
    with ParentForm do Back.SetBounds(Left, Top, Width, Height);
    Back.Show;
    for i := 1 to 185 do
    begin
      Back.AlphaBlendValue := i;
      Sleep(2);
    end;
    Form.Left := ParentForm.left + ((ParentForm.Width - Form.Width) div 2);
    Form.Top := ParentForm.Top + ((ParentForm.Height - Form.height) div 2);
  finally
    Temp := Back;
  end
end;
Danke :-D

WladiD 26. Apr 2012 14:49

AW: Lightbox-Effekt für Form
 
Sorry, dass ich das Thema aus der Vergessenheit zurückhole, aber ich habe hier zum Testen eine Unit für den Lightbox-Effekt (basierend auf den Vorschlägen) umgeschrieben und wollte es Euch nicht vorenthalten.

Der Dimm-Effekt ist damit animiert, ohne die Anwendung zu blockieren.

Delphi-Quellcode:
unit FormUtils;

interface

uses
  SysUtils, Classes, Forms, Graphics, Controls, ExtCtrls;

function ShowModalDimmed(Form: TForm): TModalResult;

implementation

type
  TDimmFormController = class(TComponent)
  private
    FFadeTimer: TTimer;

    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FadeTimer(Sender: TObject);
  public
    constructor Create(Owner: TComponent); override;
  end;

function ShowModalDimmed(Form: TForm): TModalResult;
var
  Back, ParentForm: TForm;
begin
  ParentForm := Screen.ActiveForm;
  Back := TForm.Create(nil);
  try
    Back.Position := ParentForm.Position;
    Back.BorderStyle := ParentForm.BorderStyle;
    Back.BorderIcons := [];

    Back.PopupParent := ParentForm;

    Back.AlphaBlend := True;
    Back.AlphaBlendValue := 0;
    Back.Color := clBlack;
    with ParentForm do Back.SetBounds(Left, Top, Width, Height);
    Back.Show;
    TDimmFormController.Create(Back);
    Result := Form.ShowModal;
  finally
    Back.Close;
    ParentForm.SetFocus;
  end
end;

{ TDimmFormController }

constructor TDimmFormController.Create(Owner: TComponent);
begin
  inherited Create(Owner);

  FFadeTimer := TTimer.Create(Self);
  FFadeTimer.Interval := 25;
  FFadeTimer.OnTimer := FadeTimer;

  TForm(Owner).OnClose := FormClose;
end;

procedure TDimmFormController.FadeTimer(Sender: TObject);
const
  FadeTo: Integer = 120;
var
  Form: TForm;
begin
  Form := TForm(Owner);
  if Form.AlphaBlendValue < FadeTo then
    Form.AlphaBlendValue := Form.AlphaBlendValue + 10;
  FFadeTimer.Enabled := Form.AlphaBlendValue < FadeTo;
end;

procedure TDimmFormController.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FFadeTimer.Enabled := FALSE;
  Action := caFree;
end;

end.
Die Verwendung ist dann nach diesem Schema:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  SubForm: TForm1;
begin
  SubForm := TForm1.Create(Self);
  try
    ShowModalDimmed(SubForm);
  finally
    SubForm.Free;
  end;
end;

Satyr 5. Dez 2012 16:48

AW: Lightbox-Effekt für Form
 
Huhu,

ich klinke mich hier mal ein. Ich habe den Code von Chris verwendet, möchte aber das Selbe machen wie Oli. Also eine "Wird geladen Anzeige.
Im Grunde funktioniert es auch. Das Fenster wird abgedunkelt, mein Ladefenster wird gezeigt - aber das wars. Das ich das am Ende free'n muss, per Hand, ist mir klar. Ich möchte aber das mein Programm solange das Ladefenster auf ist, genau das tut. "darunter" eine andere Form öffnen und das onCreate von dieser ausführen. Also weiterarbeiten. Das passiert aber leider nicht.
Warum?
Application.ProcessMessages; hilft leider auch nicht...

Gruß,
Andreas

borncrush 5. Dez 2012 18:51

AW: Lightbox-Effekt für Form
 
Na durch ShowModal wird der verwendete Thread (in diesem Bsp.: Hauptthread) gestoppt, bis das Modal abgeschlossen....oder??!

Satyr 5. Dez 2012 23:11

AW: Lightbox-Effekt für Form
 
Wie könnte ich das lösen? Einfaches .show; ? Aber bleibt dann trotzdem unter dem Ladefenster alles "unklickbar"? Das wär mir wictig...
(Bin grade nicht zu Hause, sonst würde ich es testen.)

stahli 5. Dez 2012 23:41

AW: Lightbox-Effekt für Form
 
Du könntest den Ladeprozess in Dein transparentes Formular verlagern.

Ansonsten hatte shark mal etwas ähnliches gebastelt - glaube ich:
http://www.delphipraxis.net/156662-t...-fluessig.html

Satyr 6. Dez 2012 13:56

AW: Lightbox-Effekt für Form
 
Ladeprozess verlagern ginge leider nur mit viel Aufwand, weil ich mir das als Ladebildschirm basteln möchte, den ich in verschiedenen Situationen nutzen kann.

Aber danke für den Hinweis auf das von Shark, ich schau mir das mal an :).

Bummi 6. Dez 2012 15:27

AW: Lightbox-Effekt für Form
 
@Satyr

stahli's Idee ist trotzdem gut und richtig.
Du musst ja das laden selbst nicht ausslagern, sondern dem Construktor nur einen optionalen Zeiger auf eine Prozedur/Methode mitgeben die er aufrufen kann.

Satyr 6. Dez 2012 16:18

AW: Lightbox-Effekt für Form
 
hm... so herum hab ich das noch nicht betrachtet, klingt aber logisch.
Danke, ich versuchs mal :).


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