Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi

Модерирует : ShIvADeSt

ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mr_eoi
18:22 01-05-2005
Цитата:
Только TNotifyEvent - это частный случай обработчика событий.

Да, не совсем правильно выразился.

Цитата:
Основным отличительным свойством обработчиков событий является Sender - источник возникновения события.

Не совсем. Главное, что они определяются как

Код:
... = procedure(...) of object;
 
И им передается неявный параметр - объект, у которого произошло событие.

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 14:08 01-05-2005
mr_eoi



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
evle
14:08 01-05-2005
Цитата:
Не совсем. Главное, что они определяются как  
 
Код:... = procedure(...) of object;  
 
И им передается неявный параметр - объект, у которого произошло событие.

Так слово Sender было использовано в качестве нарицательного. Ну в общем и целом пришли к какому-то консенсусу.
 

----------
Per Aspera Ad Astra...

Всего записей: 2187 | Зарегистр. 10-08-2003 | Отправлено: 14:49 01-05-2005 | Исправлено: mr_eoi, 15:08 01-05-2005
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mr_eoi
Sender - это не совсем то. Он как раз передается явно и в общем случае не обязателен. Обычно он показывает, какой объект вызывает событие в нашем, но ничто не мешает поставить туда еще что-нибудь.
Неявный параметр - это всегда ссылка на себя, а не на другой объект.
Вот теперь, надеюсь, консенсус.  

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 15:04 01-05-2005
mr_eoi



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
evle
Хотелось бы ещё добавить, что реальные обработчики событий всё-таки есть методы, проверяющие валидность указателей на пользовательские (сменные) обработчики (м.б. оформленные как property) и при положительном результате проверки, вызывающие их как стандартные методы, например:
Код:
TOpenDialog=class(...)
...
FOnFolderChange: TNotifyEvent;
...
property OnFolderChange: TNotifyEvent read FOnFolderChange write FOnFolderChange;
...
end; // TOpenDialog
 
procedure TOpenDialog.DoFolderChange;
begin
  if Assigned(FOnFolderChange) then FOnFolderChange(Self);
end;



----------
Per Aspera Ad Astra...

Всего записей: 2187 | Зарегистр. 10-08-2003 | Отправлено: 15:11 01-05-2005 | Исправлено: mr_eoi, 15:12 01-05-2005
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mr_eoi
Конечно. Но так можно далеко уйти, т. к. этот вопрос не на одну страницу, лучше все-таки почитать исходники VCL и мануалы, а здесь обсуждать только конкретные вопросы.

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 15:36 01-05-2005
devingel



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Почему в Delphi 2005/Delphi 8 не обновляет ресурсы при компиляции? Т.е., например, в Design-окне на тулбарах имиджи - нормальные, а в запущенном виде - нет...

Всего записей: 45 | Зарегистр. 05-02-2004 | Отправлено: 20:36 02-05-2005
ViktorSila

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В программе есть массив строк(типа простой таблици). Нужно создать свой компонент потомок от DataSet. И дабавить в него пару своих событий(переход на следующее поле таблицы, и т.п.). А уже программы с помощью созданной компоненты, перемещается по этому массиву строк. Компонент создал, а вот как создать свои события, и на что они должны реагировать, не могу сообразить как это сделать.

Всего записей: 54 | Зарегистр. 04-02-2005 | Отправлено: 22:27 02-05-2005
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ViktorSila
03:27 03-05-2005
Цитата:
И дабавить в него пару своих событий(переход на следующее поле таблицы, и т.п.).  

А какая разница потомку от DataSet, кто ходит по полям? Он, вроде, должен только на изменения реагировать.  
По сути:  
Объявляешь тип TXXXEvent = procedure(Sender: TObject, Position: .... .... ....) of object;
(Параметры определяешь исходя из того, что хочешь наружу сообщить: на какое поле перешли, может еще что-нибудь. Sender пусть будет - пригодится).
Объявляешь свойство этого типа (public):
OnXXX: TXXXEvent;
и поле
FOnXXX: TXXXEvent; (private)
Объявляешь protected-процедуру DoOnXXX В ней пишешь:

Код:
procedure TYYYDataSet.DoOnXXX;
begin
  if Assigned(FOnXXX) then FOnXXX(Self);
end;

Когда ты по каким-либо признакам поймешь, что событие произошло, вызывай DoOnXXX.
(Переход на другое поле ты вряд-ли поймаешь, он обычно происходит совсем в другом объекте)

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 06:07 03-05-2005
SergeyReutov



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Какая функция удаляет все пробелы из строки (слева и справа)?

Всего записей: 170 | Зарегистр. 23-01-2003 | Отправлено: 11:36 03-05-2005
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyReutov
Trim

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 12:01 03-05-2005
GrayElf

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyReutov
 
function Trim(const S: string): string;

Всего записей: 34 | Зарегистр. 19-04-2005 | Отправлено: 12:01 03-05-2005
ViktorSila

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть массив строк (Вася, Петя,..и т.п.) в программе. На форме есть Edit1 и куча кнопок. При нажатии на Button1(переход на первую запись и она выводится в Edit1), ......Button5(добавить запись из Edit1).и т.п.. При нажатии на определнную кнопку должно сработать определенное созданное "ручками" событие в созданной компоненте(потомок DataSet) и выполнить необходимые действия.  
[q][/q]TXXXEvent = procedure(Sender: TObject, Position: .... .... ....) of object;  
Что писать конкретно в Position.

Всего записей: 54 | Зарегистр. 04-02-2005 | Отправлено: 13:24 03-05-2005
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ViktorSila
DataSet - невизуальный элемент, таковыми должны быть и его потомки. Он просто предоставляет набор методов (что-то вроде интерфейса) для универсальной работы с данными визуальных элементов (типа DBGrid, DBEdit). Тем более событие в твоем случае возникает в кнопке (ее ведь нажали); Обработчик события кнопки должен будет вызвать метод Какого-либо визуального элемента, а он уже спросит нужное значение у твоего потомка DataSet. Так что ты немного не в ту сторону ушел.
Position я там написал для примера, там может стоять любой набор параметров.

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 15:07 03-05-2005
ViktorSila

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В DataSet есть такой метод как First? И как в созданном потомке  DataSet поменять действия этого метода чтобы он обращался к моему массиву строк...

Всего записей: 54 | Зарегистр. 04-02-2005 | Отправлено: 23:06 03-05-2005
Felix



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ViktorSila
опиши его как procedure ....; override;
а в обработчике опиши своё действие без наследования.


----------
In My Opinion!

Всего записей: 965 | Зарегистр. 20-01-2002 | Отправлено: 23:26 03-05-2005 | Исправлено: Felix, 23:39 03-05-2005
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Felix
ViktorSila
Если я правильно понл код метода First, переопределять лучше InternalFirst (все равно придется - он виртуальный.) А если переопределить First, то получится не очень хорошо.

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 04:58 04-05-2005
Felix



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
evle
Вобщем-то можно и так, смотря, что конкретно ты хочшь сделать.

----------
In My Opinion!

Всего записей: 965 | Зарегистр. 20-01-2002 | Отправлено: 20:04 04-05-2005
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Felix
Просто если не вызывать предка, то отвалится пара событий и свойство BOF, да и все равно придется делать InternalFirst, иначе не скомпилится.

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 04:43 05-05-2005
SergeyReutov



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С помощью какой функции можно получить дробную часть числа после запятой? Тип числа Real.

Всего записей: 170 | Зарегистр. 23-01-2003 | Отправлено: 10:25 05-05-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Frac

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 10:37 05-05-2005
   

Страницы: 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi
ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru