Delphi应用程序运行

Mol*_*nik 2 delphi terminate

Application.Run过程调用一个处理Windows消息的无限循环:

  repeat
    try
      HandleMessage;
    except
      HandleException(Self);
    end;
  until Terminated;
Run Code Online (Sandbox Code Playgroud)

Terminated只能通过Application.Terminate发送PostQuitMesage的过程将该属性设置为true .我想更改消息处理循环,以便我可以使用全局变量直接停止它(不使用消息队列):

var MyTerminated:Boolean
....
  repeat
    try
      HandleMessage;
    except
      HandleException(Self);
    end;
  until Terminated or MyTerminated;
Run Code Online (Sandbox Code Playgroud)

问题是,是否可以使程序使用您自己的Application.Run版本?

Ser*_*yuz 5

"已终止"属性是只读的.然而,它是该FTerminated字段的直接吸气剂,因此Application.Terminated直接从布尔字段读取.虽然语言不允许设置Application.Terminated,但您可以使用指针在该地址处设置布尔值:

PBoolean(@Application.Terminated)^ := True;
Run Code Online (Sandbox Code Playgroud)

您也可以考虑使用Halt,它将完全通过消息循环,以获得更突然但更少hacky的解决方案.