BitBtn w DLL

0

Witam, piszę program, w którym chciałbym umieścić formę w bibliotece DLL. Nie mam żadnego problemu z tym, gdyby nie to, że jak na tej właśnie formie umieszcze komponent BitBtn, program się zawiesza... Odbywa się to w momencie, gdy wywołuję okno, klikam np. na krzyżyk zamykając formę. Forma się zamyka, ale program się zawiesza, po czym wyskakuje Access Violation. Jeżeli zamienię BitBtn na zwyczajny Button, wszystko działa. Jak tylko dodam BitBtn na formularz, nie muszę go naweć oprogramowywać, forma stwarza ten problem.

Moje pierwsze pytanie brzmi: jak wpakować formularz do dll zawierający BitBtn, by się program nie wykrzaczał?

Następnie sprawa wygląda tak, że jak wywołuję formularz z biblioteki, w pasku zadań tworzy mi osobny przycisk dla okna głównego i osobny dla okna z dll. Jeśli wcisnę Alt + Tab, mam dwa osobne zadania, czego bym nie chciał.

Drugie i ostatnie pytanie brzmi: Jak zintegrować formularz z dll z oknem głównym programu tak, by stanowiły tylko jedno zadanie w pasku zadań?

Mnie to w sumie nie przeszkadza, ale jeżeli ktoś np. spróbuje zamknąć program, wyświetli się dialog (ta forma z dll), przejdzie w tym czasie do innego programu po czym powróci do mojego, wyświetli się tylko zablokowane okno główne już bez dialogu. Dopiero jak wybierze na pasku zadań okno dialogu - pokaże się okno dialogu. Potrzebuję zrobić tak, by nie dało się przejść do okna głównego bez wcześniejszego zamknięcia dialogu. Pisząc jak najprościej, efekt chciałbym uzyskać taki, jaki jest w przypadku, gdy zwyczajnie wywołuję formularz modalnie. Dopóki go się nie zamknie, nie można przejść do głównego okna.

Jeżeli zna ktoś sposób jak to zrobić, bardzo prosze o pomoc.

Dziękuję z góry, pozdrawiam.

0

Może pokaż kod (DLL i programu) co zmajstrowałeś to się zobaczy co jest źle.

0

ja tam obstawiam, że niepoprawnie wywołujesz formę z dlla a sam bitbtn to tylko zbieg okoliczności. Pokaż kod, którym wywołujesz formę

0

Do pytającego: coś musisz robić nie tak. Zobacz sobie źródła jakie wrzuciłem pod poniższy adres. Bez problemów mam na formatce
w dllce BitBtn, ktory działa. Poza tym pewnie nie przekazałeś do dllki uchwytu aplikacji, bo nie powinien się utworzyć w ogóle żaden
dodatkowy pasek. Co więcej, ja w innym kodzie dla testów, chcąc go specjalnie pokazać - musiałem użyć takiego kodu jak poniżej.

// ...
  public
    procedure CreateParams(var Params : TCreateParams); override;
  end;
// ...
procedure TForm1.CreateParams(var Params : TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;

Link do źródel *wygaśnie po siedmiu dniach od ostatniego pobrania): http://www.speedyshare.com/files/26854774/zabawy_z_dll_3.rar

0

olesio, nie przekazałem do dll żadnego uchwytu, ponieważ pierwszy raz umieszczałem w bibliotece formularz i nie wiedziałem... W każdym razie dziękuję za kod, bardzo mi pomoże.

misiekd, nie sądzę, żebym źle wywołał formę z dll. Sposobów raczej dużo nie ma, a ja skorzystałem z tego, jaki jest zamieszczony w kompendium.

Mój kod:

function Box(parametry): TModalResult; stdcall external 'biblioteka.dll' name 'Box';

Kod z kompendium:

procedure About; stdcall external 'FormDLL.dll' name 'ShowAboutForm';

olesio, nie rozumiem co napisałeś:

Co więcej, ja w innym kodzie dla testów, chcąc go specjalnie pokazać - musiałem użyć takiego kodu jak poniżej.

Nie wiem o co Ci chodziło w tym zdaniu naprawdę...

W każdym razie jeszcze raz przejżę to, co napisałem i postaram się naprawić wszystko. Dziękuję chłopaki za pomoc. Jeżeli jeszcze miałbym jakiś problem, napiszę.

PS: Jeżeli chodzi o TBitBtn, to ja jeszcze nie zdążyłem ich oprogramować, tylko jak wrzuciłem je na formę i skompilowałem, coś nie działało, access violation podczas zamykania wyskakiwał. Ah, jeszcze jedno, nie wiem, czy błąd nie wyskakiwał dlatego, że kompilator mi się wysypał. Dziś go reinstalowałem, żadnego programu nie chciał już kompilować...

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