Назначают же правша событий для обоих полей со списком OnChange
событие:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Edit1.Text := ComboBox1.Text + ' has ' + ComboBox2.Text + ' car(s)';
end;
Если «... есть ... машина (s)» не является фиксированной строкой, вы не имеете четко определенная проблема. Самый простой подход, который даст четко определенную проблему и решение, заключается в добавлении второго элемента управления TEdit
. Теперь два выпадающие списки и первую часть редактирования управления то же OnChange
события:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Edit2.Text := Format(Edit1.Text, [ComboBox1.Text, ComboBox2.Text]);
end;
Теперь пользователь может ввести, например, %s has %s car(s).
в первом окне редактирования.
Однако, если вы знаете, что строка, введенная пользователем в поле редактирования будет содержать ровно один элемент из каждого выпадающего списка, и что никакая другая часть строки не совпадает с элементом поле со списком, то, конечно, вы можете динамически заменить элемент в окне редактирования. Тогда пусть ComboBoxes разделить это событие:
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.
. Теперь попробуйте изменить comboboxes!
Вы можете сделать это более надежным, заменив только текст с новым. Для этого вам нужно сохранить предыдущее значение в поле со списком. Во всяком случае, вы не можете, даже теоретически, сделать это полностью надежным. Действительно, что, если строка «Билл» называется 911, когда он получил сердечный приступ, заплатив свой электрический счет 5 дней назад ». Эта строка вполне может закончиться тем, что «Сью назвала 26, когда он получил сердечный приступ, заплатив свою электрическую Сью 26 дней назад».
Более тонко, если один из элементов списка со списком - «автомобиль», а другой - «поезд», тогда «бойня» может быть преобразована в «поездку».
Проблема в том, что текст в элементе управления редактирования редактируется конечным пользователем, поэтому не было бы способа жестко закодировать размещение поля со списком в строке. – nosx
Edit1.ReadOnly: = true; – GDF
@GDF, редактирование, по-видимому, может быть изменено; если бы это было не так, не было бы необходимости использовать редактирование - ярлык работал бы. –