Дипломная работа на тему Разработка программы “Domain name, IP” для технического института

Содержание

    • 1. Аналитическая часть
      • 1.1 Глобальная компьютерная сеть
      • 1.2 Доменная организация сети
      • 1.3 IP адрес
      • 2. Проектная часть
      • 2.1 Техническое задание
      • 2.2 Средства проектирования
      • 2.3 Среда разработки Delphi
      • 2.4 История языка
      • 2.5 Назначение Delphi
      • 2.6 Целевая платформа
      • 2.7 Используемые компоненты
      • 2.7.1 Компонент Button
      • 2.7.1.1 Свойства компонента Button
      • 2.7.1.2 События компонента Button
      • 2.7.1.2.1 Исходные коды
      • 2.7.2 Компонент Edit
      • 2.7.2.1 Свойства компонента Edit
      • 2.7.2.2 События компонента Edit
      • 2.7.2.2.1 Исходный код
      • 2.7.3 Компонент Label
      • 2.7.3.1 Свойства компонента Label
      • 2.7.3.2 События компонента Label
      • 2.7.3.2.1 Исходные коды
      • 2.7.4 Компонент Bevel
      • 2.7.5 Компонент ListBox
      • 2.7.5.1 Свойство Sorted
      • 2.7.5.2 Исходные коды
      • 2.7.6 Компонент Timer
      • 2.7.6.1 Исходный код
      • 2.8 Тестирование программы
      • Литература
      • Приложение
      • 1. Аналитическая часть
      • 1.1 Глобальная компьютерная сеть

Internet – глобальная компьютерная сеть, охватывающая весь мир. Сегодня Internet имеет около 15 миллионов абонентов в более чем 150 странах мира. Ежемесячно размер сети увеличивается на 7-10%. Internet образует как бы ядро, обеспечивающее связь различных информационных сетей, принадлежащих различным учреждениям во всем мире, одна с другой. Цифровые адреса – и это стало понятно очень скоро – хороши при общении компьютеров, а для людей предпочтительнее имена. Неудобно говорить, используя цифровые адреса, и ещё труднее запоминать их. Поэтому компьютерам в Internet присвоены имена. Все прикладные программы Internet позволяют использовать имена систем вместо числовых адресов компьютеров.

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

На этапе становления, когда Internet была маленькой общностью, использовать имена было легко. Центр сетевой информации (NIC) создавал специальную службу регистрации. Вы посылали заполненный бланк (конечно, электронными средствами), и NIC вносил Вас в свой список имён и адресов. Этот файл, называемый hosts (список узловых компьютеров), регулярно рассылался на все компьютеры сети. В качестве имён использовались простые слова, каждое из которых обязательно являлось уникальным. Когда Вы указывали имя, Ваш компьютер искал его в этом файле и подставлял соответствующий адрес.

Когда Internet разрослась, к сожалению, размер этого файла тоже увеличился. Стали возникать значительные задержки при регистрации имён, поиск уникальных имён усложнился. Кроме того, на рассылку этого большого файла на все указанные в нём компьютеры уходило много сетевого времени. Стало очевидно, что такие темпы роста требуют наличия распределённой интерактивной системы. Эта система называется “доменной системой имён” (Domain Name System, DNS).

1.2 Доменная организация сети

Каждый компьютер, подключенный к Интернет, должен быть уникально описан в глобальной сети. Эта структура подобна структуре каталогов в компьютере: есть домены самого верхнего уровня, есть вложенные в них домены, которые, в свою очередь, могут содержать другие домены. Имена доменов самого верхнего уровня строго распределены. Существует два типа таких имен: по типу организации и по стране. Имена по типу организации (com – коммерческая организация, edu -учебная, gov – правительственная и т.д.), были исторически первыми, сейчас практически не присваиваются и, в основном характерны для организаций в США.

Обычно адрес, присваиваемый компьютеру, будет включать в себя в качестве имени самого ” верхнего” домена символы, определяющие стран пребывания. Российские компьютеры имеют адреса, заканчивающиеся на ru или su. Далее, уже в рамках данной страны, организации провайдеры регистрируют свои группы имен – домены. Имя каждого домена отделяется при написании от другого имени точкой, причем имя домена верхнего уровня пишется справа. Так, адрес сервера газеты “Уральский рабочий” – это ur.etel.ru. В этом адресе ru – обозначение страны, etel – домен, зарегистрированный провайдером (Екатеринбургским телеграфом), ur – имя компьютера в газете. Если предоставление услуг осуществляется через несколько организаций, то имя компьютера может состоять из большего числа групп символов, хотя на практике редко встретишь имена, включающие в себя больше пяти групп. Доменное имя в компьютере уникально. Но оно еще ничего не говорит о местонахождении компьютера. Вы можете зарегистрировать на себя новый домен и в дальнейшем, при переезде из города в город сохранять за собой эти имена. Будет меняться только организации, которые осуществляют ваш выход в Интернет, регистрируя эти имена в глобальной сети.

1.3 IP адрес

компьютер алгоритм доменный delphi

Второй параметр, который будет уникально определять ваш компьютер в мире – это IP адрес. IP адрес – это четыре числа, каждое из которых может принимать значение от 0 до 255. Например IP – адрес ftp-сервера фирмы Microsoft (то есть сервера, с которого можно получить файлы по сети) 189.105.232.1. Существуют специальные правила, которые определяют адрес, присваиваемый компьютеру. Не вдаваясь в ненужные подробности, отметим только, что этот цифровой адрес уникален, то есть в мире нет второго компьютера с таким же адресом. В чем причина существования двух типов адресов? Во-первых, человеку проще работать с символьным адресом, чем запоминать сочетания цифр.

