![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
исключить дублирование в ComboBox'ах
Handler © (2013-01-05 11:40:00)Помогите с алгоритмов, что-то не пойму как сделать.
Есть 3 ComboBox'а
ComboBox1:
не выбрано
1
2
3
ComboBox2:
не выбрано
1
2
3
ComboBox3:
не выбрано
1
2
3
Нужно сделать, чтобы, например, при выборе в ComboBox2 значения 3 это значение должно пропасть из ComboBox1 и ComboBox3 (т.е. нужно сделать так, чтобы значения в ComboBox'ах не дублировались, если в одном из ComboBox'ов выбрано какое-то значение, то его нельзя было бы выбрать в других ComboBox'ах).
sniknik (2013-01-06 16:23:00) [1]> изменить невозможно
у него предусмотрено поле "не выбрано" -
> FAvailableValues.Add('-');
типа снимаешь выбор, и выбираешь бывшее тут значение в другом. ... что тоже, ИМХО, кажется усложнением... но придумать лучшего без знания контекста не могу. хотя, так как есть, рабочее.
Smile (2013-01-06 11:21:00) [2]А если выбраны 3 (по sniknik © (06.01.13 01:52) [5] достаточно 2-х), то в программе наступает полный ступор?
Ни одного значения, ни в одном из в комбобоксов изменить невозможно, разве только перезапустив эту гениальную программу.
:)
sniknik (2013-01-06 01:52:00) [3]третий комбобокс лишний, раз значение там высчитывается на основании первых двух... не стоит усложнять юзеру жизнь лишней "непоняткой"/действием.
Dmitry1987 (2013-01-05 14:27:00) [4]Dmitry1987 = Handler
Dmitry1987 (2013-01-05 14:26:00) [5]Сделал, вроде работает. Гляньте, может что не предусмотрел или что-то можно оптимизировать
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons,
Contnrs;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
ComboBox2: TComboBox;
ComboBox3: TComboBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ComboBoxesChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
FAvailableValues: TStringList;
FComboBoxes: TObjectList;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
FAvailableValues := TStringList.Create;
FAvailableValues.Add('-');
FAvailableValues.Add('1');
FAvailableValues.Add('2');
FAvailableValues.Add('3');
FComboBoxes := TObjectList.Create;
FComboBoxes.Add(ComboBox1); // Tag = 0
FComboBoxes.Add(ComboBox2); // Tag = 1
FComboBoxes.Add(ComboBox3); // Tag = 2
for I := 0 to FComboBoxes.Count - 1 do
begin
TComboBox(FComboBoxes[I]).Items.AddStrings(FAvailableValues);
TComboBox(FComboBoxes[I]).ItemIndex := 0;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FAvailableValues.Free;
FComboBoxes.Free;
end;
procedure TForm1.ComboBoxesChange(Sender: TObject);
var
FilteredValues: TStringList;
I, J: Integer;
SelectedValue: string;
begin
FilteredValues := TStringList.Create;
try
for I := 0 to FComboBoxes.Count - 1 do
begin
with TComboBox(FComboBoxes[I]) do
// Сохраняем значение ComboBox'а
SelectedValue := Items[ItemIndex];
// Создаем список значений ComboBox'а исключая значения
// выбранные в других ComboBox'ах
FilteredValues.AddStrings(FAvailableValues);
for J := 0 to FComboBoxes.Count - 1 do
begin
if J = I then
Continue;
with TComboBox(FComboBoxes[J]) do
if (Items[ItemIndex] <> '-') then
FilteredValues.Delete(FilteredValues.IndexOf(Items[ItemIndex]));
end;
with TComboBox(FComboBoxes[I]) do
begin
Items.Clear;
Items.AddStrings(FilteredValues);
ItemIndex := Items.IndexOf(SelectedValue);
end;
FilteredValues.Clear;
end;
finally
FilteredValues.Free;
end;
end;
end.
KilkennyCat (2013-01-05 11:58:00) [6]один список на всех.
в начале комбобоксам присваивается этот список
один обработчик селекта на всех.
в обработчике присваивается заново общий список, за исключением тех, которые выделены, включая выделенный того, кто вызвал обработчик.
список в обработчике обрабатывать с 1 (исключить "не выбрано")
Dimka Maslov (2013-01-05 11:57:00) [7]В событии OnChange проверять состояние остальных комбобоксов и удалять ставший ненужным элемент их из списков.