标签: delphi-xe7

Delphi中的EProgrammerNotFound异常?

在Delphi 2009中,SysUtils.pas包含第425行:

EProgrammerNotFound = class(Exception);
Run Code Online (Sandbox Code Playgroud)
  • 这只是一个复活节彩蛋还是严肃的东西?
  • 什么时候应该提出这个例外?
  • 它是否也存在于Delphi Prism和/或Free Pascal中?

问:这个异常类是否仍在Delphi中声明(目前是XE7)?答:是的,甚至有记录!

指示软件故障的非标准方式.

您可以使用EProgrammerNotFound作为替代,以指示在运行时检测到的软件故障.

delphi delphi-2009 delphi-xe7

122
推荐指数
6
解决办法
8221
查看次数

Writeln能否支持Unicode?

考虑这个程序:

{$APPTYPE CONSOLE}

begin
  Writeln('????????Z??????????????????????????????????????');
end.
Run Code Online (Sandbox Code Playgroud)

我的控制台上使用Consolas字体的输出是:

????????Z??????????????????????????????????????

Windows控制台非常能够支持Unicode,如此程序所示:

{$APPTYPE CONSOLE}

uses
  Winapi.Windows;

const
  Text = '????????Z??????????????????????????????????????';

var
  NumWritten: DWORD;

begin
  WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), PChar(Text), Length(Text), NumWritten, nil);
end.
Run Code Online (Sandbox Code Playgroud)

输出为:

????????Z??????????????????????????????????????

可以Writeln说服尊重Unicode,还是它固有的残缺?

windows delphi delphi-xe7

25
推荐指数
3
解决办法
3098
查看次数

使用Canvas.TextOut有什么含义?

介绍

我的问题来自于过去几天我一直在处理的一个相当有趣的问题.我最近问了一个关于编写自定义属性检查器的问题 - 如何在验证值时处理内部编辑器焦点?

我已经在我的控件上取得了一些不错的进步,比如在中间添加一个分隔符来分隔Name和Value行,重要的是分隔符可以用来调整两列的大小.

这是我的问题开始的地方,让inplace编辑器可见,同时调整分隔符的大小导致我的控制稍微减慢.所以我进一步改变了代码,只显示了inplace编辑器,如果没有调整分隔符的大小.基本上,我习惯Canvas.TextOut将我的值绘制为字符串,如果选择了一行,则上面显示了Inplace编辑器.如果已调整分隔符大小,则inplace编辑器将隐藏,一旦调整大小操作完成,就地编辑器将再次可见.

虽然这解决了我提到的轻微减速问题,但我遇到了一个新问题,因为来自内部编辑器(基本上是TEdit)的文本与我正在使用的文本略有不同 Canvas.TextOut


例1

差异非常微妙,但如果你看得足够近,你可以看到它:

图1 Canvas.TextOut

在此输入图像描述

图2 DrawText

您可能需要使用屏幕放大镜看起来更近,但与SomeText排它是更明显的间距之间SomeText也的TeText略有不同.


例2

稍微好一点的例子或许之间的比较Canvas.TextOut,并DrawText在内置的编辑器(TEDIT)文本:

在此输入图像描述

图3比较

正如你所看到的,这里的区别更为突出.字符串True清晰地显示了文本字符在使用时间距更大Canvas.TextOut,其中DrawTextinplace editor文本字符完全相同.

当我使用时,Canvas.TextOut我在调整检查器分隔符的大小以及显示和隐藏内部编辑器之间遇到了各种可怕的文本不匹配.如果我没有尝试并尝试替代文本绘制方法,我认为我不会意识到差异并找到了解决方案.重要的是要知道我在将文本绘制到画布时使用完全相同的字体设置作为我为内置编辑器定义的字体.

现在我正在使用DrawText而不是Canvas.TextOut一切正在与inplace编辑器一致工作,以及我想要它的确切方式.


