Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.04 c
2-1184585094
Вадим71
2007-07-16 15:24
2007.08.12
числа с плавающей точкой в DBGrid


8-1162985232
OlDirtyBastard
2006-11-08 14:27
2007.08.12
Label над точками в TChart


3-1177453476
TTable
2007-04-25 02:24
2007.08.12
Как получить указатель на строку в Table1.Fields[2].AsString ?


15-1184343999
tesseract
2007-07-13 20:26
2007.08.12
Питер буду часов в 8 утра.


2-1184435002
Sonic90
2007-07-14 21:43
2007.08.12
Кнопка формы на панели задач





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский