我有Delphi 2007代码,如下所示:
procedure WriteString(Stream: TFileStream; var SourceBuffer: PChar; s: string);
begin
StrPCopy(SourceBuffer,s);
Stream.Write(SourceBuffer[0], StrLen(SourceBuffer));
end;
Run Code Online (Sandbox Code Playgroud)
我称之为:
var
SourceBuffer : PChar;
MyFile: TFileStream;
....
SourceBuffer := StrAlloc(1024);
MyFile := TFileStream.Create('MyFile.txt',fmCreate);
WriteString(MyFile,SourceBuffer,'Some Text');
....
Run Code Online (Sandbox Code Playgroud)
这在Delphi 2007中有效,但它在Delphi 2010中给了我很多垃圾字符.我知道这是由于unicode合规性问题,但我不知道如何解决这个问题.
这是我到目前为止所尝试的:
我究竟做错了什么?
我正在写一个类来处理我的可执行文件中的安全性(检查连续出版物,试用日期检查等).编译可执行文件后(即使在Release版本中,所有调试和RTTI生成都关闭),当我在NotePad中打开它并在原始数据中搜索方法名称时,我可以看到组装我的类的方法的所有名称.代码库中的任何类都没有已发布的成员.
这对保护不利.有没有办法告诉Delphi不要在可执行文件中存储方法名称?如果不需要RTTI且没有COM爆炸,为什么要存储它们呢?是否有任何编译器选项控制它?
可能是目标可执行文件中ANY类的任何方法以文本形式存储在可执行文件内.显然,这是由默认情况下为Delphi 2010中的所有类打开的扩展RTTI引起的.
Delphi 2010具有关于RTTI的新功能,我读到它将使ORM工具和更清晰的代码更容易.
但我没有发现任何ORM包含这些功能.
你认为Embarcadero应该构建一个并将其包含在Delphi中
众所周知,当我们调用类的构造函数时:
instance := TSomeClass.Create;
Run Code Online (Sandbox Code Playgroud)
Delphi编译器实际上做了以下事情:
它简单易懂.但我不太确定编译器如何处理第二步和第三步中的异常.
似乎没有明确的方法在D2010中使用RTTI构造函数方法创建实例.所以我在Spring Framework for Delphi中编写了一个简单的函数来重现创建过程.
class function TActivator.CreateInstance(instanceType: TRttiInstanceType;
constructorMethod: TRttiMethod; const arguments: array of TValue): TObject;
var
classType: TClass;
begin
TArgument.CheckNotNull(instanceType, 'instanceType');
TArgument.CheckNotNull(constructorMethod, 'constructorMethod');
classType := instanceType.MetaclassType;
Result := classType.NewInstance;
try
constructorMethod.Invoke(Result, arguments);
except
on Exception do
begin
if Result is TInterfacedObject then
begin
Dec(TInterfacedObjectHack(Result).FRefCount);
end;
Result.Free;
raise;
end;
end;
try
Result.AfterConstruction;
except
on Exception do
begin
Result.Free;
raise;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我觉得这可能不是100%正确.所以请告诉我方式.谢谢!
我制作了一个类似于组合的下拉部分,或提示窗口或弹出菜单的TForm衍生物 - 一个临时的东西.它没有标题 - 它的BorderStyle设置为bsNone.使用Show设置其位置,以非模态方式显示表单.
为了突出它,它的边界需要一个阴影.但是,将其边框设置为bsNone的结果是投影阴影消失.
各种Google消息来源都提出了以下变体:
procedure TdlgEditServiceTask.CreateParams(var Params: TCreateParams);
const
CS_DROPSHADOW = $00020000;
begin
inherited;
{ Enable drop shadow effect on Windows XP and later }
if (Win32Platform = VER_PLATFORM_WIN32_NT) and
((Win32MajorVersion > 5) or
((Win32MajorVersion = 5) and (Win32MinorVersion >= 1))) then
Params.WindowClass.Style := Params.WindowClass.Style or
CS_DROPSHADOW;
end;
Run Code Online (Sandbox Code Playgroud)
但它不起作用 - 不显示阴影(除非我还设置了一个可调整大小的边框,设置了WS_THICKFRAME,看起来很糟糕).这是一个弹出窗口,而不是子窗口,所以我不明白它为什么会失败.
建议好吗?
注意:对于这个问题,这是一个类似的问题,仍然没有答案.
NB2:有一个名为TShadowWindow的模糊VCL组件,看起来它会做正确的事情,但事实证明它写得太粗糙了.
更新:根据安德烈斯在下面的评论,我进一步调查了这一点,并发现了一些细节.
在Windows 7下,我发现当弹出窗口位于同一应用程序的另一个窗口时,阴影不会出现.
这是一个简单的Delphi应用程序,它在弹出窗口中使用CreateParams来请求阴影,如上所述.

看看阴影如何出现在主窗口之外的位置?
但是我想在主窗口上使用无边框窗口作为弹出窗口.投影将弹出窗口与下面的窗口区分开来.我上面的所有描述都指的是这种情况.显然有些Windows机制在这里干扰.
我也在Windows XP下尝试过相同的应用程序.这是它的外观.

