Текущий архив: 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