Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 34
1

Подсветка выделенного Edit

08.07.2013, 09:39. Показов 3083. Ответов 18
Метки нет (Все метки)

Доброго всем времени суток.
на форме имеется более двадцати Edit, мигающая каретка конечно показывает в какой из Edit сейчас будут вводиться символы, есть необходимость подсветить этот Edit для большей заметности например бледно жёлтым или бледно зелёным
понятное дело что color надо сменить, и даже пара неуклюжих вариантов есть, хотелось бы более изящный и универсальный способ, чтоб добавив несколько Edit мне не пришлось ничего дописывать
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2013, 09:39
Ответы с готовыми решениями:

Копирование выделенного текста из Memo в Edit
Есть выделенный после поиска текст в Memo, как его в Edit засунуть?

Перенести текст выделенного элемента listbox в форму edit. Как? Делфи 7
Имеется листбокс с каким-то количеством строк. Необходимо выделенную строку перенести в...

ListView подсветка выделенного пункта
Всем доброго времени суток! Понимаю, вопрос нубский, но никак не получается сделать navigation...

Qt Creator. Подсветка всех вхождений выделенного слова
День добрый! Мучает вопрос. Можно ли в Qt Creator подсвечивать все вхождения выделенного слова, но...

18
693 / 567 / 414
Регистрация: 31.03.2013
Сообщений: 1,029
08.07.2013, 10:05 2
svin00,
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
    temp: TComponent;
begin
  for i:=0 to ComponentCount-1 do
    begin
      Temp := Components[i];
      if (temp is TEdit) then
        begin
          if (temp as TEdit).Focused then (temp as TEdit).Color := clmoneyGreen
          else (temp as TEdit).Color := clWindow;
        end;
    end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval:=100;
  Application.ProcessMessages;
end;
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31246 / 20425 / 7961
Регистрация: 22.10.2011
Сообщений: 35,457
Записей в блоге: 6
08.07.2013, 10:14 3
Лучший ответ Сообщение было отмечено как решение

Решение

Это делается вообще безо всякого Timer-а:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type
  TEdit = class(StdCtrls.TEdit) // перед классом формы
  private
    { Private declarations }
  protected
    procedure DoEnter; override;
    procedure DoExit; override;
  end;
 
  TForm1 = class(TForm)
  // ...
 
// и реализация:
{ TEdit }
 
procedure TEdit.DoEnter;
begin
  inherited;
  Color := clmoneyGreen;
end;
 
procedure TEdit.DoExit;
begin
  inherited;
  Color := clWindow;
end;
При смене фокуса отработают соответственно DoExit эдита, с которого уходит фокус, и DoEnter того эдита, куда фокус приходит. Это нам и надо, тут и поменяем цвет. И неважно, сколько Edit-ов будет на форме, для всех отработают эти методы...
6
Эксперт Pascal/Delphi
4741 / 2719 / 842
Регистрация: 04.10.2012
Сообщений: 9,921
08.07.2013, 10:17 4
svin00, выделите на форме все TEdit. Создайте для них по одному обработчику OnEnter и OnExit

Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Edit1Enter(Sender: TObject);
begin
TEdit(Sender).Color := clYellow;
end;
 
procedure TForm1.Edit1Exit(Sender: TObject);
begin
 TEdit(Sender).Color := clWindow;
end;
 
end.
Добавлено через 1 минуту

Не по теме:

Чуть опоздал



Добавлено через 19 секунд
Samhain, все намного проще
3
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31246 / 20425 / 7961
Регистрация: 22.10.2011
Сообщений: 35,457
Записей в блоге: 6
08.07.2013, 10:17 5
droider, будешь добавлять Edit-ы - придется добавлять еще и оба обработчика. В моем варианте (с классом перехватчиком) ничего делать не надо...
1
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 34
08.07.2013, 10:38  [ТС] 6
Samhain, хороший вариант, я так понимаю постоянно будет код отрабатывать, наверно повысит нагрузку на проц
UI, не совсем понял как работает но работает хорошо, подозреваю что постоянно цикл не крутиться, или ошибаюсь? как бы сюда добавить Edit-ы исключения?
droider, согласен с UI, хотя сам код явно проще
0
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
08.07.2013, 10:39 7
Определенно, вариант с классом - наследником самый красивый... Извращение с таймером не очень
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31246 / 20425 / 7961
Регистрация: 22.10.2011
Сообщений: 35,457
Записей в блоге: 6
08.07.2013, 10:48 8
Цитата Сообщение от svin00 Посмотреть сообщение
не совсем понял как работает
У любого наследника TWinControl есть событие OnEnter (срабатывающее при получении фокуса), и OnExit (срабатывающее при его потере), так? Это все знают

