小编Thi*_*ien的帖子

如何在Delphi 2010中实现用户可定义的交互式地图?

我希望在我的应用程序中有一个交互式楼层地图(所以它们不是很大).每个用户的地图都不同,但包含的数字元素只有数量和位置不同.应用程序将显示地图,识别某些元素并将它们链接到数据库中的信息.

要设计和存储地图,我宁愿不滚动我自己的编辑器和/或想出一些自定义文件格式.但是,如果格式是开放的并且易于阅读,那将是很好的.SVG似乎是这项工作的完美候选人.所有需要的是如何命名元素以使它们可识别的约定.但是怎么去那里?我需要能够渲染SVG并区分不同层的东西.

TSVG可以做到这一点,但依赖于我宁愿避免使用的FireMonkey - 它甚至不存在于Delphi 2010中,因此我必须使用另一个版本并执行DLL技巧.

另一种选择是使用Chromium Embedded Framework并使用HTML,CSS和JavaScript创建地图.这感觉非常笨重,很难做对.

有没有更简单的方法可以做到这一点我忽略了,使用SVG还是完全不同的东西?

我不确定GIS系统是否适合这种情况.这可能是矫枉过正的.

delphi svg vcl delphi-2010

5
推荐指数
1
解决办法
992
查看次数

可以在Python中更快地对可变长度迭代的简单计算吗?

我正在计算由元组表示的两个向量之间的欧氏距离.

(u[0]-v[0])**2 + (u[1]-v[1])**2 + (u[3]-v[3])**2 ...
Run Code Online (Sandbox Code Playgroud)

这种硬编码方式非常快.但是,我不想对这些载体的长度做出任何假设.这导致了以下解决方案:

sum([(a-b)**2 for a, b in izip(u, v)]) # Faster without generator
Run Code Online (Sandbox Code Playgroud)

要么

sum = 0
for i in xrange(len(u)):
    sum += (u[i]-v[i])**2
Run Code Online (Sandbox Code Playgroud)

结果比第一个版本慢很多(至少两次).是否有一些聪明的方法来优化这一点,而不是诉诸于NumPy/SciPy?我知道这些软件包提供了最快的方式来做这些事情,但目前,我更想尝试优化"裸Python"的经验.我发现快速工作的是动态构建一个定义函数及其的字符串exec(),但这确实是最后的手段,我想说......

要求:

  • CPython 2.7
  • 仅限标准图书馆
  • "真实"(例如没有exec()),纯Python

尽管我的问题是关于一般小操作的问题,但您可以在解决方案中假设其中一个向量在多个函数调用中保持相同.

python python-2.7

5
推荐指数
1
解决办法
178
查看次数

累积元组列表中的项目

我有一个看起来像这样的元组列表:

lst = [(0, 0), (2, 3), (4, 3), (5, 1)]
Run Code Online (Sandbox Code Playgroud)

积累第一个和第二个元组元素之和的最佳方法是什么?使用上面的示例,我正在寻找生成此列表的最佳方法:

new_lst = [(0, 0), (2, 3), (6, 6), (11, 7)]
Run Code Online (Sandbox Code Playgroud)

我正在寻找Python 2.6中的解决方案

python python-2.6

5
推荐指数
1
解决办法
6555
查看次数

QR编码器/解码器中的GS1支持?

很少有QR编码器/解码器具有(显式)支持所谓的GS1编码.Zint是例外之一(在QR选择GS-1数据模式下),但其许可证阻止我使用它.主要来自Tec-It的商业产品价格昂贵,特别是因为我对他们支持的所有其他类型的条形码不感兴趣.

有没有办法在不更改源的情况下为任何QR编码器/解码器添加GS1支持?例如,我可以应用一些算法将文本GTIN AI数据转换为兼容的二进制文件吗?我认为它应该是可能的,因为毕竟它仍然是QR.请注意,我不是数据编码专家 - 我只是在寻找一种方法来处理这个标准,而不需要支付一笔不小的费用.到目前为止,我发现postscriptbarcode确实支持它,并且似乎使用自己的QR引擎,但输出质量一般,我的PostScript技能太有限,无法弄清算法.

algorithm qr-code barcode

