Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.045 c
15-1190105915
Сергей М.
2007-09-18 12:58
2007.10.14
про Линух ..


3-1181552792
Sapos
2007-06-11 13:06
2007.10.14
Сравнение дат.


2-1189961373
aha
2007-09-16 20:49
2007.10.14
Можно ли изменить цвет шрифта некоторых ячеек


2-1189858892
mahab
2007-09-15 16:21
2007.10.14
Сообщения


2-1190211725
azl
2007-09-19 18:22
2007.10.14
Как программно добавить новый пункт меню в PopupMenu?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский