Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.01;
Скачать: CL | DM;

Вниз

Позиционирование в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
2-1316683686
pavor
2011-09-22 13:28
2012.01.01
Длина поля String в ClientDataSet


9-1188670996
dector
2007-09-01 22:23
2012.01.01
MUD исходник


2-1316690831
Laguna
2011-09-22 15:27
2012.01.01
Позиционирование в Combobox по значению объекта


1-1278875240
dyonysos
2010-07-11 23:07
2012.01.01
MessageBox из TService


2-1316902702
Undria
2011-09-25 02:18
2012.01.01
Не работает код в Delphi XE2