Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.09.22;
Скачать: [xml.tar.bz2];

Вниз

исключить дублирование в ComboBox ах   Найти похожие ветки 

 
Handler   (2013-01-05 11:40) [0]

Помогите с алгоритмов, что-то не пойму как сделать.

Есть 3 ComboBox"а

ComboBox1:
не выбрано
1
2
3

ComboBox2:
не выбрано
1
2
3

ComboBox3:
не выбрано
1
2
3

Нужно сделать, чтобы, например, при выборе в ComboBox2 значения 3 это значение должно пропасть из ComboBox1 и ComboBox3 (т.е. нужно сделать так, чтобы значения в ComboBox"ах не дублировались, если в одном из ComboBox"ов выбрано какое-то значение, то его нельзя было бы выбрать в других ComboBox"ах).


 
Dimka Maslov ©   (2013-01-05 11:57) [1]

В событии OnChange проверять состояние остальных комбобоксов и удалять ставший ненужным элемент их из списков.


 
KilkennyCat ©   (2013-01-05 11:58) [2]

один список на всех.
в начале комбобоксам присваивается этот список
один обработчик селекта на всех.
в обработчике присваивается заново общий список, за исключением тех, которые выделены, включая выделенный того, кто вызвал обработчик.
список в обработчике обрабатывать с 1 (исключить "не выбрано")


 
Dmitry1987   (2013-01-05 14:26) [3]

Сделал, вроде работает. Гляньте, может что не предусмотрел или что-то можно оптимизировать


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.


 
Dmitry1987   (2013-01-05 14:27) [4]

Dmitry1987 = Handler


 
sniknik ©   (2013-01-06 01:52) [5]

третий комбобокс лишний, раз значение там высчитывается на основании первых двух... не стоит усложнять юзеру жизнь  лишней "непоняткой"/действием.


 
Smile   (2013-01-06 11:21) [6]

А если выбраны 3 (по sniknik ©   (06.01.13 01:52) [5] достаточно 2-х), то в программе наступает полный ступор?
Ни одного значения, ни в одном из в комбобоксов изменить невозможно, разве только перезапустив эту гениальную программу.
:)


 
sniknik ©   (2013-01-06 16:23) [7]

> изменить невозможно
у него предусмотрено поле "не выбрано" -
> FAvailableValues.Add("-");
типа снимаешь выбор, и выбираешь бывшее тут значение в другом. ... что тоже, ИМХО, кажется усложнением... но придумать лучшего без знания контекста не могу. хотя, так как есть, рабочее.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.09.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
15-1365671938
ВВВ
2013-04-11 13:18
2013.09.22
Про видеокарту.


11-1248204990
Ruzzz
2009-07-21 23:36
2013.09.22
Использование AppletTerminated, цель этой переменной?


2-1357505005
Mixasnt
2013-01-07 00:43
2013.09.22
не могу обработать одномерный массив введённый в едит.


1-1266331114
sniknik
2010-02-16 17:38
2013.09.22
Печать RTF (RichView ? другое ?)


15-1365867368
О-Сознание
2013-04-13 19:36
2013.09.22
Как называется паттерн?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский