Учебные материалы по математике | Ооп практика по протоколам | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Ооп практика по протоколам


Протокол

Задание к исполнению

Цель данного проекта — отработать технологии позволяющие вести протокол событий происходящих в программе и на этом примере произвести практическое сравнение возможностей процедурного стиля реализации с объектно-ориентированным подходом. Для этого предстоит сделать программу, имеющую несколько, открываемых при нажатии на соответствующие кнопки, окон. Все события связанные с работой программы (использование программы пользователем) должны быть записаны в файл протокола. Данная задача не является абсолютно абстрактной. Ведение такого протокола может быть полезно для отладки программы и для контроля совершаемых пользователем действий. Часть программы, на которой будут сравниваться процедурная и объектно-ориентированная технологии программирования, будет отвечать за протоколирование. Причины такого выбора очевидны т. к. функциональность протоколирования потребуется во всех разрабатываемых программах. Значит часть кода, реализующая сохранение информации о событиях в программе, должна легко переноситься из текущего «экспериментального» в новые рабочие проекты. Первая версия программы будет содержать реализацию протоколирования чисто процедурными средствами.

Типичное Win-приложение имеет главное окно и несколько второстепенных форм. Вызывать эти формы пользователь будет, используя соответствующие кнопки, расположенные на главной форме. В реальном случае протоколирования программа должна самостоятельно определять сетевое имя пользователя и текущую дату/время. В учебном проекте, для имитации работы в разное время разных пользователей, дополнительно потребуется сделать интерфейс, изменяющий текущую дату и пользователя на необходимые. Краткий конспект действий первого этапа:

1.  тип Delphi-проекта – стандартное Application

2.  кроме главного окна потребуется ещё 4 формы: «о разработчике», «показ протокола», «смена пользователя», «смена даты»

3.  вызов необходимой формы производится в обработчике кнопки методом FormХ. ShowModal где FormХ это имя соответствующей формы

4.  для обеспечения обработки возникающих ошибок использовать «нашу собственную» функцию GetStringError(Str: String); где Str это аргумент «описание места ошибки». Для этого надо:

·  объявить в var секции главной формы рядом с переменной главной формы функцию: function GetStringError(Str: String): integer;

·  в разделе implementation создать тело функции GetStringError реализующую преобразование внутреннего кода win-ошибки в текстовое сообщение «максимально русского вида» и показывающее его на экране см. приложение

5.  для работы протокола потребуется фиксировать в файл имя пользователя, дату, время и название события, значит необходимо

·  объявить в public секции главной формы переменные для хранения текущего имени пользователя и даты

·  в событии FormCreate проинициализировать имя и дату, подготовить файл протокола к работе (рекомендуемое место хранения файла протокола – каталог в котором расположена сама программа)

·  соответственно останется в событии FormDestroy закрыть файл протокола

6.  т. к. для ведения протокола потребуется в ключевых точках расставить код решающий задачи: определить текущего пользователя, условную дату, текущее время, занести это вместе с событием в протокольный файл, то является очевидным решением оформить этот код отдельной функцией и вызывать именно её

·  принимается стратегическое решение – строки протокола должны выглядеть примерно так IvanovAN#16996@ 24.01.2012#26996@ 10:09:40#36996@ запуск программы#46996@ т. е. одна строка содержит описание одного события, а «разделителями» вида #ЦИФРА(1..4)6996@ очевидным образом отделяются данные описывающие событие

·  объявить в public секции главной формы процедуру MyWrite(Str: String)

·  в разделе implementation создать тело процедуры MyWrite и запрограммировать протоколирование события переданного в виде аргумента Str

·  расставить в ключевых точках программы вызовы процедуры MyWrite с указанием в качестве аргумента словесного описание события

7.  обеспечить закрытие файла протокола при завершении работы программы

8.  в форме «смена пользователя» создать интерфейс для ввода имени считающегося именем нового текущего пользователя MyNetName

9.  в форме «смена даты» разместить календарь для установки даты считающейся новой текущей датой и разместить код инициализации переменной MyDate

В результате выполнения предыдущих действий должна получиться первая версия программы «умеющая» протоколировать события вызванные действиями пользователя. Получаемый протокол можно открыть и посмотреть любым текстовым редактором. Кроме того, эта версия позволяет имитировать смену пользователя и вход в программу в произвольную дату. Вторая версия программы должна обеспечить возможность просмотреть протокол работы программы с возможностью отбора по дате, пользователю или событиям:

1.  на форме, предназначенной для демонстрации протокола или его фрагмента, необходимо разместить компонент для отображения текста протокола и интерфейс позволяющий выбрать критерий отбора строк протокола.

