Forum: PC-Programmierung Delphi: MenueItem aktiviert Checkbox - aber nicht vice versa


von Wolfgang Weinmann (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Delphi Experten,

ich brauche Eure Hilfe: Mit der angehängter Datei von einem Tutorial
habe mit folgendem Code ein Verständnisproblem:

Wird ein MenuSystemClick ausgeführt, dann wird durch die Anweisung
CheckBoxSystem.Checked := NOT CheckboxSystem.Checked;
ausgeführt. Durch diese Anweisung wird aber auch die Ausführung von
CheckBoxClick gestartet.
Prinzip: Änderung der CheckBoxSystem.Checked-Variable bewirkt die
Ausführung
von CheckBoxClick, als ob wirklich diese Checkbox geklickt worden
wäre.


Aber - das gilt nicht umgekehrt!
Durch MenuSystem.Checked := CheckBoxSystem.Checked; wird nicht
MenuSystemClick ausgeführt.


Ist auch klar - sonst würde das ewig hin und her gehen. Aber welche
Logik steckt dahinter?
Wann wird bei einer checked-Änderung auch die entsprechende
Clicked-Routine ausgeführt?

Warum wird einmal mit der Zuweisung ein ONClick mit der entsprechenden
Prozedur abgearbeitet und das andere mal nicht?

MfG


Wolfgang

von Wolfgang Weinmann (Gast)


Lesenswert?

Falls Ihr zu faul zum entpacken seid:

unit Checkm_u; { Projekt CHECKM * Herwig Reidlinger }

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, Menus;

type
  TFormCheckM = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    CheckBoxSystem: TCheckBox;
    CheckBoxMin: TCheckBox;
    CheckBoxMax: TCheckBox;
    RadioButtonDialog: TRadioButton;
    RadioButtonNone: TRadioButton;
    RadioButtonSingle: TRadioButton;
    RadioButtonSizeable: TRadioButton;
    MainMenu1: TMainMenu;
    Menu_Bordericon: TMenuItem;
    MenuSystem: TMenuItem;
    MenuMin: TMenuItem;
    MenuMax: TMenuItem;
    Menu_Borderstyle: TMenuItem;
    MenuDialog: TMenuItem;
    MenuNone: TMenuItem;
    MenuSingle: TMenuItem;
    MenuSizeable: TMenuItem;
    procedure CheckBoxClick(Sender: TObject);
    procedure RadioButtonClick(Sender: TObject);
    procedure MenuSystemClick(Sender: TObject);
    procedure MenuMinClick(Sender: TObject);
    procedure MenuMaxClick(Sender: TObject);
    procedure MenuStyleClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormCheckM: TFormCheckM;

implementation

{$R *.DFM}

procedure TFormCheckM.CheckBoxClick(Sender: TObject);
begin
   IF CheckBoxSystem.Checked
      THEN FormCheckM.BorderIcons := FormCheckM.BorderIcons +
[biSystemMenu]
      ELSE FormCheckM.BorderIcons := FormCheckM.BorderIcons -
[biSystemMenu];
   IF CheckBoxMin.Checked
      THEN FormCheckM.BorderIcons := FormCheckM.BorderIcons +
[biMinimize]
      ELSE FormCheckM.BorderIcons := FormCheckM.BorderIcons -
[biMinimize];
   IF CheckBoxMax.Checked
      THEN FormCheckM.BorderIcons := FormCheckM.BorderIcons +
[biMaximize]
      ELSE FormCheckM.BorderIcons := FormCheckM.BorderIcons -
[biMaximize];
   MenuSystem.Checked := CheckBoxSystem.Checked;
   MenuMin.Checked := CheckBoxMin.Checked;
   MenuMax.Checked := CheckBoxMax.Checked;
end;

procedure TFormCheckM.RadioButtonClick(Sender: TObject);
begin
   IF Sender = RadioButtonDialog   THEN FormCheckM.BorderStyle :=
bsDialog;
   IF Sender = RadioButtonNone     THEN FormCheckM.BorderStyle :=
bsNone;
   IF Sender = RadioButtonSingle   THEN FormCheckM.BorderStyle :=
bsSingle;
   IF Sender = RadioButtonSizeable THEN FormCheckM.BorderStyle :=
bsSizeable;
   MenuDialog.Checked := RadioButtonDialog.Checked;
   MenuNone.Checked := RadioButtonNone.Checked;
   MenuSingle.Checked := RadioButtonSingle.Checked;
   MenuSizeable.Checked := RadioButtonSizeable.Checked;
end;

procedure TFormCheckM.MenuSystemClick(Sender: TObject);
begin
   CheckBoxSystem.Checked := NOT CheckboxSystem.Checked;
end;

procedure TFormCheckM.MenuMinClick(Sender: TObject);
begin
   CheckBoxMin.Checked := NOT CheckboxMin.Checked;
end;

procedure TFormCheckM.MenuMaxClick(Sender: TObject);
begin
   CheckBoxMax.Checked := NOT CheckboxMax.Checked;
end;

procedure TFormCheckM.MenuStyleClick(Sender: TObject);
begin
   IF Sender = MenuDialog   THEN RadioButtonDialog.Checked := TRUE;
   IF Sender = MenuNone     THEN RadioButtonNone.Checked := TRUE;
   IF Sender = MenuSingle   THEN RadioButtonSingle.Checked := TRUE;
   IF Sender = MenuSizeable THEN RadioButtonSizeable.Checked := TRUE;
end;

end.

von Ralph Rosner (Gast)


Lesenswert?

Hi,

das liegt einfach daran, dass die beiden Komponenten in der VCL von
Borland unterschiedlich programmiert wurden. Die CheckBox ruft bei
setzen der Eigenschaft "Checked" intern "SetChecked" auf, was
wiederum "State" über die Methode "SetState" setzt, wo dann die
Methode "Click" aufgerufen wird, welche ein "OnClick" auslöst. Das
MenuItem ruft in seiner "SetChecked"-Methode eine API-Funktion
"CheckMenuItem" auf (das liegt daran, dass das Menu in Delphi keine
"selbstgezeichnete" Komponente, sondern nur eine Schnittstelle zu
einem normalen Menü aus Windows ist), aber eben nicht die Methode
"Click" für das entsprechende Ereignis. Zur Verdeutlichung zwei
Auszüge aus der VCL:

procedure TCustomCheckBox.SetChecked(Value: Boolean);
begin
  if Value then State := cbChecked else State := cbUnchecked;
end;

procedure TCustomCheckBox.SetState(Value: TCheckBoxState);
begin
  if FState <> Value then
  begin
    FState := Value;
    if HandleAllocated then
      SendMessage(Handle, BM_SETCHECK, Integer(FState), 0);
    if not ClicksDisabled then Click;
  end;
end;

----------

procedure TMenuItem.SetChecked(Value: Boolean);
begin
  if FChecked <> Value then
  begin
    FChecked := Value;
    if (FParent <> nil) and not (csReading in ComponentState) then
      CheckMenuItem(FParent.Handle, FCommand, MF_BYCOMMAND or
Checks[Value]);
    if Value and FRadioItem then
      TurnSiblingsOff;
  end;
end;

Gruß

Ralph

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.