Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.31;
Скачать: CL | DM;

Вниз

помогите с алгоритмом   Найти похожие ветки 

 
brother ©   (2008-07-23 05:55) [0]

Всем доброго времени суток!
Чет, не могу сообразить как лучше сделать:
имеем не форматированый текст:
csrss.exe
часть пользовательской Win32 подсистемы. SRSS - сокращение от "client/server run-time subsystem" (клиент/серверная подсистема). csrss отвечает за консольные приложения, создание/удаление потоков и за 16-битную виртуальную среду MS-DOS

необходимо его отформатировать по 53 символа на строку, и если последнее слово не влезл, то оно не обрезается а переносится на следующую строку, если строка начинается с пробела соответственно его убираем.
получить нужно примерно вот:
csrss.exe
часть пользовательской Win32 подсистемы. SRSS -
сокращение от "client/server run-time subsystem"
(клиент/серверная подсистема). csrss отвечает за
консольные приложения, создание/удаление потоков и за
16-битную виртуальную среду MS-DOS

мои мысли по этому поводу:
1. убираю все непечатные символы (текст может быть скопипастен)
2. смещаемся на 53 символ, смотрим, что там (пробел или что)
  если пробел, то вставляем #13+#10
  eсли не пробел, то отходим влево до пробела (???) убираем его, и вставляем #13+#10
3. посторяем п.2 до победного...

Хотелось бы услышать мысли мастеров...
зы текст находится в memo


 
Vlad Oshin ©   (2008-07-23 09:57) [1]

все большая строка
replacestring(все большая строка, пробел, ничего, все вхождения);
тупо через Х символов ставим перевод


 
brother ©   (2008-07-23 10:15) [2]

> тупо через Х символов ставим перевод

