1

TComboBox2つと 1 つのコントロールで構成されるフォームがありTEdit、コントロール内の単語をコンボボックスの値で更新できるようにしたいと考えてTEditいますが、それを機能させる方法がよくわかりません。

例:

コンボボックス #1 には次のアイテムがあります。sue, bill, andy, chris

コンボボックス #2 には次のアイテムがあります。1, 2, 3

コントロールは次のTEditようになります。andy has 3 cars

今、私がやりたいことはandy、コンボボックス#1で現在選択されているアイテムで単語を変更し3、コンボボックス#2で現在選択されているアイテムで数字を変更できるようにすることですが、達成する方法に頭を悩ませることはできませんこれと私は少しアドバイスを求めて専門家のところに来ると思った.

4

1 に答える 1

7

両方のコンボ ボックスのOnChangeイベントに同じイベント ハンドラを割り当てます。

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

「... has ... car(s)」が固定文字列でない場合、明確な問題はありません。明確に定義された問題と解決策を生み出す最も簡単な方法は、2 つ目のTEditコントロールを追加することです。ここで、2 つのコンボボックスと最初の編集コントロールが同じOnChangeイベントを共有するようにします。

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

これで、ユーザーはたとえば%s has %s car(s).最初の編集ボックスに入力できます。

ただし、ユーザーが編集ボックスに入力した文字列に各コンボボックスのアイテムが 1 つだけ含まれ、文字列の他の部分がコンボボックスのアイテムと一致しないことがわかっている場合は、もちろん、アイテムを動的に置き換えることができます。編集ボックスで。次に、コンボボックスにこのイベントを共有させます:

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;

これを試すには、コンボボックスをSueとに設定し2、 と書き込みSue and I have 3 cats. Sue is cute.ます。コンボボックスを変更してみましょう!

古いコンボボックスのテキストを新しいものに置き換えるだけで、これをより堅牢にすることができます。これを行うには、以前の値をコンボボックスに保存する必要があります。いずれにせよ、理論上でも、これを完全に堅牢にすることはできません。実際、文字列が「ビルが 5 日前に電気代の支払いで心臓発作を起こしたときに 911 に電話した」の場合はどうなるでしょうか。この文字列は、「26 日前にスーが心臓発作を起こしたときに 26 に電話をかけた」という形で終わる可能性があります。

さらに微妙なことに、コンボボックス項目の 1 つが「車」で、別の項目が「電車」である場合、「カーネージ」は「トレインネージ」に変換される可能性があります。

于 2012-04-18T19:41:11.567 に答える