小编Mar*_*ynA的帖子

在决定是否需要请求允许的安装计数时,Delphi激活会考虑哪些因素

我在VMWare下的Windows7 VM中安装了XE4.

我的问题是,在确定我是否已经消耗(另一个)允许的安装时,Delphi保护系统会考虑VM的哪些方面?我想它会注意到VM中的VM名称和用户帐户名称,但这些是正确的还有其他吗?

我问,因为除其他外我不想发现修补VM的设置耗尽了我允许的安装(而且我可能能够增加数量,而Embarcadero仍在营业,这并不能保证我将来可以在某个任意点).

delphi

10
推荐指数
0
解决办法
232
查看次数

为什么滚动ADOTable变得越来越慢?

我想从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)

delphi ms-access ado delphi-xe5

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

如何在D7中解码XML Blob字段

我在尝试将由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)

xml sql-server delphi delphi-7

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

Delphi编译器不会对此代码发出警告

调试我的代码,我注意到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)

没有警告!

我认为它应该警告"返回值可能未定义".但事实并非如此.我在最后几天更改并重写了旧代码的一部分.我恐怕在我的申请中有这种错误.

delphi delphi-10.1-berlin

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

TAdoConnection密码擅离职守

使用D5中的TAdoConnection使用passworded sa帐户连接到Windows 7 64位计算机上的本地Sql Server,我收到错误"用户sa登录失败",尽管我已经构建了TAdoConnection连接字符串到包括密码.到BeforeConnect事件触发时,ConnectionString不再包含密码.我可以在WillConnect事件中设置密码,然后连接正常.

我的问题是,什么从ConnectionString中删除密码?是否可能在W7中添加了一些安全功能 - 我不记得在XP上遇到这个问题.

顺便说一句:即使我在ConnectionString中将Persist Security Info设置为true,这个问题仍然会发生 - 密码甚至不会存储在DFM中.

delphi

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

匿名方法 - 变量捕获与值捕获

下面是一个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)

delphi delphi-xe2

6
推荐指数
2
解决办法
666
查看次数

获取Delphi IDE中对象的引用

以下是我对此问题的回答:

我可以更改监视列表中字符串的显示格式吗?

事实证明,在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)

delphi delphi-xe4

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

FireMonkey TControl.MakeScreenshot在Mobile平台上生成一个尺寸不足的位图

我试图从TLayout控件生成位图.要做到这一点,我正在使用TControl.Makescreenshot功能.在Windows上测试应用程序时,一切都按预期工作:

视窗

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

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)

delphi android ios firemonkey-fm3 delphi-xe5

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

在编组的TStringlist上调用TJSONUnMarshal.Unmarshal会导致内存损坏吗?

这个问题是提供一个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)

delphi delphi-10-seattle

5
推荐指数
0
解决办法
263
查看次数

MS Word函数将范围附加到文档

假设我想在文档的末尾添加一些文本并立即将其作为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 vba ms-word

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