在Delphi 2009中,SysUtils.pas包含第425行:
EProgrammerNotFound = class(Exception);
Run Code Online (Sandbox Code Playgroud)
问:这个异常类是否仍在Delphi中声明(目前是XE7)?答:是的,甚至有记录!
指示软件故障的非标准方式.
您可以使用EProgrammerNotFound作为替代,以指示在运行时检测到的软件故障.
考虑这个程序:
{$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,还是它固有的残缺?
我的问题来自于过去几天我一直在处理的一个相当有趣的问题.我最近问了一个关于编写自定义属性检查器的问题 - 如何在验证值时处理内部编辑器焦点?
我已经在我的控件上取得了一些不错的进步,比如在中间添加一个分隔符来分隔Name和Value行,重要的是分隔符可以用来调整两列的大小.
这是我的问题开始的地方,让inplace编辑器可见,同时调整分隔符的大小导致我的控制稍微减慢.所以我进一步改变了代码,只显示了inplace编辑器,如果没有调整分隔符的大小.基本上,我习惯Canvas.TextOut
将我的值绘制为字符串,如果选择了一行,则上面显示了Inplace编辑器.如果已调整分隔符大小,则inplace编辑器将隐藏,一旦调整大小操作完成,就地编辑器将再次可见.
虽然这解决了我提到的轻微减速问题,但我遇到了一个新问题,因为来自内部编辑器(基本上是TEdit)的文本与我正在使用的文本略有不同 Canvas.TextOut
差异非常微妙,但如果你看得足够近,你可以看到它:
图1 Canvas.TextOut
图2 DrawText
您可能需要使用屏幕放大镜看起来更近,但与SomeText排它是更明显的间距之间Some
和Text
也的T
和e
在Text
略有不同.
稍微好一点的例子或许之间的比较Canvas.TextOut
,并DrawText
在内置的编辑器(TEDIT)文本:
图3比较
正如你所看到的,这里的区别更为突出.字符串True
清晰地显示了文本字符在使用时间距更大Canvas.TextOut
,其中DrawText
和inplace 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) 我正在尝试通过蓝牙与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附带的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) 以下函数获取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) 当使用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)
它只是一个基于更复杂源代码的代码片段.只要我在单个线程中使用此代码,一切都可以正常运行.我想知道代码是否有任何问题.
如何重置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) 是否可以有两个同名的属性?
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)
好吧,我试过了,编译器不会让我这样做,但也许有一个技巧......?
为什么System.IOUtils.TPath.HasValidPathChars接受'?' 作为路径中的有效字符?我将第二个参数(UseWildcards)设置为false.所以,根据文件'?' 应该被拒绝.但是,该函数为'c:\ test\test?\'返回True.
UseWildcards =指定是否将掩码字符视为有效路径字符(例如星号或问号).
此功能的行为是否仅部分正确?该功能可以返回更好的结果吗?
delphi ×10
delphi-xe7 ×10
bluetooth ×1
delphi-2009 ×1
delphi-xe2 ×1
directory ×1
firemonkey ×1
json ×1
menuitem ×1
path ×1
popupmenu ×1
rest ×1
windows ×1