小编use*_*073的帖子

如何在Delphi中输入分数?

我有一个应用程序将使用测量,特别是低至1/16英寸.我真的希望最终用户输入包含小数部分的值的便捷方式,例如3 7/16.我意识到我可以要求用户输入十进制值(即3.1875),但我真的想要一个更好的方法.有没有人知道下拉或旋转控制使这容易进入?(理想情况下是控件的DB版本.)

delphi delphi-2010

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

Delphi - 传递指向记录的指针

在 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 parameters pointers

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

Delphi - 对TDictionary中的内存分配感到困惑

在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 memory-leaks class tdictionary

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

Delphi - Excel - 如何加快操作

我正在为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 excel performance

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

Delphi - 在CASE语句中使用函数

在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)

delphi string comparison

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

Excel - 查找单元格的点位置

在Excel 2013中,我以编程方式添加图表.为此,我需要指定图表所在的位置.特别是顶部,左侧,高度和宽度.所有这些坐标都是点,而不是单元格地址.例如,单元格的默认高度(如果为15分).我知道我希望Graph所在的单元格地址.如何将单元格地址转换为某个点?必须有一种更好的方法,而不是迭代每个前一行/列并添加它们的高度/宽度......

例如,Cell'F7'可能是120分,并且顶点位置为90.

如果它有帮助,添加图表的语法是......

expression.AddChart2(Style,XlChartType,Left,Top,Width,Height,NewLayout)
Run Code Online (Sandbox Code Playgroud)

excel vba

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

Javascript - 为什么对象数组不相等?

我有一些我试图清理的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)

javascript arrays object

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

Delphi TStreamReader - 如何在可共享模式下读取?

我在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)

delphi

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

在Delphi中从剪贴板读取HTML内容

我有一个网页,上面有各种表格。这些表是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_TEXTCF_OEMTEXTCF_UNICODETEXTCF_LOCALE …

delphi clipboard clipboarddata

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

Delphi - 使用带有属性设置器的函数

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 setter properties

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