Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Semitransparente Abdeckung eines Grids (https://www.delphipraxis.net/165702-semitransparente-abdeckung-eines-grids.html)

ULIK 12. Jan 2012 09:09

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

MaBuSE 12. Jan 2012 10:31

AW: Semitransparente Abdeckung eines Grids
 
Versuch doch mal ein TImage mit einem halbtransparenten *.png draufzulegen.

Das kannst Du dann mit
Delphi-Quellcode:
Image1.visible := True/False;
an und ausschalten und es "fängt" Deine Mausklicks ab.

ULIK 12. Jan 2012 11:50

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

uligerhardt 12. Jan 2012 12:00

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 http://www.devexpress.com/Subscripti...ge=3#autolist1 nach "Locked View Image" suchen)

Progman 12. Jan 2012 12:01

AW: Semitransparente Abdeckung eines Grids
 
Und wenn du mal Image1.BringToFront aufrufst?

ULIK 12. Jan 2012 12:09

AW: Semitransparente Abdeckung eines Grids
 
Zitat:

Zitat von uligerhardt (Beitrag 1145606)
Das sieht nach cxGrid aus. Dann hilft dir vielleicht das:

Jup, ist ein cxGrid. Leider kann ich im Moment noch nicht auf die aktuelle Version hochziehen, sondern bin noch auf einen etwas älteren Build (56) angewiesen. Somit fällt diese Lösung erst mal flach.

Zitat:

Zitat von Progman (Beitrag 1145608)
Und wenn du mal Image1.BringToFront aufrufst?

Das funktioniert leider auch nicht.

Tyrolean 12. Jan 2012 12:19

AW: Semitransparente Abdeckung eines Grids
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von ULIK (Beitrag 1145553)
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).

Ich habe mir mal mit Hilfe so ein Teil gebastelt, ging dann auch, habe es dann aber doch nie eingesetzt. Vielleicht hilft es dir ja etwas.

Gruß aus den Bergen
Günter

ULIK 12. Jan 2012 12:51

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

MaBuSE 12. Jan 2012 12:55

AW: Semitransparente Abdeckung eines Grids
 
Zitat:

Zitat von ULIK (Beitrag 1145604)
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.

Stimmt, hab ich auch gerade mal ausprobiert. :-(

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:
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;
Ich hoffe das hilft Dir.

Tyrolean 12. Jan 2012 12:58

AW: Semitransparente Abdeckung eines Grids
 
Zitat:

Zitat von ULIK (Beitrag 1145620)
das ist ja genau was ich suche! Funktioniert wie geschmiert. :party:
Nun die Frage: darf ich deine Unit auch in einem kommerziellen Projekt einsetzen?

Klar. Habe ich ja auch mit Hilfe anderer gemacht. Schön wäre es, wenn du diese Unit bei Verbesserungen
mir dann auch wieder zukommen lassen könntest.

Gruß aus den Bergen
Günter


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 Uhr.
Seite 1 von 2  1 2      

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