Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-28498
Dimedrol
2001-12-22 13:30
2002.01.10
DLL вызывает процедуру в основной проге...


4-28554
Игорь2
2001-11-08 23:47
2002.01.10
кодировка


3-28405
Desdechado
2001-12-05 16:09
2002.01.10
IB по модемному каналу


14-28543
Anatoly Podgoretsky
2001-11-02 22:29
2002.01.10
Я в шоке 2


3-28417
Ermaks
2001-12-09 00:36
2002.01.10
MS SQLDMO Type Library





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский