Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Вниз__________опять DLL Найти похожие ветки
← →
tamroF (2004-05-16 08:21) [0]В dll загнана форма
у формы TaskForm есть
TaskForm = class(TForm)
...
{ Public declarations }
quest:string;
answ:TStrings;
default:integer;
result:integer;
тут же (в dll) есть и функция ее создания.......
function DoQuest(h:integer;questt:string;answw:TStrings;defaultt:integer):integer; stdcall;
var
askForm:TaskForm;
i:integer;
begin
result:=0;
try
askForm:= TaskForm.Create (Application);
askForm.ParentWindow:=h; Application.Handle:=h;
// передача параметров
askForm.quest:=questt;
for i:=0 to answw.Count-1 do
askForm.answ.Add(answw.Strings[i]);
askForm.default:=defaultt;
try
askForm.ShowModal;
result:=askForm.result;
finally
FreeAndNil(askForm);
end;
except
end;
end;
Dll загружается сразу при запуске...
и к этой функции идет не одно обращение......
после первого обращения при закрытии самой программы, вызывавшей dll
пишет
1. "инструкция по адресу... . Память не может быть "read"."
2. "Runtime error ..."
после второго обращения (без закрытия):
"Exception EInvalidPointer in module..."
после третьего обращения (без закрытия):
прога молча вылетает
Action := caFree; стоит.....
и где я напакостил????
← →
Mim1 © (2004-05-16 10:44) [1]result:=askForm.result; // тут происхоит ошибка так как форма уже убита (closeaction = cafree)
finally
FreeAndNil(askForm);
end;
---
Используйте результат возврашенный showmodal и уберите FreeAndNil(askForm);
---
Тут
except
end;
Сдклайте хотябы какой нибудь месадж бокс
-0--
А это тоже не нужно
askForm.ParentWindow:=h; Application.Handle:=h;
если форма моальная
---
тут имхо можно создавать без владельца
askForm:= TaskForm.Create (Application);
то есть create(nil)
← →
tamroF (2004-05-16 14:36) [2]Благодарю.... очень помогло......
я и еще, помимо етого там такого....... )
теперь так:
function DoQuest(h:integer;questt:string;answw:TStrings;defaultt:integer):integer; stdcall;
var
AAA:TaskForm;
i:integer;
begin
result:=0;
try
AAA:= TaskForm.Create (nil);
AAA.ParentWindow:=h;
AAA.quest:=questt;
for i:=0 to answw.Count-1 do
AAA.answ.Add(answw.Strings[i]);
AAA.default:=defaultt;
try
Result:=AAA.ShowModal;
except
ShowMessage("1");
end;
except
ShowMessage("2");
end;
end;
а это
// AAA.ParentWindow:=h;
нужно для того, чтоб на панели не появлялось второе окошко от dll....
для этого и передаю в dll
...(h:integer;... - handle того, кто вызывает........
вот еще вопрос......
Result:=AAA.ShowModal;
// Используйте результат возврашенный showmodal
как возвращать showmodal-ом?.....
где, и что к чему присваивать.......
← →
Mim1 © (2004-05-16 14:41) [3]У конпок есть свойство modalresult оно и возвращается при нажатии не кнопку. Если же вы хотите как то по другому закрыть вашу форму, то присвойте свойству modalresult любое ненулевое значение (оно и будет возвращено в результате функции showmodal).
← →
Гаврила © (2004-05-16 15:21) [4]Вы уверены, что корректно отрабатываете ситуацию по передаче экземпляра класса в DLL ?
> answw:TStrings>
← →
tamroF (2004-05-16 17:37) [5]> У конпок есть свойство modalresult оно и возвращается при нажатии не кнопку.
> Если же вы хотите как то по другому закрыть вашу форму, то присвойте свойству modalresult
> любое ненулевое значение (оно и будет возвращено в результате функции showmodal).
Да, это я прекрасно знаю...
но а если без кнопок...
наверное, только "вручную", т.е.:
procedure TaskForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Action := caFree;
end;
+
...
AAA.ShowModal;
Result:=AAA.result;
FreeAndNil(AAA);
...
так все работает...
> Вы уверены, что корректно отрабатываете ситуацию по передаче экземпляра класса в DLL ?
>> answw:TStrings>
нет, но если...
AAA.answ.Assign(answw);
уходит на
except
ShowMessage("2");
end;
есть варианты?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.035 c