我在Delphi(7)中编写了一个应用程序(心理测试考试),它创建了一个标准的文本文件 - 即该文件的类型为ANSI.
有人将程序移植到Internet上运行,可能使用Java,生成的文本文件类型为UTF-8.
读取这些结果文件的程序必须读取Delphi创建的文件和通过Internet创建的文件.
虽然我可以将UTF-8文本转换为ANSI(使用狡猾命名的函数UTF8ToANSI),但我怎么能提前告诉我有哪种文件?
看到我'拥有'文件格式,我想最简单的处理方法是在文件中放置一个已知位置的标记,这将告诉我程序的来源(Delphi/Internet),但这似乎作弊.
提前致谢.
我一直在尝试一些玻璃图像,例如下面的图像,我开始认为必须有一种方法可以将它放入代码中,所以我可以将它想象任何颜色.它不需要看起来像下面的图像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) 我正在尝试模拟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而非任何第三方等效的解决方案.
在我的应用程序中,我有一个基本表单,其中各种项目添加到系统菜单中,例如
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),因为真正的菜单标题是希伯来语,加速器似乎无法正常使用这种语言.
在我看来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) 我想在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) 我有这条线:
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规则?
我在尝试将由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) 我很困扰。我需要读取二进制文件(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) 一个非常简单的问题:
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 ×10
delphi-7 ×10
button ×1
canvas ×1
drawing ×1
endianness ×1
math ×1
memory-leaks ×1
sql-server ×1
utf-8 ×1
xml ×1