Ramki w DLL

Japer
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 11 lat
  • Postów:47
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:

Kopiuj
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 :)


Znajdź mnie na Wykopie! Nie jestem niczyim murzynem, żeby robić za Ciebie program. Nawet nie próbuj pisać na PW! :D
edytowany 1x, ostatnio: Japer
PR
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:304
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;

CodeGear Delphi 2007 | Windows 7 |
Jak to dobrze że istnieje opcja edytuj post ;]
Japer
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 11 lat
  • Postów:47
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


Znajdź mnie na Wykopie! Nie jestem niczyim murzynem, żeby robić za Ciebie program. Nawet nie próbuj pisać na PW! :D
edytowany 1x, ostatnio: Japer
PR
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:304
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.

Kopiuj
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)


CodeGear Delphi 2007 | Windows 7 |
Jak to dobrze że istnieje opcja edytuj post ;]
Japer
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 11 lat
  • Postów:47
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)


Znajdź mnie na Wykopie! Nie jestem niczyim murzynem, żeby robić za Ciebie program. Nawet nie próbuj pisać na PW! :D
edytowany 1x, ostatnio: Japer
crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
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

Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
edytowany 1x, ostatnio: crowa

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.