Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Разморозить форму / 25 сообщений из 42, страница 1 из 2
08.03.2019, 20:57
    #39783953
logone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
Привет всем
У меня есть функция в которой происходит ожидания нажатия enter:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure WaitEnter;
var
  msg: tagMSG;
begin
  repeat
    GetMessage(msg, 0, 0, 0);
  until (msg.message = WM_KEYDOWN) and (msg.wParam = 13);
end;



Она вызывается в цикле:
Код: pascal
1.
2.
3.
4.
5.
while ... do
  ...
  WaitEnter;
  ...
end;


Когда она выполняется, как мне получить возможность двигать форму и писать в edit?
...
Рейтинг: 0 / 0
08.03.2019, 21:41
    #39783962
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
а чем главный цикл обработки сообщений не подходит ?
он всем этим и занимается
и обработчик OnKeyPress замечательно отловит нажатие Enter без всякой бесовщины
...
Рейтинг: 0 / 0
08.03.2019, 22:51
    #39783984
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
Взгляните на код этой процедуры

[SRC delphi]
procedure MyProcessMessages();
var
lpMsg : TMsg;
begin
while PeekMessage(lpMsg,0,0,0,PM_REMOVE) do
begin
TranslateMessage(lpMsg);
DispatchMessage(lpMsg);
end;
end;
/SRC]
...
Рейтинг: 0 / 0
08.03.2019, 22:52
    #39783985
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
Сорри, лишнее удалил.



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure MyProcessMessages();
var
   lpMsg    : TMsg;
begin
   while PeekMessage(lpMsg,0,0,0,PM_REMOVE) do
   begin
      TranslateMessage(lpMsg);
      DispatchMessage(lpMsg);
   end;
end;
...
Рейтинг: 0 / 0
09.03.2019, 00:25
    #39783997
logone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
krapotkin,

Мне нужно чтобы до того, пока не будет нажата клавиша ентер цикл дальше не шёл!
...
Рейтинг: 0 / 0
09.03.2019, 08:03
    #39784013
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
logonekrapotkin,

Мне нужно чтобы до того, пока не будет нажата клавиша ентер цикл дальше не шёл!

потоки не предлагать, как я понимаю?
...
Рейтинг: 0 / 0
09.03.2019, 13:00
    #39784044
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
Здесь потоки нафик не сдались - не тот уровень ТС, судя по вопросу. Достаточно флага и ProcessMessages
...
Рейтинг: 0 / 0
09.03.2019, 13:01
    #39784045
logone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
Vizit0r,

Я попробовал потоками
Я тоже сначала подумал, что мне нужно просто чтобы эта функция выполнялась в отдельном потоке
Я сделал так -
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
while ... do
  ...
  TThread.CreateAnonymousThread(
    procedure
    var
      msg: tagMSG;
    begin
      repeat
        PeekMessage(msg, 0, 0, 0);
      until (msg.message = WM_KEYDOWN) and (msg.wParam = 13);
    end).Start;
  ...
end;


Но получилось так, что теперь этот код в этом месте ждёт нажатия энтер в отдельном потоке, а цикл то конечно продолжается!
Я не понимаю как здесь использовать потоки, пожалуйста подскажи
...
Рейтинг: 0 / 0
09.03.2019, 13:03
    #39784046
logone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
white_nigger,

Не хочу я этих флагов! Это всегда посредственное решение! Я хочу научиться писать нормально!
...
Рейтинг: 0 / 0
09.03.2019, 13:43
    #39784053
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
logone,

о каком цикле ты пишешь? Что должно остановиться?
...
Рейтинг: 0 / 0
09.03.2019, 14:12
    #39784058
logone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
s62,

Цикл
Код: pascal
1.
while ... do


А остановиться должен цикл до тех пор пока не будет нажата клавиша ентер
...
Рейтинг: 0 / 0
09.03.2019, 17:36
    #39784091
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
logonewhite_nigger,

Не хочу я этих флагов! Это всегда посредственное решение! Я хочу научиться писать нормально!
Правильное решение это использование флагов и OnKeyPress. А использование подобного цикла как раз решение уровня даже не студента, а школьника.
...
Рейтинг: 0 / 0
09.03.2019, 17:56
    #39784094
logone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
Vizit0r,

Пожалуйста, если ты тут будешь, то предложи
...
Рейтинг: 0 / 0
09.03.2019, 18:26
    #39784103
Ghost Writer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
logoneвозможность двигать форму и писать в edit?добавление пары строчек это решает. но зачем так делать?
хочешь как в консольном приложении readln. если требуется подтверждение дальнейших действий, то может проще MessageBox вывести. он также приостановит цикл и закрыть его можно тоже нажатием Enter
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
procedure WaitEnter;
var
  msg: tagMSG;
begin
  repeat
    GetMessage(msg, 0, 0, 0);
    TranslateMessage(msg);
    DispatchMessage(msg);
  until (msg.message = WM_KEYDOWN) and (msg.wParam = 13);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  N: Integer;
begin
  N := 0;
  while True do
  begin
    WaitEnter;
    Inc(N);
    Caption := IntToStr(N);
  end;
end;
...
Рейтинг: 0 / 0
09.03.2019, 19:18
    #39784111
logone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
Спасибо!
Семён, ты был прав, я просто впервые увидел эти функции, поискал, почитал про них, и не понял
Ghost Writer, а только сейчас понял смысл!
Спасибо вам!
...
Рейтинг: 0 / 0
09.03.2019, 21:25
    #39784167
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
logone,

