![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как проверить? [D5]
Igel © (2002-08-29 12:38:00)Есть динамический массив:
s:array of Variant;
Как мне узнать есть-ли там данные, массив возвращает функция, нужно проверить не пустой-ли он?
Igel (2002-08-30 06:34:00) [1]С нового взгляда нашел ошибку... Я ДУРАК!!!
Всем спасибо...
Прикол был в следующем:
type TVarArray = array of variant;
function SpisokRazValue(key:string; param:boolean):TVarArray;
...
var znach:TVarArray;
begin
//Здесь возникает ошибка... - на самом деле после вызова
znach := SpisokRazValue(Key, Param);
//Выводил отладочную информацию
showmessage("test - "+znach[30]);
//Тогда как мог быть пустым массив... :))
...
И ведь цельный день прикол искал :)) А с утра глянул чуть со смеху не умер... Всем спасибо... заработало!!!
McSimm (2002-08-29 15:01:00) [2]>Skier © (29.08.02 14:59)
Ну, со второго раза смысл понял.
Skier (2002-08-29 14:59:00) [3]>McSimm
>Одна функция вызывает другую, обрабатывает результат и вот она >уже является внешней...
>SpisokRazValue - локальная функция
"Этот плакатик внимательно изучал ?" :))
McSimm (2002-08-29 14:57:00) [4]Текст сообщения об ошибке так и не прозвучал.
Отлаживать DLL совсем не сложно. См. Run/Parameters/Host Application
List_sub.Free тоже желательно в finally ставить.
Skier (2002-08-29 14:47:00) [5]>Igel
Попробуй подсунуть мою функцию - ошибка останется ?
Skier (2002-08-29 14:46:00) [6]>Igel
function SpisokRazValue(key:string; param:boolean):TVarArray;
var
ii : Integer;
begin
SetLength(Result, 10);
for ii := 0 to 9 do Result[ii] := IntToStr(ii);
end;
//................
znach := SpisokRazValue("Empty", True);
Finalize(znach);
Код - работает.
Может у тебя ошибка при работе с Reg
или ты что-то напартачил при вызове функции ?
Igel (2002-08-29 14:39:00) [7]Нет... все в пределах одного модуля...
Одна функция вызывает другую, обрабатывает результат и вот она уже является внешней... Но дело в том, что ошибка при получении данных из функции в строке:
//Здесь возникает ошибка...
znach := SpisokRazValue(Key, Param);
SpisokRazValue - локальная функция
Skier (2002-08-29 14:23:00) [8]>Igel
> [Warning] LispFunc.pas(316): Variable "znach" might not
> have been initialized
Предупреждает что znach может быть неинициализированной,
но к SpisokRazValue это не относится.
Skier (2002-08-29 14:20:00) [9]>Igel
> Я делаю независимую ДЛЛ-ку...
А вот с этого надо было начинать !
Ты случайно этот массив не передаёшь потом в качестве
параметра в DLL-функцию ? (Или возвращаешь в качестве результата
DLL-функции ?)
Igel (2002-08-29 14:19:00) [10]Выдает на этапе компиляции:
[Warning] LispFunc.pas(316): Variable "znach" might not have been initialized
Не могу понять о чем предупреждает?
Igel (2002-08-29 14:12:00) [11]Проблема в том, что не знаю, она на этапе выполнения возникает... Я делаю независимую ДЛЛ-ку...
Skier (2002-08-29 13:55:00) [12]>Igel
> Я это прописал, поскольку была ошибка...
Где и какая именно ?
Skier (2002-08-29 13:54:00) [13]>Igel
Igel (2002-08-29 13:52:00) [14]Я это прописал, поскольку была ошибка... и без них не работало..
Skier (2002-08-29 13:38:00) [15]>Igel
Вот эти две одинаковых строчки убери (не нужны они)
else setlength(result,0);//result:=nil;
Легче не станет ?
Igel (2002-08-29 13:35:00) [16]Вот код:
function SpisokRazValue(key:string; param:boolean):TVarArray;
var Path_all:TPath_reg;
List_sub:tstringList;
i:integer;
begin
Path_all := Get_rootKey(Key);
result:=nil;
try
//Создание переменной, типа TRegistry.
Reg:=TRegistry.Create(Key_read);
Reg.RootKey := Path_all.Root ;
//если есть ключ
if reg.KeyExists (Path_all.Path) then
//Если открыт
if reg.OpenKeyReadOnly (Path_all.Path) then
begin
List_sub := tstringList.Create ;
if param then
reg.GetKeyNames (List_sub) else
reg.GetValueNames (List_sub);
//Переводим в результат
if List_sub.Count > 0 then
begin
setlength (result, List_sub.Count);
for i:=0 to List_sub.Count-1 do
begin
result[i]:=list_sub.Strings [i];
end;
end else setlength(result,0);//result:=nil;
List_sub.Free;
end else setlength(result,0);//result:=nil;
finally
Reg.CloseKey;
reg.Free ;
end;
if result=nil then showmessage("END");
end;
Skier (2002-08-29 13:22:00) [17]>Igel
Давай не будет гадать...
Покажи код SpisokRazValue.
Igel (2002-08-29 13:20:00) [18]> Skier
В теле функции SpisokRazValue, если нету элементов для добавления я сразуResult:=nil;, может я не прав?
И надо сразуSetLength(Result, 0);?
Skier (2002-08-29 13:15:00) [19]>Igel
> В чем прикол?
Трудно угадать...
Но, может в отсутсвии след. строки в теле SpisokRazValue
SetLength(Result, ElementCount);
Igel (2002-08-29 13:13:00) [20]
type TVarArray = array of variant;
function SpisokRazValue(key:string; param:boolean):TVarArray;
...
var znach:TVarArray;
begin
//Здесь возникает ошибка...
znach := SpisokRazValue(Key, Param);
...
В чем прикол?