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

Вниз

Удаление пробелов в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.036 c
15-1193533419
ВАК
2007-10-28 04:03
2007.12.02
тз


8-1170626458
Yura1024
2007-02-05 01:00
2007.12.02
Delphi: Изменение гамма-коррекции изображения


2-1194433943
LexXL
2007-11-07 14:12
2007.12.02
вписать картинку в квадрат


15-1193162399
Студент
2007-10-23 21:59
2007.12.02
Найти величины углов


15-1194178514
andreoman
2007-11-04 15:15
2007.12.02
как читать чужиее смс





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский