[ johnnie @ 31.05.2005. 00:42 ] @
Mozda nisam bio dovoljno jasan, ali nemam bas neku dobru ideju, malo sam se zakucao...
Elem, imam recimo oko 80 maskedita i edita na jednoj formi, imaju redosled, tab order itd. Sad je stvar sledeca: treba mi da se kroz njih krecem i sa enterom (kao da je DOS aplikacija) a ne samo sa tabom. Znam da je lako napisati za svaku posebno OnKeyPress event (npr. if key=#13 then ...) ali ima mnogo, mnogo da se pise. Zna li neko neki laksi nacin?
Ukljucio sam na formi Keypreview i to radi, tj. reaguje na enter. Samo mi treba prelazak sa TMaskedit ili TEdit-a na sledeci koji je po tab orderu (Tmaskedit ili tedit, nema pravila, bitno je znaci da sledeci preuzme fokus ) i da to bude ponasanje na toj formi, nezavisno od broja komponenti (jer neke mogu biti visible :=false, a tad nemaju ni tab order).
Mozda ja ne vidim dovoljno elegentno resenje, a bas sam u guzvi, zato pls. help!

[ Chawa @ 31.05.2005. 07:15 ] @
Nisam bas siguran koliko će pomoći, ali pogledaj šta se može izvući odavde:

http://delphi.about.com/od/vclusing/l/aa012699.htm
i
http://delphi.about.com/od/adptips2005/a/bltip0305_2.htm


Pozdrav
[ slavica2000 @ 31.05.2005. 07:42 ] @
Sva sam polja selektovala i poslala na jedan dogadjaj a TabOrder ga sam salje na sledeci. Ja sam kasnije imala problem kad sam htela da uvedem i strelice za gore dole ...ali to je druga prica.
procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
If Key = #13 then
begin
Key := #0;
perform (Cm_DialogKey, VK_TAB, 0);
end;
end;
[ sasas @ 31.05.2005. 08:08 ] @
ili recimo da sa uključenim KeyPreviewm u KeyDown forme postaviš:

Code:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key in [VK_RETURN , VK_DOWN, VK_UP] then
    self.SelectNext(self.ActiveControl, key <> VK_UP, true);
end;


Ovo radi kretanje napred sa enterom, i kretanje napred-nazad strelicama (gore-dole). Radi i za sve kontrole što može biti problem kod listboxa ili richedita, kod kojih strelice imaju funkciju, ali to se naravno da popraviti po potrebi.

ss.
[ dogriz @ 31.05.2005. 08:14 ] @
Citat:
slavica2000: Sva sam polja selektovala i poslala na jedan dogadjaj a TabOrder ga sam salje na sledeci. Ja sam kasnije imala problem kad sam htela da uvedem i strelice za gore dole ...ali to je druga prica.
procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
If Key = #13 then
begin
Key := #0;
perform (Cm_DialogKey, VK_TAB, 0);
end;
end;



Lepo rešenje, jedino mislim da je Key:=#0; višak. Sve radi i bez toga.
[ obucina @ 31.05.2005. 12:35 ] @
Ne treba koristiti Enter kao TAB. To je ostatak nekih starih vremena.
Enter, po novoj filozofiji UI, ima funkciju pritiskanja Default dugmeta.
[ sasas @ 31.05.2005. 12:49 ] @
Definitivno se slažem s tim.

ss.
[ johnnie @ 31.05.2005. 12:52 ] @
Hvala, videcu pa cu da javim...
Inace potpuno se slazem sa filozofijom za tab, ali musterija je uvek u pravu...
Hvala svima, puno...
[ obucina @ 03.06.2005. 20:58 ] @
To nije pobednicki stav :)
Musterija je u pravu samo ako je procitao/la dokumente tipa "Application Specification for Microsoft Windows 2000 for Desktop Applications", "The Microsoft Windows Keyboard Guide". ""Designed for Windows" Logo Testing", knjigu "Designing User Interface" i slicno...
[ morlic @ 03.06.2005. 22:32 ] @
A firma koja bude terala inat sa musterijama ce pisati knjigu "Empty pockets - how to" :)
[ johnnie @ 04.06.2005. 16:48 ] @
Ako musterije budu citale sve te knjige, sta cemo mi da radimo? Neka, bolje ovako, nek je musterija u pravu, za svoje pare ima pravo...Meni moze da se svidi to ili ne, ako dodje do toga da nije u pravu a nece da poslusa, nek trazi drugog ko ce da radi...Ovo je samo trivijalna zelja, zbog navika stecenih na starom softveru. Tab i dalje radi normalno, pa kad shvate TAB nece dirati ENTER, zar ne?
[ milance_kg @ 05.06.2005. 18:14 ] @
Kod mene ovo sasvim dobro funkcionise
SASAS:
Code:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key in [VK_RETURN , VK_DOWN, VK_UP] then
    self.SelectNext(self.ActiveControl, key <> VK_UP, true);
