Текущий архив: 2007.10.14;
Скачать: CL | DM;
Вниз
Tstring list Найти похожие ветки
← →
alshtam © (2007-09-17 10:25) [0]написал код и столкнулся с неожиданной проблемой:
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);
не могу понять в чем дело, помогите пожалуста!
← →
Desdechado © (2007-09-17 10:35) [1]> так работает, хотя str явно лишняя
Вместо Str делайresult := tstringlist.Create;
, а Str выкини.
А то функция твоя ничего не возвращает.
Хотя зачем Free, я так и не понял.
← →
{RASkov} © (2007-09-17 10:35) [2]> [0] alshtam © (17.09.07 10:25)
Result нужно создать...
А у тебя ни в первом ни во втолром он не создается, а обращение внутри к нему есть... так, что оба варианта не рабочии...
а Str: TStringList явно лишняя в обоих случаях....
← →
Anatoly Podgoretsky © (2007-09-17 10:36) [3]> alshtam (17.09.2007 10:25:00) [0]
result не инициализирован
← →
Jeer © (2007-09-17 10:36) [4]
> str:tstringlist;
> begin
> str:=tstringlist.Create;
А это зачем ?
Надо Result := TStringList.Create;
← →
{RASkov} © (2007-09-17 10:38) [5]> Хотя зачем Free, я так и не понял.
Free ни в коем случае не нужно... иначе нафик она нужна если она(функция) не вернет результат :)
Тогда уж процедурой оформлять, раз результат не нужен...
← →
alshtam © (2007-09-17 10:38) [6]уважаемые если я result инициализирую, у меня память начинает терятся
← →
alshtam © (2007-09-17 10:39) [7]Ohead:=TStringList.Create;
Ohead:=loadXLS(1);
← →
{RASkov} © (2007-09-17 10:40) [8]> [6] alshtam © (17.09.07 10:38)
Куда??? никуда она не теряется, но если тебе не нужен результат, то оформи процедурой...
Нужно так:
S: tstringlist;
begin
S:=loadXLS(n);
.....
S.Free;
← →
{RASkov} © (2007-09-17 10:40) [9]> [7] alshtam © (17.09.07 10:39)
Не верно!
← →
alshtam © (2007-09-17 10:42) [10]конечно результат нужен, но если я result.create сделал 200 раз, мне потом выдается 200 неубитых Tstringlist
← →
{RASkov} © (2007-09-17 10:44) [11]> оформи процедурой...
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;
← →
{RASkov} © (2007-09-17 10:44) [12]> [10] alshtam © (17.09.07 10:42)
См [8]
← →
{RASkov} © (2007-09-17 10:46) [13]> [12] {RASkov} © (17.09.07 10:44)
> См [8]
var S: tstringlist;
begin
S:=loadXLS(n);
try
//Работаем с S
finally
S.Free;
end;
end;
← →
alshtam © (2007-09-17 10:47) [14]
> 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) [15]
> если я result.create сделал 200 раз, мне потом выдается
> 200 неубитых Tstringlist
Ну так а кто за тебя их "убивать" будет ?)
← →
{RASkov} © (2007-09-17 10:49) [16]> 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:51) [17]
> Ну так а кто за тебя их "убивать" будет ?)
ну вот смотрите я проинициализировал глоб пременную
Ohead:=TStringList.Create;
затем присвоил ей значение функции
Ohead:=loadXLS(1);
в нутри функции убивать созданый result как то глупо а по выходе из функции уже поздно, т.к уже нет ссылки на него
← →
{RASkov} © (2007-09-17 10:54) [18]> [17] alshtam © (17.09.07 10:51)
Дурь... ничего ты никому не присвоил.... :) Где в [0] создание Result"а???
← →
Сергей М. © (2007-09-17 10:54) [19]
> alshtam © (17.09.07 10:51) [17]
>
>
> я проинициализировал глоб пременную
Зачем ?
> затем присвоил ей значение функции
.. тем самым потеряв ссылку на объект, созданный тобой при той самой инициализации
← →
alshtam © (2007-09-17 10:58) [20]не ну там еёё как раз и нету :)
допустим я оформил код так:
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) плодится
← →
{RASkov} © (2007-09-17 10:59) [21]> [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:59) [22]
> .. тем самым потеряв ссылку на объект, созданный тобой при
> той самой инициализации
как иначе?
← →
{RASkov} © (2007-09-17 11:00) [23]> [20] alshtam © (17.09.07 10:58)
> Result останется и негде не убивается
У тебя не Результ не убивается, а вот эта ссылка
Ohead:=TStringList.Create;
Ohead:=loadXLS(1);
← →
alshtam © (2007-09-17 11:01) [24]Да теперь понимаю, щас исправлю, спасибо
← →
Сергей М. © (2007-09-17 11:01) [25]
> допустим я оформил код так:
> Ohead:=TStringList.Create;
> Ohead:=loadXLS(1);
Ну нельзя так делать, тебе уже несколько раз сказали почему нельзя)
Ты тем самым потерял объект, ссылка на который лежала в переменной Ohead
← →
clickmaker © (2007-09-17 11:02) [26]
> Ohead:=TStringList.Create;
> Ohead:=loadXLS(1);
что за бред?
есть понимание вообще того, что происходит в этих строчках?
← →
alshtam © (2007-09-17 11:03) [27]да, теперь каюсь, я понял
Страницы: 1 вся ветка
Текущий архив: 2007.10.14;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.067 c