Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.12.2013, 01:39
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
Восклицание Поиск спецсимволов в строке

Доброго времени суток, коллеги по цеху!

Встала задача, о которую я себе уже несколько часов разбиваю голову, а именно - надо найти спецсимволы в строке, точнее - символы переноса.

Как ни странно, но стандартные методы не помогают.

Пробовал такие вариации:

Код:
pos(#13#10, temp)

AnsiPos(#13#10, temp)

Попробовал даже так:
Код:
if StringReplace(temp, #13#10, #13#10, [rfReplaceAll, rfIgnoreCase]) <> temp then

И все возвращает нули... А перенос в этой строке точно есть, и точно #13#10, проверял.
Да что там, пробовал искать и #13 и #10 отдельно... Толку - ноль!

Может подскажете что пользительное?

Заранее спасибо!
Ответить с цитированием
  #2  
Старый 11.12.2013, 01:56
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Lord_Vlad
Встала задача, о которую я себе уже несколько часов разбиваю голову, а именно - надо найти спецсимволы в строке, точнее - символы переноса.

Как ни странно, но стандартные методы не помогают.

Пробовал такие вариации:

Код:
pos(#13#10, temp)

AnsiPos(#13#10, temp)
Наверное проблема связана с тем, что "Delphi XE4". Переменная temp как объявлена?

В 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;
выдаёт: "Перенос найден в позиции 9"
Ответить с цитированием
  #3  
Старый 11.12.2013, 07:52
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

poli-smen, привет

temp, конечно же, string.

Однако, Ваш пример заработал у меня на XE4. Сейчас до работы доберусь, буду разбираться, что к чему и почему

Как чего разгребу - отпишусь

Спасибо
Ответить с цитированием
  #4  
Старый 11.12.2013, 15:11
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Мне удалось найти источник моей проблемы.
Я тащу данные из TRichEdit построчно и ищу в них символы переноса строки. Однако, в TRichEdit они не проставляются.

Суть моей задачи простая, мне надо найти начало и конец абзаца TRichEdit. Этот метод не подошел

Не подскажете что-нибудь более-менее действенное?
Ответить с цитированием
  #5  
Старый 11.12.2013, 15:30
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Lord_Vlad
Мне удалось найти источник моей проблемы.
Я тащу данные из TRichEdit построчно и ищу в них символы переноса строки. Однако, в TRichEdit они не проставляются.

Суть моей задачи простая, мне надо найти начало и конец абзаца TRichEdit. Этот метод не подошел

Не подскажете что-нибудь более-менее действенное?
Построчно это как? Каждая строка это же и есть новый абзац - посреди строки (т.е. абзаца) не может быть переноса строки, так как это будет новый абзац и соответственно новая строка.

Т.е. здесь не найдёт переноса строки:
Код:
p := Pos(#13#10, RichEdit1.Lines[0]);

А вот здесь найдёт (если текст многострочный):
Код:
p := Pos(#13#10, RichEdit1.Lines.Text);
(только какой смысл?)
Ответить с цитированием
  #6  
Старый 11.12.2013, 15:34
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Да, я опять недосказал историю
В TRichEdit включен WordWrap А вот текст надо вытаскивать поабзацно
Ответить с цитированием
  #7  
Старый 11.12.2013, 16:16
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Lord_Vlad
Да, я опять недосказал историю
В TRichEdit включен WordWrap А вот текст надо вытаскивать поабзацно
Эта странность у меня тоже наблюдается...
Ответить с цитированием
  #8  
Старый 11.12.2013, 18:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

потому что метод 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;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо NumLock за это полезное сообщение:
Lord_Vlad (18.12.2013), poli-smen (11.12.2013)
  #9  
Старый 12.12.2013, 10:25
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Как ни странно, не работает даже скопированный пример, условие
Код:
if Pos(#13#10, s)>0 then
всегда возвращает ноль

Пробовал как в своем, так и в новом пустом проекте...
Ответить с цитированием
  #10  
Старый 12.12.2013, 10:39
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

смотри отладчиком что возвращает EM_GETLINE в Text для строк где есть перенос. я проверял на Delphi 7, соответственно для ANSI. так же обрати внимание на ее объявление Text: array [0..$fff] of Char.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 12.12.2013, 16:54
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Независимо от контента (даже если в нем пусто) в RichEdit, всегда и постоянно EM_GETLINE = 196, Text - стабильный массив символов (одних и тех же).
Ответить с цитированием
  #12  
Старый 12.12.2013, 18:26
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Lord_Vlad
Независимо от контента (даже если в нем пусто) в RichEdit, всегда и постоянно EM_GETLINE = 196,
Естественно. Это же константа
Цитата:
Сообщение от Lord_Vlad
Text - стабильный массив символов (одних и тех же).
Вот так на XE2 у меня заработало:
Код:
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  
Старый 12.12.2013, 18:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Lord_Vlad
Независимо от контента (даже если в нем пусто) в RichEdit, всегда и постоянно EM_GETLINE = 196, Text - стабильный массив символов (одних и тех же).

ну правильно, ибо:
Код:
{ Edit Control Messages }
const
  {$EXTERNALSYM EM_GETLINE}
  EM_GETLINE             = $00C4;

а L чему равно, нулю?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 12.12.2013, 19:50
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Точно

А L равно... Ща... Воистину, L = 0
Ответить с цитированием
  #15  
Старый 18.12.2013, 15:48
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
Хорошо

Наконец добрался дод своего проектика. Попробовал, все заработало!
Спасибо откликнувшимся
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:27.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter