我在VMWare下的Windows7 VM中安装了XE4.
我的问题是,在确定我是否已经消耗(另一个)允许的安装时,Delphi保护系统会考虑VM的哪些方面?我想它会注意到VM中的VM名称和用户帐户名称,但这些是正确的还有其他吗?
我问,因为除其他外我不想发现修补VM的设置耗尽了我允许的安装(而且我可能能够增加数量,而Embarcadero仍在营业,这并不能保证我将来可以在某个任意点).
我想从MS Access文件中读取整个表,我正在尝试尽快完成.在测试大样本时,我发现循环计数器在读取与表的最后记录相比的最高记录时增加得更快.这是一个演示此示例的示例代码:
procedure TForm1.Button1Click(Sender: TObject);
const
MaxRecords = 40000;
Step = 5000;
var
I, J: Integer;
Table: TADOTable;
T: Cardinal;
Ts: TCardinalDynArray;
begin
Table := TADOTable.Create(nil);
Table.ConnectionString :=
'Provider=Microsoft.ACE.OLEDB.12.0;'+
'Data Source=BigMDB.accdb;'+
'Mode=Read|Share Deny Read|Share Deny Write;'+
'Persist Security Info=False';
Table.TableName := 'Table1';
Table.Open;
J := 0;
SetLength(Ts, MaxRecords div Step);
T := GetTickCount;
for I := 1 to MaxRecords do
begin
Table.Next;
if ((I mod Step) = 0) then
begin
T := GetTickCount - T;
Ts[J] := T;
Inc(J);
T …Run Code Online (Sandbox Code Playgroud) 我在尝试将由MS SQL Server 2014实例返回的XML数据解码为以D7编写的应用程序时遇到问题.(Indy的版本是附带的版本,9.00.10).
更新 当我最初编写此q时,我的印象是blob字段的内容需要进行Base64解码,但似乎这是错误的.遵循Remy Lebeau的建议,blob流在解码之前包含字段名称和字段值中的可识别文本,但之后不包含.
在下面的代码中,AdoQuery中的SQL很简单
从作者中选择*,其中au_lname ='White'对于XML Auto
Authors表是演示'pubs'数据库中的表.我添加了"Where"子句来限制结果集的大小,这样我就可以显示返回的blob的十六进制转储.
根据Sql Server OLH,指定'For XML Auto'时返回数据的默认类型是'binary base64-encoded format'.如果我让IDE创建此字段,AdoQuery的单个字段的数据类型是ftBlob.
执行以下代码会生成异常"DecodeToStream中的不均匀大小".在调用时IdDecoderMIME.DecodeToString(S),字符串S的长度为3514,3514 mod 4为2,而不是0,因为它显然应该是,因此是例外.我已经确认字段值中的字节数是3514,因此变量的大小和字符串的长度没有区别,即两者之间没有任何差异.
procedure TForm1.FormCreate(Sender: TObject);
var
SS : TStringStream;
Output : String;
S : String;
IdDecoderMIME : TIdDecoderMIME;
begin
SS := TStringStream.Create('');
IdDecoderMIME := TIdDecoderMIME.Create(Nil);
try
AdoQuery1.Open;
TBlobField(AdoQuery1.Fields[0]).SaveToStream(SS);
S := SS.DataString;
IdDecoderMIME.FillChar := #0;
Output := IdDecoderMIME.DecodeToString(S);
Memo1.Lines.Text := S;
finally
SS.Free;
IdDecoderMIME.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码:
procedure TForm1.FormCreate(Sender: TObject);
var
SS : TStringStream;
MS : TMemoryStream;
Output …Run Code Online (Sandbox Code Playgroud) 调试我的代码,我注意到Delphi编译器(柏林10.1)没有警告没有返回值的函数.这是正常的吗?
一个简单的例子:
function f(s:string):String;
begin
stringreplace(s,#32,'',[rfReplaceAll]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
showmessage(F('te st'));
end;
Run Code Online (Sandbox Code Playgroud)
这条线
stringreplace(s,#32,'',[rfReplaceAll]);
Run Code Online (Sandbox Code Playgroud)
应该
result:= stringreplace(s,#32,'',[rfReplaceAll]);
Run Code Online (Sandbox Code Playgroud)
没有警告!
我认为它应该警告"返回值可能未定义".但事实并非如此.我在最后几天更改并重写了旧代码的一部分.我恐怕在我的申请中有这种错误.
使用D5中的TAdoConnection使用passworded sa帐户连接到Windows 7 64位计算机上的本地Sql Server,我收到错误"用户sa登录失败",尽管我已经构建了TAdoConnection连接字符串到包括密码.到BeforeConnect事件触发时,ConnectionString不再包含密码.我可以在WillConnect事件中设置密码,然后连接正常.
我的问题是,什么从ConnectionString中删除密码?是否可能在W7中添加了一些安全功能 - 我不记得在XP上遇到这个问题.
顺便说一句:即使我在ConnectionString中将Persist Security Info设置为true,这个问题仍然会发生 - 密码甚至不会存储在DFM中.
下面是一个SSCCE,它基于Chris Rolliston优秀的Delphi XE2基础知识书第1部分的匿名方法部分中的一个例子,关于变量捕获的概念(其中的任何错误完全取决于我).
它完全按照我的预期工作,在连续点击BtnInvoke按钮时记录666,667,668,669.特别是它很好地说明了在btnSetUpClick退出后很长时间内捕获的局部变量版本I的持续时间.
到现在为止还挺好.我问的问题不在于这个代码本身,而是在Allen Bauer的博客中所说的:
http://blogs.embarcadero.com/abauer/2008/10/15/38876
现在,我知道最好不要和老板争论,所以我确信我错过了他在变量捕获和价值捕获之间区分的重点.以我简单的方式查看它,我的基于CR的示例通过捕获I作为变量来捕获I的值.
所以,我的问题是,鲍尔先生试图绘制的区别究竟是什么?
(顺便说一句,尽管每天都会看到SO的Delphi部分超过9个月,但我仍然不完全清楚这个q是否在主题上.如果没有,我道歉并且我会把它取下来.)
type
TAnonProc = reference to procedure;
var
P1,
P2 : TAnonProc;
procedure TForm2.Log(Msg : String);
begin
Memo1.Lines.Add(Msg);
end;
procedure TForm2.btnSetUpClick(Sender: TObject);
var
I : Integer;
begin
I := 41;
P1 := procedure
begin
Inc(I);
Log(IntToStr(I));
end;
I := 665;
P2 := procedure
begin
Inc(I);
Log(IntToStr(I));
end;
end;
procedure TForm2.btnInvokeClick(Sender: TObject);
begin
Assert(Assigned(P1));
Assert(Assigned(P2));
P1;
P2;
end;
Run Code Online (Sandbox Code Playgroud) 以下是我对此问题的回答:
事实证明,在D7和XE3之间的某个时刻,IDE的Watch Window的实现从使用TListView变为TVirtualStringTree.
虽然我发布了一个更新我的答案,通过忽略VST并从剪贴板获取监视值来使用XE4,我仍然希望能够从VST获得监视值,如果可以的话.一旦我引用了VST,我想我知道怎么做,但问题是我尝试获取VST失败了.
以下是我在自定义包中使用的代码的MCVE.希望它的作用是不言自明的.问题是块中的代码
if WatchWindow.Components[i] is TVirtualStringTree then begin
[...]
end;
Run Code Online (Sandbox Code Playgroud)
从不执行,DESOPITE出现在Memo1中的类名"TVirtualStringTree".显然,具有该类名的组件未通过"是"测试.我猜测的原因是编译到IDE中的TVirtualTreeView是一个与我正在使用的版本不同的版本,v.5.3.0,这是我能找到的最接近XE4的前身.
所以,我的问题是,这是可能的解释,我能做些什么吗?我怀疑是否有人可以通过帽子来繁荣用于XE4的TVirtualStringTree版本,这可能会解决我的问题.
type
TOtaMenuForm = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
WatchWindow : TForm;
VST : TVirtualStringTree;
end;
procedure TOtaMenuForm.FormCreate(Sender: TObject);
var
i : Integer;
S : String;
begin
WatchWindow := Nil;
VST := Nil;
// Iterate the IDE's forms to find the Watch Window
for i := 0 to Screen.FormCount - 1 do begin
S := Screen.Forms[i].Name;
if CompareText(S, 'WatchWindow') = 0 then begin …Run Code Online (Sandbox Code Playgroud) 我试图从TLayout控件生成位图.要做到这一点,我正在使用TControl.Makescreenshot功能.在Windows上测试应用程序时,一切都按预期工作:

但是,运行在iOS,安卓(包括模拟器和真实设备)的应用程序时,结果是这样的(图像周围的红色边框绘制只是位图的边界内):

在移动版本中,图像是一半大小并且边框被裁剪.
这是我使用的代码:
(.PAS)
unit Unit15;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Objects, FMX.Layouts, FMX.Edit;
type
TForm15 = class(TForm)
Layout1: TLayout;
Image1: TImage;
Button1: TButton;
CheckBox1: TCheckBox;
Label1: TLabel;
Switch1: TSwitch;
ArcDial1: TArcDial;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form15: TForm15;
implementation
{$R *.fmx}
procedure TForm15.Button1Click(Sender: TObject);
begin
Image1.Bitmap := Layout1.MakeScreenshot;
Image1.Bitmap.Canvas.BeginScene;
try
Image1.Bitmap.Canvas.Stroke.Color := TAlphaColorRec.Red; …Run Code Online (Sandbox Code Playgroud) 这个问题是提供一个MCVE来说明我之前的一个问题所揭示的问题:
使用TJSONUnMarshal自定义注册的Reverter意外失败
在我之前的q中,来自@VirusTrinity的答案解决了我最初遇到的问题,即通过解组操作获得的对象错误地返回了Nil TStringlist字段.但是,修复程序发现了一个新问题,即在关闭应用程序时,它会生成0xC0000005异常,地址0x00000000处的访问冲突读取地址0x00000000.下面的代码显示了这种行为,在关闭时生成相同的AV,原因相同.
由于在Data.DBXJSONReflect 中执行PopulateFields(objFields, Obj, customizer);in 期间内存损坏,AV显然会发生function TJSONUnMarshal.CreateObject(JsonObj: TJSONObject): TObject.
如果您在代码中显示如下所示的断点,请在TEncoding.FAnsiEncoding上添加一个监视,然后单步执行
AnObject:= jUnmarshal.Unmarshal(jValue);
Run Code Online (Sandbox Code Playgroud)
你会发现FMaxCharSize中的值从1变为5(有时在之前的q中我得到7而不是5).这种变化似乎是内存损坏的症状,这显然会导致AV关机.
更新:要查看AV发生的位置,请在类过程TEncoding.FreeEncodings的入口点放置一个断点.对我来说,AV发生在
FreeAndNil(FANSIEncoding);
Run Code Online (Sandbox Code Playgroud)
叫做.
更新#2: TEncoding.FAnsiEncoding被破坏的点function TJSONUnMarshal.ClassTypeOf是使用具有值的Field参数调用的时间FDelimiter并执行语句
fRtti := tRtti.GetField(Field);
Run Code Online (Sandbox Code Playgroud)
ClassTypeOf来自声明的呼吁
else if HasReverter(ComposeKey(ClassTypeOf(Data, FieldName),
FIELD_ANY)) then
Run Code Online (Sandbox Code Playgroud)
在30222/3023号线 procedure TJSONUnMarshal.PopulateFields
任何人都可以确认问题,并告知它为什么会发生?
码:
program MATest;
{$APPTYPE CONSOLE}
uses Classes, System.SysUtils, JSon, DBXJson, DBXJSONReflect;
procedure Test;
var
TL1,
TL2 : TStringlist;
AnObject : TObject;
jMarshal: TJSONMarshal;
jUnMarshal : TJSonUnMarshal;
jValue: TJSONValue;
begin
TL1 := TStringlist.Create;
TL1.Add('AAA');
try …Run Code Online (Sandbox Code Playgroud) 假设我想在文档的末尾添加一些文本并立即将其作为Range对象访问,这样我就可以设置它的一些属性而不影响前面的文本.理想情况下,该Range.InsertAfter
方法将返回一个Range对象,这对于此是完美的,但事实并非如此.
让我感到烦恼的是,Word必须完全清楚哪个范围定义了调用的结果InsertAfter,但从表面上看,我需要从插入文本的长度"或事后"计算它,或者以其他方式计算它.
所以我设计了一个简单的解决方法.在伪代码中(实际上它是Delphi代码,但我希望不会阻止VBA答案)我所做的就是这个
ARange := Document.Range
ARange.Text := 'AAA'
AEnd := ARange.End - 1 // AEnd is an integer
ARange.SetRange(AEnd, AEnd)
ARange.Text := 'XXX'
ARange.Bold := True
Run Code Online (Sandbox Code Playgroud)
似乎我可以通过重复第二个代码块无限期地将文本块添加到文档的末尾.
这条线
ARange.SetRange(AEnd, AEnd)
Run Code Online (Sandbox Code Playgroud)
据我了解,似乎在现有的一个末尾构建一个新的Range(不像在现有范围上调用Collapse),并且对于我尝试过的简单测试用例工作正常.但它让我想知道我是否在某个地方错过了一个技巧.是否有更直接的方法将范围附加到文档并获取对它的引用?
PS:我应该更清楚一点,我试图在不使用Selection对象的情况下这样做(出于各种原因,包括你现在只能有一个这样的事实).
delphi ×10
delphi-xe5 ×2
ado ×1
android ×1
delphi-7 ×1
delphi-xe2 ×1
delphi-xe4 ×1
ios ×1
ms-access ×1
ms-word ×1
sql-server ×1
vba ×1
xml ×1