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

Вниз

Запрет на выбор 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
3-1196666491
zorik
2007-12-03 10:21
2008.05.04
одновременное изменение первичного и внешнего ключей


15-1206349090
Ega23
2008-03-24 11:58
2008.05.04
Возвращаясь к GUID-ам и уникальности


15-1205840565
GRAND25
2008-03-18 14:42
2008.05.04
Новый IBExpert - сволочь!


15-1206430830
tesseract
2008-03-25 10:40
2008.05.04
Стань бетатестером рекламной компании Intel и получи 5 баксов


6-1185440244
cosinus
2007-07-26 12:57
2008.05.04
Как послать e-mail с машины без единой почтовой программы?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский