unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls,WinSock, ImgList, ToolWin, ExtCtrls, Menus;

type
  Tform2 = class(TForm)
    ListView1: TListView;
    Panel1: TPanel;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    btReedFile: TToolButton;
    ToolButton3: TToolButton;
    ToolButton5: TToolButton;
    btDelete: TToolButton;
    ToolButton8: TToolButton;
    ImageList1: TImageList;
    ToolButton10: TToolButton;
    ToolButton4: TToolButton;
    ToolButton2: TToolButton;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    IP1: TMenuItem;
    Edit1: TEdit;
    procedure btReedFileClick(Sender: TObject);
    procedure ToolButton4Click(Sender: TObject);
    procedure ToolButton5Click(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btDeleteClick(Sender: TObject);
    procedure ListView1Click(Sender: TObject);
    procedure ToolButton8Click(Sender: TObject);
    procedure ListView1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure IP1Click(Sender: TObject);
    procedure Edit1DblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  //--------------------
  procedure rescet;
  procedure beeper;
  //-----------------
type
PNetResourceArray = ^TNetResourceArray;
TNetResourceArray = array[0..MaxInt div SizeOf(TNetResource) - 1] of TNetResource;
type
  TWindowsVersion = ( wv31, wv95, wv98, wvNT, wvY2K, wvXP );


var
  form2: Tform2;

implementation
uses unit1, Unit3;
{$R *.dfm}
 
  var
   WSAData : TWSAData;
   comname,localnam,koment:array[0..30] of string;
   ipn:array[0..30] of string;
    nomip:integer;
    colmashin:integer;
    posic:integer;
     intpos:integer;//замена IP
    //-----------------------------
Procedure EnumResources(LpNR:PNetResource);
Var
NetHandle: THandle;
BufSize: Integer;
Size: Integer;
NetResources: PNetResourceArray;
Count: integer;
NetResult:Integer;
I: Integer;
  p : PHostEnt;
   ip:string;
   stName:string; 
Begin
//nomip:=0;
//-----------------------------------
If WNetOpenEnum( //начинает перечисление сетевых ресурсов или существующих связей
RESOURCE_GLOBALNET,//ОБЛАСТЬ перечисления
RESOURCETYPE_ANY,// типов ресурса
// RESOURCETYPE_ANY - все ресурсы
// RESOURCETYPE_DISK - диски
// RESOURCETYPE_PRINT - принтеры
0,//использование ресурса
LpNR,//указатель в структуру ресурса
NetHandle) <> NO_ERROR then Exit; //указатель буфера

Try
BufSize := 50 * SizeOf(TNetResource);
GetMem(NetResources, BufSize);
Try
while True do
begin
Count := -1;
Size := BufSize;
NetResult:= WNetEnumResource( //продолжает  перечисления начатый функцией WNetOpenEnum
NetHandle,// handle to enumeration
 cardinal(Count),// pointer to entries to list
  NetResources, // pointer to buffer for results
  cardinal(Size)); // pointer to buffer size variable
If NetResult = ERROR_MORE_DATA then
begin
BufSize := Size;
ReallocMem(NetResources, BufSize);
Continue;
end;
if NetResult <> NO_ERROR then Exit;
For I := 0 to Count-1 do
Begin
WSAStartup($0101, WSAData);//инициализирует разъем
//-------------------------------
With NetResources^[I] do //масив Структур NETRESOURCE возвращана перечисления ресурсов в сети
Begin
If RESOURCEUSAGE_CONTAINER =
(DwUsage and RESOURCEUSAGE_CONTAINER) then
EnumResources(@NetResources^[I]);

If  NetResources^[I].dwDisplayType = RESOURCEDISPLAYTYPE_SERVER   Then
// ^^^^^^^^^^^^^^^^^^^^^^^^^ - ресурс
// RESOURCEDISPLAYTYPE_SERVER - компьютер
// RESOURCEDISPLAYTYPE_DOMAIN - рабочая группа //объект должен быть отображен как область
// RESOURCEDISPLAYTYPE_GENERIC - сеть//объект не имеет значения
// NetResources^[I].lpLocalName
Begin
 stName:=pchar(LpRemoteName);
  stName:=copy(stname,3,20);
try
  p:= GetHostByName(pchar(stName));
  if p=nil then begin ip:='192.168.??.??';
        messagebox(form2.Handle,'    У Вас не Win-2000'+chr(13)+' измените имена машин по английски',' Ужасная ошибка',0+MB_ICONINFORMATION+MB_APPLMODAL);
  end
 else
  ip:=inet_ntoa(PInAddr(p.h_addr_list^)^);
//-------------------------------------------------------
    nomip :=nomip+1;
    comname[nomip]:=stName;
    koment[nomip]:=lpComment;
    localnam[nomip]:=lpLocalName;
    ipn[nomip]:= ip;
except
messagebox(form1.Handle,'    У Вас не Win-2000'+chr(13)+' измените имена машин по английски',' Ужасная ошибка',0+MB_ICONINFORMATION+MB_APPLMODAL);
end;
End;
End;
 WSACleanup;
End
End;
finally
FreeMem(NetResources, BufSize);
end;
finally
 colmashin:=nomip;
 WNetCloseEnum(NetHandle);//заканчивает сетевое перечисление ресурса начатое функцией WNetOpenEnum.
end;
End;
/////------------------------------------------------------------------------------
procedure rescet;
Var
OldCursor: TCursor;
begin
OldCursor:= Screen.Cursor;
Screen.Cursor:= crHourGlass;//изменить курсор
EnumResources(nil);//сканирование сети
Screen.Cursor:= OldCursor;
end;
//////////////////////////////////////////////////////////////////
function WinVer : TWindowsVersion;
{* Returns Windows version. }
var OVI: TOsVersionInfo;
begin
  OVI.dwOSVersionInfoSize := Sizeof( OVI );
  GetVersionEx( OVI );
  with OVI do
  if dwPlatformId = VER_PLATFORM_WIN32_NT then
  begin
    Result := wvNT;
    if dwMajorVersion >= 5 then
    if dwMinorVersion >=1 then
      Result := wvXP
    else
      Result := wvY2K;
  end
     else
  if dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then
  begin
    Result := wv95;
    if (dwMajorVersion > 4) or (dwMajorVersion = 4)
    and (dwMinorVersion >= 10)  then
      Result := wv98;
  end
     else
     Result := wv31; // Windows 3.1 (WIN32s)
end;

///////////////////////звук динамика////////////////////////////////////
procedure SpeakerBeep( Freq: Word; Duration: DWORD );
begin
  if WinVer >= wvNT then
    Windows.Beep( Freq, Duration )
  else
  begin
    if Freq < 18 then Exit;
    Freq := 1193181 div Freq;
    if Freq = 0 then Exit;
    asm          //начать
        mov al,0b6H
        out 43H,al
        mov ax,Freq
        //xchg al, ah
        out 42h,al
        xchg al, ah
        out 42h,al
        in  al,61H
        or  al,03H
        out 61H,al
    end;
    Sleep(Duration);//ждать
    asm     //остановить
        in  al,61H
        and al,0fcH
        out 61H,al
    end;
  end;
end;


procedure beeper;
begin
SpeakerBeep(1000,100);
sleep(200);
SpeakerBeep(800,100);
sleep(200);
 SpeakerBeep(600,100);
sleep(200);
SpeakerBeep(500,300);
end;
/////////-------------------------------------------------------
procedure openform(count:integer);
 var
  I: Integer;
  ListItem: TListItem;

begin
if  form2.ListView1.Columns.Count>0 then form2.ListView1.Columns.Clear;
    form2.ListView1.Font.Size:=12;
    form2.ListView1.Columns.Add.Caption:='Имя';
    form2.ListView1.Columns.Add.Caption:='IP-адрес';
    form2.ListView1.Column[0].Width:=200;
    form2.ListView1.Column[1].Width:=184;
    form2.ListView1.ViewStyle := vsReport;
  if  colmashin>0 then begin
   with form2.ListView1 do
   begin
  for I:=0 to colmashin-1 do begin
      showrecord(i);
      ListItem:= Items.Add;
      Listitem.Caption := zapisdata.name;//
      ListItem.ImageIndex := 1;
       ListItem.SubItems.Add(zapisdata.fIP);
    end;
    end;
    end;
end;
///////////////////////////////////////////////////////

procedure Tform2.btReedFileClick(Sender: TObject);
begin
 ListView1.Clear;
 showrecord(0);
 colmashin:=filesize(zapisfile)-1;
 openform(colmashin);
ToolButton3.Enabled:=true;
end;

procedure Tform2.ToolButton4Click(Sender: TObject);
begin
ToolButton3.Enabled:=false;
form2.Close;
end;

procedure Tform2.ToolButton5Click(Sender: TObject);
var n:integer;
begin
nomip:=0;
 ListView1.Clear;
rescet;
  openform(colmashin);
   ListView1.Clear;
if colmashin >0 then begin
  for n:=0 to colmashin do begin
 ListView1.Items.Add.Caption := comname[n];
 ListView1.Items.Item[n].SubItems.Text:= ipn[n];
 end;
  ListView1.Items.Item[0].Destroy;

ToolButton3.Enabled:=true;
 end
 else messagebox(form2.Handle,'сеть недоступна!','  проверь',0+MB_ICONSTOP+MB_APPLMODAL);

end;
/////////////сохранение /////////////////////////
procedure Tform2.ToolButton3Click(Sender: TObject);
var n:integer;
strIP:string;
begin
 colmashin:=ListView1.Items.Count-1;
if  edit1.Visible then
 begin
 ListView1.Items.Item[intpos].SubItems.Text:=edit1.Text;
 edit1.Visible:=false;
 end;
//ListView1.Items.Item[1].CancelEdit;
  for n:=0 to colmashin do
  begin
  zapisdata.name:=ListView1.Items.Item[n].Caption;
  zapisdata.fIP:=ListView1.Items.Item[n].SubItems.Strings[0];
  saverecord(n);//
  end;

form1.ListView1.Clear;
 form2.Close;
ToolButton3.Enabled:=false;
creatButton;//создать кнопки

end;

procedure Tform2.FormCreate(Sender: TObject);
begin
ToolButton3.Enabled:=false;
edit1.Visible:=false;
end;
/////////////удаление строки /////////////////
procedure Tform2.btDeleteClick(Sender: TObject);
var i: integer;
begin
ListView1.Items.Item[ListView1.Selected.Index].Delete;
posic:=filesize(zapisfile)-1;
Seek(zapisfile,posic);
truncate(zapisfile);
end;

procedure Tform2.ListView1Click(Sender: TObject);
var   ListItem: TListItem;
begin
posic:=ListView1.Selected.Index;
try
if  edit1.Visible then
 begin
 ListView1.Items.Item[intpos].SubItems.Text:=edit1.Text;
 edit1.Visible:=false;
 end;
except
 posic:=0;
end;
end;
///////// добавить строку //////////////
procedure Tform2.ToolButton8Click(Sender: TObject);
var n:integer;
begin
 colmashin:=ListView1.Items.Count-1;
 for n:=0 to colmashin do
  begin
  zapisdata.name:=ListView1.Items.Item[n].Caption;
  zapisdata.fIP:=ListView1.Items.Item[n].SubItems.Strings[0];
  saverecord(n);//
  end;
//--------------------------
posic:=filesize(zapisfile);
seek(zapisfile,posic);
zapisData.name:='';
zapisData.fIP:='192.168.00.00';

write(zapisFile,zapisData);
 btReedFile.Click;//обновить
end;
var p:TPoint;
procedure Tform2.ListView1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
GetCursorPos(p);
if button=mbRight then popupmenu1.Popup(p.X,p.Y);
end;

procedure Tform2.N1Click(Sender: TObject);
begin
btDelete.Click;
end;

procedure Tform2.N2Click(Sender: TObject);
begin
ToolButton8.Click;
end;

procedure savip(nom:integer);
 begin
  showrecord(nom);
  zapisdata.name:=form2.ListView1.Items.Item[nom].Caption;
  zapisdata.fIP:=form2.edit1.text;//strIP;
  saverecord(nom);//
 end;
//////////////////////////////////////////////////////////////
procedure Tform2.IP1Click(Sender: TObject);
begin
intpos:=ListView1.Selected.Index;
ListView1.Items.Item[intpos].Position;
savip(intpos);
edit1.Visible:=true;
edit1.Top:=ListView1.Items.Item[intpos].Position.Y+85;//   intpos*33+114;
edit1.Left:=220;
end;

procedure Tform2.Edit1DblClick(Sender: TObject);
begin
savip(intpos);
edit1.Visible:=false;
end;

end.
