Текущий архив: 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.5 MB
Время: 0.063 c