Программирование гнёзд. Получаем локальный IP адрес:
Сегодня мы рассмотрим маленький, но удаленький примерчик. В нём программа возвращает все установленые IP адреса для сетевых плат или удалённого доступа. Помимо этого, ты узнаешь, как обращатся к компонентам не по имени, а по "индексу", это очень удобная и нужная возможность.
Рис 1. Форма
Для примера брось на форму одну кнопку и несколько компонентов TEdit (например моя форма на рис 1). Для кнопки создай обработчик OnClick и напиши там:
procedure TForm1.Button1Click(Sender: TObject);
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);
//Получаем имя локального компьютера (хоста)
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
//Вывести адрес
TEdit(FindComponent('Edit'+IntToStr(i+1))).Text:=inet_ntoa(pptr^[I]^);
Inc(I);
end;
//Закрываем сокет
WSACleanup;
end;
На рисунке 1 показана запущенная прога. Как видишь у меня стоит два адреса, потому что у меня стоит Win2000 и две сетевухи на 10 и 100 мбит/сек.
Самым интересным является вывод результата TEdit(FindComponent('Edit'+IntToStr(i+1))).Text:=inet_ntoa(pptr^[I]^). Здесь я использую функцию FindComponent, которая ищет компонент на форме по имени. В качестве параметра я должен передать имя компонента, например, 'Edit1'. Но я делаю хитрее и передаю имя 'Edit' плюс индекс приведённый к строке IntToStr(i+1). В итоге на первом этапе я буду искать FindComponent('Edit1'), на втором этапе FindComponent('Edit2') и так далее.
Найденный с помощью функции FindComponent компонент я привожу к TEdit с помощью TEdit(FindComponent('Edit'+IntToStr(i+1))). А далее использую всю эту конструкцию, как простой TEdit компонент:
Расмотрим ещё пример. Допустим у тебя стоит пять компонентов CheckBox с именами CheckBox1, CheckBox2, CheckBox3 и так далее. Чтобы перебрать все эти компоненты и узнать какой из них выделен нужно сделать так:
for i:=1 to 5 do
if TCheckBox(FindComponent('CheckBox'+IntToStr(i+1))).Checked then
begin
//i-й компонент CheckBox выделен.
end;
Вот и всё, что я хотел тебе сегодня расказать. Мало, но интересно.