I need to get a regular snapshot from a webcam in Delphi. Speed is not a problem (once a second is fine). I have tried demo code from based on stuff from http://delphi.pjh2.de but I can't get it to work. It compiles and runs OK but the callback function never fires.
I don't have a real webcam but am running instead a simulator. The simulator works (I can see the video using Skype) but not with the test app. I …
我有
procedure TMainForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles (Handle, True ) ;
end ;
Run Code Online (Sandbox Code Playgroud)
但表单不接受拖动文件 - 没有删除游标,没有触发WM_DROPFILES消息.
我在FormShow事件中有以下构造(出于不同的原因 - 在创建表单后,我只想执行一次代码,并且FormShow在初始化期间多次触发):
procedure TMainForm.FormShow(Sender: TObject);
begin
if (not FRunOnce) then // as FormShow can be called twice - if Form.Position assigned to
begin
DragAcceptFiles (Handle, True ) ;
FRunOnce := True ;
end ;
end ;
Run Code Online (Sandbox Code Playgroud)
在显示的位置DragAcceptFiles(Handle,True)仍然不起作用.如果我将它移动到例程的顶部(因此它执行两次),它确实有效:
procedure TMainForm.FormShow(Sender: TObject);
begin
DragAcceptFiles (Handle, True ) ;
if (not FRunOnce) then // as FormShow can be called twice - if Form.Position assigned to
begin
FRunOnce …Run Code Online (Sandbox Code Playgroud) 我有一个用Delphi 2006编写的应用程序,它定期从位于网络其他位置的磁盘文件(100Mb以太网)读取.偶尔通过网络读取需要很长时间(如20秒)并且应用程序冻结,因为读取是从主线程中的空闲处理程序完成的.
好的,我可以将读取操作放入它自己的线程中,但我想知道的是,是否可以为文件操作指定超时,以便您可以放弃并去做其他事情,或报告事实上,读取时间早于20秒后出现了问题.
function ReadWithTimeout (var Buffer ;
N : integer ;
Timeout : integer) : boolean ;
begin
Result := false
try
SetReadTimeout (Timeout) ; // <==========================???
FileStream.Read (Buffer, N) ;
Result := true ;
except
...
end ;
end ;
Run Code Online (Sandbox Code Playgroud) 我有构造的批处理文件:
if exist F:\ copy /y Application.exe F:\
Run Code Online (Sandbox Code Playgroud)
在编译结束时,将可执行文件复制到USB密钥(如果已插入).它可以正常使用USB密钥但是当我插入USB多卡读卡器时(这看起来像驱动器E:.. H: ,如果没有插入SD卡,当我执行上面的批处理行时,我得到一个"Windows - 无磁盘"阻塞消息.
如果有卡插入,我没有收到消息,(并且文件被复制),如果没有插入读卡器,我没有收到消息,文件没有被复制(显然),但在这两种情况下,批处理文件都不会停止运行.只有插入读卡器但驱动器中没有卡时才会这样.
我可以从批处理文件中安静地检查这些USB驱动器中没有"磁盘"吗?
我有一个D2006应用程序,其中包含选项卡上的页面控件和各种网格等.当我调整主窗体的大小时(它会在与某些东西对齐的表格上涟漪并调整大小),我会遇到很长的延迟,比如几秒钟.应用程序冻结,未调用空闲处理程序,并且运行的线程也会暂停.
我尝试在IDE中暂停执行,而这种情况发生在试图破坏执行时,它处于麻烦的代码中,但IDE没有接收消息.
显然,我不希望任何人指出一些错误的代码,但我正在调试可能对我有帮助的方法.我在整个应用程序中都有大量的执行时序代码,并且长时间延迟不会显示在任何数据中.例如,主窗体OnResize处理程序的执行时间是最小的.
Delphi 2006的TImage并不完全支持PNG.为了在我的表单上具有alpha透明度的图像,我必须在运行时加载它们.我可以在设计时加载它们但它们不能存活,我认为因为PNG没有保存在DFM文件中.我确信这在最新的Delphi中都是笨拙的,但我现在无法升级.
无论如何,我在运行时加载它们:
Image1.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ;
Run Code Online (Sandbox Code Playgroud)
PNGImageCollection组件包含各种大小的PNG(这些PNG在设计时创建和加载),我将它们分配给FormCreate事件中的相应TImages.
这个工作正常,直到我遇到一个问题,我试图在表单上使用它之后在其他地方重用其中一个图像.我发现分配TPicture的行为已将其设置为由于Assign而导致的空图像.这发生在例程TPicture.ForceType中,AFAICT检查FGraphic的类型,如果它不是所需类型,它将释放FGraphic并创建所请求类型的新实例.
好.所以在经过一番搔痒之后,我发现也许我应该这样做:
Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ;
Run Code Online (Sandbox Code Playgroud)
这就是诀窍,因为Assign没有破坏图像,但现在图像显示半透明位不透明,即:

代替:

如何让此图像正确显示alpha透明位?(和补充问题:是Image1.Picture.Bitmap.Assign正确的方法吗?).
以下是更详细的代码:
在我有问题"重用"TImage的代码中,序列是:
在表单上创建:
LogoImage.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ;
Run Code Online (Sandbox Code Playgroud)
(PNGIMage是公司徽标,LogoImage1是主要表格).
在打印报告标题上:
procedure PrintLogo (Report : TBaseReport) ;
var
X1, Y1, LogoHeightMM : Double ;
begin
with Report do
begin
LogoHeightMM := CalcGraphicHeight (LogoWidthMM, MainForm.LogoImage.Picture.Graphic) ;
X1 := PageWidth - MarginRight - LogoWidthMM ;
Y1 := SectionBottom - LogoHeightMM ;
PrintBitmapRect (X1, Y1, X1 + LogoWidthMM, Y1 + LogoHeightMM, MainForm.LogoImage.Picture.Bitmap) ;
end ;
end ;
Run Code Online (Sandbox Code Playgroud)
第一次打印徽标的例程被调用时,它会毫无错误地执行,但是在调用PrintBitmapRect之后,LogoImage …
鉴于我正在通过网络在计算机上执行EXE文件(D2006应用程序),我如何获取该计算机上commondocs文件夹的路径名,因为可能已从UNC快捷方式或映射的驱动器号调用EXE快捷方式,远程机器的平台不一定是已知的(但将是> = WinXP)?
在这种情况下,客户端拥有大量分散的计算机,并且他们无法在所有PC上安装我的应用程序.所以他们所做的就是在网络上的某个地方安装可执行文件,并为每个人提供快捷方式.这似乎已经很适合他们了,那里没有问题.
根据他们的要求,我让应用程序从与可执行文件放在同一文件夹中的INI文件中读取设置.我只能假设他们已经配置了所有用户可以写入该文件夹,以便可以保存INI文件.
但是,我想更改它以便读取INI文件并将其保存到远程计算机上的commondocs文件夹树中的某个位置,这样它们就不需要提供对Program files文件夹的写入权限.
我有一种情况,用户可以指定两个单独的路径名,我需要检查一个路径名是否在另一个路径名"内部".如果两个路径名都是UNC,或者两者都是基于驱动器号的,那么我可以这样做,但是如果它们是混合的呢?
你可以将"C:\ Program Files"之类的路径"规范化"为"\\ [此计算机名称]\C\Program Files"吗?显然,我不能走另一条路,因为UNC格式的网络文件夹可能没有映射到它的相应驱动器号.
找出资源名称是否存在的最佳方法是什么 - 除了查看是否
LoadFromResourceName (HInstance, 'FOOBAR')
Run Code Online (Sandbox Code Playgroud)
引起异常?
我有一个 Delphi 2006 应用程序,当检测到错误条件时,它会弹出一个模式警报对话框。由于对错误条件的检查是在空闲处理程序中完成的,如果碰巧显示了另一个模态对话框,则该对话框可能会弹出到另一个模态对话框的顶部。这可能会导致用户感到困惑,即在关闭警报对话框后应用程序主窗体没有获得焦点,因为这是另一个模糊的模式对话框。
我想做的是在应用程序打开任何模态对话框时推迟警报弹出窗口。
我试过 GetLastActivePopup (MyMainWindow.Handle) 但它似乎一直都返回非零值。
delphi ×9
delphi-2006 ×6
forms ×3
unc ×2
batch-file ×1
callback ×1
file-exists ×1
file-io ×1
freeze ×1
mapped-drive ×1
modal-dialog ×1
networking ×1
oncreate ×1
onresize ×1
path ×1
png ×1
timage ×1
timeout ×1
vfw ×1
webcam ×1