Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MaskEdit 
V
    Опции темы
Martisha
Дата 24.11.2008, 16:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 15.10.2008
Где: казань

Репутация: нет
Всего: 1



Всем здрасьте)
подскажите плиз одну мелочь..нужно чтобы при нажатии интер курсор переходил с одного MaskEdit на другой..
PM MAIL ICQ   Вверх
Данкинг
Дата 24.11.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



На MaskEdit1.Keydown прописать:
Код

if key=13 then MaskEdit2.Setfocus;



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Christoph
Дата 24.11.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



Цитата(Данкинг @ 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


--------------------
user posted image
PM MAIL ICQ   Вверх
Данкинг
Дата 24.11.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



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


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Christoph
Дата 24.11.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



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


--------------------
user posted image
PM MAIL ICQ   Вверх
THandle
Дата 25.11.2008, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Извиняюсь за оффтопик, но в посте 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....).


ЗЫ: надо спать...
PM   Вверх
Rrader
  Дата 25.11.2008, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



Цитата(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 


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Frees
Дата 25.11.2008, 07:46 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Цитата(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;


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


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Martisha
Дата 25.11.2008, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 15.10.2008
Где: казань

Репутация: нет
Всего: 1



всем спасибо, все получилось))  smile 

Это сообщение отредактировал(а) Martisha - 25.11.2008, 08:17
PM MAIL ICQ   Вверх
Rrader
  Дата 25.11.2008, 12:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



Цитата(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 

Это сообщение отредактировал(а) Rrader - 25.11.2008, 12:38


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
hunterman
Дата 3.12.2008, 15:15 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 3.12.2008
Где: Херсон

Репутация: нет
Всего: нет



а не проще уже в поле Tag нужную последовальность задать и по ней ходить?
PM MAIL   Вверх
Martisha
Дата 3.12.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 15.10.2008
Где: казань

Репутация: нет
Всего: 1



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

да чтото я пробовала так, не получается..
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.