нет, тк слова разрывать нельзя.(


 
Anatoly Podgoretsky ©   (2008-07-23 10:39) [3]


> зы текст находится в memo

Первое что делаем, это переносим текст в переменную строкового типа.
Второе, очищаем мемо, и туда копируем, через метод ADD строка за строкой, применяя к каждой строке функцию TRIM.


 
Игорь Шевченко ©   (2008-07-23 11:08) [4]

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TfMain = class(TForm)
   SrcMemo: TMemo;
   DestMemo: TMemo;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   function WrapText (const S: string): string;
 end;

var
 fMain: TfMain;

implementation

{$R *.dfm}

procedure StrBreakApart(const S, Delimeter: string; Parts: TStrings);
var
 curPos: Integer;
 curStr: string;
begin
 Parts.Clear;
 if Length(S) = 0 then
   Exit;
 Parts.BeginUpdate;
 try
   CurStr:= S;
   repeat
     CurPos:= AnsiPos(Delimeter, CurStr);
     if CurPos > 0 then begin
       Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
       CurStr:= Copy(CurStr, CurPos+Length(Delimeter),
         Length(CurStr)-CurPos-Length(Delimeter)+1);
     end else
       Parts.Add(CurStr);
   until CurPos=0;
 finally
   Parts.EndUpdate;
 end;
end;

procedure TfMain.Button1Click(Sender: TObject);
begin
 DestMemo.Lines.Text := WrapText (SrcMemo.Lines.Text);
end;

function TfMain.WrapText(const S: string): string;
const
 PartLimit = 50;
var
 List: TStrings;
 I, PartLen: Integer;
begin
 List := TStringList.Create;
 try
   StrBreakApart (S, " ", List);
   PartLen := 0;
   for I:=0 to Pred(List.Count) do begin
     if Length(List[I]) + PartLen + 1 > PartLimit then begin
       Result := Result + #13;
       PartLen := 0;
     end;
     if PartLen <> 0 then begin
       Result := Result + " ";
       Inc(PartLen);
     end;
     Result := Result + List[I];
     Inc(PartLen, Length(List[I]));
   end;
 finally
   List.Free;
 end;
end;

end.


 
brother ©   (2008-07-23 11:29) [5]

по [4] спасибо, но получаю после выполнения:
csrss.exe
часть пользовательской Win32 подсистемы.
SRSS - сокращение от "client/server run-time
subsystem" (клиент/серверная подсистема). csrss
отвечает за консольные приложения, создание/удаление
потоков и за 16-битную виртуальную среду MS-DOS

что не соответствует:
csrss.exe
часть пользовательской Win32 подсистемы. SRSS -
сокращение от "client/server run-time subsystem"
(клиент/серверная подсистема). csrss отвечает за
консольные приложения, создание/удаление потоков и за
16-битную виртуальную среду MS-DOS

навоял следующее:
procedure TForm1.N21Click(Sender: TObject);
const
   NPCS:set of char = [ #0..#8, #11, #12, #14..#31, #127];
var pos:longword;
   n, n_tmp:longword;
   buf:string;

begin
  if length(editor.Text)<=53 then
  begin
    showmessage("Текст слишком короткий!");
    exit;
  end;

  buf:=editor.Text;
// Убрать из текста непечатные символы
  n:=1;
  while n<Length(buf) do
  begin
     if buf[n] in NPCS  then Delete(buf, n, 1)
                        else Inc(n);
  end;

// пререформатируем текст

  n:=_seek(1, buf);
  repeat
     // является ли этот символ пробелом?
     if buf[n]=#32 then
     begin
       // да (удаляем пробел вставляем перевод строки)
       delete(buf,n,1);
       insert(#13+#10, buf, n);
       inc(n); // тк вставили 2 символа а удалили 1
     end           else
     begin
       // нет (идем назад до пробела далее как да)
       n_tmp:=n;  // сохраняем текущую позицию
       repeat
          dec(n);
       until (n<=53) or (buf[n]=#32) or (buf[n]=#10);

       if buf[n]=#32 then
       begin
         delete(buf,n,1);
         insert(#13+#10, buf, n);
       end;

       n:=n_tmp+1; // восстанавливаем позицию
     end;
     n:=_seek(n, buf);
  until (n>=length(buf)) or (n<=0);

  editor.Text:=buf;
end;

где можно оптимизировать?
по [3] trim не спасет, тк как я понимаю надо удалять не только пробелы спереди и сзади...


 
brother ©   (2008-07-23 11:32) [6]

зы
function _seek(from:longword; sourse:tcaption):longword;
var _pos:longword;
   count:byte;
begin
 _pos:=from;
 count:=53;
 repeat
   dec(count);
   inc(_pos);
   if sourse[_pos]=#13 then
   begin
     count:=53;
     inc(_pos);
   end;
 until (count=1) or (_pos>=length(sourse));
 if _pos>length(sourse) then _pos:=length(sourse);
 result:=_pos;
end;


 
Игорь Шевченко ©   (2008-07-23 11:55) [7]

brother ©   (23.07.08 11:29) [5]


> по [4] спасибо, но получаю после выполнения:
> csrss.exe
> часть пользовательской Win32 подсистемы.
> SRSS - сокращение от "client/server run-time
> subsystem" (клиент/серверная подсистема). csrss
> отвечает за консольные приложения, создание/удаление
> потоков и за 16-битную виртуальную среду MS-DOS
>
> что не соответствует:
> csrss.exe
> часть пользовательской Win32 подсистемы. SRSS -
> сокращение от "client/server run-time subsystem"
> (клиент/серверная подсистема). csrss отвечает за
> консольные приложения, создание/удаление потоков и за
> 16-битную виртуальную среду MS-DOS


Ну ты же умный, разберешься...


 
brother ©   (2008-07-23 12:26) [8]

> Ну ты же умный, разберешься...

Спасибо и на этом)



Страницы: 1 вся ветка

Текущий архив: 2008.08.31;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
3-1204731053
nstur
2008-03-05 18:30
2008.08.31
Как в ADO открыть запароленную БД Access


2-1216804336
Step
2008-07-23 13:12
2008.08.31
Файлы


15-1215799808
Поросенок Винни-Пух
2008-07-11 22:10
2008.08.31
Непонятно с Дефо


11-1192972730
Dodfr
2007-10-21 17:18
2008.08.31
Cant update correctly KOLAdd from 2.81 to 2.82


15-1215611026
ProgRAMmer Dimonych
2008-07-09 17:43
2008.08.31
Как перегнать DVD на CD?