【问题标题】:Delphi - ValueListEditor not adding new rowDelphi - ValueListEditor 不添加新行
【发布时间】:2014-01-04 01:27:45
【问题描述】:

我有一个程序需要从 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 中并执行它,它就可以工作。

这些过程是从按钮单击命令中调用的。该窗体是从主窗体创建的。这些组件都位于一个页面控件标签页中。

【问题讨论】:

  • 如果tltp 都是空字符串(如果temprow 只是分隔符/ 可能会发生这种情况),则不会添加该行。换句话说,如果您调用ValueListEditor.InsertRow('', '', True),则不会添加任何行。现在是学习如何使用调试器的时候了,因为恐怕我们无法在不了解更多信息的情况下为您跟踪它...
  • 还有如何使用代码格式化程序:-)
  • @JerryDodge 总是有学习的空间。
  • @TLama 我知道如何使用调试器,但我使用 showmessage 检查 tltp 是否保持应有的值;他们做到了。因此, insertrow() 不会为空。对吗?
  • @Babah254 试试看,它会将您的代码格式化为最常见的标准,这样您就可以了解如何使您的代码在逻辑上保持可读性 - 转到编辑 > 格式化源代码(如果您的 Delphi 版本支持它)或者CTRL + D

标签: list delphi insert ini


【解决方案1】:

快速测试应用程序(XE5、VCL Forms)无法重现该问题。

我从一个新的空白应用程序开始,将TValueListEditorTButton 放在表单上,​​然后使用对象检查器添加两个键/值组合:

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.

【讨论】:

  • 感谢您进行快速检查。我决定在我的代码中使用具有给定参数的插入函数。我所做的是将InsertRow('hello','world',true) 复制并粘贴到我刷新过程的各个部分。没有一行被执行。我不明白为什么会发生这种情况,因为我可以通过单击按钮执行插入功能并且它运行良好。
  • 我对此无能为力,因为您在问题中没有提供有关 RefreshPList 的定义位置或调用方式的详细信息。调试器应该解释发生了什么;在调用 RefreshPList 的代码行上设置断点,然后运行您的应用程序,并单步执行代码以查看它的去向以及为什么它没有执行您添加的行。
  • 再次阅读我的上一条评论。 “我对此无能为力,因为 您没有提供有关在何处定义 RefreshPList 或如何调用它的详细信息。在调用您的过程、运行您的应用程序并逐步执行的代码行上设置一个断点查看代码的去向以及为什么它没有执行您添加的代码行。我们不能这样做,因为我们没有您没有向我们展示的代码。 你会的。
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多