标签: delphi-7

检测'文本'文件类型(ANSI与UTF-8)

我在Delphi(7)中编写了一个应用程序(心理测试考试),它创建了一个标准的文本文件 - 即该文件的类型为ANSI.

有人将程序移植到Internet上运行,可能使用Java,生成的文本文件类型为UTF-8.

读取这些结果文件的程序必须读取Delphi创建的文件和通过Internet创建的文件.

虽然我可以将UTF-8文本转换为ANSI(使用狡猾命名的函数UTF8ToANSI),但我怎么能提前告诉我有哪种文件?

看到我'拥有'文件格式,我想最简单的处理方法是在文件中放置一个已知位置的标记,这将告诉我程序的来源(Delphi/Internet),但这似乎作弊.

提前致谢.

delphi utf-8 delphi-7

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

德尔福定制绘图 - 发光玻璃

我一直在尝试一些玻璃图像,例如下面的图像,我开始认为必须有一种方法可以将它放入代码中,所以我可以将它想象任何颜色.它不需要看起来像下面的图像100%,但我想写一些代码来绘制椭圆和玻璃效果(梯度与一些非常奇特的计算).我必须清楚地注意到我对数学很恐怖,而且我知道这需要一些棘手的公式.

我正在研究的样本:

使用预制图像绘制的样本图像

椭圆形的边缘是容易的部分,椭圆形从上到下的渐变也相当容易 - 但是当使边缘褪色以使顶部和侧面呈现玻璃状外观时 - 我毫无头绪怎么去做这个.

原始左边图像:

原始左边缘图像

是否有人能指出我这方面的好教程,或者如果有人想要证明它,要么真的很感激.

这是我到目前为止绘制的程序:

//B = Bitmap to draw to
//Col = Color to draw glass image
procedure TForm1.DrawOval(const Col: TColor; var B: TBitmap);
var
  C: TCanvas;       //Main canvas for drawing easily
  R: TRect;         //Base rect
  R2: TRect;        //Working rect
  X: Integer;       //Main top/bottom gradient loop
  CR, CG, CB: Byte; //Base RGB color values
  TR, TG, TB: Byte; //Working RGB color values
begin
  if assigned(B) then begin
    if B <> nil then begin
      C:= …
Run Code Online (Sandbox Code Playgroud)

delphi math drawing canvas delphi-7

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

TButton的下拉菜单

我正在尝试模拟TButton的下拉菜单,如下所示:

procedure DropMenuDown(Control: TControl; PopupMenu: TPopupMenu);
var
  APoint: TPoint;
begin
  APoint := Control.ClientToScreen(Point(0, Control.ClientHeight));
  PopupMenu.Popup(APoint.X, APoint.Y);
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    DropMenuDown(Button1, PopupMenu1);
    // ReleaseCapture;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

问题是,当菜单被删除时,如果我再次单击该按钮,我希望菜单关闭,但它会再次下降.

我正在寻找专门针对通用Delphi TButton而非任何第三方等效的解决方案.

delphi button delphi-7 drop-down-menu

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

添加快捷方式以编程方式添加系统菜单选项

在我的应用程序中,我有一个基本表单,其中各种项目添加到系统菜单中,例如

 AppendMenu (SysMenu, MF_SEPARATOR, 0, '');
 AppendMenu (SysMenu, MF_STRING, SC_Sticky, 'Sticky');
 AppendMenu (SysMenu, MF_STRING, SC_Original, 'Original');
Run Code Online (Sandbox Code Playgroud)

如何为这些菜单选项添加键盘快捷键(例如Alt-F2,Alt-F3)?

我无法使用加速器的标准方法(即Sticky for Alt-S),因为真正的菜单标题是希伯来语,加速器似乎无法正常使用这种语言.

delphi keyboard-shortcuts delphi-7

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

我的TComponent如何拦截ESC键并处理它?

在我看来TComponent,有一点我想要听取键事件并截取ESC键并在我的组件中处理它,消耗/"吃掉"击键,以便例如所有者表单在那个阶段不会处理它.就像TDragObject你开始时一样拖动并按下取消它ESC.

