小编Thi*_*Six的帖子

TLabel和TGroupbox Captions在调整大小时闪烁

  • 所以,我有一个应用程序加载不同的插件,并在TPageControl上为每个插件创建一个新选项卡.
  • 每个DLL都有一个与之关联的TForm.
  • 使用父hWnd创建表单作为新的TTabSheet.
  • 由于就VCL而言,TTabSheets不是表单的父级(不想使用动态RTL和其他语言的插件),我必须手动处理调整大小.我这样做如下:

    var
      ChildHandle : DWORD;
    begin
      If Assigned(pcMain.ActivePage) Then
        begin
        ChildHandle := FindWindowEx(pcMain.ActivePage.Handle, 0, 'TfrmPluginForm', nil);
        If ChildHandle > 0 Then
          begin
          SetWindowPos(ChildHandle, 0, 0, 0, pcMain.ActivePage.Width, pcMain.ActivePage.Height, SWP_NOZORDER + SWP_NOACTIVATE + SWP_NOCOPYBITS);
        end;
      end;
    
    Run Code Online (Sandbox Code Playgroud)

现在,我的问题是当应用程序调整大小时,TGroupBox中的所有TGroupBox和TLabel都会闪烁.不在TGroupboxes内的TLabel很好,不会闪烁.

我试过的事情:

  • WM_SETREDRAW后跟一个RedrawWindow
  • TGroupBoxes和TLabels上的ParentBackground设置为False
  • DoubleBuffer:= True
  • LockWindowUpdate(是的,即使我知道这是非常错的)
  • 透明:= False(甚至覆盖create来编辑ControlState)

有任何想法吗?

delphi groupbox flicker tpagecontrol delphi-xe

21
推荐指数
2
解决办法
7247
查看次数

AWS S3 - CORS选项在DELETE w/VersionId期间预检投掷400错误请求

我正在使用对象的Key和删除标记的VersionID尝试删除标记的deleteObject请求.

由于CORS,浏览器(Chrome 34.0.1847.11)向以下网址发送OPTIONS预检请求:http://bucket.s3-us-west-2.amazonaws.com/Folder/File.ext?versionId = 0123456789

Amazon S3使用以下XML主体响应400(错误请求):

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>InvalidArgument</Code>
    <Message>This operation does not accept a version-id.</Message>
    <ArgumentValue>0123456789</ArgumentValue>
    <ArgumentName>versionId</ArgumentName>
    <RequestId>12345</RequestId>
    <HostId>1122334455</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)

因为XMLHttpRequest返回400(错误请求),所以DELETE请求永远不会被执行.我的印象是AWS没有正确处理选项请求.如果有解决方法,那就太棒了!

我当前的CORS策略是:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>HEAD</AllowedMethod>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

仅供参考:我正在使用AWS SDK for JS 2.0.0-rc10

先感谢您.

编辑1:我尝试添加,<AllowedMethod>OPTIONS</AllowedMethod>但亚马逊返回Found unsupported HTTP method in CORS config. Unsupported method is OPTIONS

编辑2:

选项请求/响应标头:

Remote Address: *********:443
Request URL: https://bucket.s3-us-west-2.amazonaws.com/path/to/file_name?versionId=0123456789
Request Method: OPTIONS
Status Code: …
Run Code Online (Sandbox Code Playgroud)

javascript xmlhttprequest amazon-s3 amazon-web-services cors

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

将非VCL窗口添加到VCL对齐队列中

一些背景(TLabel和TGroupbox Captions Flicker on Resize的延续):

  • 所以,我有一个应用程序加载不同的插件,并在TPageControl上为每个插件创建一个新选项卡.
  • 每个DLL都有一个与之关联的TForm.
  • 使用父hWnd创建表单作为新的TTabSheet.由于就VCL而言,TTabSheets不是表单的父级(不想使用动态RTL和其他语言的插件),我必须手动处理调整大小.

对于这种"插件"类型的应用程序,我似乎遇到了很多新问题(但很棒的学习经历).

因此,我目前的努力是尝试使用一个插件,该插件不会插入到TTabSheet中,但会在表单上直接调整大小并对齐.

由于这可以更容易用图片解释: 问题的视觉表示 现在我可以手动进行对齐和调整大小,但我宁愿让VCL对齐程序(alClient,alTop等)为我做.这样我就不必考虑在其表单上设置插件对齐.

在查看VCL源代码后,我开始逐步调整对齐代码及其调用方式.基本上,当TControl获得WM_RESIZE时,它将:

  1. 调用调用AlignControl()的Realign()
  2. AlignControl()将获取客户端rect并调用AlignControls()
  3. AlignControls()将按以下顺序为每个TAlignment类型调用DoAlign():alTop,alBottom,alLeft,alRight,alClient,alCustom,alNone
  4. DoAlign()将遍历FControls和FWinControls(它们是TLists)并将它们适当地对齐

所以我的思维过程是,如果我创建一个新的TWinControl,将它的句柄设置为插件窗体(窗口)句柄,并将其插入FControls列表中,并正确对齐它应该为我工作.

我当然在这里,所以它失败了.我甚至在退出应用程序时获得了一个关于无效窗口句柄的AV.我的猜测是我创建的TWinControl试图释放不再存在的插件窗体(窗口)的句柄.

我尝试过的:

procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign);
var
  NewWinControl : TWinControl;
