标签: delphi-6

Delphi 6 - 当我多次编译时,Bugs消失了

过去几个月,我的德尔福装置一直在走下坡路.虽然我在构建一个版本时经常会出现奇怪的错误,如果我构建,然后编译,然后构建,编译等,它们就会得到解决.

我和另一位认为这是编译器错误的开发人员交谈过.随着时间的推移,这种性能下降的性能也发生在我们的其他计算机上.

堆栈溢出认为可能是什么问题.

delphi compiler-construction compilation delphi-6

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

透明组盒

我继承了Delphi本机控件的TGroupBox,并重写了它的Paint方法来绘制圆角矩形。

   procedure TclTransparentGroupBox.CreateParams(var params : TCreateParams);
   begin
     inherited;
     Params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT;
   end;
Run Code Online (Sandbox Code Playgroud)

覆盖创建参数后,Paint方法如下。

   procedure TclTransparentGroupBox.Paint;
   begin
     // Draw the rounded rect to show the group box bounds
     Canvas.Pen.Color := clWindowFrame;
     Canvas.RoundRect(5, 15, ClientRect.Right - 5, ClientRect.Bottom - 5, 10, 10);
     if Caption <> EmptyStr then
     begin
       Canvas.Brush.Style := bsClear;
       Canvas.TextOut(10, 0, Caption);
     end;
   end;
Run Code Online (Sandbox Code Playgroud)

我面临的主要问题是,我在透明组框顶部没有几个标签。当我打开表单时,标签看起来很好,但是当文本更改时,标签的某些边界矩形将可见。这在透明框的顶部看起来很奇怪。

即使当我调整表单大小时,组框本身也会消失,当我将焦点更改到另一个应用程序并恢复我的应用程序时,组框会自动绘制。

我在绘画方面缺少任何东西吗?我需要照顾的任何Windows消息???

在此先感谢拉胡尔

delphi groupbox transparent-control delphi-6

5
推荐指数
1
解决办法
2927
查看次数

DLL断点没有被"远程调试符号"选项命中,为什么和那些安全风险?

断点没有在Delphi 6 DirectShow DLL中被击中,我遇到了一个大问题.我将在IDE中加载DLL(AX)并使用Graph Edit作为Host程序运行它,并且不会触发任何断点.我尝试将FastMM4 DLL移动到项目目录,完全删除FastMM4,打开和关闭Debug DCU,清理项目目录,取消注册并重新注册DLL,我能想到的一切.没有任何效果.每次运行主机程序时,我都看到我的DLL加载了事件查看器中的"无调试信息"消息.然后在绝望的谷歌搜索中,我找到了一篇推荐C++ Builder的帖子,建议尝试"远程调试符号"链接器选项:

项目 - >选项 - >链接器(选项卡) - >执行和DLL选项(组框) - >"包括远程调试符号"(选中它)

突然间,我的断点开始被击中.这是我的问题:

1)为什么这样做?是因为该选项还是因为此选项触发了其他一些修复了其他编译​​器/链接器的操作?我想知道所以我可以在将来再次发生时可靠地解决这个问题.

2)远程调试符号是否是恶意程序员可以用来深入跟踪我的程序?换句话说,如果他们躺在身边,他们是否存在安全隐患?

delphi debugging dll delphi-6

5
推荐指数
1
解决办法
2073
查看次数

使用Delphi 6处理Unicode字符

我有一个在Delphi 6中开发的轮询应用程序.它读取文件,根据规范解析文件,执行验证并上传到数据库(SQL Server 2008 Express Edition)

我们必须为具有双字节字符集(DBCS)的操作系统提供支持,例如日语操作系统.因此,我们将SQL Server中的数据库字段从varchar更改为nvarchar.

轮询在使用DBCS的操作系统中工作正常.如果系统区域设置设置为日语/中文/韩语且操作系统具有相应的语言包,则它也可以成功用于非DBCS操作系统.但是,如果Locale设置为english,则数据库包含双字节字符的垃圾字符.

我进行了一些测试但未能确定解决方案.

例如,如果我使用TStringList 从UTF-8文件读取并将其保存到另一个文件,则保存Unicode数据.但是,如果我使用文件的内容使用TADOQuery组件运行更新查询,则会显示垃圾字符.该数据库还包含垃圾字符.

PFB示例代码:

var
    stlTemp : TStringList;
    qry : TADOQuery;
    stQuery : string;
begin
    stlTemp := TStringList.Create;
    qry := TADOQuery.Create(nil);
    stlTemp.LoadFromFile('D:\DelphiUnicode\unicode.txt');
    //stlTemp.SaveToFile('D:\DelphiUnicode\1.txt'); // This works. Even though 
    //the stlTemp.Strings[0] contains junk characters if seen in watch

    stQuery := 'UPDATE dbo.receivers SET company = ' + QuotedStr(stlTemp.Strings[0]) +
        ' WHERE receiver_cd = N' + QuotedStr('Receiver'); 
    //company is a nvarchar field in the  database
    qry.Connection := ADOConnection1;
    with …
Run Code Online (Sandbox Code Playgroud)

delphi unicode ado tadoquery delphi-6

5
推荐指数
1
解决办法
5558
查看次数

为什么TEdit只显示长度等于或小于37440个字符的文本?

如果你这样做:

  Edit1.Text := StringOfChar('X', 37440);
Run Code Online (Sandbox Code Playgroud)

它会显示文本,但是如果你这样做:

  Edit1.Text := StringOfChar('X', 37441);
Run Code Online (Sandbox Code Playgroud)

文本不会出现.

有人知道为什么吗?
如果这是一个错误,还有另一种方法可以调整而不是将所有现有组件替换为TMemo吗?
为什么选择37440?

