array of TFileStream

9 отговора 229 прегледа
#1

array of TFileStream

Trqbva mi, za da otvorq i da rabotq s mnogo fileove ednovremenno. s array of TFileStream imah problemi i se opitah s TList ama oshte po golemi problemi stanaha...ujas napravo. Nqkoi edno primerche shte dade li kak da sazdam pravilno array of TFileStream i da go unishtoja sled tova? Moje i s TList.

Отговор
в отговор на Philip #2

Re: array of TFileStream

A ti edno primerche nyama li da dadesh?

Отговор
в отговор на Philip #3

Re: array of TFileStream

Що не пробваш с TObjectList, поне той ще ти free-ва паметта използвана от обектите TFileStream :-)

Отговор
в отговор на nettle #4

Problema e che ne se osvobojdava pametta

znachi problema vsashnost e takav. nali pravq si array of TFileStream, zapalvam si go ama posle neshte da se osvobodi tazi pamet! Kashmer!!! Eto kakvo pravq az

Var
Files: array[0..9] of TFileStream;

..............

Files[0] := TFileStream.Create(......);
{e ne tochno tova pravq ama neshto podobno}
..............
posle freevam pametta taka
For I := 0 to 9 do
Files.Free;

i posle tazi pamet ne se freeva. Checkvam taka Files[0] = nil e TRUE!!!
I programata gramva zashtoto posle pak se optivam da napravq TFileStream.Create.

Nqkakvi idei? Problema vashmost e che ne se osovobojdava pametta.

Отговор
в отговор на Philip #5

Re: Problema e che ne se osvobojdava pametta

> For I := 0 to 9 do
Files.Free;

ми се струва, че трябва да стане:

For I := 0 to 9 do
Files[I].Free;

тъй като Files ти е самия масив, а Files[I] е съответния TFileStream в него. Освен това не забравяй, че метода Free освобождава паметта, заделена за обекта, но не променя указателя на Nil - това е твоя грижа. Успех!

Mixy

Редактирано от Mixy на

Отговор
в отговор на Mixy #6

Re: Problema e che ne se osvobojdava pametta

daje triabva da se typecastva kum TObject t.e :

freeandnil(TObject (files))

Отговор
в отговор на Mixy #7

Re: Problema e che ne se osvobojdava pametta

aaaa obarkal sam go imah vpredvid Files.Free. Proto tuk sam go napisal greshno.

Отговор
в отговор на Philip #8

Re: Problema e che ne se osvobojdava pametta

Kakto ti kazaha po-gore , no sigurno ne si vidql sled files.free trqbva da napravi6 i files:=nil, ako 6te proverqva6 posle za nil. A nai dobre /sa6to go kazaha\/ :

for i := 0 to n-1 do
FreeAndNil(files); //dokolkoto si spomnqm nqma nujda ot typecast

A ako pita6 mene e nai-dobre /sa6to go pisaha/ da izpolzva6 TObjectList;

Отговор
в отговор на Philip #9

Re: Problema e che ne se osvobojdava pametta

Предложение за TList реализация (с TList се работи доста по лесно и удобно, пък и можеш да го тъпчеш колкото ти душа иска ):

FileList : TList; //някъде си го създавай

procedure DoSomething;
var
FS : TFileStream;
begin
FS := TFileStream.Create(....);
.......
FileList.Add( FS );
end;

procedure Destroy;
begin
while FileList.Count > 0 do begin
TFileStream( FileList[ 0 ]).Free;
FileList.Delete( 0 );
end;
FileList.Free;
end;

Не всичко което виси е Windows, но той най-често го прави
Отговор
в отговор на mf2hd #10

Gotovo

Blagodarq na vsichki, koito se pomachiha da mi pomognat.
Znachi kakto kazva mf2hd s TObjectList i posle FreeAndNil. Znachi za prav pat chuvam za FreeAndNil i vidqh v source vsashnost kakvo pravi - prisaedinqva nill i posle free-va obekta. Neshto, koeto az si misleh, che go pravi Free methoda (i po tochno Destroy). Neshto kakto vinagi imam nqkakvi propuski s takiva operacii s obekti i pointers.

No vse pak ne bi li trqbvalo da se nil-va obekta kato mu se osvobodi pametta!?

Отговор