Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2015, 21:32   #1
Massaget
Пользователь
 
Регистрация: 30.07.2015
Сообщений: 21
Вопрос Изменить код функции для поиска прописного полужирного текста

Приветствую всех!

В текущей функции парсируется только слово написанное прописным и полужирным шрифтом.
А следующие слова с теми же атрибутами расположенными далее, просто игнорируются.
Необходимо парсировать все слова имеющие одинаковые атрибуты форматирования и расположенные на одной строке разделённые через: пробел, дефис, кавычки (Word'овские и возможно такие - " ").
Буду рад, если поможете отредактировать код!
Код:
function GetIsTitle(AValue: String): Boolean;
Var  S: String;
     InX, InY: Integer;
Begin
InY := 0; S := AValue;
InX := Pos(Ch_BraceSqrBegin, S);
If InX > 0 then S := S_Copy(S, 1, InX - 1);
For InX := 1 to Length(S) do
If S_IsLetter(S[InX]) and (S[InX] = S_UpperChar(S[InX])) then Inc(InY);
Result := InY > 1;
End;

Последний раз редактировалось Stilet; 30.07.2015 в 21:38.
Massaget вне форума Ответить с цитированием
Старый 30.07.2015, 21:44   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

И че этот код действительно жирность шрифта распознает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2015, 21:48   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Что за прикол выделения ключевых слов в коде? Кнопкой # не проще?
Код:
function GetIsTitle(AValue: String): Boolean;
Var S: String;
     InX, InY: Integer;
Begin
  InY := 0; S := AValue;
  InX := Pos(Ch_BraceSqrBegin, S);
  If InX > 0 then S := S_Copy(S, 1, InX - 1);
  For InX := 1 to Length(S) do
    If S_IsLetter(S[InX]) and (S[InX] = S_UpperChar(S[InX])) then Inc(InY);
  Result := InY > 1;
End;
По сути - чего это полужирный шрифт?
По коду - Ch_BraceSqrBegin, S_IsLetter и S_UpperChar ?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.07.2015, 22:59   #4
Massaget
Пользователь
 
Регистрация: 30.07.2015
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
И че этот код действительно жирность шрифта распознает?
Жирность не берёт, но прописные определяет. И причём криво. Так как пропускает следующее прописное слово. А вообще нужно было поправить код так, чтобы работал со всеми шрифтами и кодировками.

Аватар
Не было времени разбираться с функционалом форматирования на ресурсе. Но к тому же не хотел напрягать гостей и пользователей для разбора кода.

S_UpperChar - прописной шрифт. А полужирность он вообще игнорирует.

Последний раз редактировалось Stilet; 04.08.2015 в 19:31.
Massaget вне форума Ответить с цитированием
Старый 31.07.2015, 00:16   #5
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Цитата:
парсировать все слова
...
пропускает следующее прописное слово.
Функция возвращает Boolean. Цель функции GetIsTitle()?
Что за переменная или константа Ch_BraceSqrBegin? Что именно делают функции S_IsLetter() и S_UpperChar()? Покажите их.
Цитата:
имеющие одинаковые атрибуты форматирования
Код:
function GetIsTitle(AValue: String): Boolean;
Какого ещё полужирного? String в принципе не содержит никаких атрибутов.
Цитата:
чтобы работал со всеми шрифтами и кодировками
String это массив символов. В старых Делфи массив Char (1 байт, ANSI) в новых вроде WideChar (поправьте, если не так). Ни шрифтов ни кодировок оно не предполагает.

Последний раз редактировалось ResourceSpace; 31.07.2015 в 00:18.
ResourceSpace вне форума Ответить с цитированием
Старый 31.07.2015, 00:26   #6
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Я так понимаю, это поиск слов, выделенных тегом Ch_BraceSqrBegin. Но информации мало, чтоб можно было чем-то помочь.

Massaget, приведите пример входных данных, и пример того, что хотите получить на выходе.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 31.07.2015, 08:15   #7
Massaget
Пользователь
 
Регистрация: 30.07.2015
Сообщений: 21
По умолчанию

Krasiosoft, ResourceSpace, Код написан не мной. Могу сказать следующее, все функции и процедуры и вообще все компоненты не являются стандартными VCL. От этого и такая сложность. Если сможете помочь, могу выложить весь исходник приложения.
Но, предупреждаю! В приложении не использовано ни единого стандартного компонента Delphi 7, все компоненты созданы автором кода. Само собой VCL его компонентов приложить не могу.
Если есть решение, то не обязательно париться с этой функцией. Может есть другое решение, приму и его.

Word sample text.jpg - исходный текст в Word документе.
Export-table_need.jpg - желаемый результат.
Simbols_MARKER.jpg - символы которые присутствуют в исходном тексте. Шрифт Times New Roman и TimesUZ (могу приложить).
Изображения
Тип файла: jpg Word sample text.jpg (112.5 Кб, 131 просмотров)
Тип файла: jpg Export-table_need.jpg (72.4 Кб, 132 просмотров)
Тип файла: jpg Simbols_MARKER.jpg (64.5 Кб, 96 просмотров)
Massaget вне форума Ответить с цитированием
Старый 31.07.2015, 16:19   #8
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

А в каком виде данные с Word'a оказываются в AValue: String? Код, который Вы привели, наверно, делает следующее:
Код:
function GetIsTitle(AValue: String): Boolean;
Var  S: String;
     InX: Integer;
     InY: Integer;
Begin
     InY := 0; 
     S := AValue;   // непонятно зачем тут делать копию строки, это можно перенести в else для "If InX > 0 then"
     InX := Pos(Ch_BraceSqrBegin, S);   //  ищет вхождение Ch_BraceSqrBegin в строку S 
     If InX > 0 then S := S_Copy(S, 1, InX - 1);  //  если вхождение было, копирует в строку S все содержимое до начала Ch_BraceSqrBegin
     For InX := 1 to Length(S) do   // цикл прохода по строке, которую скопировали в S
          //  считает количество заглавных букв и записывает его в InY
          //  не ясно, почему так сделано, а что если будет строчная буква в строке?
          If S_IsLetter(S[InX]) and (S[InX] = S_UpperChar(S[InX])) then Inc(InY);
     Result := InY > 1;  //  если нашел хотя бы 2 заглавные буквы, тогда возвращает true, иначе false
                         //  опять же не ясно, почему именно 2, и для чего тогда нужно было проходиться по всей строке?
End;
В итоге, функция GetIsTitle - это просто проверка есть ли вхождение в строку (AValue: String) с нужными параметрами.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 31.07.2015 в 16:31.
Krasiosoft вне форума Ответить с цитированием
Старый 31.07.2015, 17:02   #9
Massaget
Пользователь
 
Регистрация: 30.07.2015
Сообщений: 21
По умолчанию

Krasiosoft для полноты картины могу приложить другой кусок кода, но вряд ли это поможет. Можно ли с имеющимися исходниками замутить то, что мне необходимо?
Massaget вне форума Ответить с цитированием
Старый 31.07.2015, 17:10   #10
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Тут нужно посмотреть в каком виде текст с Word'a попадает в строку, в данном случае, это AValue: String, а дальше уже будет видно.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Модуль для поиска определенного текста на сайте princenz Фриланс 2 11.11.2014 23:05
изменить путь для считывания текста m1zantrop Общие вопросы Delphi 1 06.06.2012 10:33
Разбор функции поиска текста в TWebBrowser kta87 Общие вопросы Delphi 1 16.05.2012 01:07
Что лучше для поиска текста: string::find или strstr()? WebbMan Общие вопросы C/C++ 1 20.06.2011 23:00
Набор текста для поиска через DbGrid Aleks_www БД в Delphi 14 21.01.2011 14:03