问题是,TDragObject具有AllocateHWnd由它的拥有者通知的形式CN_KEYDOWN.但是没有人通知我的组件.

我需要WindowProc用自己的表格替换表格吗?如果是,那么如何正确地"按书"做到这一点呢?


只是100%明确:

TMyComponent = class(TComponent)
Run Code Online (Sandbox Code Playgroud)

我做了一个小测试,似乎工作:

TMyComponent = class(TComponent)
  private
    FOldWindowProc: TWndMethod;
    FParentForm: TCustomForm;
    procedure FormWindowProc(var Message: TMessage);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;    
end;

...

constructor TMyComponent.Create(AOwner: TComponent);
begin
  if not (AOwner is TWinControl) then
    raise Exception.Create('TMyComponent.Create: Owner must be a TWinControl');
  inherited Create(AOwner);
  // hook parent form
  FParentForm := GetParentForm(TWinControl(Owner));
  if Assigned(FParentForm) then
  begin
    FOldWindowProc := FParentForm.WindowProc;
    FParentForm.WindowProc …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7

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

如何在自定义TGraphicControl上绘制淡出文本?

我想在TGraphicControl上绘制淡出文本,比如Google Chrome上的标签,当没有足够的空间在Canvas上显示整个文本时.

因此,我不想显示省略文本(我知道该怎么做),而是希望它像这样淡出: 德尔福

TGraphicControl需要具有透明选项,如TCustomLabel(ControlStyle - [csOpaque]).


这对GDIPlus来说可能是一件容易的事,但我需要使用纯GDI.


我也尝试研究TGradText v.1.0(直接下载)的代码,它几乎完全符合我的需要 - 它可以绘制透明文本,但结果看起来非常糟糕而且不顺畅.我猜是因为它为这个任务制作了一个pmCopy掩码.


这是我根据Andreas Rejbrand的回答编写的代码.我在TImage上使用了PaintBox并预渲染了背景:

type
  TParentControl = class(TWinControl);

{ This procedure is copied from RxLibrary VCLUtils }  
procedure CopyParentImage(Control: TControl; Dest: TCanvas);
var
  I, Count, X, Y, SaveIndex: Integer;
  DC: HDC;
  R, SelfR, CtlR: TRect;
begin
  if (Control = nil) or (Control.Parent = nil) then Exit;
  Count := Control.Parent.ControlCount;
  DC := Dest.Handle;
  with Control.Parent do ControlState := ControlState + [csPaintCopy];
  try
    with Control do
    begin …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7

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

WideChar集合:集合最多可包含256个元素

我有这条线:

const
  MY_SET: set of WideChar = [WideChar('A')..WideChar('Z')];
Run Code Online (Sandbox Code Playgroud)

以上不编译,错误:

[错误]集最多可包含256个元素

但这行确实编译好了:

var WS: WideString;
if WS[1] in [WideChar('A')..WideChar('Z')] then...
Run Code Online (Sandbox Code Playgroud)

这也编译好了:

const
  MY_SET = [WideChar('A')..WideChar('Z'), WideChar('a')..WideChar('z')];
  ...
  if WS[1] in MY_SET then...
Run Code Online (Sandbox Code Playgroud)

这是为什么?

编辑:我的问题是为什么 if WS[1] in [WideChar('A')..WideChar('Z')]编译?为什么MY_SET = [WideChar('A')..WideChar('Z'), WideChar('a')..WideChar('z')];编译?他们是不是也需要申请set规则?

delphi delphi-7

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

如何在D7中解码XML Blob字段

我在尝试将由MS SQL Server 2014实例返回的XML数据解码为以D7编写的应用程序时遇到问题.(Indy的版本是附带的版本,9.00.10).

更新 当我最初编写此q时,我的印象是blob字段的内容需要进行Base64解码,但似乎这是错误的.遵循Remy Lebeau的建议,blob流在解码之前包含字段名称和字段值中的可识别文本,但之后不包含.

在下面的代码中,AdoQuery中的SQL很简单

从作者中选择*,其中au_lname ='White'对于XML Auto

