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

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

ссылка на объект в строке StringGrid`а [D7, WinXP]


Creative ©   (2006-02-28 11:20:00) 

В обработчике StringGrid`а  onDoubleClick заложены две процедуры:
1. если строка, на которой стоит курсор, пустая, то открывается маленькая форма с полями ввода и при их заполнении и нажатии ОК, создается объект класса TThing (например), его поля отображаются с соотв. ячейках таблицы и  еще - в  текущую строку таблицы добавляется ссылка на этот объект:
Form1.MyGrid.Objects[0, row]:=NewThing;

2. если строка уже заполнена, то при Double Click`е тоже открыватся форма, но она уже содержит значения полей объекта, связанного с этой строчкой. Предполагается, что если эти значения изменить и нажать ОК, то они обновятся в таблице. обращение к объекты происходит следующим образом:
with TThing(Form1.MyGrid.Objects[0, row]) do
 begin
  ...
 end;

Но на этой строке программа вылетает.

Уточнение: если написать в чистом виде
Form1.MyGrid.Objects[0, row]
программа даже не скомпилится, написав, что row - ubdeclared identifier

Если изголиться и написать
var
a: integer;
..........
Form1.MyGrid.Objects[0, a]
то компилятор это проглотит, но при повторном обращении к объекту (при редактировании) программа вылетит. Отладчик показывает, что
TThing(Form1.MyGrid.Objects[0, row])  = nil, то есть при создании объекта никакая ссылка на него с строку не добавилась. Объясните почему? Что я делаю неправильно?


ЮЮ   (2006-02-28 12:11:00) [1]

Не помогло
Не верю

procedure TForm1.StringGrid1DblClick(Sender: TObject);
begin
 if StringGrid1.Objects[0, StringGrid1.Row] = nil then begin
   Caption := 'Создан новый Объект';
    StringGrid1.Objects[0, StringGrid1.Row] := TStringList.Create;
 end
 else begin
   TStringList(StringGrid1.Objects[0, StringGrid1.Row]).Add('');
   Caption :=
     'Объект существует. ' +
     IntToStr(TStringList(StringGrid1.Objects[0, StringGrid1.Row]).Count) +
     ' DblClick';
 end;

end;


Creative   (2006-02-28 11:53:00) [2]

> ЮЮ ©   (28.02.06 11:47) [1]

>  вопрос в том, чему был равен row
> в момент присвоения
> Form1.MyGrid.Objects[0, row]:=NewThing;

function NewThing: TThing;
begin
 result:= TThing.Create;
end;

класс TThing описан по всем правилам

> Может тогда уж
> MyGrid.Objects[0, MyGrid.Row]:=NewThing;

Не помогло


ЮЮ   (2006-02-28 11:47:00) [3]


> никакая ссылка на него с строку не добавилась


Она могла и добавиться. вопрос в том, чему был равен row в момент присвоения
Form1.MyGrid.Objects[0, row]:=NewThing;

Может тогда уж

MyGrid.Objects[0, MyGrid.Row]:=NewThing;

P/S. Если этот код в методах TForm1, то Form1. - лишнее


Наверх

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