Обычно имена доменов даются по имени организаций, так что – даже не зная цифрового адреса фирмы – можно предположить о доменном адресе. Кроме того, сохранение ” за собой ” позволяет не беспокоиться, что в случае возможных переездов придется организовывать новую рекламу доменного адреса. Во-вторых, IP адреса обычно получают на себя фирмы, предоставляющие услуги выхода в Интернет. Эти адреса (один или несколько) они закрепляют за конкретным пользователем, который может иметь “свое”, собственное доменное имя. После определенной процедуры регистрации пользователь может начинать работу в Интернет. Процедура полностью автоматизирована, но необходимо некоторое время (около суток), чтобы сервера во всем мире произвели нужные записи о пользователе. Программное обеспечение на компьютерах, предоставляющих услуги Internet, обеспечивает нахождение по IP-адресу имени компьютера и наоборот. Заметим только, что не все компьютеры, имеющие IP-адрес, имеют зарегистрированное в глобальной сети свое доменное имя.

2. Проектная часть

2.1 Техническое задание

Создание программы “Domain name,IP” для технологического института для определения IP-адресов и доменных имен в сети института.

Программа должна быть реализована на языке программирования Delphi.

2.2 Средства проектирования

Для проектирования программного продукта была выбрана среда разработки Delphi, так как она подходит для решения данной задачи и указана как средство разработки самим заказчиком.

При помощи Delphi с минимальными затратами можно создавать различные приложения под самую распространённую операционную систему Windows. Поскольку в основе Delphi лежит концепция быстрого создания приложений – RAD.

В основе систем быстрой разработки (RAD-систем, Rapid Application Development – среда быстрой разработки приложений) лежит технология визуального проектирования и событийного программирования, суть которой заключается в том, что среда разработки берет на себя большую часть рутинной работы, оставляя программисту работу по конструированию диалоговых окон и функций обработки событий.

2.3 Среда разработки Delphi

Delphi – это среда быстрой разработки, в которой в качестве языка программирования используется язык Delphi. Язык Delphi – строго типизированный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal.

Delphi – это комбинация нескольких важнейших технологий:

– высокопроизводительный компилятор в машинный код;

– объектно-ориентированная модель компонент;

– визуальное (а, следовательно, и скоростное) построение приложений из программных прототипов;

– масштабируемые средства для построения баз данных;

2.4 История языка

Delphi, ранее известный как Object Pascal, разработанный фирмой Borland и изначально реализованный в её пакете Borland Delphi, от которого и получил в 2003 году своё нынешнее название, результат развития языка Turbo Pascal, который, в свою очередь, развился из языка Pascal. Pascal был полностью процедурным языком, Turbo Pascal, начиная с версии 5.5, добавил в Pascal объектно-ориентированные свойства.

– версия 1 была предназначена для разработки под 16-ти разрядную платформу Win16;

– версии начиная со второй компилируют программы под 32-х разрядную платформу Win32;

Вместе с 6-й версией Delphi вышла совместимая с ним по языку и библиотекам среда Kylix, предназначенная для компиляции программ под операционную систему Linux;

Версия 8 способна генерировать байт-код исключительно для платформы.NET. Это первая среда, ориентированная на разработку мультиязычных приложений (лишь для платформы.NET);

Последующие версии (обозначаемые годами выхода, а не порядковыми номерами, как это было ранее) могут создавать как приложения Win32, так и байт-код для платформы.NET;

Delphi for .NET – среда разработки Delphi, а так же язык Delphi (Object Pascal), ориентированные на разработку приложений для NET.

2.5 Назначение Delphi

Назначение Delphi – быстрая разработка приложений. С ее помощью можно быстро и качественно создавать любые программы: от простейшего калькулятора до многоуровневой системы управления предприятием.

Использование Delphi позволяет создавать как самые простые приложений, на разработку которых требуется 2-3 часа, так и серьезные корпоративные проекты, предназначенных для работы десятков и сотен пользователей. Вследствие чего Delphi предназначен не только для программистов-профессионалов, им также могут пользоваться и учителя, и врачи, и преподаватели ВУЗов, и бизнесмены, все те, кто используют компьютер с чисто прикладной целью, то есть для того, чтобы быстро решить какие-то свои задачи, не привлекая для этого программистов со стороны.

2.6 Целевая платформа

Изначально язык был предназначен исключительно для разработки приложений Microsoft Windows, затем был реализован также для платформ GNU/Linux (как Kylix), однако после выпуска в 2002 году Kylix 3 его разработка была прекращена, и, вскоре после этого, было объявлено о поддержке Microsoft .NET. При этом высказывались предположения, что эти два факта взаимосвязаны.

С помощью Delphi создаются приложения для операционной системы Windows, но помимо этого с помощью дополнительных средств можно написать, например, программы и для Linux. Среда Delphi легко расширяется установкой дополнительных модулей. Пользовательский интерфейс также хорошо настраиваемый – каждый организует рабочее пространство так, как ему будет удобно.

Реализация языка Delphi проектом Free Pascal позволяет использовать его для создания приложений для таких платформ, как Mac OS X, Windows CE и Linux.

2.7 Используемые компоненты

2.7.1 Компонент Button

Простейшей и, пожалуй, наиболее часто используемый компонент является кнопка Button, расположенная на странице библиотеки Standard.

Основное с точки зрения внешнего вида свойство кнопки – Caption (надпись). В надписях кнопок можно предусматривать использование клавиш ускоренного доступа, выделяя для этого один из символов надписи. Перед символом, который должен соответствовать клавише ускоренного доступа, ставится символ амперсанта “&”. Этот символ не появляется в надписи, а следующий за ним символ оказывается подчеркнутым. Тогда пользователь может вместо щелчка на кнопке нажать в любой момент клавишу Alt совместно с клавишей выделенного символа.

