cursor position

i have a mask edit with the following input; 999/999/999/999 ; what i want to be able to do is that when the user presses the right or left arrow key i would like the cursor pointer to move to the next part of the maskedit, like this

user enters 1  /   /   /
then after he presses the right arrow key , supposing H is the cursor

1H /   /   /

 instead  i want the cursor to go

1   / H   /   /
then if they press left again
1   /    /H   /    and if they do it backwards i would like to the cursor to come to the previous part so
1   /   /   /H  user presses left arrow 1  /  /H   / and so on
how would this be possible? I was thinking maybe the right and left arrow keys have a control character and when they are pressed i could tell the cursor to move differently;  Hope the question was clear enough.

thanks in advance
itektasAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

kretzschmarCommented:
maybe something like this

procedure TForm1.MaskEdit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = vk_right then
    case MaskEdit1.SelStart of
      0..2 : MaskEdit1.SelStart := 4;
      4..6 : MaskEdit1.SelStart := 8;
      8..14: MaskEdit1.SelStart := 12;
    end;

  if key = vk_left then
    case MaskEdit1.SelStart of
      12..14 : MaskEdit1.SelStart := 8;
      8..10 : MaskEdit1.SelStart := 4;
      0..6: MaskEdit1.SelStart := 0;
    end;
  MaskEdit1.selLength := 1;
  key := 0;

end;

not tested on all cases


meikl ;-)
0
itektasAuthor Commented:
i get undeclared identifier vk_right & vk_left?
0
kretzschmarCommented:
>i get undeclared identifier vk_right & vk_left?
ensure that windows-unit is included in the uses clause
0
OWASP: Avoiding Hacker Tricks

Learn to build secure applications from the mindset of the hacker and avoid being exploited.

itektasAuthor Commented:
tried to put "windows-unit" and "windows" in the uses part, but i get
[Fatal Error] Unit1.pas(7): File not found: 'Windows.dcu'
what could be wrong?
0
kretzschmarCommented:
what delphi version do u use?
0
itektasAuthor Commented:
delphi 7 ; but kylix ( linux)
0
kretzschmarCommented:
pu, kylix, must recherche
0
itektasAuthor Commented:
pardon? i didnt understand  =)
0
kretzschmarCommented:
well, ok,

the keycodes are declared in the unit qt (should be added into the uses-clause),

the constants are

Key_Left
Key_Right

so you have to replace in my sample above

procedure TForm1.MaskEdit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = key_right then
    case MaskEdit1.SelStart of
      0..2 : MaskEdit1.SelStart := 4;
      4..6 : MaskEdit1.SelStart := 8;
      8..15: MaskEdit1.SelStart := 12;  //i replaced here also 14 with 15
    end;

  if key = key_left then
    case MaskEdit1.SelStart of
      12..15 : MaskEdit1.SelStart := 8; //i replaced here also 14 with 15
      8..10 : MaskEdit1.SelStart := 4;
      0..6: MaskEdit1.SelStart := 0;
    end;
  MaskEdit1.selLength := 1;
  key := 0;

end;

hope it works now under linux

meikl ;-)
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
itektasAuthor Commented:
works perfect!  thanks mate!  Just one last question tho, the only part in this code i dont quiet understand is the last bit,  MaskEdit1.selLength := 1;
  key := 0;

what is that for?
0
kretzschmarCommented:
>MaskEdit1.selLength := 1;
marks the digit you jump to as selected
>key := 0;
ensures that the key is not processed further

but maybe you can left it out
for kylix/linux

(have no linux -> can't test it there)

glad you like it

meikl ;-)
0
itektasAuthor Commented:
ok cool, it works better when i leave it =)
0
itektasAuthor Commented:
just a detail that i have just noticed now actually, normally in an editmask when the user enters letters nothing happens, but now when the user enters letters it appears as a space, could i add a line to change that? so that it ignores it like it does it in a normal editmask?
0
kretzschmarCommented:
well, not looked in yet,
but you could use the onKeypressEvenet like

if key = #32 then key := #0;

looking tomorrow, if this happens also by me (at windows)

meikl ;-)
0
itektasAuthor Commented:
yeah i have tried something similar to that actually using the onkeypress what i had done was

procedure Tform1.MaskEdit1Keypress( Sender: TObject; var Key: char);

begin

if not (Key in ['0','1','2','3','4','5','6','7','8','9'', #8]) then

begin

Key := #0;

end;
end;

the one you said is pretty similar but didnt work either, its weird because normally editmasks never let the letters do anything, and adding this code didnt seem to solve it :/
0
itektasAuthor Commented:
leaving out  the    key := 0;  line from the original code seems to do the job!
0
itektasAuthor Commented:
actually no! that doesnt seem to solve it, i hate it when i think i solved a problem then i come across a new one! :( When i remove that line the cursor positions get mixed up, so they start in the middle of the next part instead of the beginning. I'll look again tommorow
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.