Here's my versions:

Makes check for rectangle first and turn it around if needed... reading above solutions this may not be fastest :s

// Switches 2 any variables
procedure SwitchVar(p1,p2: Pointer; Size: Integer);
var temp: pointer;
begin
getmem(temp,size);
try
movememory(temp,p1,Size);
movememory(p1,p2,Size);
movememory(p2,temp,Size);
finally
freemem(temp);
end;
end;

function PointInRect2(p: TPoint; r: TRect): boolean;
begin
if r.Left>r.Right then switchvar(@r.left,@r.right,4);
if r.Top>r.Bottom then switchvar(@r.top,@r.bottom,4);
result:=(p.x>=r.Left) and (p.x<=r.Right) and
(p.y>=r.Top) and (p.y<=r.Bottom);
end;


I found this function in other language who knows where.. anyway i just tested every possible situation with it to success. Only exception for fail is if rectangles are not made normally; top left to bottom right.

function RectCollide(x0,y0,x1,y1,x2,y2,x3,y3: single): boolean;
begin
result:=not( ((x0<x2) and (x1<x2)) or
((x0>x3) and (x1>x3)) or
((y0<y2) and (y1<y2)) or
((y0>y3) and (y1>y3)) );
end;

Edit: Had to remove all BBCode etc. because they removed parts of code...