Например, если в вашем приложении имеется кнопка выполнения какой-то операции, вы можете задать ее свойство Caption равным “&Выполнить”. На кнопке эта надпись будет иметь вид “Выполнить”. И если пользователь нажмет клавиши Alt-В, то это будет эквивалентно щелчку на кнопке.

2.7.1.1 Свойства компонента Button

Свойство Cancel, если его установить в true, определяет, что нажатие пользователем клавиши Esc будет эквивалентно нажатию на данную кнопку. Это свойство целесообразно задавать равным true для кнопок “Отменить” в различных диалоговых окнах, чтобы можно было выйти из диалога, нажав на эту кнопку или нажав клавишу Esc.

Свойство Default, если его установить в true, определяет, что нажатие пользователем клавиши ввода Enter будет эквивалентно нажатию на данную кнопку, даже если данная кнопка в этот момент не находится в фокусе. Правда, если в момент нажатия Enter в фокусе находится другая кнопка, то все-таки сработает именно кнопка в фокусе.

Еще одно свойство – ModalResult используется в модальных формах, рассмотрение которых выходит за рамки данной книги. В обычных приложениях значение этого свойства должно быть равно mrNone.

Из методов, присущих кнопкам, имеет смысл отметить один – Click. Выполнение этого метода эквивалентно щелчку на кнопке, т.е. вызывает событие кнопки OnClick. Этим можно воспользоваться, чтобы продублировать какими-то другими действиями пользователя щелчок на кнопке. Пусть, например, вы хотите, чтобы при нажатии пользователем клавиши с символом “С” или “с” в любой момент работы с приложением выполнялись операции, предусмотренные в обработчике события OnClick кнопки Button1. Поскольку неизвестно, какой компонент будет находиться в фокусе в момент этого события, надо перехватить его на уровне формы. Такой перехват осуществляется, если установить свойство формы KeyPreview в true. Тогда в обработчике события формы OnKeyPress можно написать оператор if (key=’C’ or key=’c’) then Button1.Click;

2.7.1.2 События компонента Button

Основное событие любой кнопки – OnClick, возникающее при щелчке на ней. Именно в обработчике этого события записываются операторы, которые должны выполняться при щелчке пользователя на кнопке. Помимо этого есть еще ряд событий, связанных с различными манипуляциями клавишами и кнопками мыши.

Рисунок 2.1 – Компонент Button

2.7.1.2.1 Исходные коды

procedure TForm1.Button1Click(Sender: TObject);

begin

Label1.Caption:=’Name: ‘+IPAddrToName(Edit1.Text);

end;

procedure TForm1.Button2Click(Sender: TObject);

var // Сохранием оригинальное значение IP адреса

OrgVal: string; //части оригинального IP

O1,O2,O3,O4: string; // шестнадцатиричные части

H1,H2,H3,H4: string; // Здесь будут собраны все шеснадцатиричные части

HexIP: string;

XN: array[1..8] of Extended;

Flt1: Extended;

Xc: Integer;

begin

//Сохраняем в обратном порядке для простого случая

Xn[8]:=IntPower(16,0);Xn[7]:=IntPower(16,1);

Xn[6]:=IntPower(16,2);Xn[5]:=IntPower(16,3);

Xn[4]:=IntPower(16,4);Xn[3]:=IntPower(16,5);

Xn[2]:=IntPower(16,6);Xn[1]:=IntPower(16,7);

//Сохраняем оригинальный IP адрес

OrgVal:=Edit2.Text;

O1:=Copy(OrgVal,1,Pos(‘.’,OrgVal)-1);Delete(OrgVal,1,Pos(‘.’,OrgVal));

O2:=Copy(OrgVal,1,Pos(‘.’,OrgVal)-1);Delete(OrgVal,1,Pos(‘.’,OrgVal));

O3:=Copy(OrgVal,1,Pos(‘.’,OrgVal)-1);Delete(OrgVal,1,Pos(‘.’,OrgVal));

O4:=OrgVal;

H1:=IntToHex(StrToInt(O1),2);H2:=IntToHex(StrToInt(O2),2);

H3:=IntToHex(StrToInt(O3),2);H4:=IntToHex(StrToInt(O4),2);

// Получаем шестнадцатиричное значение IP адреса

HexIP:=H1+H2+H3+H4;

//Преобразуем это большое шеснадцатиричное значение в переменную Float

Flt1:=0;

for Xc:=1 to 8 do

begin

case HexIP[Xc] of

‘0’..’9′: Flt1:=Flt1+(StrToInt(HexIP[XC])*Xn[Xc]);

‘A’: Flt1:=Flt1+(10*Xn[Xc]);

‘B’: Flt1:=Flt1+(11*Xn[Xc]);

‘C’: Flt1:=Flt1+(12*Xn[Xc]);

‘D’: Flt1:=Flt1+(13*Xn[Xc]);

‘E’: Flt1:=Flt1+(14*Xn[Xc]);

‘F’: Flt1:=Flt1+(15*Xn[Xc]);

end;

procedure TForm1.Button3Click(Sender: TObject);

var

WSAData: TWSAData;

p: PHostEnt;

begin

WSAStartup(WINSOCK_VERSION, WSAData);

p:=GetHostByName(PChar(Edit3.Text));

Label6.Caption:=’IP: ‘+inet_ntoa(PInAddr(p.h_addr_list^)^);

WSACleanup;

end;

procedure TForm1.Button4Click(Sender: TObject);

