Текущий архив: 2005.02.13;
Скачать: CL | DM;
Вниз
как записать строку в св-во Objects компонента combobox? Найти похожие ветки
← →
kivadim (2005-01-31 18:16) [0]записывал значение типа 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]);
Подскажите пожайлуста как привильно записать...
← →
Arm79 © (2005-01-31 18:21) [1]Переведи строку в PChar(выделив под нее соответственно область памяти), и в Object кидай указатель на эту область. А когда надобность в ней отпадет, освободи эту область FreeMem"ом
← →
MBo © (2005-01-31 18:22) [2]var s:string;
s:=Query[2].AsString;
затем
cbox1.Items.AddObject(Query[1].AsString,TObject(s));
← →
Набережных С. © (2005-01-31 18:28) [3]>MBo © (31.01.05 18:22) [2]
Че, правда?:)
← →
kivadim (2005-01-31 18:30) [4]>MBo © (31.01.05 18:22) [2]
Я вроде также сделал. Записывать, то записывает, а как потом вытащать записанное, а не мусор
← →
Набережных С. © (2005-01-31 18:33) [5]>kivadim (31.01.05 18:30) [4]
Он пошутил:)
← →
kivadim (2005-01-31 18:35) [6]>Набережных С. © (31.01.05 18:33) [5]
а все-таки что нет простого решения?
← →
MBo © (2005-01-31 18:36) [7]>Набережных С. © (31.01.05 18:28) [3]
Уел ;))
Да, конечно, память нужно выделять, чтобы строки не пропадали, например, как Arm79 сказал.
← →
kivadim (2005-01-31 18:39) [8]да неужели с integer такая красота получается, а со string-ом такя лажа??
← →
MBo © (2005-01-31 18:41) [9]>kivadim
Самое простое - завести дополнительный TStringList для хранения строк.
← →
kivadim (2005-02-01 13:58) [10]и что в св-ве Objects хранить номер строки из TStringList?
← →
MBo © (2005-02-01 14:33) [11]>и что в св-ве Objects хранить номер строки из TStringList?
Если у тебя каждой строке combobox соответствует доп. строка, то ничего хранить и не надо - однозначное соответствие. Иначе - да, храни число-номер в списке.
← →
Arm79 © (2005-02-01 14:33) [12]Все достаточно просто.
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 14:56) [13]>MBo © (01.02.05 14:33) [11]
Сделал по твоему. Все работает, но получается что для каждого комбокса нужен свой объект TStringList-а, это как-то не очень эффективно.
>Arm79 © (01.02.05 14:33) [12]
спасибо теперь будем знать, но тоже довольно длинный путь....
← →
MBo © (2005-02-01 15:33) [14]>kivadim (01.02.05 14:56) [13]
> получается что для каждого комбокса нужен свой объект TStringList-а, это как-то не очень эффективно.
В любом случае придется где-то хранить эти строки.
Страницы: 1 вся ветка
Текущий архив: 2005.02.13;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.051 c