我正在使用Delphi 2009,我想缩放图像以适应可用空间.图像始终显示小于原始图像.问题是TImage Stretch属性做得不好,损害了图片的可读性.
丑陋的方式http://xrw.bc.ca/download/so/TImageStretch.gif
我希望看到它像这样缩放:
更好的方式http://xrw.bc.ca/download/so/NicerTImageStretch.png
有什么建议如何最好地做到这一点?试过JVCL,但它似乎没有这种能力.一个免费的图书馆会很好,但也许有一个低成本的图书馆,"只"这也很好.
我如何才能看到我的delphi应用程序当前使用了多少堆栈空间?我有一个非常奇怪的错误,听起来像堆栈的麻烦.我想将它添加到我的应用程序日志中,以了解正在使用/剩余的堆栈空间.使用调试器可能不是那么好,因为例程可以多次调用.
谢谢!
我们想将可移动面板添加到应用程序中.目前我们已经使用了DevExpress对接库,但发现它们令人失望地古怪且难以使用.它也有一些不太好的限制.
通过拖放自动隐藏,固定和移动页面都是我们想要使用的功能.
内置的delphi对接似乎没有足够的功能来完成我们需要的东西(另见下面的示例).也许我应该深入研究delphi的对接能力......我最初的印象是它们看起来非常像工具栏,而不是我可以放入框架的东西.
我在对接主题方面没有经验.我唯一的经验是使用DevExpress对接库,我需要以编程方式创建和停靠面板.
是我的想象力还是DevExpress的产品过于难以使用/学习?与d2009 Ribbon Bar相比,DevExpress Ribbon Bar组件确实是一种有用的体验.我会尽快迁移到d2009功能区栏.这是令人耳目一新的直接学习和使用.与DevExpress相当的鲜明对比.如果使用DevExpress等效物需要4倍的时间,那么就该改变方向了.
关于停靠库,您有什么建议?
谢谢你的建议/意见!
我一直在使用TForm
的OnActivate
事件让我有机会在我的应用程序启动后立即显示一个对话框.我希望主窗体已经加载和可见.这样做的好方法是什么?
我发现OnActivate
除非形式WindowState
是正常的,否则它会正常工作wsMaximized
.
在过去,我已经以各种方式完成了我想要的东西,但我希望有更好的方法.
这对我有用:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle:=OnIdle;
end;
procedure TForm1.OnIdle(Sender: TObject; var Done: Boolean);
begin
Application.OnIdle:=nil;
form2:=TForm2.Create(Application);
form2.ShowModal;
end;
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
我正在将我的应用程序迁移到delphi 2009.我的应用程序仍然必须使用大量的AnsiString.在迁移过程中,我发现自己总是转换:
abc := def;
Run Code Online (Sandbox Code Playgroud)
成:
abc := string(def);
Run Code Online (Sandbox Code Playgroud)
要么
abc := TDeviceAnsiString(def);
Run Code Online (Sandbox Code Playgroud)
我知道我应该可以用模板做到这一点,但我发现模板 - 虽然功能强大 - 不是那么容易上班.这是我一直在尝试的:
<?xml version="1.0" encoding="utf-8" ?>
<codetemplate xmlns="http://schemas.borland.com/Delphi/2005/codetemplates"
version="1.0.0">
<template name="das" invoke="auto">
<point name="expr">
<script language="Delphi">
InvokeCodeCompletion;
</script>
<hint>
MP: TDeviceAnsiString
</hint>
<text>
True
</text>
</point>
<description>
MP: TDeviceAnsiString
</description>
<author>
Mike
</author>
<code language="Delphi" context="any" delimiter="|"><![CDATA[TDeviceAnsiString(|selected|)|end|]]>
</code>
</template>
</codetemplate>
Run Code Online (Sandbox Code Playgroud)
它不会出现在环绕声菜单中,它不会随时激活.我希望能够
abc := **das***[tab]*def;
Run Code Online (Sandbox Code Playgroud)
或者选择"def"并使用"surround"来获得:
abc := TDeviceAnsiString(def);
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助!
我正在使用后期绑定OLE自动化与Excel一起工作.问题是我不知道如何使用Selection返回的值,因为我不知道它是什么类型...
如何确定它返回给我的物品类型?我希望有一个类型名称....
或者我必须查看我期望的值列表吗?
我在Delphi XE应用程序中遇到元文件渲染问题.
问题是,当我渲染元文件时,文本太大了.Irfanview和FastReports渲染如下:
windows 7 Paint渲染得很好:(这是文本的样子)
是什么原因引起了这个?
谢谢!
在下面的链接中,Microsoft描述了两种限制平板电脑上应用程序屏幕旋转的方法.
http://msdn.microsoft.com/en-ca/library/windows/apps/hh700342.aspx
发生的事情是德尔福的(XE3)TRibbon不能很好地处理旋转.它往往会挂起来.
正如所料,MS网站描述了如何从MS开发产品中做到这一点.我不知道如何在我的Delphi项目中做到这一点.
方法1:
将此添加到您的appxmanifest文件:
<InitialRotationPreference>
<Rotation Preference="landscape"/>
<Rotation Preference="landscapeFlipped"/>
</InitialRotationPreference>
Run Code Online (Sandbox Code Playgroud)
我还没有找到appxmanifest应该成为应用程序的一部分,所以我可以在delphi中执行此操作.
方法2:
用代码调用它:
Windows.Graphics.Display.DisplayProperties.AutoRotationPreferences =
Windows.Graphics.Display.DisplayOrientations.Landscape;
Run Code Online (Sandbox Code Playgroud)
要将其迁移到delphi,我需要知道API DLL信息,以便我可以做类似的事情.
有任何想法吗?
是否有一个COM对象或DLL可以让我们访问它?
我在一个Win32应用程序上工作,该应用程序已经开发出一个非常奇怪的数据库问题,这个问题正在悄然增长,直到最终达到2 GB的文件大小 我们使用ADO连接到Access 2007数据库.该应用程序已经很好地工作多年,没有观察到这样的困难.如您所想,当它达到2 GB的限制时,数据库就会损坏.我现在有很多客户数据库被发送给我们进行维修 - 大小约为2GB.一旦压缩,它们就会回到<10 MB.
我们看到一些数据库随着时间的推移而增长但从未在这种规模上增长.
我创建了一个小型数据库"checker",它将所有记录中所有字段的内容相加,以便了解存在多少实际数据.在最近已经压缩的数据库上检查了这个新工具后,我认为该工具正常工作.所有膨胀的数据库每个都有不超过10 MB的数据.
我们不会在应用启动时压缩数据库.在我看来,因为我们不删除大量数据,所以压缩数据库不是我们"应该"需要做的事情.具有较大数据库的客户(有一些但是它们在早期版本中).
你能否建议我们如何能够将<10 MB的数据库增加到2 GB?
关于我们的应用程序的作用的一些评论:
当ADO没有打开数据库时,使用DAO完成任何重组.
我们确实在一些地方使用交易
为方便起见,某些记录便于删除和重新创建,而不是查找/编辑/删除.通常,此操作涉及5-30条记录,每条记录大约8K.这仅在用户按下"保存"时发生.
还有其他记录类型大约70 KB /记录但我们没有使用删除/重新创建.
我们使用BLOB("OLEObject")字段来存储二进制数据.
感谢您提供的任何见解.
在向用户显示之前,我需要对TaskDialog进行一些更改.使用Windows API调用来处理对话框中的每个控件都相当简单.我需要更加确定我找到了哪个按钮.我原本希望找到一个可以读取按钮按下时给出的结果的地方.
换句话说,如果我按下一个会导致返回值的按钮(在Delphi中,它被称为模态结果)为100,我本来期望有一个我可以调用的API调用来找出按钮的"返回值" " 将会.我还没有找到这样的电话.
我不想依赖按钮文字..
这是我到目前为止所拥有的.
function EnumWindowsProcToFindDlgControls(hWindow: HWND; _param:LPARAM): BOOL; stdcall;
var
sClassName:string;
hBMP:THandle;
i:integer;
begin
SetLength(sClassName, MAX_PATH);
GetClassName(hWindow, PChar(sClassName), MAX_PATH);
SetLength(sClassName, StrLen(PChar(sClassName)));
if sClassName='Button' then
begin
// always 0...
i:=GetDlgCtrlID(hWindow);
if (i=100) or (i=102) then
begin
hBmp := LoadImage(HInstance, 'DISA', IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE or LR_LOADTRANSPARENT );
SendMessage(hWindow, BM_SETIMAGE, WPARAM(IMAGE_BITMAP), LPARAM(hBmp));
end;
end;
// keep looking
Result:=true;
end;
procedure TForm2.TaskDialog1DialogConstructed(Sender: TObject);
begin
EnumChildWindows(TaskDialog1.Handle, @EnumWindowsProcToFindDlgControls, 0);
end;
Run Code Online (Sandbox Code Playgroud)
我怀疑用对话框做这样的事情并不完全"可敬".
这是一个使用Delphi的VCL TTaskDialog组件的Delphi 10 Win32应用程序,它是Windows任务对话框功能的包装器.在它显示之前,OnConstructed事件触发,执行此代码.
谢谢您的帮助!