var

wsdata: TWSAData;

hostName: array [0..255] of char;

hostEnt: PHostEnt;

addr: PChar;

begin

WSAStartup ($0101, wsdata);

try

GetHostName(hostName, sizeof (hostName));

StrPCopy(hostName,Edit4.Text);

hostEnt:=GetHostByName(hostName);

if Assigned(hostEnt)

then

if Assigned(hostEnt^.h_addr_list)

then

begin

addr:=hostEnt^.h_addr_list^;

if Assigned(addr)

then

begin

Label9.Caption:=Format(‘%d.%d.%d.%d’,[byte(addr[0]),

byte(addr[1]),byte(addr[2]),byte(addr[3])]);

end;

end;

finally

WSACleanup;

end;

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

Label11.Caption:=’Name: ‘+IPAddrToCompName(Edit5.Text);

end;

procedure TForm1.Button6Click(Sender: TObject);

begin

if stop_traf=false then stop_traf:=true

else stop_traf:=false;

end;

2.7.2 Компонент Edit

Большинство компьютерных программ работают по следующему алгоритму: ввод данных в программу – обработка введенных данных – вывод результата. Практически любая программа за исключением элементарных требуют ввода данных. В среде разработки Delphi для это цели используются множество различных компонентов, наиболее часто используемой является компонент Edit. Он представляет собой обычное поле в которое пользователь вводит данные. Располагается данный компонент на вкладки Standart.

2.7.2.1 Свойства компонента Edit

Свойства – это “характеристики” компонента, они содержат только значения которые можно считать, либо изменить.

Enabled – свойство принимает только логические значения True и False. Значение по умолчанию True, при установки значения False поле ввода данных компонент Edit становиться не доступным для ввода данных и перестает реагировать на любые действия пользователя.

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

Text является основным свойством компонента, оно содержит введенные пользователем данные, по умолчанию как уже писалось выше оно содержит значение “Edit1”.

Visible – свойство используемое для скрытия компонента от пользователя. При установке значения False компонент Edit исчезает из виду.

2.7.2.2 События компонента Edit

События – это процедуры которые будут выполняться в ответ на действия пользователя. Например:

Событие OnChange, если для него прописан код, то он выполниться при изменений значения свойства Text компонента Edit.

OnClick – реагирует на щелчок мышкой по полю ввода.

OnKeyPress – событие вызываемое при нажатий пользователем любой клавиши.

В разрабатываемой программе применено пять компонентов Edit. Edit1,Edit2,Edit4 – служат для ввода IP; Edit3,Edit 5 – для ввода имени.

Рисунок 2.2 – Компонент Edit.

2.7.2.2.1 Исходный код

procedure TForm1.Edit1Change(Sender: TObject);

begin

end;

2.7.3 Компонент Label

Label – метка, используемая для отображения текста. Компонент Label используется для отображения текста, который играет роль метки и не изменяется пользователем.

2.7.3.1 Свойства компонента Label

Свойства – это “характеристики” компонента, они содержат только значения которые можно считать, либо изменить.

AutoSize – Если true – то вертикальный и горизонтальный размеры определяются размером надписи

Aligment – Управляет горизонтальным выравниванием текста в пределах метки (влево, вправо, по центру)

Caption – Строка текста, отображаемой метки

Color – Цвет фона метки

FocusControl – Определяет оконный компонент, получающий фокус при нажатии клавиши быстрого доступа метки.

Font – Атрибуты шрифта

Layout – Определяет выравнивание текста в поле метки по вертикали

ParentColor – При true – фон метки, по умолчанию цвет формы

ShowAccelChar – Определяет как амперсанд отображается в тексте метки

WordWrap – Переносится ли текст на новую строку, если он превышает ширину метки

2.7.3.2 События компонента Label

Рисунок 2.3-Компонент Label.

События – это процедуры которые будут выполняться в ответ на действия пользователя. Например:

OnMouseEnter – наступает в начале прохождения курсора мыши над меткой.

OnMouseLeave – наступает в конце прохождения курсора мыши над меткой.

2.7.3.2.1 Исходные коды

procedure TForm1.Label1DblClick(Sender: TObject);

begin

Edit1.Text:=Label1.Caption;

end;

procedure TForm1.Label4DblClick(Sender: TObject);

begin

Edit2.Text:=Label4.Caption;

end;

procedure TForm1.Label6DblClick(Sender: TObject);

begin

Edit3.Text:=Label6.Caption;

end;

procedure TForm1.Label9DblClick(Sender: TObject);

begin

Edit4.Text:=Label9.Caption;

end;

procedure TForm1.Label11DblClick(Sender: TObject);

begin

Edit5.Text:=Label11.Caption;

end;

2.7.4 Компонент Bevel

Это компонент Bevel, чье единственное назначение сосотоит в том, чтобы обеспечить некоторое зрительное разделение между информацией об авторе и информацией заметки. Таким образом, единственное для чего годится компонент Bevel – это служить разделителем. Он обладает всего пригоршней свойств и вообще не имеет событий, и поэтому не может ни за что отвечать.

Мы можем изменить внешний вид Bevel, изменяя его свойства Shape и Style, так же, как и его размер. Shape Bevel может быть твердым окном, рамкой (очерченным окном) или горизонтальной или вертикальной линией. Стиль может быть bsRaised (“выступом”, . mnrbsLowered (“углублением”). Bevel можно найти на странице Additional page (Дополнительной странице) палитры компонентов.

Рисунок 2.4-Компонент Bevel.

2.7.5 Компонент ListBox

Компонент ListBox представляет из себя прямоугольную область, заполненную списком однострочных текстовых элементов. С помощью клавиатуры или за счет выбора мыши, можно осуществить отбор необходимы элементов в программе.

Свойство в котором находится список строк это Items типа TString. На этапе проектирования, для его заполнения, необходимо нажать на кнопке с многоточием напротив этого свойства в окне Инспектора Объектов. В приложении поставить в любой обработчик (допустим событие кнопки)

ListBox1.Items.Add или ListBox1.Items.Add(Edit1.Text); // добавление будет из компонента Edit1.Text

Для полной очистки списка: ListBox1.Clear; Чтобы удалить выделенный элемент:ListBox1.DeleteSelected;По умолчанию список состоит из одной колонки. И если список большой и не все элементы помещаются в нем автоматически справа появляется или исчезает вертикальная полоса прокрутки (первый и второй компонент ListBox). Для того чтобы появилась горизонтальная полоса прокрутки необходимо свойству Columns типа Integer поставить значение больше нуля. Третий компонент – Columns равен 1, второй 2.

2.7.5.1 Свойство Sorted

Равное true дает возможность расположить элементы в алфавитом порядке. За счет сортировки списка в алфавитом порядке будет легче увидеть необходимый элемент, особенно если список большой. Применив сортировку в Инспекторе Объектов отменить сортировку не удастся.

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

ShowMessage(ListBox1.Items[ListBox1.ItemIndex]);

где ShowMessage() – простейшая функция вывода на экран текстовых сообщений, а ListBox1.ItemIndex – номер текущего элемента.

MultiSelect – свойство благодаря которому можно можно выбрать не 1 элемент, а более. Для этого ставим его равным TRUE. Щелкая мышью, при нажатой клавише CTRL, выбираем произвольные элементы. Если свойство ExtendedSelect равно TRUE, удерживая клавишу SHIFT выделим непрерывный диапазон списка. Для определения выделен компонент или нет обратимся к свойствуSelected. Выражение:ListBox.Selected[3] равно TRUE, если четвертый элемент в компоненте выделен (номера элементов начинаются с нуля).

ItemAtPos свойство, которое переводит координаты щелчка внутри списка в индекс элемента. Расположим на форме компоненты ListBox, Panel и Label согласно рисунку. Для компонента ListBox в обработчике отпускания кнопки мыши напишем следующий код.

Рисунок 2.5- Компонент ListBox.

2.7.5.2 Исходные коды

procedure TForm1.ListBox1Click(Sender: TObject);

begin

end;

end;

procedure TForm1.ListBox1MouseUp(Sender:

TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

Point : TPoint;

Nomer : Integer;

begin

Point.X := X;

Point.Y := Y;

Nomer := ListBox1.ItemAtPos(Point, True);

Label1.Caption := IntToStr(Nomer);

Panel1.Caption := ListBox1.Items[ListBox1.ItemIndex];

end;

В переменной Nomer запишется индекс элемента и компонент Label1 выведет его. Надпись на Panel1 выведет текст элемента ListBox1.

2.7.6 Компонент Timer

Компонент Timer очень простой компонент, который не виден на экране, но, тем не менее, Timer выполняет очень важные функции в программе. Timer позволяет вводить необходимые задержки между выполнением тех или иных действий. Компонент Timer имеет всего два свойства и одно событие, и работать с компонентом Timer очень просто.Cвойства, позволяющие им управлять: Interval – интервал времени в миллисекундах и Enabled – доступность. Свойство Interval задает период срабатывания таймера. Через заданный интервал времени после предыдущего срабатывания, или после программной установки свойства Interval, или после запуска приложения, если значение Interval установлено во время проектирования, таймер срабатывает, вызывая событие OnTimer. В обработчике этого события записываются необходимые операции.

Если задать Interval = 0 или Enabled = false, то таймер перестает работать. Чтобы запустить отсчет времени надо или задать Enabled = true, если установлено положительное значение Interval, или задать положительное значение Interval, если Enabled = true.

2.7.6.1 Исходный код

procedure TForm1.Timer1Timer(Sender: TObject);

// вспомогательная функция, преобразующая МАС адрес к

// “нормальному” виду определяем специальный тип, чтобы

// можно было передать в функцию массив

type

TMAC=array [0..7] of Byte;

// в качестве первого значения массив, второе значение,

// размер данных в массиве

function GetMAC(Value: TMAC; Length: DWORD): string;

var

i: integer;

begin

if Length=0

then Result:=’00-00-00-00-00-00′

else

begin

Result:=”;

for i:=0 to Length-2 do

Result:=Result+IntToHex(Value[i],2)+’-‘;

Result:=Result+IntToHex(Value[Length-1],2);

end;

end;

2.8 Тестирование программы

Рисунок 2.6- Тестирование программы.

Литература

1. Марков Е.П. Программирование в Delhi 7 / Дарахвелидае П.Г.- Марков Е. П – БХВ Петербург.

2. Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям Delphi (+ дискета); М.: Бином, 2006. – 518 c.

3. Бобровский Сергей Delphi 7. Учебный курс; СПб: Питер, 2003. – 736 c

4. . Дарахвелидзе П.Г.; Марков, Е.П. Delphi 2005 для Win32 наиболее полное руководство; БХВ-Петербург,2005.- 209 c.

5. Культин Никита Основы программирования в Delphi 7; СПб: БХВ, 2003. – 608 c

6. Зелковиц М., ШоуА., Геннон Дж. Принципы разработки программного обеспечения/Пер. с англ. – М.: Мир, 1982.-386с.

7. Практическое руководство по программированию/ Пер. с англ. Б.Мик, П. Хит, Н.Рашби и др.; под ред. Б. Мика, П.Хит, Н.Рашби. – М.: Радиосвязь, 1986.-168с.

8. Яфаева Р.Р. Лекции_Программирование

9. Гофман В.Э., Хомоненко А.Д. Delphi. Быстрый старт. – СПб: БХВ-Петербург, 2003. – 288 с.: ил.

10. Документация Delphi 7.0.

Приложение

unit dnip;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Winsock, ExtCtrls, Math;

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

Edit1: TEdit;

Label2: TLabel;

Button2: TButton;

Bevel1: TBevel;

Edit2: TEdit;

Label3: TLabel;

Label4: TLabel;

Bevel2: TBevel;

Button3: TButton;

Edit3: TEdit;

Label5: TLabel;

Label6: TLabel;

Bevel3: TBevel;

Label7: TLabel;

Bevel4: TBevel;

Button4: TButton;

Edit4: TEdit;

Label8: TLabel;

Label9: TLabel;

Button5: TButton;

Edit5: TEdit;

Label10: TLabel;

Label11: TLabel;

Bevel5: TBevel;

Timer1: TTimer;

ListBox1: TListBox;

Button6: TButton;

Label12: TLabel;

Label13: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Label4DblClick(Sender: TObject);

procedure Label1DblClick(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Label6DblClick(Sender: TObject);

procedure Label9DblClick(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Label11DblClick(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure Button6Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

stop_traf: boolean;

count,trafbitin,trafbitout,trafbitold: integer;

implementation

{$R *.dfm}

function IPAddrToName(IPAddr: string): string;

var

SockAddrIn: TSockAddrIn;

HostEnt: PHostEnt;

WSAData: TWSAData;

begin

WSAStartup($101, WSAData);

SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(IPAddr));

HostEnt:=GetHostByAddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);

if HostEnt<>nil

then Result:=StrPas(Hostent^.h_name)

else Result:=”;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Label1.Caption:=’Name: ‘+IPAddrToName(Edit1.Text);

end;

procedure TForm1.Button2Click(Sender: TObject);

var

// Сохраняем оригинальное значение IP адреса

OrgVal: string;

// части оригинального IP

O1,O2,O3,O4: string;

// шестнадцатиричные части

H1,H2,H3,H4: string;

// Здесь будут собраны все шестнадцатиричные части

HexIP: string;

XN: array[1..8] of Extended;

Flt1: Extended;

Xc: Integer;

begin

// Сохраняем в обратном порядке для простого случая

Xn[8]:=IntPower(16,0);Xn[7]:=IntPower(16,1); Xn[6]:=IntPower(16,2);Xn[5]:=IntPower(16,3);

Xn[4]:=IntPower(16,4);Xn[3]:=IntPower(16,5); Xn[2]:=IntPower(16,6);Xn[1]:=IntPower(16,7);

// Сохраняем оригинальный IP адрес

OrgVal:=Edit2.Text;

O1:=Copy(OrgVal,1,Pos(‘.’,OrgVal)-1);Delete(OrgVal,1,Pos(‘.’,OrgVal));

O2:=Copy(OrgVal,1,Pos(‘.’,OrgVal)-1);Delete(OrgVal,1,Pos(‘.’,OrgVal));

O3:=Copy(OrgVal,1,Pos(‘.’,OrgVal)-1);Delete(OrgVal,1,Pos(‘.’,OrgVal));

O4:=OrgVal;

H1:=IntToHex(StrToInt(O1),2);H2:=IntToHex(StrToInt(O2),2);

H3:=IntToHex(StrToInt(O3),2);H4:=IntToHex(StrToInt(O4),2);

// Получаем шестнадцатиричное значение IP адреса

HexIP:=H1+H2+H3+H4;

// Преобразуем это большое шестнадцатиричное значение в переменную Float

Flt1:=0;

for Xc:=1 to 8 do

begin

case HexIP[Xc] of

‘0’..’9′: Flt1:=Flt1+(StrToInt(HexIP[XC])*Xn[Xc]);

‘A’: Flt1:=Flt1+(10*Xn[Xc]);

‘B’: Flt1:=Flt1+(11*Xn[Xc]);

‘C’: Flt1:=Flt1+(12*Xn[Xc]);

‘D’: Flt1:=Flt1+(13*Xn[Xc]);

‘E’: Flt1:=Flt1+(14*Xn[Xc]);

‘F’: Flt1:=Flt1+(15*Xn[Xc]);

end;

end;

Label4.Caption:=’Number: ‘+FloatToStr(Flt1);

end;

procedure TForm1.Label4DblClick(Sender: TObject);

begin

Edit2.Text:=Label4.Caption;

end;

procedure TForm1.Label1DblClick(Sender: TObject);

begin

Edit1.Text:=Label1.Caption;

end;

const

WINSOCK_VERSION=$0101;

procedure TForm1.Button3Click(Sender: TObject);

var

WSAData: TWSAData;

p: PHostEnt;

begin

WSAStartup(WINSOCK_VERSION, WSAData);

p:=GetHostByName(PChar(Edit3.Text));

Label6.Caption:=’IP: ‘+inet_ntoa(PInAddr(p.h_addr_list^)^);

WSACleanup;

end;

// возвращает IP адрес

function LocalIP: string;

type

TaPInAddr=array [0..10] of PInAddr;

PaPInAddr=^TaPInAddr;

var

phe:PHostEnt;

pptr:PaPInAddr;

Buffer:array [0..63] of char;

i:Integer;

GInitData:TWSADATA;

begin

WSAStartup($101, GInitData);

Result:=”;

GetHostName(Buffer, SizeOf(Buffer));

phe:=GetHostByName(buffer);

if phe=nil then Exit;

pptr:=PaPInAddr(Phe^.h_addr_list);

i:=0;

while pptr^[i]<>nil do

begin

result:=StrPas(inet_ntoa(pptr^[i]^));

Inc(i);

end;

WSACleanup;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Label7.Caption:=’Local IP: ‘+LocalIP;

end;

procedure TForm1.Button4Click(Sender: TObject);

var

wsdata: TWSAData;

hostName: array [0..255] of char;

hostEnt: PHostEnt;

addr: PChar;

begin

WSAStartup ($0101, wsdata);

try

GetHostName(hostName, sizeof (hostName));

StrPCopy(hostName,Edit4.Text);

hostEnt:=GetHostByName(hostName);

if Assigned(hostEnt)

then

if Assigned(hostEnt^.h_addr_list)

then

begin

addr:=hostEnt^.h_addr_list^;

if Assigned(addr)

then

begin

Label9.Caption:=Format(‘%d.%d.%d.%d’,[byte(addr[0]),

byte(addr[1]),byte(addr[2]),byte(addr[3])]);

end;

end;

finally

WSACleanup;

end;

end;

procedure TForm1.Label6DblClick(Sender: TObject);

begin

Edit3.Text:=Label6.Caption;

end;

procedure TForm1.Label9DblClick(Sender: TObject);

begin

Edit4.Text:=Label9.Caption;

end;

function IPAddrToCompName(IPAddr: string): string;

var

SockAddrIn: TSockAddrIn;

HostEnt: PHostEnt;

WSAData: TWSAData;

begin

WSAStartup($101, WSAData);

SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(IPAddr));

HostEnt:=gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);

if HostEnt<>nil

then Result:=StrPas(Hostent^.h_name)

else Result:=”;

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

Label11.Caption:=’Name: ‘+IPAddrToCompName(Edit5.Text);

end;

procedure TForm1.Label11DblClick(Sender: TObject);

begin

Edit5.Text:=Label11.Caption;

end;

//////////////////////////////////// Трафик

type

TMibIfRow = packed record

wszName : array[0..255] of WideChar;

dwIndex : DWORD;

dwType : DWORD;

dwMtu : DWORD;

dwSpeed : DWORD; // определяет текущую скорость передачи в битах в секунду

dwPhysAddrLen : DWORD;

bPhysAddr : array[0..7] of Byte; // содержит физический адрес интерфейса (если проще то его, немного видоизмененный, МАС адрес)

dwAdminStatus : DWORD;

dwOperStatus : DWORD;

dwLastChange : DWORD;

dwInOctets : DWORD; // содержит количество байт принятых через интерфейс

dwInUcastPkts : DWORD;

dwInNUCastPkts : DWORD;

dwInDiscards : DWORD;

dwInErrors : DWORD;

dwInUnknownProtos: DWORD;

dwOutOctets : DWORD; // содержит количество байт отправленных интерфейсом

dwOutUCastPkts : DWORD;

dwOutNUCastPkts : DWORD;

dwOutDiscards : DWORD;

dwOutErrors : DWORD;

dwOutQLen : DWORD;

dwDescrLen : DWORD;

bDescr : array[0..255] of Char; // cодержит описание интерфейса

end;

TMibIfArray = array [0..512] of TMibIfRow;

PMibIfRow = ^TMibIfRow;

PMibIfArray = ^TMibIfArray;

type

TMibIfTable = packed record

dwNumEntries: DWORD;

Table : TMibIfArray;

end;

PMibIfTable = ^TMibIfTable;

var

GetIfTable:function(pIfTable: PMibIfTable; pdwSize: PULONG;

bOrder: Boolean): DWORD; stdcall;

//////////////////////////////////// Интерфейсы

function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen:

DWORD;

lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;

lpdwOutBytesReturned: LPDWORD;

lpOverLapped: POINTER;

lpOverLappedRoutine: POINTER): integer; stdcall; external ‘WS2_32.DLL’;

