Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.024 c
7-1070382483
NavigatorV
2003-12-02 19:28
2004.03.28
Выход из Windows


3-1077202927
Andrew Frol
2004-02-19 18:02
2004.03.28
Самый удобный и многофункциональный генератор отчетов!


1-1078953556
Miwa
2004-03-11 00:19
2004.03.28
Размер файла я узнаю таким вот способом:


3-1077871327
Max2004
2004-02-27 11:42
2004.03.28
Query+ProgressBar


1-1078821690
Nekto
2004-03-09 11:41
2004.03.28
Текст с Flat




   Наверх