标签: delphi-10.1-berlin

GraphicEx与Delphi 10.1柏林

我在Delphi 7中安装了GraphicEx(一个Delphi图像加载器库),它运行良好.

现在,当我尝试在Delphi 10.1 Berlin中安装它时,我收到错误:

[dcc32 Error] JPG.pas(1136): E2065 Unsatisfied forward or external declaration: 'jpeg_reset_huff_decode' 
[dcc32 Error] JPG.pas(1258): E2065 Unsatisfied forward or external declaration: '@jfwrite'
[dcc32 Error] JPG.pas(1258): E2065 Unsatisfied forward or external declaration: '@jfflush'
[dcc32 Error] JPG.pas(1258): E2065 Unsatisfied forward or external declaration: '@jfread'
[dcc32 Fatal Error] GraphicEx.pas(613): F2063 Could not compile used unit 'JPG.pas'
Run Code Online (Sandbox Code Playgroud)

那么,我如何在Delphi 10.1 Berlin中使用GraphicEx?

delphi delphi-10.1-berlin

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

fmx delphi berlin 如何更改 Tgrid 行中的字体颜色

需要帮助..我正在使用delphi 10.1 berlin。与之前版本的 Embarcadero Delphy Code Gear 有一些不同。我需要更改 TGrid 行中的字体颜色。在下一个代码中,我将更改背景颜色,但我只需要更改字体颜色:

  aRowColor.Color := arSTATUS_GRID_COLOR[0];
  Canvas.FillRect(Bounds, 0, 0, [], 1, aRowColor);
  Column.DefaultDrawCell(Canvas, Bounds, Row, Value, State);
Run Code Online (Sandbox Code Playgroud)

delphi fonts tgrid firemonkey delphi-10.1-berlin

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

EInsufficientRTTI异常,消息"可用于支持此操作的RTTi不足"

试图在运行时将对象转换为JSON,我得到的RTTI错误不足.对象是:

{$M+}
{$TYPEINFO ON}
{$METHODINFO ON}
{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}

TMyPacket = class(TObject)
  Private
    FID: TGUID;
    FToIP: string;
    FToPort: integer;
    FSent: boolean;
    FSentAt: TDateTime;
    FAck: boolean;
    FTimeOut: Cardinal;
    FDataToSendSize: UINT64;
    FDataToSend: AnsiString;
  public
    constructor create;
    destructor free;
  published
    property ID: TGUID read FID write FID;
    property ToIP: string read FToIP write FToIP;
    property ToPort: integer read FToPort write FToPort;
    property Sent: boolean read FSent write FSent;
    property SentAt: TDateTime read FSentAt write FSentAt;
    property Ack: boolean read FAck …
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-10.1-berlin

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

如何使用一个命令将滚动条手柄发送到最顶部位置?

通过向控件发送REPEATEDLY消息,可以轻松地将控件的滚动条从最底部位置发送到最顶部位置WM_VSCROLL:

ScrollBox1.Perform(WM_VSCROLL, MakeWParam(SB_PAGEUP, 0), 0);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但这需要知道有多少次我必须将消息发送到控件以将滚动条设置到最高位置,具体取决于滚动条手柄相对于滚动条高度的比例大小.或者,我可以重复发送消息一段不合理的时间,这似乎不是最好的解决方案.

那么如何使用ONE SINGLE命令将滚动条发送到顶部,与滚动条高度的滚动条夹点的比例大小无关?

delphi scroll scrollbar delphi-10.1-berlin

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

Delphi ZLib 压缩/解压

我在 Delphi 中使用 ZLib 单元解压时遇到了一个小问题

unit uZCompression;

interface

uses
  uCompression;

type
  TZZipCompression = class(TInterfacedObject, ICompression)
  public
    function DoCompression(aContent: TArray<Byte>): TArray<Byte>;
    function DoDecompression(aContent: TArray<Byte>): TArray<Byte>;
    function GetWindowsBits: Integer; virtual;
  end;

  TZGZipCompression = class(TZZipCompression)
    function GetWindowsBits: Integer; override;
  end;

