还是关于动态创建控件的事件问题(100)

  • 主题发起人 terry_zhou82
  • 开始时间
T

terry_zhou82

Unregistered / Unconfirmed
GUEST, unregistred user!
我的代码如下:想得到的功能是每次开机都通过ONCREATE属性检查是否在添加到启动组,如果是的话,则CHECKBOX1.CHECKED,由于CHECKBOX1的控件是动态创建的,所以每次总是出错。请大侠们帮我看看那,谢谢了private procedure CheckboxPress(Sender:TObject); procedure CreateCheckBox; public { Public declarations } end;var Form1: TForm1;implementation var reg:TRegistry; Checkbox1 :TCheckbox;{$R *.dfm}procedure TForm1.CheckboxPress(Sender:TObject);begin if TCheckBox(sender).Checked then begin reg:=TRegistry.Create; with reg do begin RootKey:=HKEY_LOCAL_MACHINE; OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False); WriteString('ReminDer',paramstr(0)); end; end else begin reg.RootKey:=HKEY_LOCAL_MACHINE; reg.OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False); reg.DeleteValue('ReminDer'); reg.Closekey; reg.Free ; end; end;procedure TForm1.CreateCheckBox;begin Checkbox1 :=TCheckbox.Create(StatusBar1); with Checkbox1 do begin Parent :=StatusBar1; Height :=StatusBar1.Height; Width :=StatusBar1.Panels.Items[2].Width+200; Left :=StatusBar1.Left +280; Visible :=True; Caption :='是否添加到启动组!'; TabStop:=false; OnClick:=CheckboxPress;end;end;procedure TForm1.FormCreate(Sender: TObject);beginCreateCheckBox;reg.OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False);if reg.KeyExists('ReminDer') then Checkbox1.checked:=true else Checkbox1.Checked :=false;end;问题出在那里啊?
 
自己顶一下
 
没有人知道啊?
 
不知道报什么错?你这样试试:在FormCreate中就执行CreateCheckBox;其他的判断写到窗体的OnShow事件里
 
procedure TForm1.FormCreate(Sender: TObject);里reg.OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False);这样直接用调用的?不用reg.RootKey:=HKEY_LOCAL_MACHINE;?我注册表还没有用过,具体不熟悉,看了你的代码,好像前后的用法不一致。另外,当在FORMCREATE里给Checkbox1.checked赋值时会触发Checkbox1的Click事件,CheckboxPress;但实际上,你是希望用户点击时才触发这个事件,而不是程序启动创建窗体时。procedure TForm1.CheckboxPress(Sender:TObject);begin//加一句if self.showing then//表示程序已经运行完毕,确实是用户点击才触发了这个事件。或者用Active属性也可以 if TCheckBox(sender).Checked then另外感觉,要实现你的功能,好像很多代码也不应该这样写。
 
// 问题 1: reg:=TRegistry.Create; 与 reg.Free ; 存在逻辑错误!procedure TForm1.CheckboxPress(Sender:TObject);begin // reg 最好还是用局部变量好 // 修改如下: if reg = nil then reg:=TRegistry.Create; if TCheckBox(sender).Checked then begin // reg:=TRegistry.Create; with reg do begin RootKey:=HKEY_LOCAL_MACHINE; OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False); WriteString('ReminDer',paramstr(0)); end; end else begin // 如果 未经过 Checked := True; 而先执行 Checked := False;时 (此时reg为nil) 会报错 reg.RootKey:=HKEY_LOCAL_MACHINE; reg.OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False); reg.DeleteValue('ReminDer'); reg.Closekey; // reg.Free ; FreeAndNil(reg); end; end;// 问题 2: 执行完 CreateCheckBox 后, 因为 CheckBox1 未选中, 固 reg 并未创建(即为nil), 所以会导致 reg.OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False); 报错!!! procedure TForm1.FormCreate(Sender: TObject);beginCreateCheckBox;// if reg = nil then reg := TRegistry.Create; // 窗体释放时, 要判断 reg 是否释放。其实 reg 变量本地化会比较好点reg.OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False);if reg.KeyExists('ReminDer') then Checkbox1.checked:=true else Checkbox1.Checked :=false;end;以上提出的两个问题只是从程序执行顺序上分析得出的,我并未验证!
 