这适用于任何地方的阴影*.尔加!
所以它似乎是Vista/W7的东西,正如安德烈亚斯所暗示的那样.
(*此文本的早期版本和screendump表示没有出现阴影.但是,原来是因为我关闭了Windows XP显示选项'菜单下的阴影'.杜.)
我是Indy的新手,我想用它构建一个简单的代理服务器.这是一个非常大的图书馆,我只是不知道从哪里开始.当客户端连接到服务器时,OnExucute将启动并接收客户端连接作为参数(AContext.Connection).
我想做以下事情:
[client connection] := AContext.Connection
read host/port from [client connection]
[remote connection] := connect to host/port
while both connections alive:
if data available in [client connection]:
read data from [client connection]
write data to [remote connection]
if data available in [remote connection]:
read data from [remote connection]
write data to [client connection]
Run Code Online (Sandbox Code Playgroud)
问题是我应该使用哪些功能?IOHandlerConnection对象中有属性,有大量的属性.请帮忙.
我正在使用随Delphi2010一起提供的Indy.
我用Devexpress为我的软件设置了皮肤,我发现标签是不透明的,导致它们具有灰色背景.
只有无穷无尽的形式,所以我想知道是否有办法自动完成这项任务(将标签设置为透明).
我之前做了类似的事情,表单上的Devexpress控件有LookAndFeel.NativeStyle = True,我在所有dfm表单上使用Grep Search将其替换为False.但是,在标签的情况下,透明属性不存在.
谢谢.
我有一个应用程序,它有多种形式.所有这些表单都有一个PopupMenu.我以编程方式构建菜单项,所有这些都在一个共同的根菜单项下.我希望所有菜单项都调用相同的程序,菜单项本身基本上作为参数....
当我只有一个表单执行此功能时,我有这个工作.我现在有多种形式需要这样做.我正在将所有代码移动到一个公共单元.
Example.
Form A has PopupMenu 1. When clicked, call code in Unit CommonUnit.
Form B has PopupMenu 2. When clicked, call code in unit CommonUnit.
Run Code Online (Sandbox Code Playgroud)
当我需要从每个表单调用我的弹出窗口时,我调用我的顶级过程(在单元CommonUnit中),将顶部菜单项的名称从每个表单传递到公共单元中的顶级过程.
我正在使用代码向PopupMenu添加项目.
M1 := TMenuItem.Create(TopMenuItem);
M1.Caption := FieldByName('NAME').AsString;
M1.Tag := FieldByName('ID').AsInteger;
M1.OnClick := BrowseCategories1Click;
TopMenuItem.Add(M1);
Run Code Online (Sandbox Code Playgroud)
我编译时收到错误消息.具体来说,OnClick线正在抱怨
不兼容的类型:'方法指针和常规过程'.
我已经定义了BrowseCategories1Click,就像我在单个表单上执行此操作之前一样.唯一的区别是它现在定义在一个公共单元中,而不是作为表单的一部分.
它被定义为
procedure BrowseCategories1Click(Sender: TObject);
begin
//
end;
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最简单方法是什么?
谢谢GS
我需要将TWAIN扫描添加到Delphi应用程序中,并且无法找到现成的组件来执行此操作.
我下载了TDelphiTwain,但是当在Windows Vista上的D2010中使用时,它似乎无法识别我系统上的任何Twain源.我还尝试了MCM的Twain Toolkit for Delphi的试用版,它具有当前更新的优势(DelphiTwain的最后一次更新是2004),但Twain Toolkit甚至不能在我的系统上编译(我认为一些DCU不在日期).
任何人都可以建议一种简单的方法将TWAIN扫描到我的Delphi应用程序中吗?
更新:使用vcldeveloper对DelphiTwain的更新(见下文)我能够实现这一点.此外,我还发现Envision Image Library支持Twain扫描以及协助处理多页TIFF,并且已经更新以与D2010兼容.
最新的更新 VCLDeveloper的代码,下面,工作正常.但是,我选择了Envision库,它包括轻松创建多页TIFF文件的功能.我在几个小时内完成了Envision扫描,包括多页文件处理.
我正在编写一个将宽字符串保存到二进制文件的类.我正在使用Delphi 2005,但该应用程序稍后将被移植到Delphi 2010.我在这里感到非常不确定,有人可以确认:
德尔福2005年WideString是完全相同的同类型作为德尔福2010String
Delphi 2005 WideStringchar和Delphi 2010 Stringchar保证总是 2字节大小.
有了所有的Unicode格式,我不希望被我的字符串中的一个字符突然变为3字节宽或类似的东西.
编辑:发现这个:"我确实说过UnicodeString,而不是WideString.WideString仍然存在,并且没有变化.WideString由Windows内存管理器分配,应该用于与COM对象交互.WideString直接映射到COM中的BSTR类型".在http://www.micro-isv.asia/2008/08/get-ready-for-delphi-2009-and-unicode/
现在我更加困惑.那么Delphi 2010 WideString与Delphi 2005不一样WideString?我应该用UnicodeString吗?
编辑2:UnicodeString Delphi 2005中没有类型.FML.
delphi ×10
delphi-2010 ×10
methods ×2
rtti ×2
unicode ×2
delphi-2007 ×1
delphi-7 ×1
delphi-xe ×1
indy ×1
networking ×1
orm ×1
pointers ×1
proxy ×1
twain ×1
windows ×1
windows-7 ×1
windows-xp ×1