[spoiler] Поздравля вас соврамши!
YouTube Video
...
Рейтинг: 0 / 0
09.03.2019, 23:43
    #39784188
logone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
Gator,
После тестов, было понято что
Если в этот момент (когда мы в функции WaitEnter) выполнится другой обработчик события -
Допустим вы по Esc закроете форму в этот момент
И переключитесь на другую форму
Функция WaitEnter останется работать и ждать ентера, и когда будет нажат энтер цикл продолжит работу!

Чтобы этого не было
Нужно будет написать что то типа:
Код: pascal
1.
var STOP: boolean;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure WaitEnter;
var
  msg: tagMSG;
begin
  repeat
    GetMessage(msg, 0, 0, 0);
    TranslateMessage(msg);
    DispatchMessage(msg);
    if msg.wParam = 27 then 
    begin
      STOP := true; 
      break;
    end;
  until (msg.message = WM_KEYDOWN) and (msg.wParam = 13);
end;



Потом мы попадём обратно в цикл и там тоже должны будем написать:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
while True do
begin
  WaitEnter;
  if STOP then break; (или Exit)
  Inc(N);
  Caption := IntToStr(N);
end;



Не используйте это никогда!
Вместо цикла вызовите функцию, которая сделает то что надо
А после этого в конце обработчика событий OnKeyPress вызовите снова эту же функцию
Имитатор итераций готов
...
Рейтинг: 0 / 0
09.03.2019, 23:58
    #39784191
logone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
пысы: Тоже самое касается и флагов с процесс мессаджем!
...
Рейтинг: 0 / 0
10.03.2019, 00:28
    #39784197
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
logoneУ меня есть функция в которой происходит ожидания нажатия enter:
Выбросьте её нафиг и никогда не пишите такую хрень. Потом сформулируйте, какую задачу Вы пытаетесь решить её с помощью и спросите, как решать её адекватно.
...
Рейтинг: 0 / 0
10.03.2019, 17:28
    #39784286
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
Писать как в DOSе он хочет, ИМХО.
...
Рейтинг: 0 / 0
10.03.2019, 17:45
    #39784289
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
bk0010Писать как в DOSе он хочет, ИМХО.+1
...
Рейтинг: 0 / 0
11.03.2019, 11:34
    #39784398
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
а вот зря лажаете человека

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

т.е. с введением событийно-ориентированного похода мы потеряли очень ёмкий пласт подходов к разработке и сами себе создаём проблемы на ровном месте

logone, правильный цикл для VCL вот такой:
Код: pascal
1.
2.
3.
4.
5.
  repeat
    Application.HandleMessage();
    if (Application.Terminated) then
      Abort();
  until ЕслиСвершилось;
...
Рейтинг: 0 / 0
11.03.2019, 11:46
    #39784401
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
kealon(Ruslan)т.е. с введением событийно-ориентированного похода мы потеряли очень ёмкий пласт подходов к разработке
С введением любой хорошей и прогрессивной технологии проходит какое-то время, люди забывают как хреново было до неё (плюс вырастают те, кто этого просто не застал) и начинается эдакое романтическое отношение к прошлому: мол, сейчас вот такие недостатки, а тогда было хорошо (забывая, что тогда были недостатки в десять раз больше).

Если очень грубо, то до введения событийно-ориентированного подхода автор и думать бы не стал о том, что пока система ждёт нажатия Enter - в ней можно "двигать окна и писать в edit". А если бы задумался - ему бы квалификации не хватило даже начать это реализовывать. Событийно-ориентированный подход дал ему возможность замахнуться на то, на что он раньше и претендовать не смел - но не отменил необходимость думать головой и не дал возможности писать полную хрень и надеяться на вменяемый результат.
...
Рейтинг: 0 / 0
11.03.2019, 12:08
    #39784406
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
softwarer,

не надо уходить в крайности
это никак не запрещает попутно обрабатывать любые нужные в данный конкретный момент события

он позволяет интуитивно понятно описывать "сценарий действий"

в C# используют и никто не страдает :-)

PS: фанатичный вгляд на идеологию очень часто закрывает нам красивые и элегантные решения
...
Рейтинг: 0 / 0
11.03.2019, 12:11
    #39784408
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разморозить форму
logoneVizit0r,

Я попробовал потоками
Я тоже сначала подумал, что мне нужно просто чтобы эта функция выполнялась в отдельном потоке
Я сделал так -
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
while ... do
  ...
  TThread.CreateAnonymousThread(
    procedure
    var
      msg: tagMSG;
    begin
      repeat
        PeekMessage(msg, 0, 0, 0);
      until (msg.message = WM_KEYDOWN) and (msg.wParam = 13);
    end).Start;
  ...
end;


Но получилось так, что теперь этот код в этом месте ждёт нажатия энтер в отдельном потоке, а цикл то конечно продолжается!
Я не понимаю как здесь использовать потоки, пожалуйста подскажи
Вам нужно весь цикл засунуть в поток, а не ожидание нажатия на Enter. И при наступлении момента, когда нужно получить от главного потока разрешение на продолжение, начать процесс синхронизации с главным потоком, послать сообщение главному потоку (к примеру) и ждать. Ожидание можно сделать через Event, к примеру.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Разморозить форму / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]