Только почему-то при этом многие забывают, как именно обрабатывается это событие. В классе TWinControl также есть и динамические методы DoEnter и DoExit, которые автоматически вызываются при срабатывании соответствующих событий. Тот факт, что они динамические - позволяет их переопределить в наследнике, и навесить на них своё поведение.

Цитата Сообщение от svin00 Посмотреть сообщение
подозреваю что постоянно цикл не крутиться
Разумеется, Дельфи - это всё-таки событийное программирование. По наступлению события предпринимаются какие-то действия, а пока оно не произойдет - зачем мешать программе работать?
Цитата Сообщение от svin00 Посмотреть сообщение
как бы сюда добавить Edit-ы исключения?
Есть такое очень полезное свойство Tag. Скажем, если его присвоить 1-це, то можно не менять цвет в DoEnter... А если Tag = 2, то можно выделять текущий Edit не зеленым, а красным, если нужно... Идея понятна?
2
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 34
08.07.2013, 11:06  [ТС] 9
Цитата Сообщение от UI Посмотреть сообщение
Идея понятна?
даёшь код в массы
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31246 / 20425 / 7961
Регистрация: 22.10.2011
Сообщений: 35,457
Записей в блоге: 6
08.07.2013, 11:15 10
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Меняем реализацию DoEnter вот так:
procedure TEdit.DoEnter;
begin
  inherited;
  case Tag of
    0 : Color := clmoneyGreen;
    2 : Color := clRed;
  end;
end;
 
// и для конкретных Edit-ов:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Tag := 1; // Запрещаем "подсвечивание"
  Edit2.Tag := 2; // этот будет подсвечиваться красным, а не зелёным
end;
2
15 / 15 / 5
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
19.09.2013, 05:11 11
Цитата Сообщение от UI Посмотреть сообщение
Это делается вообще безо всякого Timer-а:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type
  TEdit = class(StdCtrls.TEdit) // перед классом формы
  private
    { Private declarations }
  protected
    procedure DoEnter; override;
    procedure DoExit; override;
  end;
 
  TForm1 = class(TForm)
  // ...
 
// и реализация:
{ TEdit }
 
procedure TEdit.DoEnter;
begin
  inherited;
  Color := clmoneyGreen;
end;
 
procedure TEdit.DoExit;
begin
  inherited;
  Color := clWindow;
