![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ссылка на объект в строке 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. - лишнее