begin
  NewWinControl := TWinControl.Create(frmMain);
  NewWinControl.WindowHandle := AHandle;
  NewWinControl.Align := Align;
  NewWinControl.Width := frmMain.ClientWidth;
  NewWinControl.Height := 30;
  NewWinControl.Parent := frmMain;
end;

procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign);
var
  NewWinControl : TWinControl;
begin
  NewWinControl := TWinControl.Create(frmMain);
  NewWinControl.WindowHandle …
Run Code Online (Sandbox Code Playgroud)

windows delphi winapi vcl delphi-xe

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

D3D9挂钩 - 使用Direct3D9覆盖

好的,所以我试图在Direct X游戏上为一些额外的按钮做一些叠加.

我在这里找到了一个很好的覆盖的c ++示例:http://www.gamedev.net/topic/359794-c-direct3d-hooking-sample/

所以我开始将它转换为Delphi.通过一些日志记录,我可以看到它在正确的进程上启动钩子并正确挂钩Direct3DCreate9().

下一步成功创建TMyDirect3D9.但是这个过程从这里崩溃了.

我的有根据的猜测(基于Ollydbg中的一些调试)当我通过挂钩的Direct3DCreate9()将MyDirect3D9返回到原始进程并且它尝试调用其中一个类(接口)函数时,它失败了.

代码如下.如果我能提供任何其他信息以帮助告诉我.

主DLL:

library LeagueUtilityBox;

{$R *.res}

{$DEFINE DEBUG}

uses
  Windows,
  APIHijack in 'APIHijack.pas',
  Direct3D9 in '..\DirectX 9.0\Direct3D9.pas',
  uSharedMem in '..\Misc\uSharedMem.pas',
  MyDirect3D9 in 'MyDirect3D9.pas',
  MyDirect3DDevice9 in 'MyDirect3DDevice9.pas',
  {$IFDEF DEBUG}
  SysUtils,
  uLog in '..\Misc\uLog.pas',
  {$ENDIF}
  uMisc in 'uMisc.pas';

var
  SharedMem : TSharedMem;
  D3DHook: SDLLHook;
  hHook : DWORD;
  MyDirect3D9 : TMyDirect3D9;

function GetTargetProcess: String;
const
  KeyBase : DWORD = HKEY_CURRENT_USER;
  KeyLocation : String = 'Software\LeagueUtilityBox';
var
  RegKey : HKEY;
  TargetProcess : Array[0..511] Of …
Run Code Online (Sandbox Code Playgroud)

delphi directx hook pascal directx-9

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

VirtualStringTree - 在单元格中嵌入控件 - 控件不显示

所以,我的最终游戏是通过客户区内的添加/删除按钮来列出项目(如vsReport中的TListView).

例如:

|----------------|
|Old Item 1    X |
|Old Item 2    X |
|Add new item... |
|                |
|----------------|
Run Code Online (Sandbox Code Playgroud)

如果您知道某个组件在没有这些额外工作的情况下执行此操作,请告诉我们!

所以我挑选了一个红色的"X",并使用TJvTransparentButton(Jedi Components - JVCL)来显示它.它处理按下/未按下状态,仅显示图像.我原来使用了TButton,但我并不需要围绕字形的所有绒毛.

现在,我将图像按钮保存在与每个节点关联的记录中.

代码如下:

procedure TfrmMain.AddNewAccount(const Username, Password: String);
var
  Data : PTreeData;
  XNode : PVirtualNode;
Begin
  XNode := vstAccounts.AddChild(nil);
  If vstAccounts.AbsoluteIndex(XNode) > -1 Then
    begin
    Data := vstAccounts.GetNodeData(Xnode);
    Data^.Column0 := Username;
    Data^.Column1 := '';
    Data^.DeleteButton := TJvTransparentButton.Create(nil);
    With Data^.DeleteButton Do
      begin
      Parent := vstAccounts;
      Left := 0;
      Top := 0;
      Width := 16;
      Height := 16; …
Run Code Online (Sandbox Code Playgroud)

delphi virtualtreeview tvirtualstringtree

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

使用EXE代替DLL作为插件 - "单向,一次"传输信息的方法

tldr; 在底部.

好的,这又是一个有趣的问题,我正在寻找一个有趣而有趣的解决方案.

我目前的项目涉及非常模块化,这意味着程序功能将根据不同的模块轻松更改,程序将适应.

所以我开始使用典型的路由,即使用DLL插件.现在这只是正常的方式,我想在盒子外思考一下.

我的计划中包含的模块是长时间运行的广告系列,可能需要数周才能完成,并且一次会运行许多广告系列.所以稳定性是个大问题,所以我想到了谷歌Chrome的功能.进程,而不是DLL或线程.

所以我有一个框架,我需要一种方法来获取有关每个模块(现在是EXE)的一些信息.现在,对于我的DLL框架,我正在导出一个"注册"功能,可以填写一些信息.

所以我想,自己,EXE可以导出函数,让我们看看它是否真的有效......但事实并非如此.我做了一些关于Windows如何处理这些事情的研究,我不喜欢动态地攻击PE头(但它是开箱即用的那种想法我想要的).

我打算使用命名管道和CLI参数在主程序和模块exe之间传输数据.我可以以寄存器的方式使用它,但我想在这里其他人的想法.

tldr:我使用的是EXE而不是DLL的插件.寻找一种方法来轻松导出一个时间信息,如导出的"注册"功能将在DLL上.思考?

delphi winapi

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