end;
При смене фокуса отработают соответственно DoExit эдита, с которого уходит фокус, и DoEnter того эдита, куда фокус приходит. Это нам и надо, тут и поменяем цвет. И неважно, сколько Edit-ов будет на форме, для всех отработают эти методы...
А можно на C++ версию, как будет выглядеть, а то что то не могу переделать(((
0
Житель Земли
2904 / 2844 / 383
Регистрация: 26.07.2011
Сообщений: 11,104
Записей в блоге: 1
19.09.2013, 15:12 12
Цитата Сообщение от UI Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
TEdit = class(StdCtrls.TEdit) // перед классом формы
 private
  { Private declarations }
 protected
  procedure DoEnter; override;
  procedure DoExit; override;
end;
UI, то есть, я могу переопределить поведение стандартного класса в рамках моей программы (без описания класса-наследника) и все компоненты данного класса будут себя вести так как я хочу, правильно? в Д2010 это осуществимо? или это появилось только в ХЕ, судя по StdCtrls.TEdit?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31246 / 20425 / 7961
Регистрация: 22.10.2011
Сообщений: 35,457
Записей в блоге: 6
19.09.2013, 15:36 13
Цитата Сообщение от DenNik Посмотреть сообщение
в Д2010 это осуществимо?
Это еще в D6 делалось, я уже не говорю про D2010. А StdCtrls.TEdit - это чтобы избежать ссылки на самого же себя, описание
Delphi
1
2
type
   T = class(T)
вызывает у компилятора недоумение

Цитата Сообщение от lanu4 Посмотреть сообщение
А можно на C++ версию, как будет выглядеть
Можно. Вот так (h-файл):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace MyNamespace // перед классом формы !!!
{
    class TEdit : public Stdctrls::TEdit // Промежуточный класс
    {
    public:
        inline __fastcall virtual TEdit(Classes::TComponent* AOwner) :
            Stdctrls::TEdit(AOwner) {}
     protected:
        DYNAMIC void __fastcall DoEnter(void)
        {
            Stdctrls::TEdit::DoEnter();
            Color = clMoneyGreen;
        }
        DYNAMIC void __fastcall DoExit(void)
        {
            Stdctrls::TEdit::DoExit();
            Color = clWindow;
        }
    };
}
#define TEdit MyNamespace::TEdit
 
class TForm1 : public TForm // Это уже класс формы, тут менять ничего не надо...
2
Житель Земли
2904 / 2844 / 383
Регистрация: 26.07.2011
Сообщений: 11,104
Записей в блоге: 1
19.09.2013, 16:10 14
Цитата Сообщение от UI Посмотреть сообщение
StdCtrls.TEdit - это чтобы избежать ссылки на самого же себя
а добавлять таким образом новые поля или методы можно? или нужно писать наследника?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31246 / 20425 / 7961
Регистрация: 22.10.2011
Сообщений: 35,457
Записей в блоге: 6
19.09.2013, 16:13 15
Можно добавлять все, что нужно. Это и есть наследник, кстати... Ты ж наследуешься от того класса TEdit, который определен в файле StdCtrls.pas.
1
15 / 15 / 5
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
23.09.2013, 06:42 16
UI, Спасибо большое
0
21 / 19 / 12
Регистрация: 03.11.2013
Сообщений: 862
02.04.2020, 22:05 17
не сочтите за спамера, сейчас просто разбирался, может кому пригодится, не заработало, пока не добавил VCL
Delphi
1
TEdit = class(StdCtrls.TEdit) // перед классом формы
в эту строчку
Delphi
1
TEdit = class(vcl.StdCtrls.TEdit) // перед классом формы
0
Модератор
7296 / 4774 / 2001
Регистрация: 21.01.2014
Сообщений: 20,277
Записей в блоге: 3
03.04.2020, 11:08 18
Цитата Сообщение от Vologd Посмотреть сообщение
не заработало, пока не добавил VCL
Ну, дык лет-то сколько прошло... Да, сейчас этот модуль так называется. Но это актуально только для XE+, в семерке это добавление VCL как раз и вызовет ошибку...
0
Житель Земли
2904 / 2844 / 383
Регистрация: 26.07.2011
Сообщений: 11,104
Записей в блоге: 1
03.04.2020, 14:27 19
А я выяснил, что если в uses без vcl, то и при наследовании тоже не нужно писать vcl. Сомнительной полезности баг фича, но имеет место быть )
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2020, 14:27

Как изменить цвет выделенного слова в элементе Edit?
Добрый день ! Подскажите пожалуйста как изменить цвет выделенного слова в элементе EDIT ? ...

Подсветка символа в edit
Мне нужен компонент, который смог бы поддерживать подсветку символа, так например в клавиатурном...

Копирование выделенного текста в HTML странице ссылкой и id значением первого выделенного абзаца
В общем так: На странице имеется длинный текст со множеством абзацами заключённые в <p> теги,...

почему на виндоус икспи на нетбуке асер д255е экран тусклый(подсветка),а на виндоус 7 подсветка замечательная(очень яркая)
почему на виндоус икспи на нетбуке асер д255е экран тусклый(подсветка),а на виндоус 7 подсветка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.