小编All*_*ain的帖子

在Ownerist和OwnerDraw设置为True的TListView上显示错误提示

我使用Delphi 2007.我有一个TListViewwith OwnerDataOwnerDraw设置为True.ViewStyle设置为vsReport.

我有一个record.

type TAList=record
  Item:Integer;
  SubItem1:String;
  SubItem2:String;
end;

var
 ModuleData: array of TAList;

procedure TForm1.ListView3Data(Sender: TObject; Item: TListItem);
begin
 Item.Caption := IntToStr(ModuleData[Item.Index].Item);
 Item.SubItems.Add(ModuleData[Item.Index].SubItem1);
 Item.SubItems.Add(ModuleData[Item.Index].SubItem2);
end;

procedure TForm1.ListView3DrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState);
var
 LIndex : integer;
 LRect: TRect;
 LText: string;
 TTListView: TListView;
begin
 TTListView := TListView(Sender);

 if (Item.SubItems[0] = '...') then
 begin
  TTListView.Canvas.Brush.Color := clHighlight;
  TTListView.Canvas.Font.Color  := clHighlightText;
 end else
 begin
  TTListView.Canvas.Brush.Color := TTListView.Color;
  TTListView.Canvas.Font.Color …
Run Code Online (Sandbox Code Playgroud)

delphi hint ownerdrawn delphi-2007 tlistview

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

为什么我的图标在带有TTrayIcon的托盘栏上很难看?

我最近在Delphi 2007中发现了TTrayIcon组件.使用的代码非常简单.

procedure TForm1.FormCreate(Sender: TObject);
begin
 AppTrayIcon := TTrayIcon.Create(nil);
 AppTrayIcon.OnDblClick := OnAppTrayIconDblClick;
 Application.OnMinimize := OnApplicationMinimize;
 Application.OnRestore := OnApplicationRestore;
end;

procedure TForm1.OnApplicationRestore(Sender: TObject);
begin
 AppTrayIcon.Visible := False;
 ShowWindow(Application.Handle, SW_SHOW);
 Application.BringToFront;
end;

procedure TForm1.OnApplicationMinimize(Sender: TObject);
begin
 AppTrayIcon.Visible := True;
 ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.OnAppTrayIconDblClick(Sender: TObject);
begin
 Application.Restore;
end;
Run Code Online (Sandbox Code Playgroud)

由于没有分配图标,Delphi使用Application.Icon,即图标:http://artbyloveland.com/icon.ico此图标包括以下尺寸:64x64,48x48,32x32,24x24和16x16.

现在,在我的Windows Vista上,一切都很好.

在像Windows Server 2003这样的非主题Windows上,结果全部搞砸了:

搞砸了图标

编辑: 起初,我认为这是因为alpha通道.所以我尝试在不使用alpha通道的情况下制作ico文件的版本.我也按照Ken的建议尝试了GreenFish Icon Editor; 我选择了每种颜色深度和每种尺寸.在这两种情况下,最终结果都更好.但是,ico文件中根本不存在黑色笔划.

搞砸了图标2

delphi alpha blur tray

8
推荐指数
2
解决办法
1312
查看次数

Delphi - 获取并设置ListView的滚动条位置

这似乎是一个愚蠢而简单的问题,然而,我一直无法找到令人满意的答案.基本上,我有一个带数据的TListview(style = vsReport).有时,我必须更新它,因此,我必须清除列表视图并使用更新的数据再次填充它.

但是,当我这样做时,滚动条位置重置为0.我希望能够在清除之前获得滚动条位置并将其设置回原来的状态.如果更新的数据与旧数据具有完全相同的行数,我需要滚动条与之前的位置完全相同; 如果没有,我只需要它和以前在同一个地方或多或少.

看起来很简单吧?然而,我发现的只有TopItemMakeVisible的黑客或调整.有没有适当的方法来做到这一点?

谢谢!

delphi scrollbar tlistview

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

连接到Synapse上的某些代理时,SSL_Connect挂起

我有一个多线程软件,它TStringList使用对象的HTTPMethod方法遍历一个HTTP URL THTTPSend...然而,一个错误开始出现在代理中 - 少用好的私有代理,更多用坏的公共代理.偶尔会有几个线程挂起并且100%无响应.超时设置和heartbeat代码将被忽略; 不会引起例外.无论我等多久(最多10分钟),线程仍然会挂起.关闭软件是阻止线程的唯一方法.

我发现有罪的方法是SSL_Connect.从我所读到的,这种悬挂行为可以通过使用非阻塞套接字(永远openssl ssl_connect块 - 如何设置超时?)来纠正.

问题是,Synapse是一个阻塞套接字库.我总是可以为这个小软件使用非阻塞套接字库,但我想为我的一些更大的软件实现SSL协议.我不能为另一个可能有自己的bug的Internet库更改所有代码.

如何SSL_Connect在使用Synapse的同时设置某种超时?

没有代码,因为一切都非常简单.这是一个循环的URL的TStringList - 没有别的!但是,如果您认为需要(或者您需要任何其他类型的信息),请告诉我.

Delphi使用: 2007

使用的Synapse版本:发布40(2012)(编辑:最新的SVN中继下载仍存在该错误.)

使用的OpenSSL版本: 1.0.1e

delphi openssl timeout connect

5
推荐指数
0
解决办法
772
查看次数

