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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2015, 21:13   #21
Massaget
Пользователь
 
Регистрация: 30.07.2015
Сообщений: 21
По умолчанию

Stilet, Именно слов. В тексте определить слово, если оно набрано в верхнем регистре, то проверяем следующее и так далее пока следующее слово не будет в нижнем регистре. Все слова в верхнем регистре определить как единое целое.
Прилагаю текст. Для удобства могу вложить и Word'овский файл текста.

Word'овский файл текста
Изображения
Тип файла: jpg Word sample text.jpg (112.5 Кб, 125 просмотров)
Вложения
Тип файла: doc Sample_Words-Articles.doc (31.0 Кб, 5 просмотров)

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

Ну тот же принцип - переводим все в верхний регистр и сравниваем с исходным словом. Если равно - значит оно написано большими.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.08.2015, 21:29   #23
Massaget
Пользователь
 
Регистрация: 30.07.2015
Сообщений: 21
По умолчанию

Спасибо, начинаю вникать.
Меня смущало в описание функций:
Код:
function Uppercase(const S: string): string; // Преобразует символы 'a'..'z' в строке S к верхнему регистру.

function AnsiUpperCase(const S: string): string; //Преобразует символы в строке к верхнему регистру с учетом языкового драйвера.
слово "преобразует", вот и пытался найти функцию именно проверяющую и понимающую Unicode символы.

А есть примерчик с комментариями для лучшего понимания задачи?
Massaget вне форума Ответить с цитированием
Старый 04.08.2015, 21:36   #24
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По-моему есть и проверяющие функции, но я их... не помню.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.08.2015, 21:40   #25
Massaget
Пользователь
 
Регистрация: 30.07.2015
Сообщений: 21
По умолчанию

Что же, и на этом спасибо! Если вдруг вспомните быстрее, чем я найду буду только рад!
Massaget вне форума Ответить с цитированием
Старый 04.08.2015, 22:14   #26
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Если брать с кода, который был в первом сообщении, тогда будет что-то вроде этого:

Код:
procedure ProcWord(str: String);
var i:integer;
begin
  //  проверяем, чтоб все буквы были заглавными, и если это так, тогда вызываем ShowMessage

  for i:=1 to Length(str) do
  begin
//    if UpperCase(str[i]) <> str[i] then
    if S_UpperChar(str[i]) <> str[i] then
      break;
  end;

  if i = Length(str)+1 then
    ShowMessage(str);
end;

procedure Proc(str: String);
var tempStr: String;
    currChar: PChar;
begin

  if Length(str) > 0 then
  begin
    currChar:= @str[1];

    //  проходимся по всей строке str
    repeat
      //  если это буква, тогда переписываем в tempStr пока это будет не буква
//      while IsCharAlphaA(currChar^)  do
      while S_IsLetter(currChar^)  do
      begin
        tempStr:=tempStr+currChar^;
        inc(currChar);
      end;
      //  если было что-то переписано в tempStr, передаем это в ProcWord и обнуляем строку tempStr
      if Length(tempStr) > 0 then
      begin
        ProcWord(tempStr);
        SetLength(tempStr,0);
      end
      else
        inc(currChar);

    until currChar^=#0;

  end;
end;
В функцию ProcWord должны поступить все слова, которые были найдены в строке, которую передали в Proc. Внутри ProcWord показывает сообщение, если в слове были все заглавные буквы.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

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

Krasiosoft, спасибо за Вашу помощь! Сегодня на работе состряпал код, вроде как выполняет мою задачу. Завтра выложу здесь. Если есть ошибки смело критикуйте и поправляйте. Буду рад аргументированным доводам со стороны более опытных коллег!

Если всё хорошо, то у меня останется только один шаг - прикрутить рабочий код к приложению. Подозреваю, что это быстро не получится (надеюсь, что ошибаюсь).
Massaget вне форума Ответить с цитированием
Старый 08.08.2015, 21:24   #28
Massaget
Пользователь
 
Регистрация: 30.07.2015
Сообщений: 21
По умолчанию

Выкладываю код. Есть недочёты, которые можно исправить с вводом или модифицированием условий.

