- Код: Выделить всё
- 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)));Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1