Форум: "Основная";
Текущий архив: 2002.01.10;
Скачать: [xml.tar.bz2];
ВнизNew заморочка от Русского ;) Найти похожие ветки
← →
Русский (2001-12-21 21:54) [0]Есть процедура:
procedure EnumResource;
begin
...
if Assigned(OnEnumResource) then OnEnumResource(Self, Buf);
...
end;
Соотв. есть обработчик:
procedure OnEnumResource(Sender: TObject; Buf: TNetworkResource);
// где TNetworkResource - мой класс.
Итак трабла: значения из полей Buf - читаются, а если ими заполнять
List, примерно так:
...
List.Add(Buf);
...
При чтении из этого List"а получаем, что в каждом элементе, почему - то
одинаковые значения, причём каждый элемент - равен последнему элементу,
засунутому в List. А без List"а - процедура работает!!!
← →
Иван Шихалев (2001-12-21 22:12) [1]А строчка:
Buf := TNetworkResource.Create;
наличествует вEnumResource
?
← →
evgeg (2001-12-21 22:12) [2]Приведи кусок кода.
Наверняка у тебя список заполняется укзателями на один и тот же объект.
← →
Русский (2001-12-21 23:17) [3]Вообще, спасибо, что откликнулись; Вроде всё сделал, а тут трабла такая :()
Tо Иван Шихалев >>
Ета строчка наличествует :)))
To evgeg >> А вот и он:
// Типы для описания полей, класса TNetworkResource.
TResourceDisplayType = (RESOURCEDISPLAYTYPE_GENERIC, RESOURCEDISPLAYTYPE_DOMAIN, RESOURCEDISPLAYTYPE_SERVER, RESOURCEDISPLAYTYPE_SHARE,
RESOURCEDISPLAYTYPE_FILE, RESOURCEDISPLAYTYPE_GROUP, RESOURCEDISPLAYTYPE_NETWORK, RESOURCEDISPLAYTYPE_ROOT,
RESOURCEDISPLAYTYPE_SHAREADMIN, RESOURCEDISPLAYTYPE_DIRECTORY, RESOURCEDISPLAYTYPE_TREE, RESOURCEDISPLAYTYPE_NDSCONTAINER);
TResourceScope = (RESOURCE_CONNECTED, RESOURCE_GLOBALNET, RESOURCE_REMEMBERED);
TResourceType = (RESOURCETYPE_ANY, RESOURCETYPE_DISK, RESOURCETYPE_PRINT);
TResourceUsage = (RESOURCEUSAGE_ALL, RESOURCEUSAGE_CONNECTABLE, RESOURCEUSAGE_CONTAINER);
// Класс для описания сетевого ресурса.
TNetworkResource = class(TPersistent)
private
FScope: TResourceScope;
FType: TResourceType;
FDisplayType: TResourceDisplayType;
FUsage: TResourceUsage;
FLocalName: string;
FRemoteName: string;
FComment: string;
FProvider: string;
public
procedure Assign(Source: TNetResource);
published
property dwScope: TResourceScope read FScope write FScope;
property dwType: TResourceType read FType write FType;
property dwDisplayType: TResourceDisplayType read FDisplayType write FDisplayType;
property dwUsage: TResourceUsage read FUsage write FUsage;
property lpLocalName: string read FLocalName write FLocalName;
property lpRemoteName: string read FRemoteName write FRemoteName;
property lpComment: string read FComment write FComment;
property lpProvider: string read FProvider write FProvider;
end;
TEnumEvent = procedure(Sender: TObject; Resource: TNetworkResource) of object;
...
TEnumNetwork = class(TComponent)
private
{ Private declarations }
Buf: TNetworkResource;
Buffer: array[0..1000] of TNetResource;
...
procedure TEnumNetwork.EnumResource;
// Процедура перечисления доступных сетевых ресурсов.
var
C: DWORD;
dwResult: DWORD;
begin
// Переводим TNetworkResource в TNetResource.
NetworkToNet(FRootResource, FResource);
// Открываем дескриптор перечисления.
if not EnumRootResource then
dwResult := WNetOpenEnum(Cardinal(FResourceScope) + 1, Cardinal(FResourceType), Cardinal(FResourceUsage), nil, hEnum) else
dwResult := WNetOpenEnum(Cardinal(FResourceScope) + 1, Cardinal(FResourceType), Cardinal(FResourceUsage), @FResource, hEnum);
if dwResult = NO_ERROR then
begin
// Устанавливаем размер буфера.
BufSize := SizeOf(Buffer);
Count := $0FFFFFFFF;
// Начинаем перечисление сетевых ресурсов.
if WNetEnumResource(hEnum, Count, @Buffer, BufSize) = NO_ERROR then
for C := 0 to Count - 1 do
begin
Buf.Assign(Buffer[C]);
if Assigned(FOnEnumResource) then FOnEnumResource(Self, Buf);
end
else if Assigned(OnEnumError) then OnEnumError(Self, dwResult);
// Закрываем дескриптор перечисления.
WNetCloseEnum(hEnum);
end
else if Assigned(OnEnumError) then OnEnumError(Self, dwResult);
end;
...
procedure TEnumNetwork.NetworkToNet(Source: TNetworkResource; Destination: TNetResource);
begin
// Процедура переводит тип TNetworkResource в TNetResource.
with Destination do
begin
dwScope := Cardinal(Source.dwScope) + 1;
dwType := Cardinal(Source.dwType);
dwDisplayType := Cardinal(Source.dwDisplayType);
dwUsage := Cardinal(Source.dwUsage);
lpRemoteName := PChar(Source.lpLocalName);
lpLocalName := PChar(Source.lpLocalName);
lpComment := PChar(Source.lpComment);
lpProvider := PChar(Source.lpProvider);
end;
end;
...
← →
Иван Шихалев (2001-12-22 14:22) [4]Что-то я так и не увидел, где создается объект. А должно быть так:
begin
Buf := TNetworkResource.Create;
Buf.Assign(Buffer[C]);
if Assigned(FOnEnumResource) then FOnEnumResource(Self, Buf);
end
← →
Русский (2001-12-22 15:04) [5]To Иван Шихалев >
Объект создаётся в констракторе самого компонента;
Компонент я делаю :)
constructor TEnumNetwork.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FResourceScope := RESOURCE_GLOBALNET;
FEnumSubResources := True;
Buf := TNetworkResource.Create;
FRootResource := TNetworkResource.Create;
end;
← →
Иван Шихалев (2001-12-22 17:08) [6]Так его нужно каждый раз создавать. А так у тебя один объект и получается, ты только свойства его меняешь. А TList.Add добавляет именно объект, а не его копию :)
← →
Русский (2001-12-22 18:19) [7]To Иван Шихалев>
Всё работает !!!!!!!
Только я создавать - то его создаю, а где уничтожать ????
← →
Иван Шихалев (2001-12-22 18:42) [8]Перед уничтожением TList пройдись и уничтожь. Или потомок от TList напиши.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.01.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c