end;


a polja koja ne zelim da fokusiram
( DBGrid npr.)
jednostavno u Object Inspector-u
podesim
TabStop := false;
[ milance_kg @ 06.06.2005. 14:06 ] @
Ako zelimo da fokusirano polje promeni boju
Code:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
   Shift: TShiftState);
begin
   if key in [VK_RETURN, VK_DOWN, VK_UP] then
      self.SelectNext(self.ActiveControl, key <> VK_UP, true);
   begin
      if Edit1.Focused = true then
         Edit1.Color := clAqua
      else Edit1.Color := clWindow;
   end;
end;


[ ivanho @ 17.06.2005. 18:10 ] @
Citat:
slavica2000: Sva sam polja selektovala i poslala na jedan dogadjaj a TabOrder ga sam salje na sledeci. Ja sam kasnije imala problem kad sam htela da uvedem i strelice za gore dole ...ali to je druga prica.


i ja imam problem sa strelicama.... zna li neko kako je to moguce resiti...
(problem je sto strelice ne reaguje na KeyPreview)
[ obucina @ 18.06.2005. 15:00 ] @
Strelice ne sluze za to za sto bi ti i slavica2000 da ih koristite.
Inace, strelice mozes da citas u OnKeyDown i OnKeyUp.

[ ivanho @ 18.06.2005. 17:00 ] @
Citat:
obucina: Strelice ne sluze za to za sto bi ti i slavica2000 da ih koristite.
Inace, strelice mozes da citas u OnKeyDown i OnKeyUp.


Strelice reaguju OnKeyDown i OnKeyUp, ali ne reaguju na keyPreview. Drugim recima ukoliko je fokus, na primer, na Tbutton komponenti (kojih na formi ima vise), i ukoliko stavim u OnKeyDown da mi donja strelica reaguje kao tab.... fokus se nece nikad postaviti na komp koja tedit komponentu, vec ce se "vrteti" kroz tbutton komponete.

Citat:
Delphi help:
Navigation keys (Tab, BackTab, the arrow keys, and so on) are unaffected by KeyPreview because they do not generate keyboard events.


Druga stvar.... ko kaze cemu strelice sluze? ( i da li njemu treba verovati?)
[ obucina @ 19.06.2005. 12:41 ] @
Citat:
ivanho: Druga stvar.... ko kaze cemu strelice sluze? ( i da li njemu treba verovati?)


Kaze onaj ko je napravio operativni sistem i mislim da mu treba verovati, posto je razvio filozofiju upotrebe svog sistema i napisao tomove o tome, kao i standarde kojih programeri treba da se pridrzavaju. Sve to ima na njihovoj stranici i u MSDN-u.
[ ivanho @ 19.06.2005. 13:52 ] @
Citat:
obucina: Kaze onaj ko je napravio operativni sistem i mislim da mu treba verovati, posto je razvio filozofiju upotrebe svog sistema i napisao tomove o tome, kao i standarde kojih programeri treba da se pridrzavaju. Sve to ima na njihovoj stranici i u MSDN-u.



Taj koji je napravio operativni sistem mi uzima pare, musterija mi daje....
hmmmm kome da verujem i cije zahteve da ispunjavam?
uz sve to ni njihovi programeri se ne pridrzavaju tih standarda, pa sto bi ja nameto svojim musterijama iste, ukoliko ih oni ne zele




Resenje:

Code:

Application.OnMessage:=AppMessage;


procedure TForm1.AppMessage(var Msg: tagMSG; var Handled: Boolean);
var

  conActCont: TWinControl;
  frmActForm : TCustomForm;
  KeyState : TKeyboardState;

begin
if (Msg.message=WM_KEYDOWN) and ((Msg.wParam=VK_DOWN) or (Msg.wParam=VK_UP)) then
  begin
    GetKeyboardState(KeyState);
    if (Screen.ActiveControl <> nil) and (not (KeyboardStateToShiftState(KeyState) = [])) then
      begin
       conActCont:=Screen.ActiveControl
       case Msg.wParam of
         VK_DOWN:
             Msg.wParam := VK_TAB; 
         VK_UP:                           
           begin                          
             Msg.wParam := 0;            
             frmActForm := GetParentForm(conActCont);
             if frmActForm <> nil then    
               frmActForm.Perform(WM_NEXTDLGCTL, 1, 0);
             Handled := true;
           end;
       end;     
      end;
  end;
end;
[ milex @ 19.06.2005. 19:50 ] @
Postoji vrlo jednostvno rešenje. Instaliraj JEDI i samo postaviš komponentu JvsEnterAsTab i rešio si problem za ceo život.