If you need something to do before build or after build in Project->Options go on Build events.

In my case I needed to compile resource file to add one exeso for sure is always there (mostly because of CVS and other developers).

Syntax is something like this:

call "res\pdftotext.bat"
if %errorlevel% neq 0 exit %errorlevel%

Correct usage of GetLastError and FormatMessage in Delphi.
ShowMessage(SysErrorMessage(GetLastError))) 
Taken from here.

How to check if acrobat reader exist?

 

ShLwApi,   
Windows;

var
Size: dword;
Data: array[0..MAX_PATH] of char;
begin
size := max_path;
if not (Succeeded(AssocQueryString(0,
ASSOCSTR_FRIENDLYDOCNAME,
PChar('.pdf'), nil, @Data, @Size)) and (Size>0)) then
begin
ShowMessage('Not installed.');
end;
end

You can import PDF dokument in Delphi as ActiveX control as it is described here.

To copy data from PDF, you can use this code:

procedure CopyPDF2Clpbrd;
begin
  ocxPdf.SetFocus;
  Application.ProcessMessages;
  Sleep(1000);

  PostKeyEx32(Ord('A') , [ssCtrl], False) ;
Application.ProcessMessages;

  Sleep(1000);

  PostKeyEx32(Ord('C') , [ssCtrl], False) ;
  Application.ProcessMessages;
  Sleep(1000);
end;

procedure PostKeyEx32(key: Word; const shift: TShiftState;
specialkey: Boolean) ;
{
Parameters :
* key : virtual keycode of the key to send.
For printable keys this is simply the ANSI code (Ord(character)) .
* shift : state of the modifier keys.
This is a set, so you can set several of these keys
(shift, control, alt, mouse buttons) in tandem.
The TShiftState type is declared in the Classes Unit.
* specialkey: normally this should be False.
Set it to True to specify a key on the numeric keypad, for example.

Description:
Uses keybd_event to manufacture a series of key
events matching the passed parameters.
The events go to the control with focus.
Note that for characters key is always the upper-case
version of the character.
Sending without any modifier keys
will result in a lower-case character,
sending it with [ ssShift ] will result in an upper-case character!
}
type
TShiftKeyInfo = record
shift: Byte ;
vkey: Byte ;
end;
ByteSet = set of 0..7 ;
const
shiftkeys: array [1..3] of TShiftKeyInfo =
((shift: Ord(ssCtrl) ; vkey: VK_CONTROL),
(shift: Ord(ssShift) ; vkey: VK_SHIFT),
(shift: Ord(ssAlt) ; vkey: VK_MENU)) ;
var
flag: DWORD;
bShift: ByteSet absolute shift;
j: Integer;
begin
for j := 1 to 3 do
begin
if shiftkeys[j].shift in bShift then
keybd_event(shiftkeys[j].vkey,
MapVirtualKey(shiftkeys[j].vkey, 0), 0, 0) ;
end;
if specialkey then
flag := KEYEVENTF_EXTENDEDKEY
else
flag := 0;

keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;
flag := flag or KEYEVENTF_KEYUP;
keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;

for j := 3 downto 1 do
begin
if shiftkeys[j].shift in bShift then
keybd_event(shiftkeys[j].vkey,
MapVirtualKey(shiftkeys[j].vkey, 0), KEYEVENTF_KEYUP, 0) ;
end;
end;

 


Where PostKeyEx32 procedure is taken from here.

How to parse delimited text?

Easy:

var
  sl: TStringList;
begin
   try
     sl := TStringList.Create;
     sl.StrictDelimiter := True;
     sl.Delimiter := '';<br />     sl.DelimitedText := 'ARR35YXCAPE FALSTER0913SIKOPTMKoper2009-02-28 01.00.00E2MSL3';<br />     ShowMessage(sl.Text);<br />   finally<br />     FreeAndNil(sl);<br />   end;<br />end;</p>'