![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление пробелов в 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;