Текущий архив: 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 = ("ïåðâûé","áèçíåñ 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.49 MB
Время: 0.005 c