我最近从Delphi 7迁移到了Delphi XE3.
Delphi 7中的107kb的dll文件现在编译为2.7 MB.另一个是114kb,现在是4.7 MB!
这是正常的吗?我该怎么做才能减小文件大小?如果您需要更多信息,请询问.
更新:
这两个dll文件都已在发布模式下编译.
遵循梅森的建议:
4.7MB文件减少到834kb,2.7MB文件减少到2.1MB.2.1MB文件使用Generics和一个名为nExcel的外部库来生成Excel文件.虽然在文件大小较小时也使用了nExcel,但是使用泛型是代码的新增功能,我想这可能是文件大小保持相当大的原因.
在C#中,我可以创建一个包含特定接口的通用列表,例如:
myList = List<IMyInterface>;
Run Code Online (Sandbox Code Playgroud)
我可以在Delphi XE3中做同样的事情,如果是这样的话怎么样?
我知道我可以创建一个TInterfaceList来存储接口列表,但它不是强类型的,所以我仍然需要在列表中使用对象时进行转换.
有一种强烈的打字方式吗?
我希望使用这篇文章中提供的答案从列表中随机选择唯一的项目.
按照所描述的方法,在我的循环的每次迭代中,我生成概率值,该概率值是从列表中挑选当前项目的概率百分比.
我需要知道的是如何使用此百分比值来选择项目(或不是).
这是我的代码,remainingIndices是一个List<int>
for (var i = 0; i < remainingIndices.Count; i++)
{
var probability = pixelsToAdd / (float)(remainingIndices.Count - i);
}
Run Code Online (Sandbox Code Playgroud)
pixelsToAdd是120并且remainingIndices.Count是3600.我得到的概率值从0.0333333351开始
解决方案应该灵活,可以使用更广泛的值,最好是任何值.
谢谢
评论
对于这个问题的未来读者,我应该澄清,起初我认为概率值是0到100之间的某个百分比,但实际上它是介于0和1之间的值,因此与返回值完全匹配Random.NextDouble()因此可以用于比较如下面的答案所述.
我刚刚在Windows 8 64bit上下载并安装了最新的MySQL版本(5.6).在安装期间使用了默认值,它们都运行顺利.
使用MySQL Workbench我创建了一个包含一个简单表的模式,并创建了一个新用户.在架构权限选项卡上,我为用户添加了一个新条目,按"选择""全部"按钮选择权限,然后单击"保存更改".一旦我这样做,我得到他跟随错误:

任何想法为什么会这样?我是DB的新手,所以如果你有任何替代方法我可以尝试,请简单(一步一步)解释.
谢谢
我很困惑为什么XNA Rectangle结构被编写得像.
如果我运行此代码:
var bounds = new Rectangle(0, 0, 10, 10);
var bounds2 = new Rectangle(0, 10, 10, 10);
var bounds3 = new Rectangle(0, 19, 10, 10);
Debug.Print("Bounds X: {0}, Y: {1}, Top: {2} Left: {3} Bottom: {4} Right {5}",
bounds.X, bounds.Y, bounds.Top, bounds.Left, bounds.Bottom, bounds.Right);
Debug.Print("Bounds2 X: {0}, Y: {1}, Top: {2} Left: {3} Bottom: {4} Right {5}",
bounds2.X, bounds2.Y, bounds2.Top, bounds2.Left, bounds2.Bottom, bounds2.Right);
Debug.Print("Bounds2 X: {0}, Y: {1}, Top: {2} Left: {3} Bottom: {4} Right {5}",
bounds3.X, bounds3.Y, …Run Code Online (Sandbox Code Playgroud) 我试图将一个xna游戏中的对象传递给我正在编写的xna游戏库中的方法.该对象基本上可以是任何类型,包括引用和值类型.
游戏库用于调试目的,应该向屏幕打印传入的对象的当前值.它目前通过调用ToString对象来执行此操作,但将来字符串将根据基础类型进行格式化.
这是接收参数的游戏库方法
public void AddToDebug(object obj)
{
var type = obj.GetType();
_debugTypes.Add(obj, type);
}
Run Code Online (Sandbox Code Playgroud)
以下是在主游戏项目中使用它的示例
VD.AddToDebug(_counter);
VD.AddToDebug(_message);
Run Code Online (Sandbox Code Playgroud)
_counter是一个int并且_message是一个字符串.
问题是这些值的变化不会反映在屏幕上,因为(我假设)它们是按值传递的,而不是通过引用传递的.
我尝试添加ref关键字以确保它们通过引用传递,但这会导致方法调用出错 The ref argument type does not match parameter type
有没有办法可以通过引用传递值类型而不必指定实际类型(如果我可以避免它,我不想为所有值类型创建方法重载).
任何其他建议也欢迎.谢谢
UPDATE
尝试几种不同的方法后,我最终决定采用传递一个简单的方法Func<T>进入AddToDebug方法如下所示.我意识到,至少在目前,我不需要基础值,只需要格式化字符串表示.
将来我可以扩展库以自动扫描传入的类型并显示其所有成员的值.如果是这样的话,我可能会使用@Hans Passant的建议来传递对相关课程的引用.
这就是说我会接受@Lee的答案,因为它在我的最终实现中最有用,建议使用Func.
这是我现在的代码,欢迎任何改进建议.感谢大家的帮助.
public void AddToDebug<T>(Func<T> getValue, Color? color = null)
{
var w = new DebugEntry<T>(getValue, color.HasValue ? color.Value : Color.White);
_values.Add(w);
}
public class DebugEntry<T> : IStringFormatter
{
private readonly Func<T> _getValue; …Run Code Online (Sandbox Code Playgroud) c# ×3
delphi ×2
delphi-xe3 ×2
delphi-7 ×1
dll ×1
generics ×1
interface ×1
mysql ×1
probability ×1
ref ×1
reflection ×1
xna ×1