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 CheckBox grayed ... (https://www.delphipraxis.net/100405-checkbox-grayed.html)

FriFra 27. Sep 2007 20:33


CheckBox grayed ...
 
Ich hab ein kleines Problem mit Checkboxen auf einem Formular...

Einige CheckBoxen müssen in bestimmten Situationen grayed sein. Dafür gibt es ja den State csGrayed.... allerdings ist die Box dabei checked, was aber nicht in jedem Fall passt. Enabled auf False zu setzen ist auch keine Lösung, da dabei auch der Text ausgegraut ist und eine "grayed checked" Darstellung so auch nicht möglich ist...
Das nächste Problem wäre, dass die grayed Check Boxen auch quasi disabled sein sollen, nur das disabled hier mit dem ausgrauen des Textes zu weit geht... sie soll einfach nicht mehr klickbar sein.

Ich brauche also die Stati:
csGrayedUncheckedLocked
csGrayedCheckedLocked;


Da es sich ja um Standard Windows controls handelt, hoffe ich, dass ich denen einfach eine entspr. Message senden muss um dieses Verhalten auszulösen :gruebel:

gsh 27. Sep 2007 20:36

Re: CheckBox grayed ...
 
hmm nur so als spontane idee:
wenn im OnClick jemand versucht die checkbox zu "enthacken" dann mach des einfach mit einem .checked := true rückgängig

dominikkv 27. Sep 2007 20:46

Re: CheckBox grayed ...
 
oder du nimmst ne checkbox und beschriftest sie nicht, sondern schiebst noch ein label hinterher.
dann sieht das so aus als wäre sie beschriftet, und du kannst die checkbox disablen.

FriFra 27. Sep 2007 20:55

Re: CheckBox grayed ...
 
Nein... das geht beides nicht... Die Checkboxen sollen ja auch mal wieder enabled werden können, da sollen sie sich auch wie eine checkbox verhalten., das ist bei einem daneben liegenden label für die Beschriftung nicht gegeben.
Außerdem sieht man bei einer disableden Box nicht ob sie checked ist... also alles nicht geeignet!

Ich brauche tatsächlich GRAYED-CHECKED und GRAYED-UNCHECKED.... das müssen doch die Controls hergeben, andere Programme können das dch auch :gruebel:

efknarf 28. Sep 2007 01:17

Re: CheckBox grayed ...
 
Hallo,

für deine Zwecke ist es wohl am einfachsten, eine eigene Komponente zu entwerfen, welche diese 4 "Checkstufen" hat. Um die vorhandenenen Checkboxen zu "disablen", ohne daß der Text ausgegraut wird, kannst du diese auf einem Panel oder einer Groupbox platzieren und dann das Panel / die Groupbox ausschalten. Dann sieht die Checkbox aus wie bisher, ist aber nicht mehr anklickbar.

Eine einfache Komponente (allerdings ohne Eingabefocus) wäre vielleicht ein Label, auf welchem je nach Checkstatus ein weißes, graues oder sonstiges Quadrat gezeichnet wird mit einem "X" drin, wenn es gecheckt sein soll.

guidok 28. Sep 2007 05:48

Re: CheckBox grayed ...
 
Ich hab mir auch eine Checkbox selbst gemacht, nachdem es das was ich wollte nicht fertig gab.

Hier der Quellcode, vielleicht kannst du ja was davon nutzen.

Delphi-Quellcode:
const
  //Anwendungsfarben
  clXTBackground = clInactiveCaption;
  clXTDisabledControl = cl3DDkShadow;
  clXTInactiveControl = cl3DLight;
  clXTActiveControl = $00C8F5F9;
  clXTDisabledControlText = clBtnShadow;
  clXTEnabledControlText = clBlack;
  clXTControlBorder = clBtnShadow;
  clXTMarker = $000080FF;


type
  TXTCheckBox = class(TCustomControl)
  private
    PFState: TCheckBoxState;
    FEnabled: Boolean;
    FBoxColor: TColor;
    function GetChecked: Boolean;
    procedure SetChecked(Value: Boolean);
  protected
    procedure Paint; override;
    procedure Toggle; virtual;
    procedure Click; override;
    procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
    procedure CMExit(var Message: TCMGotFocus); message CM_EXIT;
  public
    Caption: TCaption;
    constructor Create(AOwner: TComponent; AParent: TWinControl; ATop:Integer);Reintroduce;
    property State: TCheckBoxState read PFState;
  published
    property Checked: Boolean read GetChecked write SetChecked;
    property Enabled: Boolean read FEnabled write FEnabled default True;
    property OnClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDrag;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnEnter;
    property OnExit;
    property OnKeyPress;
    property OnKeyDown;
    property OnKeyUp;
  end;

//==============================================================================
// XTCheckBox

constructor TXTCheckBox.Create(AOwner: TComponent; AParent: TWinControl; ATop:Integer);
begin
  inherited Create(AOwner);
  Parent:=AParent;
  Top:=ATop;
  Left:=5;
  ControlStyle := [csCaptureMouse, csClickEvents, csDesignInteractive];
  FEnabled := True;
  Width := 117;
  Height := 17;
  FBoxColor:=clXTInactiveControl;
end;

procedure TXTCheckBox.Paint;
var
   R:TRect;
begin
  with Canvas do
  begin
//Linie und Beschriftung
    Pen.Color:=clXTControlBorder;
    Pen.Width:=1;
    MoveTo(0,Height-2);
    LineTo(Width-16,Height-2);
    if FEnabled then Font.Color:=clBtnText
    else Font.Color:=clBtnShadow;
    Brush.Color:=Color;
    TextOut(2,1,Caption);
//Rechteck
    R.Top:=0;
    R.Left:=Width-16;
    R.Bottom:=16;
    R.Right:=Width;
    Brush.Color:=FBoxColor;
    FillRect(R);
    Rectangle(R);
//Checked
    if PFState=cbChecked then
    begin
      Pixels[R.Left+4,R.Top+4]:=clBlack;
      Pixels[R.Left+5,R.Top+5]:=clBlack;
      Pixels[R.Left+6,R.Top+6]:=clBlack;
      Pixels[R.Left+7,R.Top+7]:=clBlack;
      Pixels[R.Left+8,R.Top+8]:=clBlack;
      Pixels[R.Left+9,R.Top+9]:=clBlack;
      Pixels[R.Left+10,R.Top+10]:=clBlack;
      Pixels[R.Left+11,R.Top+11]:=clBlack;
      Pixels[R.Left+4,R.Top+11]:=clBlack;
      Pixels[R.Left+5,R.Top+10]:=clBlack;
      Pixels[R.Left+6,R.Top+9]:=clBlack;
      Pixels[R.Left+7,R.Top+8]:=clBlack;
      Pixels[R.Left+8,R.Top+7]:=clBlack;
      Pixels[R.Left+9,R.Top+6]:=clBlack;
      Pixels[R.Left+10,R.Top+5]:=clBlack;
      Pixels[R.Left+11,R.Top+4]:=clBlack;
    end;
  end;
end;


function TXTCheckBox.GetChecked;
begin
  Result := not(State = cbUnChecked);
end;


procedure TXTCheckBox.SetChecked;
begin
  if Value and FEnabled then
    PFState := cbChecked
  else
    PFState := cbUnChecked;
  Paint;
end;


procedure TXTCheckBox.Toggle;
begin
  Checked := not Checked;
end;


procedure TXTCheckBox.Click;
begin
  if FEnabled then begin
    Toggle;
    SetFocus;
  end;
  inherited Click;
end;

procedure TXTCheckBox.CMEnter(var Message: TWMNoParams);
begin
  FBoxColor:=clXTActiveControl;
  Paint;
  inherited;
end;

procedure TXTCheckBox.CMExit(var Message: TWMNoParams);
begin
  FBoxColor:=clXTInactiveControl;
  Paint;
  inherited;
end;


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