Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1103660388
Митяй2
2004-12-21 23:19
2005.01.09
документация Microsoft Visual studio.NET


11-1085307130
Wiz@rd
2004-05-23 14:12
2005.01.09
KOL ActiveX


4-1101128855
Новик
2004-11-22 16:07
2005.01.09
Выделить часть текста в чужом окне


1-1103611698
Atrion
2004-12-21 09:48
2005.01.09
Окантовка в ComboBox


1-1103722862
Cosinus
2004-12-22 16:41
2005.01.09
Как в TreeView.SomeNode добавить LongWord?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский