小编Bri*_*ost的帖子

有没有更好的方法向TMemo添加几个字符?

我正在使用TMemo来保存从串口接收的字符以供查看.他们到达时我正在做:

Memo1.Text := Memo1.Text + sReceivedChars;
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我认为这是相当低效的,必须在连接我的几个字符然后再写回来之前获取现有文本.我真的很喜欢'SendChars()'函数或类似的东西.是否有更好的方法可以在现有文本的末尾添加几个字符?

delphi character tmemo

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

如何创建包含多个可以移动/调整大小并显示激活的“子”表单的delphi表单

我创建了一个托管一个或多个“子”表单的表单。在我的编辑模式下,每个子窗体都会显示其边框和标题栏,允许其移动和调整大小(有点像旧的 MDI 应用程序)。在我的编辑模式之外,边框消失,子表单固定在适当的位置。对于我的简单演示,我正在创建子表单:

procedure TForm1.Button1Click(Sender: TObject);
var
  Frm : TForm;
begin
  Frm := TForm3.Create( Self );
  Frm.Parent := Self;
  Frm.Visible := True;
Run Code Online (Sandbox Code Playgroud)

结果是这样的布局: 布局

我注意到子窗体中的编辑控件从未处于活动状态。我想让“点击”表单显示活动标题栏颜色,就像活动应用程序在单击时四处移动一样。我认为子表单的“尸体”行为是因为它们处于非活动状态,但尝试执行诸如 ChildForm.SetFocus 之类的操作却无济于事。

我需要做什么才能使这些编辑控件处于活动状态并将其中一个表单显示为“已选择”?

(如果可能的话,我真的很想“选择”不止一种表格)

forms delphi parent

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

使用StrUtils'SearchBuf'的奇怪行为

我正在整理过去使用FastStrings的旧代码,并且我已经实现了我的'PosAnyCase'的旧例程,它应该像'Pos'一样操作.(我希望SearchBuf比在两个字符串上调用UpperCase更好).

function PosAnyCase( const AFindStr, AStr : string ) : integer;
// Returns the position of this substring within a string ignoring case
Run Code Online (Sandbox Code Playgroud)

我正在使用SearchBuf如下:

function PosAnyCase( const AFindStr, AStr : string ) : integer;
// Returns the position of this substring within a string ignoring case
var
  Start, ResultPos : PChar;
begin
  Start := PChar( AStr );

  ResultPos := SearchBuf(
    Start, ByteLength( AStr ),
    0, 0,
    AFindStr, [soDown] );

  if ResultPos = nil then
    Result := 0
   else
    Result := …
Run Code Online (Sandbox Code Playgroud)

delphi

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

是否可以完全重新安装Delphi XE2(例如更新#4),同时保留现有的组件库注册?

我即将安装Delphi Xe2更新#4 - 这是一个完整的重新安装 - 我担心重新安装所有组件库所花费的时间.现在有一个技巧可以保留这些吗?在过去,有必要通过随之而来的许可障碍来完成并重新安装每一个.

delphi components delphi-xe2

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

是否可以在Delphi的TButtonedEdit中添加历史列表下拉列表?

我正在使用Delphi XE2的TButtonedEdit,但我想为历史记录添加一个下拉列表(如TComboBox).我知道TComboBox是一个美化的TEdit,所以我可以发送一条消息给TButtonedEdit来添加这个功能吗?谢谢.

delphi delphi-xe2 tbuttonededit tcombobox

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

为什么我的Delphi TCanvas.DrawLine在Android上运行时不会出现

我有一个非常简单的FireMonkey应用程序,其中包含单个表单和OnPaint事件中的以下代码.当我使用Windows目标运行它时,我看到一条红线和一个红色方块.当我在Android Nexus 7上运行时,只显示正方形.我必须做些傻事,但它可能是什么?

谢谢你的帮助.

procedure TForm2.FormPaint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
    Canvas.Stroke.Color := claRed;
    Canvas.Fill.Color := claRed;

    Canvas.Stroke.Thickness := 3;

    Canvas.DrawLine( PointF( 0, 0 ), PointF( 200, 200 ), 1.0 );

    Canvas.FillRect( RectF( 300, 300, 500, 500 ), 0.0, 0.0, [], 1.0  );
end;
Run Code Online (Sandbox Code Playgroud)

delphi android firemonkey delphi-xe5

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

如何自动将焦点恢复到我的应用程序

我正在为我的应用设置一个简单的"启动菜单",其中(有经验的)用户可以选中或取消选中各种运行选项.启动菜单是一个简单的无边框形式,以模态和方式显示

  • 退出按钮
  • 继续按钮,以及
  • 启动选项复选框

我显示这个启动选项对话框,因为我正在启动我的应用程序,如果用户持有F8键 - 我发现Windows不使用F8,所以你可以实际按住F8,同时点击我的exe和我的启动的快捷方式对话框打开.这是探针.

我的表单不会成为活动的应用程序 - 而是托管我单击的快捷方式的资源管理器窗口.如果我单击我的表单(启动对话框),它将获得焦点.如何让我的启动对话框从'拉'窗口聚焦到它?

forms delphi focus modal-dialog

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

窗口框架中所需的WM_NCLBUTTONUP不会触发.请问最简单的Delphi修复方法是什么?

当使用停止改变窗口的大小时,我需要触发一个事件,即通过释放框架上的鼠标.我已经尝试了WM_NCLBUTTONUP,但这并没有开火 - 我认为因为有很多关于它不起作用的抱怨.有没有人得到一个如何解决这个问题的例子?我只需要知道调整大小何时结束.谢谢

delphi message resize frame

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

在Delphi XE2中,对鼠标滚轮功能的建议支持是什么?

我正在尝试整理我的代码,因为Delphi XE2可用 - 我的代码可以追溯到Borland Pascal 7所以有很多'老'(但工作!)Win32技术,我自然也考虑到了平台独立性.在此之前已经提出了对鼠标滚轮的支持,其中有几个先前的问题1 23.与其中一些答案一样,我自己的解决方案是使用TApplicationEvents组件进行简单的鼠标消息拦截:

  procedure TForm6.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);

  procedure ProcessMouseWheelMessage;
  begin
    Msg.message := WM_KEYDOWN;

    Msg.lParam := 0;

    If Integer(Msg.wParam) > 0 then
      Msg.wParam := VK_UP
    else
      Msg.wParam := VK_DOWN;

    Handled := False;
  end;

