Разработка программы "Domain name, IP" для технического института
Принципы идентификации компьютеров в глобальной сети Internet. Алгоритм и листинг программы "Domain name, IP" для определения IP-адресов и доменных имен в сети института. Проектирование программного продукта в среде разработки Delphi для Windows.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 24.07.2014 |
Размер файла | 586,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
- 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.
Размещено на Allbest.ru
Подобные документы
Основные характеристики и алгоритмы настройки виртуальной локальной вычислительной сети VLAN, протоколов маршрутизации, системы доменных имен и трансляции сетевых адресов с целью разработки корпоративной сети в среде имитационного моделирования.
курсовая работа [556,1 K], добавлен 23.04.2011Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.
курсовая работа [1,2 M], добавлен 04.08.2014Приемы программирования в Delphi. Алгоритм поиска альфа-бета отсечения, преимущества. Описание программного средства. Разработка программы, реализующая алгоритм игры "реверси". Руководство пользователя. Листинг программы. Навыки реализации алгоритмов.
курсовая работа [357,1 K], добавлен 28.02.2011Internet. Протоколы сети Internet. Принцип работы Internet. Прикладные программы. Возможности в Internet? Правовые нормы. Политика и Internet. Этические нормы и частная коммерческая Internet. Соображения безопасности. Объем сети Internet.
дипломная работа [128,8 K], добавлен 23.06.2007Принципы формирования имен в сети Internet, элементы браузера Internet Explorer. Добавление Web-страницы в список избранных. Средства ускорения доступа к часто посещаемым страницам. Способы обеспечения доступа к ресурсам сети Internet в автономном режиме.
лабораторная работа [3,4 M], добавлен 24.05.2015Особенности алгоритмов, критерии качества. Создание и применение программного продукта на языке Delphi. Тип операционной системы. Внутренняя структура программного продукта. Руководство пользователя и программиста, расчет себестоимости и цены программы.
дипломная работа [1,5 M], добавлен 12.06.2009Стадии разработки сайта для научно-производственного предприятия "Этна – Информационные технологии" с целью его последующего размещения в глобальной сети. Сайт представляет собой справочно-информационную систему. Алгоритм метода доступа к Internet.
дипломная работа [747,1 K], добавлен 20.05.2013Средства Delphi для разработки Windows приложений. Математическая формулировка задачи, описание программы вычисления определенного интеграла по формуле левых прямоугольников. Руководство пользователя, методика испытаний продукта. Листинг программы.
курсовая работа [178,1 K], добавлен 14.11.2010Оптимизация компьютеров с помощью программы Auslogics Boostspeed. Установка операционной системы Windows XP и программы Microsoft Office 2010. Настройка локальной сети в компьютерном кабинете. Установка и обновление антивирусной программы NOD 32.
отчет по практике [4,4 M], добавлен 06.04.2015Назначение и область применения промышленных роботов. Разработка программы "Кинематическое движение" в среде Delphi для определения основных параметров кинематического движения. Описание работы и листинг программы. Руководство программиста и оператора.
курсовая работа [499,1 K], добавлен 17.11.2014