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

 



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.07.2018, 22:09
vas31 vas31 вне форума
Прохожий
 
Регистрация: 11.07.2018
Сообщения: 5
Версия Delphi: Delphi 10.2
Репутация: 10
По умолчанию SynEdit - присваивание обработчиков событий

Доброго времени суток!

По клику на кнопку создаю новый 'TabSheet', далее в нём создаю новый экземпляр компонента 'SynEdit'.
Присваиваю обработчику 'OnGutterClick' этого компонента свою процедуру 'myGutterClick'.
Когда создан один экземпляр 'SynEdit', то всё отрабатывает нормально. Но стоит создать ещё несколько
экземпляров SynEdit-а (несколько табов), то мой обработчик события отрабатывает только на последнем
созданном SynEdit-е.

В интернете описываются случаи или с назначением на всего один экземпляр компонента (как правило кнопки)
или приводятся такие примеры, что пока "тёмный лес" для меня...

Как правильно назначать обработчики событий для SynEdit-а, когда динамически создаются
несколько его экземпляров ?


Мой код примера:
Код:
// кнопка
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
   ts  : TTabSheet;
   sed : TSynEdit;
begin
	with PageControl1 do
		begin
		// создаём новый таб
		ts := TTabSheet.Create(Self);
		ts.PageControl := PageControl1;
		ts.Caption := 'TabSheet' + IntToStr(PageCount);

		// создаём новый экземпляр 'SynEdit'
		sed := TSynEdit.Create(ts);
		sed.Parent := ts;
		// присваиваем обработчик события
		sed.OnGutterClick := myGutterClick;

	end;
end;


// моя процедура для события 'OnGutterClick'
procedure TForm1.myGutterClick(Sender: TObject; Button: TMouseButton; X, Y, Line: Integer; Mark: TSynEditMark);
begin
  ...
  код
  ...
end;
Ответить с цитированием
  #2  
Старый 12.07.2018, 01:19
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,139
Версия Delphi: 7, XE3, 10.2
Репутация: 49086
По умолчанию

Ну, предаставленный код вполне правильный.
Просто внутри обработчика надо обращаться к тому компоненту, который вызвал этот обработчик, а не пытаться что-то вычислять, типа как-то так:
Код:
procedure TForm1.myGutterClick(Sender: TObject; Button: TMouseButton; X, Y, Line: Integer; Mark: TSynEditMark);
var
  sed : TSynEdit;
begin
  If Sender Is TSynEdit Then
    Begin
      sed := Sender As TSynEdit;
      ...
      код с обращением через 'sed.'
     ...
  End;
end;
Ответить с цитированием
  #3  
Старый 12.07.2018, 21:22
vas31 vas31 вне форума
Прохожий
 
Регистрация: 11.07.2018
Сообщения: 5
Версия Delphi: Delphi 10.2
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Просто внутри обработчика надо обращаться к тому компоненту, который вызвал этот обработчик

Да, действительно так работает как нужно. Большое спасибо!
Век живи, век учись

А существует ли возможность в обработчике одного компонента добраться до другого компонента ?
Просто при удалении созданных TabSheet-ов (с их SynEdit-ми) хотелось бы обновлять положение курсора при вставании на новый активный TabSheet, как удалится текущий (активный). Т.е. в обработчике PageControl.OnChange иметь доступ к экземпляру SynEdit табшита.
Ответить с цитированием
  #4  
Старый 13.07.2018, 06:37
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,139
Версия Delphi: 7, XE3, 10.2
Репутация: 49086
По умолчанию

Ну, тут 2 варианта.
1. Сохранять где-то соответсвие ссылок TabSheet-SynEdit.
2. Через FindComponent у TabSheet'а искать по имени, либо просто перебором через Components по классу.
Ответить с цитированием
  #5  
Старый 13.07.2018, 19:40
vas31 vas31 вне форума
Прохожий
 
Регистрация: 11.07.2018
Сообщения: 5
Версия Delphi: Delphi 10.2
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Ну, тут 2 варианта.
1. Сохранять где-то соответсвие ссылок TabSheet-SynEdit.
2. Через FindComponent у TabSheet'а искать по имени, либо просто перебором через Components по классу.

Ясно. Спасибо!. Буду пытаться "расти над собой"
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2018

ВКонтакте   Facebook   Twitter