Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2015, 09:37   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
procedure RunStep1(f: TMyform);
var
  r: TModalResult { | cardinal | integer} ;
begin 
  f.Show; // Вывод начальной информации
  Application.ProcessMessage; //чтобы увидеть, но не ждать

  f.hide; r:=f.ShowModal; //ЖДЕМ нажатия (на нужной кнопке должно быть   ModalResult:=mrok; на других может быть ДРУГОЙ к примеру ModalResult:=mrcancel; 

  case r of  ///   если то иначе СМОТРИМ ЧТО было нажато
  mrok: Q:=1;
  mrcancel: Q:=0;
  end;
  f.Show; Application.ProcessMessage; // вывод чего-нибудь

end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.12.2015 в 09:41.
evg_m вне форума Ответить с цитированием
Старый 25.12.2015, 10:02   #12
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

fanlis Это у вас стресс и включился режим паники.

Цитата:
Для начала я бы попытался решить поставленную задачу, т.е. прерывать работу процедуры и возвращаться в нее. И сделать то же, что я уже сделал, но с обычным стеком (просто не знаю как), поэтому и спросил конкретно. Если не получится, тогда поменять метод, не через стек, а как-то еще. Ну а если уж и это никак, тогда придется как-то менять весь подход и доказывать, что поставленная задача нерешаема (что не хотелось бы).
Ваш подход неправильный изначально. Рано или поздно вы к этому придёте.

Почему он неправильный? Да потому что он ведёт к усложнению программы и запутыванию кода.

Цитата:
Но так получается, что событие предусматривает работу с интерфейсом программы, т.е. должно прерывать свою работу, чтобы получить данные от пользователя (например, нажатие кнопки).
Есть событийная парадигма, а есть алгоритмическая парадигма. Для тех кто забыл напоминаю что алгоритм это строгая последовательность действий.
Вот вы сейчас пытаетесь писать события в алгоритмическом стиле, что нарушает сам подход. В событийной модели управляющие воздействия подаются на вход. И они не должны вызываться в течении работы. В алгоритмическом напротив состояния событий проверяются в ходе работы.

Если хотите смешивать пишите интерпретатор. Но это так же будет вносить путаницу в работу.
Цитата:
(т.к. допустим эта кнопка используется во многих событиях).
У вас неправильная декомпозиция или понимания программы. У кнопки всего два событие нажата или отжита.
И всего два метода для их обработки. И не надо ничего придумывать. Дело в том что надо понять. Тут идёт инверсия управления. Из-за этого и путаница. В событийной парадигме управление идёт вам из вне. А в алгоритмической вы управляете другими.


Цитата:
- не понятно какую процедуру вызывать после того, как закончилась первая (требующая нажатия кнопки)
Вот вам и доказательство, что поставленная задача не решается.


Цитата:
Был у меня еще один мысль (как предлагалось здесь): программа просит нажать кнопку и переходит в бесконечный цикл с Application.ProcessMessages, который ждет нажатия. Но это ведь занимает процессор, а это плохо.
- Ничего плохого в том что процессор занят нету.
- Во вторых не занимает.
- в третьих можно сделать что-бы не занимало. Но подумайте оно нужно или нет?

Цитата:
У меня была задумка работать со стеком (не с моим, а с обычным), как-то добавлять самому туда адреса процедур или что-то подменять, но я это не умею делать.
Вам кажется что задача имеет решение. Но его нет. Можно конечно решить частный случай. Но врятли он вас устроит.
Есть хорошая книжка beginners.re/Reverse_Engineering_for_Beginners-ru.pdf
Прочитайте про стек вызовов. Для раскрутки стека вам понадобиться разобрать входной файл на функции и процедуры и методы. Для этого вам нужно прикрутить к свой программе декомпилятор Delphi. можно и свой написать надо будет разобрать формат PE найти секции с кодом, с отладочной информацией. Вытащить оттуда начало функций. Можно и Map разобрать. Затем найти конец процедур. Где начинается одна, там кончается другая. А после сделать внедрение в код для перехвата.
http://habrahabr.ru/post/178393/
лучше это, тут про правильный перехват написано.
http://habrahabr.ru/post/181157/
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 25.12.2015 в 10:18.
Pavia вне форума Ответить с цитированием
Старый 25.12.2015, 12:49   #13
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
По умолчанию

evg_m, не понял что вы написали. Точнее не понял как это применимо ко мне. Там несколько форм получается, а у меня одна. ShowModal мне основную форму что ли делать?

Pavia
Цитата:
Прочитайте про стек вызовов. Для раскрутки стека вам понадобиться разобрать входной файл на функции и процедуры и методы. Для этого вам нужно прикрутить к свой программе декомпилятор Delphi. можно и свой написать надо будет разобрать формат PE найти секции с кодом, с отладочной информацией. Вытащить оттуда начало функций. Можно и Map разобрать. Затем найти конец процедур. Где начинается одна, там кончается другая. А после сделать внедрение в код для перехвата.
Это как-то уж страшно сложно!

Что-то как-то написано много, а что делать так и не понятно.
Ну если со стеком ничего не выйдет, то как тогда поступить?
fanlis вне форума Ответить с цитированием
Старый 25.12.2015, 13:24   #14
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
(чтобы сделать какие-то действия на форме, например, нажать кнопку), а затем снова возвращаться в процедуру с того места, где было прерывание.
Код:
f.hide; r:=f.ShowModal; //ПОКАЗЫВАЕМ с ОЖИДАНИЕМ действия пользователя нажатия (на нужной кнопке должно быть   ModalResult:=mrok; на других может быть ДРУГОЙ к примеру ModalResult:=mrcancel; 

  case r of  //   ДЕЙСТВУЕМ в зависимости от действий пользователя на форме .если то иначе СМОТРИМ ЧТО было нажато
  mrok: Q:=1; 
  mrcancel: Q:=0;
  end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Refresh() формы, или собственный MessageBox timao C++ Builder 2 29.11.2013 17:56
Выход из главной процедуры VictorM Microsoft Office Excel 6 26.11.2012 11:52
Принудительный выход из процедуры kardinal94 Общие вопросы Delphi 8 12.07.2011 03:55
Выход из процедуры mactepmac Общие вопросы Delphi 1 28.06.2011 06:56
Не работает выход во внешнию среду из процедуры!!! Hacker19_90 Паскаль, Turbo Pascal, PascalABC.NET 1 10.11.2008 19:31