过去几个月,我的德尔福装置一直在走下坡路.虽然我在构建一个版本时经常会出现奇怪的错误,如果我构建,然后编译,然后构建,编译等,它们就会得到解决.
我和另一位认为这是编译器错误的开发人员交谈过.随着时间的推移,这种性能下降的性能也发生在我们的其他计算机上.
堆栈溢出认为可能是什么问题.
我继承了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 6 DirectShow DLL中被击中,我遇到了一个大问题.我将在IDE中加载DLL(AX)并使用Graph Edit作为Host程序运行它,并且不会触发任何断点.我尝试将FastMM4 DLL移动到项目目录,完全删除FastMM4,打开和关闭Debug DCU,清理项目目录,取消注册并重新注册DLL,我能想到的一切.没有任何效果.每次运行主机程序时,我都看到我的DLL加载了事件查看器中的"无调试信息"消息.然后在绝望的谷歌搜索中,我找到了一篇推荐C++ Builder的帖子,建议尝试"远程调试符号"链接器选项:
项目 - >选项 - >链接器(选项卡) - >执行和DLL选项(组框) - >"包括远程调试符号"(选中它)
突然间,我的断点开始被击中.这是我的问题:
1)为什么这样做?是因为该选项还是因为此选项触发了其他一些修复了其他编译器/链接器的操作?我想知道所以我可以在将来再次发生时可靠地解决这个问题.
2)远程调试符号是否是恶意程序员可以用来深入跟踪我的程序?换句话说,如果他们躺在身边,他们是否存在安全隐患?
我有一个在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) 如果你这样做:
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 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) 我有以下变量声明:
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是字符编码的方式.但我对他们感到困惑.
我有多线程应用程序,当应用程序结束时我遇到了一些问题:我可以通过TThread.Terminate在Form1.OnDestroy事件处理程序中调用方法来正确终止线程,但终止确实需要一些时间,因此我无法释放内存(通过TThread.Free方法).不幸的是,由于某些其他原因,我必须将TThread.FreeOnTerminate属性设置为false,因此线程终止后线程对象不会自动销毁.
我的问题可能有点傻了,我很久以前就已经知道了,但是这样就可以了,线程会被自动销毁(因为应用程序刚刚结束),或者它是一个问题而内存会"丢失" ?非常感谢您的解释.
我的班级包含数据集 (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)
如何将存储的地址分配给事件处理程序?谢谢。
我可以将"任何"记录类型传递给我的程序吗?
我多次使用带有字符串的"记录".
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)
感谢您的每一个信息!