Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аналог getch() c++ в Delphi 
V
    Опции темы
Kuvaldis
Дата 8.8.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



Граждане, доброго времени суток
я вообще программирую на С++, но необходимость заставила использовать Delphi. И сразу возникла проблема: как заставить программу Windows (не DOS) остановить выполнениe до нажатия клавиши (нужно для отслеживания выполения рекурсивного алгоритма). В с++ есть прекрасная функция getch(), работающая и в DOS, и в  консоли Win (правда, тоже не работающая в полноценном Win приложении). В обычном Pascal есть keypressed, которой нет в Delphi 7. Тут я сдаюсь и прошу помощи.

Заранее багодарен
P.S.  Ногами за вопрос не бить  smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Romikgy
Дата 8.8.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



так приложение какое на дельфи консоль или гуи, если консоль то можно подыскать чтот типа GetKeybrdState  если гуи то в кейпресс лезь


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Kuvaldis
Дата 8.8.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



Romikgy, 
Цитата

если гуи то в кейпресс лезь

можно поподробнее
у меня генерация перестановок идет по клику на кнопке. К чему привязать этот keypress, чтобы при каждой перестановке был стоп? Надоело ShowMessage использовать не по назначению
 smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Snowy
Дата 9.8.2006, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Данная постановка вопроса противоречит концепции WinAPI.
Сделай выполнение очередного шага по нажатию на кнопку.
И сиди - нажимай её Enter'ом или пробелом...
PM MAIL   Вверх
Kuvaldis
Дата 9.8.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



Упрощенно
рекурсивная функция, вызывается по клику на кнопке

Код

function EightQueen: boolean;

begin

   DrawStep(xs, ys);
// здесь нужен стоп !!!!!!!!!!!!!!!!!

  // ... основной код программы

   EraseStep(xs, ys);
 //  ShowMessage('') - было так 

end; 


Цитата

Сделай выполнение очередного шага по нажатию на кнопку.
И сиди - нажимай её Enter'ом или пробелом...

Если не трудно, приведите примерчик, для данного случая
Я хотел так: если включен CheckBox, то по шагам, иначе (как у меня без ShowMessage) только окончательный вариант.


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Romikgy
Дата 9.8.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Kuvaldis @  9.8.2006,  10:10 Найти цитируемый пост)
Если не трудно, приведите примерчик, для данного случаяЯ хотел так: если включен CheckBox, то по шагам, иначе (как у меня без ShowMessage) только окончательный вариант.

ни че нен понял smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
dumb
Дата 9.8.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



что за ...? user posted image используй для отладки отладчик! и ходи там по шагам сколько угодно.
PM MAIL   Вверх
Kuvaldis
Дата 9.8.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



dumb, 
Программа для решения задачи о 8 ферзях.
Генерация одного решения. Опционально нужно задать: по клику будет видно готовое решение, или пользователь сможет наблюдать решение задачи непосредственно

в С++ на место ShowMessage ставим getch()
Что в Delphi поставить???? smile 
Как средствами Delphi остановить выполение программы а потом по любому нажатию продолжить?


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Snowy
Дата 9.8.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Нельзя останавливать основной тред.
Это не консоль!
PM MAIL   Вверх
dumb
Дата 9.8.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



а. сие не отладка таки... user posted image
если ты делаешь гуевое приложение, то неплохо бы производить вычисления в отдельном потоке, с опциональной паузой в нужном месте. иначе придется извращаться.

Цитата(Kuvaldis @  9.8.2006,  11:37 Найти цитируемый пост)
Как средствами Delphi остановить выполение программы а потом по любому нажатию продолжить?

немного поясню гневную реплику Snowy:
такой вопрос некорректен применительно к gui-приложению - в нем есть некий цикл обработки сообщений, благодаря которому окошечки рисуются, двигаются, кнопки нажимаются итд. если ты остановишь основной поток в какой либо процедуре, то ничего из вышеперечисленного программа делать не сможет.
PM MAIL   Вверх
Kuvaldis
Дата 9.8.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



dumb, 
Даже и не подозревал, что  простая вроде бы программа (и проблема) могут меня смутить
Цитата

если ты делаешь гуевое приложение, то неплохо бы производить вычисления в отдельном потоке, с опциональной паузой в нужном месте

Как я понял, это уже не для новичков. А мне, наверное,  стоит удовлетвориться вызовом диалоговых окошек ShowMessage, чтобы  процесс останавливался, и можно было видеть промежуточные результаты  (неудобно, но...просто)  smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Snowy
Дата 9.8.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Просто нужно разбить процесс на несколько процедур/функций.
Завести ещё одну кнопку, которая будет производить очередную порцию действий.
PM MAIL   Вверх
Alexeis
Дата 9.8.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Kuvaldis, может воспользоватся консолью написанной на делфи.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Kuvaldis
Дата 9.8.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



обсуждение на RSDN 
реализация функции Getch для GUI
Автор Danchik

Код

function GetCh (Freeze : Boolean; EatChar : Boolean) : Char;
var
  aMessage : TMsg;

  function CharMessage (out AChar : Char) : Boolean;
  begin
    Result := PeekMessage(aMessage, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
    if Result then begin
      AChar := Char (aMessage.wParam);
      if not EatChar then
        DispatchMessage (aMessage);
      Exit;
    end;
  end;

begin
  Result := #0;

  if CharMessage (Result) then
    Exit;

  if Freeze then
    repeat
      if GetMessage(aMessage, 0, WM_KEYDOWN, WM_KEYDOWN) then begin
        TranslateMessage(aMessage);
        if CharMessage (Result) then
          Break;
      end else
        Break;
    until False
  else
    repeat
      if GetMessage(aMessage, 0, 0, 0) then begin
        TranslateMessage(aMessage);
        if CharMessage (Result) then
          Break
        else
          DispatchMessage (aMessage);
      end else
        Break;
    until False;
end;




Snowy,
 
Цитата

Просто нужно разбить процесс на несколько процедур/функций.
Завести ещё одну кнопку, которая будет производить очередную порцию действий.


Не могли бы вы объяснить поподробнее на элементарном примере, например, поиск с возвращением рекурсивный, можно на словах, без кода, или отправить по ссылке, где почитать
Просто из работающей функции нужно выходить, причем так, чтобы сохранялось текущее состояние
P.S. Извините за назойливость, просто не люблю оставлять нерешенные и непонятные вопросы


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
dumb
Дата 10.8.2006, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



во-во, что-то в этом роде и имелось ввиду. user posted image
Цитата(dumb @  9.8.2006,  12:14 Найти цитируемый пост)
иначе придется извращаться.


и не забудь где-нибудь красным вывести, что для продолжения надо клаву жать... user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0711 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.