我正在使用Delphi XE-5(Firemonkey移动应用程序)
我想通过在长时间处理期间显示来让TAniIndicator工作.我的主表单上有一个TAniIndicator(AniIndi),但它没有旋转.它显示正确,但不旋转.
begin
Loading:= True;
AniIndi.Visible:= True;
AniIndi.Enabled:= True;
UpdateAll;
Application.ProcessMessages;
//do my processsing here
Loading:= False;
AniIndi.Enabled:= False;
AniIndi.Visible:= False;
UpdateAll;
Application.ProcessMessages;
end;
Run Code Online (Sandbox Code Playgroud)
//基于REMY的答案进行编辑
TLoadThread = class(TThread)
public
Config: Boolean;
constructor Create(const aConfig: Boolean); reintroduce;
protected
procedure DoProcessing;
procedure Execute; Override;
end;
var
loading: Boolean = false;
zLThread: TLoadThread = nil;
constructor TLoadThread.Create(const aConfig: Boolean);
begin
inherited Create(true);
Config:= aConfig;
end;
procedure TLoadThread.DoProcessing;
var
begin
//do processing here and update main form
end;
procedure TLoadThread.Execute;
begin
FreeOnTerminate:= true; …Run Code Online (Sandbox Code Playgroud) 我需要通过Win8在WinXP中读取和写入配置文件到Windows磁盘.他们最适合这样做的地方在哪里?看起来似乎不允许ProgramData文件夹
procedure TfrmMain.FormCreate(Sender: TObject);
var
path: array[0..MAX_PATH] of char;
begin
SHGetFolderPath(0, CSIDL_COMMON_APPDATA, 0, SHGFP_TYPE_CURRENT, @path);
AppPath:= Path;
AppPath:= AppPath + '\Customer\';
if not DirectoryExists(AppPath) then
CreateDir(AppPath);
if FileExists(AppPath + 'Customers.cst') then
LoadFromFile(AppPath + 'Customers.cst');
end;
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if ListModified then
begin
if MessageDlg('Save Changes?', mtWarning, [mbYes, mbNo], 0) = mrYes then
SaveToFile(AppPath + 'Customers.cst');
canClose:= True;
end
else
canClose:= False;
end;
Run Code Online (Sandbox Code Playgroud) 我收到以下错误 - "排序列表上不允许操作"
Idx:= Customers.IndexOfName(ListView1.Selected.Caption);
Customers[idx]:= Edit1.Text + '=' + Edit2.Text + ',' + Edit3.Text //error occurs here
Run Code Online (Sandbox Code Playgroud)
有没有办法解决?除了写我自己的例程来获取索引值
感谢名单
我有一个包含 4 列(当然都是字符串)的 TListview,但是,我将数据存储在其中:
Caption: 任何字符串
SubItems[0]:整数,例如 '5016'
SubItems[1]:日期,例如 '03/22/13'
Subitems[2]: 任何字符串
当用户单击coolumn 标题时,我使用以下代码进行排序
我正在看这篇文章“如何根据子项 [x] 在 Tlistview 中进行排序”,但我无法弄清楚如何考虑不同的列类型。
procedure TfrmFind.lvwTagsColumnClick(Sender: TObject; Column: TListColumn);
begin
ColumnToSort := Column.Index;
(Sender as TCustomListView).AlphaSort;
end;
procedure TfrmFind.lvwTagsCompare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
var
ix: Integer;
begin
if ColumnToSort = 0 then
Compare := CompareText(Item1.Caption,Item2.Caption)
else begin
ix := ColumnToSort - 1;
Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
end;
end;
Run Code Online (Sandbox Code Playgroud)
如何考虑 Integer 和 Date 列,以便它们不会按字符串排序?
谢谢
我最近得到了帮助,根据列数据类型对TListView的列进行排序.
这是代码:
procedure TfrmFind.lvwTagsColumnClick(Sender: TObject; Column: TListColumn);
begin
ColumnToSort := Column.Index;
(Sender as TCustomListView).AlphaSort;
end;
procedure TfrmFind.lvwTagsCompare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
var
ix: Integer;
begin
if ColumnToSort = 0 then
Compare := CompareText(Item1.Caption,Item2.Caption)
else
if ColumnToSort = 1 then
Compare := CompareTextAsInteger(Item1.subitems[0],Item2.subitems[0])
else
if ColumnToSort = 2 then
Compare := CompareTextAsDateTime(Item1.subitems[1],Item2.subitems[1])
else
begin
ix := ColumnToSort - 1;
Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
end;
end;
Run Code Online (Sandbox Code Playgroud)
如果有可能,我想添加升序和降序排序功能吗?
用户单击一次以升序排序,然后再次单击降序排序
我可以从我目前的代码中执行此操作吗?
如何在左列添加一个字形以显示排序类型(升序与降序)?
******************************************************************************
Run Code Online (Sandbox Code Playgroud)
基于专家的修改答案:2013年3月25日
procedure TfrmFind.lvwTagsColumnClick(Sender: …Run Code Online (Sandbox Code Playgroud) Delphi 2010
我在我的主窗体上使用OnFormKeyDown事件,我基本上在Dialog上使用相同的事件
//主要形式
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_DOWN: btnLast.OnClick(Self);
VK_Up: btnFirst.OnClick(Self);
VK_Left: btnPrev.OnClick(Self);
VK_Right: btnNext.OnClick(Self);
end;
end;
procedure TfrmMain.mniShowOwnedClick(Sender: TObject);
var
I: Integer;
begin
frmMain.KeyPreview:= False;
frmOwned.KeyPreview:= True;
frmOwned.Owned2.Clear;
for I := 0 to Tags.Count - 1 do
if Owned.IndexOf(Tags.Names[I]) <> -1 then
frmOwned.Owned2.Add(Tags[I]);
if frmOwned.ShowModal = mrOK then
begin
frmMain.KeyPreview:= True;
frmOwned.KeyPreview:= False;
end;
end;
Run Code Online (Sandbox Code Playgroud)
//对话
procedure TfrmOwned.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_DOWN: btnLast.OnClick(Self); …Run Code Online (Sandbox Code Playgroud) Delphi 2010
我有一个列表框,我填写了所有进程ID的列表.
function EnumProcess(hHwnd: HWND;lParam : integer): boolean; stdcall;
var
pPid : DWORD;
title, className : string;
begin
if(hHwnd=NULL) then
begin
result := false;
end
else
begin
GetWindowThreadProcessId(hHwnd,pPid);
SetLength(className, 255);
SetLength(className, GetClassName(hHwnd, PChar(className), Length(className)));
SetLength(title, 255);
SetLength(title, GetWindowText(hHwnd, PChar(title), Length(title)));
//form1.ListBox1.Items.Add('Class Name = ' + className + '; Title = ' + title + '; HWND = ' + IntToStr(hHwnd) + '; Pid = ' + IntToStr(pPid));
form1.ListBox1.Items.Add(IntToStr(pPid));
result := true;
end;
end;
Run Code Online (Sandbox Code Playgroud)
有没有办法隐藏和显示PID?我需要一个Hide函数和一个可以处理它们的函数
function HidePID(Value: DWord): Boolean;
function …Run Code Online (Sandbox Code Playgroud) 我正在使用Delphi 2010,我搜索了互联网并找到了一些例子,但它们都没有用.我使用它可能是因为2010年和unicode?无论如何......
我正在寻找两个例程来对TListView进行简单的保存和加载文件.我只对保存每列中的字符串值感兴趣.即标题和子项.我对保存布局或任何对象不感兴趣.
procedure SaveToFile(const FileName: string);
procedure LoadFromFile(const FileName: string);
Run Code Online (Sandbox Code Playgroud) 我有一个自定义组件,包含以下事件
private
{ Private declarations }
...
fOnImageClick: TNotifyEvent;
fOnImageMouseUp: TMouseEvent;
fOnImageMouseDown: TMouseEvent;
fOnImageMouseMove: TMouseMoveEvent;
fOnImageMouseEnter: TNotifyEvent;
fOnImageMouseLeave: TNotifyEvent;
fOnImageSelect: TNotifyEvent;
fOnImageDblClick: TNotifyEvent;
protected
...
public
{ Public declarations }
...
published
...
property OnImageClick: TNotifyEvent read fOnImageClick write fOnImageClick;
property OnImageSelect: TNotifyEvent read fOnImageSelect write fOnImageSelect;
property OnImageDblClick: TNotifyEvent read fOnImageDblClick write fOnImageDblClick;
property OnImageMouseDown: TMouseEvent read fOnImageMouseDown write fOnImageMouseDown;
property OnImageMouseUp: TMouseEvent read fOnImageMouseUp write fOnImageMouseUp;
property OnImageMouseMove: TMouseMoveEvent read fOnImageMouseMove write fOnImageMouseMove;
property OnImageMouseLeave: TNotifyEvent read fOnImageMouseLeave …Run Code Online (Sandbox Code Playgroud) 是否可以使用名称/值对中的名称在TStringList上使用customSort
我当前正在使用TStringList对每个pos中的一个值进行排序.我现在需要使用此值添加其他数据,因此我现在使用TStringList作为名称/值
我目前的CompareSort是:
function StrCmpLogicalW(sz1, sz2: PWideChar): Integer; stdcall;
external 'shlwapi.dll' name 'StrCmpLogicalW';
function MyCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result := StrCmpLogicalW(PWideChar(List[Index1]), PWideChar(List[Index2]));
end;
Usage:
StringList.CustomSort(MyCompare);
Run Code Online (Sandbox Code Playgroud)
有没有办法修改它,以便它根据名称值对的名称进行排序?
或者,还有另一种方式吗?