Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

__________опять 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
8-1079022569
SiDoff
2004-03-11 19:29
2004.05.30
На цветном Bitmap есть черные линии, как их выловить программой ?


7-1082477705
tyoma
2004-04-20 20:15
2004.05.30
Поиск установленного ПО


1-1084567825
LORDMAXX
2004-05-15 00:50
2004.05.30
Заблокировать компьютер


3-1084383853
SeregaC
2004-05-12 21:44
2004.05.30
Сохранение БД


14-1084169869
тихий вовочка
2004-05-10 10:17
2004.05.30
теракт в Грозном