Главная страница
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.49 MB
Время: 0.038 c
3-1077189188
Pul
2004-02-19 14:13
2004.03.28
Поля TIMESTAMP в INTERBASE


1-1078658419
Fess
2004-03-07 14:20
2004.03.28
Работа с файлами


6-1074172801
FOIL
2004-01-15 16:20
2004.03.28
Все процессы на удалённой машине


11-1057853508
miek
2003-07-10 20:11
2004.03.28
Кладову о TBitmap


14-1077888387
neodiX
2004-02-27 16:26
2004.03.28
Internet lines overbooking