Форум: "Начинающим";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];
ВнизНе работает Tstringlist :( Найти похожие ветки
← →
ishicucu © (2007-02-11 22:59) [0]Обявляю переменную типа Tstringlist, метод Add вызывает ошибку "чета с памятью", пробовал ставить в начале конструкто, не помогает.
← →
Virgo_Style © (2007-02-11 23:01) [1]как пробовал?
← →
Efir © (2007-02-11 23:13) [2]А не забыл:
твоя переменная := TStringList.Create
← →
RASkov (2007-02-11 23:20) [3]> Не работает Tstringlist :(
Как не работает? А так попробуй:
var SL: TStringList;
....
SL:=TStringList.Create;
SL.Add("Добавилась");
ShowMessage(SL[0]);
SL.Free;
ShowMessage(SL[0]); // вызывает ошибку "чета с памятью"
SL.Add("Во косяк"); // вызывает ошибку "чета с памятью"
Работать должны мозги :)
> пробовал ставить в начале конструкто, не помогает.
← →
RASkov (2007-02-11 23:22) [4]> [3] RASkov (11.02.07 23:20)
Не на ту кнопку нажал, извеняюсь.
> > пробовал ставить в начале конструкто, не помогает.
Это как?
← →
fd979 © (2007-02-11 23:39) [5]
> SL.Free;
И ты хочешь, чтобы после этого не вылетала ошибка?
← →
RASkov (2007-02-12 02:00) [6]> [5] fd979 © (11.02.07 23:39)
Неудачно....
Это я намеренно вставил, ибо хотел показать автору, в каких случаях у него могла возникнуть такая ошибка....
← →
RASkov (2007-02-12 02:02) [7]> [5] fd979 © (11.02.07 23:39)
> [6] RASkov (12.02.07 02:00)
> > [5] fd979 © (11.02.07 23:39)
> Неудачно....
Не удачно - это мой пример неудачный :) Т.е. недостаточно прокомментирован... Сорри.
← →
Loginov Dmitry © (2007-02-12 07:52) [8]> SL.Free;
> ShowMessage(SL[0]); // вызывает ошибку "чета с памятью"
> SL.Add("Во косяк"); // вызывает ошибку "чета с памятью"
После такого ошибка будет выдана. Причем будет появляться стабильно. Это благодаря тому, что в TStringList в деструкторе обнуляется указатель. А вот если бы он не обнулялся, то рано или поздно ошибка все-равно где-нибудь проявилась, а вот где и когда - хз.
← →
ishicucu © (2007-02-12 15:59) [9]не такой я тупак, чтобы после метода free вызвать add
контструктор вызываю следующим образом:
sl.create;
может изза этого не работает, ща попробую как вы сказали
← →
Amoeba © (2007-02-12 17:06) [10]
> контструктор вызываю следующим образом:
>
> sl.create;
>
> может изза этого не работает, ща попробую как вы сказали
>
Именно из-за этого!
← →
Плохиш © (2007-02-12 17:15) [11]
> Loginov Dmitry © (12.02.07 07:52) [8]
> Это благодаря тому, что в TStringList в деструкторе обнуляется
> указатель.
Ну-ка, ну-ка, какой указатель "обнуляется"?
← →
RASkov (2007-02-12 17:19) [12]> sl.create;
Таким образом ты выполнил "процедуру" Create у экземпляра класса, но так как память для нее(переменной) не распределена, то и впоследствии при обращении к методам или полям выскакивает ошибка доступа памяти. Память выделяется когда вызывают конструктор у класса а не у экземпляра класса.
← →
Игорь Шевченко © (2007-02-12 17:20) [13]Выпрямители подорожали видно.
← →
Loginov Dmitry © (2007-02-12 17:34) [14]> Ну-ка, ну-ка, какой указатель "обнуляется"?
Посмотри в реализацию.
← →
Игорь Шевченко © (2007-02-12 17:42) [15]Loginov Dmitry © (12.02.07 17:34) [14]
А если не трудно, кусочек из реализации в студию
← →
Loginov Dmitry © (2007-02-12 18:12) [16]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;
← →
ishicucu © (2007-02-12 19:49) [17]Все работает, спасибо.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.06 c