小编Jus*_*ade的帖子

Delphi JCL 7zCompression可以在没有文件操作的情况下压缩/解压缩内存流吗?

我之前使用过TJcl7zCompressArchive/TJcl7zDecompressArchive进行存档操作.

现在我想直接压缩/解压缩内存流而无需文件操作.但是,当看到在网上搜索JCL演示的示例时,我找不到使用该lib的方法.我确实找到了其他工具,但压缩比似乎不如7zip.

任何人都可以提供一些指示或示例代码,说明如何实现这一目标 非常感谢!

delphi 7zip jedi-code-library

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

使用FastReport TFrxCrossObject和大型网格(> 1000行)的性能

我使用FastReport,我需要预览/打印超过1000行的网格,我有一些性能问题.通常我使用TfrxCrossObject来准备我的网格,因为最终用户可能会更改网格显示(使用的列,列的名称,大小),所以我需要有一个动态打印.我测试了一个简单的网格(16列x2000行),它需要超过10秒才能显示第一个预览页面.有什么想提高表现吗?

编辑: 正如在一些答案中所说,问题是:如何在FastReport中创建'dynamicaly'网格(在屏幕上具有相同的列名称和大小),而不使用TFrxCrossObject,这似乎不是很有效.我可能会承认所有解决方案,比如使用DataSet或增强TfrxCrossObject.

测试代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  frxClass, StdCtrls, Grids, frxCross;

type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    frxCrossObject1: TfrxCrossObject;
    frxReport1: TfrxReport;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure frxReport1BeforePrint(c: TfrxReportComponent);
  end;

var
  Form1: TForm1;

implementation
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  i, j: Integer;
begin
  for i := 1 to 16 do
    for j := 1 to 2000 do
      StringGrid1.Cells[i - 1, j - 1] := IntToStr(i * j); …
Run Code Online (Sandbox Code Playgroud)

delphi grid fastreport

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

将长按事件添加到按钮类的最佳方法是什么?

通过长按,我的意思是按下按钮/面板并保持一段时间(比如2秒)而不释放或拖动.它在手机和触摸设备中很常见.

我曾尝试使用Gesture,在TabletOptions中检查了PressAndHold并在InteractiveGestureOptions中检查了所有内容,但是长时间按下不会导致OnGesture调用.

我能想到的另一种实现增加一个计时器,在开始的MouseDown,并结束它在任何计时器所触发,的startDrag,的MouseUp或鼠标离开.然而,正如我希望这个行为添加到几个不同的按键和面板组件,我将不得不重写程序的早午餐​​每个类和各地复制代码为每个组件.

有没有更好的方法来实现这一目标?


编辑:

致NGLN

哇,伟大的工作!结合您对这些滚动效果的回答,VCL几乎可以实现移动操作系统的外观和感觉!

您的代码与常用控件完美配合,但在我的案例中我遇到了2个问题

  1. 长时间无法检测表单(原因,因为表单不是其自身的父级)我将查找FChild代码转移到单独的过程并从WMParentNotify和FormMouseDown调用来解决它.
  2. 我有一些自定义按钮,它有一些禁用的HTML标签(标题,标题,页脚)覆盖标签原始表面,使用你的代码,FChild将是其中一个标签,但它不会得到MouseCapture.我添加以下行来克服它:

    而不是TControlAccess(FChild).Enabled做FChild:= FChild.Parent;

最后,对于一些更复杂的控件,如TCategoryButtons或TListBox,事件的用户可能需要检查不是针对整个控件而是检查控件中的指定项.所以我认为我们需要保存原来的CursorPos并在定时器触发时触发另一个事件,以便手动确定它是否符合长按条件.如果是或未分配事件,则使用您的默认代码进行确定.

总而言之,我们可以创建一个支持LongPress的表单/面板来托管所有其他控件.这比使用Component by Component实现LongPress功能要容易得多!十分感谢!


编辑2:

致NGLN

再次感谢您的组件版本,这是一种很好的方法,不需要对现有组件进行任何修改,并且可以检测到长按!

为了您的信息,我做了一些修改,以满足自己的需要.

  1. TCustomForm与TWinControl:由于我的大部分应用程序只有1个主窗体,所有其他可视单元都是我自己创建的框架(不是来自TFrame,而是TScrollingWinControl和ccpack支持),假设TCustomForm对我不起作用.所以我删除了属性表单(但保留了ActiveControl的FForm)并创建了一个已发布的属性Host:TWinControl作为父主机.这样,我也可以将检测限制在一些有限的面板上.分配主机时,我使用GetParentForm(FHost)检查并找到FForm.
  2. 禁用控制:正如我之前所说,我有一些禁用的TJvHTLabel覆盖我的按钮,你的组件在标签上工作.我可以通过标签找回按钮,但我认为如果它被新组件处理会更方便.所以我添加了一个SkipDisabled属性,如果设置为turn,则在其父行中循环以找到第一个启用的控件.
  3. 我添加了一个PreserveFocus属性,让组件用户选择是否保留最后一个activecontrol.
  4. 控制项目.我更改了TLongPressEvent,将ClickPos添加为第二个参数.所以,我现在可以使用ClickPos来查找列表框中的哪个项目或者长期持有的项目.
  5. 在我看来,FindVCLWindow与您的FindControlAtPos具有相同的效果?

再次感谢您的出色工作.

delphi mouseevent custom-component

4
推荐指数
1
解决办法
3405
查看次数

写入MS Access数据库的问题(Delphi)

我正在尝试从Delphi向Microsoft访问数据库写入一些代码.我从TStringGrid获取数据.第一列具有ItemID,第二列具有Quantity.我希望它循环遍历TStringGrid并将每一行保存为我的数据库中的重复行,并在每一列上保存订单ID(每个订单的订单ID保持不变,因此不需要更改).

我跑步时遇到错误

"Project Heatmat.exe引发了一个异常类EVarientInvalidArgError,并显示消息'Invalid Argument'.进程已停止."

我无法弄清楚为什么它会给我这个错误,因为你可能会看到我不是很擅长编码.任何帮助,将不胜感激!

谢谢.

procedure TCreateNewOrder.btnSaveClick(Sender: TObject);
var 
  intNumber, count : integer;
begin
  Count:= 0;
  if messagedlg ('Are you sure?', mtWarning, [mbyes, mbno], 0) = mryes then
  begin
    with HeatmatConnection.HeatmatDatabase do
    begin
      intNumber:= TBLOrder.RecordCount;
      TBLOrder.Append;

      TBLOrder['CustomerID']:= CompanyName.ItemIndex+1;
      TBLOrder['OrderID']:= intNumber +1;

      for count:= 1 to StringGrid1.RowCount-1 do
      begin
        TBLOrderedItem.Append;
        TBLOrderedItem['OrderID']:= intNumber+1;
        TBLOrderedItem['ItemID']:= StringGrid1.Cells[1, count];
        TBLOrderedItem['Quantity']:= StringGrid1.Cells[2, count];
        TBLOrderedItem.Post;
      end;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

database delphi ms-access

4
推荐指数
1
解决办法
727
查看次数

使用Yahoo! Delphi中的查询语言(YQL)

我看到yahoo yql可以在Web服务中获得许多信息,这些信息非常有用.但是,当我在谷歌搜索"Delphi yql"时.没有返回有用的信息.是否有任何帮助和示例如何使用Delphi发送请求并从yql获取结果?非常感谢.

delphi yql delphi-2010

3
推荐指数
1
解决办法
526
查看次数