Ein Pointer kostet vier Byte, demnach kostet dich MyLine auch nur vier Byte. Und der Grund, warum du SetLength nicht anwenden kannst: du hast keinen Speicher für das Array reserviert, das müsstest du erst mit New(MyLine) tun. Dann würde aber der Zugriff auf ScanLine nicht mehr richtig funktionieren. In solchen Fällen benutzt man aber meist keine Arrays, sondern typisierte Pointer:
Delphi-Quellcode:
function MergeTextToBitmap(aBitmap: TBitmap; aString: String): TBitmap;
var
iHeight,
iWidth,
iBitCount: Integer;
MyLine: ^TRGBTriple;
begin
iBitCount:= 0;
aString:= IntToStr(Length(aString)) + '/' + aString;
aBitmap.PixelFormat:= pf24Bit;
for iHeight:= 0 to aBitmap.Height - 1 do
begin
MyLine:= aBitmap.ScanLine[iHeight];
for iWidth:= 0 to aBitmap.Width - 1 do
begin
if not ((iBitCount + 1) > (Length(aString) * 8)) then
MyLine^.rgbtRed:= (MyLine^.rgbtRed and $FE)
or ((Ord(aString[(iBitCount div 8) + 1])
shr (iBitCount mod 8)) and $01);
Inc(iBitCount);
Inc(MyLine);
end;
end;
Result:= aBitmap;
end;