Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 41
1

Програмное назначение обработчиков событий

26.03.2017, 13:23. Показов 5090. Ответов 49
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.
Надувается голова от вопроса: "Как назначить обработчик события созданному объекту в консольном приложении ?"
Стало быть создаётся форма. Нужно этой форме назначить обработчик на событие её закрытия.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
program HRU;
 
uses
  SysUtils,
  Forms;
 
Var MForm: TForm;
 
begin
    MForm := TMForm.Create(MForm);
    MForm.Width := 600;
    MForm.Height := 400;
    MForm.Close := // Как эту процедуру заменить на свою.
    mForm.Visible := True;
    MFOrmClosed := False;
 
// Тут будет ожидаться пока форма не закроется.
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2017, 13:23
Ответы с готовыми решениями:

Создание обработчиков событий
Я создал динамически форму а на нем кнопку button, как теперь создовать обработчики событий,...

Написание своих обработчиков событий
Вот значит меня интересует как для своего компонента, который не является потомком никакого...

Назначение событий на динамически создаваемое меню mainitem
Сабж. Как назначить действие при событии OnClick, когда динамически создается меню?

Програмное назначение принтера для печати
Всем здравствуйте! Подскажите пожалуйста, можно ли при выводе отчета(стикеров) на печать указать в...

49
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
27.03.2017, 02:38 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от SeemaN_tm Посмотреть сообщение
Я же помню что делал.
Не. Нифига не помнишь откуда взял тот код, который когда-то работал. Ну естественно и сам код не помнишь.

Добавлено через 2 минуты
Цитата Сообщение от GoodWeather Посмотреть сообщение
А у него ж
У него ж "чёрти что и сбоку бантик".
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 41
27.03.2017, 02:40  [ТС] 22
Если бы это было не завершение приложения, а другое событие - вы бы ловили футуристические глюки и вылеты.
А стек кто будет чинить?
Такой способ использую не только при завершении приложения. Уже назгначено множество обработчиков на разные компоненты на этой и на другой форме созданные таким же образом. Нет ни одного вылета, всё работает как задумано.
Утечек памяти так же нету, а значит все переменные удаляются из стека корректно.

Извините, но я не специалист по созданию "ужасных монстров" а-ля гибрида консольного и GUI приложения. Если вы мне объясните нафига вам нужно именно в консольном приложении создавать формы, я может быть и дам грамотный код.
Не в обиду, просто вопрос. Так может вы не специалист и вовсе ?
А я стало быть люблю извращаться в коде. И мои извращения-ухищрения пока неплохо живут.
Странный вопрос "нафига" от "специалиста". Не стану таить, все ради производительности и экономии ресурсов.
И не надо мне рассказывать на счёт этой экономии и производительности. Это не тема обсуждения.
0
884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
27.03.2017, 02:50 23

Не по теме:

Он специалист. Настоящий. Уровнем повыше большинства.



Вы используете TApplication и TForm. Значит вы точно так же тянете за собою тот же VCL. Никакой экономии вы не получаете. А на производительность VCL не влияет.

Как корректнее - я показал. Только не забывайте что Self использовать нельзя.
1
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
27.03.2017, 02:54 24
Цитата Сообщение от SeemaN_tm Посмотреть сообщение
Не в обиду, просто вопрос. Так может вы не специалист и вовсе ?
А я стало быть люблю извращаться в коде. И мои извращения-ухищрения пока неплохо живут.
Странный вопрос "нафига" от "специалиста". Не стану таить, все ради производительности и экономии ресурсов.
О какой производительности идёт речь? И о какой экономии ресурсов?
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 41
27.03.2017, 03:24  [ТС] 25
GoodWeather, вот это уже дельные ответы. А не "Покажи да расскажи, а я подумаю стоил ли пальцем шевелить."
На счёт производительности:
Когда много форм, вернее много разных окон, в одном приложении. Незачем ведь создавать сразу все и чтоб они висели в памяти. Можно их по мере надобности какие то создавать динамически, а какие то удалять за ненадобность.
Можно создать одну стандартно, а остальные создавать динамически. Так и так их согласовывать.
Хочу однообразия. Чтоб с любой из форм обращаться по одному и тому же принципу. Понадобилось какое то окошко, создал его, передал этому окну управление, не нужно больше это окно, в топку, вернул управление предыдущему.

На и напрягает меня настройки форм и объектов менять через палитру параметров.
А так в коде, больше нравится.

