Цитата(Poseidon @ 20.10.2013, 20:23 ) | Цитата(chikistbuch @ 20.10.2013, 17:40 ) Edit.Parent:=TPanel(Sender).Parent;
Очень интересный подход, особенно если учесть, что Sender - это TDBGrid. Почему бы просто не указать там Form1 или Self, тем более что вся эта индийская конструкция все-равно вернет именно это? |
Насколько я понял, у автора грид лежит на панели и он хотел указать родителем именно панель. Процитированный вариант работать будет, однако в нём заложена логическая ошибка, хотя и не приводящая к фактической. Думаю, стоит этот момент разобрать хотя бы кратко.
1. Как уже сказали, Sender здесь ссылается на грид (объект типа TDBGrid). 2. Ошибки компиляции в этом месте не возникает потому, что приведение типа производится жёсткое, без проверки реального типа объекта, а компилятору в случае жёсткого приведения по-барабану что к чему приводить и каковы будут последствия. 3. Во время выполнения программы ошибки в этом месте не возникает потому, что и TPanel, и TDBGrid наследуют свойство Parent от их дальнего общего предка TControl. Обращение к необщему свойству привело бы к ошибке. Приведение с проверкой Edit.Parent:=(Sender as TPanel).Parent также привело бы к ошибке. Правильным вариантом было бы приведение либо к TDBGrid, либо к любому его предку вплоть до TControl. 4. Если Sender в процедуре используется многократно, то логично завести локальную переменную нужного типа (здесь - TDBGrid или предка), один раз присвоить ей значение (причём лучше с проверкой типа, через as) и вместо TDBGrid(Sender).Parent спокойно писать g.Parent 5. Edit:=TEdit.Create(Form1); - это опять-же, грубейшая логическая ошибка, в частном случае не приводящая к фактической. TForm1 - класс. Экземпляров класса (объектов) в общем случае может быть много. Form1 - это переменная-указатель (4 или 8 байт), которая может указывать только на один экземпляр формы. А может и не указывать вообще никуда. А все формы класса TForm1 должы работать, сколько бы их ни было создано. И работать со своими данными. Короче, правильным вариантом записи было бы Edit:=TEdit.Create(Self); Разберитесь что такое Self. 6. Посмотрите статью: http://delphikingdom.com/asp/viewitem.asp?catalogid=342
Ваша процедура с указанными исправлениями могла бы выгледеть примено так:
| Код | procedure TForm1.ChangeCell(Sender: TObject); var Edit: TEdit; g: TDBGrid; // Добавлено begin g := Sender as TDBGrid; // Добавлено Edit:=TEdit.Create(Self); // Form1 ---> Self Edit.Name:='DBEdit'; Edit.Top:=DBSelectedCellRect.Top+g.Top; Edit.Left:=DBSelectedCellRect.Left+g.Left+2; Edit.Width:=DBSelectedCellRect.Right - DBSelectedCellRect.Left; Edit.Text:=g.SelectedField.AsString; Edit.OnChange:=EditChange; Edit.OnKeyPress:=EditKeyPress; Edit.OnExit:=EditExit; Edit.Parent:=g.Parent; // TPanel(Sender) ---> g Edit.SetFocus; end;
|
|