Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Разморозить форму  [new]
logone
Member

Откуда:
Сообщений: 25
Привет всем
У меня есть функция в которой происходит ожидания нажатия enter:
procedure WaitEnter;
var
  msg: tagMSG;
begin
  repeat
    GetMessage(msg, 0, 0, 0);
  until (msg.message = WM_KEYDOWN) and (msg.wParam = 13);
end;


Она вызывается в цикле:
while ... do
  ...
  WaitEnter;
  ...
end;

Когда она выполняется, как мне получить возможность двигать форму и писать в edit?
8 мар 19, 20:57    [21828132]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 671
а чем главный цикл обработки сообщений не подходит ?
он всем этим и занимается
и обработчик OnKeyPress замечательно отловит нажатие Enter без всякой бесовщины
8 мар 19, 21:41    [21828155]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6403
Взгляните на код этой процедуры

[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]
8 мар 19, 22:51    [21828186]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6403
Сорри, лишнее удалил.



procedure MyProcessMessages();
var
   lpMsg    : TMsg;
begin
   while PeekMessage(lpMsg,0,0,0,PM_REMOVE) do
   begin
      TranslateMessage(lpMsg);
      DispatchMessage(lpMsg);
   end;
end;
8 мар 19, 22:52    [21828187]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
logone
Member

Откуда:
Сообщений: 25
krapotkin,

Мне нужно чтобы до того, пока не будет нажата клавиша ентер цикл дальше не шёл!
9 мар 19, 00:25    [21828210]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
Vizit0r
Member

Откуда:
Сообщений: 596
logone
krapotkin,

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


потоки не предлагать, как я понимаю?
9 мар 19, 08:03    [21828266]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2061
Здесь потоки нафик не сдались - не тот уровень ТС, судя по вопросу. Достаточно флага и ProcessMessages
9 мар 19, 13:00    [21828353]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
logone
Member

Откуда:
Сообщений: 25
Vizit0r,

Я попробовал потоками
Я тоже сначала подумал, что мне нужно просто чтобы эта функция выполнялась в отдельном потоке
Я сделал так -
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;

Но получилось так, что теперь этот код в этом месте ждёт нажатия энтер в отдельном потоке, а цикл то конечно продолжается!
Я не понимаю как здесь использовать потоки, пожалуйста подскажи
9 мар 19, 13:01    [21828355]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
logone
Member

Откуда:
Сообщений: 25
white_nigger,

Не хочу я этих флагов! Это всегда посредственное решение! Я хочу научиться писать нормально!
9 мар 19, 13:03    [21828356]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
s62
Member

Откуда: Жуковский
Сообщений: 916
logone,

о каком цикле ты пишешь? Что должно остановиться?
9 мар 19, 13:43    [21828372]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
logone
Member

Откуда:
Сообщений: 25
s62,

Цикл
while ... do

А остановиться должен цикл до тех пор пока не будет нажата клавиша ентер
9 мар 19, 14:12    [21828380]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 459
logone
white_nigger,

Не хочу я этих флагов! Это всегда посредственное решение! Я хочу научиться писать нормально!

Правильное решение это использование флагов и OnKeyPress. А использование подобного цикла как раз решение уровня даже не студента, а школьника.
9 мар 19, 17:36    [21828434]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
logone
Member

Откуда:
Сообщений: 25
Vizit0r,

Пожалуйста, если ты тут будешь, то предложи
9 мар 19, 17:56    [21828440]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 780
logone
возможность двигать форму и писать в edit?
добавление пары строчек это решает. но зачем так делать?
хочешь как в консольном приложении readln. если требуется подтверждение дальнейших действий, то может проще MessageBox вывести. он также приостановит цикл и закрыть его можно тоже нажатием Enter
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;
9 мар 19, 18:26    [21828450]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
logone
Member

Откуда:
Сообщений: 25
Спасибо!
Семён, ты был прав, я просто впервые увидел эти функции, поискал, почитал про них, и не понял
Ghost Writer, а только сейчас понял смысл!
Спасибо вам!
9 мар 19, 19:18    [21828459]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
Gator
Member

Откуда: Москва
Сообщений: 14212
logone,

+ Поздравля вас соврамши!