implementation

uses
  System.ZLib, System.Classes, uMxKxUtils;

{ TZCompression }

function TZZipCompression.DoCompression(aContent: TArray<Byte>): TArray<Byte>;
var
  LContentStream, LOutputStream: TMemoryStream;
  LCompressedStream: TZCompressionStream;
begin
  LContentStream := ByteArrayToStream(aContent);

  LOutputStream := TMemoryStream.Create;

  LCompressedStream := TZCompressionStream.Create(LOutputStream, zcDefault, GetWindowsBits);
  LCompressedStream.CopyFrom(LContentStream, LContentStream.Size);
  LCompressedStream.Free;

  Result := StreamToByteArray(LOutputStream);

  LOutputStream.Free;
  LContentStream.Free;
end;

function TZZipCompression.DoDecompression(aContent: TArray<Byte>): TArray<Byte>; …
Run Code Online (Sandbox Code Playgroud)

delphi zlib delphi-10.1-berlin

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

使用 zlib 压缩 Base64 字符串

我需要通过 TCP 协议从 Windows 向移动设备、iOS 和 Android 发送一个大的 Base64 字符串。
我发送和接收没有问题,但是字符串大小太大,大约 24000 个字符,我正在寻找压缩和解压缩这些字符串的方法。
看起来,最好的方法是使用 Zlib,我发现这些链接Delphi XE 和 ZLib Problems (II)其中解释了如何做到这一点。
这些函数适用于普通文本字符串,但压缩 Base64 字符串会使它们变得更大。
我要发送的一个非常小的字符串的示例如下:



我需要帮助。
我使用的功能是这样的:

uses
  SysUtils, Classes, ZLib, EncdDecd;

function CompressAndEncodeString(const Str: string): string;
var
  Utf8Stream: TStringStream;
  Compressed: TMemoryStream;
  Base64Stream: TStringStream;
begin
  Utf8Stream := TStringStream.Create(Str, TEncoding.UTF8);
  try
    Compressed := TMemoryStream.Create;
    try
      ZCompressStream(Utf8Stream, Compressed);
      Compressed.Position := 0;
      Base64Stream := TStringStream.Create('', TEncoding.ASCII);
      try
        EncodeStream(Compressed, Base64Stream);
        Result := Base64Stream.DataString;
      finally
        Base64Stream.Free;
      end;
    finally
      Compressed.Free;
    end;
  finally
    Utf8Stream.Free;
  end;
end; …
Run Code Online (Sandbox Code Playgroud)

delphi base64 zlib delphi-10.1-berlin

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

Fmx TStringGrid 行颜色

我在 Delphi 10.1 的多设备应用程序(在 Windows 上)中遇到问题。我有一个StringGrid(连接到数据库),我可以更改行的背景颜色,但问题是单元格之间有“填充”(灰色/银色)。

onformCreate我定义中:

stringgrid1.DefaultDrawing := False;
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

procedure Tlist_form.StringGrid1DrawColumnCell(Sender: TObject;
  const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
  const Row: Integer; const Value: TValue; const State: TGridDrawStates);
   var aRowColor: TBrush;
begin
  aRowColor := Tbrush.Create(TBrushKind.Solid,TAlphaColors.Alpha);


  if (stringgrid1.Cells[7,row]='1') then 
        aRowColor.Color := TAlphaColors.Green
    else
      aRowColor.Color := TAlphaColors.Red;

    Canvas.FillRect(Bounds, 0, 0, [], 1, aRowColor);
    Column.DefaultDrawCell(Canvas, Bounds, Row, Value, State);

  aRowColor.free;

end; 
Run Code Online (Sandbox Code Playgroud)

在 Delphi 6 中我从未遇到过这个问题,而且我不知道如何解决它。谢谢。

delphi background-color firemonkey stringgrid delphi-10.1-berlin

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

