Aktywacja formy przez dll

0

Cześć,

długo się wzbraniałem przed napisaniem tak prostego pytania ale powiem szczerze - zaczynam się poddawać.

Mam program (napisałem go z 10 lat temu) który jest aplikacja POS (kasa komputerowa na ekranie dotykowym). Teraz dołożyłem do niego obsługę terminala płatniczego.
Na formie głównej można sprzedawać artykuły, gdy chcemy podsumować transakcję przechodzimy na nową formę (nazwijmy ją "razem") poprzez proste:

razem.Show;

Na tej formie mamy możliwość wybrania sposobu płatności, udzielenia rabatów zwykłych i jakiś specjalnych (okolicznościowych), oraz najważniejsze, ustalenia sposobu płatności za paragon: karta, talony, gotówka.
Ta forma pojawia się oczywiście z fokusem (załatwia to funkcja Show).
Gdy klient chce zapłacić kartą, kasjer klika na przycisk "Karta" i otwiera się nowa forma na której widać komunikaty z biblioteki dll od terminala. Ta forma także jest z fokusem bo otwierana jest za pomocą instrukcji Show.
Biblioteka terminala podaje komunikaty o swoim statusie poprzez callbacki. Jeśli w callbacku jedna ze zmiennych równa się 0 to oznacza że transakcja się udała (na prawdę jest to ciut bardziej obwarunkowane ale na potrzeby przykładu niech tak zostanie).
Do tego momentu wszystko proste.

No i teraz tak, na formie "razem" jest przycisk "Zakończ" który kończy transakcję (drukuje ją na drukarce fiskalnej oraz uzupełnia dane w tabelach). Po czym zamyka formę "razem" poprzez

razem.Close;

i pokazuje formę główną - nazwijmy ją "sprzedaz" poprzez

sprzedaz.Show;

Po naciśnięciu tego przycisku dzieje się to co napisałem i forma "sprzedaz" pojawia się z fokusem na pole do wpisania kodu kreskowego (załatwia to zdarzenie onShow tej formy), oczywiście forma jest aktywna!

A teraz najlepsze, jak callback z dll-ki odpowie że transakcja jest zaakceptowana to po prostu klika na przycisk "zakończ" na formie razem poprzez proste

razem.btnzakoncz.Click;

i już. Wszystko się wykonuje prawidłowo, paragon się drukuje, dane w tabelach są zapisywane, formy ukrywają się i pojawia się forma "sprzedaż" ale bez aktywności!

Jest to problem bo kasjer najczęściej używa skanera kodów kreskowych a bez aktywnej formy dane nigdzie nie są przekazywane? Rozwiązanie to kliknięcie na formę ale oni o tym non stop zapominają - i dobrze bo to ja zawalam sprawę.

Powiedzcie mi - co z tym zrobić?

Jakiekolwiek sugestie będą mile widziane :)

Acha, program napisany w Delphi 6 lata temu jak już wspomniałem - ledwie źródła znalazłem :).

Pozdrawiam
Robert

0

Napisz konkretnie w czym jest problem, bo z tego co napisałeś to nie wynika (albo ja nie rozumiem co jest grane); Która instrukcja sprawia problem? Twoja, czy z DLL?

0

mam button, w nim troszkę kodu. Po jego naciśnięciu zamyka swoją formę oraz pokazuje inną formę. Ta forma staje się aktywna i ma fokus na pole edit - wszystko działa.

mam dll-ke, w wyniku danych jakie ona podaje (w callbacku) "naciska" ona na mojego buttona, efekt jak powyżej poza tym że ostatnia forma nie jest aktywna?

0

Czyli ten sam kod w tym samym przycisku raz działa i aktywuje inny formularz, a raz nie?

0

dokładnie jest tak jak piszesz. Już myślałem że callback coś jeszcze wyświetla na koniec w jakimś oknie którego nie widzę i dlatego tracę fokus ale puściłem program krok po kroku i nic kompletnie nie widać.
Oczywiście kombinowałem dość mocno zanim napisałem ten post, co robiłem: próbowałem wyświetlić okno w trybie modalnym, używając funkcji ShowWindow, próbowałem na koniec zrobić focus na jakiś element na formie jak również na nią samą, nawet zrobiłem buttona w którym dałem setfocus na edita i moja dll-ka miała go "kliknąć" na koniec. Nic to nie pomogło (no zdarzyło się z raz czy dwa że okno było aktywne - ale nie mam na to wytłumaczenia).

1

Nie mogę jasno stwierdzić czy jest to błąd VCL czy Twojego kodu; Możesz spróbować poprawić VCL na dwa sposoby;

1. Ukryć formularz potomny

Najpierw ukryj formularz potomy za pomocą metody Hide, następnie pokaż formularz-rodzic (nadrzędny) za pomocą Show, na koniec zamknij okno potomne standardową metodą Close:

ChildForm.Hide();
ParentForm.Show();
ChildForm.Close();

2. Skorzystać z Win32 API

Jeżeli powyższy sposób nie zadziała (nie testowałem, bo nie mam Delphi6), możesz spróbować wymusić aktywację formularza za pomocą funkcji SetActiveWindow; W razie czego możesz najpierw wymusić podbicie okna-rodzica na wierzch, za pomocą metody BringToFront lub funkcji SetForegroundWindow, o ile formularz w tym momencie jest widoczny; Aby móc skorzystać z funkcji WinAPI, musisz im przekazać uchwyt okna - pobiera się go za pomocą właściwości Handle obiektu formularza.

0

już jestem poza stanowiskiem developerskim ale jutro sprawdzę. Mam dużą nadzieję na sposób z WinAPI. To kurcze musi zadziałać. Dam znać.

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