Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление пробелов в TMemo. [D2005, XP]


..::KraN::.. ©   (2007-11-08 18:26:00) 

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


Anatoly Podgoretsky   (2007-11-09 16:10:00) [1]

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

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


clickmaker   (2007-11-09 16:06:00) [2]


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

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


Ega23   (2007-11-09 15:31:00) [3]


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;


Anatoly Podgoretsky   (2007-11-09 15:22:00) [4]

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

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


Anatoly Podgoretsky   (2007-11-09 15:21:00) [5]

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

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


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


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

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


Reindeer Moss Eater   (2007-11-09 15:11:00) [7]

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


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

Ну ладно, может вы и правы.
Ещё вопрос: имеется компонент 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:49:00) [9]

Ну ладно, может вы и правы.
Ещё вопрос: имеется компонент 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) и компонент начинает глючить.


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

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

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


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

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


Palladin   (2007-11-09 14:18:00) [12]

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


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

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


Loginov Dmitry   (2007-11-08 20:26:00) [14]

{:Удаляет повторяющиеся символы.
Удаляет из строки 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;


Amoeba   (2007-11-08 20:26:00) [15]

Вот процедура и ф-ия из библиотеки 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;


Palladin   (2007-11-08 20:17:00) [16]

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


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

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


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


> [1]
</I
> [2]

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


Palladin   (2007-11-08 18:44:00) [19]


> 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;


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

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо