我有一个定期写入本地磁盘文件的Delphi应用程序.有时它无法访问该文件 - 尝试打开时会导致共享冲突.短暂延迟后重试就是所需要的,但是当它发生时,我想报告阻止访问的进程.
当我的程序发生共享冲突以枚举正在使用的所有文件句柄时,是否可行,检查文件名,如果它与我的数据文件的名称匹配,则检索与该句柄关联的进程名称?
一些示例代码会很好.
我正在为Delphi寻找一个好的免费脚本引擎.我想为应用程序添加脚本,以便我可以编写小的测试脚本.具体来说我需要:
我不需要全面的语言支持,只需要基础知识.我看到了这个:https://stackoverflow.com/questions/226135/scripting-library-for-delphi但是我假设事情已经发生了一些变化.
我想要做的就是在我的程序中添加一个备忘录组件,并在运行时向备忘录添加一个源代码片段,然后单击一个go按钮.我希望脚本能够访问我的应用程序的变量和函数.
实现这一目标的最简单方法是什么?示例程序如下.
program Project31;
uses
Forms,
Unit36 in 'Unit36.pas' {Form36};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm36, Form36);
Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)
.
unit Unit36;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm36 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form36: TForm36;
implementation
{$R *.dfm}
procedure RoutineInMyApplication ;
begin
ShowMessage ('Hello from my Application') …
Run Code Online (Sandbox Code Playgroud) 我有一个Delphi 2006应用程序,可以最小化到托盘图标,并通过托盘图标上的气球提示显示各种警报消息.
在某些情况下 - 我不知道什么时候 - 之前显示的气球提示不断弹出并且不会消失.它显示编程的时间长度,关闭,然后立即重新出现.
它始终是这个应用程序的气球提示.
如果应用程序显示另一个气球提示,那个显示编程时间,那么幻像提示将重新开始.
就好像提示卡在某个队列中并且不会被删除.没有任何人有一些灵感(我意识到这是一个长镜头......),有没有人知道如何清除气球提示?
我有许多线程(100),每次执行几秒钟.当它们执行时,它们花费大量时间等待来自另一个系统(串行设备)的响应.我注意到一次执行100个线程可能是资源占用,所以我实际上限制了任何时候都可以启动的线程数.
虽然在线程中等待外部事件必须有好的和坏的方法,但我想到了这一点.这种方法是CPU密集型的吗?:
send command ;
repeat
until response arrived ;
process response ;
Run Code Online (Sandbox Code Playgroud)
这种方法是否会提高效率?:
send command ;
repeat
Sleep (20) ;
until response arrived ;
process response ;
Run Code Online (Sandbox Code Playgroud)
*附加信息*
环境是x86 Windows XP.线程代码是一个长期的和涉及一系列与串行设备,但在一般的相互作用,它由写入字符到COM端口(使用AsyncFree串行库)并等待字符由驻留在传入字符缓冲器被返回的和他们到达时处理它们.我想这个串行库会让设备读写.只要在线程的时间可以是一分钟,或短则几秒钟,但大部分时间都花在等待字符离开港口,或等待响应字符(波特率为慢),因此我的问题是关于线程在等待时表现的最佳方式.目前我Sleep
在循环中调用等待CharactersInBuffer
变为非零,在它到达时处理每个字符,并在我有完整响应时退出线程.所以代码看起来更像(忽略超时处理等):
send command ;
Packet = '' ;
repeat
repeat
Sleep (20) ;
until response character arrived ;
build Packet
until complete packet arrived
process response ;
Run Code Online (Sandbox Code Playgroud) 我有一个delphi应用程序,它记录来自不同地方的数据并将数据写入文件.该应用程序具有相当广泛的GUI,允许显示数据,选项配置等.
一位用户已请求将应用程序更改为可以作为服务运行.他的理由是,应用程序可以在启动时启动并在没有任何用户登录的情况下运行,并且无论谁登录都可以使用.
我的问题是:是否有任何其他解决方案可以让我安装应用程序,因为它现在存在,以便它仍然可以运行,没有用户登录,仍然可供所有用户使用?
我的直觉是将应用程序转换为服务运行并非易事.我假设您需要2个应用程序 - "无头"服务应用程序,以及由用户按需运行的GUI,可以与服务进行交互(此处也欢迎评论).
当用户在模态对话框外单击时,是否可以触发事件?
好的,Windows通过发出"bonk"声音或闪烁应用程序的任务栏按钮提供了自己的线索,但我想为声音不可用的情况和/或用户提供某种额外的线索无法识别任务栏闪烁的原因.此外,我想尝试使用此方法将模式对话框置于前面,如果它已隐藏在主窗体后面.
下面的简单示例是我试图解决冲突的问题的缩写,其中我有一个与VCL成员同名的枚举类型成员.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TSomeType = (
alNone,
alSome,
alMany) ;
procedure TForm1.FormCreate(Sender: TObject);
begin
Self.Align := alNone ; // 1. type mismatch
Self.Align := Controls.alNone ; // 2. "Controls" is also a property of TForm
end ;
end.
Run Code Online (Sandbox Code Playgroud)
alNone
是我声明的那个而不是在其中TAlign
定义的成员Controls.pas …
在我的线程中,我总是"正常"声明局部变量,因此:
procedure TMyThread.Execute ;
var
i : integer ;
begin
i := 2 ;
Run Code Online (Sandbox Code Playgroud)
等等,如果我这样声明:
procedure TMyThread.Execute ;
threadvar
j : integer ;
begin
j := 2 ;
Run Code Online (Sandbox Code Playgroud)
执行/代码生成/速度/线程安全如何改变?
应该很简单,但我看不到它.
您可以找到右键单击的组件以显示弹出菜单:
PopupMenu1.PopupComponent
Run Code Online (Sandbox Code Playgroud)
但是,如何找到包含TMenuItem的弹出菜单,该菜单依次点击该菜单?
要将问题简化为示例:
我有一系列标签,每个标签都有不同的标题,我有一个弹出菜单,分配给每个标签的PopupMenu属性.
当有人右键单击其中一个标签并打开弹出菜单,然后单击MenuItem1时,我想编码:
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
MsgBox (Format ('The label right-clicked has the caption %', [xxxx.Caption ])) ;
end ;
Run Code Online (Sandbox Code Playgroud)
xxxx应该是什么?
实施答案
感谢两位受访者.我最终得到的是:
procedure TForm1.MenuItem1Click(Sender: TObject);
var
AParentMenu : TMenu ;
AComponent : TComponent ;
ALabel : TLabel ;
begin
AParentMenu := TMenuItem (Sender).GetParentMenu ;
AComponent := TPopupMenu (AParentMenu).PopupComponent ;
ALabel := TLabel (AComponent) ;
MsgBox (Format ('The label right-clicked has the caption %', [ALabel.Caption ])) ;
end ;
Run Code Online (Sandbox Code Playgroud)
它还会询问涉及哪个TMenuItem,因此给了我一段代码,我可以将其放入其他OnClick处理程序中,而不需要修改.
假设我有以下例程:
function ReadFile(f : TFilename) : Boolean;
var
fs : TFileStream;
begin
Result := False;
try
fs := TFileStream.Create(f, ...);
try
// read file ...
Result := True;
finally
FreeAndNil(fs);
end;
except
// handle exceptions ...
end;
end;
Run Code Online (Sandbox Code Playgroud)
拥有except
和finally
转置有什么含义?我已经看到了很多与他们的职位左右逢源左右,但我还没有看到一个明确的解释这是适当的在哪些情况下(我仍然认为这是奇怪的是,在上述构建,该finally
块执行后的except
块!).
我也看过帖子表明混音try..except
和try..finally
积木并不是一个好主意.如果例程在正常操作中抛出异常(例如在某些Indy例程中),你怎么能避免它呢?
delphi ×10
delphi-2006 ×4
delphi-2007 ×1
filehandle ×1
hints ×1
menuitem ×1
pascal ×1
popupmenu ×1
process ×1
remobjects ×1
right-click ×1
scope ×1
scripting ×1
service ×1
sleep ×1
thread-sleep ×1
trayicon ×1
try-except ×1
try-finally ×1
wmi ×1