我的问题是什么使Canvas.TextOut渲染文本变得如此不同DrawText?从我的例子和处理我当前的问题,很明显,Canvas.TextOut不会以与具有相同Font设置的TEdit相同的方式DrawText呈现文本,但是渲染文本看起来似乎是正确的方式.

这让我质疑使用Canvas.TextOut,如果它没有正确呈现文本,我应该总是使用DrawText吗?


测试演示

您可以使用以下代码自行测试:

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe7

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

使用便携式打印机通过蓝牙与Delphi XE7连接

我正在尝试通过蓝牙与Sewoo LK-P32打印机通信.为此,我使用的是Delphi XE7.我做了一些Delphi附带的例子并没有成功.我把配对的打印机放在平板电脑中,即使这样我也无法连续打印.

当我打印的东西必须重新启动应用程序,所以我可以再打印一些东西.在我的来源下面.

有人能帮助我吗?支持这个问题?我尝试其他技术的时间很短.

启动与打印机通信的方法

procedure TForm2.ButtonClickStart(Sender: TObject);
var
  Msg, Texto: string;
  I, B: Integer;
  BluetoothAdapter: TBluetoothAdapter;
  ListaDeAparelhosPareados: TBluetoothDeviceList;
  LServices: TBluetoothServiceList;
begin
  try
    Memo1.Lines.Add('Ponto 1');
    FBluetoothManager := TBluetoothManager.Current;
    if FBluetoothManager = nil then
      Memo1.Lines.Add('FBluetoothManager esta nulo');

    Memo1.Lines.Add('Ponto 2');
    BluetoothAdapter := FBluetoothManager.CurrentAdapter;
    if BluetoothAdapter = nil then
    Memo1.Lines.Add('BluetoothAdapter esta nulo');

    ListaDeAparelhosPareados := BluetoothAdapter.PairedDevices;
    Memo1.Lines.Add('Ponto 3');
    if ListaDeAparelhosPareados = nil then
      Memo1.Lines.Add('ListaDeAparelhosPareados esta nulo');

    for I := 0 to ListaDeAparelhosPareados.Count - 1 do
    begin
      LDevice := ListaDeAparelhosPareados[I] …
Run Code Online (Sandbox Code Playgroud)

delphi bluetooth firemonkey delphi-xe7

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

为什么Delphi zlib和zip库在64位下如此之慢?

在对现实世界的应用程序进行基准测试时,我遇到了与Delphi附带的zlib和zip库相关的令人惊讶的性能特征.

我的实际应用程序导出.xlsx文件.此文件格式是包含在ZIP容器文件中的XML文件的集合..xlsx导出代码生成XML文件,然后将它们提供给Delphi ZIP库.一旦我将XML文件生成优化到ZIP创建是我发现的瓶颈,令我惊讶的是,64位代码明显慢于32位代码.

为了进一步研究这个,我创建了这个测试程序:

program zlib_perf;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, System.Classes, System.Diagnostics, System.Zip;

const
  LoremIpsum =
    'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod '+
    'tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, '+
    'quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo '+
    'consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse '+
    'cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat '+
    'non proident, sunt …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe2 delphi-xe7

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

为什么在本地声明TMemoryStream时此代码失败但在全局声明时有效?

以下函数获取Richedit控件中的选定文本,写入TMemoryStream回调函数内部,然后以纯文本字符串形式返回原始rtf代码.

var
  MS: TMemoryStream; // declared globally and works.

implementation

function GetSelectedRTFCode(RichEdit: TRichedit): string;

  function RichEditCallBack(dwCookie: Longint; pbBuff: PByte;
    CB: Longint; var pCB: Pointer): Longint; stdcall;
  begin
    MS.WriteBuffer(pbBuff^, CB);
    Result := CB;
  end;

var
  EditStream: TEditStream;
  SL: TStringList;
