Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 20:26 04.07.24 
Компютри и Интернет
   >> Delphi
*Кратък преглед

Тема Control ListView has no parent windowнови  
Автор Eventer ()
Публикувано08.06.03 18:14



Hi & Help - Не мога да разбера къде е проблема!!!

1. Имам GUI Application
2. Имам Application.MailForm
3. В нея доквам Form2, която е в отделен DLL
4. В нея контроли от вида TLabel, TEdit, TToolBar, TButton работят нормално
5. Kонтрола TListView във Form2 се държи нормално докато не кликна върху нея с мишката. Тогава eventa не се обработва и излиза Run Time Exception:

Control ListView1 has no parent window

Когато стартирам Form2 самостоятелно всичко е ОК.
КАКВО ИЗПУСКАМ?

Предварително благодаря!

Дали завиването на крушка е софтуерен проблем?

Редактирано от Eventer на 08.06.03 18:16.



Тема Re: Control ListView has no parent windowнови [re: Eventer]  
Автор PhantomASМодератор (няма)
Публикувано08.06.03 22:27



Ами едно просто нещо - как точно инициализираш Form2 - когато формата е поставена в DLL (не bpl) има една тънкост - предаване на правилния Application обект. А ето ти и един пример.

{ To add a form to a DLL you have to remember these things:
1. assign the calling programs Application.Handle to the DLL's Application.Handle
2. Write one or two exported functions that handles the interaction with the calling program
3. include sharemem as the first unit in the DLL's uses clause if the exported functions uses strings
4. if you are going to show a mode-less form, you should return a handle to your form in the "Show" function and require it as a parameter in the "Close" function
5. always create the form with the Application object as the Owner
6. restore the DLL's Application.Handle after closing the form

You don't have to do anything special to add a form to a DLL: just add the forms filename to the uses clause and Delphi will compile it right into the DLL.

Here's an example with both modal and mode-less invocation. The examples just return an integer value, but you could of course return just about anything:
}

library testDLL;

uses
myTestFrom, SysUtils, Controls;


var
OldApphandle:longint = 0;

{ these functions are used with the mode-less form: }

{ AppHandle is the *calling* applications Handle }
function ShowTestForm(AppHandle:integer):longint;
var F:TmyTestForm;
begin
{ save current handle unless it's already done }
if Application.Handle <> AppHandle then
OldAppHandle := Application.Handle;
{ assign new }
Application.Handle := AppHandle;
{ create and show form }
F := TmyTestForm.Create(Application);
F.Show;
Result := longint(F);
end;

{ the input value, Handle, must be the same value as returned by ShowTestForm }
function CloseTestForm(Handle:longint):integer;
var F:TmyTestForm;
begin
{ typecast back to TForm (some sanity checks here would not be bad...}
F := TmyTestForm(Handle);
Result := F.SomeIntValue;
F.Close;
F.Free;
{ restore previous handle }
Application.Handle := OldAppHandle;
end;

{ this function is used to show the form modally }
function ShowTestFormModal(AppHandle:integer):longint;
var F:TmyTestForm;
begin
OldAppHandle := Application.Handle;
try
Application.Handle := AppHandle;
F := TmyTestForm.Create(Application);
try
if F.ShowModal = mrOK then
Result := F.SomeIntValue
else
Result := -1;
finally
F.Free;
end;
finally
Application.Handle := OldAppHandle;
end;
end;

{ finally export the functions: }

exports ShowTestForm name 'ShowTestForm', CloseTestForm name 'CloseTestForm',
ShowTestFormModal name 'ShowTestFormModal';

begin
end.

---
Е т'ва е живот!


Тема The problem is the dockingнови [re: PhantomAS]  
Автор Eventer ()
Публикувано09.06.03 09:00



Thanks,
Обаче не е това проблема. Тези неща ги правя - и пак същия проблем.

Ефектът се получава при комбинацията:
1. Форма в DLL
2. И тази форма - докната в главната

------------------
П.П.
- Когато не е докната, Form2 се извиква и работи нормално !!! ????
- Имам функция в DLL с Result := TForm2.Create(Application);
- Form2 се затваря сама и сама освобождава паметта с Action := caFree;
- Същият ефект се получава и при кликване върху StringGrid

Дали завиването на крушка е софтуерен проблем?

Редактирано от Eventer на 09.06.03 09:02.



Тема Sorry не съм разбрал...нови [re: Eventer]  
Автор PhantomASМодератор (няма)
Публикувано09.06.03 09:37



напълно проблема ти.

Това трябва да го пробвам - ама ще е чак довечера - ако някой може и знае да се обади, че в момента имам други главоболя. Между другото и мен ме вълнува - само, че аз мисля да ползвам bpl(runtime) не dll.

---
Е т'ва е живот!


Тема Всичко работи нормално...нови [re: PhantomAS]  
Автор Eventer ()
Публикувано09.06.03 11:01



...когато компилирам нещата с Run time Packages

Дали завиването на крушка е софтуерен проблем?


Тема Re: Всичко работи нормално...нови [re: Eventer]  
Автор PhantomASМодератор (няма)
Публикувано09.06.03 11:39



Това ми е ясно - ако държиш оба4е да останеш на варианта с dll - ще трябва да се види от къде идва проблема.
Реално за мен най-чистото решение си е ползването на bpl - за подобни "фокуси".

---
Е т'ва е живот!


Тема Re: Всичко работи нормално...нови [re: PhantomAS]  
Автор Eventer ()
Публикувано09.06.03 12:08



Да, аз СЪМ с DLL в момента. Нещо се губи при докването явно. А не правя BPL, понеже за в бъдеще си оставям вратичка да доквам форми, които не са писани на Delphi, евентуално на VC.

MS са едни подробни по въпроса :) Царе са да те засипват с инфо, само това което ти трябва го няма :) Ако знаеш сайт с повече инфо за докването - постни го моля

Дали завиването на крушка е софтуерен проблем?


Тема Re: Всичко работи нормално...нови [re: Eventer]  
Автор Mandor ()
Публикувано10.06.03 15:14



Проблема (ако може да се нарече проблем) си е Borland-ски. При програма+DLL без RunTime Packages на практика имаш по две VMT-та за всеки клас - едно в програмата и едно в DLL-а. Просто извикването на някой метод ходи в грешното VMT. При RunTime Packages VMT-то си е едно - в package.
Не сме открили начин за заобикаляне на проблема.



Тема Re: Всичко работи нормално... [re: Mandor]  
Автор Eventer ()
Публикувано11.06.03 20:20



Явно е така. Обаче защо мислиш, че проблема е само при Borland? Нали управлението на DLL би трябвало да е еднакво като идеология на MS? И затова би трябвало да може Application и DLL да бъдат написани на различни езици!

Дали завиването на крушка е софтуерен проблем?



*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.