Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.04.2008, 22:00
Igorevsky Igorevsky вне форума
Прохожий
 
Регистрация: 06.04.2008
Сообщения: 5
Репутация: 10
По умолчанию Как привязать к строке каждой TStringGrid или TListBox структуру или массив

Как привязать к строке каждой TStringGrid или TListBox структуру или массив, чтобы в дальнейшем обращаться через точку по имени, например что то вроде этого:
Код:
   ListBox1.Items[0].MyParam1 := 1;
   ListBox1.Items[0].MyParam2 := 2;
Возможно ли это без создания класса. Может для этого стоит использовать как то свойство Objects?

Последний раз редактировалось Igorevsky, 08.04.2008 в 22:34.
Ответить с цитированием
  #2  
Старый 08.04.2008, 12:18
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

В 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  
Старый 08.04.2008, 21:42
Igorevsky Igorevsky вне форума
Прохожий
 
Регистрация: 06.04.2008
Сообщения: 5
Репутация: 10
Лампочка

Премного признателен. 100% то, что мне нужно. Буду пробовать.
Ответить с цитированием
  #4  
Старый 08.04.2008, 22:28
Igorevsky Igorevsky вне форума
Прохожий
 
Регистрация: 06.04.2008
Сообщения: 5
Репутация: 10
По умолчанию

отлично, работает!!!!
но вопрос, при удалении строки этот объект удалится корректно?

Код:
    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  
Старый 09.04.2008, 12:23
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

То, что было создано по Create, надо удалять по Free. При этом освобождается память объекта (экземпляра класса), а список (WorkListBox.Items.Objects) хранит только адреса. После удаления туда надо записать nil, (потом наличие объекта можно проверять по функции Assigned(<указатель>). Либо, как в твоём примере, удалить указатель:
Код:
(WorkListBox.Items.Objects[1] as Ob1).Free;
WorkListBox.Items.Delete(1); // или Objects[1]:= nil;
Ответить с цитированием
  #6  
Старый 10.04.2008, 00:35
Igorevsky Igorevsky вне форума
Прохожий
 
Регистрация: 06.04.2008
Сообщения: 5
Репутация: 10
По умолчанию

С этим проблема, удаляется нормально, но в дальнейшем при обращении к списку выходит сообщение об ошибке, какая-то путаница с индексами и адресами памяти. А при закрытии программы эти объекты сами удаляются? Подскажи пожалуйста, возможно ли очистить память после удаления строки, например нечто такое (нерабочий пример):
Код:
  
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  
Старый 10.04.2008, 12:52
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Поскольку 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;
Надо ещё помнить, что локальные переменные уничтожаются при выходе из процедуры. (var P:Ob1 можно сделать глобальной или полем формы).

Последний раз редактировалось AlexSku, 10.04.2008 в 12:54.
Ответить с цитированием
  #8  
Старый 13.04.2008, 12:01
Igorevsky Igorevsky вне форума
Прохожий
 
Регистрация: 06.04.2008
Сообщения: 5
Репутация: 10
По умолчанию

спасиб огромное, все получилось.

Последний раз редактировалось Igorevsky, 13.04.2008 в 12:05.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter