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.