const

SIO_GET_INTERFACE_LIST = $4004747F;

IFF_UP = $00000001;

IFF_BROADCAST = $00000002;

IFF_LOOPBACK = $00000004;

IFF_POINTTOPOINT = $00000008;

IFF_MULTICAST = $00000010;

type

sockaddr_gen = packed record

AddressIn: sockaddr_in;

filler: packed array [0..7] of char;

end;

type

INTERFACE_INFO = packed record

iiFlags: u_long; // Флаги интерфейса

iiAddress: sockaddr_gen; // Адрес интерфейса

iiBroadcastAddress: sockaddr_gen; // Broadcast адрес

iiNetmask: sockaddr_gen; // Маска подсети

end;

function EnumInterfaces(var sInt: string): Boolean;

var

s: TSocket;

wsaD: WSADATA;

NumInterfaces: Integer;

BytesReturned: u_long;

pAddrInet: SOCKADDR_IN;

pAddrString: PChar;

PtrA: pointer;

Buffer: array[0..20] of INTERFACE_INFO;

i: integer;

begin

result:=true; // инициализируем переменную

sInt:=”;

WSAStartup($0101, wsaD); // запускаем WinSock

// здесь можно дабавить различные обработчики ошибки

s:=Socket(AF_INET, SOCK_STREAM, 0); // открываем сокет

