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

Откуда:
Сообщений: 21
Привет всем
У меня есть функция в которой происходит ожидания нажатия 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

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

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

[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
Сообщений: 6349
Сорри, лишнее удалил.



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

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

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

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

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


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

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

Откуда:
Сообщений: 21
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

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

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

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

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

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

Цикл
while ... do

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

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

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

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

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

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

Откуда: Россия
Сообщений: 778
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

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

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

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


21828187 было вчера.

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


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

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

Откуда:
Сообщений: 21
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Откуда:
    Сообщений: 1115
    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]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    Arioch
    Member

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


    нет конечно. Никто ничего не терял.

    пишите консольное приложение без всяких там некошерных PeekMessage, разве кто запрещает?

    или Direct-3D приложение
    11 мар 19, 12:39    [21829027]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    kealon(Ruslan)
    Member

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

    конечно, зачем пользователю формочка :-)
    только консоль...
    11 мар 19, 13:13    [21829080]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    bk0010
    Member

    Откуда:
    Сообщений: 4736
    softwarer
    Если очень грубо, то до введения событийно-ориентированного подхода автор и думать бы не стал о том, что пока система ждёт нажатия Enter - в ней можно "двигать окна и писать в edit".
    Ну почему же, в Clipper-е, помнится, с помощью @ say @ get read и menu to создавали формочки типа виндовых (писать в edit, нажимать кнопочки, окна были редкостью, в основном в turbo vision - разрешение 80x25 не способствовало), но с жестким следованием кода. Вот народ при переходе и мучился. Но пока писал эмулятор этого подхода под Windows, привыкал к event-driven programming.
    11 мар 19, 14:05    [21829181]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    _Vasilisk_
    Member

    Откуда: Украина, Харьков
    Сообщений: 10771
    bk0010
    в turbo vision - разрешение 80x25 не способствовало), но с жестким следованием кода
    В Turbo Vision уже была событийная модель
    11 мар 19, 18:04    [21829570]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    80x50

    или даже 120xNN

    когда появился Turbo Vision уже давно CGA и MDA стали историей
    11 мар 19, 18:14    [21829591]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    kealon(Ruslan)
    конечно, зачем пользователю формочка :-)
    только консоль...


    то есть ты говоришь, что "потерянный ёмкий пласт" пользователю не нужен???

    а почему тебя это волнует? пусть жрёт что дают!


    bk0010
    Ну почему же, в Clipper-е, помнится, с помощью @ say @ get read и menu to создавали формочки типа виндовых


    точне, в dBASE, а Клиппер - это клон клона.
    да и сам dBase скорее всего взял это с мейнфреймов, видел я как в туристических фирмах авиа-билеты продавали в 2000-x - чуть ли на BBS-интерфейс, хотя и по интернету.

    .....а для виндовых это можно сделать, как цепочку модальных окон
    11 мар 19, 18:17    [21829599]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    ещё вариант - старые добрые Мастера/Wizards
    11 мар 19, 18:18    [21829602]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4229
    Arioch
    то есть ты говоришь, что "потерянный ёмкий пласт" пользователю не нужен???
    а почему тебя это волнует? пусть жрёт что дают!
  • это ты так сказал - 21829027
  • наверное потому что я за это деньги получаю, пусть не напрямую, но ...
  • 11 мар 19, 19:23    [21829671]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    kealon(Ruslan),

    я сказал, что никто "ёмкий пласт" не терял, что он как был - так и остался, весь целиком, на 100% - бери и пользуйся

    про пользователя я вообще ни слова не говорил, пока ты не начал 21829080

    и именно ты сказал, что "ёмким пластом" ты пользоваться не хочешь, потому что пользователям это не нравится

    можешь, но не хочешь

    т.е. ничего не потеряно, как я с самог оначала и говорил
    11 мар 19, 19:38    [21829679]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    > когда в программе нужна сценарная логика

    на вскидку:

    * банкоматы
    * голосовое меню в телефонах, "если вы ъхотите сварить кофе - нажмите 1"
    * USSD

    "пласт потерян"? да нет, живее всех живых
    11 мар 19, 20:16    [21829719]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4229
    Arioch
    kealon(Ruslan),

    я сказал, что никто "ёмкий пласт" не терял, что он как был - так и остался, весь целиком, на 100% - бери и пользуйся

    про пользователя я вообще ни слова не говорил, пока ты не начал 21829080

    в литературе этот приём называется Гротеск
    11 мар 19, 20:25    [21829730]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    kealon(Ruslan),

    так ты тут литературу пишешь? я думал ты на технический форум пришёл.
    12 мар 19, 13:12    [21830189]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4229
    Arioch
    kealon(Ruslan),

    так ты тут литературу пишешь? я думал ты на технический форум пришёл.
    этот литературный приём использован, что бы показать абсурдность
    Arioch
    пишите консольное приложение без всяких там некошерных PeekMessage, разве кто запрещает?
    а не решить проблему

    "пусть едят пирожные.." (С)...
    12 мар 19, 15:07    [21830349]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    kealon(Ruslan)
    "пусть едят пирожные.." (С)...


    Хороший пример. На редкость уместный.

    Эта фраза во-первых не была сказана Антуанеттой, во вторых вероятнее всего была не фразой, а королевским указом, причём очень полезным для бедняков.
    Т.е. использование этой фразы в обычном смысле - передёргивание карт.


    Теперь возвращаемся к якобы существующей проблеме:
    kealon(Ruslan)
    мы потеряли очень ёмкий пласт подходов к разработке


    В очередной раз повторяю, в озвученнйо проблеме речь про "потеряли" и про "мы, программисты"

    kealon(Ruslan)
    конечно, зачем пользователю формочка :-)


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

    Что пользователи некоторых программистов (а не сами программисты) могут, но не хотят (а вовсе не "хотят, но не могут" = "потеряли") "использовать пласт".

    Arioch
    а почему тебя это волнует? пусть жрёт что дают!


    А вот тут был "литературный приём" - сарказм.
    С целью подчеркнуть передёргивание.
    Помочь тебе начать много и часто говорить о том, что вообще НЕ ЯВЛЯЕТСЯ частью озвученной проблеммы "программисты потеряли пласты", а появилось только при подмене изначальной проблемы на постороннюю.
    12 мар 19, 18:02    [21830610]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    kealon(Ruslan)
    Member

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

    даже и не знаю зачем программистам интересно как делать программы проще и надёжнее, вообще нелогичные создания - сами себе вакансии уменьшают
    12 мар 19, 19:32    [21830661]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    а это уже ТРЕТЬЯ проблема, не связанная ни с одной из двух предыдущих

    P.S. ....и эти люди говорят за литературу.
    kealon(Ruslan)
    зачем программистам интересно
    12 мар 19, 20:04    [21830691]     Ответить | Цитировать Сообщить модератору
     Re: Разморозить форму  [new]
    loww
    Member

    Откуда:
    Сообщений: 4
    А остановиться должен цикл до тех пор пока не будет нажата клавиша ентер

    Т.е. цикл состоит из двух частей? До нажатия и после. Создаем поток выполняем до, на нажатие Enter поднимаем событие (event), в потоке ждем событие с помощью WaitForSingleObject и выполняем после. Синхронизацию через Synchronize или просто Send/PostMessage.
    13 мар 19, 03:47    [21830892]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2      [все]
    Все форумы / Delphi Ответить