小编WeG*_*ars的帖子

无法使用TMemoryStream读取布尔值

我试图使用一个简单的代码行读取一个布尔值: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)

delphi

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

如何在其事件处理程序中释放对象?

我有TMyClass,一个派生自TObject的类.它有一个TTimer.每隔几分钟,从Timer.OnTimer我检查一个网页.当网页发生变化时,我就完成了,我想要释放MyClass.我如何释放它?

我的问题与类似,但我的"控制"不是TControl.它是TObject的后代.因此,消息将无法正常工作.显然,解决方案是从TControl或更高版本派生我的类.但是,让我说我不想这样做.在这种情况下,解决方案是什么?

delphi

1
推荐指数
2
解决办法
523
查看次数

TButton.Caption中的特殊unicode字符(而不是图标)

是否可以从键盘输入特殊的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!真好 对?

更新:德尔福不接受
某些字符,例如(绿 = 128215),带有复制/粘贴功能。

delphi unicode delphi-xe7

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

如何使用 Indy Mime 对二进制数据进行编码?

我有一个 Ansi 字符串,用于存储二进制数据 - 0-255 范围内的字节(我知道它应该是一个字节数组左右,但它们之间没有太大区别)。
我想通过 Indy MIME (TIdEncoderMIME.EncodeString / TIdDecoderMIME.DecodeString) 传递这个“二进制字符串”并获得人类可读的ANSI字符串。

我认为如果我使用 IndyTextEncoding_8Bit 编码,Encode/DecodeString 的输出将是一个仅包含 ANSI 字符的字符串。但是我错了!

那么,如何使用 Indy Mime 编码二进制数据(类似于application/octet-stream)?

delphi encoding mime indy delphi-xe7

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

如何使用ShellExecute在"配置"模式下运行屏幕保护程序?操作系统会覆盖我的ShellExecute调用

我想用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文件有效!

delphi shell command-line shellexecute screensaver

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

如何枚举TCategoryPanel所持有的所有控件?

我有一个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是其中一个列表框)来查看谁是其父级,但它返回一个空字符串.

delphi c++builder

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

什么时候提出例外?

我认为这是“最佳实践”类别的问题:

我有一个自定义控件-一种可容纳一些面板的网格。面板之一是当前活动面板(最后一个单击)。

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,我只会在一个地方进行检查(是的,我很懒)。

delphi

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

是否可以保证访问nil指针会引发异常?

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

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

EDbkError:无法访问调试进程内存:仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分

我开始收到此与调试器相关的消息(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)

delphi debugging delphi-10.4-sydney

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

Must inherited be called on the first line?

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

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