Authors表是演示'pubs'数据库中的表.我添加了"Where"子句来限制结果集的大小,这样我就可以显示返回的blob的十六进制转储.

根据Sql Server OLH,指定'For XML Auto'时返回数据的默认类型是'binary base64-encoded format'.如果我让IDE创建此字段,AdoQuery的单个字段的数据类型是ftBlob.

执行以下代码会生成异常"DecodeToStream中的不均匀大小".在调用时IdDecoderMIME.DecodeToString(S),字符串S的长度为3514,3514 mod 4为2,而不是0,因为它显然应该是,因此是例外.我已经确认字段值中的字节数是3514,因此变量的大小和字符串的长度没有区别,即两者之间没有任何差异.

procedure TForm1.FormCreate(Sender: TObject);
var
  SS : TStringStream;
  Output : String;
  S : String;
  IdDecoderMIME : TIdDecoderMIME;
begin
  SS := TStringStream.Create('');
  IdDecoderMIME := TIdDecoderMIME.Create(Nil);
  try
    AdoQuery1.Open;
    TBlobField(AdoQuery1.Fields[0]).SaveToStream(SS);
    S := SS.DataString;
    IdDecoderMIME.FillChar := #0;
    Output := IdDecoderMIME.DecodeToString(S);
    Memo1.Lines.Text := S;
  finally
    SS.Free;
    IdDecoderMIME.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码:

procedure TForm1.FormCreate(Sender: TObject);
var
  SS : TStringStream;
  MS : TMemoryStream;
  Output …
Run Code Online (Sandbox Code Playgroud)

xml sql-server delphi delphi-7

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

如果 Windows/Delphi/IDE 暗示小端顺序,我如何从大端二进制文件中读取整数?

我很困扰。我需要读取二进制文件(Applied Biotechnology aka ABIF 的 .fsa 扩展名、FASTA 文件),但在读取有符号整数时遇到了问题。我正在根据本手册做所有事情https://drive.google.com/file/d/1zL-r6eoTzFIeYDwH5L8nux2lIlsRx3CK/view?usp=sharing 所以,例如,让我们看看文件https头中的 fDataSize 字段: //drive.google.com/file/d/1rrL01B_gzgBw28knvFit6hUIA5jcCDry/view?usp=sharing

我知道它应该是 2688(根据手册,它是一个 32 位的有符号整数),即二进制形式的 00000000 00000000 00001010 10000000。实际上,当我将这 32 位读取为 4 个字节的数组时,我得到 [0, 0, 10, -128],这与二进制形式完全相同。

但是,如果我将其读为整数,则会得到 16809994,即 00000001 00000000 10000000 00001010 位。

正如我从多个论坛了解到的,他们使用 Swap 和 htonl 函数将整数从小端顺序转换为大端顺序。他们还建议对 32 位整数使用 BSWAP EAX 指令。但在这种情况下,它们以一种错误的方式工作,特别是:Swap,应用于 16809994,返回 16779904 或 00000001 00000000 00001010 10000000,并且 BSWAP 指令将 16809996, 01001001001001001001001001001001001001001001001001001001001

正如我们所看到的,内置函数的作用与我需要的不同。Swap 可能会返回正确的结果,但是由于某种原因,将这些位作为整数读取会更改最左侧的字节。那么,出了什么问题,我该怎么办?

更新。1 为了存储标题数据,我使用以下记录:

type
  TFasMainHeader = record
    fFrmt        : array[1..4]  of ansiChar;
    fVersion     : Word;
    fDir         : array[1..4] of …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7 endianness

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

我在这里创建了内存泄漏吗?

一个非常简单的问题:

type

TMyRecord = Record
  Int: Integer;
  Str: String;
end;

PMyRecord = ^TMyRecord;

var
  Data: PMyRecord;
begin
  New(Data);
  Data.Int := 42;
  Data.Str := 'Test';
  Dispose(Data);
end;
Run Code Online (Sandbox Code Playgroud)

我的问题是,我在这里创建了一个内存泄漏(有String)吗?我打电话Data.Str := '';之前应该打电话Dispose

谢谢!

delphi memory-leaks memory-management delphi-7

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