我使用Delphi 2007.我有一个TListView
with OwnerData
并OwnerDraw
设置为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 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文件中根本不存在黑色笔划.
这似乎是一个愚蠢而简单的问题,然而,我一直无法找到令人满意的答案.基本上,我有一个带数据的TListview(style = vsReport).有时,我必须更新它,因此,我必须清除列表视图并使用更新的数据再次填充它.
但是,当我这样做时,滚动条位置重置为0.我希望能够在清除之前获得滚动条位置并将其设置回原来的状态.如果更新的数据与旧数据具有完全相同的行数,我需要滚动条与之前的位置完全相同; 如果没有,我只需要它和以前在同一个地方或多或少.
看起来很简单吧?然而,我发现的只有TopItem和MakeVisible的黑客或调整.有没有适当的方法来做到这一点?
谢谢!
我有一个多线程软件,它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
根据我的理解,调用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 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 7上,这就是我所拥有的:
当然,现在,我想知道填充这些垂直白色条纹的正确代码是什么.但是,我也想知道为什么会这样.它来自德尔福吗?Windows 7的?我的代码?
基本上,我使用Chromium来显示一个我无法控制的网站.当用户点击特定按钮时,发送XHR请求; 我希望能够找到答案.所以,假设请求发送A,服务器回复B; 我希望能够阅读B.我怎么能这样做?
我有一个名为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版本:2007
你好,
我有一个Tecord阵列
TInfo = Record
Name : String;
Price : Integer;
end;
var Infos : Array of Tinfo;
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来对我的Infos
阵列进行排序,并找到了我认为是一种聪明的方法.基本上,我有一个TList,我在其中添加指向数组的每个单元格的指针; 然后,我使用自定义排序功能对它们进行排序.然后,这个从TList用于显示在选细胞TListView
与OwnerData
设置为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)