小编ssh*_*ssh的帖子

Alpha Blend是否可以对TForm进行VCL控制?

是否可以使用Alpha Blend或对TForm上的VCL控件实现类似的效果?

例如,考虑以下屏幕截图,其中除了其他控件之外,还有两个TPanel放置在TForm上.两个面板都可以拖动(请参阅 如何在运行时移动和调整控件大小).

现在,是否可以在拖动时使这些面板呈现半透明状态,以便您可以看到下面的内容?(如图像处理产生的第二张图片所示)

样本表单图像

TLama和Uwe Raabe提出的解决方案

delphi

12
推荐指数
3
解决办法
5569
查看次数

为什么线程甚至在抢占式多任务操作系统上挨饿(Windows 7)

我写了一个Win32应用程序(在Delphi-7中使用TThread类是32位)来创建100个线程.恢复时的每个线程将连续(在循环中)递增与线程对象相关联的64位计数器(因此不会锁定或共享数据).

如果让系统运行10到15秒并在此之后停止,则应该在每个线程中看到大致相同的计数.但我观察到的是,81个线程在4亿个循环下运行,其余循环超过9.5亿次.与最快的2111万相比,最慢的线程只有2.3亿.

根据MSDN,抢占式多任务处于线程级别(而不是进程级别),因此我的每个线程都应该以循环方式获得其时间片.我在这里错过了什么,为什么会出现这种差异?

编辑1:机器配置:启用超线程的Intel i7 Quad Core 3.4GHz(一次启动8个活动线程).运行Windows-7 64位专业版(测试应用程序是32位)

Edit2(线程代码):测试应用程序是在打开优化的情况下构建的,没有任何调试信息.在IDE外部运行测试应用程序.

type

  TMyThread = class(TThread)
  protected
    FCount: Int64;
  public
    constructor Create;
    procedure Execute; override;
    property Count: Int64 read FCount;
  end;


{ TMyThread }

constructor TMyThread.Create;
begin
  inherited Create(True);
  FCount := 0;
end;  

procedure TMyThread.Execute;
begin
  inherited;
  while not Terminated do
  begin
    Inc(FCount);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

delphi winapi multithreading delphi-7 multitasking

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

Delphi 7 Enterprise或Delphi 2010 Professional

在工作中,我使用Delphi 6&7 Enterprise已有好几年了.几年前,我买了Turbo Delphi Professional的个人副本.因此我有资格获得Delphi 2010 Professional升级.但是我没有资格获得Delphi 2010 Enterprise升级.

是否值得购买Delphi 2010 Professional Upgrade或者我应该寻找Delphi 7 Enterprise?

我试图购买Delphi的目的包括编写用于学习目的的多层数据库应用程序.

任何建议将不胜感激.

TIA!

delphi delphi-7 delphi-2010

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

如何在不使用 Indy 组件的情况下在 Delphi 10.1 中 ping 一个 IP 地址?

如何在不使用 Indy 组件的情况下在 Delphi 10.1 中 ping 一个 IP 地址(或按服务器名称)?TIdICMPClient 使用提升的权限工作,但我想以普通用户的身份进行。

delphi ping icmp

6
推荐指数
2
解决办法
9583
查看次数

如何有选择地使Owner Drawn TListBox的画布无效?

我有一个所有者绘制TListBox(lbVirtualOwnerDraw),其内容得到动态更新(一秒钟内可以有多达10个更新).一次最多可以在列表框中放置300个项目.每个项目可能有大约5行文本和与之关联的图像.每当刷新一个项目时,我都必须刷新(或使其无效)TListBox,以便VCL框架调用ListBoxDrawItem.但由于所有冗余重新涂漆,这会对整体性能产生不利影响.所以我的问题是:

  1. 有没有办法只使画布的一小部分无效,其中包含一个项目或其中一个部分的图纸?(例如,包含一行文本或位图的矩形).

  2. 我们如何在Draw Item中处理这样一个选择性的无效矩形?如果可以将整数作为Refresh或invalidate的一部分传递,我可以在DrawItem中使用它来确定要刷新的内容.

  3. 有没有办法找到一个项目在TListBox上是否可见(按索引)?

提前致谢!

delphi ownerdrawn

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

TWinSocketStream.WaitForData如何知道我是打算读还是写?

我在阻塞模式下使用TClientSocket/TServerSocket创建TCP客户端/服务器.概念验证服务器已经构建并使用telnet测试基本功能(接收数据).在客户端上,将有两个线程用于写入,另一个用于读取.现在,为了测试"发送(或写入)线程",我使用以下代码.但是stream.WaitForData(30000)总是超时.Delphi帮助说" 在通过套接字连接读取或写入信息之前调用WaitForData ".所以我想知道TWinSockStream是如何知道我正在调用WaitForData进行写入而不是为了阅读?

