- Код: Выделить всё
ShowMessage('one' + #9 + 'two');
Модератор: Модераторы
ShowMessage('one' + #9 + 'two');
{$mode objfpc} {$h+} {$codepage utf8}
const
Tab = #9;
function ReplaceTabs(const s: utf8string; tabWidth: SizeUint): utf8string;
var
pass: boolean;
sp, se, rp, sLitStart: pChar;
curWidth, nSpaces: SizeUint;
cpLen: SizeInt;
begin
result := '';
for pass in boolean do
begin
sp := pChar(pointer(s)); se := sp + length(s); sLitStart := sp; rp := pChar(pointer(result));
curWidth := 0;
while sp < se do
case sp^ of
#13, #10:
begin
sp += 1;
rp += 1;
curWidth := 0;
end;
#9:
begin
nSpaces := tabWidth - curWidth mod tabWidth;
if pass then
begin
Move(sLitStart^, (rp - (sp - sLitStart))^, (sp - sLitStart) * sizeof(char));
FillChar(rp^, nSpaces, ' ');
end;
sp += 1;
sLitStart := sp;
rp += nSpaces;
curWidth += nSpaces;
end;
else
begin
cpLen := UTF8CodepointLen(sp, se - sp, true);
if cpLen <= 0 then begin sLitStart := sp; break; end;
sp += cpLen;
rp += cpLen;
curWidth += 1;
end;
end;
if pass then Move(sLitStart^, (rp - (sp - sLitStart))^, (sp - sLitStart) * sizeof(char));
if not pass then
if sLitStart = pChar(pointer(s)) then exit(s) else SetLength(result, rp - pChar(pointer(result)));
end;
end;
begin
writeln(ReplaceTabs('Hello' + Tab + 'World' + LineEnding + 'Привет,' + Tab + 'мир.', 9));
end.
runewalsh писал(а):тупо игнорирует табы, только что сам проверил. Скорее всего, с этим ничего нельзя сделать, смирись и/или заменяй на пробелы руками.
Seenkao писал(а):{$mode delphi} - поможет?
runewalsh писал(а):Dialogs.ShowMessage работает через WinAPI TaskDialog (а не ShowMessageW)
artem78 писал(а):А в Delphi 7 используется ShowMessage, как я догадываюсь?
runewalsh писал(а):смирись и/или заменяй на пробелы руками.
Vadim писал(а):В Linux работает.
А не пробовали вместо "#9" ставить "Char(9)"? Или ещё идея: преобразовать Вашу строку к PChar()...
procedure TForm1.Button1Click(Sender: TObject);
var
s5: ansistring;
q2,e2: longint;
begin
s5:=char(9);
writeln('___ ',length(s5));
for e2:=1 to length(s5) do begin val(s5[e2],q2); write(q2,#13#10) end;
ShowMessage('one' + char(9) + 'two');
end;
$ ./project1
___ 1
0
ShowMessage('one' + #32#32#32#32 + 'two');
Procedure myShowMessage(S:String);
begin
StringReplace(S,#9,#32#32#32#32,[rfReplaceAll]);
ShowMessage(S);
end;
Vadim писал(а):В Linux работает.
runewalsh писал(а):И что это значит? Ты вообще понимаешь, что делает val(s, q)? Ты пытаешься преобразовать символ табуляции (s) в число (q). Это преобразование проваливается, потому что строка из одной табуляции не содержит корректного числа,
writeln(byte(char(9)));
Сейчас этот форум просматривают: Yandex [Bot] и гости: 3