在网上搜索了大约半个小时后,我决定寻求帮助.目前我正在使用此代码:
procedure TViewSalesActivity.btnPrintClick(Sender: TObject);
begin
with TPrintDialog.Create(nil) do
ViewSalesActivity.PrintScale:= 1.5
try
if Execute then
ViewSalesActivity.Print;
finally
Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
打印整个表单.表单包括按钮,文本,标题和编辑框等.
唯一的问题是打印输出是计算机窗口的缩放; 这太小了.它也卡在页面的左上角.有没有办法让它填满整页/大部分页面?
我使用ActivateKeyboardLayout(HKL_NEXT, KLF_ACTIVATE);Delphi XE2来加载波斯语键盘布局,但有时我点击TextBox或DbGrid控件键盘会自动更改为英文布局.
如何禁用键盘布局的自动更改?
我有一个表单,其中包含一个TWebBrower加载HTML文档的组件.HTML文档上的数据每隔几秒更新一次,有时每秒更新一次,我使用以下命令更新Delphi中的值:
DOMDocument.getElementById(elementID).innerHTML := someValue;
Run Code Online (Sandbox Code Playgroud)
问题是我想锁定窗口/ webbrowser以防止它绘制/更新,直到我的所有更新都完成.有没有办法做到这一点?会打电话给
SendMessage(WebBrowser.Handle,WM_SETREDRAW,0,0);
Run Code Online (Sandbox Code Playgroud)
我希望在优化此代码方面提供一些帮助,以便我的总CPU使用率不会持续很高.
我有一个程序,用于搜索用户在路径和子路径中输入的文件,除了这一行,我对它的大部分内容都有很好的理解:
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..')
Run Code Online (Sandbox Code Playgroud)
整个过程如下,帮助将被欣赏,因为我不确定这行代码的目的,是它检查子路径中的东西?
procedure TfrmProject.btnOpenDocumentClick(Sender: TObject);
begin
FileSearch('C:\Users\Guest\Documents', edtDocument.Text+'.docx');
end;
procedure TfrmProject.FileSearch(const Pathname, FileName : string);
var Word : Variant;
Rec : TSearchRec;
Path : string;
begin
Path := IncludeTrailingBackslash(Pathname);
if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0
then repeat Word:=CreateOLEObject('Word.Application');
Word.Visible:=True;
Word.Documents.Open(Path + FileName);
until FindNext(Rec) <> 0;
FindClose(Rec);
if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
try
repeat
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') …Run Code Online (Sandbox Code Playgroud) 我试图显示一个启动画面,而不是冻结应用程序,而它连接到数据库.正常连接(通过ADO到MSSQL)大约需要300毫秒,这不会导致主线程在窗口上显示"无响应".
但是,在(a)网络错误或(b)配置错误(无效的SQL服务器主机名/实例)的情况下,超时需要60秒.这不仅使应用程序无响应,而且在它冻结时几乎不可能显示任何错误或消息.我可以在开始连接之前弹出一条消息,但是当主线程阻塞60秒时,确实没有解决方案.
解决方案似乎是将连接移动到后台线程.这导致以下代码:
一个TThread类,它使后台连接,一些SyncObj就像一个TEvent,用于将信号发送回主线程.
使用此代码的主线程中的循环:
BackgroundThread.StartConnecting;
while not BackgroundThread.IsEventSignalled do begin
Application.ProcessMessages; // keep message pump alive.
end;
// continue startup (reports error if db connection failed)
Run Code Online (Sandbox Code Playgroud)这是正确的方法吗?我的犹豫涉及上述解决方案的以下要素:
答:我会调用Application.ProcessMessages,我认为这是极端的代码味道.(这可能是这个规则允许的例外)
B.我在应用程序启动时引入了线程,我担心引入错误.
如果任何人都有一个已知没有竞争条件的参考实现,那可以与ADO建立后台连接,并且已知这是一种安全的方法,这将非常有用.否则一般提示或部分例子都是好的.
从SQL Server Management Studio以交互方式运行SQL命令的用户可以看到的sql命令输出与从执行ADO命令或ADO查询对象返回的输出不同.
USE [DBNAME]
BACKUP DATABASE [DBNAME] TO
DISK = 'C:\SqlBackup\Backup.mdf'
Run Code Online (Sandbox Code Playgroud)
成功完成输出如下:
Processed 465200 pages for database 'DBNAME', file 'filename' on file 2.
Processed 2 pages for database 'DBNAME', file 'filename_log' on file 2.
BACKUP DATABASE successfully processed 465202 pages in 90.595 seconds (40.116 MB/sec).
Run Code Online (Sandbox Code Playgroud)
当我使用如上所述的CommandText或SQL集执行TADOCommand或TADOQuery时,我没有得到任何这样的输出.如何从执行SQL命令中读取此"辅助输出"?我希望通过一些原始的ADO操作,我可能能够执行命令并获取上面的信息,以获得成功,以及执行Sql备份时的任何错误.
更新:下面的答案对我来说比使用普通Delphi TADOCommand和TADOConnection类的天真尝试更好,这种尝试无法正常工作:
我在自己的编码尝试中遇到的问题是,我的第一个命令是"use dbname",我在代码中遍历的唯一记录集是"use dbname"命令的结果,而不是我执行的第二个命令.下面接受的答案遍历从执行ADO命令返回的所有记录集,因此它工作得更好.由于我在后台线程中做了所有这些,我实际上认为最好还是创建原始的Com Objects,并避免在我的线程中出现任何VCL纠缠.如果有人感兴趣,下面的代码可能是一个很好的组件,让我知道,我可能会创建一个开源的"SQL备份为Delphi"组件.
我正在尝试使用DCC32通过命令行首次构建我的Delphi应用程序。我对我的项目的配置文件毫不怀疑。通过IDE进行编译时,必须在项目中添加一些搜索路径。当我删除它们时,编译失败。
现在,如果我通过命令行编译它,是否需要指定配置文件详细信息或搜索路径参数?
没有任何参数:
dcc32.exe project1.dpr
Run Code Online (Sandbox Code Playgroud)
有一些参数:
dcc32.exe -u%Shared% -ND:\out project1.dpr
Run Code Online (Sandbox Code Playgroud)
我有以下疑问:
请提供一些帮助解决我的疑问。任何与dcc32编译选项有关的信息将不胜感激。
我发现 Delphi 中的扩展 RTTI 功能有一个奇怪的疏忽(可能是故意的)。
我想转储包含大约 1500 个不同字段的记录类型中的所有字段。是的,认真的。
其中一些是 real48 类型,一些是短字符串,对于这两种类型,在运行时这些类型的 FieldType 似乎为零:
function TRttiField.GetValue(Instance: Pointer): TValue;
var
ft: TRttiType;
begin
ft := FieldType;
if ft = nil then
raise InsufficientRtti; // This fires!
TValue.Make(PByte(Instance) + Offset, ft.Handle, Result);
end;
Run Code Online (Sandbox Code Playgroud)
如果我愿意假设所有 nil-fieldtype 字段实际上都是 real48 字段,我可以简单地使用偏移量并(如果字段宽度为 6)获取 real48 值。
然而,第二个复杂之处是所有短字符串(即string[30])类型都受到类似的困扰。
有人让这两种古代 Pascal 类型与现代扩展 RTTI 一起使用吗?现在我正在使用最佳猜测方法,如果失败,我会按字段名称对规则进行硬编码,但如果有某种技术我可以使用,那么我就可以到达那里,而无需编写大量代码来提取来自我正在现代化的所有这些旧的帕斯卡记录文件中的信息,我将不胜感激更好的想法。
我发现在Windows 7 64位上,在具有域名的机器上,GetUserNameEx(3,....)应该将扩展名称格式DisplayName(== 3)放入缓冲区,工作正常.
但是,它不适用于Windows 7 32位,工作组上的虚拟机,而不是域,它返回ERROR_NONE_MAPPED.
例如,你如何以适用于Windows的方式阅读该人的友好名称"Fred Smith"?GetUserNameEx明显被破坏了.实际上,没有破坏,我被告知,只是不打算为不在域上的用户工作.我想知道为什么不存在本地SAM信息?并且似乎没有其他直接API来执行此操作.
如果Windows为您提供ERROR_NONE_MAPPED,那么您运气不佳,可能不在域上.所以这不是API的友好区域.
[看起来有可能,调用NetUserGetInfo,读取本地SAM信息,当不在域上时,但您需要首先知道用户名和密码,然后它可能会查找友好名称.]
前段时间我问过帮助在Delphi中进行持续集成工作.对于使用巡航控制,一个侧面答案有部分不完整(不适合我)的信息[这里] [2].
我已经让Jenkins/Hudson工作了,关于它的简单部分是(使用Delphi)配置完全通过Web浏览器完成.然而,使用CruiseControl.net设置起来要困难得多.
我想看一个示例ccnet.config,它将使用来自CruiseControl的MSBUILD构建一个hello-world delphi项目(Project1.dproj),并在每次修改subversion(或mercurial)上游源时自动重建.
到目前为止,我有:
ccnet.config这是我的ccnet.config,最初是我的,<exec>并按照以下建议更改为<msbuild>:
<cruisecontrol xmlns:cb="urn:ccnet.config.builder">
<!-- CRUISECONTROL.NET Server configuration -->
<project name="Project1">
<tasks>
<msbuild>
<projectFile>project1.dproj</projectFile>
</msbuild>
</tasks>
</project>
</cruisecontrol>
Run Code Online (Sandbox Code Playgroud)
更新:我原本无法c:\builds\ccnet.config从ccnet.exe 读取它,但我发现我可以使用命令行参数运行ccnet.exe(非服务模式),这让我找到了我的ccnet.config问题.
delphi ×10
ado ×2
c# ×1
dcc32 ×1
delphi-2009 ×1
delphi-5 ×1
delphi-7 ×1
delphi-xe ×1
delphi-xe2 ×1
msdn ×1
optimization ×1
printing ×1
rtti ×1
sql-server ×1
twebbrowser ×1
winapi ×1