我想创建一个幻灯片效果:在窗体的画布上从右到左绘制一个位图。为此,我使用 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),则会再次出现微光效果,而且情况更糟。看起来图像真的被绘制了两次。
这个文档页面一直坚持认为有一个“现代外观”的 SelectDirectory 函数。
https://www.embarcadero.com/products/rad-studio/windows-development?aldSet=en-GB
西雅图10新!现代外观 SelectDirectory 函数。
我在哪里可以找到那个?
如果我调用 FileCtrl.SelectDirectory 一个类似 Win3.1 的对话框弹出窗口:

这是新现代吗?还是我错过了“另一个” SelectDirectory 功能?
你能告诉我如何在我的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)
谢谢
我有一个像下面这样的结构需要保存并从磁盘加载.
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将很好但不是关键)到磁盘而不会收到警告.
我有很多组件在D7下完美运行.我设法通过将它们拖入Delphi 2009 IDE来编译和安装它们.但是,当我尝试在项目中使用这些组件时,编译器说它无法找到它们的源代码.我可以在哪里进入该库的路径?
解:
我在Delphi 2009中拖放了旧的DPK文件.然后在项目经理中选择"Build"然后选择"Install".除了使用控件的应用程序无法查看其来源之外,一切都运行顺利.通过将路径添加到Tool-Options-Library Win32中解决了问题.
感谢大家,尤其是穆罕默德.
我需要知道我的程序是否可以从运行它的位置将文件写入磁盘(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会尝试写入应用程序的驱动器(只读它)?
我有这两个功能:
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就像多维数据集的存储(所有者)一样.
这是前一篇文章的延续:无论如何,TPanel颜色都是黑色
问题是:当我使用XPManifest时,所有将TForm作为父级的TPanel变黑.谁知道为什么?
我有一个包含两个状态面板的TStatusBar.第一个长约100像素.第二个填充状态栏宽度的其余部分.如果我尝试在第二个面板中显示长度超过140个字符的字符串,则会将它们截断为此值.
有什么办法可以克服这个bug吗?
D7,Win XP
编辑:是126个字符.
我在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:
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