Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: CL | DM;

Вниз

Обнуление переменной.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.026 c
11-1085054241
Ann
2004-05-20 15:57
2005.01.09
исходники mirror, mckObjs, mckCtrls, mcKACMIn, mckSoundctl


1-1103576127
Logun
2004-12-20 23:55
2005.01.09
ПРОБЛЕМА с Delphi+Flash!


14-1103634756
Gorlum
2004-12-21 16:12
2005.01.09
Задачи при приёме на работу


3-1102589759
Denmin
2004-12-09 13:55
2005.01.09
Как убрать знаки Entera при конвертации данных?


4-1101137509
Frozzen
2004-11-22 18:31
2005.01.09
Создание полигонов CreatePolygonRgn