if (s=INVALID_SOCKET)

then Exit;

try // вызываем WSAIoCtl

PtrA:=@bytesReturned;

if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer,

1024, PtrA, nil, nil)<>SOCKET_ERROR)

then

begin // если OK, то определяем количество существующих интерфейсов

NumInterfaces:=BytesReturned div SizeOf(INTERFACE_INFO);

for i:=0 to NumInterfaces-1 do // для каждого интерфейса

begin

pAddrInet:=Buffer[i].iiAddress.AddressIn; // IP адрес

pAddrString:=inet_ntoa(pAddrInet.sin_addr);

if pAddrString<>’127.0.0.1′

then

begin

sInt:=sInt+’IP = ‘+pAddrString+’, ‘+#10#13;

// pAddrInet:=Buffer[i].iiNetMask.AddressIn; // маска подсети

// pAddrString:=inet_ntoa(pAddrInet.sin_addr);

// sInt:=sInt+’ Mask=’+pAddrString+’,’;

end

else sInt:=’IP = “localhost”‘;

end;

end;

except

//

end;

// закрываем сокеты

CloseSocket(s);

WSACleanUp;

result:=false;

end;

function BytesToString(Value: integer): string;

const

OneKB=1024;

OneMB=OneKB*1024;

OneGB=OneMB*1024;

