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

Вниз

Удаление пробелов в TMemo.   Найти похожие ветки 

 
..::KraN::..   (2007-11-08 18:26) [0]

Подскажите, как удалить лишние пробелы между словами в TMemo????


 
Shirson_   (2007-11-08 18:35) [1]

uses StrUtils;
...
var s:string;
begin
 while s<>memo1.Lines.Text do
   begin
     s:=memo1.Lines.Text;
     memo1.Lines.Text:=stringreplace(s,"  "," ",[rfReplaceAll]);
   end;
end;


 
Palladin ©   (2007-11-08 18:44) [2]


> Shirson_   (08.11.07 18:35) [1]

нюню

Function RmDblSpc(Const s:String):String;
Var
c,i:Integer;
Begin
If s="" Then Result:="" Else
 Begin
  Result:=s[1];
  c:=1;
  For i:=2 to Length(s) Do
   If Not ((s[i]=" ") and (Result[c]=" ")) Then
    Begin
     Result:=Result+s[i];
     Inc(c);
    End;
 End;
End;


 
..::KraN::..   (2007-11-08 20:08) [3]


> [1]
</I
> [2]

>
Двойные пробелы удалить легко :), а как быть, если их размер неизвестен???


 
Shirson_   (2007-11-08 20:17) [4]

A если подумать?
A если, хотя-бы из интереса запустить?
A потом поразмыслить, почему оно работает хоть с сотней пробелов.
:)


 
Palladin ©   (2007-11-08 20:17) [5]

для особо одаренных. и первый и второй вариант решения удаляют цепочку пробелов... только первый стократ медленней...


 
Amoeba ©   (2007-11-08 20:26) [6]

Вот процедура и ф-ия из библиотеки QStrings:

{ Q_SpaceCompressInPlace удаляет из строки начальные и конечные пробелы и
 управляющие символы (меньше пробела). Кроме того, все подряд идущие пробелы
 и управляющие символы в середине строки заменяются одним пробелом. Исходная
 строка изменяется. }

procedure Q_SpaceCompressInPlace(var S: string);

{ Q_SpaceCompress удаляет из строки начальные и конечные пробелы и управляющие
 символы (меньше пробела). Кроме того, все подряд идущие пробелы и управляющие
 символы в середине строки заменяются одним пробелом. Исходная строка при этом
 не изменяется. Эта функция работает медленнее, чем Q_SpaceCompressInPlace. }


procedure Q_SpaceCompressInPlace(var S: string);
asm
       PUSH    EBX
       PUSH    EAX
       CALL    UniqueString
       TEST    EAX,EAX
       JE      @@qt
       MOV     ECX,[EAX-4]
       MOV     EBX,EAX
       DEC     ECX
       JS      @@qt
       MOV     EDX,EAX
@@lp0:  CMP     BYTE PTR [EAX+ECX],$20
       JA      @@lp1
       DEC     ECX
       JNS     @@lp0
       JMP     @@nx4
@@lp1:  CMP     BYTE PTR [EBX],$20
       JA      @@lp3
       INC     EBX
       DEC     ECX
       JMP     @@lp1
@@lp3:  MOV     AL,BYTE PTR [EBX]
       INC     EBX
       CMP     AL,$20
       JBE     @@me
@@nx3:  MOV     BYTE PTR [EDX],AL
       INC     EDX
       DEC     ECX
       JNS     @@lp3
@@nx4:  POP     EAX
       MOV     EBX,[EAX]
       MOV     BYTE PTR [EDX],0
       SUB     EDX,EBX
       MOV     [EBX-4],EDX
       POP     EBX
       RET
@@me:   MOV     BYTE PTR [EDX],$20
       INC     EDX
       DEC     ECX
       JS      @@nx4
@@ml:   MOV     AL,BYTE PTR [EBX]
       INC     EBX
       CMP     AL,$20
       JA      @@nx3
       DEC     ECX
       JNS     @@ml
       JMP     @@nx4
@@qt:   POP     ECX
       POP     EBX
end;

function Q_SpaceCompress(const S: string): string;
asm
       PUSH    ESI
       MOV     ESI,EDX
       TEST    EAX,EAX
       JE      @@qt
       MOV     ECX,[EAX-4]
       TEST    ECX,ECX
       JE      @@qt
       PUSH    EBX
       MOV     EBX,EAX
       XOR     EDX,EDX
       MOV     EAX,ESI
       CALL    System.@LStrFromPCharLen
       MOV     ECX,[EBX-4]
       MOV     EDX,[ESI]
@@lp1:  CMP     BYTE PTR [EBX],$20
       JA      @@ex1
       INC     EBX
       DEC     ECX
       JNE     @@lp1
       JMP     @@wq
@@ex1:  DEC     ECX
@@lp2:  CMP     BYTE PTR [EBX+ECX],$20
       JA      @@lp3
       DEC     ECX
       JMP     @@lp2
@@lp3:  MOV     AL,BYTE PTR [EBX]
       INC     EBX
       CMP     AL,$20
       JBE     @@me
@@nx:   MOV     BYTE PTR [EDX],AL
       INC     EDX
       DEC     ECX
       JNS     @@lp3
@@wq:   MOV     EAX,[ESI]
       MOV     BYTE PTR [EDX],0
       SUB     EDX,EAX
       MOV     [EAX-4],EDX
       POP     EBX
       POP     ESI
       RET
@@me:   MOV     BYTE PTR [EDX],$20
       INC     EDX
       DEC     ECX
       JS      @@wq
