我正在使用此代码加载仅包含数字的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) 我无法弄清楚如何检测静态或甚至动态链接的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 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所以为什么会出现问题?
我知道,可以禁用组件的自定义样式,但是如何只为一个组件类启用样式?例如,将整个表格和所有组件留在上面,而皮肤只有TButton.喜欢这张图片.

我有一个非常简单的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) Windows资源管理器有一个箭头,指示列表视图(在报表视图样式中)的哪个列按哪个方向排序(ASC与DESC).
是否可以TListView在Delphi中显示这样的排序指示箭头?
使用XE3程序进行数据处理的时间比使用XE2编译的相同程序多10倍.这是已知问题(可能主要指TStringField),向QC 111942报告,但尚未修复.有没有人针对这个问题进行修复/解决?
TIA Branko
编译器允许我执行以下操作:
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)
为什么是这样?这在技术上是不是一回事?
对于这些特定场景,返回任意数组字符串的建议(和最有效)方法是什么?
我正在尝试使用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) 这个问题的背景是......我正试图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 ×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