![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Позиционирование в Combobox по значению объекта [D7]
Laguna © (2011-09-22 15:27:00)Нужно в контрольной работе написать кусок кода, в котором в Combobox в качестве объекта добавлена запись с данными. И в зависимости от подаваемого значения позиционировать на конкретную строку. Для начала вариант первый:
...
ComboBox1.Items.AddObject('Item 1', Pointer(1));
ComboBox1.Items.AddObject('Item 2', Pointer(2));
ComboBox1.Items.AddObject('Item 3', Pointer(3));
....
ComboBox1.ItemIndex := ComboBox1.Items.IndexOfObject(Pointer(k));
// где к - будет указан во входном параметре процедуры(будет 1, 2 или 3)
Здесь все понятно. Непонятна ситуация, когда нужно позицианировать, если сохранялась запись со значениями. Вариант второй:
...
type
PComboRec = ^TComboRec;
TComboRec = record
Kod : Longword;
Poz : Longword;
St : String[5];
end;
...
Var
pRec: PComboRec;
begin
new(pRec);
pRec^.ID := 1;
pRec^.Poz := 11;
pRec^.St := 'Бла-Бла-Бла';
RegComboBox.Items.AddObject('Item 1', Pointer(pRec));
new(pRec);
pRec^.ID := 2;
pRec^.Poz := 12;
pRec^.St := 'Бла-Бла-Бла';
RegComboBox.Items.AddObject('Item 2', Pointer(pRec));
new(pRec);
pRec^.ID := 3;
pRec^.Poz := 13;
pRec^.St := 'Бла-Бла-Бла';
RegComboBox.Items.AddObject('Item 3', Pointer(pRec));
end;
Как применить функцию позиционирования по полю Poz, к примеру, если на входе процедуры подавать некоторые значения
Подойдет ли конструкция ComboBox1.ItemIndex := ComboBox1.Items.IndexOfObject(...)в данном случае или нужно как то по другому?
Германн (2011-09-26 23:42:00) [1]
> сделал поиск перебором всего списка combobox и найдя нужную
> сторку позиционировал на ее. А вобще хотелось бы для себя
> на будущее разобраться с этим моментом глубже.
А глубже уже некуда.IndexOfObjectтак и работает (перебором). Разве что можно сделать узкоспециализированного наследника, в котором переписатьIndexOfObjectили ввести новый метод типаIndexOfObjectByField
Laguna (2011-09-26 23:01:00) [2]2ProgRAMmer Dimonych
[19] Совершенно верно, задача именно в этом и состоит.
Laguna (2011-09-26 22:57:00) [3]Прошу прощения за молчание. Не было доступа к интернету. Ввиду срочности требования сдачи контрольной, сделал поиск перебором всего списка combobox и найдя нужную сторку позиционировал на ее. А вобще хотелось бы для себя на будущее разобраться с этим моментом глубже.
ProgRAMmer Dimonych (2011-09-23 13:30:00) [4]> [16] Ega23 © (23.09.11 13:16)
> Пацталом.
> Нафига????
Если хранить указатель на экземпляр класса в MasOfClass и индексировать его значением поля этого экземпляра. См. выше
> [16] Ega23 © (23.09.11 13:16)
> Я решительно тебя не понимаю. Ещё раз, по пунктам: какую
> задачу мы решаем?
В ComboBox к каждому элементу привязан указатель на структуру/объект с несколькими полями. Зная значение некоторого ключевого поля, найти индекс элемента ComboBox'а, за которым закреплена запись с таким же значением поля.
По крайней мере, я задачу так понял
ProgRAMmer Dimonych (2011-09-23 13:26:00) [5]> [17] sniknik © (23.09.11 13:17)
> > просто индексируя массив
> ну можно и не массив, можно список использовать, и делать
> IndexOf из IndexOf ;)...
>
> а можно вообще по другому, все поля в таблице, делаешь локейт
> по любому! полю, одним из полей держать индекс в ComboBox
> ... или использовать DB аваре ComboBox.
Ну так вот в том и беда, что как-то многовато получается навёрнуто будет :) Но я всё ещё надеюсь, что Lagunaуточнит условие задачи.
sniknik (2011-09-23 13:17:00) [6]> просто индексируя массив
ну можно и не массив, можно список использовать, и делать IndexOf из IndexOf ;)...
а можно вообще по другому, все поля в таблице, делаешь локейт по любому! полю, одним из полей держать индекс в ComboBox ... или использовать DB аваре ComboBox.
Ega23 (2011-09-23 13:16:00) [7]
> Будь она хотя бы до миллиона - это несколько тысяч последовательных
> страниц памяти выделять придётся
Пацталом.
Нафига????
> P.S. Пример с зарплатой, пожалуй, не самый удачный, потому
> что ключ не гарантирует уникальности записи, но представим
> себе...
Я решительно тебя не понимаю. Ещё раз, по пунктам: какую задачу мы решаем?
ProgRAMmer Dimonych (2011-09-23 12:44:00) [8]> [14] Ega23 © (23.09.11 12:36)
> Почему?
Зарплата может быть любой. Будь она хотя бы до миллиона - это несколько тысяч последовательных страниц памяти выделять придётся, чтобы быстро найти одного из пяти сотрудников.
P.S. Пример с зарплатой, пожалуй, не самый удачный, потому что ключ не гарантирует уникальности записи, но представим себе...
Ega23 (2011-09-23 12:36:00) [9]
> Контора, 5 сотрудников, зарплаты. Реально используемых значений
> 5, но чтобы по размеру зарплаты, просто индексируя массив,
> находить сотрудника, нужен неоправданно большой массив.
Почему?
ProgRAMmer Dimonych (2011-09-23 12:21:00) [10]> [12] Ega23 © (23.09.11 12:11)
> Миллион? Миллиард?
Вполне достаточно, чтобы не влезть в память. Даже по одному Integer-полю. Условный пример. Контора, 5 сотрудников, зарплаты. Реально используемых значений 5, но чтобы по размеру зарплаты, просто индексируя массив, находить сотрудника, нужен неоправданно большой массив.
Ega23 (2011-09-23 12:11:00) [11]
> Например, если такой первичный ключ может принимать достаточно
> большое количество значений.
Миллион? Миллиард?
ProgRAMmer Dimonych (2011-09-23 11:52:00) [12]> [10] sniknik © (23.09.11 11:28)
> > просто неизвестны.
> может быть, но и в этом случае можно сделать где нибудь
> связку "ID-ClassRec" где ID например индекс массива в котором
> лежит ClassRec, тогда поиск будет -
> ComboBox1.ItemIndex := ComboBox1.Items.IndexOfObject(MasOfClass[ID])
> ;
Вариант. Правда, смущает необходимость поддерживать согласованность между списком и массивом.
Но, если я всё-таки правильно понимаю автора, это проблему в общем случае не решит. Зная значение одного-двух полей класса, найти соответствующий экземпляр в MasOfClass просто обращением по индексу может и не получиться. Например, если такой первичный ключ может принимать достаточно большое количество значений. Оправдывает ли цель превращение MasOfClass в хеш-таблицу?
P.S. Кстати, а не перебором ли реализован IndexOfObject() случайно?
sniknik (2011-09-23 11:28:00) [13]> просто неизвестны.
может быть, но и в этом случае можно сделать где нибудь связку "ID-ClassRec" где ID например индекс массива в котором лежит ClassRec, тогда поиск будет -
ComboBox1.ItemIndex := ComboBox1.Items.IndexOfObject(MasOfClass[ID]);
ProgRAMmer Dimonych (2011-09-23 09:52:00) [14]> [2] [6]
Сдаётся мне, автору не сильно это поможет. Стоит, конечно, уточнить, но, похоже, суть в том, чтобы имея совершенно другой экземпляр структуры/класса, найти в списке элемент к которому привязан другой экземпляр, но с такими же значениями поля/полей. Т.е. к моменту позиционирования адреса объектов, прикрученных к списку, просто неизвестны.
Laguna, так или не так?
jeer (2011-09-23 09:50:00) [15]Это Лагуне адресовано :)
ProgRAMmer Dimonych (2011-09-23 09:46:00) [16]> [5] Jeer © (23.09.11 09:43)
> Не читатель ?
???
sniknik (2011-09-23 09:46:00) [17]> Реализация через запись или класс не принципиальна.
перевожу
разница между ламером и программистом не принципиальна... но это только на первый взгляд.
> Важен момент позиционирования.
позиционируй по объекту... в чем проблема? вместо ID = 1 и тд. представь, что ID = integer(ClassRec); и вместо списка с ID (откуда ты их берешь для поиска?) у тебя будет список объектов.
это для понимания... на самом деле и сам ID тут не нужен.
Jeer (2011-09-23 09:43:00) [18]
> пробегать по всем элементам самостоятельно
Не читатель ?
Laguna (2011-09-23 09:27:00) [19]Реализация через запись или класс не принципиальна. Важен момент позиционирования.
Ega23 (2011-09-22 20:37:00) [20]
> или нужно как то по другому?
для D7 - боюсь никак.
для D2010 - можно через анонимный метод.