[ inherited @ 08.09.2006. 13:48 ] @
Imam dve TEdit komponente. Na osnovu:
Code:

...
 if (Key=VK_RETURN) then Edit2.SetFocus;//OnKeyDown za TEdit1
...

postavlja se fokus na TEdit2. Kako bih odradio suprotno, znaci, kad na osnovu navedenog koda predjem na drugi TEdit, da se isto pritiskom tastera vratim na prethodni TEdit, ukoliko zelim nesto promeniti? Npr. pritiskom SHIFT+ENTER?

Hvala unapred.
[ savkic @ 08.09.2006. 15:33 ] @
> postavlja se fokus na TEdit2. Kako bih odradio suprotno, znaci, kad na osnovu navedenog koda predjem na drugi TEdit, da se isto
> pritiskom tastera vratim na prethodni TEdit, ukoliko zelim nesto promeniti? Npr. pritiskom SHIFT+ENTER?

Code:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_RETURN then
    if ssShift in Shift then
      Edit1.SetFocus
    else
      Edit2.SetFocus;
end;


Ali ja bih tebi preporučio ovakav pristup:
Code:

  case Key of
    VK_RETURN, VK_DOWN: SelectNext(ActiveControl, True, True);
    VK_UP: SelectNext(ActiveControl, False, True);
  end;


što će ti doneti nesmetano kretanje po kontrolama na formi u oba smera.
[ inherited @ 09.09.2006. 12:25 ] @
savkic, za sad, bi to bilo to.
Hvala.
[ inherited @ 10.01.2007. 16:55 ] @
Code:

  case Key of
    VK_RETURN, VK_DOWN: SelectNext(ActiveControl, True, True);
    VK_UP: SelectNext(ActiveControl, False, True);
  end;

Probao sam ovo ispisati kao proceduru:
Code:

procedure TForm1.FokusKontrola;
var 
  Key: Word;
begin
  case Key of
    VK_RETURN, VK_DOWN: SelectNext(ActiveControl, True, True);
    VK_UP: SelectNext(ActiveControl, False, True);
  end;
end;

da ne bi za svaki edit ponavljao se kod nego samo, OnKeyDown:
Code:

...
 if Key = VK_RETURN then
  FokusKontrola;
...

Medjutim, to tako ne moze. Da li je neko resio ovaj problem, i kako?
Hteo bih samo za TEdit -e, ponavljati proceduru, a ne ceo kod.
[ savkic @ 10.01.2007. 17:42 ] @
> Medjutim, to tako ne moze. Da li je neko resio ovaj problem, i kako?
> Hteo bih samo za TEdit -e, ponavljati proceduru, a ne ceo kod.

Naravno da ne može :) Key nije magična kompajler promenljiva koja dobija virtuelni kod pritisnutog tastara, kako si napisao metodu FokusKontrola, Key ima nedefinisanu vrednost. Redeklariši FokusKontrola metodu tako da prima jedan parametar AKey ili Key, i pri pozivu prosledi vrednost virtuelnog tastera.
Međutim, ne vidim da ova redirekcija donosi neko poboljšanje ili olakšanje u odnosu na zadržavanje logike u event handleru, napravi jedan event handler i svim edit kontrolama dodeli taj isti. Ili napravi naslednika Edit kontrole koji će imati taj kod inkorporiran u sebi.
[ inherited @ 10.01.2007. 18:53 ] @
Citat:
napravi jedan event handler i svim edit kontrolama dodeli taj isti. Ili napravi naslednika Edit kontrole koji će imati taj kod inkorporiran u sebi.

Ovo mi delije ono pravo.
[ inherited @ 10.01.2007. 19:10 ] @
Imam ovako primer:
Code:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Sender = Button1 then
   ShowMessage('Button1 clicked!')
  else
   ShowMessage('??? clicked!') ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   Button1Click(Button2) ;
   {this will result in: '??? clicked!'}
end;

Kako bih to odradio za TEdit i ovaj moj slucaj?
[ savkic @ 10.01.2007. 19:23 ] @
> Kako bih to odradio za TEdit i ovaj moj slucaj?

U Object inspectoru, na Events jezičku iz padajuće liste za OnKeyDown handler izaberi već postojeći handler.
Uzgred, toplo ti preporučujem nabavku neke Delphi knjige.
[ inherited @ 10.01.2007. 20:27 ] @
savkic
Hvala, ukapirao sam i pre tvog poslednjeg odgovora, samo sam vecerao, tusirao se i nisam stigao javiti, tj. preduhitrio si me.

Da, citam Delphi 4 za 21 dan, tacnije upoznajem se sa delphijem. Znam da je Vama iskusnijim programerima ovo sad smesno, ali, setite se svi ste poceli od nule.

Hvala jos jednom.
[ alxsabo @ 10.01.2007. 22:54 ] @
Citat:
citam Delphi 4 za 21 dan,


U toj knjizi ces naci jedno jako elegantno resenje (mada je i gore navedeno resenje zadovoljavajuce):


Code:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Char(VK_RETURN) then begin
    Key := #0;  //Ovo sluzi da se ne cuje iritirajuci zvuk
    PostMessage(Handle,WM_NEXTDLGCTL,0,0);
  end;
end;



Detaljnija objasnjenja potrazi u helpu vezano za poruku WM_NEXTDLGCTL.
Mozes se sa njom kretati i napred i nazad, a takodje i selektovati odredjenu komponentu.
[ savkic @ 11.01.2007. 00:52 ] @
> U toj knjizi ces naci jedno jako elegantno resenje (mada je i gore navedeno resenje zadovoljavajuce):
> PostMessage(Handle,WM_NEXTDLGCTL,0,0);

WM_NEXTDLGCTL ako se koristi za prelazak na prethodnu ili narednu kontrolu u VCLu svodi na SelectNext. Ako se cilja određena kontrola onda se svodi na SetFocus API funkciju. Deluje mi da je efikasnije i pre svega jasnije koristiti SelectNext ili Control.SetFocus.