両方のコンボ ボックスの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 つが「車」で、別の項目が「電車」である場合、「カーネージ」は「トレインネージ」に変換される可能性があります。