![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Как привязать к строке каждой TStringGrid или TListBox структуру или массив, чтобы в дальнейшем обращаться через точку по имени, например что то вроде этого:
Код:
ListBox1.Items[0].MyParam1 := 1; ListBox1.Items[0].MyParam2 := 2; Последний раз редактировалось Igorevsky, 08.04.2008 в 22:34. |
|
#2
|
|||
|
|||
|
В TString командой AddObject можно добавлять любой класс (TObject и потомки). Например, так:
Код:
var N: Integer = 0;
type
Ob1 = class
Param1, Param2: Integer;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Inc(N);
ListBox1.Items.AddObject(IntToStr(N), Ob1.Create);
(ListBox1.Items.Objects[0] as Ob1).Param1:= 1;
end; |
|
#3
|
|||
|
|||
|
Премного признателен. 100% то, что мне нужно. Буду пробовать.
|
|
#4
|
|||
|
|||
|
отлично, работает!!!!
но вопрос, при удалении строки этот объект удалится корректно? Код:
WorkListBox.Items.InsertObject(0, 'sdfghj', Ob1.Create);
(WorkListBox.Items.Objects[0] as Ob1).Param1:= 1;
(WorkListBox.Items.Objects[0] as Ob1).Param2:= 2;
WorkListBox.Items.InsertObject(1, 'sdfghj', Ob1.Create);
(WorkListBox.Items.Objects[1] as Ob1).Param1:= 3;
(WorkListBox.Items.Objects[1] as Ob1).Param2:= 4;
WorkListBox.Items.InsertObject(2, 'sdfghj', Ob1.Create);
(WorkListBox.Items.Objects[2] as Ob1).Param1:= 5;
(WorkListBox.Items.Objects[2] as Ob1).Param2:= 6;
WorkListBox.Items.Delete(1);
reportlistbox.Items.Add(IntToStr((WorkListBox.Items.Objects[0] as Ob1).Param1));
reportlistbox.Items.Add(IntToStr((WorkListBox.Items.Objects[0] as Ob1).Param2));
reportlistbox.Items.Add(IntToStr((WorkListBox.Items.Objects[1] as Ob1).Param1));
reportlistbox.Items.Add(IntToStr((WorkListBox.Items.Objects[1] as Ob1).Param2));Последний раз редактировалось Igorevsky, 08.04.2008 в 22:34. |
|
#5
|
|||
|
|||
|
То, что было создано по Create, надо удалять по Free. При этом освобождается память объекта (экземпляра класса), а список (WorkListBox.Items.Objects) хранит только адреса. После удаления туда надо записать nil, (потом наличие объекта можно проверять по функции Assigned(<указатель>). Либо, как в твоём примере, удалить указатель:
Код:
(WorkListBox.Items.Objects[1] as Ob1).Free; WorkListBox.Items.Delete(1); // или Objects[1]:= nil; |
|
#6
|
|||
|
|||
|
С этим проблема, удаляется нормально, но в дальнейшем при обращении к списку выходит сообщение об ошибке, какая-то путаница с индексами и адресами памяти. А при закрытии программы эти объекты сами удаляются? Подскажи пожалуйста, возможно ли очистить память после удаления строки, например нечто такое (нерабочий пример):
Код:
var P: ^Ob1; begin P := @(ListBox.Items.Objects[1] as Ob1); Listbox.Items.Delete(i); P.Free; end; Кстати отличный пост получился, можно даже в FAQ добавлять к описанию StringGrid ![]() Последний раз редактировалось Igorevsky, 10.04.2008 в 00:40. |
|
#7
|
|||
|
|||
|
Поскольку P запомнил адрес памяти Ob1, то к этой области можно обращаться. Я немного переделал (чтобы работало):
Код:
procedure TForm1.Button2Click(Sender: TObject); var P: Ob1; begin P := Ob1(ListBox1.Items.Objects[1]); Listbox1.Items.Delete(1); ShowMessage(IntToStr(P.Param1)); // старое значение P.Param1:= -100; ShowMessage(IntToStr(P.Param1)); // новое значение P.Free; end; Последний раз редактировалось AlexSku, 10.04.2008 в 12:54. |
|
#8
|
|||
|
|||
|
спасиб огромное, все получилось.
Последний раз редактировалось Igorevsky, 13.04.2008 в 12:05. |