Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обнуление переменной.


Страницы:   1 2

Alex_Petr ©   (2004-12-22 20:31:00) 

Код такой:
procedure TMainForm.ToolButton3Click(Sender: TObject);
var
List:TStringList;
begin
List:=TStringList.Create;
try
 // Работа с чужим компонентом, используещим интерфейсы.
 // Переменная List здесь не упоминается.
except
 // Сюда не попадаем
end;
ShowMessage(List.Text);// <-- List=nil !!!
List.Free;
end;


В чем я могу ошибаться ?
P.S. На компонент (покупной), пока, грешить поводов не было.
Он требует: CoInitializeEx и CoInitializeSecurity, что и предоставляется
при инициализации.


Alex_Petr   (2004-12-23 14:23:00) [1]

>SVM (Perm)   (23.12.04 12:25) [25][Ответить]
>Digitman ©   (23.12.04 12:55) [27]
Вы правы !
У него метод Next не во всех интерфейсах реализован одинаково.
В одном требуется inc(i), в другом - нет.
Всем Огромное спасибо !
Но, все равно, если я при запросе даю неверный номер, зачем обнулять
локальные переменные ? Можно, просто сообщить об ошибке. :)))


SVM (Perm)   (2004-12-23 13:51:00) [2]

Если EnumEwDataSour - стандартный интерфейс перечисления, то первый параметр задает количество возвращаемых элементов. Получается, что с каждым вызовом будет возвращаться все больше элементов, так как I увеличивается. Или я не прав?


Digitman   (2004-12-23 12:55:00) [3]


> Alex_Petr ©   (23.12.04 12:52) [26]


а приведи-ка прототип метода Next(), так как он декларирован в документации к внешнему компоненту и так как он выглядит в библ-ке типов ...


Alex_Petr   (2004-12-23 12:52:00) [4]

>SVM (Perm)   (23.12.04 12:25) [25]
Да. Иначе он виснет, считывая одни и те же данные


SVM (Perm)   (2004-12-23 12:25:00) [5]

while hRes=S_OK do
  try
inc(i); 
...
  hRes:=IEnumEwDataSour.Next( i,IEwDataSource,nRetr);
...

Это так и надо ?


Amoeba   (2004-12-23 11:59:00) [6]

Как-то давно с подобной ситуацией столкнулся при использовании в методе класса локального динамического массива и обращении к интерфейсу, если не изменяет память - IStream. Этот массив без видимых причин уничтожался.


Alex_Petr   (2004-12-23 10:39:00) [7]

Digitman ©   (23.12.04 10:25) [22]
Если aList, сделать внешней, то все великолепно работает ( aList заполняется правильными данными ).


Digitman   (2004-12-23 10:25:00) [8]

а убери-ка на время переменную aList из списка локальных переменных .. сделай ее статической .. тем самым проверишь два предположения :

1. Внешний компонент гадит стек по своей инициативе.
2. Ты сам заставляешь компонент гадить стек, возможно передавая методу Next() неверные параметры


Alex_Petr   (2004-12-23 09:37:00) [9]

Как, обещал, даю полный код:
// Это описание их переменных

//  IEwclidDataSource = interface(IUnknown)
//    ['{55280301-9F9A-11D6-9370-00C0DF0FFFA0}']
//    function GetFriendlyName(out pbstrName: WideString): HResult; stdcall;
//    function GetUncPath(out pbstrID: WideString): HResult; stdcall;
//    function IsTied(out pbTied: Shortint): HResult; stdcall;
//  end;

//  IEnumEwclidDataSource = interface(IUnknown)
//    ['{552803E0-9F9A-11D6-9370-00C0DF0FFFA0}']
//    function Next(celt: LongWord; out rgelt: IEwclidDataSource; out pceltFetched: LongWord): HResult; stdcall;
//    function Skip(celt: LongWord): HResult; stdcall;
//    function Reset: HResult; stdcall;
//    function Clone(out ppEnum: IEnumEwclidDataSource): HResult; stdcall;
//  end;

procedure TForm1.Button1Click(Sender: TObject);
var
hRes:HResult;
i,nRetr:DWord;
aList:TStringList;
IEwDataSource:IEwclidDataSource;
IEnumEwDataSour: IEnumEwclidDataSource;
begin // EwRouter их копонент
aList:=TStringList.Create;
aList.Add('Init');
hRes:=EwRouter.EnumDataSources('\\*\Video\*',IEnumEwDataSour);
if hRes=S_OK then
 begin
  i:=1;
  hRes:=IEnumEwDataSour.Next(i,IEwDataSource,nRetr);
  while hRes=S_OK do
   try
    inc(i);
    IEwDataSource:=nil;
    hRes:=IEnumEwDataSour.Next(i,IEwDataSource,nRetr);
    // Обнуление aList происходит в тот момент, когда IEnumEwDataSour.Next
    // после серии S_OK, первый раз выдает S_FALSE
   except
    ShowMessage('Exception');
    aList.Free;
    Exit;
   end;
 end;
IEwDataSource:=nil;
IEnumEwDataSour:=nil;
if aList<>nil then aList.Free else ShowMessage('nil');
end;


Sun bittern   (2004-12-22 22:10:00) [10]

Alex_Petr ©   (22.12.04 22:08) [19]

Дело дрянь :(


Alex_Petr   (2004-12-22 22:08:00) [11]

Я уже писал, что создавал новый проект, в котором только эта процедура.


Alex_Petr   (2004-12-22 22:06:00) [12]

>У мения несколько раз именно из-за такого халатного отношения к >рекордам дельфя весма себя непредсказуемо вела.
Кроме приведенной процедуры в проекте вообще ничего нет.


Sun bittern   (2004-12-22 22:01:00) [13]

Alex_Petr ©   (22.12.04 21:49) [15]

А Record если есть чистите/инициализируете перед употреблением?
У мения несколько раз именно из-за такого халатного отношения к рекордам дельфя весма себя непредсказуемо вела.


Fay   (2004-12-22 21:56:00) [14]

Однако, от "чужого" компонента придётся отказаться. Злой он, однако.


Alex_Petr   (2004-12-22 21:49:00) [15]

>А зачем там вообще List ?
Он должен был там использоваться,
а Вам я дал выжимку кода.
Впрочем, что до, что внутри try - except,
сделать List.Text:='Test'; проходит, но в некоторый момент
List становиться nil
>возможно этот объект используется до данной секции? Нам это не ведомо.
Нет не используется.
Новый проект, только с этой процедурой, я тоже созжавал.


Sun bittern   (2004-12-22 21:35:00) [16]

Fay ©   (22.12.04 21:31) [10]

Так как утверждает автор ветки он его в секции

try
...
except

end;

не юзает

возможно этот объект используется до данной секции? Нам это не ведомо.


Fay   (2004-12-22 21:34:00) [17]

2 begin...end ©   (22.12.04 21:33) [12]
Ага 8)


begin...end   (2004-12-22 21:33:00) [18]

> Fay

:-)


begin...end   (2004-12-22 21:32:00) [19]

> Alex_Petr

А зачем там вообще List ?


Fay   (2004-12-22 21:31:00) [20]

Посмотрел код. Не понял - а где упоминается List, кроме
List := TStringList.Create;
ShowMessage(List.Text);
List.Free;

??


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо