Текущий архив: 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