Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.07.2020, 11:22
Alex7 Alex7 вне форума
Новичок
 
Регистрация: 18.09.2018
Сообщения: 62
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Событие по изменению Edit.Text

Здравствуйте, хочу сделать чтобы выполнялась определённая процедура при изменении значения Edit.Text, но только в том случае если значение отличается от бывшего там ранее текста, пробую так:
Код:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  ip1 := Edit1.Text;
  if (ip2 <> ip1) and (Edit1.Text <> ' ') then MyProcedure;
  ip2 := ip1;
end;
Не получается, MyProcedure выполняется при каждом обновлении Edit1.Text даже если его значение обновилось на тоже, что и было ранее. Помогите пожалуйста.
Ответить с цитированием
  #2  
Старый 15.07.2020, 09:20
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

А в какой момент содержимое TEdit нужно считать "бывшим"?
Осмелюсь предположить, что Вы хотите сделать так:
Код:
var
  Edit1_LastValue: string; //Не забудь инициализировать начальным значением
...
//при потере фокуса в TEdit
procedure TEdit1.OnExit(Sender: TObject);
begin
  if Edit1_LastValue <> Edit1.Text then 
  begin
    SomeProc;
    Edit1_LastValue := Edit1.Text;
  end;
end;
Т.е. Ваша процедура вызывается в тот момент, когда окончен ввод в поле (поле ввода теряет фокус), и новое значение запоминается.

Как-то так. Если таких полей несколько, тот тут как Вам будет удобнее:
1. Завести по переменной на каждое поле ввода
2. Сделать массив по числу таких полей ввода (хоть динамический, хоть статический) и определять в общей процедуре какое поле изменилось, например по свойству Tag.
3. Написать новый класс на основе TEdit с нужным функционалом.
4. Поискать на просторах готовый компонент с нужным функционалом.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #3  
Старый 18.07.2020, 03:45
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Цитата:
Сообщение от Alex7
Не получается, MyProcedure выполняется при каждом обновлении Edit1.Text даже если его значение обновилось на тоже, что и было ранее. Помогите пожалуйста.
Твоя процедура и будет выполняться постоянно и вот почему.
Код:
procedure TForm1.Edit1Change(Sender: TObject);
begin
//В переменную ip1 записываем содержимое Edit1.
  ip1 := Edit1.Text;
//Сравниваем переменные ip2, в которой вообще ещё ничего нет, и ip1, в которой наш текст.
//Так как выполняются оба условия, т.е. ip2<>ip1 и поле не пусто, то выполняется твоя процедура.
  if (ip2 <> ip1) and (Edit1.Text <> ' ') then MyProcedure;
//Дальше как бы запоминаем наше новое значение для ip2
  ip2 := ip1;
//Но при повторном событии OnChange твои переменные обнуляются и твоего нового значения как будто бы и не бывало. Кстати, в твоем примере непонятно локальные переменные или глобальные.
//И так происходит по кругу, и поэтому выполняется постоянно твоя процедура.
end;
Правильнее будет сделать, я думаю, так:
Код:
//заводим глобальную переменную
var
  LastValue: String
Код:
//при событии входа в Edit запоминаем имеющийся там текст
procedure TForm1.Edit1Enter(Sender: TObject);
begin
  LastValue := Edit1.Text;
end;
Код:
//а при событии выхода из Edit сравниваем значения и вы случае несовпадения выполняем то, что нужно
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if (LastValue <> Edit1.Text) then
    begin
      MyProcedure;
      LastValue := Edit1.Text;
    end;
end;
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #4  
Старый 03.10.2020, 21:48
Motorolla Motorolla вне форума
Прохожий
 
Регистрация: 06.06.2019
Сообщения: 17
Версия Delphi: Delphi 7 / XE8
Репутация: 10
По умолчанию

Писал я себе как-то программку, форма которой была из сетки едитов (не от великого ума было дело). И нужно было следить за изменениями в этих полях и подсвечивать их. Всё думал как же мне удержать старые значения каждого поля в памяти до сохранения результатов. Выкрутился за счёт Хинтов. Просто сбрасывал туда значение при фокусе, а по выходу проверял разность и подсвечивал. Так у меня появилась халявная способность возвращать при необходимости начальное содержимое на каждое поле отдельно.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter