我有一个程序,需要使用以下格式从ini文件中读取数据:
'Prices', [integer], [data to be read]
读取的数据包含由'/'
符号分割的两条信息。当我调用下面的程序时,数据会成功分割。
我在表单上放置了TValueListEditor
(称为ledtPrices
),并希望将ini文件中的值添加到列表编辑器中。如果我通过单击按钮调用ledtPrices.InsertRow
,则会添加我输入以添加到行的值,并刷新列表编辑器。
但是,当我从RefreshPList
过程调用相同的函数时,这些值不会作为新行添加(列表编辑器为空)。我已经使用ShowMessage
对话测试了我的代码,以确保程序的每个部分都能正常运行。我的代码如下:
procedure RefreshPList;
var
l: TValueListEditor;
xFile: TINIFile;
temprow, tl, tp: string;
tempr: TStringList;
i: integer;
begin
i := 0;
l := frmSettings.ledtPrices;
try
tempr := TStringList.Create;
tempr.StrictDelimiter := True;
tempr.Delimiter := '/';
xFile := TIniFIle.Create('C:\MData.ini');
try
temprow := xFile.ReadString('Prices', '0', 'xx');
if temprow = 'xx' then
ShowMessage('no prices saved')
else
begin
repeat
temprow := xFile.ReadString('Prices', IntToStr(i), 'xx');
if temprow <> 'xx' then
begin
tempr.DelimitedText := temprow;
tl := tempr[0];
tp := tempr[1];
l.InsertRow(tl,tp,true);
//ShowMessage(tl);
Inc(i);
end
else
ShowMessage('End of list');
until (temprow = 'xx');
//l.Refresh;
end;
finally
xFile.Free;
end;
LastLine := i;
finally
tempr.Free;
end;
end;
LastLine
是稍后要使用的全局整数值。我正在尝试在列表编辑器中添加,删除和编辑数据,而无需直接编辑单元格。已经编写了将新数据添加到ini文件的过程并成功运行。
我已经意识到,我创建的任何尝试编辑组件值的过程都不会编辑组件值。我错过了一些简单的东西吗?
例如,我在表单上创建了一个备忘录,并创建了一个将数组内容添加到memo.lines的过程。从按钮调用调用时,此过程未执行。但是,如果我将程序的内容直接复制到buttonclick并执行它,它就可以工作。
从buttonclick命令调用这些过程。表单是从mainform创建的。这些组件都位于页面控制标签页中。
答案 0 :(得分:0)
快速测试应用程序(XE5,VCL Forms)无法重现该问题。
我从一个新的空白应用程序开始,在表单上放一个TValueListEditor
和一个TButton
,然后使用Object Inspector添加两个键/值组合:
Key Value
--- -----
A Aaaaaaa
C Ccccccc
在TButton.OnClick
事件中,我使用以下代码:
procedure TForm1.Button1Click(Sender: TObject);
var
NewKey, NewValue: string;
begin
NewKey := 'B';
NewValue := 'Bbbbbbb';
ValueListEditor1.InsertRow(NewKey, NewValue, True);
end;
我运行应用程序:
我点击Button1
,代码会在TValueListEditor
的结尾(底部)成功添加新项目。
我将最后一个参数更改为InsertRow
为False
,并将其插入TValueListEditor
的开头(顶部)。
这表示您没有从ini文件中获取所需的值,或者插入新行的代码未执行。
这是我创建的测试应用的完整代码:
Unit1.dfm
object Form4: TForm1
Left = 0
Top = 0
Caption = 'Form4'
ClientHeight = 178
ClientWidth = 447
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object ValueListEditor1: TValueListEditor
Left = 40
Top = 16
Width = 306
Height = 137
Strings.Strings = (
'A=Aaaaaaa'
'C=Ccccccc')
TabOrder = 0
end
object Button1: TButton
Left = 352
Top = 16
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 1
OnClick = Button1Click
end
end
Unit1.pas
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.ValEdit;
type
TForm1 = class(TForm)
ValueListEditor1: TValueListEditor;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
NewKey, NewValue: string;
begin
NewKey := 'B';
NewValue := 'Bbbbbbb';
ValueListEditor1.InsertRow(NewKey, NewValue, True);
end;
end.