4
推荐指数
1
解决办法
3460
查看次数

如何将二进制gbak输出重定向到Delphi流?

我希望Firebird备份工具gbak将其输出写入Delphi流(没有中间文件).有一个命令行参数可以写入stdout而不是文件.然后我使用ExecuteJEDI中的方法JclSysUtils启动gbak并处理该输出.

它看起来像这样:

procedure DoBackup;
var
  LBackupAbortFlag: Boolean;
  LBackupStream: TStringStream;
begin
  LBackupAbortFlag := False;
  LBackupStream := TStringStream.Create;
  try
    Execute('"C:\path to\gbak.exe" -b -t -v -user SYSDBA -pas "pw" <db> stdout',
      LBackupStream.WriteString, // Should process stdout (backup)
      SomeMemo.Lines.Append, // Should process stderr (log)
      True, // Backup is "raw"
      False, // Log is not
      @LBackupAbortFlag);
    LBackupStream.SaveToFile('C:\path to\output.fbk');
  finally
    LBackupStream.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

问题是输出文件太小而无法包含实际备份.我仍然看到文件内容的元素.我尝试了不同的流类型,但这似乎没有什么区别.这可能会出错?

更新

需要明确的是:其他解决方案也是受欢迎的.最重要的是,我需要一些可靠的东西.这就是为什么我首先选择JEDI,而不是重新发明这样的事情.那么,如果它不会太复杂,那就太好了.

delphi firebird jedi delphi-2010 firebird2.5

4
推荐指数
1
解决办法
2262
查看次数

如何从库的角度处理COM(un)初始化?

通过阅读本网站上的几个答案,我了解到CoInitialize(Ex)应该由线程的创建者调用.然后,在该线程中运行的任何代码都可以使用COM.如果该代码恰好自己调用CoInitialize(Ex),那将是无害的,因为它没有任何影响.它不应该调用CoUninitialize- 这也应该由线程的创建者完成 - 但如果它检查(保存的)结果CoInitialize(Ex)将不会S_FALSE.如果创建者不负责执行初始化,则该线程处于该代码的"左右"以选择适当的线程模型,从那时起该模型将不可更改.

所有这些对于编写和使用库有什么影响?

当所有代码都是您自己的代码,并且您拥有一个小团队时,可以很好地组织COM(un)初始化调用.但是,对于库,用户不应该知道他们如何做他们做的事情,例如涉及COM.我不想在文档中有什么可以在代码中处理.此外,除非涉及VCL代码,否则不应对库的代码运行的线程进行任何假设.

我检查过的大多数开源库都CoInitialize(Ex)在本initialization节和CoUninitializefinalization节中调用,通常甚至不检查初始化是否成功.有人打电话InitProc,但有些人先检查IsLibrary.

他们真的应该做什么?如果我自己写一个单元,我希望任何人都可以在没有多少考虑的情况下使用该怎么办?在线程中包装触及COM的所有内容并让该线程执行自己的COM(un)初始化?

与那些开源单位一样,它真的天真有多糟糕?在VCL应用程序中使用它们时,它们的COM(un)初始化将始终在主线程上运行,主线程已经先执行了Forms.TApplication.Create.这会使单位的电话无辜而无用吗?如果任何单位在.dpr之前列出Forms怎么办?那些非VCL应用程序或DLL呢?在纠正之前我不应该使用这些装置吗?我是否应该以某种方式防范他们可能会尝试做什么,通过预防性地初始化COM?

这是一个相当复杂的问题,但这一切都归结为:如何(容易)避免COM(un)初始化方面的麻烦?

delphi com

4
推荐指数
1
解决办法
144
查看次数

如何将Indy UTF-8响应转换为本机Delphi(Unicode)字符串?

使用Indy THTTP我获得了一个响应,Content-Type: text/html; charset=UTF-8并将其存储在一个TStringStream.如果我然后使用ReponseStream.ReadString(ResponseStream.Size),结果String不正确显示.我敢打赌这是因为Windows使用UTF-16.

我尝试了一些事情TEncoding.UTF8,并TEncoding.Convert只搞砸更加的结果(开始研究中国).

这是当前的代码:

var
  LHTTP: TIdHTTP;
  LResponseStream: TStringStream;
  LResponse: String;
