我有一个像结构的图形.我不确切知道何时以传统的Delphi方式销毁对象,而是想实现类似引用计数对象的东西.我知道我可以使用像object.GetReference和object.lease而不是Free,并使用私有变量进行引用计数,但有没有更好的方法?
谢谢
我需要知道我的程序是否可以从运行它的位置将文件写入磁盘(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会尝试写入应用程序的驱动器(只读它)?
我想在listview中获取所有项目和子项目,但我得到的只是"TlistItem"
这是我的代码:
procedure TFrameAnalyzer.AddEntry(opcode:word;data:Array of byte;direction:byte);
begin
MessageBox(0,PChar(sListView1.Items.Item[4].ToString),'',0);
end;
Run Code Online (Sandbox Code Playgroud)
如何将项目的名称作为字符串以及它的2个子项目的名称?
我正在使用Delphi 2006,并且我正在开发的应用程序有点问题.
我有一个表单创建一个线程,调用一个执行冗长操作的函数,让我们称之为LengthyProcess.在LengthyProcess函数内部,我们还调用了几个Dll函数,这些函数也创建了自己的线程.
我遇到的问题是,如果我不使用我的线程的Synchronize函数调用LengthyProcess线程停止响应(主线程仍然响应正常).我不想使用Synchronize,因为这意味着主线程正在等待LengthyProcess完成,因此无法创建单独的线程.
我已经将问题跟踪到了创建线程然后调用WaitFor的dll中的函数,顺便说一下,这都是使用TThread完成的.WaitFor检查CurrentThreadID是否等于MainThreadID,如果是,那么它将调用CheckSychronization,一切正常.因此,如果我们使用Synchronize,那么CurrentThreadID将等于MainThreadID,但是如果我们不使用Synchronize当然是CurrentThreadID <> MainThreadID,并且当发生这种情况时WaitFor会告诉当前线程(我创建的线程)等待由此创建的线程DLL等所以CheckSynchronization永远不会被调用,我的线程最终会等待dll中创建的线程.
我希望这是有道理的,抱歉,我不知道有什么更好的解释方法.有没有其他人有这个问题,知道如何解决它吗?
在C中,我system()
之前在控制台应用程序中使用了该函数,如果我使用system()
它启动另一个进程,则继承调用它的进程的控制台窗口.
在Delphi system()
中不存在所以我ShellExecute()
用来创建一个新进程,但新进程出现在一个新的控制台窗口中.有什么方法可以让它继承正在调用它的窗口的句柄?
我用过
function GetConsoleWindow(): HWND; stdcall; external 'kernel32.dll';
Run Code Online (Sandbox Code Playgroud)
获取控制台窗口并将其传递给HWND
部分ShellExecute()
,但这不起作用.
我想要执行以下操作,但我收到"访问冲突"错误.
type Bin = array of byte;
var s:string;
begin
s:='some string';
Bin(s)[3]:=ord('X');
caption:=s;
end;
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
我有一个在SQL Server 2000上运行的Delphi应用程序,但是连接到数据库需要很长时间!
但是,当我在我的开发服务器上运行此应用程序时,它连接速度非
我在Windows 2003服务器,SQL Server 2k个人版上运行,当我在注册表中查看我的MDAC版本时,我看到已经安装了2.8版本!
有什么想法为什么会在生产机器上而不是在开发机器上发生?
for i in range(0,3):
j = 0
print 'incrementing '
j += 1
print j
Run Code Online (Sandbox Code Playgroud)
版画
incrementing
1
incrementing
1
incrementing
1
Run Code Online (Sandbox Code Playgroud)
如何保持'j'的值以便打印:
1
2
3
Run Code Online (Sandbox Code Playgroud) 我正在开发一个可以使用大量DBMS作为后端的开源项目.到目前为止,我们支持SQL Server 2005和SQL Server 2008,但我们还希望支持一些其他数据库,包括一些基于文件的数据库.
注意:基于文件的数据库必须在64位平台上运行,因此MS Access不是一个选项,因为没有64位提供程序AFAIK.
您认为哪个DBMS应该以数据库为中心的开源项目支持?
我有一个接受2个字符串参数的过程,其中一个具有默认值.在程序中,我想连接一个和另一个以及一些文字以形成一个更大的字符串.不知怎的,我正在收到一个AV ...任何想法?
代码是这样的
{$WRITEABLECONST ON}
constructor MyClass.Create(s1: string; s2: string = GlobalConstant);
var s3: string;
begin
....
if (s2 = '') then s2 := GlobalConstant + ' (' + s1 + ')'; // AV here
....
end;
Run Code Online (Sandbox Code Playgroud)
如果我给你GlobalConstant + ' (' + s1 + ')
来s3
,然后分配s3
到s2
的AV消失.为什么?直接写入字符串参数有什么问题?
我在Win32 nt5环境中编程.
我有一个将被多次调用的函数.每次调用都是原子的.我想用来利用QueueUserWorkItem
多核处理器.
我遇到的问题是我只想让功能完成3秒钟.如果它在3秒内没有完成,我想终止该线程.
目前我正在做这样的事情:
HANDLE newThreadFuncCall= CreateThread(NULL,0,funcCall,&func_params,0,NULL);
DWORD result = WaitForSingleObject(newThreadFuncCall, 3000);
if(result == WAIT_TIMEOUT)
{
TerminateThread(newThreadFuncCall,WAIT_TIMEOUT);
}
Run Code Online (Sandbox Code Playgroud)
我只生成一个线程并等待3秒或完成.反正有没有做类似但QueueUserWorkItem
用于排队工作的东西?
我正在学习更多有关Unicode的知识.有人可以演示如何将代码点值转换为字符串,反之亦然.
例如:如何转换U+0037
为其字符或字符串表示形式7
.
还请说明如何为ascii执行此操作.例如:转换
为其字符或字符串表示形式,即空格.
我正在尝试下面的代码,应该将剪贴板文本保存到Delphi XE6中的文本文件中.代码运行正常,但在输出文件中只生成垃圾值,即使剪贴板包含复制的文本片段也是如此.如何更改代码才能正常工作?
function SaveClipboardTextDataToFile(
sFileTo : string ) : boolean;
var
ps1,
ps2 : PChar;
dwLen : DWord;
tf : TextFile;
hData : THandle;
begin
Result := False;
with Clipboard do
begin
try
Open;
if( HasFormat( CF_TEXT ) ) then
begin
hData :=
GetClipboardData( CF_TEXT );
ps1 := GlobalLock( hData );
dwLen := GlobalSize( hData );
ps2 := StrAlloc( 1 + dwLen );
StrLCopy( ps2, ps1, dwLen );
GlobalUnlock( hData );
AssignFile( tf, sFileTo );
ReWrite( tf );
Write( tf, …
Run Code Online (Sandbox Code Playgroud) delphi ×10
string ×2
arrays ×1
c++ ×1
constants ×1
database ×1
delphi-2007 ×1
delphi-xe ×1
delphi-xe6 ×1
disk ×1
dll ×1
listviewitem ×1
loops ×1
object ×1
open-source ×1
python ×1
shellexecute ×1
sql ×1
sql-server ×1
synchronize ×1
threadpool ×1
unicode ×1
variables ×1
vcl ×1
winapi ×1