我试图使用一个简单的代码行读取一个布尔值:ReadBuffer(Result,1).
阅读后,结果为真.然而
结果:=不是结果
不会'切换'值false.
我这里显然是一个基本的错误.
完整代码:
TYPE
TCMemStream= class(TMemoryStream)
public
function ReadBoolean: Boolean;
end;
function TCMemStream.ReadBoolean: Boolean;
begin
ReadBuffer(Result, 1);
Result:= NOT Result; <-------- after executing this line, Result has the same value
Result:= false; <----- this works
end;
Run Code Online (Sandbox Code Playgroud) 我有TMyClass,一个派生自TObject的类.它有一个TTimer.每隔几分钟,从Timer.OnTimer我检查一个网页.当网页发生变化时,我就完成了,我想要释放MyClass.我如何释放它?
我的问题与此类似,但我的"控制"不是TControl.它是TObject的后代.因此,消息将无法正常工作.显然,解决方案是从TControl或更高版本派生我的类.但是,让我说我不想这样做.在这种情况下,解决方案是什么?
是否可以从键盘输入特殊的Unicode字符,并链接以下字符?
U+2603 ? SNOWMAN
U+2604 ? COMET
U+2605 ? BLACK STAR
U+2606 ? WHITE STAR
U+2607 ? LIGHTNING
U+2608 ? THUNDERSTORM
U+2609 ? SUN
U+260A ? ASCENDING NODE
U+260B ? DESCENDING NODE
Run Code Online (Sandbox Code Playgroud)
例如,我希望按钮中带有向上/向下箭头,而不加载图像。
我尝试在键盘上输入Alt + 08593,但是将插入其他字符(比预期的箭头大)。
更新:
原因是LAZINESS。我懒得搜索图标或创建自己的图标。例如,您可以简单地替换臭名昭著的“保存”软盘图标。看看:。AM!真好 对?
我有一个 Ansi 字符串,用于存储二进制数据 - 0-255 范围内的字节(我知道它应该是一个字节数组左右,但它们之间没有太大区别)。
我想通过 Indy MIME (TIdEncoderMIME.EncodeString / TIdDecoderMIME.DecodeString) 传递这个“二进制字符串”并获得人类可读的ANSI字符串。
我认为如果我使用 IndyTextEncoding_8Bit 编码,Encode/DecodeString 的输出将是一个仅包含 ANSI 字符的字符串。但是我错了!
那么,如何使用 Indy Mime 编码二进制数据(类似于application/octet-stream)?
我想用ShellExec在'config'模式下运行一个屏幕保护程序.我用这个(Delphi)调用:
i:= ShellExecute(0, 'open', PChar('c:\temp\test.scr'), PChar('/c'), NIL, SW_SHOWNORMAL)
Run Code Online (Sandbox Code Playgroud)
但是,SCR文件接收的参数是'/ S',因此在路上的某个地方,Windows拦截我的呼叫并用'/ S'替换我的参数.
更新
我做了一个实验:
我构建了一个显示参数的应用程序(mytest.exe).我用/ c作为参数启动了mytest.exe.正确接收/ c参数.
然后我将mytest.exe重命名为mytest.scr.现在,操作系统会覆盖发送的参数.收到的参数现在是'/ S'.
有趣!
脏修复:执行以/ c模式执行屏幕保护程序的CMD文件有效!
我有一个TCategoryPanelGroup,它包含一个TCategoryPanel(名为CatPan).CatPan包含3个列表框.
我想自动调整CatPan的大小以匹配它包含的3个列表框的高度.但CatPan没有AutoSize属性.因此,我需要枚举列表框以获得它们的高度.
但是,当我尝试枚举3个列表框时,我什么也得不到:
for i= 0 to CatPan->ControlCount-1 do CatPan[i].Height;
Run Code Online (Sandbox Code Playgroud)
因为CatPan.ControlCount返回1而不是3!似乎CapPan不是列表框的父级.可能它是这样做的,以便能够进行折叠/展开动画.
我调用lbox1-> Parent-> Name(lbox1是其中一个列表框)来查看谁是其父级,但它返回一个空字符串.
我认为这是“最佳实践”类别的问题:
我有一个自定义控件-一种可容纳一些面板的网格。面板之一是当前活动面板(最后一个单击)。
TMyGrid = class (TSomeKindOfGrid)
published
property CurrentPanel: TPanel read getCurPanel write setCurPanel;
end;
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果在某个时候有人要求CurrentPanel且网格为空,应该getCurPanel返回NIL还是引发异常?
getCurPanel返回NIL,则我必须在每次/每次致电时都要检查NIL CurrentPanel。呼叫者也有可能忘记检查NIL。好吧,因为它将尝试访问NIL对象,所以不会发生任何“不良”情况。该程序将很好地崩溃。我得到了堆栈跟踪。 getCurPanel,我只会在一个地方进行检查(是的,我很懒)。Remy Lebeau 表示:“不能保证访问nil指针会引发异常。这是未定义的行为。任何事情都可能发生。可能会引发异常,或者您可能只是读取垃圾,或者可能会浪费内存,或者.. ”。怎么来的?在哪种情况下,访问NIL对象的方法不会引发AV并导致内存损坏?
// (Obj is any kind of object. Let's say TStringList)
Obj = nil;
Obj.LoadFromFile();
Run Code Online (Sandbox Code Playgroud) 我开始收到此与调试器相关的消息(Delphi Sydney)。知道这意味着什么吗?这个错误似乎很神秘。MS网站上没有关于它的官方文档。
更新:
我可以按需重现:启动一个新项目,声明一个对象,将其设置为 nil,访问其属性。我没有显示可以调试的“标准”AV,而是看到了“无法访问调试进程内存”错误。此时已经无法再调试任何内容了。
德尔福 Rio 一切顺利。这似乎是 Windows 错误或 Delphi Sydney 错误!全新安装仅 2 周后就出现了问题。
date/time : 2020-10-29, 20:35:12, 331ms
operating system : Windows 7 x64 Service Pack 1 build 7601
system language : English
system up time : 19 minutes 17 seconds
program up time : 11 seconds
processors : 8x AMD FX(tm)-8350 Eight-Core Processor
physical memory : 27298/32729 MB (free/total)
free disk space : (C:) 12.76 GB
display mode : 1920x1200, 32 bit
process id : $1e18
allocated …Run Code Online (Sandbox Code Playgroud) I have seen a piece of code like this (not mine). The author sets FField on the first line in the constructor before calling inherited. I am curious if this code valid.
TTest = class(TBaseObject, ITest)
private
protected
FField: TObject;
end;
constructor TTest.Create(aField: TObject);
begin
FField:= aField;
inherited Create();
...
end;
Run Code Online (Sandbox Code Playgroud)
I think the memory for FField was already allocated and nilled at that point. Right?
delphi ×10
delphi-xe7 ×2
c++builder ×1
command-line ×1
debugging ×1
encoding ×1
indy ×1
mime ×1
screensaver ×1
shell ×1
shellexecute ×1
unicode ×1