Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1278308829
HikTronic
2010-07-05 09:47
2012.01.01
формы, потоки и TWebBrowser


2-1316502373
i2e
2011-09-20 11:06
2012.01.01
ShortString - max 255 символов. А String?


3-1269469439
adigozelov
2010-03-25 01:23
2012.01.01
TNT+ADO


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


2-1317028812
alexdn
2011-09-26 13:20
2012.01.01
Перезаписывать тхт построчно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский