Наши преимущества

Delphi function

streamdown

Турист
Credits
0
Всем привет! У меня такой вопрос:
есть обработка ввода в Edit:
procedure TToch.xKeyPress(Sender: TObject; var Key: Char);
begin
Case Key of
'0'..'9', #8:;
'.',',':
begin
Key := DecimalSeparator;
if pos (DecimalSeparator, x.Text) <> 0
then Key := Char(0);
end;
else Key := Char(0);
end;
end;
(Таких Edit-ов у меня штук 30) Можно ли вынести эту обработку как функцию, и потом просто везде ее вызывать? Или тогда как бороться с обращением (то что подчеркнуто) на конкретный Edit?
 
Можно, только это надо сделать процедурой, а не функцией (хотя в коде стоит именно процедура :) ). А вместо конкретного Edit-а используй Sender (только его надо к Edit-у привести). Т.е. замени везде конкретный Edit на TEdit(Sender). Ну а потом вызывай свою процедуру, передавая ей в Sender нужный Edit.
Удачи.
 
Если создаешь Edit'ы динамически, то можно так:
<Имя_Edit'a>.OnKeyPress:=<Твоя_Собственная_Процедура-Обработчик>
 
Так процедура-то уже есть. Надо ее этим 30 Edit-ам назначить и все... Хоть в design-time, хоть в run-time
 
Если совсем все, то можно в RunTime так:
Код:
var 
  i, h: integer;
  q: TEdit;
...
  with TToch do begin      
    for i:=0 to ComponentCount-1 do begin
      if Components[i] is TEdit then begin
        q:=Components[i] as TEdit;
        q.OnKeyPress:=TToch.xKeyPress;
      end;
    end;
  end;
...
Не забудь X в обработчике заменить на (Sender as TEdit)!
 
Последнее редактирование модератором:
так, еще раз...извините если че не так писал ранее:
Есть функция:
Код:
function  goblin(Sender: TObject; var Key: Char): Char;
var 
  vrPos, vrLength, vrSelStart: byte;
const
  I: byte = 1;
 begin

  with Sender as TEdit do
  begin
    vrLength := Length(Text);
    vrPos := Pos(',', Text); 
    vrSelStart := SelStart; 
  end;

  case Key of

    '0'..'9':
      begin
          if (vrPos > 0) and (vrLength - vrPos > I) and (vrSelStart >= vrPos) then
          Key := #0;
      end;
    ',', '.':
      begin
          if (vrPos > 0) or (vrSelStart = 0) or (vrLength = 0) then
          Key := #0
        else
          Key := #44; 
      end;
    #8: ; 
  else
    Key := #0;
  end;
end;

Как и с какими параметрами мне ее надо вызывать для конкретного Edit-а?


Код:
procedure TToch.TKeyPress(Sender: TObject; var Key: Char);
begin
goblin([B][SIZE="3"]???????????[/SIZE][/B]);
end;
 
А зачем эту функцию в обработчике вызывать, если её можно сделать методом и тогда она сама и будет обработчиком? Она же ничего не возвращает?
То есть в классе TToch (насколько я понял, это форма) описать:
TTouch=class(TForm)
...
procedure goblin(Sender: TObject; var Key: Char);
...
end;

Затем можно хоть в инспекторе объектов, хоть в RunTime присваивать эту процедуру свойству OnKeyPress любого компонента.

Если же ты хочешь всё таки иметь отдельный обработчик для каждого TEdit'а, то вызывать её надо с параметрами goblin(Sender, Key). Но ведь получится куча лишнего кода?! И всё равно не понятно, почему она функция.

P.S. Замени типы byte на Integer. И скорость повысишь (поможешь оптимизатору и избежишь кучи преобразований типов), и от возможных ошибок убережёшься.
 
Последнее редактирование модератором:
streamdown,
тебе вроде как уже раза три тут все объяснили :) То, что ты пытаешься сделать функцией, нужно сделать процедурой, конкретный Edit ей везде передавать через Sender.
Единственное замечание. Подумай, стоит ли обрабатывать KeyPress! Вот помини мое слово, обязательно найдется умник, который тебе влепясит в Edit чего-нибудь через буфер обмена :) Я бы сделал обработку уже окончательно введенного в Edit текста. Хотя, все зависит от того, что нужно.
 
Подумай, стоит ли обрабатывать KeyPress! Вот помини мое слово, обязательно найдется умник, который тебе влепясит в Edit чего-нибудь через буфер обмена
Так можно сделать удаление в Edit.Text ненужных символов в обработчике на событие OnChange.
 
Последнее редактирование модератором:
Можно, но зачем? По мне, правильнее было бы обрабатывать все введенное один раз, непосредственно перед использованием. Разница - введен текст в 100 символов, при обработке на OnChange ты будешь проделывать обработку минимум сто раз (если он все правильно сразу ввел, а не правил много раз), а так - один.
 
N3tM4n сказал(а):
Да можно как хочешь сделать =) Это дело вкуса.
Ognev прав - эконимия проц.времени .Код хорош токо когда он оптимизирован и полностью безглючно исполняет свою функцию:)
 
Последнее редактирование модератором:
Всем привет! У меня такой вопрос:
есть обработка ввода в Edit:

(Таких Edit-ов у меня штук 30) Можно ли вынести эту обработку как функцию, и потом просто везде ее вызывать? Или тогда как бороться с обращением (то что подчеркнуто) на конкретный Edit?

обрабатывай senser
 
Верх