我遇到了 Combobox onchange 事件的问题: 基本上,如果我从combobox1手动选择一个项目,它会按计划加载/写入/保存文件,但如果我想在我点击 UpdateBtn 时用循环执行同样的操作,它会部分工作。 (循环工作,并在最后一个元素上停止,但不创建所需的文件。)
如果我按 UpdateBtn 然后 Timer2 启动,触发(或模拟手动选择)Combobox的onChange事件,我想做,并创建文件手动工作。
我可能错过了什么吗?
此致
combobox1的代码(OnChange事件,样式:csDropDown):
procedure TForm1.ComboBox1Change(Sender: TObject);
var sl : TStringList;
begin
if
ComboBox1.ItemIndex = ComboBox1.Items.IndexOf('')
then
SetCurrentDir('C:\Net-AdminUpdater\') ;
sl := TStringList.Create;
sl.LoadFromFile('Ugloader.ini');
sl[3] := 'AppPath=c:\users\'+ ComboBox1.Text +'\AppData\Local\Systemica';
sl[5] := 'LASTUPGRADE=';
sl[10] := 'AppPath=c:\users\'+ ComboBox1.Text +'\AppData\Local\Systemica';
sl[12] := 'LASTUPGRADE=';
sl[17] := 'AppPath=c:\users\'+ ComboBox1.Text +'\AppData\Local\Systemica';
sl[19] := 'LASTUPGRADE=';
sl[24] := 'AppPath=c:\users\'+ ComboBox1.Text +'\AppData\Local\Systemica';
sl[26] := 'LASTUPGRADE=';
sl[31] := 'AppPath=c:\users\'+ ComboBox1.Text +'\AppData\Local\Systemica';
sl[33] := 'LASTUPGRADE=';
sl[38] := 'AppPath=c:\users\'+ ComboBox1.Text +'\AppData\Local\Systemica';
sl[40] := 'LASTUPGRADE=';
sl[45] := 'AppPath=c:\users\'+ ComboBox1.Text +'\AppData\Local\Systemica';
SetCurrentDir('C:\Users\'+ ComboBox1.Text +'\WINDOWS\');
sl.SaveToFile('Ugloader.ini');
sl.LoadFromFile('Ugloader.ini');
sl.Free;
end;
Timer2(默认情况下Enabled = false,间隔50):
ComboBox1.ItemIndex := (ComboBox1.ItemIndex + 1)
UpdateButton(UpdateBtn)(做循环):
procedure TForm1.UpdateBtnClick(Sender: TObject);
begin
Timer2.Enabled := True;
答案 0 :(得分:1)
这是预期的和documented。以编程方式更改ItemIndex
不会导致OnChange
事件被触发。它仅在响应用户交互时触发。
注意:仅在响应用户操作时发生OnChange。以编程方式更改Text属性不会触发OnChange事件。
将OnChange
处理程序的内容解压缩为单独的方法,并从OnChange
处理程序和修改ItemIndex
,Text
等的任何代码中调用该方法。
从更广泛的角度看你的代码,看起来你已经将逻辑与UI捆绑在一起,而不是理想的。如果要遍历名称列表以将转换应用于文件,则不应涉及任何UI元素。您最好将逻辑与UI分开,以便您的代码变得更具可组合性。