begin
  Case Msg.message of
    WM_MOUSEWHEEL :
      ProcessMouseWheelMessage;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我今天重新访问了这段代码,因为'Msg.wParam'现在是NativeInt,在上面的代码中使用了负的Msg.wParam值,除非你使用Integer(Msg.wParam).它让我注意到我没有看到任何真正明确使用鼠标滚轮的Delphi代码 - 当所有鼠标现在都有轮子并且Delphi再次处于'前沿'时可怕!我本来期望一个属性,一个组件或一些其他更"暴露"的解决方案,以及Fire Monkey车轮支持怎么样?

我是继续使用我的解决方案还是有更好的方法?

delphi mousewheel delphi-xe2

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

我可以将Delphi TThread.Synchronize()本地移动到VCL表单以从主线程或工作线程调用吗?

我正在使用CreateAnonymousThread作为工作任务,当我开始使用它时,我在整个声明中使用了Synchronize,根据文档示例,例如:

procedure Txxx.RunWorker;
begin
     FExecutionThread := TThread.CreateAnonymousThread(procedure ()
     begin

        TThread.Synchronize (TThread.CurrentThread,
          procedure ()
          begin
            // Here before worker stuff
            NotifyBeforeWorkerStuff; 

          end);

        // Do worker stuff

        TThread.Synchronize (TThread.CurrentThread,
          procedure ()
          begin
            // Here after worker stuff
            NotifyAfterWorkerStuff;
          end);
      end);

      FExecutionThread.Start;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

如您所见,在此线程中,我向我的应用程序的各个部分启动事件通知,包括VCL表单(NotifyBeforeWorkerStuff等).后来,我看到我可以将Synchronize()更多地本地移动到每个VCL表单,接近实际需要它更新(非安全)VCL控件的点:

    procedure TSomeVCLForm.ReceiveNotification;
    begin
      TThread.Synchronize (TThread.CurrentThread,
          procedure ()
          begin
            Label1.Caption := GetSomeStringFunction;
          end);
     end;
Run Code Online (Sandbox Code Playgroud)

只要我接收来自主线程或工作线程的通知,工作线程就会变得更简单:

   procedure Txxx.RunWorker;
   begin
     FExecutionThread := TThread.CreateAnonymousThread(procedure ()
       begin

         NotifyBeforeWorkerStuff; 

         // Do worker stuff

         NotifyAfterWorkerStuff;

       end);

     FExecutionThread.Start;
   end;
Run Code Online (Sandbox Code Playgroud)

关于这是否正确,我有几个问题:

  1. 我的通知可能来自工作线程,也来自主线程(例如,从按下按钮导出).因此,当从主线程调用VCL表单上的"ReceiveNotification"时,是否允许如上所述调用TThread.Synchronize?在该XE8文档意味着没有了,但是检查System.Classes这看起来不错,它工作正常.
  2. 当Label1.Caption从GetSomeStringFunction中获取字符串时,在"ReceiveNotification"内,是否正确,即使调用来自工作线程,也绝对不需要在该函数中进行锁定?

谢谢你的建议.

delphi multithreading anonymous-methods thread-safety

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