Код:
procedure TForm1.Button2Click(Sender: TObject);
const skipsimbols = ['.', ',' , '(', '_', '-', #0151, #0150, #10, #13];   // знаки, которые должны игнорироваться при поиске и извлечении слов.
var
sumword,             // Всего слов
wc,                  // Кол-во слов соответствующих требованию
digit,               // Принадлежность символа к цифре
word,                // Если word = 0, значит это слово
k,                   // Временная переменная, кол-во слов без пробелов
simvolindex,         // индекс текущего символа в слове
wordlimit,           // установленный лимит для выделенных символов абзаца / параграфа
parcount: integer;   // кол-во абзацев / параграфаов
wordvalue,           // значение извлечённого слова
currentpar:string;   // текущие абзац / параграф
begin  // prodcedure
// Кнопка 2) Извлечь
K:= 0;
RichEdit1.Clear;
RichEdit1.Font.Name:= 'Times New Roman';
RichEdit1.Font.Size:= 12;
 for Parcount:=1 to W.ActiveDocument.Range.Paragraphs.Count do        // выполняем до последнего абзаца в документе
  begin // for Parcount
   W.ActiveDocument.Paragraphs.Item(Parcount).Range.Select;           // выделяем абзац
   Currentpar:= W.Selection.Text ;                                    // присваиваем выделяем абзац в currentpar
   Wordlimit:=1;
   repeat
    if currentpar[wordlimit] = AnsiUpperCase(currentpar[wordlimit])   // проверяем прописной ли символ в абзаце
    then Wordvalue:= Wordvalue + currentpar[wordlimit]                // если условия выше выполняются то добавляем этот символ в wordvalue
    else wordlimit:= 99;                                              // если условие ложно то wordlimitni равно 99
    wordlimit:= wordlimit + 1;                                        // увеличиваем wordlimit на 1
   until wordlimit = 100;                                             // повторяем wordlimit до 100 смиволов
   wordvalue:= TrimRight(wordvalue);                                  // удаляем у wordvalue пробелы справа
   sumword:= sumword + 1;                                             // кол-во найденных слов увеличиваем на 1
   StatusBar1.Panels[1].Text:=' Всего слов: ' + IntToStr(sumword);    // отображаем в StatusBar.Panels[1] кол-во обработанных слов
   for simvolindex:= 1 to length(wordvalue) do                        // simvolindex повторяется до длины слова
    begin // for simvolindex
     if wordvalue[2] <> ' ' then                                      // если 2 символа в слове не являются пробелами
      begin // if wordvalue[2] <> ' '
       if (length(wordvalue) > 2)and (wordvalue[1] > #13) then        // если длина слова длиннее 2-х символов и больше Энтера (фиг знает почему, но без этого спотыкается в моём исходном документе)
        begin // if (length(wordvalue) > 2
         Form1.Caption:= wordvalue;                                   // formaning nomi so'z nomi bo'lib o'zgarib turadi.
         if (wordvalue[simvolindex] in skipsimbols) then              // если в слове имеется ненужный символ
          wordvalue[simvolindex]:= ' ';                               // -> то удаляем его
         if wordvalue[simvolindex] <> ' ' then k:= k + 1;             // если символы в слове не равны пробелу, то увеличиваем "кол-во слов без пробелов" на 1
         Val(wordvalue[simvolindex], digit, word);                    // преобразуем символ в число
         if word = 0 then k := 0;                                     // если при преобразовании символа в цифру всё ништяг, то k = 0
        end; // if (length(wordvalue) > 2
      end; // if wordvalue[2] <> ' '
    end; // for simvolindex
    if k > 2 then                                                     // если значение k больше 2
     begin wc:= wc + 1; // if k > 2                                   // увеличиваем wc на 1
      StatusBar1.Panels[0].Text:= ' Найдено слов: '+ IntToStr(wc);    // отображаем в StatusBar.Panels[1] кол-во найденных слов
      RichEdit1.Lines.Add(wordvalue);                                 // записываем в Richeditga слово
     end; // if k > 2
     k:= 0;
     wordvalue:= '';
 end; // for Parcount
  RichEdit1.Font.Style:= RichEdit1.Font.Style + [fsbold]              // делаем шрифт текста в Richedit полужирным
end; // procedure
Пользуйтесь на здоровье!
Вложения
Тип файла: zip Doc2CAPSWord-RU.zip (231.6 Кб, 6 просмотров)

Последний раз редактировалось Massaget; 08.08.2015 в 21:26. Причина: забыл вставить кусок кода
Massaget вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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