小编WeG*_*ars的帖子

图像幻灯片效果。BitBlt 闪烁

我想创建一个幻灯片效果:在窗体的画布上从右到左绘制一个位图。为此,我使用 BitBlt。

我在定时器(20ms)中调用这个函数:

var ViewPort: TRect;
ViewPort.Left   := 0;
ViewPort.Top    := 0;
ViewPort.Width  := 1400;
ViewPort.Height := 900;

x: integer := spnStep.Value;  //SpinBox.Value = 10
Run Code Online (Sandbox Code Playgroud)
procedure TfrmTester.Slide(BMP: TBitmap; ViewPort: TRect);
begin
 Inc(x, spnStep.Value);

 if x >= ViewPort.Width then
  begin
   x:= ViewPort.Width;
   Timer.Enabled:= FALSE;
  end;

 BitBlt(frmTester.Canvas.Handle,
        ViewPort.Width-x, 0,    //  X, Y
        x, ViewPort.Height,     // cX, cY
      BMP.Canvas.Handle, 0, 0, SRCCOPY);
end;
Run Code Online (Sandbox Code Playgroud)

但是,图像进展并不顺利。它有某种闪烁,但不是我们在 VCL 中所知道的那种闪烁。很难描述它。这就像图像向前移动两个像素,然后向后移动一个像素。

如何让图像流畅地移动?难道真的是由显示器的刷新率引起的吗?


更新:我不知道为什么,但它是由计时器引起的。如果我在“for”循环中调用 Slide(),那么动画是平滑的。我知道计时器的精度约为 15 毫秒,但我仍然不明白为什么它会使图像闪烁。如果我在循环内添加一个雪橇(1),则会再次出现微光效果,而且情况更糟。看起来图像真的被绘制了两次。

delphi

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

“现代外观的 SelectDirectory 函数”在哪里?

这个文档页面一直坚持认为有一个“现代外观”的 SelectDirectory 函数。

https://www.embarcadero.com/products/rad-studio/windows-development?aldSet=en-GB

西雅图10新!现代外观 SelectDirectory 函数。

我在哪里可以找到那个?

如果我调用 FileCtrl.SelectDirectory 一个类似 Win3.1 的对话框弹出窗口: 在此处输入图片说明

这是新现代吗?还是我错过了“另一个” SelectDirectory 功能?

delphi

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

如何从Delphi中创建的DLL导入函数?

你能告诉我如何在我的C程序中使用以下功能吗?

Delphi DLL - 导出的函数:

function GetCPUID (CpuCore: byte): ShortString; stdcall;
function GetPartitionID(Partition : PChar): ShortString; stdcall;
Run Code Online (Sandbox Code Playgroud)

我没有该DLL的源代码,所以我必须使我的C程序适应该DLL,而不是相反.

我执行以下操作并得到错误

typedef char* (_stdcall *GETCPUID)(BYTE);
typedef char* (_stdcall *GETPID)(PCHAR);
GETCPUID pGetSerial;
GETPID pGetPID

HMODULE hWtsLib = LoadLibrary("HardwareIDExtractor.dll");
if (hWtsLib){
pGetSerial = (GETCPUID)GetProcAddress(hWtsLib, "GetCPUID");
char *str = (char*) malloc(1024);
str = pGetSerial((BYTE)"1");

pGetPID= (GETPID )GetProcAddress(hWtsLib, "GetPartitionID");
char *str1 = (char*) malloc(1024);
str1 = pGetPID("C:");
}
Run Code Online (Sandbox Code Playgroud)

谢谢

c delphi dll function

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

在Delphi 2009下将字符串保存到磁盘

我有一个像下面这样的结构需要保存并从磁盘加载.

 RSecStructure= packed record
   Name               : string[255];       {NEED UNICODE SUPPORT HERE}
   ScreenName         : string[255];
   OrigFileName       : string[255];                    
   Prim               : string[255];                                           
   ParentVersion      : integer;
   sTag1              : string[255];      
   sTag2              : string[255];
   sTag3              : string[255];
   sTag4              : string[255];
   DateAdd            : TDateTime;
   DateModify         : TDateTime;
  end;
Run Code Online (Sandbox Code Playgroud)

到目前为止,我使用了类似的东西来保存结构:

function
var F: FILE;
    Hdr: RSecStructure;
begin
...
 BlockWrite (F, Hdr, SizeOf(Hdr));   
...
end
Run Code Online (Sandbox Code Playgroud)

上面的代码在Delphi 7下工作.在D2009下,当我在短字符串和Unicode字符串之间进行分配时,我收到了很多警告消息.到目前为止,我设法编写Delphi代码而没有任何编译器警告或提示,我想保持这样.所以我需要一个优雅的方法是将磁盘保存(Unicode将很好但不是关键)到磁盘而不会收到警告.

delphi save delphi-2009

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

无法在D2009中安装在D7下工作的组件

我有很多组件在D7下完美运行.我设法通过将它们拖入Delphi 2009 IDE来编译和安装它们.但是,当我尝试在项目中使用这些组件时,编译器说它无法找到它们的源代码.我可以在哪里进入该库的路径?


解:

我在Delphi 2009中拖放了旧的DPK文件.然后在项目经理中选择"Build"然后选择"Install".除了使用控件的应用程序无法查看其来源之外,一切都运行顺利.通过将路径添加到Tool-Options-Library Win32中解决了问题.

感谢大家,尤其是穆罕默德.

delphi components path delphi-2009

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

测试磁盘是否具有写访问权限

我需要知道我的程序是否可以从运行它的位置将文件写入磁盘(HDD,软盘,闪存,CD).我尝试过类似的东西:

     {$I-}
     Rewrite(myFile);                                       
     {$I+}
  Result:= (IOResult = 0);
