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

Вниз

Как разбить длинную сроку на короткие по заданной длине строки?   Найти похожие ветки 

 
Dr. Andrew   (2007-07-18 02:56) [0]

Удалено модератором
Примечание: СПАМ


 
Германн ©   (2007-07-18 03:01) [1]


> Dr. Andrew   (18.07.07 02:56)

А чем WordWrap не устраивает?
Или вставка #13#10 в строку?


 
Dr. Andrew   (2007-07-18 03:20) [2]

Спасибо за внимание. Пожалуйста, внимательно обратите внимание на описание проблемы. Мне необходимо программно разбить строку на подстроки не более заданной длины, а использование разных типов вставки, как например #13#10, мне не нужно! Спасибо, есть еще решения на эту проблему? Спасибо Всем.


 
Riply ©   (2007-07-18 03:23) [3]

Плохо понимаю что нужно :(
Из строки создать массив строк ?
Покажи как делаешь и что не получается.


 
Германн ©   (2007-07-18 03:28) [4]


> Dr. Andrew   (18.07.07 03:20) [2]
>
> Спасибо за внимание. Пожалуйста, внимательно обратите внимание
> на описание проблемы.

Обратил внимание. И внимательно.  Но волшебных палочек у меня на складе не осталось. Ученики школы Хогвардс все разобрали:)


 
Dr. Andrew   (2007-07-18 03:28) [5]

Вот что у меня, но функция режет отдельные слова и вставляет пустые строки в StringList:
procedure WordWrapW(WStrings : TWideStringList; const TextW, Delim: WideString;
MaxLen: Integer);
     var IsDelim : array[WideChar] of Boolean;
         OldlLine, NewLine, CurPos : Integer;
         WChr : WideChar;
begin;
 FillChar(IsDelim, SizeOf(IsDelim), False);
 WChr := #0;
 isdelim[WChr] := True;

 for CurPos := 1  to Length(IsDelim) do
   IsDelim[Delim[CurPos]] := True;

 OldlLine := 1;
 NewLine := 1;
 CurPos := 1;

 if Length(TextW) > 0 then begin;
   while True do begin;
     WChr := TextW[CurPos];
     Inc(CurPos);

     if IsDelim[WChr] then begin;
       NewLine := CurPos;

       if WChr = #0 then
         Break;
     end;

     if CurPos - OldlLine >= MaxLen then begin;
       if NewLine = OldlLine then
         NewLine := CurPos;

       WStrings.Add(WideTrim(Copy(TextW, OldlLine, NewLine - OldlLine)));
       OldlLine := NewLine;
     end;
   end;
   WStrings.Add(WideTrim(Copy(TextW, OldlLine, Pred(NewLine - OldlLine))));
 end;
end;
Нужно откорректировать именно эту функцию. Спасибо!


 
Dr. Andrew   (2007-07-18 03:29) [6]

разделители должны быть только такими " .," И все!


 
Германн ©   (2007-07-18 03:30) [7]


