The problem you have is that the "outline" images you draw have smaller elements than 3 pixels you shift them.
This should be enough for 1 pixel outline.
Canvas.TextRect(textarea, 20 - 1, Self.Height - 80 - 1, mytext, mytextstyle);
Canvas.TextRect(textarea, 20 + 1, Self.Height - 80 + 1, mytext, mytextstyle);
Canvas.TextRect(textarea, 20 + 1, Self.Height - 80 - 1, mytext, mytextstyle);
Canvas.TextRect(textarea, 20 - 1, Self.Height - 80 + 1, mytext, mytextstyle);
If you need a larger outline, but you may do it by
for i := -5 to 5 do
for j := -5 to 5 do
begin
Canvas.TextRect(textarea, 20 - i, Self.Height - 80 - j, mytext, mytextstyle);
Canvas.TextRect(textarea, 20 + i, Self.Height - 80 + j, mytext, mytextstyle);
Canvas.TextRect(textarea, 20 + i, Self.Height - 80 - j, mytext, mytextstyle);
Canvas.TextRect(textarea, 20 - i, Self.Height - 80 + j, mytext, mytextstyle);
end;
This is extremely inefficient, but will get you to the place you want simple and dirty
If you want to make it "Better" then you might want to look into gauss blur, make an clear image with gauss blur of several pixels, process it and then copyrect it into your main canvas. It'll be much more efficient and beautiful, but will require you to carefully work pixel-by-pixel.
you won't get it by simply repeat the writing
I always do outline and shadow by repeat writing, because I'm lazy to make complex calculations