Delphi function

streamdown

Местный
Регистрация
28 Фев 2005
Сообщения
234
Реакции
59
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?
 

Ognev

ex-Team DUMPz
Местный
Регистрация
20 Авг 2004
Сообщения
2,079
Реакции
908
Credits
0
Можно, только это надо сделать процедурой, а не функцией (хотя в коде стоит именно процедура :) ). А вместо конкретного Edit-а используй Sender (только его надо к Edit-у привести). Т.е. замени везде конкретный Edit на TEdit(Sender). Ну а потом вызывай свою процедуру, передавая ей в Sender нужный Edit.
Удачи.
 

N3tM4n

Турист
Регистрация
10 Окт 2005
Сообщения
11
Реакции
1
Credits
20
Если создаешь Edit'ы динамически, то можно так:
<Имя_Edit'a>.OnKeyPress:=<Твоя_Собственная_Процедура-Обработчик>
 

Hans_Cristian

Турист
Регистрация
9 Авг 2004
Сообщения
20
Реакции
1
Credits
28
Так процедура-то уже есть. Надо ее этим 30 Edit-ам назначить и все... Хоть в design-time, хоть в run-time
 

ploki

Местный
Регистрация
16 Май 2005
Сообщения
237
Реакции
180
Credits
0
Если совсем все, то можно в 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)!
 
Последнее редактирование модератором:

streamdown

Местный
Регистрация
28 Фев 2005
Сообщения
234
Реакции
59
Credits
0
так, еще раз...извините если че не так писал ранее:
Есть функция:
Код:
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;
 

ploki

Местный
Регистрация
16 Май 2005
Сообщения
237
Реакции
180
Credits
0
А зачем эту функцию в обработчике вызывать, если её можно сделать методом и тогда она сама и будет обработчиком? Она же ничего не возвращает?
То есть в классе TToch (насколько я понял, это форма) описать:
TTouch=class(TForm)
...
procedure goblin(Sender: TObject; var Key: Char);
...
end;

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

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

P.S. Замени типы byte на Integer. И скорость повысишь (поможешь оптимизатору и избежишь кучи преобразований типов), и от возможных ошибок убережёшься.
 
Последнее редактирование модератором:

Ognev

ex-Team DUMPz
Местный
Регистрация
20 Авг 2004
Сообщения
2,079
Реакции
908
Credits
0
streamdown,
тебе вроде как уже раза три тут все объяснили :) То, что ты пытаешься сделать функцией, нужно сделать процедурой, конкретный Edit ей везде передавать через Sender.
Единственное замечание. Подумай, стоит ли обрабатывать KeyPress! Вот помини мое слово, обязательно найдется умник, который тебе влепясит в Edit чего-нибудь через буфер обмена :) Я бы сделал обработку уже окончательно введенного в Edit текста. Хотя, все зависит от того, что нужно.
 

maidan

Местный
Регистрация
6 Янв 2005
Сообщения
93
Реакции
4
Credits
150
может конструкция
Код:
(sender as tedit).text:='Edit1';
понятнее будет???
 

N3tM4n

Турист
Регистрация
10 Окт 2005
Сообщения
11
Реакции
1
Credits
20
Подумай, стоит ли обрабатывать KeyPress! Вот помини мое слово, обязательно найдется умник, который тебе влепясит в Edit чего-нибудь через буфер обмена
Так можно сделать удаление в Edit.Text ненужных символов в обработчике на событие OnChange.
 
Последнее редактирование модератором:

Ognev

ex-Team DUMPz
Местный
Регистрация
20 Авг 2004
Сообщения
2,079
Реакции
908
Credits
0
Можно, но зачем? По мне, правильнее было бы обрабатывать все введенное один раз, непосредственно перед использованием. Разница - введен текст в 100 символов, при обработке на OnChange ты будешь проделывать обработку минимум сто раз (если он все правильно сразу ввел, а не правил много раз), а так - один.
 

N3tM4n

Турист
Регистрация
10 Окт 2005
Сообщения
11
Реакции
1
Credits
20
Да можно как хочешь сделать =) Это дело вкуса.
 

Lord Phoenix

Местный
Регистрация
10 Мар 2006
Сообщения
81
Реакции
18
Credits
124
N3tM4n написал(а):
Да можно как хочешь сделать =) Это дело вкуса.
Ognev прав - эконимия проц.времени .Код хорош токо когда он оптимизирован и полностью безглючно исполняет свою функцию:)
 
Последнее редактирование модератором:

VVThanatos

Турист
Регистрация
11 Май 2011
Сообщения
1
Реакции
0
Credits
2
Всем привет! У меня такой вопрос:
есть обработка ввода в Edit:

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

обрабатывай senser