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 panel, disabled und controls (https://www.delphipraxis.net/159348-panel-disabled-und-controls.html)

delphia 24. Mär 2011 11:03

panel, disabled und controls
 
Hallo,

ich habe einige comtrols auf einem panel (TGridPanel). Wenn ich panel.enabled := false setze sind damit auch die controls stillgelegt. So weit, so gut. Wie kann ich es erreichen, dass die controls auch das Aussehen für den disabled Zustand annehmen?

Eigentlich möchte ich nur wissen, ob es möglich ist auf das Ändern der Enabled Eigenschaft des panels zu reagieren? Wenn ja ist der Rest ja kein Problem, in einer Schleife die controls ermitteln und deren enabled Eigenschaft setzen.

Danke.

Jumpy 24. Mär 2011 11:14

AW: panel, disabled und controls
 
Wenn du das Panel im Code disabled wird, kannst du doch an der selben Stelle auch die Elemente darauf disabeln.

vergessen 24. Mär 2011 11:45

AW: panel, disabled und controls
 
Sinngemäß

Delphi-Quellcode:
panel1.enabled := false;
edit1aufpanel1.enabled := panel1.enabled;
usw.

oder findcomponents-Schleife, wie Du schon schriebst.

Für sowas bin ich oft noch zu faul, daher also
Delphi-Quellcode:
panel1.visible := false
;-)

SirThornberry 24. Mär 2011 12:00

AW: panel, disabled und controls
 
Du kannst die Methode SetEnabled des Panels überschreiben und dir somit ein eigenes Event EnabledChanged für das Panel basteln oder eben wenn gewünscht alle children auf enabled=false setzen

Thom 24. Mär 2011 12:34

AW: panel, disabled und controls
 
Zitat:

Zitat von SirThornberry (Beitrag 1090678)
Du kannst die Methode SetEnabled des Panels überschreiben...

Ja, dann müßten aber neue Komponenten abgeleitet und installiert werden - jede Menge Arbeit...

Einfacher geht's, wenn die Nachrichtenverarbeitung des betreffenden Panels überschrieben wird:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  OldWindowProc:=Panel1.WindowProc; //alte Methode merken
  Panel1.WindowProc:=NewWindowProc; //auf neue Methode umleiten
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Panel1.WindowProc:=OldWindowProc; //alte Methode wieder herstellen
end;

procedure TForm1.NewWindowProc(var Message: TMessage);
var
  n: Integer;
begin
  case Message.Msg of
    CM_ENABLEDCHANGED:
    begin
      with Panel1 do
        for n:=0 to ControlCount-1 do
          Controls[n].Enabled:=Enabled; //-> Child-Elemente anpassen
    end;
  end;
  OldWindowProc(Message); //alte Methode aufrufen
end;

DeddyH 24. Mär 2011 12:54

AW: panel, disabled und controls
 
Oder so:
Delphi-Quellcode:
type
  TPanel = class(ExtCtrls.TPanel)
  protected
    procedure WndProc(var Msg: TMessage); override;
  end;

  TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
  ...

procedure TPanel.WndProc(var Msg: TMessage);
var i: integer;
begin
  if Msg.Msg = CM_ENABLEDCHANGED then
    for i := 0 to ControlCount - 1 do
      Controls[i].Enabled := Enabled;
  inherited;
end;
[edit]Noch spartanischer:
Delphi-Quellcode:
type
  TPanel = class(ExtCtrls.TPanel)
  private
    procedure CMEnabledChanged(var Msg: TMessage); message CM_ENABLEDCHANGED;
  end;

...

procedure TPanel.CMEnabledChanged(var Msg: TMessage);
var i: integer;
begin
  if Msg.Msg = CM_ENABLEDCHANGED then
    for i := 0 to ControlCount - 1 do
      Controls[i].Enabled := Enabled;
  inherited;
end;

vergessen 24. Mär 2011 13:09

AW: panel, disabled und controls
 
Dat vom Thom sieht selbst für einen faulen Sack wie mich ganz gut/bequem nachrüstbar aus!

Mal schaun und Dankeschön für die Anregung! :thumb:

@DeddyH: KISS :oops:

Dank an Euch Beide!

DeddyH 24. Mär 2011 13:24

AW: panel, disabled und controls
 
Wie, KISS? Nichts gegen Thoms Vorschlag, aber das wird etwas unübersichtlich, wenn man mehr als 1 Panel auf diese Art erweitern will.

uligerhardt 24. Mär 2011 13:42

AW: panel, disabled und controls
 
A propos KISS: Die if-Schleife :mrgreen: in CMEnabledChanged kannste dir doch sparen.

DeddyH 24. Mär 2011 13:44

AW: panel, disabled und controls
 
Richtig, die war beim C&P hängengeblieben, schadet aber auch nicht :zwinker:

Thom 24. Mär 2011 13:48

AW: panel, disabled und controls
 
@DeddyH:

Böser Trick... 8-)
Danke: Wieder etwas gelernt! :thumb:

DeddyH 24. Mär 2011 13:56

AW: panel, disabled und controls
 
Dieser Trick lohnt sich aber wirklich nur in Sonderfällen, ansonsten wäre eine abgeleitete Komponente wahrscheinlich der bessere Weg.

vergessen 24. Mär 2011 14:10

AW: panel, disabled und controls
 
Zitat:

Zitat von DeddyH (Beitrag 1090695)
Wie, KISS? Nichts gegen Thoms Vorschlag, aber das wird etwas unübersichtlich, wenn man mehr als 1 Panel auf diese Art erweitern will.

Lass es mich doch BITTE erst einmal durchprobieren :shock:

In meinen Programmen steuere ich fast alles über eine TActionList, deren Aktionen.OnUpdate jeweils einige Bedingungen überprüfen.

Sourcecode-"Minimierung/Optimierung" (a la Himitsu) ist NICHT mein Ziel.

Optimierung hin oder her: Wenn ich's nicht kapiere, wird's nicht übernommen, da ich in vier Wochen noch nachvollziehen können möchte, was ich vor vier Wochen gemacht habe 8-)

Sorry für OT

delphia 24. Mär 2011 14:35

AW: panel, disabled und controls
 
@Thom,
@DeddyH

so etwas habe ich gesucht, funktioniert prima.

Sicher hätte man auch ein procedure schreiben können, die controls und panel entsprechend einstellt. Halte das aber für die sicherere, weil immer greifend wenn enabled geändert wird, und elegantere Methode (Stil).

Denke diese Vorgehensweise wird mir auch in anderen Situationen helfen.

Danke dafür.

DeddyH 25. Mär 2011 10:58

AW: panel, disabled und controls
 
Gerade erst gesehen: http://delphi.about.com/b/2011/03/24...asstbutton.htm
Vielleicht wird es nach der Lektüre klarer, was ich da tue, denn genau das ist in dem Artikel beschrieben. :-D


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