我有一个应用程序将使用测量,特别是低至1/16英寸.我真的希望最终用户输入包含小数部分的值的便捷方式,例如3 7/16.我意识到我可以要求用户输入十进制值(即3.1875),但我真的想要一个更好的方法.有没有人知道下拉或旋转控制使这容易进入?(理想情况下是控件的DB版本.)
在 Delphi 2010 中,我有一个 TreeView。树视图有一个定义为记录的数据对象。
// Define the Data Object that will be associated with each Node
type
TNodeRec = record
rId: Integer;
rDate: TDateTime;
rSite: string;
rURL: string;
rRedirURL: string;
rTitle: string;
rCategory: String;
rURL_RtnCode: Integer;
rURL_RtnText: String
end;
Run Code Online (Sandbox Code Playgroud)
我将此数据对象与树视图中的每个节点相关联,然后填写值。这工作正常......
var
BuffData: ^TNodeRec; // The data object associated with each node;
URLNode: TTreeNode;
begin
...
// Create our New Data Object
new(BuffData);
BuffData^.rId := 0;
BuffData^.rDate := EDate;
BuffData^.rURL := ElString;
BuffData^.rRedirURL := '';
BuffData^.rTitle := ElText;
URLNode := …Run Code Online (Sandbox Code Playgroud) 在Delphi XE6中,我有一个名为WordDict的TDictionary,它包含TWordRec的实例.定义是:
WordDict: TDictionary<string, TWordRec>;
...
type
TWordRec = class
public
RemoveAlways: Boolean; // Is this CORP LLC, etc?
RemoveRestricted: Boolean;
Replace: Boolean;
ReplaceWith: string;
Constructor Create(B1, B2, B3: Boolean; S1: String); overload;
end;
Run Code Online (Sandbox Code Playgroud)
当我创建并加载字典....
WordDict := TDictionary<string, TWordRec>.Create;
WordDict.Add('CO', TWordRec.Create(True, False, False, ''));
WordDict.Add('CORP', TWordRec.Create(True, False, False, ''));
...
Run Code Online (Sandbox Code Playgroud)
我遇到内存泄漏,并使用AQTime,它显示我的TWordRec每次出现"泄漏"内存.如果我将WordDict条目创建为TWordRec,如何在加载后处置它们?我是否处理它们,因为这不仅仅是字典中指向实际对象的指针吗?
装载后我是否立即丢弃TWord?当应用关闭时,我是否仅删除词典中的所有条目?我显然不明白为什么我在TWordRec上遇到内存泄漏,所以我不知道如何解决它...
谢谢!
我正在为Delphi XE6编写Excel插件.我不得不将行从一张纸"复制"到另一张纸.挑战在于我的操作比我想象的要花费更长的时间.例如,将500行(23列)从一张纸复制到另一张需要28秒左右......
部分挑战是我必须逐行处理.我有一个INT数组,每行一个INT.INT值告诉我是否需要复制该行...
...for loop i ... through entire array....
...if row I am interested in...
// Set the Original Sheet Active
MasterOrigSheet.Select;
// Build my row numbers
SourceRangeCell := 'A' + IntToStr(i);
DestRangeCell := 'A' + IntToStr(DestRowNumber);
// Copy the row from source to destination
MasterOrigSheet.Range[SourceRangeCell, SourceRangeCell].EntireRow.Copy
(NewSheet.Range[DestRangeCell, DestRangeCell].EntireRow);
Inc(DestRowNumber);
Run Code Online (Sandbox Code Playgroud)
有更快的方法吗?我正在复制整行.我没有使用COPY/PASTE缓冲区...任何帮助或想法赞赏.
在Delphi 10/Seattle中,我正在尝试进行嵌套的String测试...我有一个字符串,这是一个产品名称.我需要根据该产品名称找到产品类别.这将不区分大小写,每个产品只属于一个类别.一旦找到一个类别,我就可以停止检查......我的初始方法是在CASE语句中通过AnsiContainsText执行此操作,但这是不允许的,因为CASE语句没有通用函数...
我有一个应该有效的方法,但有更优雅的东西吗?我将对该类别进行大约40种不同的测试,并将在大约6000种产品上运行(循环)此测试,因此我希望尽可能高效.
// Determine new value...
Category := '';
if ((Category = '') and (AnsiContainsText(ProductText, 'PaaS')) then Category := 'PaaS';
if ((Category = '') and (AnsiContainsText(ProductText, 'IaaS')) then Category := 'IaaS';
if ((Category = '') and (AnsiContainsText(ProductText, 'SaaS')) then Category := 'SaaS';
...
Run Code Online (Sandbox Code Playgroud) 在Excel 2013中,我以编程方式添加图表.为此,我需要指定图表所在的位置.特别是顶部,左侧,高度和宽度.所有这些坐标都是点,而不是单元格地址.例如,单元格的默认高度(如果为15分).我知道我希望Graph所在的单元格地址.如何将单元格地址转换为某个点?必须有一种更好的方法,而不是迭代每个前一行/列并添加它们的高度/宽度......
例如,Cell'F7'可能是120分,并且顶点位置为90.
如果它有帮助,添加图表的语法是......
expression.AddChart2(Style,XlChartType,Left,Top,Width,Height,NewLayout)
Run Code Online (Sandbox Code Playgroud) 我有一些我试图清理的javascript代码...我最初用"暴力"风格编写了一个对象数组(称为myData)的定义.蛮力样式定义了4个对象的数组(数组总是大小为4).以这种方式定义我的应用程序工作正常.程序后面的代码读取JSON并以类似于以下语法更新各种元素:
myData[2].Quarter = "Q2";
Run Code Online (Sandbox Code Playgroud)
当我尝试清理/合并myData的定义时,我的代码运行时没有语法错误,但是数组的所有4个元素都以相同的值结束,其中在暴力样式中,数组中的每个对象最终都有不同的值.唯一不同的是两个定义.这就是我所说的"暴力",我的整个代码集工作正常......它实际上是同一个对象被复制了4次.
var myData = [
{
Quarter: 'EMPTY',
Field_Cloud:0,
Field_Cloud_Renew:0,
Field_On_Premise:0,
Field_Total:0,
OD_Cloud:0,
OD_Cloud_Renew:0,
OD_On_Premise:0,
OD_Total:0,
Field_OD_Total:0
},
{
Quarter: 'EMPTY',
Field_Cloud:0,
Field_Cloud_Renew:0,
Field_On_Premise:0,
Field_Total:0,
OD_Cloud:0,
OD_Cloud_Renew:0,
OD_On_Premise:0,
OD_Total:0,
Field_OD_Total:0
},
{
Quarter: 'EMPTY',
Field_Cloud:0,
Field_Cloud_Renew:0,
Field_On_Premise:0,
Field_Total:0,
OD_Cloud:0,
OD_Cloud_Renew:0,
OD_On_Premise:0,
OD_Total:0,
Field_OD_Total:0
},
{
Quarter: 'EMPTY',
Field_Cloud:0,
Field_Cloud_Renew:0,
Field_On_Premise:0,
Field_Total:0,
OD_Cloud:0,
OD_Cloud_Renew:0,
OD_On_Premise:0,
OD_Total:0,
Field_OD_Total:0
}
];
Run Code Online (Sandbox Code Playgroud)
我尝试将其整合到我认为应该是相同的代码,但随后我的应用程序不再有效.症状是阵列的所有4个对象最终都具有相同的值.
合并(但破损)的代码:
var myDataStruct= {
Quarter: 'EMPTY',
Field_Cloud:0,
Field_Cloud_Renew:0,
Field_On_Premise:0,
Field_Total:0,
OD_Cloud:0,
OD_Cloud_Renew:0,
OD_On_Premise:0,
OD_Total:0,
Field_OD_Total:0
};
var …Run Code Online (Sandbox Code Playgroud) 我在Delphi Tokyo编写了一个例程,它接受多个文件(例如CSV)并将它们合并在一起,让用户可以忽略除第一行之外的所有文件的第一行(因为CSV文件通常有标题行/列名)在合并文件时,我只想要一个标题的副本).我遇到的问题是,即使我只读取各种输入文件,如果文件在另一个进程中打开(特别是Excel),我的应用程序会出错:"无法打开文件.进程无法访问该文件,因为它被另一个进程使用."
我正在使用TStreamReader.如何告诉TStreamReader它应该以只读方式打开文件...并且即使文件在其他地方打开也继续?
代码如下:
procedure glib_MergeTextFiles(const InFileNames: array of string; const OutFileName: string;
HasHeader: Boolean = True;
KeepHeader: Boolean = True);
var
I: Integer;
InStream: TStreamReader;
OutStream: TStreamWriter;
Line: string;
IsFirstLine: Boolean;
begin
// Create our output stream
OutStream := TStreamWriter.Create(OutFileName, False, TEncoding.UTF8);
try
for I := 0 to high(InFileNames) do
begin
InStream := TStreamReader.Create(InFileNames[I], TEncoding.UTF8);
IsFirstLine := True;
try
while not InStream.EndOfStream do
begin
Line := InStream.ReadLine;
if IsFirstLine then { First Line }
begin
if HasHeader = False …Run Code Online (Sandbox Code Playgroud) 我有一个网页,上面有各种表格。这些表是Javascript组件,而不仅仅是纯HTML表。我需要使用Delphi程序(Delphi 10.3)处理该网页的文本(有点类似于屏幕抓取)。
我做一个Ctrl-A/ Ctrl-C选择所有网页并将所有内容复制到剪贴板。如果将其粘贴到TMemo程序的组件中,则只会在表外获取文本。如果粘贴到MS Word中,则可以看到所有内容,包括表格内的文本。
我可以将其正确地粘贴到TAdvRichEditor(第3方)中,但是它要花很多时间,而且我经常用光内存。这使我相信我需要直接读取HTML剪贴板格式的剪贴板。
我设置了剪贴板HTML格式。当我检查剪贴板中的内容时,会看到所有汉字字符。
当内容为HTML时,如何阅读剪贴板的内容?
在理想的情况下,我只希望文本而不是HTML本身,但是我可以稍后删除。这是我现在正在做的...
初始化时..(CF_HTML全局变量在哪里)
CF_HTML := RegisterClipboardFormat('HTML Format');
Run Code Online (Sandbox Code Playgroud)
那我的常规是
function TMain.ClipboardAsHTML: String;
var
Data: THandle;
Ptr: PChar;
begin
Result := '';
with Clipboard do
begin
Open;
try
Data := GetAsHandle(CF_HTML);
if Data <> 0 then
begin
Ptr := PChar(GlobalLock(Data));
if Ptr <> nil then
try
Result := Ptr;
finally
GlobalUnlock(Data);
end;
end;
finally
Close;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
**其他信息-当我从网页复制时...然后,我可以使用一个称为InsideClipBoard的免费工具检查剪贴板缓冲区的内容。它表明,剪贴板中包含1个条目,用5种格式:CT_TEXT,CF_OEMTEXT,CF_UNICODETEXT,CF_LOCALE …
Delphi RIO - 定义了一个名为 TBizObj 的类。属性之一与 DUNS 编号有关。DUNS 数字有时会在左侧填充“0”,正好是 9 个字符长,所以我有一个名为 SiteDUNS9 的属性(基于 fSiteDUNS9)。调用程序设置 SiteDUNS9 属性,但调用者不必担心 DUNS 是否为 9 个字符,我将在 getter/setter 属性中处理它。
当我定义我的属性来调用这个函数时,我收到一个错误“不兼容的类型”。一切都是字符串......不涉及其他类型。这是代码的相关部分:
type
TBizObj = class(TObject)
private
...
fSiteDUNS9: string;
...
function FixDunsLength9(DUNS:string) :string;
published
...
property SiteDUNS9: string read fSiteDUNS9 write FixDunsLength9;
end; // End of the tBizObj Class;
implementation
...
function TBizObj.FixDunsLength9(DUNS:string):string;
begin
// This is a setter function for the DUNS9 routine
result := glib_LeftPad(DUNS, 9, '0');
end;
Run Code Online (Sandbox Code Playgroud)
我已经按照 Emaracadero 网站上的示例进行操作,但仍然无法确定我做错了什么。 http://docwiki.embarcadero.com/RADStudio/Rio/en/Properties_(Delphi)
如果我将我的属性定义更改为
property SiteDUNS9: string …Run Code Online (Sandbox Code Playgroud) delphi ×8
excel ×2
arrays ×1
class ×1
clipboard ×1
comparison ×1
delphi-2010 ×1
javascript ×1
memory-leaks ×1
object ×1
parameters ×1
performance ×1
pointers ×1
properties ×1
setter ×1
string ×1
tdictionary ×1
vba ×1