Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как нормально определить каждое "слово" в коде?.. [D6, D7, WinXP]


SkySpeed ©   (2007-06-14 02:08:00) 

Пусть имеем кусок кода:
unit MyPanel;

interface

uses
 Windows, SysUtils, Classes, Controls, ExtCtrls, Graphics, Jpeg;

type
 TVAlignment=(InTop,InCenter,InBottom);

type
 TPanelka = class(TCustomPanel)
 private
   { Private declarations }
   FPicture:String;       //Путь к рисунку

   FAlignment: TAlignment;
   FVAlignment:TVAlignment;
   FTopColor:TColor;
   FBottomColor:TColor;

   FTranspEnable:Boolean;

   procedure SetTopColor(TopColor:TColor);
   procedure SetBottomColor(BottomColor:TColor);
   procedure SetAlignment(Value:TAlignment);
   procedure SetVAlignment(Value:TVAlignment);

   procedure SetTransp(Transparent:Boolean);

   procedure MyCanvasDraw(Rect:TRect;Font:TFont;Canvas:TCanvas;
                          MyCaption:TCaption;MyFlag:Integer);

   procedure SetPicture(Pic:String);


Необходимо пройтись по коду и перебрать все встречающиемя слова
Пробывал так:
procedure TForm1.Button1Click(Sender: TObject);
var
s,x:Integer;
a,ts:String;
begin
for x:=0 to RichEdit1.Lines.Count-1 do
begin
 a:=RichEdit1.Lines.Strings[x];
 for s:=1 to Length(a) do
 begin
  if a[s]<>' ' then
   ts:=ts+a[s];
  if (a[s]=' ') OR (s=Length(a)) then
  begin
   ShowMessage(ts+':'+IntToStr(Length(ts)));
   ts:='';
  end;
 end;
end;
end;


Но в результате многие слова пропускаются...

Что подскажете?

P.S.: думал написать программу, которая проверяет каждое слово соответствие зарезервированному слову и если это з.с., то выделяет его (используя TRichEdit)
Зарезервированные слова думал хранить в отдельном TListBox


OOO @Delphi   (2007-06-14 12:53:00) [1]


> Anatoly Podgoretsky ©   (14.06.07 12:50) [8]
> > SkySpeed  (14.06.2007 12:37:07)  [7]> Т.е. словами считать,
>  всё то, что не относится к пробелам, знакам препинания,
>  скобкамНо у тебя в коде только проверка на пробелы!!!

Знаю! Дополнительные условия добавить не трудно...

Но как оптимизировать поиск зарезервированных слов? :-)


Anatoly Podgoretsky   (2007-06-14 12:50:00) [2]

> SkySpeed  (14.06.2007 12:37:07)  [7]

> Т.е. словами считать, всё то, что не относится к пробелам, знакам препинания, скобкам

Но у тебя в коде только проверка на пробелы!!!


SkySpeed   (2007-06-14 12:37:00) [3]

Нет бога, кроме Дельфи. А Rxlib стОит загрузить на свой комп. :)
Две функции из Rxlib и никаких проблем!
WordCount & WordPosition.

Посторонние компоненты - это хорошо, но НО заключается в том, что в данных компонентах может быть много мусора, не нужного для решения моей задачи => сел писать свой обработчик :-)

Alex_C ©   (14.06.07 09:47) [2]

Гм. Для интереса проверил у себя - все работает. Какие слова у тебя не выводятся?

У меня дополнительно к словам выводятся пробелы, + не выводились uses, InTop.................. и другие


> Игорь Шевченко ©   (14.06.07 10:45) [3]
> Для того, чтобы пройтись по коду, вовсе не обязательно загружать
> его в RichEdit

Загрузка в RichEdit производится для последующей обработке найденных слов

clickmaker ©   (14.06.07 10:48) [4]

> SkySpeed   (14.06.07 02:08)

а предполагается, что слова - это только то, что разделяется пробелами?

потому как в коде не видно обработки других разделителей, скобок, например



> Anatoly Podgoretsky ©   (14.06.07 11:31) [5]
> Пока нет четко определения, что такое слова, то не о чем
> и говорить.Во всяком случае приведенный код неработоспособен
> даже для пробелов.Начать надо с постановки задачи, в части
> определения, что такое слово, ну а дальше дело техники.

Словами считать: unit,MyPanel,interface,uses,Windows,SysUtils,Classes,Controls, ExtCtrls,Graphics,Jpeg,type,TVAlignment,InTop,InCenter,InBottom........

Т.е. словами считать, всё то, что не относится к пробелам, знакам препинания, скобкам

Каждое слово будет сверяться со списком зарезервированных слов
Если же слово является зарезервированным, то оно выделяется жирным стилем, т.е.:

RichEdit1.SelStart:=Начало_зарезервированного_слова;
RichEdit1.SelLength:=Длина_зарезервированного_слова;
RichEdit1.SelAttributes.Style:=RichEdit1.SelAttributes.Style+[fsBold];


Style   (2007-06-14 12:30:00) [4]


> потому как в коде не видно обработки других разделителей,
>  скобок, например


да и комментарии наверное надо будет учитывать :)

По сути человек хочит парсер синтаксиса паскаля написать. В принципе нед необходимости изобретать велосипед. Ищи компоненты SynEdit.


Anatoly Podgoretsky   (2007-06-14 11:31:00) [5]

Пока нет четко определения, что такое слова, то не о чем и говорить.
Во всяком случае приведенный код неработоспособен даже для пробелов.
Начать надо с постановки задачи, в части определения, что такое слово, ну а дальше дело техники.


clickmaker   (2007-06-14 10:48:00) [6]


> SkySpeed   (14.06.07 02:08)

а предполагается, что слова - это только то, что разделяется пробелами?

потому как в коде не видно обработки других разделителей, скобок, например


Игорь Шевченко   (2007-06-14 10:45:00) [7]

Для того, чтобы пройтись по коду, вовсе не обязательно загружать его в RichEdit


Alex_C   (2007-06-14 09:47:00) [8]

Гм. Для интереса проверил у себя - все работает. Какие слова у тебя не выводятся?


Германн   (2007-06-14 02:24:00) [9]


> Как нормально определить каждое "слово" в коде?.. [D6, D7,
>  WinXP]
>
> SkySpeed   (14.06.07 02:08)
>
> Необходимо пройтись по коду и перебрать все встречающиемя
> слова
> Но в результате многие слова пропускаются...
>
> Что подскажете?
>

Нет бога, кроме Дельфи. А Rxlib стОит загрузить на свой комп. :)
Две функции из Rxlib и никаких проблем!
WordCount & WordPosition.


Наверх

Титульная страница Поиск, карта сайта Написать письмо