小编Ian*_*oyd的帖子

Delphi中的Sqrt函数

作为一个让我自己进行的练习,我想在Delphi中设计一个计算器.所以,总和,子道,乘法和划分是相当有效的.

我与Square Root有关的唯一功能.

变量是扩展的,我几乎只是从String(我使用两个EditBox)转换为Float

var
   Form1: TForm1;
   a, b, r: Extended;

procedure TForm1.SqrtClick(Sender: TObject);
begin
   a  := StrToFloat(Edit1.Text);
   r  := Sqrt(a);
   ShowMessage(FloatToStr(r));
end;
Run Code Online (Sandbox Code Playgroud)

德尔福回归我

[错误] calc.dpr(72):缺少运算符或分号.

windows delphi calculator sqrt

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

当RichEdit控件成为其他控件的父文件时,它会停止绘制文本

当RichEdit控件成为其他控件的父文件时,它会停止绘制文本.

这是一个功能还是一个bug?是否有可能使RichEdit成为其他控件的父级?

看看下一个应用:

- Form1.dfm ---

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 282
  ClientWidth = 418
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 24
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object RichEdit1: TRichEdit
    Left …
Run Code Online (Sandbox Code Playgroud)

delphi richedit delphi-xe5

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

如何显式锁定已挂载的文件系统?

如何在Windows 7中写入物理驱动器?

我正在尝试写入\\.\PhysicalDrive0Windows 7中的物理磁盘(例如).

这个问题已经被要求死亡,但从未得到过回答.它曾经在Windows XP中运行,但微软故意在Windows Vista中破解.微软提供了有关如何操作的提示,但没有人能够弄明白.

它曾经工作过

在过去,允许写入物理磁盘(只要您是管理员).执行此操作的方法甚至记录在知识库文章中:

信息:Win32下的直接驱动器访问

要在基于Win32的应用程序中打开直接磁盘访问(原始I/O)的物理硬盘驱动器,请使用表单的设备名称

\\.\PhysicalDriveN
Run Code Online (Sandbox Code Playgroud)

其中N为0,1,2等,表示系统中的每个物理驱动器.

您可以使用具有这些设备名称的CreateFile()应用程序编程接口(API)打开物理或逻辑驱动器,前提是您具有对驱动器的适当访问权限(即,您必须是管理员).必须同时使用CreateFile()FILE_SHARE_READ和FILE_SHARE_WRITE标志才能访问驱动器.

在添加安全限制的情况下,Windows Vista中的所有更改都会发生.

你如何写入物理磁盘?

许多人和许多答案,在许多stackoverflow问题上混淆:

  • 写入物理磁盘(例如\\.\PhysicalDrive0),和
  • 写入逻辑卷(例如\\.\C$)

Microsoft注意到对这两种操作限制:

阻止对卷和磁盘的直接写入操作

如果出现以下情况,DASD(直接访问存储设备)卷句柄上的写操作将成功:

  • 文件系统未安装,或者是否
  • 写入的扇区是引导扇区.
  • 写入的扇区驻留在文件系统空间之外.
  • 通过请求独占写访问来隐式锁定文件系统.
  • 通过发送锁定/卸载请求显式锁定了文件系统.
  • 写请求已由内核模式驱动程序标记,指示应绕过此检查.该标志名为SL_FORCE_DIRECT_WRITE,它位于IrpSp-> flags字段中.文件系统和存储驱动程序都会检查此标志.

在我的情况下,我要求写一个物理,而不是逻辑.Microsoft注意到写入物理磁盘句柄的新限制:

在以下情况下,磁盘句柄上的写操作将成功:

  • 写入的扇区不属于文件系统.
  • 写入的扇区属于明确锁定的已装入文件系统.
  • 写入的扇区属于未安装的文件系统或卷没有文件系统.
  • 我写的部门确实属于文件系统 - >失败
  • 我写的扇区确实属于已安装,未锁定的文件系统 - >失败
  • 我写的扇区确实属于安装的文件系统,并且位于具有文件系统的逻辑卷内.

关于如何使其工作的提示围绕着:

  • 卸载文件系统
  • 锁定文件系统