@@ml:   MOV     AL,BYTE PTR [EBX]
       INC     EBX
       CMP     AL,$20
       JA      @@nx
       DEC     ECX
       JNS     @@ml
       JMP     @@wq
@@qt:   MOV     EAX,ESI
       CALL    System.@LStrClr
       POP     ESI
end;


 
Loginov Dmitry ©   (2007-11-08 20:26) [7]

{:Удаляет повторяющиеся символы.
Удаляет из строки S повторяющиеся символы Chars, оставляя один из них и
заменяя его на символ ReplaceChar. Если символы из множества Chars находятся
в начале или в конце строки, то они полностью обрезаются.
Функция оптимизирована для быстрой обработки длинных строк}
function DeleteRepeatingSymbols(const S: string; Chars: TSetOfChars; ReplaceChar: Char): string;
var
 I, Counter: Integer;
begin
 SetLength(Result, Length(S));
 Counter := 0;

 for I := 1 to Length(S) do
 begin
   if not (S[I] in Chars) then
   begin
     Inc(Counter);
     Result[Counter] := S[I];
   end else
   if Counter > 0 then
   begin
     if Result[Counter] <> ReplaceChar then
     begin
       Inc(Counter);
       Result[Counter] := ReplaceChar;
     end;
   end;
 end;
 if (Counter > 0) and (Result[Counter] = ReplaceChar) then
   Dec(Counter);

 SetLength(Result, Counter);
end;


 
..::KraN::..   (2007-11-09 14:13) [8]

Хорошо, а как в TMemo удалить текст, заключённый между, например (* и *)???


 
Palladin ©   (2007-11-09 14:18) [9]

давай уже сам думать начинай


 
..::KraN::..   (2007-11-09 14:34) [10]

Если бы я мог это сделать я бы и не спрашивал у вас.


 
Anatoly Podgoretsky ©   (2007-11-09 14:39) [11]

> ..::KraN::..  (09.11.2007 14:34:10)  [10]

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


 
..::KraN::..   (2007-11-09 14:49) [12]

Ну ладно, может вы и правы.
Ещё вопрос: имеется компонент TSynedit. Я написал такой код (для удаления пустых строк):
 
If chDeleteNullStrings.checked then
   For i:=0 to Form1.SynEdit1.Lines.Count-1 do
      If Form1.synedit1.lines.strings[i]="" then
       Form1.SynEdit1.Lines.delete(i);

Этот код удаляет все строки до последней, потом на ней даёт ошибку(Что-то вроде assertion failure) и компонент начинает глючить.


 
..::KraN::..   (2007-11-09 14:52) [13]

Ну ладно, может вы и правы.
Ещё вопрос: имеется компонент TSynedit. Я написал такой код (для удаления пустых строк):
 
If chDeleteNullStrings.checked then
   For i:=0 to Form1.SynEdit1.Lines.Count-1 do
      If Form1.synedit1.lines.strings[i]="" then
       Form1.SynEdit1.Lines.delete(i);

Этот код удаляет все строки до последней, потом на ней даёт ошибку(Что-то вроде assertion failure) и компонент начинает глючить.


 
Reindeer Moss Eater ©   (2007-11-09 15:11) [14]

удалять надо задом наперед


 
..::KraN::..   (2007-11-09 15:18) [15]


> удалять надо задом наперед

Не объяснишь почему???


 
Anatoly Podgoretsky ©   (2007-11-09 15:21) [16]

> ..::KraN::..  (09.11.2007 14:49:12)  [12]

Обычно он выдает ошибку значительно раньше, но это опять из-за отсутствия головы, не пробовал это выполнить на бумажке, для двух трех записей? Задачка для начальной школы.


 
Anatoly Podgoretsky ©   (2007-11-09 15:22) [17]

> Reindeer Moss Eater  (09.11.2007 15:11:14)  [14]

Я тут сегодня просил повернуться, так сказали какая разница. Сошлись на мнение, что тут бронетрусы нужны.


 
Ega23 ©   (2007-11-09 15:31) [18]


If chDeleteNullStrings.checked then
 with Form1.SynEdit1 do
 begin
   for i:=Lines.Count-1 downto 0  do
     if Lines.Strings[i]="" then
        Lines.Delete(i);
 end;


 
clickmaker ©   (2007-11-09 16:06) [19]


> [15] ..::KraN::..   (09.11.07 15:18)
>
> > удалять надо задом наперед
>
> Не объяснишь почему???

вот представь, что есть ячеистая байда, в которой лежат мячики для тенниса, скажем. Ты начинаешь слева направо их оттуда убирать, перекладывая оставшиеся в освободившиеся ячейки. Ну так, чтоб подряд лежали.
Что будет, когда ты дойдешь до первой пустой ячейки. Упс! Нету мячика.
Вот так и со списком


 
Anatoly Podgoretsky ©   (2007-11-09 16:10) [20]

> ..::KraN::..  (09.11.2007 15:18:15)  [15]

А ты проверил на бумаге? Если нет, то какой смысл объяснять.



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

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

Наверх




Память: 0.53 MB
Время: 0.025 c
2-1194335656
lobach
2007-11-06 10:54
2007.12.02
Explorer.exe - как его завершить???


3-1184569294
darst
2007-07-16 11:01
2007.12.02
Delphi + PHP


1-1189509251
Андрей Пл
2007-09-11 15:14
2007.12.02
как в TDBGrid сделать колонку в виде CheckBox


15-1193772970
korneley
2007-10-30 22:36
2007.12.02
Фича/глюк/(не)задокументированная возможность ?


15-1193818424
ocean
2007-10-31 11:13
2007.12.02
EMail-дизайн