Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Позиционирование в Combobox по значению объекта [D7]


Страницы:   1 2

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 - можно через анонимный метод.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо