Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.04;
Скачать: CL | DM;

Вниз

Запрет на выбор IITEMS в ComboBox   Найти похожие ветки 

 
Nemeziz   (2008-04-07 22:46) [0]

Господа МАСТЕРА, помогите начинающему. Сказали сделать слеедующее: Имеется 2 ComboBox.
В 1-ом и 2-ом содержатся Items: первый, бизнесс, эконом. Как запретить для одного ComboBox выбирать такой же Item как и во 2-ом. (то есть, если в 1-ом выбрано эконом во втотом не должен выбираться аналогичный Item).


 
MsGuns ©   (2008-04-07 23:51) [1]

Примерно так:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   ComboBox1: TComboBox;
   ComboBox2: TComboBox;
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormShow(Sender: TObject);
   procedure ComboBox1Select(Sender: TObject);
 private
   { Private declarations }
   CabClass: TStrings;
 public
   { Public declarations }
 end;

const
 ACAB_CLS: array [0..2] of string = ("ïåðâûé","áèçíåñ&#2 41;","ýêîíîì.");

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 i: integer;
begin
 CabClass := TStringList.Create;
 for i := LOW(ACAB_CLS) to HIGH(ACAB_CLS) do
   CabClass.Add(ACAB_CLS[i]);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 CabClass.Clear;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 ComboBox1.Items.AddStrings(CabClass); ComboBox1.ItemIndex := -1;
 ComboBox2.Items.AddStrings(CabClass); ComboBox2.ItemIndex := -1;
end;

procedure TForm1.ComboBox1Select(Sender: TObject);
var
 ndx: integer;
begin
 with ComboBox2 do
   begin
    Items.Clear;
    Items.AddStrings(CabClass);
    ItemIndex := -1;
   end;
 if ComboBox1.ItemIndex>-1 then
   begin
    ndx := ComboBox2.Items.IndexOf(ComboBox1.Text);
    if ndx>-1 then ComboBox2.Items.Delete(ndx);
   end;
end;

end.


 
Германн ©   (2008-04-08 00:52) [2]


> MsGuns ©   (07.04.08 23:51) [1]
>
> Примерно так:
>

