Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.262 c
3-1181297041
ValeXandr
2007-06-08 14:04
2007.10.14
Работа с QReport


2-1190303313
webpauk
2007-09-20 19:48
2007.10.14
Наследие


15-1189659867
жук_
2007-09-13 09:04
2007.10.14
жук


2-1189774498
tytus
2007-09-14 16:54
2007.10.14
Есть ли альтернатива GetHostByAddr ???


2-1190360708
Light-blr
2007-09-21 11:45
2007.10.14
Как заполнить массив вручную сразу строками?