但问题是如何卸载文件系统?你如何锁定文件系统?

你在做什么?

我能够读取磁盘的所有物理扇区; 那没问题.问题是当我想写入磁盘的物理扇区时.

我当前的代码是伪代码:

void ZeroSector(Int64 …
Run Code Online (Sandbox Code Playgroud)

windows winapi disk windows-7

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

TVirtualStringTree - 设置列单元/节点对齐

我有一个将Header.Column设置为taLeftJustify(默认)的VirtualStringTree .

有没有办法设置该列的单元格/节点,taRightJustify以便节点将向右对齐,但标题列文本将向左对齐?

这是我想要的结果(在第1栏):

在此输入图像描述

我使用的是相当旧的VT版本4.5.5

delphi virtualtreeview tvirtualstringtree

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

如何隐藏主要表单而不是关闭它?

如果用户在我的主窗体上单击X,我希望窗体隐藏,而不是关闭.这听起来像OnClose表单事件的工作:

使用OnClose在表单关闭时执行特殊处理.OnClose事件指定在表单即将关闭时要调用的事件处理程序.例如,OnClose指定的处理程序可能会测试以确保数据输入表单中的所有字段在允许表单关闭之前具有有效内容.

表单由Close方法关闭,或者当用户从表单的系统菜单中选择Close时关闭.

TCloseEvent类型指向处理表单关闭的方法.Action参数的值确定表单是否实际关闭.这些是Action的可能值:

  • caNone:表格不允许关闭,所以没有任何反应.
  • caHide:表单没有关闭,只是隐藏.您的应用程序仍然可以访问隐藏的表单.
  • caFree:表单已关闭,表单的所有已分配内存都将被释放.
  • caMinimize:表单最小化,而不是关闭.这是MDI子窗体的默认操作.

我用一个表单在空应用程序中测试:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    Action := caHide;
end;
Run Code Online (Sandbox Code Playgroud)

所以现在当我点击X时,(而不是隐藏)表单关闭,应用程序终止:

在此输入图像描述

...听起来像OnClose活动的工作......

奖金阅读

Vcl.Forms.pas

procedure TCustomForm.Close;
var
   CloseAction: TCloseAction;
begin
   if fsModal in FFormState then
      ModalResult := mrCancel
   else if CloseQuery then
   begin
      if FormStyle = fsMDIChild then
         if biMinimize in BorderIcons then
            CloseAction := caMinimize 
         else
            CloseAction := caNone
      else
         CloseAction := caHide;

      DoClose(CloseAction);
      if CloseAction …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe6

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

是否有任何二进制值没有精确的十进制表示?

我们都知道,有些十进制值在二进制中没有精确的表示。

例如十进制值0.1

在 IEEE 浮点格式中,它可以具有不同的表示形式,具体取决于您要专用于表示浮点值的位数。

单精度(32 位)

  • 十六进制:0x3DCCCCCD
  • 二进制:1.10011001100110011001101×10 -4
  • 十进制:0.10000 00014 90116 11938 47656 25

双精度(64 位)

  • 十六进制:0x3FB999999999999A
  • 二进制:1.1001100110011001100110011001100110011001100110011010×10 -4
  • 十进制:0.10000 00000 00000 00555 11151 23125 78270 21181 58340 45410 15625

扩展精度(80 位)

  • 十六进制:0x3FFBCCCCCCCCCCCCCCCD
  • 二进制:1.100110011001100110011001100110011001100110011001100110011001101×10 -4
  • 十进制:0.10000 00000 00000 00000 13552 52715 60688 05425 09316 00108 74271 39282 22656 25

换句话说,十进制值0.1在二进制中没有精确的表示,它是无休止的重复值:

0.0 0011 0011 0011 0011 0011 0011 0011 …
Run Code Online (Sandbox Code Playgroud)

floating-point precision computer-science

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

启用双缓冲

我已经看到以下代码在winform上启用双缓冲:

// Activates double buffering 
this.SetStyle(ControlStyles.DoubleBuffer |
   ControlStyles.OptimizedDoubleBuffer |
   ControlStyles.UserPaint |
   ControlStyles.AllPaintingInWmPaint, true);
this.UpdateStyles();
Run Code Online (Sandbox Code Playgroud)

这与设置Form.DoubleBuffering = true有什么不同?

doublebuffered visual-studio-2008 winforms

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

Delphi 5:模拟"过时"或"弃用"方法的想法?

我想将方法​​标记为过时,但Delphi 5没有这样的功能.

为了举个例子,这里有一个虚构的方法,它已被弃用并且是新的首选形式:

procedure TStormPeaksQuest.BlowHodirsHorn; overload; //obsolete
procedure TStormPeaksQuest.BlowHodirsHorn(UseProtection: Boolean); overload;
Run Code Online (Sandbox Code Playgroud)

注意:对于这个假设的例子,我们假设使用无参数版本是非常糟糕的.没有" 使用保护 " 存在问题- 没有好的解决方案.没有人喜欢不必使用保护,但没有人愿意采取保护措施.所以我们让呼叫者在吹Hodir号角时决定是否要使用保护.如果我们默认无参数版本继续使用保护:

procedure TStormPeaksQuest.BlowHodirsHorn;
begin
    BlowHodirsHorn(False); //No protection. Bad!
end;
Run Code Online (Sandbox Code Playgroud)

然后开发人员面临各种令人讨厌的东西的风险.如果我们强制无参数版本使用保护:

procedure TStormPeaksQuest.BlowHodirsHorn;
begin
    BlowHodirsHorn(True); //Use protection; crash if there isn't any
end;
Run Code Online (Sandbox Code Playgroud)

如果开发人员没有得到任何保护,或者没有任何保护,那么就有可能出现问题.

现在我可以重命名过时的方法:

procedure TStormPeaksQuest.BlowHodirsHorn_Deprecatedd; overload; //obsolete
procedure TStormPeaksQuest.BlowHodirsHorn(UseProtection: Boolean); overload;
Run Code Online (Sandbox Code Playgroud)

但这会导致编译错误,人们会嘲笑我(我真的不想听到他们的抱怨).我希望他们得到一个唠叨,而不是一个实际的错误.

我想添加一个断言:

procedure TStormPeaksQuest.BlowHodirsHorn; //obsolete
begin
   Assert(false, 'TStormPeaksQuest.BlowHodirsHorn is deprecated. Use BlowHodirsHorn(Boolean)');

   ...
end;
Run Code Online (Sandbox Code Playgroud)

但我无法保证开发人员不会在没有断言的情况下发布版本,从而导致客户的恶意崩溃.

如果开发人员正在调试,我想过只使用一个断言:

procedure TStormPeaksQuest.BlowHodirsHorn; //obsolete
begin
   if DebugHook …
Run Code Online (Sandbox Code Playgroud)

delphi deprecated

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

Visual Studio:如何在Visual Studio中引用程序集?

我有一个程序集DLL的调试和发布版本.

他们坐在我的电脑上的目录.对于其他开发人员,他们坐在计算机上的目录中.

对于应用程序的调试版本,我想使用调试程序集.对于应用程序的发布版本,我想使用发布程序集.

这就是问题所在.


对于那些没有注意的人,这里有很多问题.如何在我的计算机上引用程序集,在项目检查到源代码管理之后,该程序集成为某个计算机上的有效路径.

如何将"引用"节点设置为每种解决方案类型(Debug,Release).

我尝试将调试程序集复制到

\bin\Debug
Run Code Online (Sandbox Code Playgroud)

和发布组件

\bin\Release
Run Code Online (Sandbox Code Playgroud)

并将程序集dll添加到源代码控制中

\ bin\Debug\bin\Release

文件夹.然后我希望程序集可以在可执行文件的文件夹中找到.

问题在于,当CopyLocal为false时,其他开发人员的计算机会收到无法覆盖程序集dll的错误.

assemblies visual-studio

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

在安装Eclipse之前是否需要安装Android SDK?

在安装Eclipse之前是否需要安装Android SDK?

或者我必须在安装Android SDK之前安装Eclipse吗?

我担心一个人知道另一个,安装的顺序很重要,安装这两个不按顺序可能会导致问题.

Android SDK安装程序是否了解Eclipse,并使用Eclipse注册自己?

android

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