Что-то мне очень многое там не по душе. (((


 
MsGuns ©   (2008-04-08 01:09) [3]

>Германн ©   (08.04.08 00:52) [2]
>Что-то мне очень многое там не по душе. (((

Например ?


 
Германн ©   (2008-04-08 01:41) [4]


> MsGuns ©   (08.04.08 01:09) [3]
>
> >Германн ©   (08.04.08 00:52) [2]
> >Что-то мне очень многое там не по душе. (((
>
> Например ?
>

Например потому что:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CabClass.Clear;
end;

Если эта форма - главная форма приложения, то нафига делать "явную" очистку CabClass? Если не главная, то где анализ var Action?


 
MsGuns ©   (2008-04-08 08:19) [5]

Судя по имени объектов, это не просто главная форма. Она единственная. Наклепанная за 5 мин для примера ;)

Очистку TStrings поставил автоматом, не думая, по аналогии с TList ;))


 
Игорь Шевченко ©   (2008-04-08 10:00) [6]


> В 1-ом и 2-ом содержатся Items: первый, бизнесс, эконом.
>  Как запретить для одного ComboBox выбирать такой же Item
> как и во 2-ом


Конкурентов давить


 
Виталик   (2008-04-08 13:00) [7]

А не проще ловить для второго комбика CBN_SELCHANGE и сравнивать выбранный индекс в первом комбике с индексом в этом, и перескакивать с него вниз или вверх?


 
Amoeba ©   (2008-04-08 13:57) [8]


> Виталик   (08.04.08 13:00) [7]
>
> А не проще ловить для второго комбика CBN_SELCHANGE и сравнивать
> выбранный индекс в первом комбике с индексом в этом, и перескакивать
> с него вниз или вверх?
>

Интересно же будет понаблюдать за реакцией (и послушать, какие слова он произнесет) пользователя столкнувшимся с таким поведением контрола.


 
Виталик   (2008-04-08 14:10) [9]

Ну в добавок можно просто (как некоторые делают) отрисовывать запретные строки курсивом с более бледныи цветом (как в меню), тогда хоть понятно будет что этот элемент запрещен


 
Informer   (2008-04-08 14:18) [10]

> Как запретить для одного ComboBox выбирать такой же Item
> как и во 2-ом.

После выбора в 1-м, не помещать этот Item во 2-ой ComboBox


 
Игорь Шевченко ©   (2008-04-08 14:21) [11]


> Ну в добавок можно просто (как некоторые делают) отрисовывать
> запретные строки курсивом с более бледныи цветом (как в
> меню), тогда хоть понятно будет что этот элемент запрещен


Зачем, спрашивается, издеваться над пользователем.


 
Виталик   (2008-04-08 14:33) [12]

Значит то что сделано в меню - издевка?


 
{RASkov} ©   (2008-04-08 14:39) [13]

Вот еще вариант:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure ComboBoxsChange(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var N, K: Integer;
begin
 Randomize;
 for N:=0 to Random(10) do
  with TComboBox.Create(Self) do begin
   Parent:=Self;
   Style:=csDropDownList;
   Left:=10;
   Top:=N*30;
   for K:=0 to 5 do Items.Add("Item № "+IntToStr(K+1));
   OnChange:=ComboBoxsChange;
  end;
end;

procedure TForm1.ComboBoxsChange(Sender: TObject);
var N, K: Integer; Txt, TxtOld: String;
begin
 Txt:=TComboBox(Sender).Text;
 TxtOld:=TComboBox(Sender).Hint;
 for N:=0 to ComponentCount-1 do
  if (Components[N] is TComboBox) and (Components[N]<>Sender) then begin
   K:=TComboBox(Components[N]).Items.IndexOf(Txt);
   if K>=0 then begin
    TComboBox(Components[N]).OnChange:=nil;
    TComboBox(Components[N]).Items.Delete(K);
    if TxtOld<>"" then TComboBox(Components[N]).Items.Add(TxtOld);
    TComboBox(Components[N]).OnChange:=ComboBoxsChange;
   end;
  end;
  TComboBox(Sender).Hint:=TComboBox(Sender).Text;
end;

end.

С Хинтом я конечно перемудрил, но мысль, думаю, понятна :)


 
{RASkov} ©   (2008-04-08 14:42) [14]

> with TComboBox.Create(Self) do begin
>   Parent:=Self;
   ....

можно для "крастоты" добавить еще и Sorted:=True; :)


 
Игорь Шевченко ©   (2008-04-08 14:54) [15]


> Значит то что сделано в меню - издевка?


Меню - это меню, комбобокс - это комбобокс, что хорошо в одном месте, дико и непривычно в другом.


 
Leonid Troyanovsky ©   (2008-04-08 16:12) [16]


> {RASkov} ©   (08.04.08 14:39) [13]

> Вот еще вариант:

Не то.

Сделаем TSringList, содержащий нужные пункты, а
его Objects - содержащий видимость этих пунктов,
например, "есть-нет".

В OnChange/Changing оного списка поставим определение
кол-ва показываемых пунктов комбобокса и показываемого
порядка (CustomSort by Objects списка).
Если это будет owner draw or virtual, то его надо Invalidate.
Можно взять обычный комбобокс, и просто заново копировать
нужные пункты.

Т.е., если надо изменять содержимое комбика, то
делаем нужные назначения Objects списка.

--
Regards, LVT.


 
{RASkov} ©   (2008-04-08 16:42) [17]

> [16] Leonid Troyanovsky ©   (08.04.08 16:12)
> Сделаем TSringList, содержащий нужные пункты

Т.е. общий список для всех комбиков? Но у каждого комбика свое понятие видимый/невидимый элемент...
Что-то я никак не поймаю мысль в [16] :(
Ну да ладно.... мысль пусть ловит автор вопроса :)
А почему мой вариант - "не то"? :)
Т.е. вариант мой и в самом деле - не то, но мысль можно развить...
Я бы наверное отнаследовался бы от комбика и сделал реализацию задуманного автором в потомке....
Хотя фик знает.... особо не думал, "на коленке" сделал.... Там в коде [13] есть косяки, недочеты, лишнее.... ну как обычно - 13 пост всеж :)


 
Leonid Troyanovsky ©   (2008-04-08 17:44) [18]


> {RASkov} ©   (08.04.08 16:42) [17]

> Т.е. общий список для всех комбиков? Но у каждого комбика
> свое понятие видимый/невидимый элемент...

Если не хватит 4 байт Objects, можно пользовать и
по прямому назначению - для хранения ссылок.

> Что-то я никак не поймаю мысль в [16] :(
> Ну да ладно.... мысль пусть ловит автор вопроса :)

Не, мысль тебе - как управлять содержимым кб.
А автора я, во-ще, не понял - оч. туманно :)

--
Regards, LVT.



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

Текущий архив: 2008.05.04;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
15-1201816478
Eraser
2008-02-01 00:54
2008.05.04
Remote Office Manager - бета тестирование 2


15-1206475079
Real
2008-03-25 22:57
2008.05.04
Worms


6-1185723678
Debug
2007-07-29 19:41
2008.05.04
Разрыв соединения с многопоточным сервером


2-1207655458
Pavelkq
2008-04-08 15:50
2008.05.04
TOleContainer + MS Word


10-1144224575
DancerMan
2006-04-05 12:09
2008.05.04
TWebbrowser. Клик по ссылке -> MyProcedure