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

Вниз

Добавление объекта в TComboBox   Найти похожие ветки 

 
Max ©   (2004-03-04 17:32) [0]

Мне нужно для каждого элемента в TComboBox добавлять еще дополнительную текстовую информацию, которая не должна отображаться. Я добавляю ее как объект:
ComboBox.Items.AddObject("строка1", TObject("подстрока1"))
Все нормально добавляется, но как потом "достать" это информацию, т.е. для "строка1" получить "подстрока1"?


 
MBo ©   (2004-03-04 17:33) [1]

string(ComboBox.Items.Objects[i])


 
Gero ©   (2004-03-04 18:29) [2]

Или IndexOfObject


 
Max ©   (2004-03-05 15:52) [3]

MBo
Так работает, но очень часто вместе с текстом вылазит куча левых символов. Т.е. 1 из 10 случаев, возвращается правильный текст, а в другие разы возвращается текст с символами, которых нет в исходном тексте. От чего это может зависить?


 
MBo ©   (2004-03-05 15:58) [4]

зависит от того, не портится/освобождается ли строка, указатель на которую передан в Objects комбика


 
Юрий Зотов ©   (2004-03-05 15:58) [5]

> Max ©   (05.03.04 15:52) [3]
> От чего это может зависить?

От неверной работы со строками. Без кода ничего не скажешь.


 
Max ©   (2004-03-05 16:48) [6]

Вот:

procedure TForm1.FormCreate(Sender: TObject);
var
 I: Integer;
 S: String;
begin
 for I := 0 to 10 do
 begin
   S := "Строка" + IntToStr(I);
   ComboBox.Items.AddObject(IntToStr(I), TObject(S));
 end;
 ComboBox.ItemIndex := 0;
end;

procedure TForm1.ComboBoxChange(Sender: TObject);
var
 S: String;
begin
 if TComboBox(Sender).ItemIndex <> -1 then
   S := String(TComboBox(Sender).Items.Objects[TComboBox(Sender).ItemIndex]);
 Label1.Caption := S;
end;


 
MBo ©   (2004-03-05 17:04) [7]

Диагноз [4]


 
Юрий Зотов ©   (2004-03-05 19:14) [8]

> Max ©   (05.03.04 16:48) [6]

В FormCreate переменная S - локальная. При выходе из процедуры счетчик ссылок на нее становится нулевым и строка удаляется - после чего ссылка на нее же в ComboBox становится неверной.

Далее занимаемая удаленной строкой память используется для любых других целей и в итоге, когда в ComboBoxChange Вы пытаетесь снова проинтерпретировать эту память, как строку, то можете получить все, что угодно.

Заведите TStringList, как поле формы (в конструкторе - создем, в деструкторе - убиваем). Строки храним в нем, а в Combobox.Items.Objects храним номер строки в этом TStringList"е.


 
Германн ©   (2004-03-05 22:51) [9]

Кстати, при такой реализации как в [6] еще до выхода из FormCreate во всех Итемах комбобокса хранится одна и та же строка "Строка10".


 
uUnknown   (2004-03-05 23:26) [10]

Используй глобальные переменные, или глобальный или член класса (TForm1, например) - динамический массив строк. Храни не ссылку на строку, а идекс в массиве. Напрмер
ComboBox.Items.AddObject(IntToStr(I), TObject(ArrayIndex));
Извлечь: S := GlobelStringArray[Integer(ComboBox.Items.Objects[Index])];
Ну и в том же духе. Надеюсь, поможет



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.029 c
1-1078393346
Aleksandr
2004-03-04 12:42
2004.03.28
Есть средства анализа объектов программы?


14-1078206753
raymond
2004-03-02 08:52
2004.03.28
WinXP... На системном логическом диске - файл hiberfil.sys


3-1076318221
kiril-
2004-02-09 12:17
2004.03.28
Вычисляемые поля


8-1069085167
g-l-u-k
2003-11-17 19:06
2004.03.28
ListBox DoubleClick


14-1078385774
TUser
2004-03-04 10:36
2004.03.28
Linux for чайник





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский