Delphi - ValueListEditor没有添加新行

时间:2014-01-04 01:27:45

标签: list delphi insert ini

我有一个程序,需要使用以下格式从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创建的。这些组件都位于页面控制标签页中。

1 个答案:

答案 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;

我运行应用程序:

Image of form with TValueList with two items

我点击Button1,代码会在TValueListEditor的结尾(底部)成功添加新项目。

Image of form after clicking button and ValueListEditor with new item added

我将最后一个参数更改为InsertRowFalse,并将其插入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.