我的应用程序中需要一个内置的屏幕数字小键盘.由于各种原因,我无法使用TMS软件或其他商业组件产品.我对下面显示的基于按钮的解决方案非常满意,但我还不知道如何解决焦点切换问题,单击按钮激活键盘形式,我失去了我想要角色的聚焦控制.如果我将键盘按钮保持在目标表单中,但我想要一个独立于表单的解决方案,我的解决方案是有效的.有没有办法禁用按钮激活或知道焦点来自哪里,以便我可以使用像Scree.ActiveControl:= ?? 把它还掉?

我正在尝试调试仅在我的大型应用程序 - 在XE3中正常工作 - 在使用XE4编译后运行时才出现的行为.该问题似乎导致一些引用的字符串(例如"MyString")即使在由Web.HTTPProd中的TPageProducer"解除引用"之后仍保留其引号.例如,考虑以下代码,该代码是来自此Delphi源单元Web.HTTPApp的小提取:
procedure ExtractHeaderFields(Separators, _WhiteSpace: TSysCharSet; Content: PChar;
Strings: TStrings; Decode: Boolean; StripQuotes: Boolean = False);
{$ENDIF NEXTGEN}
var
Head, Tail: PChar;
EOS, InQuote, LeadQuote: Boolean;
QuoteChar: Char;
ExtractedField: string;
{$IFNDEF NEXTGEN}
WhiteSpaceWithCRLF: TSysCharSet;
SeparatorsWithCRLF: TSysCharSet;
{$ENDIF !NEXTGEN}
function DoStripQuotes(const S: string): string;
var
I: Integer;
InStripQuote: Boolean;
StripQuoteChar: Char;
begin
Result := S;
InStripQuote := False;
StripQuoteChar := #0;
if StripQuotes then
begin
for I := Result.Length - 1 downto 0 do
if Result.Chars[I].IsInArray(['''', '"']) then …Run Code Online (Sandbox Code Playgroud) 我看到许多人正在使用虚拟机来托管IDE和所有必需的文件,进行S/W开发(不仅仅是Delphi).我已经使用Microsoft Virtual PC在各种操作系统上调试我的应用程序的问题,但很少在VM外部访问.我的应用程序使用USB,串行和 - 至关重要 - 直接I/O写入硬件(通过I/O权限驱动程序).我想让VM看到所有这些(当然只有一个VM可以运行).这可能吗?虚拟PC与VMWare的偏好是什么?
我需要改进我们的应用程序中的屏幕,该屏幕呈现嵌入在我们的Delphi代码中的HMI(人机界面)显示.该屏幕为我们的客户提供了执行一系列操作(运行测试,产品报告等)以及公开和查看关键命名数据值的能力.这种定制是必需的,因为我们的应用程序控制可能由一系列技能水平操作的机器,从简单的操作员(可能不会说英语并且必须具有非常有限的控制)到希望"看到一切"且具有最大控制权的高级用户.
几年前,我创建了一个基于嵌入式HTML查看器(Turbopower就像那时)和TPageProducer的解决方案来动态调整HTML模板(用户可以自定义),并显示一组简单的控件和数据表.这工作正常,但编辑速度很慢(你必须调整模板,看看效果),我相信现在有更好的方法.
我需要的是类似于可以在运行时自定义的Delphi表单.我需要:按钮,标签和编辑.可编辑的形状和箭头是可取的,因为可以放置控件和文本的固定图像.布局应该是可保存的(如DFM文件),文本标签应该有两种类型 - 固定文本和更新以在更新通知上显示键值的文本(如数据库控件).最终布局应缩放其比例以适应可调整大小的布局.
这个问题是关于工作的最佳工具,我不是完全冷,我已经尝试过Greatis Form Designer并获得了一个有效的解决方案,但在我提交之前,我会评论是否有报告工具(带有因为打印转储功能也很有用,所以内置报告编辑器可能/可用/更好.(快速报告?快速报告等?).请注意,这主要是显示要求.评论更新的嵌入式HTML解决方案也将受到欢迎,因为任何事情都可以确保布局格式的最大限度未来验证.
任何解决方案都应该可以在Dephi 7中使用(现在!),并且只要有新的Delphi的迁移路径就不需要unicode.
任何其他评论或意见将是非常受欢迎的.谢谢.
有几个第三方控件(例如Raize组件)有一个紧密的"交叉"按钮"选项"(例如页面控件).我的要求更简单,我想将一个十字'按钮'对齐到TPanel右上方并访问其点击的事件.是否有一种简单的方法可以在不创建TPanel后代的情况下执行此操作,或者是否可以使用付费或免费的库组件?
我多年来一直在使用Delphi,我的每个项目都是从源代码编译到exe - 没有包等.如果在任何地方使用'MyUnitA.pas',它只是在另一个单元的接口或实现部分声明需要它.这一切都可以在任何地方工作,这意味着在我的项目源(dpr)中只有框架定义(在框架列表中没有出现的其他地方似乎需要)和必须调用的单元的"奇怪"定义非常早,例如madExcept,FastMM等.
我注意到XE有时会在dpr中解析东西,直到你真正编译它为止.此外,在处理包时,如果必须在没有明确添加到包中的情况下隐式提取内容,则会发出警告.这让我想知道我们是否应该努力将所有使用过的单元添加到我们的dpr(如包定义)或右键单击项目和'添加到项目'.你是做什么?
渐渐地,我一直在使用更多变体 - 它们在某些地方非常有用,可以承载编译时未知的数据类型.一个有用的值是UnAssigned('我没有给你一个值').我想我很久以前就发现了这个功能:
function DoSomething : variant;
begin
If SomeBoolean then
Result := 4.5
end;
Run Code Online (Sandbox Code Playgroud)
似乎相当于:
function DoSomething : variant;
begin
If SomeBoolean then
Result := 4.5
else
Result := Unassigned; // <<<<
end;
Run Code Online (Sandbox Code Playgroud)
我推测这个推理必须动态创建一个变体,如果SomeBoolean为FALSE,编译器已创建它,但它是'Unassigned'(<> nil?).为了进一步鼓励这种思考,如果省略分配结果,编译器不会报告任何警告.
刚才我发现了令人讨厌的错误,我的第一个例子(其中'结果'未明确默认为'nil')实际上从其他地方返回了一个"旧"值.
在修复变体时,我是否应该总是分配结果(就像我在使用预定义类型时那样)?
为了维护其项目,Delphi有时会添加或删除DPR文件(项目源)中的内容.我非常喜欢在DPR中格式化我的东西,就好像它是一个普通的单元,例如将'used'框架引用和项目源文件组合在一起.我制作它的副本,并且可以在发生这种情况时返回,但每隔一段时间,我会注意到DPR已将其所有源文件引用都打包成一个块.
其他人都受此影响吗?有没有办法阻止这种情况发生(除了只读文件).谢谢
我饶有兴趣地阅读了Nick Hodges关于你为什么要使用界面的博客 ,因为我已经爱上了我编码中更高层次的界面,所以我决定看看如何将它扩展到相当低的水平并调查支持因为这在VCL课程中存在.
我需要的一个常见构造是使用TStringList做一些简单的事情,例如这个代码将一个小文本文件列表加载到一个逗号文本字符串中:
var
MyList : TStrings;
sCommaText : string;
begin
MyList := TStringList.Create;
try
MyList.LoadFromFile( 'c:\temp\somefile.txt' );
sCommaText := MyList.CommaText;
// ... do something with sCommaText.....
finally
MyList.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
如果我可以使用MyList作为接口编写它似乎是一个很好的简化 - 它将摆脱try-finally并提高可读性:
var
MyList : IStrings;
//^^^^^^^
sCommaText : string;
begin
MyList := TStringList.Create;
MyList.LoadFromFile( 'c:\temp\somefile.txt' );
sCommaText := MyList.CommaText;
// ... do something with sCommaText.....
end;
Run Code Online (Sandbox Code Playgroud)
我看不到定义的IStrings - 当然不是在Classes.pas中,尽管在线编程时有关于它的引用.它存在吗?这是一个有效的简化吗?我正在使用Delphi XE2.
我已经证明我可以使用Delphi 2010从其GUID获取接口的名称(例如,IMyInterface转换为字符串'IMyInterface'.我想在Delphi 7中实现这一点(兼容性).这可能吗?或者是有基本的编译限制.
delphi ×10
interface ×2
button ×1
delphi-xe2 ×1
delphi-xe4 ×1
focus ×1
forms ×1
function ×1
hardware ×1
keyboard ×1
project ×1
rtti ×1
serial-port ×1
string ×1
tpanel ×1
tstringlist ×1
variant ×1