Добавлено через 11 минут
О какой производительности идёт речь? И о какой экономии ресурсов?
Хочу скорость в пару десятков парсек при затратах в две калорий.
Сделай милость, избавь от ненужных вопросов.
0
884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
27.03.2017, 03:28 26
Цитата Сообщение от SeemaN_tm Посмотреть сообщение
Незачем ведь создавать сразу все и чтоб они висели в памяти. Можно их по мере надобности какие то создавать динамически, а какие то удалять за ненадобность.
Незачем. Но обычный VCL это и не заставляет. Да, по умолчанию он суёт все добавляемые формы между Application.Initialize(); и Application.Run();. Но никто не запрещал их оттуда убрать и создавать/удалять по мере надобности. Единственное - главную (первую создаваемую) нельзя закрывать - это обозначает закрытие программы.
Но с другой стороны - хоть они заранее созданы и висят в памяти, но зато когда понадобятся - открываются быстрее.
Цитата Сообщение от SeemaN_tm Посмотреть сообщение
напрягает меня настройки форм и объектов менять через палитру параметров.
А так в коде, больше нравится.
эм... Как бэ можно и не трогать "палитру" (или точнее инспектор объектов) а задавать из кода в OnCreate или где надо. Я если пишу студентам примеры программ обязательно только так и делаю, чтоб они не запутались.
1
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
27.03.2017, 03:33 27
SeemaN_tm, уверен вам понравится как работает функция InputQuery() из модуля Dialogs. :3

Добавлено через 30 секунд
Посмотрите исходный код её.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
27.03.2017, 03:34 28
Цитата Сообщение от SeemaN_tm Посмотреть сообщение
На счёт производительности:
Когда много форм, вернее много разных окон, в одном приложении. Незачем ведь создавать сразу все и чтоб они висели в памяти. Можно их по мере надобности какие то создавать динамически, а какие то удалять за ненадобность.
Можно создать одну стандартно, а остальные создавать динамически. Так и так их согласовывать.
Ещё один бред троешника. Ибо консольное приложение тут вообще ни при чём.
P.S. Ты можешь сколько тебе угодно называть меня неспециалистом. Я не обижусь. Но суть то не изменится. Твой код бредовый.
0
884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
27.03.2017, 03:39 29
Кстати да, у вас абсолютно точно не консольное приложение. У вас Win32-GUI-приложение.
Консольное приложение это когда директива {$APPTYPE CONSOLE} перед uses и консольное окно открывается перед тем как программа начнёт выполняться...
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 41
27.03.2017, 03:54  [ТС] 30
Ещё один бред троешника. Ибо консольное приложение тут вообще ни при чём.
P.S. Ты можешь сколько тебе угодно называть меня неспециалистом. Я не обижусь. Но суть то не изменится. Твой код бредовый.
Замечу что цитируете постоянно часть поста. И судя по ответу, складывается впечатление, что пост прочитали не целиком. Я не спорю, возможно у отличников принято книги так же читать ограничиваясь её частью.
Был вопрос изначально в теме, ответа дать не можете или не хотите (пример кода в частности), мне не важно. А на ваши характеристики моего кода мне тем более с высокой колокольни.
Ещё раз переформулирую. Ответа дать не можете или не хотите, идите по другим темам, "дерите мозг" своими вопросами в другой теме. Не надо мне в мозг впиваться.

Добавлено через 7 минут
Кстати да, у вас абсолютно точно не консольное приложение. У вас Win32-GUI-приложение.
Консольное приложение это когда директива {$APPTYPE CONSOLE} перед uses и консольное окно открывается перед тем как программа начнёт выполняться...
Да не суть. Консольное или нет. Заголовок темы подзабыли ?
Оно явно гласит "Программное назначение обработчиков событий - Delphi"
Чего вы прицепились к консольному или не консольному.
Под словами "Как назначить обработчик события созданному объекту в консольном приложении ?" имелось в виду, что приложение не имеет статической формы. Что у приложения есть свой отдельный поток, который передаёт управление тому или иному динамически созданному объеку/форме.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
27.03.2017, 04:03 31
Цитата Сообщение от SeemaN_tm Посмотреть сообщение
Заголовок темы подзабыли ?
Оно явно гласит "Программное назначение обработчиков событий - Delphi"
Чего вы прицепились к консольному или не консольному.
Под словами "Как назначить обработчик события созданному объекту в консольном приложении ?" имелось в виду, что приложение не имеет статической формы. Что у приложения есть свой отдельный поток, который передаёт управление тому или иному динамически созданному объеку/форме.
Ещё один бред. Теперь какой-то поток возник. При чем сам по себе возник.
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 41
27.03.2017, 04:14  [ТС] 32
Ещё один бред. Теперь какой-то поток возник. При чем сам по себе возник.
Вот и не мешай бредить. Освободи тему от своих "толковых" постов.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
27.03.2017, 04:18 33
Ну раз ты просишь не стараться тебе помогать, то пожалуйста. Я с лёгким сердцем пойду спать.
А ты оставайся один на один со своими глюками.
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 41
27.03.2017, 04:23  [ТС] 34
Ну раз ты просишь не стараться тебе помогать, то пожалуйста. Я с лёгким сердцем пойду спать.
А ты оставайся один на один со своими глюками.
Нету ни каких глюков, код приведённый в посте № 3 работает.
Это вы пытаетесь мне доказать что они есть, а показать, продемонстрировать не можете.
Приятного сна, я скучать по вам не буду.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
27.03.2017, 04:32 35
Цитата Сообщение от SeemaN_tm Посмотреть сообщение
Нету ни каких глюков
Пока нету.
А насчёт показать. Тебе мало разницы в количестве параметров? Или ты эту разницу не понял?
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
27.03.2017, 10:17 36
можно заливать что угодно, но вот эта конструкция синтаксически правильна, компилируется и замечательно работает
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.CloseHandler(Sender: TObject; var Act: TCloseAction);
begin
  //...
