Запуск второго цикла сообщений в одном потоке не является допустимой операцией - PullRequest
0 голосов
/ 04 января 2012

Я пытаюсь переопределить метод "wndProc" для моей winform. Так что я могу реализовать свой собственный метод wndproc для конкретных сообщений. Я могу успешно сделать это. Однако теперь я сталкиваюсь с другой проблемой, которую я никогда раньше не видел.

После успешной компиляции я запустил программу, и она выдала следующее сообщение об ошибке: «Запуск второго цикла сообщений в одном потоке недопустима. Используйте взамен Form.ShowDialog.»

Мой переопределенный метод winproc под спецификатором защищенного доступа:

method WndProc(var m:Message); override;

Мое определение метода winproc следующее:

method MainForm.WndProc(var m: Message);
const WM_NCLBUTTONDOWN = 161;
const WM_SYSCOMMAND = 274;
const HTCAPTION = 2;
const SC_MOVE = 61456;
begin
    if ((m.Msg = WM_SYSCOMMAND) and (m.WParam.ToInt32 = SC_MOVE)) then
    begin
        exit;
    end;

    if ((m.Msg = WM_NCLBUTTONDOWN) and (m.WParam.ToInt32 = HTCAPTION)) then
    begin
        exit;
    end;
end;

Ошибка возникает в файле program.pas:

[STAThread]
class method Program.Main(args: array of string);
begin
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.ThreadException += OnThreadException;
  using lMainForm := new MainForm do
    Application.Run(lMainForm); < --------Raised here.
end;

Как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 04 января 2012

Вам не нужно переопределять WndProc, и вы действительно не хотите этого делать из-за проблемы, с которой вы столкнулись. Все, что вам нужно сделать, это создать процедуру, которая обрабатывает конкретное сообщение, которое вы хотите, чтобы он обрабатывал, и pass объявить его как обработчик сообщений, как это:

procedure HandleSysCommand(var Msg: TWMSysCommand) ; message WM_SYSCOMMAND;

«Сообщение WM_SYSCOMMAND» - это то, что сообщает вашему приложению, какое сообщение Windows вы обрабатываете, и вы можете использовать его для перехвата любого стандартного или пользовательского сообщения. Для получения дополнительной и более подробной информации довольно просто выполнить поиск для «Delphi Handle Windows Messages», чтобы получить обратно все, что вам нужно, чтобы позаботиться обо всех ваших потребностях в обмене сообщениями.

0 голосов
/ 04 января 2012

Как намекнул HansPassant, я включил базовый класс wndproc, и он работает.

В Delphi-Prism мы делаем это.

наследуется WndProc (var m);

То же, что и base.wndproc (м);

...