我正在使用TMemo来保存从串口接收的字符以供查看.他们到达时我正在做:
Memo1.Text := Memo1.Text + sReceivedChars;
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我认为这是相当低效的,必须在连接我的几个字符然后再写回来之前获取现有文本.我真的很喜欢'SendChars()'函数或类似的东西.是否有更好的方法可以在现有文本的末尾添加几个字符?
我创建了一个托管一个或多个“子”表单的表单。在我的编辑模式下,每个子窗体都会显示其边框和标题栏,允许其移动和调整大小(有点像旧的 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 之类的操作却无济于事。
我需要做什么才能使这些编辑控件处于活动状态并将其中一个表单显示为“已选择”?
(如果可能的话,我真的很想“选择”不止一种表格)
我正在整理过去使用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 Xe2更新#4 - 这是一个完整的重新安装 - 我担心重新安装所有组件库所花费的时间.现在有一个技巧可以保留这些吗?在过去,有必要通过随之而来的许可障碍来完成并重新安装每一个.
我正在使用Delphi XE2的TButtonedEdit,但我想为历史记录添加一个下拉列表(如TComboBox).我知道TComboBox是一个美化的TEdit,所以我可以发送一条消息给TButtonedEdit来添加这个功能吗?谢谢.
我有一个非常简单的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) 我正在为我的应用设置一个简单的"启动菜单",其中(有经验的)用户可以选中或取消选中各种运行选项.启动菜单是一个简单的无边框形式,以模态和方式显示
我显示这个启动选项对话框,因为我正在启动我的应用程序,如果用户持有F8键 - 我发现Windows不使用F8,所以你可以实际按住F8,同时点击我的exe和我的启动的快捷方式对话框打开.这是探针.
我的表单不会成为活动的应用程序 - 而是托管我单击的快捷方式的资源管理器窗口.如果我单击我的表单(启动对话框),它将获得焦点.如何让我的启动对话框从'拉'窗口聚焦到它?
当使用停止改变窗口的大小时,我需要触发一个事件,即通过释放框架上的鼠标.我已经尝试了WM_NCLBUTTONUP,但这并没有开火 - 我认为因为有很多关于它不起作用的抱怨.有没有人得到一个如何解决这个问题的例子?我只需要知道调整大小何时结束.谢谢
我正在尝试整理我的代码,因为Delphi XE2可用 - 我的代码可以追溯到Borland Pascal 7所以有很多'老'(但工作!)Win32技术,我自然也考虑到了平台独立性.在此之前已经提出了对鼠标滚轮的支持,其中有几个先前的问题1 2和3.与其中一些答案一样,我自己的解决方案是使用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车轮支持怎么样?
我是继续使用我的解决方案还是有更好的方法?
我正在使用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)
关于这是否正确,我有几个问题:
谢谢你的建议.
delphi ×10
delphi-xe2 ×3
forms ×2
android ×1
character ×1
components ×1
delphi-xe5 ×1
firemonkey ×1
focus ×1
frame ×1
message ×1
modal-dialog ×1
mousewheel ×1
parent ×1
resize ×1
tcombobox ×1
tmemo ×1