![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обнуление переменной.
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;
??