标签: delphi-xe3

加载Excel电子表格的快捷方式

我正在使用此代码加载仅包含数字的Excel电子表格.但是将整个文件加载到a中需要很长时间stringgrid,任何人都知道更快的方法吗?

procedure sh1(SheetIndex:integer);
Var
Xlapp1, Sheet:Variant ;
MaxRow, MaxCol,X, Y:integer ;
str:string;
begin
Str:=trim(form2.OpenDialog1.FileName);

XLApp1 := createoleobject('excel.application');
XLApp1.Workbooks.open(Str) ;

Sheet := XLApp1.WorkSheets[SheetIndex] ;

MaxRow := Sheet.Usedrange.EntireRow.count ;
MaxCol := sheet.Usedrange.EntireColumn.count;

form2.stringgrid1.RowCount:=maxRow+1;
form2.StringGrid1.ColCount:=maxCol+1;
for x:=1 to maxCol do
     for y:=1 to maxRow do
            form2.stringgrid1.Cells[x,y]:=sheet.cells.item[y,x].value;

XLApp1.Workbooks.close;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
if opendialog1.Execute then begin
    stringgrid1.Visible:=true;
    sh1(1);
    end;
end;
Run Code Online (Sandbox Code Playgroud)

delphi excel delphi-xe3

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

如何配置FastMM以检测dll中的内存泄漏

我无法弄清楚如何检测静态或甚至动态链接的DLL中的内存泄漏.我只想检测dll中的泄漏,我不想在dll和应用程序之间共享内存管理器.此外,dll 与运行时包链接

我的示例dll看起来像这样:

library dll;
uses
  fastmm4,
  System.SysUtils,
  System.Classes;
{$R *.res}
procedure MyInit; stdcall;
Begin
  TObject.Create;
End;
exports MyInit;
begin
end.
Run Code Online (Sandbox Code Playgroud)

应用程序dpr:

program app;

uses
  //fastmm4,
  Vcl.Forms,
  main in 'main.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)

注意:如果我取消注释fastmm4,那么我可以检测到由应用程序(TStringList.Create)引起的memleak,而不是dll中的泄漏.

并在应用程序主单元中:

unit main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    LDLLHandle: HModule;
    LShowProc: TProcedure;
  end;

var
  Form1: TForm1;

{$ifdef static}
procedure MyInit; stdcall; external …
Run Code Online (Sandbox Code Playgroud)

delphi dll fastmm delphi-xe3

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

如何在派生类型中使用泛型方法

这看起来相当简单,也许我只是缺少一些语法粘合...这是我的简单泛型(Delphi XE3)示例:

unit Unit1;

interface

uses
  generics.collections;

type

X = class
public
  Id: Integer;
end;

XList<T : X> = class( TObjectList<T> )
 function Find(Id: Integer) : T;
end;

Y = class(X)

end;

YList = class(XList<Y>)
end;

implementation

{ XList<T> }

function XList<T>.Find(Id: Integer): T;
var
  t: X;
begin
  for t in Self do
    if t.Id = Id then
      Result := t;
end;

end.
Run Code Online (Sandbox Code Playgroud)

这不会用"[dcc32错误] Unit1.pas(41)编译:E2010不兼容的类型:'Y'和'X'".这是下线:

YList = class(XList<Y>)
end;
Run Code Online (Sandbox Code Playgroud)

Y来自X所以为什么会出现问题?

delphi generics inheritance delphi-xe3

7
推荐指数
2
解决办法
297
查看次数

在Delphi中仅设置一个VCL组件的样式

我知道,可以禁用组件的自定义样式,但是如何只为一个组件类启用样式?例如,将整个表格和所有组件留在上面,而皮肤只有TButton.喜欢这张图片.

在此输入图像描述

delphi vcl vcl-styles delphi-xe3

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

将自我作为函数返回的问题

我有一个非常简单的3D矢量类定义TVector3D,以及一些用于实现该TVector3D.Normalise功能的方法.如果我将Normalise函数传递给已经规范化的向量,我希望它返回我传递给它的向量.在这里我已经习惯了,Result := Self但我有一些疯狂的回报.

控制台应用程序:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TVector3D = Class
  public
    x : Single;
    y : Single;
    z : Single;
    constructor Create(x : Single;
                       y : Single;
                       z : Single);
    function GetMagnitude() : Single;
    function IsUnitVector() : Boolean;
    function Normalise() : TVector3D;
  end;

  constructor TVector3D.Create(x : Single;
                               y : Single;
                               z : Single);
  begin
    Self.x := x;
    Self.y := y;
    Self.z := z;
  end;

  function TVector3D.GetMagnitude; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe3

6
推荐指数
3
解决办法
728
查看次数

如何在TListView列上显示排序箭头?