delphi user-controls delphi-6

5
推荐指数
1
解决办法
1373
查看次数

使用箭头对ListView列进行排序

我正在使用Delphi 6并希望添加对ListView进行排序的功能,就像在Windows资源管理器中完成一样.

在第一次测试中,我(快速和脏)从几个来源复制了一些源代码,并做了一些小的调整:

这是我到目前为止(现在只有快速和脏):

uses
  CommCtrls;

var
  Descending: Boolean;
  SortedColumn: Integer;

const
  { For Windows >= XP }
  {$EXTERNALSYM HDF_SORTUP}
  HDF_SORTUP              = $0400;
  {$EXTERNALSYM HDF_SORTDOWN}
  HDF_SORTDOWN            = $0200;

procedure ShowArrowOfListViewColumn(ListView1: TListView; ColumnIdx: integer; Descending: boolean);
var
  Header: HWND;
  Item: THDItem;
begin
  Header := ListView_GetHeader(ListView1.Handle);
  ZeroMemory(@Item, SizeOf(Item));
  Item.Mask := HDI_FORMAT;
  Header_GetItem(Header, ColumnIdx, Item);
  Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags
  if Descending then
    Item.fmt := Item.fmt or HDF_SORTDOWN
  else
    Item.fmt := Item.fmt or HDF_SORTUP;//include the sort ascending flag …
Run Code Online (Sandbox Code Playgroud)

delphi winapi delphi-6

5
推荐指数
1
解决办法
1075
查看次数

无法在Delphi 10.2中将char数组赋值给字符串

我有以下变量声明:

arrChar_1: array[0..2] of Char;
arrChar_2: array[0..2] of Char;
str: string;
Run Code Online (Sandbox Code Playgroud)

然后我做了作业:

str := arrChar_1 + arrChar_2;
Run Code Online (Sandbox Code Playgroud)

这个赋值在Delphi 6上正常工作.但是当我在Delphi 10.2上编译它时会发生错误:

[dcc32 Error] MigrateConcatenateCharArray.dpr(26): E2008 Incompatible types
Run Code Online (Sandbox Code Playgroud)

我正在通过以下方式解决这个问题:

str := Copy(first_arrChar, 0, StrLen(first_arrChar));
str := str + Copy(second_arrChar, 0, StrLen(second_arrChar));
Run Code Online (Sandbox Code Playgroud)

这个问题有没有其他好的解决方案?(1)


在Delphi 6中:

String = AnsiString
Char = AnsiChar
Run Code Online (Sandbox Code Playgroud)

在Delphi 10.2中:

String = UnicodeString
Char = WideChar
Run Code Online (Sandbox Code Playgroud)

可以告诉我是什么原因造成了不兼容问题?(2)

我理解widechar是一个多字节字符类型.Unicode是字符编码的方式.但我对他们感到困惑.

delphi delphi-6 delphi-10.2-tokyo

5
推荐指数
1
解决办法
433
查看次数

Delphi - 当应用程序退出时,未释放(但已终止)的线程会发生什么?

我有多线程应用程序,当应用程序结束时我遇到了一些问题:我可以通过TThread.TerminateForm1.OnDestroy事件处理程序中调用方法来正确终止线程,但终止确实需要一些时间,因此我无法释放内存(通过TThread.Free方法).不幸的是,由于某些其他原因,我必须将TThread.FreeOnTerminate属性设置为false,因此线程终止后线程对象不会自动销毁.

我的问题可能有点傻了,我很久以前就已经知道了,但是这样就可以了,线程会被自动销毁(因为应用程序刚刚结束),或者它是一个问题而内存会"丢失" ?非常感谢您的解释.

delphi multithreading vcl delphi-6

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

保存和恢复事件处理程序

我的班级包含数据集 (TDataSet)。我班的用户可以为此数据集分配事件处理程序:

ds.FieldByName('ID').OnChange := @ID_OnChange;
Run Code Online (Sandbox Code Playgroud)

然后我必须重新打开数据集:

ds.Close;
ds.Open;
Run Code Online (Sandbox Code Playgroud)

在此之后,所有事件处理程序都消失了:

if Assigned(ds.FieldByName('ID').OnChange) //returns false
Run Code Online (Sandbox Code Playgroud)

所以,我需要保存处理程序并在重新打开后恢复它们。我使用 TStringList :

var
  EventHandlers: TStringList;
...
  //I do this for every event of every field
  if Assigned(ds.FieldByName('ID').OnChange) then
    EventHandlers.AddObject('ID', @ds.FieldByName('ID').OnChange);
Run Code Online (Sandbox Code Playgroud)

问题是如何恢复处理程序:

ds.FieldByName('ID').OnChange := TFieldNotifyEvent(ObjToInt(EventHandlers.Objects[0]));//Invalid typecast error
Run Code Online (Sandbox Code Playgroud)

如何将存储的地址分配给事件处理程序?谢谢。

delphi events delphi-6

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

如何完成通过函数的无类型参数传递的记录?

我可以将"任何"记录类型传递给我的程序吗?

我多次使用带有字符串的"记录".

type 
  TR = record
    a: string;
    b: string;
  end;
Run Code Online (Sandbox Code Playgroud)

要清除它们,我需要写:

Finalize(R);
FillChar(R, SizeOf(R), #0);
Run Code Online (Sandbox Code Playgroud)

问题是如何通过任何类型的记录来清除它?

为此我得到了这个提示:"表达式不需要初始化/完成".

procedure ClearRecord(var R);
begin
  Finalize(R);
  FillChar(R, SizeOf(R), #0);
end;
Run Code Online (Sandbox Code Playgroud)

感谢您的每一个信息!

delphi record finalize clear delphi-6

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