mikrocontroller.net

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


Autor: Wolfgang Weinmann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfgang Weinmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralph Rosner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.