Ramki w DLL

0

Witam Was,

mam problem dotyczący wyświetlenia ramki. Znalazłem w Internecie, że trzeba tworzyć ramki na uchwyt (CreateParented) i wygląda to mniej więcej tak:

function CreateFrame(AParentHwnd: hWnd): hWnd; stdcall;
begin
  Result := TfrmDLLFrame.CreateParented(AParentHwnd).Handle;
end;

Mam uchwyt ale nie wiem jak powołać ramkę do życia (wyświetlić ją w panelu na przykład). Co mam zrobić?

@Edit: jesli macie fajne rozwiązania to podajcie :)

0
  1. Gdzie ty tą funkcje masz w dll ?
  2. To nie tak powinno być ?
    // AParentHwnd - uchwyt komponentu np forma albo panel
    function CreateFrame(AParentHwnd: hWnd): hWnd; stdcall;
    begin
    Result := TfrmDLLFrame.Create(AParentHwnd);
    end;
0

ad 1. Tą funkcje mam zdeklarowaną w dllu wyeksportowaną, Frame jest w osobnym unicie, framework VCLa jest dodany.

Ok, jeśli już wywołam tą funkcję, to co mam zrobić z wyrzuconym Handlem?

btw kompilator zrwaca mi błąd typów, więc to jest źle

0

fakt nie zauważyłem takiej jednej ważnej rzeczy

funkcja CreateFrame ma zwracać komponent TfrmDLLFrame i gdy wywołujesz tą funkcję to w var musisz zadeklarować zmienną np MyFrame: TfrmDLLFrame;
i funkcja wygląda tak
MyFrame:=CreateFrame(Panel1);
i jak chcesz zwolnic pamięć to dajesz MyFrame.Free; itd.

function CreateFrame(AParentHwnd: hWnd): TfrmDLLFrame; stdcall;
begin
  Result := TfrmDLLFrame.Create(AParentHwnd);
end;

nie wiem czy o to ci chodziło najlepiej jak dasz źródło tego projektu (spakowane w RAR)

0

dodaję kod źródłowy (prosty, bo testuję mechanizm).

@Edit: swoja drogą sprawdzam czujką hParent, nie jest pusty a zwraca że nie ma handle :( (tamten sposób z handle [pierwszy] był kijowy bo i to samo zwracało + AV)

0

poszukaj po WinApi np MoveWindow.
Ps do dll musisz przekazac Application.Handle.

lub w dll

TForm.CreaateParented(Handle);

lub

with TForm.Create do
begin
ParentWindow := Handle;
...
end;

Obejrzalem Twoj kod.
Nie rob czegos takiego.

  1. Tworzysz interface w dll np IFrameInterface (dodajesz swoje wlasciwosci zobacz TDataModule)
  2. tworzysz funkcje export w dll ktorej rezultatem jest IFrameInterface a nie obiekt TFrame
  3. dll musi zwalniac utworzone obiekty musisz miec metode export ktora zamknie konkretny TFrame

1 użytkowników online, w tym zalogowanych: 0, gości: 1