callback

From Free Pascal wiki
Jump to navigationJump to search

Callback functions are in widespread usage in Lazarus; in fact any Event is made available using 'callback'.

 type
  TForm = class(TForm)
    btn: TButton;
    procedure btnClick(Sender: TObject);
  end;
 ...
  procedure TForm.btnClick(Sender: TObject);
  begin
   // dosomething
  end;

The btnClick method is a callback from within the TButton implementation.

Apart from their use in the userinterface of a form, callbacks are used in many libraries that were linked.

Callback from library

DWORD LpprogressRoutine(
  LARGE_INTEGER TotalFileSize,
  LARGE_INTEGER TotalBytesTransferred,
  LARGE_INTEGER StreamSize,
  LARGE_INTEGER StreamBytesTransferred,
  DWORD dwStreamNumber,
  DWORD dwCallbackReason,
  HANDLE hSourceFile,
  HANDLE hDestinationFile,
  LPVOID lpData
)
TMyForm = class( TForm )
  progressbar: TProgressbar;
  bIsAborted: boolean;
  ...
end;

  // the callback function as needed by CopyFileEx
function _CopyCallback( 
  TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: Int64; 
  dwStreamNumber, dwCallbackReason: DWORD;
  hSourceFile, hDestinationFile: THandle; 
  f: TMyForm ): DWORD; stdcall;
var
  newpos: Integer;
const
  PROCESS_CONTINUE = 0;
begin
  result := PROCESS_CONTINUE;
  if dwCallbackReason = CALLBACK_CHUNK_FINISHED then begin
    newpos := Round( TotalBytesTransferred / TotalFileSize * 100 );
    with f.Progressbar do
      if newpos <> Position then
        Position := newpos;
    Application.ProcessMessages();
  end;
end;

...

  // copy 'fromfile' to 'tofile' showing progress in myFor.Progressbar and obey to abort in myForm.bIsAborted
result := CopyFileEx(  'fromfile', 'tofile', @_CopyCallback, pointer(myForm), @myForm.bIsAborted, 0 );