小编mgh*_*hie的帖子

如何在Delphi中实现引用计数对象

我有一个像结构的图形.我不确切知道何时以传统的Delphi方式销毁对象,而是想实现类似引用计数对象的东西.我知道我可以使用像object.GetReference和object.lease而不是Free,并使用私有变量进行引用计数,但有没有更好的方法?

谢谢

delphi reference-counting object

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

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

我需要知道我的程序是否可以从运行它的位置将文件写入磁盘(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
查看次数

如何在列表视图中获取项目和子项目?

我想在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 vcl listviewitem

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

Delphi - 帮助从另一个线程调用线程dll函数

我正在使用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中创建的线程.

我希望这是有道理的,抱歉,我不知道有什么更好的解释方法.有没有其他人有这个问题,知道如何解决它吗?

delphi dll multithreading synchronize

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

使用Delphi的ShellExecute()继承原始控制台的进程?

在C中,我system()之前在控制台应用程序中使用了该函数,如果我使用system()它启动另一个进程,则继承调用它的进程的控制台窗口.

在Delphi system()中不存在所以我ShellExecute()用来创建一个新进程,但新进程出现在一个新的控制台窗口中.有什么方法可以让它继承正在调用它的窗口的句柄?

我用过

function GetConsoleWindow(): HWND; stdcall; external 'kernel32.dll';
Run Code Online (Sandbox Code Playgroud)

获取控制台窗口并将其传递给HWND部分ShellExecute(),但这不起作用.

delphi shellexecute

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

如何访问像字节数组的字符串?

我想要执行以下操作,但我收到"访问冲突"错误.

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)

为什么这不起作用?

arrays delphi string

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

如何加快连接到MS SQL Server的应用程序的速度?

我有一个在SQL Server 2000上运行的Delphi应用程序,但是连接到数据库需要很长时间!

但是,当我在我的开发服务器上运行此应用程序时,它连接速度非

我在Windows 2003服务器,SQL Server 2k个人版上运行,当我在注册表中查看我的MDAC版本时,我看到已经安装了2.8版本!

有什么想法为什么会在生产机器上而不是在开发机器上发生?

sql sql-server delphi

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

在Python中保持变量值

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)

python variables loops

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

我应该在开源项目中支持哪个基于文件的DBMS?

我正在开发一个可以使用大量DBMS作为后端的开源项目.到目前为止,我们支持SQL Server 2005和SQL Server 2008,但我们还希望支持一些其他数据库,包括一些基于文件的数据库.

注意:基于文件的数据库必须在64位平台上运行,因此MS Access不是一个选项,因为没有64位提供程序AFAIK.

您认为哪个DBMS应该以数据库为中心的开源项目支持?

database open-source

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

在D2007中连接字符串时,此访问冲突的原因是什么?

我有一个接受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,然后分配s3s2的AV消失.为什么?直接写入字符串参数有什么问题?

delphi string constants delphi-2007

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

在使用QueueUserWorkItem(win 32/nt5)创建的线程池中终止长时间运行的线程

我在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用于排队工作的东西?

c++ winapi multithreading threadpool

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

如何将字符串或字符转换为其unicode表示并返回?

我正在学习更多有关Unicode的知识.有人可以演示如何将代码点值转换为字符串,反之亦然.

例如:如何转换U+0037为其字符或字符串表示形式7.

还请说明如何为ascii执行此操作.例如:转换&nbsp;为其字符或字符串表示形式,即空格.

delphi unicode delphi-xe

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

将剪贴板中的文本保存到文件中

我正在尝试下面的代码,应该将剪贴板文本保存到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 delphi-xe6

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