TThread的同步行为

根据我的理解,调用TThread的Synchronize将执行同步代码,就好像它是在主线程中运行一样.让我们说在我的主线程中,我有一个按钮:

procedure TForm3.Button1Click(Sender: TObject);
var
 A, B, C : String;
begin
 A := 'test1';
 B := 'test2';
 C := 'test3';
 Button1.Enabled := false;
end;
Run Code Online (Sandbox Code Playgroud)

在辅助线程中,我有以下代码:

procedure TestThread.ChangeButton1;
begin
 Form3.Button1.Enabled := true;
end;
Run Code Online (Sandbox Code Playgroud)

(不要注意代码本身 - 它只是一个例子而且它应该意味着什么.)

假设我单击Button1,然后在执行Button1Click时,TestThread调用Synchronize(ChangeButton1); 我们可以知道什么时候主线程会运行ChangeButton1吗?如果是这样,它是否会在整个Button1Click被执行之后出现; 或者它可以是程序内的四个操作中的任何一个?

对不起,如果这是一个愚蠢的问题.我一直无法找到这个问题的答案.这将使我更好地了解Synchronize过程的工作原理.

谢谢.

delphi synchronize

4
推荐指数
2
解决办法
626
查看次数

为什么我在自定义绘制的列表视图中获得白色列分隔符?

基本上,我有以下Delphi 2007代码(CustomDrawItem):

procedure TForm1.ListViewCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if (Item.SubItems[0] = '...') then
  ListView.Canvas.Brush.Color := clSkyBlue;
end;
Run Code Online (Sandbox Code Playgroud)

在我的Windows XP上,一切都很完美:

在Windows XP上

但在Windows 7上,这就是我所拥有的:

在Windows 7上

当然,现在,我想知道填充这些垂直白色条纹的正确代码是什么.但是,我也想知道为什么会这样.它来自德尔福吗?Windows 7的?我的代码?

delphi listview brush colors

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

如何检索XHR响应?

基本上,我使用Chromium来显示一个我无法控制的网站.当用户点击特定按钮时,发送XHR请求; 我希望能够找到答案.所以,假设请求发送A,服务器回复B; 我希望能够阅读B.我怎么能这样做?

delphi delphi-2007 chromium-embedded

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

竞争条件 - Mutexes可以更灵活吗?

我有一个名为TTestThread的TThread对象.创建线程后,它们会创建全局配置变量的本地副本.允许用户随时更改全局配置变量,当他这样做时,所有线程都会通过其本地UpdateLocalCopyOfConfigVariables变量通知更改.线程不直接依赖全局配置变量,因为用户可以在任何时候修改它们,如果线程同时访问它们,则会产生竞争条件.

这是TTestThread:

type
  TTestThread = class(TThread)
  private
    LocalConfigA : String;
    LocalConfigB : Integer;
    procedure UpdateLocalConfigIfNecessary;
  protected
    procedure Execute; override;
  public
    UpdateLocalCopyOfConfigVariables : Boolean;
    constructor Create;
  end;

implementation

constructor TTestThread.Create;
begin
  inherited Create(false);
  UpdateLocalCopyOfConfigVariables := true;
end;

procedure TTestThread.UpdateLocalConfigIfNecessary;
begin
  WaitForSingleObject(ConfigurationLocker, INFINITE);
  if (UpdateLocalCopyOfConfigVariables) then
  begin
    LocalConfigA := GlobalConfigA;
    LocalConfigB := GlobalConfigB;
    UpdateLocalCopyOfConfigVariables := false;
  end;
  ReleaseMutex(ConfigurationLocker);
end;

procedure TTestThread.Execute;
begin
  while (not(Terminated)) do
  begin
    UpdateLocalConfigIfNecessary;
    // Do stuff
  end; 
end;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我有一个互斥锁,以避免前面描述的那种竞争条件.WaitForSingleObject(ConfigurationLocker,INFINITE); 在用户更改全局配置变量时调用:

procedure …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading mutex delphi-2007

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

添加/删除单元格时保持数组排序的最佳方法

使用的Delphi版本:2007

你好,

我有一个Tecord阵列

TInfo = Record
 Name : String;
 Price : Integer;
end;

var Infos : Array of Tinfo;
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来对我的Infos阵列进行排序,并找到了我认为是一种聪明的方法.基本上,我有一个TList,我在其中添加指向数组的每个单元格的指针; 然后,我使用自定义排序功能对它们进行排序.然后,这个从TList用于显示在选细胞TListViewOwnerData设置为true.

var SortedInfo : TList;

...

function CompareInfo(Item1, Item2: Integer): Integer;
var
 i, j : integer;
begin
 i := Integer(Item1);
 j := Integer(Item2);
 Result := CompareText(Infos[i].Name, Infos[j].Name);
end;

...

for I := 0 to Length(Infos) - 1 do SortedInfo.Add(Pointer(I));
SortedInfo.Sort(@CompareInfo);

...

procedure InfoHandlerData(Sender: TObject; Item: TListItem);
begin
 Item.Caption := Infos[Integer(SortedInfo[Item.Index])].Name;
 Item.SubItems.Add(IntToStr(Infos[Integer(SortedInfo[Item.Index])].Price);
end; …
Run Code Online (Sandbox Code Playgroud)

arrays delphi sorting record tlist

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