> Riply ©   (18.07.07 03:23) [3]
>
> Плохо понимаю что нужно :(
> Из строки создать массив строк ?
> Покажи как делаешь и что не получается.
>

Да ничего он не делает. Только просит.


 
Dr. Andrew   (2007-07-18 03:32) [8]

Германн Я не понимаю Вашего замечания - я выложил свой код функции и прошу мастеров помочь исправить ошибку! В чем проблема?


 
Германн ©   (2007-07-18 03:38) [9]


> Dr. Andrew   (18.07.07 03:32) [8]
>
> Германн Я не понимаю Вашего замечания - я выложил свой код
> функции и прошу мастеров помочь исправить ошибку! В чем
> проблема?
>

Разница во времени реакции.

Токмо вот вопрос: откуда "содрал" свой "якобы" код в Dr. Andrew   (18.07.07 03:28) [5]?
Был бы он твой, не просил бы его "откорректировать".


 
Dr. Andrew   (2007-07-18 03:47) [10]

Я не могу понять почему вместо профессионального диалога у Вас все время какие-то ко мне претензии. Да, я откорректировал этот код под юникоды, и что же из этого. Может быть Вы и не показали, а мне нравится больше открытость к людям и доверия видимо у меня так же повыше. А как я там его назвал, помоему не имеет никакого значения. все равно этот код Вам не даст Нобелевскую премию. Берите - я лично Вам его дарю. Мастера есть профессионалы с кем можно по дискутировать? Спасибо!


 
Германн ©   (2007-07-18 03:58) [11]


> Dr. Andrew   (18.07.07 03:47) [10]
>
> Я не могу понять почему вместо профессионального диалога
> у Вас все время какие-то ко мне претензии. Да, я откорректировал
> этот код под юникоды, и что же из этого. Может быть Вы и
> не показали, а мне нравится больше открытость к людям и
> доверия видимо у меня так же повыше. А как я там его назвал,
>  помоему не имеет никакого значения. все равно этот код
> Вам не даст Нобелевскую премию. Берите - я лично Вам его
> дарю. Мастера есть профессионалы с кем можно по дискутировать?
>  Спасибо!
>

Для дискута первое - это вопрос дискута. Ты его задал?
Нет. Ты передрал откуда-то некий код, изменил его по собственному незнанию. Он не работает. Теперь ты просишь, чтобы его исправили.
Или требуешь?


 
MetalFan ©   (2007-07-18 09:55) [12]


> var IsDelim : array[WideChar] of Boolean;

ватэто жэсть....


 
Dib@zol ©   (2007-07-18 10:20) [13]

Итак, мастера. Харэ стебацца. Для начинающих ведь конфа, ещё раз повторюсь. Dr. Andrew, твоя проблема имеет решение :)
Вот оно:

function SplitStr(st:string; MaxLen:Word):TStringList;
// ------------------------------------------------------- \\
function DefineHyphen(str:string):string;
var
 t : char;
 n : string;
begin
n:=str;
t:=n[length(n)];
if (t<>" ")and(t<>".")and(t<>",")and(t<>"!")and(t<>"?") then
n:=n+"-";
DefineHyphen:=n;
end;
// ------------------------------------------------------- \\
var
 Spc, i : word;
 s : string;
label _1;
begin
 Result:=TStringList.Create;
 s:=st;

 _1:
 i:=length(s);
 if (i<MaxLen)or(i=0) then begin
   Result.Add(s);
   exit;
 end;

 // Это поиск по пробелам
 {repeat
   i:=pos(" ", s);
   if i<=MaxLen then begin
     Spc:=i;
     Delete(s, i, 1);
     Insert(#1, s, i);
   end;
 until pos(" ", s)>MaxLen;
 repeat
   i:=pos(#1, s);
   Delete(s, i, 1);
   Insert(" ", s, i);
   end;
 until pos(#1, s)=0;}

 // А это просто обрезка по MaxLen
 Spc:=MaxLen;

 Result.Append(DefineHyphen(Copy(s, 1, Spc)));
 Delete(s, 1, Spc);
 goto _1;
end;


 
iXT ©   (2007-07-18 11:11) [14]

> [13] Dib@zol ©   (18.07.07 10:20)

Ой, мама...


 
Плохиш ©   (2007-07-18 11:15) [15]

Я знаю компаненту, тоторая сама это делает :-) ТМемо - это ейное погоняло...


 
Игорь Шевченко ©   (2007-07-18 11:39) [16]

Я так делал:

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;
 Parts.BeginUpdate();
 try
   CurStr:= S;
   repeat
     CurPos:= Pos(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.


Sapienti sat


 
MBo ©   (2007-07-18 12:08) [17]

Если воспользоваться для вывода функцией DrawText, то ничего и делить-то не нужно будет...


 
Игорь Шевченко ©   (2007-07-18 12:24) [18]

MBo ©   (18.07.07 12:08) [17]


> Если воспользоваться для вывода функцией DrawText, то ничего
> и делить-то не нужно будет...


Особенно для вывода в текстовый файл ;)



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

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

Наверх




Память: 0.52 MB
Время: 0.033 c
2-1184491327
>>DEATH<<
2007-07-15 13:22
2007.08.12
сслки из хтмл кода


15-1184546576
|
2007-07-16 04:42
2007.08.12
Свободные ресурсы


3-1177497099
snaks
2007-04-25 14:31
2007.08.12
Объединение ячеек в DBGrid


15-1184602971
pasha_golub
2007-07-16 20:22
2007.08.12
utf8 to cp1251


15-1184569945
PZ
2007-07-16 11:12
2007.08.12
Странное явление