Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > MaskEdit


Автор: Martisha 24.11.2008, 16:29
Всем здрасьте)
подскажите плиз одну мелочь..нужно чтобы при нажатии интер курсор переходил с одного MaskEdit на другой..

Автор: Данкинг 24.11.2008, 16:42
На MaskEdit1.Keydown прописать:
Код

if key=13 then MaskEdit2.Setfocus;

Автор: Christoph 24.11.2008, 17:52
Цитата(Данкинг @ 24.11.2008,  16:42)
На MaskEdit1.Keydown прописать:
Код

if key=13 then MaskEdit2.Setfocus;

А если маск едитов больше?....
Например есть 4 маск едита...создаем для них общее событие KeyPress

Код

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
const
  ClassName = 'MaskEdit';
var
  N, Code: Integer;
  S: String;
begin
  if Key = Chr(VK_RETURN) then
  begin
    S := TComponent(Sender).Name;
    S := Copy(S, Length(ClassName) + 1, Length(S) - Length(ClassName));
    Val(S, N, Code);
    if N = 4 then
      N := 0;
    S[Length(S)] := Chr(N + 49);
    (FindComponent('MaskEdit' + S[Length(S)]) as TWinControl).SetFocus;
  end;
end;


З.Ы спасибо Славику smile

Автор: Данкинг 24.11.2008, 18:02
Christoph, это раздел для новичков! smile Твой пример и я-то с трудом понял. smile Хотя, он, конечно, более грамотный.

Автор: Christoph 24.11.2008, 18:28
Тут Слава потрудился)) есть еще второй вариант..если я не выложу то вылажит Славка)  Если раздел для новичка так что нельзя выложить закрученный код?  smile 

Автор: THandle 25.11.2008, 02:01
Извиняюсь за оффтопик, но в посте Christoph'а имеется, для большинства форумчан, непонятка, а именно:

Цитата(Christoph @  24.11.2008,  17:52 Найти цитируемый пост)
Славику

Цитата(Christoph @  24.11.2008,  18:28 Найти цитируемый пост)
Слава

Цитата(Christoph @  24.11.2008,  18:28 Найти цитируемый пост)
Славка


Думаю, имеется ввиду товарищ Rrader.  smile 


Кстати, насчет примерчика:

1) Зачем нужна вот эта махинация?

Код

    S := Copy(S, Length(ClassName) + 1, Length(S) - Length(ClassName));


Почему бы эту строку просто не удалить, а следующую не заменить на:

Код

Val(S[Length(S)], N, Code);


???

Ведь все равно, что при копировании последнего символа, что при обращении к нему, если в нем будет не цифра на Val все равно не будет
ошибки, ведь Code туда передается... Кстати не плохо бы тут проверку не было ли ошибки, то есть проверку переменной Code.


2) Зачем вводили константу когда не везде где можно она используется? smile 
Я про это:

Код

const
  ClassName = 'MaskEdit';

    (FindComponent('MaskEdit' + S[Length(S)]) as TWinControl).SetFocus;



В итоге я бы этот пример переделал бы в вид:

Код

procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
var
  N, Code: Integer;
  S: String;
begin
  if Key = Chr(VK_RETURN) then
  begin
    S := TComponent(Sender).Name;
    Val(S[Length(S)], N, Code);
    if N = 4 then
      N := 0;
    S[Length(S)] := Chr(N + 49);
    (FindComponent('MaskEdit' + S[Length(S)]) as TWinControl).SetFocus;
  end;
end;



Но этот пример плох тем что он сделан для ограниченного количества MaskEdit'ов и только для MaskEdit'ов названых стандартно(MaskEdit1, MaskEdit2....).


ЗЫ: надо спать...

Автор: Rrader 25.11.2008, 06:02
Цитата(THandle @  25.11.2008,  08:01 Найти цитируемый пост)
Почему бы эту строку просто не удалить, а следующую не заменить на:

Не будет работать на MaskEdit10, 11, 12, ...

Цитата(THandle @  25.11.2008,  08:01 Найти цитируемый пост)
Кстати не плохо бы тут проверку не было ли ошибки, то есть проверку переменной Code.

Лучше вставить проверку на имя класса - так проще и надежнее.

Цитата(THandle @  25.11.2008,  08:01 Найти цитируемый пост)
2) Зачем вводили константу когда не везде где можно она используется?

О да, надо было исправить smile 

Итого:
Код

procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
const
  ClassName = 'MaskEdit';
var
  N, Code: Integer;
  S: String;
begin
  if Key = Chr(VK_RETURN) then
  begin
    S := TComponent(Sender).Name;
    if Sender.ClassName = 'T' + ClassName then
    begin
      S := Copy(S, Length(ClassName) + 1, Length(S) - Length(ClassName));
      Val(S, N, Code);
      if N = 4 then
        N := 0;
      S[Length(S)] := Chr(N + 49);
      (FindComponent(ClassName + S[Length(S)]) as TWinControl).SetFocus;
    end;
  end;
end;

Но опять же для только стандартно названных.

Проще каждому задать свойство Tag, где установить порядок, а код поменять на:
Код

procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
var
  I, N: Integer;
begin
  if Key = Chr(VK_RETURN) then
  begin
    N := TControl(Sender).Tag;
    if N = 4 then N := 0;
    for I := 0 to ControlCount - 1 do
      if (Controls[I] is TMaskEdit) and
        (Controls[I].Tag = N + 1) then
           TWinControl(Controls[I]).SetFocus;
  end;
end;


Добавлено через 1 минуту и 3 секунды
Christoph, больше так не делай! smile 

Автор: Frees 25.11.2008, 07:46
Цитата(Rrader @  25.11.2008,  08:02 Найти цитируемый пост)
Проще каждому задать свойство Tag, где установить порядок, а код поменять на:

для этого TabOrder есть

Добавлено через 3 минуты и 8 секунд
и функция  FindNextControl

вот код
Код

procedure TForm1.MaskEditKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Chr(VK_RETURN) then
   ActiveControl := FindNextControl(TWinControl(Sender),true,true,true)
end;


зы проще надо быть)))

Автор: Martisha 25.11.2008, 08:17
всем спасибо, все получилось))  smile 

Автор: Rrader 25.11.2008, 12:37
Цитата(Frees @  25.11.2008,  13:46 Найти цитируемый пост)
зы проще надо быть)))

Ну все относительно: smile Привожу обоснование:

Код

procedure TForm1.MaskEditKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Chr(VK_RETURN) then
   ActiveControl := FindNextControl(TWinControl(Sender),true,true,true)
end;


1) TabOrder - не всегда отражает нужную последовательность (например, если после каждого MaskEdit есть кнопка). Частный случай, т.е.
2) На форме может быть много компонент - код пойдет дальше выделять - где проверки? 
3) Самое главное - мой вариант быстрее (функция FindNextControl очень медленная), и проверки все необходимые есть, и круговое переключение. smile 

Ради спортивного интереса сделал замер через GetThreadTimes. Условия были одинаковыми, Ваш код исполнялся 31,359 секунд, мой - 3,42 секунды. И это без учета проверок в Вашем коде smile 

Автор: hunterman 3.12.2008, 15:15
а не проще уже в поле Tag нужную последовальность задать и по ней ходить?

Автор: Martisha 3.12.2008, 15:42
Цитата(hunterman @  3.12.2008,  15:15 Найти цитируемый пост)
а не проще уже в поле Tag нужную последовальность задать и по ней ходить? 

да чтото я пробовала так, не получается..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)