我想使用线程创建备份文件,并且过程的进度将用TProgressBar
和TLabel
表示,该动态将被动态创建为TStatusBar
之一面板。德尔福:将StatusBar.OnDrawPanel事件分配给线程
backup_thread:= Tbackup_thread.Create(True);
backup_thread.status_bar:= status_bar;
backup_thread.status_bar_OnDrawPanel:= status_bar.OnDrawPanel; //is it correct?
backup_thread.dir:= backup_dir;
backup_thread.OnTerminate:= backup_thread_OnTerminate;
backup_thread.Start;
主题是这样的:
Tbackup_thread = class(TThread)
private
Fstatus_bar: TStatusBar;
Fprogress_bar: TProgressBar;
Flabel_status: TLabel;
Fdir: String;
Fprogress_bar_position: Word;
Flabel_status_caption: String;
procedure do_update_progress_bar_position;
procedure do_update_label_status_caption;
procedure set_object_progress_bar(const progress_bar: TProgressBar);
procedure execute_backup;
procedure Get_status_bar_OnDrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect); //is it correct?
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy; override;
property status_bar: TStatusBar write Fstatus_bar;
property status_bar_OnDrawPanel: TDrawPanelEvent read Get_status_bar_OnDrawPanel; //I get the error here...
property dir: String write Fdir;
end;
Get_status_bar_OnDrawPanel
看起来是这样的:
procedure Tbackup_thread.Get_status_bar_OnDrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect);
begin
if Panel = Fstatus_bar.Panels[1] then
begin
with Fprogress_bar do begin
Top := Rect.Top;
Left := Rect.Left;
Width := 60;
Height := Rect.Bottom - Rect.Top;
end;
with Flabel_status do begin
Top := Rect.Top;
Left := Rect.Left + 105;
Width := 150;
Height := Rect.Bottom - Rect.Top;
end;
end;
end;
我的问题是如何从内螺纹的情况下OnDrawPanel
分配。 如果我从线程内部动态创建progress_bar
和label_status
并使它们在status_bar上可见,可以吗?我相信它会工作...
作品!谢谢雷米的解决方案和您的时间! – REALSOFO