callback

From Lazarus wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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 );