2.  для возможности отбора по сетевому имени необходимо предъявить пользователю список возможных имён. Заставлять угадывать запрещено! Для этого придётся:

·  в событии FormActivate формы «показ протокола» прочитать записанный к этому времени протокол и составить «список уникальных имён»

·  в интерфейсе выбора отбора по имени предоставить выбор

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

4.  после выбора критерия отбора произвести чтение протокола с разбором строк и показом только соответствующих критерию отбора

В предлагаемом образце реализации программы для наглядности сделано 2 режима работы системы протоколирования:

·  вывод на экран с помощью функции MessageBoxEx протоколируемого события

·  запись в файл протокола событий функцией MyWrite

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

Отсутствие у приложения (окна главной формы) заголовка окна и даже самого тела, остались только элементы управление, не подлежит воспроизведению как часть задания. Эта возможность только шутка.

Вторая версия программы с точки зрения пользователя является завершённым продуктом – муляж программы работает и демонстрирует работоспособность системы протоколирования. Но в этой версии программы протоколирование выполнено чисто процедурным подходом. Поэтому конечная версия программы — третья, должна содержать в себе объектно-ориентированную версию системы протоколирования. Для этого, опираясь на полученный при разработке опыт, надо спроектировать и создать конструктор и деструктор класса для логгирования событий, свойства и методы необходимые и достаточные для решения задачи. Это уже надо подумать и сделать самостоятельно…

Приложение

Краткие разъяснения принципиальных моментов для тех, кто пока привык делать программы не по постановке задачи заказчиком, а по инструкции «что и где написать». И напоминаю достаточно очевидную мысль – человек не может знать всё! Но он может понимать технический английский язык (что очевидно необходимо на вашей специальности) и знать, что все, что нужно по Паскалю и WinApi можно найти в Help поставляемым вместе с Delphi.

1.  получение сетевого имени

lpBuffer: lpstr;

nSize: DWord;

nSize:=64;

GetMem(lpBuffer, nSize);

GetUserName(lpBuffer, nSize);

FreeMem(lpBuffer);

2.  получение текущей даты

MyDate: TDateTime;

MyDate:=Date();

3.  открытие файла

FileID: TextFile;

NameProt: String;

NameProt:=ExtractFilePath(Application. EXEName)+’Prot. txt’;

AssignFile(FileID, NameProt);

if FileExists(NameProt) then Append(FileID)

else ReWrite(FileID);

4.  формирование и запись строки протокола

Strong: String;

Strong:=MyNetName+’#16996@ ‘+DateToStr(MyDate)+’#26996@ ‘+TimeToStr(Time())+’#36996@ ‘+Str+’#46996@’;

WriteLN(FileID, Strong);

5.  закрытие файла протокола

CloseFile(FileID);

6.  «тело» функции обработки ошибки GetStringError

function GetStringError(Str: String): integer;

var

lpMsgBuf: LPTSTR;

CE: Integer;

begin

CE:=GetLastError();

lpMsgBuf:=nil;

if FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS, Nil, CE, (SUBLANG_DEFAULT shl 10) or LANG_RUSSIAN, @lpMsgBuf, 0, Nil)=0 then

FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS, Nil, CE, 0, @lpMsgBuf, 0, Nil);

GetStringError:=MessageBoxEx(Application. Handle, PChar(Str+»#13#10»+lpMsgBuf), PChar(‘Обработка ошибок’), MB_ICONINFORMATION, (SUBLANG_DEFAULT shl 10) or LANG_RUSSIAN);

if lpMsgBuf<>nil then LocalFree(HLOCAL(lpMsgBuf));

end;

7.  пример использования для показа сообщения функции MessageBoxEx

MessageBoxEx(0, ‘Текст сообщения об ошибке ‘, ‘Заголовок окна об ошибке’, MB_ICONINFORMATION, (SUBLANG_DEFAULT shl 10) or LANG_RUSSIAN);

8.  организация цикла чтения файла протокола

Reset(FileID);

while not Eof(FileID) do

begin

ReadLN(FileID, Str);

DecodeProto(Str, PrName, PrDate, PrTime, PrText)

…………………//обработка прочитанной и распознанной строки

end;

Append(Form1.FileID);

9.  функция распознавания строки протокола

procedure DecodeProto(Str: String; var PrName, PrDate, PrTime, PrText: String)

begin

I:=1; J:=Pos(‘#16996@’, Str);

PrName:=Copy(Str, I, J-I);

I:=J+8; J:=Pos(‘#26996@’, Str);

PrDate:=Copy(Str, I, J-I);

………

end;

10.для предъявления пользователю списка уникальных строк удобно использовать визуальный компонент TComboBox

if ComboBox1.Items. IndexOf(PrName)<0 then ComboBox1.Items. Add(PrName);

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020