|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
Наконец добрался дод своего проектика. Попробовал, все заработало!
Спасибо откликнувшимся |