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

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

Создание MDI-child ов [D6, Win95/98, Win2k]


Verq ©   (2002-06-08 20:23:00) 

Мужики, почему вылетает AV? Никак не разберусь...
DataSource лежит на форме которую мы создаём, а qryAvtori на DataModul"е <- ну это так, на всякий случай.

function TfrmMain.FormTableEditOpen(f_Name: string):Integer;
begin
Result:=0;
TfrmTableEdit.Create(Self).Name:="frm"+f_Name+"Edit";
with TfrmTableEdit(FindComponent("frm"+f_Name+"Edit")) do
begin
dsTableEdit.DataSet:=TADOQuery(FindComponent("DM.qry"+f_Name)); //указываем путь к ADOQuery DM.qryAvtori
dsTableEdit.DataSet.Open; // <- EAccessViolation
Parent:=Self;
frameTableEditMaster.lblChtoDelaem.Caption:="Редактирование карточек авторов";
end;
Result:=1;
end;

procedure TfrmMain.mnuTableEditClick(Sender: TObject);
begin
FormTableEditOpen("Avtori");
end;


Verq   (2002-06-08 23:26:00) [1]

Всё получилось, спасибо огромное, спасли Вы мою южную опору ~)


Verq   (2002-06-08 22:02:00) [2]

спасибо тебе большое,
да пребудет с тобой сила Кайф...
попробую чуть позже


kaif   (2002-06-08 21:08:00) [3]

with TfrmTableEdit(FindComponent("frm"+f_Name+"Edit")) do
FindComponent("DM.qry"+f_Name)
в переводе на русский язык означает:
Найди мне компонент с именем "DM.qry"+f_Name в списке компонентов, владельцем (Owner) которых является компонент с именем
"frm"+f_Name+"Edit" и в данном случае возвращает nil, так как дочерняя форма не является владельцем запроса с именем "DM.qry"+f_Name

FindComponent это не функция по поиску компонентов в приложении, а метод компонента для поиска других компонентов, которыми он владеет. И только Application.FindComponent ищет компонент формы, да и то, если его владелец - Application.


А вообще весь вышеприведенный Вами код есть чистой воды извращение. И MDI тут непричем.

Показываю правильный код:
function TfrmMain.FormTableEditOpen(f_Name: string):Integer;
var
frm: TfrmTableEdit;
begin
frm := TfrmTableEdit.Create(Self);
with frm do
begin
Name := "frm"+f_Name+"Edit";
dsTableEdit.DataSet:=DM.qryAutori; //указываем путь к
//DM.qryAvtori
dsTableEdit.DataSet.Open; // без EAccessViolation
frameTableEditMaster.lblChtoDelaem.Caption :=
"Редактирование карточек авторов";
end;
Result := 1;
end;

Или же если уж совсем приспичилоискать компоненты, а не просто использовать указатели на них, то правильно искать запрос так:
dsTableEdit.DataSet := DM.FindComponent("DM.qry"+f_Name);

А вообще после любого FIndComponent советую проверять результат поиска на неравенство nil.
var
C: TComponent;
C := НекийКомпонент.FindComponent(имя)
if C <> nil then
....


Наверх

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