如何从使用包的项目中查找和删除未使用的Delphi运行时包?
我有一个由几个包组成的Delphi项目,在需要的部分包中列出了几个Borland/3rd party软件包(rtl.dcp,vcl.dcp等)我知道我需要它们中的大多数,但是有我知道我不需要那些随着时间的推移,可能一个组件使用它们一次,但后来该组件被删除,或者可能是我测试代码.
我如何找出哪些是必需的,哪些不是?如果不需要它们,它们是否仍需要与最终应用程序一起分发,或者对应用程序的大小/内存要求有任何影响?
我试图尽可能简化流程.
我有一个Firebird数据库(在服务器版本2.1.3上运行)并使用DBExpress对象(使用Interbase驱动程序)与Delphi 2007连接
我在数据库中的一个表看起来像这样
CREATE TABLE MYTABLE
(
MYDATE Timestamp NOT NULL,
MYINDEX Integer NOT NULL,
...
Snip
...
PRIMARY KEY (MYDATE ,MYINDEX)
);
Run Code Online (Sandbox Code Playgroud)
我可以添加到表中,然后在Flame Robin中将时间戳字段显示为具有毫秒值.
但是当我select * from MYTABLE在表上选择all()时,我无法获得毫秒值,因为它总是以000返回.
这会导致重大问题,因为它是主键的一部分(遗憾的是我没有设计表并且无权更改它).
我尝试了以下内容来获取毫秒值:
sql1.fieldbyname('MYDATE').AsDateTime;
sql1.fieldbyname('MYDATE').AsSQLTimeStamp;
sql1.fieldbyname('MYDATE').AsStirng;
sql1.fieldbyname('MYDATE').AsFloat;
Run Code Online (Sandbox Code Playgroud)
但是格式化时他们都会返回14/09/2009 14:25:06.000.
如何从时间戳中检索毫秒?
更新: 如果这有助于将来的任何人,这里是我为DBExpress尝试的驱动程序和结果.
我需要一些SQL来更新数据库中的记录(如果它存在)并在不存在的情况下插入它,环顾四周看起来有几个解决方案,但我不知道正确/可接受的方法是什么.
理想情况下,我希望它可以在Firebird 2和MySQL 5上运行,因为需要针对两个数据库运行更新,如果在两者上运行相同的SQL,如果它在更多数据库上运行会更加简单,那将会更简单.
在这种情况下,速度和可靠性也会影响可靠性,但它可能会用于快速连续更新1000个记录(在不同的表中).
任何从属?
如果我在基类上实现一个接口,它将由它的子类继承,我知道函数/过程将是,但我更感兴趣的是我是否能够将子类强制转换为接口然后返回到它原班.
我希望我能做的是将不同基类的对象传递给一个函数,然后在函数确定中输入并根据需要使用它们.
这是可能的,这是正确的方法吗?
更新
为了帮助消除任何混乱(或创造更多),我想做的事情(条纹下到核心).
接口
IMyInterFace = interface
['{B7203E50-F5CB-4755-9DB1-FB41B7B192C5}']
function MyFunction: Boolean;
end;
Run Code Online (Sandbox Code Playgroud)
基类
type TMyObject = class(TInterfacedObject,IMyInterFace)
Run Code Online (Sandbox Code Playgroud)
子类
type TSubMyObject = class(TMyObject)
Run Code Online (Sandbox Code Playgroud)
另一类
type TMyOtherObject = class(TInterfacedObject,IMyInterFace)
Run Code Online (Sandbox Code Playgroud)
然后用法
procedure foo();
var obj:TSubMyObject;
begin
obj := TSubMyObject.Create();
SendInterfaceObject(obj);
end;
procedure bar();
var obj:TMyOtherObject;
begin
obj := TMyOtherObject.Create();
SendInterfaceObject(obj);
end;
procedure SendInterfaceObject(iobj:IMyInterFace);
begin
if (iobj is TSubMyObject) then
begin
//code here
end
else if (iobj is TMyOtherObject) then
begin
//code here
end;
end;
Run Code Online (Sandbox Code Playgroud)
更新2
我更新了代码abit,以便更好地展示我的意思.
//这里的代码部分与传递给它的对象几乎没有关系,例如,如果这个类是TAccounts并且它被传递了一个TEmployee对象,那么它可以支付每周付费,但是如果它是TInvoice那么它会检查到看看是否需要支付,只在日期是死线前2天支付.
TEmployee/TInvoice甚至可能来自要求付款的外派. …
是否可以检查Typeface对象在 Android API 8 中使用的系列?
我正在像这样在 Paint 对象上创建字体
//Simplified code, the user actually selects the family and style from a list
Paint paint = new Paint();
paint.setTypeface(Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD));
Run Code Online (Sandbox Code Playgroud)
我以后希望能够像这样检查家庭
Typeface tf= paint.getTypeface();
if (tf.equals(Typeface.DEFAULT) || tf.equals(Typeface.DEFAULT_BOLD)) {
//do something
} else if (...) {
//do something else
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它们不是同一个对象,我也尝试过tf == value但结果相同。字体对象似乎没有公开任何有助于家庭检测的有用信息,是否有解决方法?我只需要检测基本的 Android 字体(SERIF、SANS-SERIF、DEFAULT、MONOSPACE 等)
我们有一个Delphi 5应用程序,它是在没有运行时包,dll或外部资源(即单个可执行文件)的情况下构建的.当我们在客户端PC上安装它时,我们收到以下错误消息:
找不到类TListView
要么
未找到类TImage
我们已经将它安装在几十台PC上,没有发生任何事故,但这次最新安装存在问题.
目标PC是全新安装的Windows XP(Service Pack 3),没有安装其他软件.
它并没有抱怨所有的课程,只有一两个.例如TPanel/TForm/TEdit都可以.
任何人都可以认为是什么导致了这个
编辑
新PC上的exe是我知道的30多台其他PC,包括Windows XP Sp1,2,3,Windows Vista和嵌入式Windows.旧版和新版PC都安装了旧版本,然后使用最新版本进行更新.唯一的区别是最新安装的版本跳转更高.
我正在尝试基于Delphi 2007中的TCustomComboBox创建一个自定义控件,但我陷入了第一个障碍.
我试图覆盖下拉显示的方式,主要是显示的文本,查看stdctrls.pas中的TCustomComboBox的源代码看起来我只需要覆盖DrawItem但它不起作用,因为我的代码永远不会执行重写方法.
我看了几个开源组件源代码,看看他们是如何做到的,但我仍然不知所措.
这是我到目前为止(不是很多)
type
TKeyValueComboBox = class(TCustomComboBox)
private
{ Private declarations }
//FColumns:Integer;
protected
{ Protected declarations }
procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState);override;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
end;
Run Code Online (Sandbox Code Playgroud)
和
procedure TKeyValueComboBox.DrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState);
begin
TControlCanvas(Canvas).UpdateTextFlags;
if Assigned(OnDrawItem) then OnDrawItem(Self, Index, Rect, State)
else
begin
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[Index]+'-HELLO');
end;
end;
Run Code Online (Sandbox Code Playgroud)
有谁知道我需要用什么方法来获取我被覆盖的版本的火?或者我做错了什么?
任何帮助,将不胜感激.
即使子窗口具有焦点,如何让 KeyDown 事件在 Delphi (2007) MDI 应用程序父窗口中工作?
我想实现一个在 MDI 应用程序中显示帮助屏幕的快捷键 (F1),我已将 KeyDown 过程添加到 MDI 父窗口并在父窗口和子窗口中启用 KeyPreview,但它不起作用预期的。
如果我在Parents KeyDown 代码中放置一个断点,我可以看到它永远不会执行,即使没有打开子窗口。但是如果我将相同的代码添加到子窗口,它就可以正常工作。
有没有办法让父窗口接收按键,即使子窗口有焦点,因为将代码添加到 25+ 表单接缝有点浪费?
我有一个Base64二进制字符串,它是由第三方供应商发送给我们的XML文档的一部分,我希望能够将其保存回原始文件格式(jpg).
使用这个问题的接受答案"使用php将base64字符串保存为二进制文件"我可以毫不费力地将字符串保存到jpg,所以我知道字符串格式正确并且是JPG文件.
但是我如何在Delphi 2007中做到这一点?
在网上看到我发现了一个关于如何将Base64转换为TByteDynArray的教程,并保存它,但它不能正常工作.我也玩过Indy的IdDecoderMIME,但没有成功.
有没有人知道如何做到这一点,或者我应该在哪里看?
我的delphi应用程序与本机键盘不兼容.我该怎么办?要解释更多,请先看看这些图片:
这是意大利键盘的图像:http: //en.wikipedia.org/wiki/Keyboard_layout#Italian
您可以在同一页面中找到正常的键盘(美国键盘).
如果我们用普通键盘按Shift + 2(或任何Shift +编号),必须写@,但如果我们用意大利语键盘写'必须写'.但在我的应用程序中,使用两个键盘,它会对待每一个键盘作为普通键盘!例如当我在意大利语键盘中按Shift + 2时,键入@而不是"
我正在使用Delphi 7.您可以在这里测试我的应用程序:en.apadanasoftware.com/forums
Thnx提前
我想找到一些Windows API常量的值,例如但不限于 LVM_ENABLEGROUPVIEW和WM_SHOWWINDOW
在网上看到我的MSDN,它告诉我它们用于什么,但不是基础值.
stackOverflow上有一个非常相似的问题,我在哪里可以找到一个windows API常量列表,但所有答案都是针对.net的,或者假设我有Windows SDK,据我所知,我没有.
那我在哪里可以找到它们?
如果它有所作为我使用Delphi 2007,虽然它在Messages单元中有很多内容,但它没有全部,包括一些最新的内容.
谢谢