Windows资源管理器有一个箭头,指示列表视图(在报表视图样式中)的哪个列按哪个方向排序(ASC与DESC).

是否可以TListView在Delphi中显示这样的排序指示箭头?

delphi listview delphi-xe3

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

Delphi XE3 - TDataSet的性能问题

使用XE3程序进行数据处理的时间比使用XE2编译的相同程序多10倍.这是已知问题(可能主要指TStringField),向QC 111942报告,但尚未修复.有没有人针对这个问题进行修复/解决?

TIA Branko

delphi delphi-xe3

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

为什么我不能返回任意数组的字符串?

编译器允许我执行以下操作:

procedure MyProc(const ADynData: array of string);
Run Code Online (Sandbox Code Playgroud)

要么

procedure MyProc(const ADynData: TStringDynArray);
Run Code Online (Sandbox Code Playgroud)

并传递任意数据,如下所示:

MyProc(['Data1', 'Data2']);
Run Code Online (Sandbox Code Playgroud)

但是,不允许

function MyFunc: TStringDynArray;
....
function MyFunc: TStringDynArray;
begin
    Result := ['Data1', 'Data2'];
end;
Run Code Online (Sandbox Code Playgroud)

要么

function MyFunc: TStringDynArray;
const
    CDynData: array[0..1] of string = ('Data1', 'Data2');
begin
    Result := CDynData;
end;
Run Code Online (Sandbox Code Playgroud)

为什么是这样?这在技术上是不是一回事?

对于这些特定场景,返回任意数组字符串的建议(和最有效)方法是什么?

arrays delphi delphi-xe3

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

如何正确使用TRttiMethod.Invoke中的字符串作为参数?

我正在尝试使用RTTI使用Text-property来概括可视组件的内容验证,但是当我尝试将字符串值传递给TRttiMethod.Invoke时,我收到消息"Invalid Typecast".(实际上是"UngültigeTypumwandlung",但我猜,这是一个合适的翻译.)

假设所有传递的对象都是完美的,下面的代码将被删除所有安全措施,断言等.

procedure ValidateTextFieldAndSetFocus(const Field: TObject; const Validator: TObject; const errorStates: array of TStringValidationResult; const sErrorMessage: string);
var
  context  : TRttiContext;
  objField : TRttiType;
  objValid : TRttiType;
  prop     : TRttiProperty;
  execute  : TRttiMethod;
  I        : Integer;
  validResult : TStringValidationResult;
  value    : TValue;
begin
  context  := TRttiContext.Create;
  objField := context.GetType(Field.ClassInfo);
  objValid := context.GetType(Validator.ClassInfo);
  prop     := objField.GetProperty('Text');
  value    := prop.GetValue(Field);
  execute  := objValid.GetMethod('Execute');
  for I := 0 to High(errorStates) do
    if execute.Invoke(Validator,[value]).TryAsType<TStringValidationResult>(validResult) then
      if validResult = errorStates[I] then
      begin
        SetFocusIfCan(Field);
        raise …
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-xe3

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

这个C乘法的等效Delphi代码是什么产生了一个超大的数字?

这个问题的背景是......我正试图int popcount_3(uint64_t x)维基百科中移植C函数:汉明重量,但它的算法不是这个问题的焦点.

假设x是无符号64位值的最大数量(即x = 18446744073709551615),在计算结束时,C代码将计算:

uint64_t iResult = 578721382704613384ull * 72340172838076673ull;
Run Code Online (Sandbox Code Playgroud)

首先我怀疑C代码引发了溢出错误,因为使用浮点乘法时操作的实际/实际结果等于41864804849942400000000000000000000,但事实上,该C代码没有编译错误.输出为4627501566018457608.

我们知道,上面C代码的Delphi代码是:

iResult := UInt64(578721382704613384) * UInt64(72340172838076673);
Run Code Online (Sandbox Code Playgroud)

Delphi编译器在转换或算术运算中引发错误E2099溢出.好的,我看到错误是合理的.

所以,我的问题是......对于超大数字的乘法,等效的Delphi代码是什么,以便Delphi给出与C相同的结果?

稍后补充

预测即将发生的潜在问题"为什么我使用真正的常量表达式提供示例?" ,原因是我想创建一个真常量,通过计算设置位数来计算计算机字中的位数High(NativeUInt).

重现步骤

GCC 4.8.1(MinGW)

#include <stdio.h>
#include <stdint.h>

int main () {
  uint64_t iResult = 578721382704613384ull * 72340172838076673ull;
  printf("iResult = %llu\n", iResult); // output --> 4627501566018457608
  return 0; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe3

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

标签 统计

delphi ×10

delphi-xe3 ×10

arrays ×1

dll ×1

excel ×1

fastmm ×1

generics ×1

inheritance ×1

listview ×1

rtti ×1

vcl ×1

vcl-styles ×1