![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Tstring list
alshtam © (2007-09-17 10:25:00)написал код и столкнулся с неожиданной проблемой:
function TConvertExel.loadXLS(items:integer):tstringlist;
var
i:integer;
s:string;
str:tstringlist;
begin
str:=tstringlist.Create;
i:=1;
s:=xl.cells[items,i];
while not(s='') do
begin
result.Add(s);
str.Add(s);
i:=i+1;
s:=xl.cells[items,i];
end;
str.Free;
end;
так работает, хотя str явно лишняя
function TConvertExel.loadXLS(items:integer):tstringlist;
var
i:integer;
s:string;
str:tstringlist;
begin
str:=tstringlist.Create;
i:=1;
s:=xl.cells[items,i];
while not(s='') do
begin
result.Add(s);
// str.Add(s);
i:=i+1;
s:=xl.cells[items,i];
end;
str.Free;
end;
так выдает access violation в строке result.Add(s);
не могу понять в чем дело, помогите пожалуста!
alshtam (2007-09-17 11:03:00) [1]да, теперь каюсь, я понял
clickmaker (2007-09-17 11:02:00) [2]
> Ohead:=TStringList.Create;
> Ohead:=loadXLS(1);
что за бред?
есть понимание вообще того, что происходит в этих строчках?
Сергей М. (2007-09-17 11:01:00) [3]
> допустим я оформил код так:
> Ohead:=TStringList.Create;
> Ohead:=loadXLS(1);
Ну нельзя так делать, тебе уже несколько раз сказали почему нельзя)
Ты тем самым потерял объект, ссылка на который лежала в переменной Ohead
alshtam (2007-09-17 11:01:00) [4]Да теперь понимаю, щас исправлю, спасибо
{RASkov} (2007-09-17 11:00:00) [5]> [20] alshtam © (17.09.07 10:58)
> Result останется и негде не убивается
У тебя не Результ не убивается, а вот эта ссылка
Ohead:=TStringList.Create;
Ohead:=loadXLS(1);
alshtam (2007-09-17 10:59:00) [6]
> .. тем самым потеряв ссылку на объект, созданный тобой при
> той самой инициализации
как иначе?
{RASkov} (2007-09-17 10:59:00) [7]> [14] alshtam © (17.09.07 10:47)
> не годится потому что s глобальная, в цикле создовать ее
> и убивать расточительно
Имхо... алгоритм не верный...
Пересмотри все иначе.
Если никак не избавишься от глобальной переменной, то раздели создание и работу с глоб переменной, а не все в кучу...
И не нужно создавать ничего по "куче" раз....
Глянь еще раз:
function TConvertExel.loadXLS(const items:integer; AList: TStrings);
begin
if not Assigned(AList) then Exit; //raise ('ERROR');
AList.Clear;
//Работаешь с AList;
end;
alshtam (2007-09-17 10:58:00) [8]не ну там еёё как раз и нету :)
допустим я оформил код так:
Ohead:=TStringList.Create;
Ohead:=loadXLS(1);
....
....
function TConvertExel.loadXLS(items:integer):tstringlist;
var
i:integer;
s:string;
begin
result:=tstringlist.Create;
i:=1;
s:=xl.cells[items,i];
while not(s='') do
begin
result.Add(s);
i:=i+1;
s:=xl.cells[items,i];
end;
end;
....
...
TConvertExel.desructor;
begin
Ohead.free;
end;
теперь сдесь создается и убивается Ohead но
Result останется и негде не убивается, причем с каждым новым вызовом они (Tstringlist) плодится
Сергей М. (2007-09-17 10:54:00) [9]
> alshtam © (17.09.07 10:51) [17]
>
>
> я проинициализировал глоб пременную
Зачем ?
> затем присвоил ей значение функции
.. тем самым потеряв ссылку на объект, созданный тобой при той самой инициализации
{RASkov} (2007-09-17 10:54:00) [10]> [17] alshtam © (17.09.07 10:51)
Дурь... ничего ты никому не присвоил.... :) Где в [0] создание Result'а???
alshtam (2007-09-17 10:51:00) [11]
> Ну так а кто за тебя их "убивать" будет ?)
ну вот смотрите я проинициализировал глоб пременную
Ohead:=TStringList.Create;
затем присвоил ей значение функции
Ohead:=loadXLS(1);
в нутри функции убивать созданый result как то глупо а по выходе из функции уже поздно, т.к уже нет ссылки на него
{RASkov} (2007-09-17 10:49:00) [12]> S:=loadXLS(n);
function TConvertExel.loadXLS(items:integer):tstringlist;
begin
Result:=TStringList.Create;
try
//Тело функции и работа с Result как со StringList'ом
except
raise Exception.Create('Ошибочка вышла');
end;
end;
alshtam (2007-09-17 10:47:00) [13]
> S: tstringlist;beginS:=loadXLS(n);.....S.Free;
не годится потому что s глобальная, в цикле создовать ее и убивать расточительно
> function TConvertExel.loadXLS(const items:integer; AList:
> TStrings);begin if not Assigned(AList) then Exit; //raise
> ('ERROR'); //Работаешь с AList;end;Ohead:=TStringList.Create;
> loadXLS(1, Ohead);....Ohead.Free;
ну это вариант в принципе..
Сергей М. (2007-09-17 10:47:00) [14]
> если я result.create сделал 200 раз, мне потом выдается
> 200 неубитых Tstringlist
Ну так а кто за тебя их "убивать" будет ?)
{RASkov} (2007-09-17 10:46:00) [15]> [12] {RASkov} © (17.09.07 10:44)
> См [8]
var S: tstringlist;
begin
S:=loadXLS(n);
try
//Работаем с S
finally
S.Free;
end;
end;
{RASkov} (2007-09-17 10:44:00) [16]> [10] alshtam © (17.09.07 10:42)
См [8]
{RASkov} (2007-09-17 10:44:00) [17]> оформи процедурой...
function TConvertExel.loadXLS(const items:integer; AList: TStrings);
begin
if not Assigned(AList) then Exit; //raise ('ERROR');
//Работаешь с AList;
end;
Ohead:=TStringList.Create;
loadXLS(1, Ohead);
....
Ohead.Free;
alshtam (2007-09-17 10:42:00) [18]конечно результат нужен, но если я result.create сделал 200 раз, мне потом выдается 200 неубитых Tstringlist
{RASkov} (2007-09-17 10:40:00) [19]> [7] alshtam © (17.09.07 10:39)
Не верно!
{RASkov} (2007-09-17 10:40:00) [20]> [6] alshtam © (17.09.07 10:38)
Куда??? никуда она не теряется, но если тебе не нужен результат, то оформи процедурой...
Нужно так:
S: tstringlist;
begin
S:=loadXLS(n);
.....
S.Free;