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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.