在 Delphi XE10.1 中使用/解析 curl

我有这个 curl 序列,它在 MS Windows 中工作,我试图在 Delphi XE 10.1 Berlin 中使用与 Indy 的等效项。

卷曲代码是这样的:

curl -k "https://fakeweb.com/options" --data-binary "{\"name\":\"Name of the Client\",\"email\":\"fake@gmail.com\"}"
Run Code Online (Sandbox Code Playgroud)

我已经尝试了以下代码,但它不起作用

procedure TForm2.Button4Click(Sender: TObject);
const
  COMI = Char(34);
var
  data: string;
  DataToSend : TStringStream;
  IdHTTP: TIdHTTP;
  Answer: string;
begin
  try
    data := '{\' + COMI  + 'name\' + COMI  + ':\' + COMI  + 'Name of the Client\' + COMI  +
          ',\' + COMI  + 'email\' + COMI  + ':\' + COMI   + 'fake@gmail.com\' + COMI  + '}' …
Run Code Online (Sandbox Code Playgroud)

delphi rest curl indy10 delphi-10.1-berlin

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

如何使用Generic方法和<T>数组的参数数组?

很多时候,当使用通用数组时,我需要知道我正在使用的数组的最大长度.很长一段时间我一直在使用:

MaxIntValue([Length(Array1), Length(Array2) , Length(Array3)]); // from Math unit
Run Code Online (Sandbox Code Playgroud)

然后我用我的方法简化了这个(跳过输入Length()):

// array of array of TCardBrand
function GetMaxLength(const aArrays: array of TArrayOfCarBrand): integer;
Run Code Online (Sandbox Code Playgroud)

效果很好,但现在我想创建一个通用的MaxLength,我无法使其工作

class function MaxLength<T>(aArrays: array of array of T): integer; - it gives error: [dcc32 Error] Unit2.pas(31): E2029 Identifier expected but 'ARRAY' found
Run Code Online (Sandbox Code Playgroud)

这是我正在测试的代码,使用Math单元中的MaxIntValue和我的方法示例的工作示例,但扩展通用TArray不起作用:

TCarBrand = record
    BrandID: integer;
    BrandName: string;
    BrandCountry: string;
  end;

  TArrayOfCarBrand = array of TCarBrand;

  TArray = class(System.Generics.Collections.TArray)
  public          
      // ERROR:  E2029 Identifier expected but 'ARRAY' found
       class function MaxLength<T>(aArrays: array of array …
Run Code Online (Sandbox Code Playgroud)

delphi generics delphi-10.1-berlin

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

Rtti 调用一个类方法说无效类型转换

我制作了一个非常通用的单元,其中的设置对象都是 TObject,我不想使用任何单元,这就是我这样做的原因。所以我的方法是使用RTTI来调用一切。但是现在我面临一个问题,我可以调用所有函数并提供参数和所有内容,但是当该方法是类过程/函数时,我无法调用它并且它说无效类型转换。

我查看了 embarcadero 的网站,它说当我们在 classmethod 上调用 rtti.invoke 时,我们必须将 Args 中的第一个参数设置为类引用。我试过了,但它不起作用。看看我的代码:

function TSomething.ExecMethodAndRet(MethodName: string;
  Args: array of TValue): TObjectList<TObject>;
var
 R : TRttiContext;
 T : TRttiType;
 M : TRttiMethod;
 lArgs : array of TValue;
 i : integer;
begin
  T := R.GetType(MainObj.ClassInfo);
  for M in t.GetMethods do
    if (m.Parent = t) and (UpperCase(m.Name) = UpperCase(MethodName))then
    begin
      if (m.IsClassMethod) then
      begin
        for I := 0 to Length(Args) do
          lArgs := [args[i]];
        lArgs := [MainObj] + lArgs;
        result := M.Invoke(MainObj, Args).AsType<TObjectList<TObject>>; <- this …
Run Code Online (Sandbox Code Playgroud)

delphi casting rtti delphi-10.1-berlin

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