begin

if Value<OneKB

then Result:=FormatFloat(‘#,##0.00 B’,Value)

else

if Value<OneMB

then Result:=FormatFloat(‘#,##0.00 KB’, Value/OneKB)

else

if Value<OneGB

then Result:=FormatFloat(‘#,##0.00 MB’, Value/OneMB)

end;

procedure TForm1.Timer1Timer(Sender: TObject);

// вспомогательная функция, преобразующая МАС адрес к

// “нормальному” виду определяем специальный тип, чтобы

// можно было передать в функцию массив

type

TMAC=array [0..7] of Byte;

// в качестве первого значения массив, второе значение,

// размер данных в массиве

function GetMAC(Value: TMAC; Length: DWORD): string;

var

i: integer;

begin

if Length=0

then Result:=’00-00-00-00-00-00′

else

begin

Result:=”;

for i:=0 to Length-2 do

Result:=Result+IntToHex(Value[i],2)+’-‘;

Result:=Result+IntToHex(Value[Length-1],2);

end;

end;

var

FLibHandle: THandle;

Table: TMibIfTable;

i, Size: integer;

s,trafnormin,trafnormout: string;

begin

Timer1.Enabled:=false; // приостанавливаем на всякий случай таймер

ListBox1.Items.BeginUpdate;

ListBox1.Items.Clear; // очищаем список

FLibHandle:=LoadLibrary(‘IPHLPAPI.DLL’); // загружаем библиотеку

if FLibHandle=0

then Exit;

@GetIfTable:=GetProcAddress(FLibHandle, ‘GetIfTable’);

if not Assigned(GetIfTable)

then

begin

FreeLibrary(FLibHandle);

Close;

end;

//

Size:=SizeOf(Table);

if GetIfTable(@Table,@Size,false)=0

then // выполняем функцию

for i:=0 to Table.dwNumEntries-1 do // кол-во сетевых карт

begin

with ListBox1.Items do

begin // выводим результаты

// if string(GetMAC(TMAC(Table.Table[i].bPhysAddr),Table.Table[i].dwPhysAddrLen))<>’00-00-00-00-00-00′ // сравнение MAC адресов

// then

begin

Add(‘Description: ‘+string(Table.Table[i].bDescr)); // наименование интерфейса

Add(‘MAC-adress: ‘+string(GetMAC(TMAC(Table.Table[i].bPhysAddr),Table.Table[i].dwPhysAddrLen))); // МАС адрес

// перевод к нормальным единицам “Входящего” трафика

trafbitin:=Table.Table[i].dwInOctets; // всего принято байт

trafnormin:=BytesToString(trafbitin);

// перевод к нормальным единицам “Исходящего” трафика

trafbitout:=Table.Table[i].dwOutOctets; // всего отправлено байт

trafnormout:=BytesToString(trafbitout);

////////////////////////////////////// сброс трафика

if stop_traf=true

then

begin

trafbitold:=trafbitin;

trafnormin:=’0,00 B’;

trafnormout:=’0,00 B’;

end;

//

if trafbitin>=trafbitold // новый трафик больше старого

then

begin

trafbitin:=trafbitin-trafbitold;

trafnormin:=BytesToString(trafbitin);

end

else // новый трафик меньше старого

begin

trafbitin:=trafbitold;

trafnormin:=BytesToString(trafbitin);

end;

/////////////////////////////////////

Add(‘In (Byte): ‘+trafnormin); // всего принято байт

Add(‘Out (Byte): ‘+trafnormout); // всего отправлено байт

Add(‘————————————————-‘); //

end;

end;

end;

//

EnumInterfaces(s);

ListBox1.Items.Add(s);

//

ListBox1.Items.EndUpdate;

FreeLibrary(FLibHandle);

Timer1.Enabled:=true; // не забываем активировать таймер

end;

procedure TForm1.Button6Click(Sender: TObject);

begin

if stop_traf=false then stop_traf:=true

else stop_traf:=false;

end;

end.

Поделиться статьёй
Поделиться в telegram
Поделиться в whatsapp
Поделиться в vk
Поделиться в facebook
Поделиться в twitter
Леонид Федотов
Леонид Федотов
Окончил НИУ ВШЭ факультет компьютерных наук. Сам являюсь кандидатом наук. По специальности работаю 13 лет, за это время создал 8 научных статей и 2 диссертации. В компании подрабатываю в свободное от работы время уже более 5 лет. Нравится помогать школьникам и студентам в решении контрольных работ и написании курсовых проектов. Люблю свою профессию за то, что это направление с каждым годом становится все более востребованным и актуальным.

Ещё статьи

Нет времени делать работу? Закажите!
Вид работы
Тема
Email

Отправляя форму, вы соглашаетесь с политикой конфиденциальности и обработкой ваших персональных данных.