Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Tstring list


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо