回调函数如何调用,请各位帮忙.(100)

Q

qutwah

Unregistered / Unconfirmed
GUEST, unregistred user!
以下代码是从网上找到的,但我不知如何调用,各位高手能否帮忙.unit UTrdGetJobs;interfaceuses Classes,winspool,Windows,SysUtils;type TCallBack=Procedure(JobRecord:String) of Object; TGetJobs = class(TThread) private protected FPrinterName:String; FCallBack:TCallBack; Function GetJob():String;Virtual;Abstract; procedure Execute; override; Public constructor Create(PrinterName:String;ACallBack:TCallBack); end; TGetJobs9X=Class(TGetJobs) Protected Function GetJob():String;Override; end; TGetJobsNT=Class(TGetJobs) Protected Function GetJob():String;Override; end;implementation{ Important: Methods and properties of objects in VCL or CLX can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TrdGetJobs.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; }{ TrdGetJobs }constructor TGetJobs.Create(PrinterName: String; ACallBack: TCallBack);begin FPrinterName:=PrinterName; FCallBack:=ACallBack; FreeOnTerminate := True; inherited Create(False);end;procedure TGetJobs.Execute;begin while not Terminated do begin FCallBack(GetJob); end;end;{ TGetJobsNT }function TGetJobsNT.GetJob: String;Const InfoLevel = 1; FirstJob = 0; LastJob = 19;Var Jobs: Array[FirstJob..LastJob] Of TJobInfo1; BytesNeeded,NumJobs: Dword; hPrinter:THandle; JobsRecord:String;begin JobsRecord:=''; if OpenPrinter(Pchar(FPrinterName),hPrinter,nil) then begin WaitForPrinterChange(hPrinter,PRINTER_CHANGE_ADD_JOB); If EnumJobs(hPrinter,FirstJob,LastJob+1,InfoLevel,@Jobs,SizeOf(Jobs),BytesNeeded,NumJobs) Then begin if NumJobs<>0 then begin With Jobs[NumJobs-1] Do begin JobsRecord:=JobsRecord+StrPas(pDocument)+#9; JobsRecord:=JobsRecord+StrPas(pPrinterName)+#9; JobsRecord:=JobsRecord+StrPas(pMachineName)+#9; JobsRecord:=JobsRecord+StrPas(pUserName)+#9; JobsRecord:=JobsRecord+IntToStr(TotalPages)+#9; JobsRecord:=JobsRecord+DateTimeToStr(SystemTimeToDateTime(Submitted)+8/24)+#9; end; end; end; ClosePrinter(hPrinter); end; Result:=JobsRecord;end;{ TGetJobs9X } function TGetJobs9X.GetJob: String;begin //end;end.
 
是不是我写的
 
while not Terminated do begin FCallBack(GetJob);//这里不是调用了吗 end;一般还会加上if assigned(FCallBack) then FCallBack(GetJob);//这里不是调用了吗
 
呵呵,老大,真是你写的,太好了!我的意思是,我想单击某个按钮之后,就调用你的这个线程,可这个线程的create的参数我要如何写呢?
 
constructor Create(PrinterName:String;ACallBack:TCallBack);你在线程创建时传入就行
 
我不明白的是,如何定义ACallBack:TCallBack.希望你能指点一下.
 
Procedure Callback(JobRecord:String);
 
接受答案了.
 
顶部