procedure TClientThread.Execute;
var
  stream: TWinSocketStream;
  buffer: string;
begin

  stream := TWinSocketStream.Create(FClientSocket.Socket, 60000);
  try
    while (not Terminated) and (FClientSocket.Active) do
    begin
      try
        //FSendDataEvent is a trigger used for testing purpose
        if FSendDataEvent.WaitFor(1000) = wrSignaled then
        begin
          FSendDataEvent.ResetEvent;

          if stream.WaitForData(30000) then
          begin
            buffer := 'Hello from client';
            stream.Write(buffer, Length(buffer) + 1 );
          end;
        end;
        //Other useful code
      except
        on E:Exception do
        begin
          DebugOutput('TClientThread.Execute: ' + E.Message);
        end;
      end;
    end;
  finally
    stream.free;
  end;

end;
Run Code Online (Sandbox Code Playgroud)

即使删除了WaitForData(),文本也不会按原样传输到服务器.但直接调用时,以下代码工作正常 - 没有WaitForData().

FClientSocket.Socket.SendText('Hi from client'); …
Run Code Online (Sandbox Code Playgroud)

delphi network-programming

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

如何将Delphi Stream传递给ac/c ++ DLL

是否可以将Delphi流(TStream后代)传递给用c/c ++编写的DLL?DLL将用Microsoft c/c ++编写.如果那是不可能的,那么如果我们使用C++ Builder来创建DLL呢?或者,是否有可以在Microsoft C/C++和Delphi之间共享的Stream(FIFO)类?

谢谢!

c++ delphi stream

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

来自Windows的文件打印反馈

我正在尝试使用Delphi 2007中使用shellExecute启动的一些Pdf阅读器打印多个PDF文件.

这种方法的可靠性可能不是很好,因为实际打印可能由于几个原因而失败.我想知道我的程序是否有办法知道文件是否或何时实际发送到打印后台处理程序?

delphi

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

WM_COPYDATA:接收者可以修改COPYDATASTRUCT内容吗?

我试图在Delphi中的两个Windows应用程序之间进行通信.发件人使用WM_COPYDATA通过SendMessage发送命令.那部分工作正常.接收方是否可以在同一个呼叫中回复一些结果字符串?对我来说失败了,跟随现在正在发生的事情.

  1. 发件人使用WM_COPYDATA使用阻塞调用SendMessge向Receiver发送命令.

  2. Receiver处理命令并使用一些结果字符串修改COPYDATASTRUCT,这些结果字符串必须发送回发送方并退出事件处理程序

  3. Receiver的"SendMessage"函数返回但COPYDATASTRUCT的内容仍未更改.

显然,Windows的消息传递机制不是在两个应用程序之间共享COPYDATASTRUCT内存.相反,它正在复制.

delphi inter-process-communicat wm-copydata

3
推荐指数
2
解决办法
922
查看次数

如何使用Delphi/DSPack捕获帧而不在TVideoWindow上显示它?

DSpack具有示例代码,用于播放与DirectShow兼容的视频设备并同时捕获视频帧.TVideoWindow附加到FilterGraph以显示视频(Firgure-1).如果您删除TVideoWindow,则操作系统(Windows)将自动调出ActiveMovie并在单独的窗口中显示视频(图2).

有没有办法使用DSPack捕获视频帧而不使用任何GUI组件而不显示视频?

DSPack论坛提到了NullRenderer过滤器,但没有关于如何使用它的文档或示例.看起来我们可以实现这一点,如果我们直接在GraphEdit中用Null Render手动替换Video Renderer(图3).

我们如何通过在代码中进行所有操作来实现图3中所示的结果?DSPack没有解释如何创建Null渲染器.

Figure-1: The graph of the default example code
Run Code Online (Sandbox Code Playgroud)

图1

Figure-2: Shows what happens if I remove the TVideoWindow
Run Code Online (Sandbox Code Playgroud)

图-2

Figure-3: Shows what happens if I replace Video Renderer with a 
         Null Renderer and manually connect them in the GraphEdit. 
Run Code Online (Sandbox Code Playgroud)

图-3-

这就是我最终做的事情(到目前为止)

请拨打以下ReassignSampleGrabberOutput之前filterGraph.Play;

procedure TForm1.ReassignSampleGrabberOutput;
var
  nullRenderer : IBaseFilter;
  nullRendererPins: IEnumPins;
  nullRendererPin : IPin;
  graph:   IGraphBuilder;
begin

  nullRenderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;
  FilterGraph1.QueryInterface(IID_IGraphBuilder, graph);
  graph.AddFilter(nullRenderer, 'Null Renderer');

  nullRenderer.EnumPins(nullRendererPins);

  nullRendererPins.Reset;

  if nullRendererPins.Next(1, nullRendererPin, nil) = S_OK …
Run Code Online (Sandbox Code Playgroud)

delphi directshow dspack

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