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

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

Не работает Tstringlist :(


ishicucu ©   (2007-02-11 22:59:00) 

Обявляю переменную типа Tstringlist, метод Add вызывает ошибку 'чета с памятью', пробовал ставить в начале конструкто, не помогает.


ishicucu   (2007-02-12 19:49:00) [1]

Все работает, спасибо.


Loginov Dmitry   (2007-02-12 18:12:00) [2]

procedure TStringList.SetCapacity(NewCapacity: Integer);
begin
  ReallocMem(FList, NewCapacity * SizeOf(TStringItem));
 FCapacity := NewCapacity;
end;

destructor TStringList.Destroy;
begin
 FOnChange := nil;
 FOnChanging := nil;
 inherited Destroy;
 if FCount <> 0 then Finalize(FList^[0], FCount);
 FCount := 0;
  SetCapacity(0);
end;


Игорь Шевченко   (2007-02-12 17:42:00) [3]

Loginov Dmitry ©   (12.02.07 17:34) [14]

А если не трудно, кусочек из реализации в студию


Loginov Dmitry   (2007-02-12 17:34:00) [4]

> Ну-ка, ну-ка, какой указатель "обнуляется"?


Посмотри в реализацию.


Игорь Шевченко   (2007-02-12 17:20:00) [5]

Выпрямители подорожали видно.


RASkov   (2007-02-12 17:19:00) [6]

> sl.create;

Таким образом ты выполнил "процедуру" Create у экземпляра класса, но так как память для нее(переменной) не распределена, то и впоследствии при обращении к методам или полям выскакивает ошибка доступа памяти. Память выделяется когда вызывают конструктор у класса а не у экземпляра класса.


Плохиш   (2007-02-12 17:15:00) [7]


> Loginov Dmitry ©   (12.02.07 07:52) [8]


> Это благодаря тому, что в TStringList в деструкторе обнуляется
> указатель.

Ну-ка, ну-ка, какой указатель "обнуляется"?


Amoeba   (2007-02-12 17:06:00) [8]


> контструктор вызываю следующим образом:
>
> sl.create;
>
> может изза этого не работает, ща попробую как вы сказали
>

Именно из-за этого!


ishicucu   (2007-02-12 15:59:00) [9]

не такой я тупак, чтобы после метода free вызвать add
контструктор вызываю следующим образом:

sl.create;

может изза этого не работает, ща попробую как вы сказали


Loginov Dmitry   (2007-02-12 07:52:00) [10]

> SL.Free;
> ShowMessage(SL[0]); // вызывает ошибку 'чета с памятью'
> SL.Add('Во косяк'); // вызывает ошибку 'чета с памятью'


После такого ошибка будет выдана. Причем будет появляться стабильно. Это благодаря тому, что в TStringList в деструкторе обнуляется указатель. А вот если бы он не обнулялся, то рано или поздно ошибка все-равно где-нибудь проявилась, а вот где и когда - хз.


RASkov   (2007-02-12 02:02:00) [11]

> [5] fd979 ©   (11.02.07 23:39)


> [6] RASkov   (12.02.07 02:00)
> > [5] fd979 ©   (11.02.07 23:39)

> Неудачно....

Не удачно - это мой пример неудачный :) Т.е. недостаточно прокомментирован... Сорри.


RASkov   (2007-02-12 02:00:00) [12]

> [5] fd979 ©   (11.02.07 23:39)

Неудачно....
Это я намеренно вставил, ибо хотел показать автору, в каких случаях у него могла возникнуть такая ошибка....


fd979   (2007-02-11 23:39:00) [13]


> SL.Free;

И ты хочешь, чтобы после этого не вылетала ошибка?


RASkov   (2007-02-11 23:22:00) [14]

> [3] RASkov   (11.02.07 23:20)

Не на ту кнопку нажал, извеняюсь.

> > пробовал ставить в начале конструкто, не помогает.

Это как?


RASkov   (2007-02-11 23:20:00) [15]

> Не работает Tstringlist :(

Как не работает? А так попробуй:
var SL: TStringList;
....
SL:=TStringList.Create;
SL.Add('Добавилась');
ShowMessage(SL[0]);
SL.Free;
ShowMessage(SL[0]); // вызывает ошибку 'чета с памятью'
SL.Add('Во косяк'); // вызывает ошибку 'чета с памятью'
Работать должны мозги :)

> пробовал ставить в начале конструкто, не помогает.


Efir   (2007-02-11 23:13:00) [16]

А не забыл:
твоя переменная := TStringList.Create


Virgo_Style   (2007-02-11 23:01:00) [17]

как пробовал?


Наверх

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