![]() |
Semitransparente Abdeckung eines Grids
Hallo,
Welche Möglichkeiten hat man denn, um in einem Programm einen Teil des GUIs (in dem Fall ein Grid) abzudunkeln (so als ob man ein semitransparentes Panel darüber plaziert hätte), und der abgedunkelte Bereich sollte dann zusätzlich noch einen Schriftzug enthalten. Was ich bisher gefunden habe, war es mit einer Form mit Alphablennding zu probieren. Geht zwar, aber dann muß ich die Form bei Größenänderungen oder Positionswechslen des Grids immer synchron mitziehen. Modal kann ich sie auch nicht machen , da im Rest des Programms weiter gearbeitet werden muß. Mir wäre es irgendwie lieber, wenn ich auf eine Form verzichten könnte und statt dessen so etwas wie ein semitransparentes Panel drüber legen könnte (ohne externe Komponenten). Grüße, Uli |
AW: Semitransparente Abdeckung eines Grids
Versuch doch mal ein TImage mit einem halbtransparenten *.png draufzulegen.
Das kannst Du dann mit
Delphi-Quellcode:
an und ausschalten und es "fängt" Deine Mausklicks ab.
Image1.visible := True/False;
|
AW: Semitransparente Abdeckung eines Grids
Liste der Anhänge anzeigen (Anzahl: 1)
Hab ich nun gerade mal ausprobiert. Funktioniert an sich schon, nur wenn mein Bereich der abgedeckt wird z.B. einen Button enthält, so wird dieser nicht abgedeckt (obwohl er ja in dem Fall gar nicht benutzbar sein sollte). Oder wenn ich ein Tabsheet abdecken will, das ein Grid enthält, so wird zwar das Sheet abgedeckt, aber nicht das Grid selbst. :(
Ich bin dabei immer so vorgegangen, daß ich den Parent des Images auf das abzudeckende Control gesetzt hab mit Align = alClient. Ich hab mal einen Screenshot angehängt. Der dunkle Bereich ist der abgedunkelte und man sieht schön, wie der Controls auf dem Sheet nicht abgedeckt werden. Nur falls es etwas ausmachen sollte: arbeiten tu ich unter Windows 7 mit Delphi XE. Grüße, Uli |
AW: Semitransparente Abdeckung eines Grids
Liste der Anhänge anzeigen (Anzahl: 1)
Das sieht nach cxGrid aus. Dann hilft dir vielleicht das:
Anhang 36046 (auf ![]() |
AW: Semitransparente Abdeckung eines Grids
Und wenn du mal Image1.BringToFront aufrufst?
|
AW: Semitransparente Abdeckung eines Grids
Zitat:
Zitat:
|
AW: Semitransparente Abdeckung eines Grids
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Gruß aus den Bergen Günter |
AW: Semitransparente Abdeckung eines Grids
Hallo Günther,
das ist ja genau was ich suche! Funktioniert wie geschmiert. :party: Nun die Frage: darf ich deine Unit auch in einem kommerziellen Projekt einsetzen? Grüße, Uli |
AW: Semitransparente Abdeckung eines Grids
Zitat:
Aber evtl reicht es Dir ja schon, wenn Du "nur" alle Componenten des Containers enabled auf False setzt. Das ist ja mit einer einfachen For Schleife erledigt. Hier ein kleines Beispiel. Einfach ein Form mit einem Panel mit folgenden Imhalt: Button, Editfeld, RadioButton, Grid, ... Dann eine CheckBox1 auf das Form1 legen und folgenden Code einfügen. Das Panel1 inkl. aller enthaltener Komponenten werden Enabled False/True und jeweils ausgegraut. Man könnte auch noch ein Color in der proc setzen oder einzelne Komponenten gesondert behandeln...
Delphi-Quellcode:
Ich hoffe das hilft Dir.
procedure CompEnabler(pForm: TCustomForm; pComp: TControl; pEnabled: Boolean);
var i: Integer; // optional const EnabledColor: array[Boolean] of TColor = (clBtnFace, clWindow); // --optional begin for i := 0 to pForm.ComponentCount-1 do begin if pForm.Components[i] is TControl then begin if ((pForm.Components[i] as TControl).Parent = pComp) or (pForm.Components[i] = pComp) then begin (pForm.Components[i] as TControl).Enabled := pEnabled; // optional if (pForm.Components[i] is TEdit) then begin (pForm.Components[i] as TEdit).Color := EnabledColor[pEnabled]; end; // --optional end; end; end; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin CompEnabler(Form1, Panel1, CheckBox1.Checked); end; |
AW: Semitransparente Abdeckung eines Grids
Zitat:
mir dann auch wieder zukommen lassen könntest. Gruß aus den Bergen Günter |
AW: Semitransparente Abdeckung eines Grids
Danke!
Änderungen bekommst Du auf alle Fälle geschickt. Grüße, Uli |
AW: Semitransparente Abdeckung eines Grids
Zitat:
Grüße, Uli |
AW: Semitransparente Abdeckung eines Grids
Zitat:
Pack mal ein TMemo auf ein Form, füll es mit Text, schalte beide Scrollbalken an (
Delphi-Quellcode:
) und erzeuge dann den Schleier.
scrollbars := ssBoth
Delphi-Quellcode:
Ich hoffe das ist so richtig.
var
t: TSchleier; procedure TForm1.Button1Click(Sender: TObject); begin if not Assigned(t) then begin t := TSchleier.Create(self); t.HideControl := Memo1; t.MessageText := 'Test'; t.Active := True; end else begin t.Active := False; t.Free; t := nil; end; end; Der Scheier wird auf das TMemo gelegt. Folgende Probleme sind mir aufgefallen:
Delphi-Quellcode:
Ich hoffe das hilft Dir.
procedure TSchleier.SetActive(const Value: Boolean);
begin if FActive = Value then exit; FActive := Value; if FActive then begin DoThunk; FHook := SetWindowsHookEx(WH_CALLWNDPROC, FStub, 0, GetCurrentThreadId); if FForm = nil then FForm := TSchleierForm.mgmCreate(TWinControl(HideControl.Owner)); MessageText := MessageText; FForm.HideControl := HideControl; end else begin if FForm <> Nil then FForm.HideControl := nil; if FHook <> 0 then UnhookWindowsHookEx(FHook); FHook :=0; end; // if (FForm <> Nil) then begin FForm.Visible := Value; end; HideControl.Enabled := not Value; // <-- end; |
AW: Semitransparente Abdeckung eines Grids
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe mir erlaubt, die uSchleier um einen class helper zu erweitern und die Unit von DevExpress zu befreien. Damit ist es nun sehr einfach möglich den Schleier zu verwenden. Jedes TWinControl wird damit um 2 Eigenschaften erweitert.
Beisp.
Delphi-Quellcode:
Viel Spaß
...
uses uSchleier; ... procedure TForm1.Button1Click(Sender: TObject); begin Panel1.SchleierMessage := 'MaBuSE'; Panel1.SchleierActive := True; end; procedure TForm1.Button2Click(Sender: TObject); begin Panel1.SchleierActive := False; end; procedure TForm1.Button3Click(Sender: TObject); begin Panel1.SchleierActive := not Panel1.SchleierActive; end; ... |
AW: Semitransparente Abdeckung eines Grids
Fein!
Was mich noch interessieren würde: hast Du einmal versucht, einen OnClick Event zu verwenden? Das funktioniert bei mir hier nämlich gar nicht. Zum einen, wird der Event nicht an die Form übergeben. Hier müßte es wohl
Delphi-Quellcode:
heißen. Zum anderen funktionieren die Events dann aber auch nicht, weil das Fenster die Nachricht nicht bekommt. Hier dürfte das Problem darin liegen, daß im FormActivate der TSchleierform der Fokus ja gleich wieder an das aufrufende Control zurückgegeben wird. Somit wird bei einem Mausklick die Schleierform erst aktiviert und verliert sofort wieder den Fokus, weswegen wohl dann die Messages des Mausklicks ins Leere laufen. Nimmt man die Rückfokusierung raus, dann geht's, aber gerade die Rückfokusierung ist eigentlich schon erforderlich.
procedure TSchleier.SetActive(const Value: Boolean);
begin if FActive = Value then exit; FActive := Value; if FActive then begin DoThunk; FHook := SetWindowsHookEx(WH_CALLWNDPROC, FStub, 0, GetCurrentThreadId); if FForm = nil then FForm := TSchleierForm.mgmCreate(TWinControl(HideControl.Owner)); MessageText := MessageText; FForm.HideControl := HideControl; OnClick := OnClick; <-- ULIK: Event durchschleifen OnDblClick := OnDblClick; <-- ULIK: Event durchschleifen end ...
Delphi-Quellcode:
Hast Du eine Idee, wie man das lösen könnte?
procedure TSchleierForm.FormActivate(Sender: TObject);
begin if csdestroying in ComponentState then exit; if Hidecontrol = nil then exit; // exit; here and events are working if (oOverForm <> nil) and (TCustomForm(oOverForm).Canfocus) and (oOverForm.Enabled) and (oOverForm.visible) then TCustomForm(oOverForm).SetFocus; end; Grüße, Uli |
AW: Semitransparente Abdeckung eines Grids
Zitat:
Zitat:
Mit
Delphi-Quellcode:
ändert sich nix.
i := i;
In so einem Fall sollte man immer
Delphi-Quellcode:
verwenden.
objekt.i := anderesobjekt.i;
Ich hoffe diese Anregung hilft Dir. |
AW: Semitransparente Abdeckung eines Grids
Zitat:
Zitat:
:-D Grüße, Uli |
AW: Semitransparente Abdeckung eines Grids
Zitat:
Ich würde es daher ändern in z.B.
Delphi-Quellcode:
.
SetMessageText(FMessageText);
Damit wäre es dann eindeutig, was man erreichen möchte. |
AW: Semitransparente Abdeckung eines Grids
Da hast Du recht, besser lesbar wäre es dann. Wobei es eh egal ist, denn ohne die Lösung des Problems mit dem Fokus und den Click-Messages bringt das sowieso nichts.
|
AW: Semitransparente Abdeckung eines Grids
Liste der Anhänge anzeigen (Anzahl: 1)
So, hab mich mal etwas gespielt. Die angehängte Version von uSchleier reagiert nun auf (Doppel)Klicks auf den Schleier.
Hier im Detail:
Alles in allem zwar etwas Gefrickel, aber wenn's hilft ... :-D Grüße, Ulrich |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:02 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-2025 by Thomas Breitkreuz