[ 00000110001 @ 07.12.2010. 09:02 ] @
Pozdrav

Kako prikazati formu 2 bez da se izgubi fokus sa form 1?

opis:
- na formi 1 se nalaze razlicite komponente
- forma 2 sluzi kao virtualna tastatura, keybd_event()
- u formi 2 untura FormShow je SetWindowsPos(Handle, HWND_TOPMOST, ...)
- za simuliranje tastature na formi 2 se koriste komponente koje ne uzimaju focus (grafika), tako da na formi 2 ne postoji komponenta koja treba ili ima focus

mislim da je jasno sta mi treba :)
sa forme 1 klikom na neki button pokrenem formu 2 (tastaturu) itd. i onda unosim ili mjenjam tekst na formi 1

to za sad radi jer ja sa forme 2 saljem focus na formu 1 "TWinControl(Form1).SendFocus;" prije nego sto pozovem keybd_event()
ali problem je sto neke komponente na formi 1 nakon sto izgube focus i ponovo dobiju focus markiraju unesen tekst pa se s tim uvijek brise kompletan sadrzaj

ima li neko neku ideju kako se ovo moze rijesti?
unaprijed hvala
[ captPicard @ 07.12.2010. 10:32 ] @
Zašto koristiš formu za virtualnu tastaturu? Mislim da bi bilo lakše da staviš panel npr.
[ 00000110001 @ 07.12.2010. 12:13 ] @
formu koristim iz razloga sto je aplikacija u fullscreen-u, a polja za editovanje se nalaze na rzlicitim pozicijama,
s toga mi je i potrebno da virtualnu tastaturu mogu pomjerati, znaci ako je neko polje iza tastature samo tastaturu pomjeris malo u desno i dalje kucas
[ savkic @ 07.12.2010. 16:10 ] @
> - forma 2 sluzi kao virtualna tastatura, keybd_event()
> - u formi 2 untura FormShow je SetWindowsPos(Handle, HWND_TOPMOST, ...)

Nećeš moći da pozivaš formu sa Show (bez nekih većih izmena) jer po defaultu se prozor aktivira. Možeš npr. napraviti formu i pozvati SetWindowsPos sa SWP_NOACTIVATE flagom.
[ salaczr @ 16.12.2010. 21:16 ] @
> - ali problem je sto neke komponente na formi 1 nakon sto izgube focus i ponovo dobiju focus markiraju unesen tekst pa se s tim uvijek brise kompletan sadrzaj

> - ima li neko neku ideju kako se ovo moze rijesti?

Moguce resenje je da koristis neki Temp string prilikom slanja kontroli na Form1, tacnije nemoj slati samo karakter koji je otkucan nego ga belezi u neki Temp pa kontroli na Form1 salji ceo Temp string.

Drugo resenje, cini mi se elegantnije, je sa SendMessage pogledaj primere:

http://www.cryer.co.uk/brian/d...send_custom_window_message.htm

http://www.delphitricks.com/so..._message_with_sendmessage.html

pozdrav
[ lan-mi @ 19.12.2010. 20:30 ] @
Napravio sam jedan prost primer sa dve forme i timerom, jednostavno ali radi.

procedure TForm1.Button1Click(Sender: TObject);
begin
form2.Show;//fsStayOnTop
end;



procedure TForm2.Button1Click(Sender: TObject);
begin
form1.Edit1.Text:=form1.Edit1.Text+Inttostr(Random(9));
timer1.Enabled:=true;
end;

//Timer1.Interval:=100; Timer1.enabled:=false u Object Inspektor-u

procedure TForm2.Timer1Timer(Sender: TObject);
begin
form2.Button1.SetFocus;
timer1.Enabled:=false;
end;

end.