Форум: "Начинающим";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];
ВнизПозиционирование в Combobox по значению объекта Найти похожие ветки
← →
Laguna © (2011-09-22 15:27) [0]Нужно в контрольной работе написать кусок кода, в котором в 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(...) в данном случае или нужно как то по другому?
← →
ProgRAMmer Dimonych © (2011-09-22 15:36) [1]Не поможет: указатель на структуру будет отличаться от того, с которым её добавляли в список. А поскольку контрол ничего не знает о структуре, на которую ссылается указатель (в т.ч. и её размера), сравнить он её не сможет. Следовательно, надо пробегать по всем элементам самостоятельно и искать подходящий.
← →
sniknik © (2011-09-22 20:22) [2]указатель лишний... вместо record-а класс/обьект, вместо new create ... будет проще.
← →
Ega23 © (2011-09-22 20:37) [3]
> или нужно как то по другому?
для D7 - боюсь никак.
для D2010 - можно через анонимный метод.
← →
Laguna © (2011-09-23 09:27) [4]Реализация через запись или класс не принципиальна. Важен момент позиционирования.
← →
Jeer © (2011-09-23 09:43) [5]
> пробегать по всем элементам самостоятельно
Не читатель ?
← →
sniknik © (2011-09-23 09:46) [6]> Реализация через запись или класс не принципиальна.
перевожу
разница между ламером и программистом не принципиальна... но это только на первый взгляд.
> Важен момент позиционирования.
позиционируй по объекту... в чем проблема? вместо ID = 1 и тд. представь, что ID = integer(ClassRec); и вместо списка с ID (откуда ты их берешь для поиска?) у тебя будет список объектов.
это для понимания... на самом деле и сам ID тут не нужен.
← →
ProgRAMmer Dimonych © (2011-09-23 09:46) [7]> [5] Jeer © (23.09.11 09:43)
> Не читатель ?
???
← →
jeer © (2011-09-23 09:50) [8]Это Лагуне адресовано :)
← →
ProgRAMmer Dimonych © (2011-09-23 09:52) [9]> [2] [6]
Сдаётся мне, автору не сильно это поможет. Стоит, конечно, уточнить, но, похоже, суть в том, чтобы имея совершенно другой экземпляр структуры/класса, найти в списке элемент к которому привязан другой экземпляр, но с такими же значениями поля/полей. Т.е. к моменту позиционирования адреса объектов, прикрученных к списку, просто неизвестны.
Laguna, так или не так?
← →
sniknik © (2011-09-23 11:28) [10]> просто неизвестны.
может быть, но и в этом случае можно сделать где нибудь связку "ID-ClassRec" где ID например индекс массива в котором лежит ClassRec, тогда поиск будет -ComboBox1.ItemIndex := ComboBox1.Items.IndexOfObject(MasOfClass[ID]);
← →
ProgRAMmer Dimonych © (2011-09-23 11:52) [11]> [10] sniknik © (23.09.11 11:28)
> > просто неизвестны.
> может быть, но и в этом случае можно сделать где нибудь
> связку "ID-ClassRec" где ID например индекс массива в котором
> лежит ClassRec, тогда поиск будет -
> ComboBox1.ItemIndex := ComboBox1.Items.IndexOfObject(MasOfClass[ID])
> ;
Вариант. Правда, смущает необходимость поддерживать согласованность между списком и массивом.
Но, если я всё-таки правильно понимаю автора, это проблему в общем случае не решит. Зная значение одного-двух полей класса, найти соответствующий экземпляр в MasOfClass просто обращением по индексу может и не получиться. Например, если такой первичный ключ может принимать достаточно большое количество значений. Оправдывает ли цель превращение MasOfClass в хеш-таблицу?
P.S. Кстати, а не перебором ли реализован IndexOfObject() случайно?
← →
Ega23 © (2011-09-23 12:11) [12]
> Например, если такой первичный ключ может принимать достаточно
> большое количество значений.
Миллион? Миллиард?
← →
ProgRAMmer Dimonych © (2011-09-23 12:21) [13]> [12] Ega23 © (23.09.11 12:11)
> Миллион? Миллиард?
Вполне достаточно, чтобы не влезть в память. Даже по одному Integer-полю. Условный пример. Контора, 5 сотрудников, зарплаты. Реально используемых значений 5, но чтобы по размеру зарплаты, просто индексируя массив, находить сотрудника, нужен неоправданно большой массив.
← →
Ega23 © (2011-09-23 12:36) [14]
> Контора, 5 сотрудников, зарплаты. Реально используемых значений
> 5, но чтобы по размеру зарплаты, просто индексируя массив,
> находить сотрудника, нужен неоправданно большой массив.
Почему?
← →
ProgRAMmer Dimonych © (2011-09-23 12:44) [15]> [14] Ega23 © (23.09.11 12:36)
> Почему?
Зарплата может быть любой. Будь она хотя бы до миллиона - это несколько тысяч последовательных страниц памяти выделять придётся, чтобы быстро найти одного из пяти сотрудников.
P.S. Пример с зарплатой, пожалуй, не самый удачный, потому что ключ не гарантирует уникальности записи, но представим себе...
← →
Ega23 © (2011-09-23 13:16) [16]
> Будь она хотя бы до миллиона - это несколько тысяч последовательных
> страниц памяти выделять придётся
Пацталом.
Нафига????
> P.S. Пример с зарплатой, пожалуй, не самый удачный, потому
> что ключ не гарантирует уникальности записи, но представим
> себе...
Я решительно тебя не понимаю. Ещё раз, по пунктам: какую задачу мы решаем?
← →
sniknik © (2011-09-23 13:17) [17]> просто индексируя массив
ну можно и не массив, можно список использовать, и делать IndexOf из IndexOf ;)...
а можно вообще по другому, все поля в таблице, делаешь локейт по любому! полю, одним из полей держать индекс в ComboBox ... или использовать DB аваре ComboBox.
← →
ProgRAMmer Dimonych © (2011-09-23 13:26) [18]> [17] sniknik © (23.09.11 13:17)
> > просто индексируя массив
> ну можно и не массив, можно список использовать, и делать
> IndexOf из IndexOf ;)...
>
> а можно вообще по другому, все поля в таблице, делаешь локейт
> по любому! полю, одним из полей держать индекс в ComboBox
> ... или использовать DB аваре ComboBox.
Ну так вот в том и беда, что как-то многовато получается навёрнуто будет :) Но я всё ещё надеюсь, что Laguna уточнит условие задачи.
← →
ProgRAMmer Dimonych © (2011-09-23 13:30) [19]> [16] Ega23 © (23.09.11 13:16)
> Пацталом.
> Нафига????
Если хранить указатель на экземпляр класса в MasOfClass и индексировать его значением поля этого экземпляра. См. выше
> [16] Ega23 © (23.09.11 13:16)
> Я решительно тебя не понимаю. Ещё раз, по пунктам: какую
> задачу мы решаем?
В ComboBox к каждому элементу привязан указатель на структуру/объект с несколькими полями. Зная значение некоторого ключевого поля, найти индекс элемента ComboBox"а, за которым закреплена запись с таким же значением поля.
По крайней мере, я задачу так понял
← →
Laguna © (2011-09-26 22:57) [20]Прошу прощения за молчание. Не было доступа к интернету. Ввиду срочности требования сдачи контрольной, сделал поиск перебором всего списка combobox и найдя нужную сторку позиционировал на ее. А вобще хотелось бы для себя на будущее разобраться с этим моментом глубже.
← →
Laguna © (2011-09-26 23:01) [21]2ProgRAMmer Dimonych
[19] Совершенно верно, задача именно в этом и состоит.
← →
Германн © (2011-09-26 23:42) [22]
> сделал поиск перебором всего списка combobox и найдя нужную
> сторку позиционировал на ее. А вобще хотелось бы для себя
> на будущее разобраться с этим моментом глубже.
А глубже уже некуда.IndexOfObject
так и работает (перебором). Разве что можно сделать узкоспециализированного наследника, в котором переписатьIndexOfObject
или ввести новый метод типаIndexOfObjectByField
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.003 c