begin
  MS := TMemoryStream.Create;
  try
    EditStream.dwCookie     := SF_RTF or SFF_SELECTION;
    EditStream.dwError      := 0;
    EditStream.pfnCallback  := @RichEditCallBack;
    Richedit.Perform(EM_StreamOut, SF_RTF or SFF_SELECTION, DWord(@EditStream));
    MS.Seek(0, soBeginning);

    SL := TStringList.Create;
    try
      SL.LoadFromStream(MS);
      Result := SL.Text;
    finally
      SL.Free;
    end;
  finally
    MS.Free;
  end;
end; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe7

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

TJson.JsonToObject <T>在多线程环境中抛出错误

当使用TJson.JsonToObject在多线程环境中随机访问冲突发生.我在很长一段时间内都在寻找这个问题,我可以用下面的代码来隔离它

JSON类

type
   TParameter = class
   public
      FName     : string;
      FDataType : string;
      FValue    : string;
   end;
Run Code Online (Sandbox Code Playgroud)

Testfunction:

procedure Test();
var
   myTasks: array of ITask;
   i : integer;
   max : integer;
begin

  max := 50;
  SetLength(myTasks, max);
  for i := 0 to max  -1  do begin
     myTasks[i] := TTask.Create(procedure ()
       var
          json : string;
          p : TParameter;
       begin
          json := '{"name":"NameOfParam","dataType":"TypeOfParam","value":"ValueOfParam"}';
          p := TJson.JsonToObject<TParameter>(json);
          p.Free;
       end);
     myTasks[i].Start;
  end;

  TTask.WaitForAll(myTasks);
  ShowMessage('all done!');
end;
Run Code Online (Sandbox Code Playgroud)

它只是一个基于更复杂源代码的代码片段.只要我在单个线程中使用此代码,一切都可以正常运行.我想知道代码是否有任何问题.

delphi rest multithreading json delphi-xe7

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

即使在Items.clear之后,TPopupMenu仍保留最大宽度

如何重置PopupMenu项目列表的最大宽度?

比如你在运行时向popupmenu添加一些TMenuItems:

item1: [xxxxxxxxxxxxxxxxxxx]
item2: [xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]
Run Code Online (Sandbox Code Playgroud)

菜单会自动调整大小以适合最大的项目.但是然后你做Items.Clear并添加一个新项目:

item1: [xxxxxxxxxxxx                    ]
Run Code Online (Sandbox Code Playgroud)

最终结果如此,标题后面有一个很大的空白区域.

除了重新创建popupmenu之外还有其他解决方法吗?

这里是重现这种异常的代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  t: TMenuItem;
begin
  t := TMenuItem.Create(PopupMenu1);
  t.Caption := 'largelargelargelargelargelarge';
  PopupMenu1.Items.Add(t);
  PopupMenu1.Popup(200, 200);
end;

procedure TForm1.Button2Click(Sender: TObject);
var 
  t: TMenuItem;
begin
  PopupMenu1.Items.Clear;
  t := TMenuItem.Create(PopupMenu1);
  t.Caption := 'short';
  PopupMenu1.Items.Add(t);
  PopupMenu1.Popup(200, 200);
end;
Run Code Online (Sandbox Code Playgroud)

delphi popupmenu menuitem delphi-xe7

14
推荐指数
2
解决办法
1333
查看次数

是否可以有两个同名的属性?

是否可以有两个同名的属性?

property  Cell [Cl, Rw: Integer]: string   read getCell  write setCell;
property  Cell [ColName: string; Rw: Integer]: string read getCellByCol write setCellByCol;
Run Code Online (Sandbox Code Playgroud)

好吧,我试过了,编译器不会让我这样做,但也许有一个技巧......?

delphi delphi-xe7

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

为什么TPath.HasValidPathChars接受'?' 作为路径中的有效字符?

为什么System.IOUtils.TPath.HasValidPathChars接受'?' 作为路径中的有效字符?我将第二个参数(UseWildcards)设置为false.所以,根据文件'?' 应该被拒绝.但是,该函数为'c:\ test\test?\'返回True.

UseWildcards =指定是否将掩码字符视为有效路径字符(例如星号或问号).

此功能的行为是否仅部分正确?该功能可以返回更好的结果吗?

delphi directory path delphi-xe7

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