![]() |
|
|
Регистрация | << Правила форума >> | 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. |