Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как записать строку в св-во Objects компонента combobox? [D6]


kivadim ©   (2005-01-31 18:16:00) 

записывал значение типа integer таким образом:

cbox1.Items.AddObject(Query[1].AsString,TObject(Query[2].AsInteger));

а считывал так:

i:=integer(cbox1.Items.Objects[cbox1.ItemIndex]);


теперь надо записать значение типа string.
пытаюсь сделать так:

cbox1.Items.AddObject(Query[1].AsString,TObject(Query[2].AsString));

но при считывании выдает мусор

s:=string(cbox1.Items.Objects[cbox1.ItemIndex]);

Подскажите пожайлуста как привильно записать...


MBo   (2005-02-01 15:33:00) [1]

>kivadim   (01.02.05 14:56) [13]
> получается что для каждого комбокса нужен свой объект TStringList-а, это как-то не очень эффективно.

В любом  случае придется где-то хранить эти строки.


kivadim   (2005-02-01 14:56:00) [2]

>MBo ©   (01.02.05 14:33) [11]
Сделал по твоему. Все работает, но получается что для каждого комбокса нужен свой объект TStringList-а, это как-то не очень эффективно.

>Arm79 ©   (01.02.05 14:33) [12]
спасибо теперь будем знать, но тоже довольно длинный путь....


MBo   (2005-02-01 14:33:00) [3]

>и что в св-ве Objects хранить номер строки из TStringList?
Если у тебя каждой строке combobox соответствует доп. строка, то ничего хранить и не надо - однозначное соответствие. Иначе - да, храни число-номер в списке.


Arm79   (2005-02-01 14:33:00) [4]

Все достаточно просто.

kivadim   (31.01.05 18:16)

записывал значение типа integer таким образом:
cbox1.Items.AddObject(Query[1].AsString,TObject(Query[2].AsInteger));
а считывал так:
i:=integer(cbox1.Items.Objects[cbox1.ItemIndex]);


В Обджестс хранится адрес. Имеет размер 4 байта. Пишешь ты туда Интеджер. Тоже 4 байта. А потом интерпретируешь значение в Обджектс как Интеджер. Это допустимо и экономит память по 4 байта на каждую запись ;)

Можно записать и так:
var
 pInt : ^Integer;
 i    : Integer;
begin
   // запись
 pInt := AllocMem(SizeOf(Integer));
 pInt^:= Query[2].AsInteger;
 cbox1.Items.AddObject(..., TObject(pInt));
   ...
   // считывание
 pInt := PInteger(cbox1.Items.Objects[cbox1.ItemIndex]);
 i := pInt^;
 FreeMem(pInt, SizeOf(Integer));
end;

Если записывать строки, то нужно их перевести в PChar
var
 pcTemp : PChar;
begin
 pcTemp := AllocMem(Length(MyStr)+1); // для последнего #0
 System.Move(MyStr[1], pcTemp^, Length(MyStr))
 PByteArray(pcTemp)[Length(MyStr)] := 0; // вроде можно
                                         // не писать, но привык
end;

Потом закинуть в Обджектс как в примере с Интеджер.

Считывание аналогично.
 pcTemp := PChar(...Objects[your_index]);
 MyStr  := string(pcTemp);
 FreeMem(pcTemp, StrLen(pcTemp)+1);

Вроде бы так.


kivadim   (2005-02-01 13:58:00) [5]

и что в св-ве Objects хранить номер строки из TStringList?


MBo   (2005-01-31 18:41:00) [6]

>kivadim
Самое простое - завести дополнительный TStringList для хранения строк.


kivadim   (2005-01-31 18:39:00) [7]

да неужели с integer такая красота получается, а со string-ом такя лажа??


MBo   (2005-01-31 18:36:00) [8]

>Набережных С. ©   (31.01.05 18:28) [3]
Уел ;))
Да, конечно, память нужно выделять, чтобы строки не пропадали, например, как Arm79 сказал.


kivadim   (2005-01-31 18:35:00) [9]

>Набережных С. ©   (31.01.05 18:33) [5]
а все-таки что нет простого решения?


Набережных С.   (2005-01-31 18:33:00) [10]

>kivadim   (31.01.05 18:30) [4]

Он пошутил:)


kivadim   (2005-01-31 18:30:00) [11]

>MBo ©   (31.01.05 18:22) [2]
Я вроде также сделал. Записывать, то записывает, а как потом вытащать записанное, а не мусор


Набережных С.   (2005-01-31 18:28:00) [12]

>MBo ©   (31.01.05 18:22) [2]

Че, правда?:)


MBo   (2005-01-31 18:22:00) [13]

var s:string;

s:=Query[2].AsString;
затем
cbox1.Items.AddObject(Query[1].AsString,TObject(s));


Arm79   (2005-01-31 18:21:00) [14]

Переведи строку в PChar(выделив под нее соответственно область памяти), и в Object кидай указатель на эту область. А когда надобность в ней отпадет, освободи эту область FreeMem'ом


Наверх

Титульная страница Поиск, карта сайта Написать письмо