Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизВ TList не добавить переменную Найти похожие ветки
← →
Andrey K (2012-03-20 12:43) [0]Помогите сняться с «ручника».
Описываю тип:
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.
За ранее благодарен.
← →
Anatoly Podgoretsky © (2012-03-20 12:45) [1]> Andrey K (20.03.2012 12:43:00) [0]
Не ужели так и пишет "выдаю ошибку"
← →
Ega23 © (2012-03-20 12:52) [2]
> SpLi.Add(Kpp); //Здесь выдаёт ошибку ***
SpLi создавать Дядя Саша Пушкин будет?
← →
icWasya © (2012-03-20 14:55) [3]вот здесь
if not Assigned(SpLi) then SpLi := TList.Create;
У Вас SpLi - это локальная переменная.
В Дельфи инициализируются локальные переменные только управляемых типов - строки, динамические массивы, варианты и интерфейсы.
Все другие переменные могут быть заполнены мусором.
Поэтому с большой вероятностью Assigned(SpLi) будет истино.
Рекомендация.
сразу послеbegin //SkanList
напишитеSpLi:=Nil;
Kpp:=Nil;
← →
Германн © (2012-03-20 15:25) [4]
> Рекомендация.
> сразу после
> 1
>
> begin //SkanList
> напишите
> 1
> 2
>
> SpLi:=Nil;
> Kpp:=Nil;
>
Нафига?
Нафига вообще нужна проверка
> f not Assigned(SpLi) then
для локальной переменной?
← →
Anatoly Podgoretsky © (2012-03-20 15:31) [5]Ну вдруг
← →
Ega23 © (2012-03-20 15:33) [6]
> для локальной переменной?
Она у него не совсем локальная.
У него процедура в процедуре.
← →
Ega23 © (2012-03-20 15:41) [7]Сам по себе подход имеет право на существование. Но тогда в самой SkanList надо как-то так делать:
begin //SkanList
SpLi := nil;
try
finally
FreeAndNil(SpLi);
end;
end; //SkanList
← →
Andrey K (2012-03-20 18:31) [8]Понял, полез в дебри. Надо просто придумать глобальную переменную. Точнее сначала попробую, как предложил icWasya. Delphi пока нет под рукой. Локальную переменную стал городить, чтобы не засорять основную программу.
Спасибо.
За недочёты типа SpLi:=Nil; прошу прощения. Никогда не было времени разбираться в тонкостях. Работает и это уже хорошо.
← →
Ega23 © (2012-03-20 19:02) [9]
> Надо просто придумать глобальную переменную.
Не надо. Это не правильно.
> Локальную переменную стал городить, чтобы не засорять основную программу.
А вот это - правильно.
> Никогда не было времени разбираться в тонкостях. Работает
> и это уже хорошо.
Мне очень жаль, но зарождение быдлокодера начинается именно с таких заявлений.
← →
Andrey K (2012-03-20 21:24) [10]Спасибо за критичные замечания. Постараюсь сделать выводы.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.1 c