楼上的老大,我试过了。可以运行,但是一旦我取消那个CHECKBOX的钩子,他就提示错误,请问是什么原因?
 
老大现身啊。
 
如果要重用 FReg: TRegistry; 变量unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Registry;type TForm1 = class(TForm) StatusBar1: TStatusBar; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FCheckbox1: TCheckBox; // 与窗体同在, 没必要声明成全局变量 FReg: TRegistry; // 如果要重用 procedure CreateCheckBox; procedure CheckboxPress(Sender:TObject); public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CreateCheckBox;begin if FCheckbox1 <> nil then FreeAndNil(FCheckbox1); // FCheckbox1 置空 为前面的判断 FCheckbox1 := TCheckbox.Create(StatusBar1); with FCheckbox1 do begin// Parent := StatusBar1; Height :=StatusBar1.Height; Width :=StatusBar1.Panels.Items[2].Width+200; Left :=StatusBar1.Left +280;// Visible :=True; Caption :='是否添加到启动组!'; TabStop:=false; OnClick:=CheckboxPress; // 这样 FCheckBox1 显示窗体只刷新一次 Parent := StatusBar1; end;end;procedure TForm1.CheckboxPress(Sender: TObject);begin Assert(Sender is TCheckBox); if FReg <> nil then if TCheckBox(sender).Checked then begin if not FReg.ValueExists('ReminDer') then FReg.WriteString('ReminDer', paramstr(0)); end else begin if FReg.ValueExists('ReminDer') then FReg.DeleteValue('ReminDer'); end;end;procedure TForm1.FormCreate(Sender: TObject);var reg: TRegistry;begin CreateCheckBox; if FCheckbox1 <> nil then begin FReg := TRegistry.Create; FReg.RootKey:=HKEY_LOCAL_MACHINE; if FReg.OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False) then if FReg.ValueExists('ReminDer') then FCheckbox1.checked:=true else FCheckbox1.Checked :=false; end;end;procedure TForm1.FormDestroy(Sender: TObject);begin if FReg <> nil then FReg.Free;end;end.
 
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls;type TForm1 = class(TForm) StatusBar1: TStatusBar; procedure FormCreate(Sender: TObject); private { Private declarations } FCheckbox1: TCheckBox; // 与窗体同在, 没必要声明成全局变量 procedure CreateCheckBox; procedure CheckboxPress(Sender:TObject); public { Public declarations } end;var Form1: TForm1;implementationuses Registry;{$R *.dfm}procedure TForm1.CreateCheckBox;begin if FCheckbox1 <> nil then FreeAndNil(FCheckbox1); // FCheckbox1 置空 为前面的判断 FCheckbox1 := TCheckbox.Create(StatusBar1); with FCheckbox1 do begin// Parent := StatusBar1; Height :=StatusBar1.Height; Width :=StatusBar1.Panels.Items[2].Width+200; Left :=StatusBar1.Left +280;// Visible :=True; Caption :='是否添加到启动组!'; TabStop:=false; OnClick:=CheckboxPress; // 这样 FCheckBox1 显示窗体只刷新一次 Parent := StatusBar1; end;end;procedure TForm1.CheckboxPress(Sender: TObject);var reg: TRegistry;begin Assert(Sender is TCheckBox); reg := TRegistry.Create; reg.RootKey:=HKEY_LOCAL_MACHINE; if reg.OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False) then try if TCheckBox(sender).Checked then begin if not reg.ValueExists('ReminDer') then reg.WriteString('ReminDer', paramstr(0)); end else begin if reg.ValueExists('ReminDer') then reg.DeleteValue('ReminDer'); end; finally reg.Closekey; reg.Free; end;end;procedure TForm1.FormCreate(Sender: TObject);var reg: TRegistry;begin CreateCheckBox; if FCheckbox1 <> nil then begin reg := TRegistry.Create; reg.RootKey:=HKEY_LOCAL_MACHINE; try if reg.OpenKey('SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN',False) then if reg.ValueExists('ReminDer') then FCheckbox1.checked:=true else FCheckbox1.Checked :=false; finally reg.CloseKey; reg.Free; end; end;end;end.
 
绝对的高手啊。送分了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
394
import
I
I
回复
0
查看
508
import
I
顶部