相关疑难解决方法(0)

删除Delphi程序中的组件

更新

2016-02-18:添加了流程信息


我有一个使用XE4编译的Delphi程序.它被几百个客户使用.几周前,其中一位客户报告说可执行文件的某些区域在白天被随机删除(图像吼叫).此客户端有35个站点使用此exe,问题发生在不超过10个这些站点.

调查

1 - 我的第一个怀疑是无限循环.当组件被擦除时,exe保持响应,代码没有任何变化,从这个问题发生的时间开始,并且日志没有显示任何循环(这个exe在各处都有日志).

2 - 行为不端的线程.我有一个单独的线程,可以在云中同步此exe和我们的服务器之间的数据.同样,日志不会显示问题发生时线程正在运行,并且此处没有任何更改.

3 - 其他一些程序(防病毒?)正在影响我的exe.无法正确调查这个hipiquesis,但直到现在找不到任何引起我注意的安装程序.

我的问题是:可能导致此问题的原因是什么?我该如何进一步调查?我知道这可能是一个广泛的问题,但这是我可以收集的所有信息,我无法想象还有更多的地方可以看.

图片

1 - 在下图中,红色划线区域应为TToolBar

删除了TToolBar

2 - 在第二个图像中有三个区域,从顶部到底部,第一个应该是TToolBar,第二个应该是子窗体的标题,第三个应该是TwwDBGrid

菜单,标题和TwwDBGrid擦除

3 - 第三个例子在顶部显示了应该是TEdit的擦除区域,只是吼它在TwwDBGrid上应该是一条线,在侧面我们可以从TwwDBGrid看到一个擦除的滚动条

Tedit,line和scroolbar擦除

4 - 最后一个示例显示了5个擦除区域:应用程序的标题,主要的TToolBar,表单的标题,TButton和两个TwwDBGrid

在此输入图像描述

5 - 这是一个有趣的例子,因为除了擦除的组件之外,有4个TSpeedButton没有被擦除但是它们没有它们最初的图像(第一个红色描边区域).其他3个红色描边区域依次为2个TEdits,一个TwwDBGrd和一个TButton

在此输入图像描述

处理信息

我得到了一个问题发生的截图.scgolr是我的软件.

在此输入图像描述

delphi

12
推荐指数
1
解决办法
407
查看次数

消息循环是否在 UI 线程上执行?

我对 winforms 中的消息循环如何工作感到非常困惑。我正在处理 Windows 表单,我知道何时调用Application.Run(myform),因此它将创建一个消息队列和消息循环,然后显示我的表单并开始在消息队列中检索消息以进行调度。

我阅读了一些主题,但仍然不明白消息循环在幕后如何工作,UI 线程同时运行消息泵和执行代码?以及消息循环如何使用线程?

我的问题是:消息循环是否会在 UI 线程上运行。如果是,为什么它不阻塞 UI 线程?

如果问题不清楚,请告诉我,对不起,因为我的英语不好。

c# messages message-queue winforms

5
推荐指数
1
解决办法
1529
查看次数

Delphi:如何防止单个线程应用丢失响应?

我正在使用Delphi开发一个单线程应用程序,这将执行一个耗时的任务,如下所示:

// time-consuming loop
For I := 0 to 1024 * 65536 do
Begin
    DoTask();
End;
Run Code Online (Sandbox Code Playgroud)

循环启动时,应用程序将丢失对最终用户的响应.那不是很好.由于其复杂性,我也不想将其转换为多线程应用程序,因此我相应地添加了Application.ProcessMessages,

// time-consuming loop
For I := 0 to 1024 * 65536 do
Begin
DoTask();
Application.ProcessMessages;
End;
Run Code Online (Sandbox Code Playgroud)

但是,这次虽然应用程序将响应用户操作,但循环中消耗的时间远远大于原始循环,大约10倍.

有没有一种解决方案可以确保应用程序不会丢失响应而不会过多地增加消耗时间?

delphi

4
推荐指数
3
解决办法
4405
查看次数

按下按钮时德尔福停止程序

如何通过按某个按钮在执行过程中停止重复循环?程序只将一个字母写入编辑框,然后等待一段时间,按指定顺序写另一个字母等,暂停使用sysutils.sleep.

例:

procedure TForm1.Button4Click(Sender: TObject);
var
    j: integer;

begin
    edit1.Text:='a';
    edit1.Text:='a';
    sysutils.Sleep(l*20);
    edit1.Text:='b';
    edit1.text:='3';
    sysutils.sleep(l*20);
    j:= 1 ;

    repeat
        edit1.Text:='1';
        sysutils.sleep(l*2);
        edit1.Text:='0';
        edit1.text:='2';
        sysutils.sleep(l*2);
        edit1.Text:='3';
        edit1.text:='4';
        sysutils.sleep(l*2);
        edit1.Text:='5';
        sysutils.sleep(l*2);
        j:= j + 1;
    until j = 5;

end;
Run Code Online (Sandbox Code Playgroud)

我需要的是:我按下一个按钮然后写下这些字母,然后每按一下其他按钮,它就会停止程序并跳转到其他按钮程序.

我知道这是可能的,因为很多应用程序可以循环,直到你按下按钮并按下按钮时停止循环,但我不知道如何做到这一点.目前,该应用程序冻结,直到它完成循环.

delphi delphi-7

2
推荐指数
1
解决办法
3342
查看次数

调用ShowMessage时会发生什么?

我正在研究通过COM端口与另一台设备通信的项目.对于传入数据,我使用VaComm1RXchar事件,在那里我将消息存储到数组中并增加msgIndex,它表示消息数.

然后我调用我使用此消息的函数.

在这个函数内部是这个超时周期,我等待这个消息:

  while MsgIndex < 1 do
  begin
  stop := GetTickCount;
  if (stop - start)> timeout then
    begin

      MessageBox(0, 'Timeout komunikace !', 'Komunikace', MB_OK);
      exit(false);
    end;
    sleep(10);
  end;
Run Code Online (Sandbox Code Playgroud)

对我来说奇怪的是,当它像上面这样时,它总是以超时结束.但是当我在此之前放置一个ShowMessage('Waiting')然后它正确地工作.

有谁知道是什么原因造成的,我该如何解决?提前致谢!

delphi delphi-xe

2
推荐指数
1
解决办法
433
查看次数

显示异步“等待”窗口

在 Delphi VCL 应用程序中,我想在执行一个耗时的过程时创建一个“等待”消息窗口(本例中是一个大循环)。

在开始耗时的过程之前,我已经尝试了以下要执行的事情。

- 创建一个包含消息的简单窗口的新形式。

- 使用 messagedlg 创建消息。

- 甚至更改主窗体上的 TLabel.Caption (执行耗时过程的那个)。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  popUpMessage;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;

    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;
  dialog : TForm;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
    var i, j, k :LongInt;
begin


     {1}
     popUpMessage.Form2 := TForm2.Create(nil); //also tried with Create(self)
     Form2.show;

     {2}
     dialog := CreateMessageDialog ('Wait',TMsgDlgType.mtWarning, mbYesNoCancel);
     dialog.Show;


     {3}
     messagedlg('Wait',mtError, mbOKCancel, 0); …
Run Code Online (Sandbox Code Playgroud)

delphi asynchronous non-modal

1
推荐指数
1
解决办法
721
查看次数