标签: jedi-code-library

需要帮助对JCL的TEvaluator进行有趣的调用

我正在使用JCL的表达评估员TEvaluator(由barry kelly捐赠的奇妙创作).(谢谢你!)

背景

我使用了AddFunc方法.

function MyFunc:double;
begin
  // calculations here
  Result:=1;  
end;
Run Code Online (Sandbox Code Playgroud)

您可以使用AddFunc方法使该函数可用:

  AddFunc('MyFunc', MyFunc);
Run Code Online (Sandbox Code Playgroud)

这是问题......

我需要在一个对象上调用一个方法而不是一个独立的例程.

原因是我有一个提供值的对象列表.

说我们有一个车辆对象列表.每个对象都有一个权重函数.我希望能够使每个对象的重量可用于公式中.

一个愚蠢的例子,但很容易解释:

type
  TVehicle=class
  private
  public
    function Weight:double;
  end;

function StrangeCalculation:double;
var
  vehicle:TVehicle;
begin
  for iVehicle = 0 to Count - 1 do
    begin
      vehicle:=GetVehicle(iVehicle);
      // E2250 There is no overloaded version of 'AddFunc' that can be called with these arguments
      eval.AddFunc(vehicle.Name, vehicle.Weight);
    end;

  Result:=eval.Evaluate('JeepTJWeight + FordF150Weight * 2');
end;
Run Code Online (Sandbox Code Playgroud)

我的选择:

  1. AddVar()或AddConst() - 但这不是很好,因为如果值不可用,我需要能够引发异常.

  2. 具有独立函数的AddFunc().不能这样做,因为变量的名称(和数量)在运行时才是未知的.

  3. 如果找不到变量,则修改对象以添加回调.我实际上已经完成了这个,但需要编辑源代码的副本以回复它以实现此目的.

  4. 创建一个能够使用方法函数的AddFunc().

选项#3实际上已构建,但额外的AddFunc会更好.麻烦的是我不知道提供什么方法​​原型.我认为TMethod会是方式,但我的知识在这里太有限了...这是我的尝试不成功但我仍然得到"E2250在eval.AddFunc中没有可以使用这些参数调用'AddFunc'的重载版本" ()像以前一样打电话.

TFloat64MethodFunc = function(c:pointer): …
Run Code Online (Sandbox Code Playgroud)

delphi jedi-code-library

3
推荐指数
1
解决办法
638
查看次数

使用Delphi XE2中的JclCompression从ZIP存档中删除文件

我有这种情况需要从ZIP存档中删除特定文件.在应用程序中,ZIP文件的所有处理都是使用JclCompression完成的.我想知道你们是否知道如何使用JclCompression从ZIP存档中删除特定文件?(我找不到)

delphi jedi-code-library delphi-xe2

3
推荐指数
1
解决办法
272
查看次数

TJclCompressArchive(项目绝地).如何选择压缩格式?

在Win7 x64上使用Delphi XE,有Jedi类库ver.3.45和7z.dll ver.9.20,

Uses .., jclcompression;

procedure TForm1.Button1Click(Sender: TObject);
const
   an = 'C:\1.7z';
   fn = 'C:\1.txt';
var Arc: TJclCompressArchive;
    Ext: TJclCompressArchiveClass;

begin
   Ext := GetArchiveFormats.FindCompressFormat(an);
   Arc := Ext.Create(an);
   Arc.AddFile(ExtractFileName(fn), fn);
   Arc.Password:='123';

   // arc. .. compresslevel:= 0..9 (or store..ultra)
   // arc. .. compressmethod:= (lzma,lzma,bzip2,ppmd)
   // arc. .. dictionarysize:= (1 shl 1..30)
   // arc. .. comressheader:= true-false
   // arc. .. cryptalgorithm:= ??? aes256 only?
   // arc. .. threads:= 1..2
   // arc. .. cryptheader:= true-false

   Arc.Compress;

end;
Run Code Online (Sandbox Code Playgroud)

如何选择上面显示的压缩选项作为带"//"的注释?

绝地文件实际上是零,可能有人遇到这样的问题?

用7z尝试了一些不同版本的"作业":tSevenZip,SevenZipVcl,SevenZip Api,但已经得出结论,在项目Jedi中使用7z.dll工作的最新版本.

compression delphi 7zip jedi-code-library

2
推荐指数
1
解决办法
1621
查看次数

在 vista 之前使用 DwmIsCompositionEnabled (JwaDwmApi) 会导致错误

尝试使用以下代码来检查 Windows Aero 是否已启用:

function AeroEnabled: boolean;
var
  enabled: bool;
begin
 // Function from the JwaDwmapi unit (JEDI Windows Api Library)
 DwmIsCompositionEnabled(enabled);
 Result := enabled;

end;

 ...

 if (CheckWin32Version(5,4)) and (AeroEnabled) then
 CampaignTabs.ColorBackground   := clBlack
 else begin
 GlassFrame.Enabled             := False;
 CampaignTabs.ColorBackground   := clWhite;
 end;
Run Code Online (Sandbox Code Playgroud)

但是,在 Vista 之前的计算机上执行此操作会导致应用程序崩溃,因为缺少 DWMApi.dll。我也尝试过这段代码,但是它连续生成 2 个 AV。我怎样才能做到这一点 ?我正在使用 Delphi 2010。:)

delphi aero dwm jedi-code-library

0
推荐指数
1
解决办法
1524
查看次数

标签 统计

delphi ×4

jedi-code-library ×4

7zip ×1

aero ×1

compression ×1

delphi-xe2 ×1

dwm ×1