![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток, коллеги по цеху!
Встала задача, о которую я себе уже несколько часов разбиваю голову, а именно - надо найти спецсимволы в строке, точнее - символы переноса. Как ни странно, но стандартные методы не помогают. Пробовал такие вариации: Код:
pos(#13#10, temp) AnsiPos(#13#10, temp) Попробовал даже так: Код:
if StringReplace(temp, #13#10, #13#10, [rfReplaceAll, rfIgnoreCase]) <> temp then И все возвращает нули... А перенос в этой строке точно есть, и точно #13#10, проверял. Да что там, пробовал искать и #13 и #10 отдельно... Толку - ноль! Может подскажете что пользительное? Заранее спасибо! |
|
#2
|
||||
|
||||
|
Цитата:
В Delphi 7 такой код: Код:
procedure TForm1.Button1Click(Sender: TObject);
var
temp: String;
p: Integer;
begin
temp := 'Проверка'#13#10'переноса';
p := Pos(#13#10, temp);
ShowMessageFmt('Перенос найден в позиции %d', [p]);
end; |
|
#3
|
|||
|
|||
|
poli-smen, привет
temp, конечно же, string. Однако, Ваш пример заработал у меня на XE4. Сейчас до работы доберусь, буду разбираться, что к чему и почему Как чего разгребу - отпишусь Спасибо ![]() |
|
#4
|
|||
|
|||
|
Мне удалось найти источник моей проблемы.
Я тащу данные из TRichEdit построчно и ищу в них символы переноса строки. Однако, в TRichEdit они не проставляются. Суть моей задачи простая, мне надо найти начало и конец абзаца TRichEdit. Этот метод не подошел Не подскажете что-нибудь более-менее действенное? |
|
#5
|
||||
|
||||
|
Цитата:
Т.е. здесь не найдёт переноса строки: Код:
p := Pos(#13#10, RichEdit1.Lines[0]); А вот здесь найдёт (если текст многострочный): Код:
p := Pos(#13#10, RichEdit1.Lines.Text); |
|
#6
|
|||
|
|||
|
Да, я опять недосказал историю
В TRichEdit включен WordWrap А вот текст надо вытаскивать поабзацно ![]() |
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
||||
|
||||
|
потому что метод Get класса TRichEditStrings обрезает символы переноса строк #13#10. см. ComCtrls:
Код:
function TRichEditStrings.Get(Index: Integer): string; var Text: array[0..4095] of Char; L: Integer; begin Word((@Text)^) := SizeOf(Text); L := SendMessage(RichEdit.Handle, EM_GETLINE, Index, Longint(@Text)); if (Text[L - 2] = #13) and (Text[L - 1] = #10) then Dec(L, 2); SetString(Result, Text, L); end; решение вместо RichEdit1.Lines[i] использовать: Код:
var
Text: array [0..$fff] of Char;
L: Integer;
s: String;
...
Word((@Text)^):=SizeOf(Text);
L:=SendMessage(RichEdit1.Handle, EM_GETLINE, i, Integer(@Text));
SetString(s, Text, L);полный код примера Код:
procedure TForm1.Button1Click(Sender: TObject);
var
para: String;
i: Integer;
Text: array [0..$fff] of Char;
L: Integer;
s: String;
begin
para:='';
for i:=0 to SendMessage(RichEdit1.Handle, EM_GETLINECOUNT, 0, 0)-1 do
begin
Word((@Text)^):=SizeOf(Text);
L:=SendMessage(RichEdit1.Handle, EM_GETLINE, i, Integer(@Text));
SetString(s, Text, L);
para:=para+s;
if Pos(#13#10, s)>0 then
begin
Memo1.Lines.Add(para);
para:='';
end;
end;
end; |
|
#9
|
|||
|
|||
|
Как ни странно, не работает даже скопированный пример, условие
Код:
if Pos(#13#10, s)>0 then ![]() Пробовал как в своем, так и в новом пустом проекте... |
|
#10
|
||||
|
||||
|
смотри отладчиком что возвращает EM_GETLINE в Text для строк где есть перенос. я проверял на Delphi 7, соответственно для ANSI. так же обрати внимание на ее объявление Text: array [0..$fff] of Char.
|
|
#11
|
|||
|
|||
|
Независимо от контента (даже если в нем пусто) в RichEdit, всегда и постоянно EM_GETLINE = 196, Text - стабильный массив символов (одних и тех же).
|
|
#12
|
||||
|
||||
|
Цитата:
Цитата:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
para: String;
i: Integer;
Text: array [0..$fff] of Char;
L: Integer;
s: String;
begin
Memo1.Clear;
para := '';
for i := 0 to SendMessage(RichEdit1.Handle, EM_GETLINECOUNT, 0, 0) - 1 do
begin
Word((@Text)^) := Length(Text);
L := SendMessage(RichEdit1.Handle, EM_GETLINE, i, Integer(@Text));
SetString(s, Text, L);
para := para + s;
if Pos(#13, s) > 0 then
begin
Memo1.Lines.Add(para);
para := '';
end;
end;
end; |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Lord_Vlad (18.12.2013)
| ||
|
#13
|
||||
|
||||
|
Цитата:
ну правильно, ибо: Код:
{ Edit Control Messages }
const
{$EXTERNALSYM EM_GETLINE}
EM_GETLINE = $00C4;![]() а L чему равно, нулю? |
|
#14
|
|||
|
|||
|
Точно
А L равно... Ща... Воистину, L = 0 ![]() |
|
#15
|
|||
|
|||
|
Наконец добрался дод своего проектика. Попробовал, все заработало!
Спасибо откликнувшимся ![]() |