No to do kursów marsz i się dokształcać. Napisałem Tobie najprościej jak się da. Stwórz na próbę wątek pod VCL (klasa TThread
), przykładów w sieci masz mnóstwo. Spóbuj w tym wątku w pętli repeat
... until
ustawiać ten Focus do skutku, aż Edit go uzyska. Po to wątek żeby program się nie blokował. A być może jakieś pojawianie się tej kontrolki do PDFów powoduje problemy z Focusem, że Edit nie może go złapać. Jeżeli się to nie powiedzie normalnie, to spróbuj to zrobić w procedurze z Synchronize
w tym wątku. Poza tym no prosze Cie, bierzesz się za kontrolki ActiveX, a nie ogarniasz wątków? To coś jest nie tak :/
EDIT: uparłeś się, że nie chce Ci się zrobić tego z Synchronize
(bo jednak pobieranie stanu focusa i jego ustawianie w wątku pobocznym powoduje problemy) pod VCL, to masz poniżej najprościej jak się dało pod WinAPI. Zawsze możesz też próbować zmieniać własność formatki ActiveControl
na swój Edit1
. Skoro ta kontrolka do PDFów powoduje kłopot z normalnym ustawieniem Focus'a dla innej kontrolki.
//...
const
WM_TAKIEPODSTAWY = WM_USER + 2014;
var
POldMainFormProc : Pointer;
function MainFormWindowProc(AHWnd : HWND; Msg : UINT; WParam : WParam; LParam : LParam) : LRESULT; stdcall;
begin
case Msg of
WM_TAKIEPODSTAWY :
begin
with Form1 do
begin
repeat
Edit1.SetFocus;
until Edit1.Focused;
end;
end;
end;
Result := CallWindowProc(POldMainFormProc, AHWnd, Msg, WParam, LParam);
end;
procedure GooglowanieOrazSamodzielnoscPlusUzywanieTBrainNieBoli(Param : Pointer); stdcall;
begin
with Form1 do
begin
SendMessage(Form1.Handle, WM_TAKIEPODSTAWY, 0, 0);
end;
end;
procedure TForm1.FormCreate(Sender : TObject);
begin
POldMainFormProc := Pointer(SetWindowLong(Self.Handle, GWL_WNDPROC, Integer(@MainFormWindowProc)));
end;
procedure TForm1.Button1Click(Sender : TObject);
var
ThreadId : Cardinal;
begin
CreateThread(nil, 0, @GooglowanieOrazSamodzielnoscPlusUzywanieTBrainNieBoli, nil, 0, ThreadId);
end;