begin
  LResponseStream := TStringStream.Create();
  try
    LHTTP := TIdHTTP.Create(nil);
    try
      LHTTP.Get('url', LResponseStream); // Returns 'h?llo'
    finally
      LHTTP.Free;
    end;
    LResponseStream.Position := 0;
    LResponse := LResponseStream.ReadString(LResponseStream.Size);
    ShowMessage(LResponse); // Make me pretty
  finally
    LResponseStream.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我应该改变什么来获得常规的Delphi String......?

delphi indy utf-8 character-encoding delphi-2010

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

为什么这个PAnsiChar在转换为AnsiString时会被切断?

请考虑以下计划:

program SO41175184;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function Int9999: PAnsiChar;
begin
  Result := PAnsiChar(AnsiString(IntToStr(9999)));
end;

function Int99999: PAnsiChar;
begin
  Result := PAnsiChar(AnsiString(IntToStr(99999)));
end;

function Int999999: PAnsiChar;
begin
  Result := PAnsiChar(AnsiString(IntToStr(999999)));
end;

function Str9999: PAnsiChar;
begin
  Result := PAnsiChar(AnsiString('9999'));
end;

function Str99999: PAnsiChar;
begin
  Result := PAnsiChar(AnsiString('99999'));
end;

function Str999999: PAnsiChar;
begin
  Result := PAnsiChar(AnsiString('999999'));
end;

begin
  WriteLn(Int9999); // '9999'
  WriteLn(Int99999); // '99999'
  WriteLn(Int999999); // '999999'

  WriteLn(string(AnsiString(Str9999))); // '9999'
  WriteLn(string(AnsiString(Str99999))); // '99999'
  WriteLn(string(AnsiString(Str999999))); // '999999'

  WriteLn(string(AnsiString(PAnsiChar(AnsiString(IntToStr(9999)))))); // '9999'
  WriteLn(string(AnsiString(PAnsiChar(AnsiString(IntToStr(99999)))))); // '99999' …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2010 delphi-xe3

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

关于单元初始化我可以假设什么?

文档描述了在程序启动时发生的单元初始化,但在(自动加载)BPL 的情况下存在例外。顺序是由单元之间的依赖关系决定的,所以我不能假设它总是相同的。关于单元初始化我可以假设什么?这可能是一个广泛的问题,但我希望下面的子问题的答案是高度相关的。

  • 在什么条件下单元会被初始化?
  • 所有初始化确实在启动时发生还是文档过于简单化了?
  • 如果不是,还有什么会触发它?
  • 它是严格顺序的,意味着每个单元在下一个单元之前都已完全初始化吗?
  • 所有初始化都在主线程中执行吗?
  • 如果不是,它仍然是线程安全的吗?

我无法找到对此进行更深入探讨的文档。

delphi

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

如何将方法的嵌套过程作为参数传递?

如果TForm有一个TListBox上面,下面的工作:

procedure TForm1.FormCreate(Sender: TObject);
  procedure _WorkOnListBox;
  begin
    ListBox.Items.Append('Test');
  end;
begin  
  _WorkOnListBox;
end;
Run Code Online (Sandbox Code Playgroud)

如下所示:

procedure TForm1.DoWithoutListBoxEvents(AProc: TProc);
begin
  ListBox.Items.BeginUpdate;
  try
    AProc;  
  finally
    ListBox.Items.EndUpdate;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoWithoutListBoxEvents(procedure
  begin
    LayersListBox.Items.Append('Test'); 
  end);
end;
Run Code Online (Sandbox Code Playgroud)

但以下不是:

procedure TForm1.FormCreate(Sender: TObject);
  procedure _WorkOnListBox;
  begin
    ListBox.Items.Append('Test');
  end;
begin  
  DoWithoutListBoxEvents(_WorkOnListBox);
end;
Run Code Online (Sandbox Code Playgroud)

我得到了E2555 Cannot capture symbol '_WorkOnListBox'.为什么?有没有办法在DoWithoutListBoxEvents不使用匿名程序的情况下开始工作?虽然我认为它看起来很优雅,但我试图保持FPC兼容.

delphi freepascal delphi-2010

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