2012-04-18 2 views
1

У меня есть форма, которые состоят из двух TComboBox и одного TEdit управления, и я хотел бы иметь возможность обновлять слово в TEdit контроля со значением от Наримера, но не совсем уверен, как сделать он работает.обновления TEdit текст из выпадающего списка

Пример:

Выпадающий # 1 имеет следующие элементы: sue, bill, andy, chris

ComboBox # 2 имеет следующие пункты: 1, 2, 3

Контроль TEdit начинает выглядеть примерно так: andy has 3 cars

Теперь я хочу, чтобы изменить слово andy с выбранным в данный момент элементом в combobox # 1 и th e number 3 с выбранным в данный момент элементом в combobox # 2, но я просто не могу оборачивать голову тем, как это сделать, и думал, что приеду к экспертам за небольшим советом.

ответ

7

Назначают же правша событий для обоих полей со списком 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 дней назад».

Более тонко, если один из элементов списка со списком - «автомобиль», а другой - «поезд», тогда «бойня» может быть преобразована в «поездку».

+0

Проблема в том, что текст в элементе управления редактирования редактируется конечным пользователем, поэтому не было бы способа жестко закодировать размещение поля со списком в строке. – nosx

+0

Edit1.ReadOnly: = true; – GDF

+0

@GDF, редактирование, по-видимому, может быть изменено; если бы это было не так, не было бы необходимости использовать редактирование - ярлык работал бы. –

Смежные вопросы