Run Code Online (Sandbox Code Playgroud)

问题是如果磁盘是只读的,Windows会给我一条错误消息告诉我

"appName.exe - 写保护错误磁盘无法写入,因为它是写保护的.请从驱动器D:中的卷USB_BOOT中删除写保护.取消TryAgain继续"

如何在不引发任何错误/警告消息的情况下测试写入权限?谢谢.


编辑:

好."bug"与上面提到的代码无关.我只觉得它出现在那里.我将代码移动到只读磁盘并从那里运行它.该错误出现在名为"CreateShortcutEx"的函数中,在此行中:

 MyPFile.Save(PWChar(WFileName),False);
Run Code Online (Sandbox Code Playgroud)

MyPFile声明如下:

var
 MyObject  : IUnknown;
 MySLink   : IShellLink;
 MyPFile   : IPersistFile;
 Directory : String;
 WFileName : WideString;
 MyReg     : TRegIniFile;
begin
 MyObject := CreateComObject(CLSID_ShellLink);
 MySLink  := MyObject as IShellLink;
 MyPFile  := MyObject as IPersistFile;
 .....
end;
Run Code Online (Sandbox Code Playgroud)

那么,如果WFileName参数是"C:\ documents and settings\bla bla",为什么MyPFile会尝试写入应用程序的驱动器(只读它)?

delphi disk

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

将对象作为参数传递 - 不能是对象

我有这两个功能:

procedure TDisplay.CubAssign(VAR Obj: TCubObj; CONST bReleaseOnExit: boolean);
begin
 ReleaseCubOnExit:= bReleaseOnExit;                             
 FCub:= Obj;    
 if CubReady
 then
  begin
   Init;
   SetScrollBar;
  end
 else Clear;
end;

procedure TDisplay.CubRelease;                                            
begin
 if FCub<> NIL
 then
  TRY
   FreeAndNil(FCub);
  EXCEPT
   MesajErrDetail('CubRelease', 'Cannot free object');
  END
 else FCub:= NIL;            
 Clear;   
end;
Run Code Online (Sandbox Code Playgroud)

我将TDisplay放在表单上,​​然后通过CubAssign创建并将一个Cube对象分配给TDisplay.后来我通过调用TDisplay.CubRelease释放了Cube.现在,当我关闭表单时,我不知道我的Cube是否被释放,所以我检查它,如果不是NIL,我释放它:

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Display.CubRelease;
 if Cub<> NIL
 then FreeAndNil(Cub);
end;
Run Code Online (Sandbox Code Playgroud)

但是,此时,立方体为空但不是NIL.调用FormDestroy时,程序会出现"多个空闲内存泄漏"错误.为什么?我已经调用了TDiplay.CubRelease.不应该是NIL吗?我得到的消息表明该对象被正确释放,但它不是NIL.

实现这个的正确方法是什么?


编辑/澄清

无法准确确定多维数据集的所有者,因为显示的父级正在释放显示,同时仍保留多维数据集一段时间.换句话说,在显示器中显示立方体可以是终身操作,或者它可以仅发生一段时间.此外,在某些情况下,我可能根本不显示立方体.

换句话说,当主窗体关闭时,显示器可以存在或不存在.

在其他实现中(一个简单的查看器,我想要做的只是显示多维数据集),我想让显示器处理多维数据集的破坏,因为我不想保留和额外的对象列表来存储立方体.在这种情况下,基本上,Displays就像多维数据集的存储(所有者)一样.

delphi

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

当我在表单上删除XPManifest控件时,TPanel颜色为黑色

这是前一篇文章的延续:无论如何,TPanel颜色都是黑色

问题是:当我使用XPManifest时,所有将TForm作为父级的TPanel变黑.谁知道为什么?

delphi delphi-7

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

Delphi TStatusBar在大约140个字符处截断文本

我有一个包含两个状态面板的TStatusBar.第一个长约100像素.第二个填充状态栏宽度的其余部分.如果我尝试在第二个面板中显示长度超过140个字符的字符串,则会将它们截断为此值.

有什么办法可以克服这个bug吗?

D7,Win XP


编辑:是126个字符.

delphi

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

使用嵌套的"try/finally""try/except"语句

我在StackOverflow上看到过此代码:

with TDownloadURL.Create(nil) do
  try
    URL := 'myurltodownload.com';
    filename := 'locationtosaveto';
    try
      ExecuteTarget(nil);
    except
      result := false;
    end;
    if not FileExists(filename) then
      result := false;
  finally
    free;
  end;
Run Code Online (Sandbox Code Playgroud)

不能简化为:

 Result:= FALSE;               <--------- Compiler complains
 DeleteFile(Dest);
 dl:= TDownloadURL.Create(NIL);
 TRY
   dl.URL:= URL;
   dl.FileName:= Dest;
   dl.ExecuteTarget(NIL);           
   Result:= FileExists(Dest);
 FINALLY
   dl.Free;
 END;
Run Code Online (Sandbox Code Playgroud)

如果"ExecuteTarget"出现问题,最终的结果:= ...将永远不会执行,因为程序将直接跳转到"finally".对?因此,该函数将返回FALSE.难道我做错了什么?


PS:

  1. 我打算在一个线程中使用这个代码.
  2. 我只是将函数放在Delphi中,并且编译器抱怨第一行:"赋值从未使用过".

delphi try-finally try-except

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

标签 统计

delphi ×10

delphi-2009 ×2

c ×1

components ×1

delphi-7 ×1

disk ×1

dll ×1

function ×1

path ×1

save ×1

try-except ×1

try-finally ×1