Форум: "Основная";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
ВнизОбнуление переменной. Найти похожие ветки
← →
Alex_Petr © (2004-12-22 20:31) [0]Код такой:
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, что и предоставляется
при инициализации.
← →
Sun bittern © (2004-12-22 21:11) [1]var
List:TStringList;
begin
List:=TStringList.Create;
try
try
// Работа с чужим компонентом, используещим интерфейсы.
// Переменная List здесь не упоминается.
except
// Сюда не попадаем
end;
...
finally
ShowMessage(List.Text);// <-- List=nil !!!
List.Free;
end;
end
>> ShowMessage(List.Text);// <-- List=nil !!!
Может всетаки имеет место быть:
List.Text := "";
Уничтожен объект или нет проверьте так:
if Assigned(List) then ...
← →
Alex_Petr © (2004-12-22 21:13) [2]>Может всетаки имеет место быть: List.Text := "";
Все проверил: именно List=nil.
← →
Alex_Petr © (2004-12-22 21:17) [3]Проверял и брайкпоинтом: в середине блока try - except
List, неожиданно становиться nil.
P.S. Не только Delphi, но и систему переустанавливал.
← →
Fay © (2004-12-22 21:19) [4]Где-то в коде ошибка (возможно, в приведении типов) и в память по адресу @List пишется что-то (в данном случае - 0).
Как отрабатывает вот это?procedure TMainForm.ToolButton3Click(Sender: TObject);
var
List:TStringList;
begin
List:=TStringList.Create;
List.Text := "Всё пучком";
ShowMessage(List.Text);
List.Free;
end;
И ваще. Прийдись отладчиком.
← →
Fay © (2004-12-22 21:20) [5]Покажи сесь код.
← →
Sun bittern © (2004-12-22 21:20) [6]Assigned - False возвращает?
← →
VMcL © (2004-12-22 21:22) [7]>>Alex_Petr ©
1. Версия Delphi?
2. Оптимизация включена?
← →
Alex_Petr © (2004-12-22 21:25) [8]>И ваще. Прийдись отладчиком.
Проходил, обнуление происходит не доходя до конца процедуры.
>Покажи сесь код.
Завтра, буду на работе - покажу, но он Вам :(( не поможет.
Там пара нестандартных функций, встроеннык в компонент ( исходников нет )
>Assigned - False возвращает?
да.
← →
Alex_Petr © (2004-12-22 21:27) [9]>1. Версия Delphi?
Delphi 7
2. Оптимизация включена?
И включал и отключал - все едино.
← →
Fay © (2004-12-22 21:31) [10]Посмотрел код. Не понял - а где упоминается List, кроме
List := TStringList.Create;
ShowMessage(List.Text);
List.Free;
??
← →
begin...end © (2004-12-22 21:32) [11]> Alex_Petr
А зачем там вообще List ?
← →
begin...end © (2004-12-22 21:33) [12]> Fay
:-)
← →
Fay © (2004-12-22 21:34) [13]2 begin...end © (22.12.04 21:33) [12]
Ага 8)
← →
Sun bittern © (2004-12-22 21:35) [14]Fay © (22.12.04 21:31) [10]
Так как утверждает автор ветки он его в секции
try
...
except
end;
не юзает
возможно этот объект используется до данной секции? Нам это не ведомо.
← →
Alex_Petr © (2004-12-22 21:49) [15]>А зачем там вообще List ?
Он должен был там использоваться,
а Вам я дал выжимку кода.
Впрочем, что до, что внутри try - except,
сделать List.Text:="Test"; проходит, но в некоторый момент
List становиться nil
>возможно этот объект используется до данной секции? Нам это не ведомо.
Нет не используется.
Новый проект, только с этой процедурой, я тоже созжавал.
← →
Fay © (2004-12-22 21:56) [16]Однако, от "чужого" компонента придётся отказаться. Злой он, однако.
← →
Sun bittern © (2004-12-22 22:01) [17]Alex_Petr © (22.12.04 21:49) [15]
А Record если есть чистите/инициализируете перед употреблением?
У мения несколько раз именно из-за такого халатного отношения к рекордам дельфя весма себя непредсказуемо вела.
← →
Alex_Petr © (2004-12-22 22:06) [18]>У мения несколько раз именно из-за такого халатного отношения к >рекордам дельфя весма себя непредсказуемо вела.
Кроме приведенной процедуры в проекте вообще ничего нет.
← →
Alex_Petr © (2004-12-22 22:08) [19]Я уже писал, что создавал новый проект, в котором только эта процедура.
← →
Sun bittern © (2004-12-22 22:10) [20]Alex_Petr © (22.12.04 22:08) [19]
Дело дрянь :(
← →
Alex_Petr © (2004-12-23 09:37) [21]Как, обещал, даю полный код:
// Это описание их переменных
// 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;
← →
Digitman © (2004-12-23 10:25) [22]а убери-ка на время переменную aList из списка локальных переменных .. сделай ее статической .. тем самым проверишь два предположения :
1. Внешний компонент гадит стек по своей инициативе.
2. Ты сам заставляешь компонент гадить стек, возможно передавая методу Next() неверные параметры
← →
Alex_Petr © (2004-12-23 10:39) [23]Digitman © (23.12.04 10:25) [22]
Если aList, сделать внешней, то все великолепно работает ( aList заполняется правильными данными ).
← →
Amoeba © (2004-12-23 11:59) [24]Как-то давно с подобной ситуацией столкнулся при использовании в методе класса локального динамического массива и обращении к интерфейсу, если не изменяет память - IStream. Этот массив без видимых причин уничтожался.
← →
SVM (Perm) (2004-12-23 12:25) [25]while hRes=S_OK do
try
inc(i);
...
hRes:=IEnumEwDataSour.Next( i ,IEwDataSource,nRetr);
...
Это так и надо ?
← →
Alex_Petr © (2004-12-23 12:52) [26]>SVM (Perm) (23.12.04 12:25) [25]
Да. Иначе он виснет, считывая одни и те же данные
← →
Digitman © (2004-12-23 12:55) [27]
> Alex_Petr © (23.12.04 12:52) [26]
а приведи-ка прототип метода Next(), так как он декларирован в документации к внешнему компоненту и так как он выглядит в библ-ке типов ...
← →
SVM (Perm) (2004-12-23 13:51) [28]Если EnumEwDataSour - стандартный интерфейс перечисления, то первый параметр задает количество возвращаемых элементов. Получается, что с каждым вызовом будет возвращаться все больше элементов, так как I увеличивается. Или я не прав?
← →
Alex_Petr © (2004-12-23 14:23) [29]>SVM (Perm) (23.12.04 12:25) [25][Ответить]
>Digitman © (23.12.04 12:55) [27]
Вы правы !
У него метод Next не во всех интерфейсах реализован одинаково.
В одном требуется inc(i), в другом - нет.
Всем Огромное спасибо !
Но, все равно, если я при запросе даю неверный номер, зачем обнулять
локальные переменные ? Можно, просто сообщить об ошибке. :)))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.038 c