从组合框更新TEdit文本

时间:2012-04-18 19:38:21

标签: delphi delphi-7 replace

我有一个由两个TComboBox和一个TEdit控件组成的表单,我希望能够使用组合框中的值更新TEdit控件中的单词,但不太确定如何使其发挥作用。

示例:

Combobox#1具有以下项目:sue, bill, andy, chris

Combobox#2具有以下项目:1, 2, 3

TEdit控件开始看起来像这样:andy has 3 cars

现在,我想要做的是能够使用组合框#1中当前所选项目更改单词andy,使用组合框#2中当前所选项目更改单词3,但我似乎无法绕过如何实现这一目标,并认为我会向专家们提出一些建议。

1 个答案:

答案 0 :(得分:7)

将同一个事件处理程序分配给两个组合框'OnChange事件:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  Edit1.Text := ComboBox1.Text + ' has ' + ComboBox2.Text + ' car(s)';
end;

如果'... has ... car(s)'不是固定字符串,则没有明确定义的问题。产生明确定义的问题和解决方案的最简单方法是添加第二个TEdit控件。现在,让两个组合框和第一个编辑控件共享相同的OnChange事件:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  Edit2.Text := Format(Edit1.Text, [ComboBox1.Text, ComboBox2.Text]);
end;

现在,用户可以在第一个编辑框中输入%s has %s car(s).

但是,如果您知道用户在编辑框中输入的字符串将包含每个组合框中的一个项目,并且该字符串的其他部分与组合框项目不一致,则当然,您可以动态替换编辑框中的项目。然后让组合框分享这个事件:

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ComboBox1.Items.Count - 1 do
    if Pos(ComboBox1.Items[i], Edit1.Text) > 0 then
    begin
      Edit1.Text := StringReplace(Edit1.Text, ComboBox1.Items[i],
        ComboBox1.Text, [rfReplaceAll]);
      break;
    end;
  for i := 0 to ComboBox2.Items.Count - 1 do
    if Pos(ComboBox2.Items[i], Edit1.Text) > 0 then
    begin
      Edit1.Text := StringReplace(Edit1.Text, ComboBox2.Items[i],
        ComboBox2.Text, [rfReplaceAll]);
      break;
    end;
end;

要尝试此操作,请将组合框设置为Sue2,然后编写Sue and I have 3 cats. Sue is cute.。现在尝试改变组合框!

只需将组合框文本替换为新文本框,就可以使其更加强大。要完成此操作,您需要将以前的值保存在组合框中。无论如何,即使在理论上,你也不能完全强大。事实上,如果这个字符串是'比尔在5天前心脏病发作支付他的电费时叫911那么。'这个字符串很可能最终成为'Sue在26天前因心脏病发作支付他的电力Sue时叫26岁。'

更巧妙的是,如果其中一个组合框是'car'而另一个是'train',那么'carnage'可能会转变为'trainnage'。