end;
 
procedure TForm1.Proc1;
begin
  OnClose := CloseHandler;
end;
а то что вы создаете форму в своем коде, а не стандартными средствами, не делает ваше приложение более консольным ни на грамм, ибо никакой консоли даже не создается.

читайте же доки
OnClose :TCloseEvent;

TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;

OF OBJECT!
это переменная типа МЕТОД класса с указанными параметрами

то что все указатели равны и позволяют жесткое кастование, не делает равными типы, которые вы кастуете в pointer
путем добавления @
1
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 41
19.05.2017, 03:48  [ТС] 37
Продолжим тему.
В многопоточном приложении, потоки создают на одной и той же форме компоненты (TImage).
К примеру 10 потоков и каждый создаёт свой компонент.
На все эти объекты назначается одна и та же процедура обработчика (OnClick).

Можно ли при создании TImage, прикрутить ему собственный параметр? Чтоб в дальнейшем, при клике по TImage, в процедуре обработчика можно было узнать к примеру, идентификатор потока создавшего этот компонент.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
19.05.2017, 09:00 38
во-первых создание TImage в потоке бессмысленно и беспощадно. Вся работа с VCL и с экраном вообще должна проходить в главном потоке. Если вы используете Synchronize, то это собсно так и происходит. все создается в главном. Если нет, ждите глюков.
А в процедуре обработчика вам и так передают, какой объект этот обработчик вызвал. Это параметр Sender
чтобы не нужно было добавлять TButton(Sender) везде, можно применить сильное колдунство:
Delphi
1
2
3
4
5
procedure TForm1.ButtonClick(Sender:TObject);
var b:TButton absolute Sender;
begin
 ...
end;
а если вам нужно еще что-то к компоненту прикручивать, то это убитая архитектура
компоненты должны ОТРАЖАТЬ данные, которые структурированно хранятся в вашей программе, а не хранить эти данные "на экране"
1
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 41
19.05.2017, 11:39  [ТС] 39
А в процедуре обработчика вам и так передают, какой объект этот обработчик вызвал.
В том то и дело, мне этого не достаточно. Мне мало знать какой объект вызвал обработчик. Мне надо классифицировать объекты вызывающие обработчик. Сейчас классифицирую по имени объекта:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TShow.OnClickImg(Sender: TObject);
  Var BName: String;
  Var Index: Integer;
begin
  BName := (Sender as TImage).Name;
  If Not TryStrToInt(Copy(BName,2,LenGth(bName)-1),Index) Then
    Begin
      AppendLog('Переданный параметр не является числом.');
      Exit;
    End;
  if (Index < Low(ThreadsList)) or (Index > High(ThreadsList)) then
    Begin
      AppendLog('Нет потока с указанныйм индексом.');
      Exit;
    End;
  ThreadsList[Index].Resume;
end;
Хотелось бы использовать целочисленный параметр.
За место строкового
Delphi
1
(Sender as TImage).Name;
целочисленный
Delphi
1
 (Sender as TImage).AnyVariable;
а если вам нужно еще что-то к компоненту прикручивать, то это убитая архитектура
компоненты должны ОТРАЖАТЬ данные, которые структурированно хранятся в вашей программе, а не хранить эти данные "на экране"
Так надо чтоб компоненты и передавали какую то полезную информацию или данные.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
19.05.2017, 12:57 40
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TMyObject=class
  anyData:integer;
  otherData:double;
  img:TImage;
end;
 
TMyObjects=class(TObjectlist)
  function ByImage(img:TImage) :TMyObject;
end;
 
...
function TMyObjects.ByImage(img:TImage) :TMyObject;
begin
  for i:=0 to Count-1 do
  begin
    result := items[i] as TMyObject;
    if result.img = img then
      exit;
  end;
  result := nil;
end;
вот вам структура в которой в том числе хранятся и ссылки на TImage и всякие другие данные

Delphi
1
2
3
4
5
6
procedure TForm1.ImageClick(Sender:TObject);
var obj:TMyObject;
begin
  obj := myList.ByImage(sender);
  showMessage(inttostr(obj.SomeData));
end;
0
19.05.2017, 12:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2017, 12:57
Помогаю со студенческими работами здесь

Несколько обработчиков событий
Ситуация следующая, имеется несколько обработчиков различных событий, когда события зажгутся не...

Создание обработчиков событий
Здравствуйте. Вот для разнообразия (раньше пользовался VS) поставил Qt 5.4.0, вроде всё норм, да...

Несколько обработчиков событий
Народ ток начитаю, сильно ругайте, в общем у меня в есть 3 кнопки, для 1, по инструкции создал...

Удаление обработчиков событий
function LoadingImage(xpost) { var isLoaded = 0, post =...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru