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

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

В TList не добавить переменную [D6, XP]


Andrey K ©   (2012-03-20 12:43:00) 

Помогите сняться с «ручника».
Описываю тип:
type
 CorReg = record
   nam: word;
   cor: string;
   pod: string;
 end;
 TCorReg = ^CorReg;
Пишу локальную процедуру в локальной процедуре в обработчике:
procedure TfmUTR.itmCompileClick(Sender: TObject);
 //--------------------------
 procedure SkanList(ArPro: TList);
   var
     SpLi: TList;
     Kpp: TCorReg;
 //--------------------------
 procedure ScanAPP(Fu: TfrUn);
 var sp: string;
 begin //ScanAPP
   if Fu.TypePr = pr_podp then
   begin
     sp := ScanBuAdr(Fu.mmProg.Text,'P'); //Здесь просто получаю нужную строку
     if sp <> '' then
     begin
       if not Assigned(SpLi) then SpLi := TList.Create;
       New(Kpp);
       with Kpp^ do
       begin
         nam := Round(Fu.Diameter); //здесь Diameter: double;
         pod := sp;
       end;
       SpLi.Add(Kpp); //Здесь выдаёт ошибку ***
     end;
   end;
 end; //ScanAPP
 //--------------------------
 begin //SkanList
……
……
 end; //SkanList
 //=========================
begin //itmCompileClick

Самое интересное, что в других местах где работает эта операция, при наведении мышы подсказка показывает что переменная описанная типом :TCorReg что она относится к типу модуля var TfmUTR.xxxx.TCorReg-UTR.pas в котором описан тип  :TCorReg, а в месте *** показывает что это переменная типа в модуле var Kpp.TCorReg-UTR.pas
UTR-модуль в кот. создан TfmUTR.
Вот и не понтно, ведь обработчик TfmUTR.itmCompileClick принадлежит TfmUTR.
За ранее благодарен.


Andrey K   (2012-03-20 21:24:00) [1]

Спасибо за критичные замечания. Постараюсь сделать выводы.


Ega23   (2012-03-20 19:02:00) [2]


>  Надо просто придумать глобальную переменную.


Не надо. Это не правильно.


> Локальную переменную стал городить, чтобы не засорять основную  программу.


А вот это - правильно.


> Никогда не было времени разбираться в тонкостях. Работает
> и это уже хорошо.


Мне очень жаль, но зарождение быдлокодера начинается именно с таких заявлений.


Andrey K   (2012-03-20 18:31:00) [3]

Понял, полез в дебри. Надо просто придумать глобальную переменную. Точнее сначала попробую, как предложил icWasya. Delphi пока нет под рукой. Локальную переменную стал городить, чтобы не засорять основную программу.
Спасибо.
За недочёты типа  SpLi:=Nil; прошу прощения. Никогда не было времени разбираться в тонкостях. Работает и это уже хорошо.


Ega23   (2012-03-20 15:41:00) [4]

Сам по себе подход имеет право на существование. Но тогда в самой SkanList надо как-то так делать:

begin //SkanList
 SpLi := nil;
 try

 finally
   FreeAndNil(SpLi);
 end;
end; //SkanList


Ega23   (2012-03-20 15:33:00) [5]


> для локальной переменной?


Она у него не совсем локальная.
У него процедура в процедуре.


Anatoly Podgoretsky   (2012-03-20 15:31:00) [6]

Ну вдруг


Германн   (2012-03-20 15:25:00) [7]


> Рекомендация.
> сразу после
> 1
>  
> begin //SkanList
> напишите
> 1
> 2
>  
>  SpLi:=Nil;
>  Kpp:=Nil;
>

Нафига?
Нафига вообще нужна проверка
> f not Assigned(SpLi) then

для локальной переменной?


icWasya   (2012-03-20 14:55:00) [8]

вот здесь if not Assigned(SpLi) then SpLi := TList.Create;У Вас SpLi - это локальная переменная.
В Дельфи инициализируются локальные переменные только управляемых типов - строки, динамические массивы, варианты  и интерфейсы.
Все другие переменные могут быть заполнены мусором.
Поэтому с большой вероятностью  Assigned(SpLi) будет истино.
Рекомендация.
сразу после begin //SkanListнапишите  SpLi:=Nil;
 Kpp:=Nil;


Ega23   (2012-03-20 12:52:00) [9]


>    SpLi.Add(Kpp); //Здесь выдаёт ошибку ***


SpLi создавать Дядя Саша Пушкин будет?


Anatoly Podgoretsky   (2012-03-20 12:45:00) [10]

> Andrey K  (20.03.2012 12:43:00)  [0]

Не ужели так и пишет "выдаю ошибку"


Наверх

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