📄 网络和通讯编程.htm
字号:
property Display: TNetDisplay read FDisplay;<br> property Usage: TNetUsage read FUsage;<br> property LocalName: string read FLocalName;<br> property RemoteName: string read FRemoteName;<br> property Comment: string read FComment;<br> property Provider: string read FProvider;<br> property SubItems: TNetworkItems read FSubItems;<br> end;<br> TNetworkItems = class<br> private<br> FList: TList;<br> procedure SetItem(Index: Integer; Value: TNetworkItem);<br> function GetItem(Index: Integer): TNetworkItem;<br> function GetCount: Integer;<br> public<br> constructor Create;<br> destructor Destroy; override;<br> procedure Clear;<br> procedure Add(Item: TNetworkItem);<br> procedure Delete(Index: Integer);<br> property Items[Index: Integer]: TNetworkItem read GetItem write<br> SetItem; default;<br> property Count: Integer read GetCount;<br> end;<br> TNetworkBrowser = class(TComponent)<br> private<br> FItems: TNetworkItems;<br> FScope: TNetScope;<br> FResourceType: TNetResourceType;<br> FUsage: TNetUsage;<br> FActive: Boolean;<br> procedure Refresh;<br> procedure SetActive(Value: Boolean);<br> procedure SetScope(Value: TNetScope);<br> procedure SetResourceType(Value: TNetResourceType);<br> procedure SetUsage(Value: TNetUsage);<br> procedure EnumerateNet(NetItems: TNetworkItems; lpnr: PNetResource);<br> protected<br> public<br> constructor Create(AOwner: TComponent); override;<br> destructor Destroy; override;<br> procedure Open;<br> procedure Close;<br> property Items: TNetworkItems read FItems;<br> published<br> property Scope: TNetScope read FScope write SetScope default nsGlobal;<br> property ResourceType: TNetResourceType read FResourceType<br> write SetResourceType default nrAny;<br> property Usage: TNetUsage read FUsage write SetUsage default [];<br> property Active: Boolean read FActive write SetActive default False;<br> end;<br> implementation<br> type<br> PNetResourceArray = ^TNetResourceArray;<br> TNetResourceArray = array[0..0] of TNetResource;<br> { TNetworkItem }<br> constructor TNetworkItem.Create;<br> begin<br> inherited;<br> FSubItems := TNetworkItems.Create;<br> end;<br> destructor TNetworkItem.Destroy;<br> begin<br> if FSubItems <> nil then<br> FSubItems.Free;<br> inherited;<br> end;<br> { TNetworkItems }<br> constructor TNetworkItems.Create;<br> begin<br> inherited;<br> FList := TList.Create;<br> end;<br> destructor TNetworkItems.Destroy;<br> begin<br> Clear;<br> if FList <> nil then<br> FList.Free;<br> inherited;<br> end;<br> procedure TNetworkItems.SetItem(Index: Integer; Value: TNetworkItem);<br> begin<br> if (FList.Items[Index] <> nil) and (FList.Items[Index] <> Value) then<br> TNetworkItem(FList.Items[Index]).Free;<br> FList.Items[Index] := Value;<br> end;<br> function TNetworkItems.GetItem(Index: Integer): TNetworkItem;<br> begin<br> Result := TNetworkItem(FList.Items[Index]);<br> end;<br> procedure TNetworkItems.Clear;<br> begin<br> while Count > 0 do<br> Delete(0);<br> end;<br> procedure TNetworkItems.Add(Item: TNetworkItem);<br> begin<br> FList.Add(Item);<br> end;<br> procedure TNetworkItems.Delete(Index: Integer);<br> begin<br> if FList.Items[Index] <> nil then<br> TNetworkItem(FList.Items[Index]).Free;<br> FList.Delete(Index);<br> end;<br> function TNetworkItems.GetCount: Integer;<br> begin<br> if FList <> nil then<br> Result := FList.Count<br> else<br> Result := 0;<br> end;<br> { TNetworkBrowser }<br> constructor TNetworkBrowser.Create(AOwner: TComponent);<br> begin<br> inherited Create(AOwner);<br> FItems := TNetworkItems.Create;<br> FScope := nsGlobal;<br> FResourceType := nrAny;<br> FUsage := [];<br> end;<br> destructor TNetworkBrowser.Destroy;<br> begin<br> if FItems <> nil then<br> FItems.Free;<br> inherited;<br> end;<br> procedure TNetworkBrowser.EnumerateNet(NetItems: TNetworkItems; lpnr:<br> PNetResource);<br> var<br> dwResult, dwResultEnum: Integer;<br> hEnum: THandle;<br> cbBuffer, cEntries, i: Integer;<br> nrArray: PNetResourceArray;<br> NewItem: TNetworkItem;<br> dwScope, dwType, dwUsage: Integer;<br> begin<br> cbBuffer := 16384;<br> cEntries := $FFFFFFFF;<br> case FScope of<br> nsConnected: dwScope := RESOURCE_CONNECTED;<br> nsGlobal: dwScope := RESOURCE_GLOBALNET;<br> nsRemembered: dwScope := RESOURCE_REMEMBERED;<br> nsContext: dwScope := RESOURCE_CONTEXT;<br> else<br> dwScope := RESOURCE_GLOBALNET;<br> end;<br> case FResourceType of<br> nrAny: dwType := RESOURCETYPE_ANY;<br> nrDisk: dwType := RESOURCETYPE_DISK;<br> nrPrint: dwType := RESOURCETYPE_PRINT;<br> else<br> dwType := RESOURCETYPE_ANY;<br> end;<br> dwUsage := 0;<br> if nuConnectable in FUsage then<br> dwUsage := dwUsage or RESOURCEUSAGE_CONNECTABLE;<br> if nuContainer in FUsage then<br> dwUsage := dwUsage or RESOURCEUSAGE_CONTAINER;<br> dwResult := WNetOpenEnum(dwScope, dwType, dwUsage, lpnr, hEnum);<br> if dwResult <> NO_ERROR then Exit;<br> GetMem(nrArray, cbBuffer);<br> repeat<br> dwResultEnum := WNetEnumResource(hEnum, cEntries, nrArray, cbBuffer);<br> if dwResultEnum = NO_ERROR then<br> for i := 0 to cEntries-1 do<br> begin<br> NewItem := TNetworkItem.Create;<br> case nrArray[i].dwScope of<br> RESOURCE_CONNECTED: NewItem.FScope := nsConnected;<br> RESOURCE_GLOBALNET: NewItem.FScope := nsGlobal;<br> RESOURCE_REMEMBERED: NewItem.FScope := nsRemembered;<br> RESOURCE_CONTEXT: NewItem.FScope := nsContext;<br> else<br> NewItem.FScope := nsGlobal;<br> end;<br> case nrArray[i].dwType of<br> RESOURCETYPE_ANY: NewItem.FResourceType := nrAny;<br> RESOURCETYPE_DISK: NewItem.FResourceType := nrDisk;<br> RESOURCETYPE_PRINT: NewItem.FResourceType := nrPrint;<br> else<br> NewItem.FResourceType := nrAny;<br> end;<br> case nrArray[i].dwDisplayType of<br> RESOURCEDISPLAYTYPE_GENERIC: NewItem.FDisplay := ndGeneric;<br> RESOURCEDISPLAYTYPE_DOMAIN: NewItem.FDisplay := ndDomain;<br> RESOURCEDISPLAYTYPE_SERVER: NewItem.FDisplay := ndServer;<br> RESOURCEDISPLAYTYPE_SHARE: NewItem.FDisplay := ndShare;<br> RESOURCEDISPLAYTYPE_FILE: NewItem.FDisplay := ndFile;<br> RESOURCEDISPLAYTYPE_GROUP: NewItem.FDisplay := ndGroup;<br> RESOURCEDISPLAYTYPE_NETWORK: NewItem.FDisplay := ndNetwork;<br> RESOURCEDISPLAYTYPE_ROOT: NewItem.FDisplay := ndRoot;<br> RESOURCEDISPLAYTYPE_SHAREADMIN: NewItem.FDisplay :=<br> ndShareAdmin;<br> RESOURCEDISPLAYTYPE_DIRECTORY: NewItem.FDisplay :=<br> ndDirectory;<br> RESOURCEDISPLAYTYPE_TREE: NewItem.FDisplay := ndTree;<br> RESOURCEDISPLAYTYPE_NDSCONTAINER: NewItem.FDisplay :=<br> ndNDSContainer;<br> else<br> NewItem.FDisplay := ndGeneric;<br> end;<br> NewItem.FUsage := [];<br> if nrArray[i].dwUsage and RESOURCEUSAGE_CONNECTABLE <> 0 then<br> Include(NewItem.FUsage, nuConnectable);<br> if nrArray[i].dwUsage and RESOURCEUSAGE_CONTAINER <> 0 then<br> Include(NewItem.FUsage, nuContainer);<br> NewItem.FLocalName := StrPas(nrArray[i].lpLocalName);<br> NewItem.FRemoteName := StrPas(nrArray[i].lpRemoteName);<br> NewItem.FComment := StrPas(nrArray[i].lpComment);<br> NewItem.FProvider := StrPas(nrArray[i].lpProvider);<br> NetItems.Add(NewItem);<br> // if container, call recursively<br> if (nuContainer in NewItem.FUsage) and (FScope <> nsContext) then<br> EnumerateNet(NewItem.FSubItems, @nrArray[i])<br> end;<br> until dwResultEnum = ERROR_NO_MORE_ITEMS;<br> FreeMem(nrArray);<br> WNetCloseEnum(hEnum);<br> end;<br> procedure TNetworkBrowser.Refresh;<br> begin<br> FItems.Clear;<br> if FActive then<br> EnumerateNet(FItems, nil);<br> end;<br> procedure TNetworkBrowser.SetActive(Value: Boolean);<br> begin<br> if Value <> FActive then<br> begin<br> FActive := Value;<br> Refresh;<br> end;<br> end;<br> procedure TNetworkBrowser.SetScope(Value: TNetScope);<br> begin<br> if Value <> FScope then<br> begin<br> FScope := Value;<br> Refresh;<br> end;<br> end;<br> procedure TNetworkBrowser.SetResourceType(Value: TNetResourceType);<br> begin<br> if Value <> FResourceType then<br> begin<br> FResourceType := Value;<br> Refresh;<br> end;<br> end;<br> procedure TNetworkBrowser.SetUsage(Value: TNetUsage);<br> begin<br> if Value <> FUsage then<br> begin<br> FUsage := Value;<br> Refresh;<br> end;<br> end;<br> procedure TNetworkBrowser.Open;<br> begin<br> Active := True;<br> end;<br> procedure TNetworkBrowser.Close;<br> begin<br> Active := False;<br> end;<br> end.<br> </td> </tr></table><p align="center"> </p></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -