我有一个 Checkbox1,我想自定义当用户单击复选框的标题(文本)时,它不会更改其状态(选中/未选中),但只有在单击实际复选框方格时才会更改。
这是具有 2 个全局变量的当前代码,一个表示何时跳过更改状态,另一个表示记住当前状态并确保在 OnClick 之后保持不变 - 因为当流处于 OnClick 时状态已经更改:
var
gSkipClick:boolean = false;
gPrevState:boolean;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
// Make sure previous state is assigned when Skip
if gSkipClick then
Checkbox1.Checked := gPrevState;
end;
procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (x > 12) then
begin
// Click outside checkbox square
gSkipClick := True; // skip Click
gPrevState := CheckBox1.Checked; // save current state
end
else
gSkipClick := False; // enable Click
end;
现在我想用 TCheckBox 中的 2 个新属性来替换全局变量:
TCheckBox = class(Vcl.StdCtrls.TCustomCheckBox)
private
FSkipStateChange:Boolean;
FPrevState:Boolean;
protected
published
property SkipStateChange:Boolean read FSkipStateChange write FSkipStateChange;
property PrevState:Boolean read FPrevState write FPrevState;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
// Click outside checkbox square
If TCheckBox(Checkbox1).SkipStateChange Then
Checkbox1.Checked := TCheckBox(Checkbox1).PrevState;
end;
procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (x > 12) then
begin
// Click outside checkbox square
TCheckBox(Checkbox1).SkipStateChange := True;
TCheckBox(Checkbox1).PrevState := Checkbox1.Checked;
end
else
TCheckBox(Checkbox1).SkipStateChange := False;
end;
它可以工作,但是如果我单击标题然后关闭表单,则会发生此错误:
Project Project1.exe 引发异常类 $C0000005,并带有消息“0x004080c5 处的访问冲突:读取地址 0x0000000d”。
错误发生procedure TMonitor.Destroy;
在系统单元中:
procedure TMonitor.Destroy;
begin
if (MonitorSupport <> nil) and (FLockEvent <> nil) then { <-- ERROR ON THIS LINE}
MonitorSupport.FreeSyncObject(FLockEvent);
FreeMem(@Self);
end;
我在做什么错,为什么会发生错误?