![]() |
|
#1
|
||||
|
||||
![]() есть несколько нубоватых вопросов.
1. Как создать новый экземпляр для record'а, ну то есть есть переменная Р и в цикле для этой перменой должен создаваться новый экземпляр и добавляться в TList (ну или массив), New, GetMem или ещё что надо использовать? 2. Программа активно работает с большими текстами, все они хранятся в string переменных, из-за этого происходят утечки. Вопрос, как освободить память используемой строкой? TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#2
|
||||
|
||||
![]() Насколько я помню, если у тебя в структуре нет строк то достаточно New. Дельфи сам по типам определит количество необходимой памяти под новую переменную, а иначе придется еще выделять память GetMem под строку. И конечно освобождать память придется в обратном порядке.
А вообще вот тут посмотрите, я там нечто похожее выкладывал: http://www.cyberforum.ru/post330460.html Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 16.11.2009 в 13:52. |
#3
|
|||
|
|||
![]() Код давай. Тут не телепаты собрались.
По поводу освобождения памяти. 1. Освободить строку можно через вызов SetLength. 2. На самом деле память вернется в менеджер памяти программы. Если тебе надо именно отдать память системе, то копай в сторону API, там есть функция, которая позволяет это сделать (SetProcessWorkingSetSize Function) |
#4
|
||||
|
||||
![]() Цитата:
![]() Код:
type PMyRec = ^TMyRec; TMyRec = record var1: Integer; var2: Pointer; end; ... procedure TForm1.DoIt(); var mylist: TList; p: TMyRec; i: Integer; begin mylist := TList.Create; for i:=0 to 10 do begin {вот здесь надо создать новый экземпляр в переменную p, но как?} FillChar(p,SizeOf(TMyRec),$00); p.var1 := i; mylist.Add(@p); end; for i := 0 to mylist.Count - 1 do Memo1.Lines.Add(IntToStr(PMyRec(mylist[i])^.var1)); {здесь в мемо выводится все 10, ну это, как я понимаю, изза того что все итемы в листе с одним адресом} end; TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#5
|
||||
|
||||
![]() Код:
begin {вот здесь надо создать новый экземпляр в переменную p, но как?} {ну вроде так} New(P); P^.Var1 := i; GetMem(P^.Var2, ...); //Тут надо указать размер ожидаемой переменной в Var2, если это будет строка, то Length(S)+1; P^.Var2 := ... //Собственно присвоение mylist.Add(@p); end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
||||
|
||||
![]() Страдалецъ, ещё раз спасиб. Только сёдня дошло что использовать PMyRec и к нему применять New, а не к TMyRec...
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |