Форум: "Начинающим";
Текущий архив: 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.042 c