21828187 было вчера.

Тебе флаг предлагали установить, хоть красный, хоть белый. А ты отказался. Подумаешь, в цикле проверять взведённый флаг... Рано тебе до работы с потоками, сообщениями. Потом ты захочешь что-нибудь нажать в чужом приложении, чтоб "разморозить форму", и продукты в соседнем холодильнике стухнут увы.
+ No drugs!


Ссылка на позицию в клипе: https://youtu.be/OH6P87QmXtE?t=260

9 мар 19, 21:25    [21828535]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
logone
Member

Откуда:
Сообщений: 25
Gator,
После тестов, было понято что
Если в этот момент (когда мы в функции WaitEnter) выполнится другой обработчик события -
Допустим вы по Esc закроете форму в этот момент
И переключитесь на другую форму
Функция WaitEnter останется работать и ждать ентера, и когда будет нажат энтер цикл продолжит работу!

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


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;


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

while True do
begin
  WaitEnter;
  if STOP then break; (или Exit)
  Inc(N);
  Caption := IntToStr(N);
end;


Не используйте это никогда!
Вместо цикла вызовите функцию, которая сделает то что надо
А после этого в конце обработчика событий OnKeyPress вызовите снова эту же функцию
Имитатор итераций готов
9 мар 19, 23:43    [21828577]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
logone
Member

Откуда:
Сообщений: 25
пысы: Тоже самое касается и флагов с процесс мессаджем!
9 мар 19, 23:58    [21828580]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 56614
Блог
logone
У меня есть функция в которой происходит ожидания нажатия enter:

Выбросьте её нафиг и никогда не пишите такую хрень. Потом сформулируйте, какую задачу Вы пытаетесь решить её с помощью и спросите, как решать её адекватно.
10 мар 19, 00:28    [21828587]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
bk0010
Member

Откуда:
Сообщений: 4775
Писать как в DOSе он хочет, ИМХО.
10 мар 19, 17:28    [21828741]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 459
bk0010
Писать как в DOSе он хочет, ИМХО.
+1
10 мар 19, 17:45    [21828748]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4481
а вот зря лажаете человека

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

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

logone, правильный цикл для VCL вот такой:
  repeat
    Application.HandleMessage();
    if (Application.Terminated) then
      Abort();
  until ЕслиСвершилось;
11 мар 19, 11:34    [21828974]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 56614
Блог
kealon(Ruslan)
т.е. с введением событийно-ориентированного похода мы потеряли очень ёмкий пласт подходов к разработке

С введением любой хорошей и прогрессивной технологии проходит какое-то время, люди забывают как хреново было до неё (плюс вырастают те, кто этого просто не застал) и начинается эдакое романтическое отношение к прошлому: мол, сейчас вот такие недостатки, а тогда было хорошо (забывая, что тогда были недостатки в десять раз больше).

Если очень грубо, то до введения событийно-ориентированного подхода автор и думать бы не стал о том, что пока система ждёт нажатия Enter - в ней можно "двигать окна и писать в edit". А если бы задумался - ему бы квалификации не хватило даже начать это реализовывать. Событийно-ориентированный подход дал ему возможность замахнуться на то, на что он раньше и претендовать не смел - но не отменил необходимость думать головой и не дал возможности писать полную хрень и надеяться на вменяемый результат.
11 мар 19, 11:46    [21828985]     Ответить | Цитировать Сообщить модератору
 Re: Разморозить форму  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4481
softwarer,

не надо уходить в крайности
  • это никак не запрещает попутно обрабатывать любые нужные в данный конкретный момент события
  • он позволяет интуитивно понятно описывать "сценарий действий"
  • в C# используют и никто не страдает :-)

    PS: фанатичный вгляд на идеологию очень часто закрывает нам красивые и элегантные решения
  • 11 мар 19, 12:08    [21829003]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    goldmi45
    Member

    Откуда:
    Сообщений: 1132
    logone
    Vizit0r,

    Я попробовал потоками
    Я тоже сначала подумал, что мне нужно просто чтобы эта функция выполнялась в отдельном потоке
    Я сделал так -
    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, к примеру.
    11 мар 19, 12:11    [21829007]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Delphi Ответить