Toon posts:

[Delphi] Clearen van TStream?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Stel:

Ik heb een TFileStream die ik inlees. (gecomprimeerd) Deze decomprimeer ik en voeg ik een paar regels aan toe. Deze comprimeer ik weer en wil ik weer opslaan in deze zelfde TFileStream. Hoe kan ik nou deze TFileStream clearen voordat ik de nieuwe data erin terugzet.

Met name handig als er bijvoorbeeld regels verwijderd moeten worden, en het bestand dus kleiner word.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Uhm inlezen, kopieren, bewerken, terugkopieren of ben ik nu gek? :? Wat bedoel je uberhaupt met 'clearen', wil je het bestand reduceren tot 0 bytes of deleten?

Professionele website nodig?


Verwijderd

Topicstarter
Verhaaltje klopt ongeveer wel jah :P

Idd, reduceren to 0 bytes. Het kan gebeuren dat later het bestand kleiner word. En dan staat anders die oude data er nog. Maar het zetten van de size kan dus niet zag ik in de "help" :) . Daar stond letterlijk:
"Setting the Size property of TStream does nothing."

Beetje vreemd... :?

Een ietwat vage oplossing zou idd zijn, eerste deleten, en dan weer aanmaken, maar ik d8 dat er vast wel een of ander clear-property zou zijn.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:29

Creepy

Tactical Espionage Splatterer

Een TMemoryStream heeft een clear method. Een TFileStream echter niet.
Wat je kan doen is met een File variabele de file openen, en met rewrite de file opschonen. Dan de file weer sluiten en de filestream weer openen/creeeren.

Een TFileStream lijk je dus niet te kunnen clearen, maar waaom??

[ Voor 3% gewijzigd door Creepy op 09-07-2003 13:50 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • MicroWhale
  • Registratie: Februari 2000
  • Laatst online: 18-06 12:42

MicroWhale

The problem is choice

Een bestand reduceren tot 0 bytes?

Stream Sluiten

AssignFile(F,naam);
Rewrite(F);
CloseFile(F);

Het enige belangrijke is dat je vandaag altijd rijker bent dan gisteren. Als dat niet in centen is, dan wel in ervaring.


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 10-08 15:44

klinz

weet van NIETS

Probeer dit eens:
code:
1
FileStream.SetSize(0);

Misschien is deze method protected, dan moet je eerst een afgeleide maken van TFileStream.

[ Voor 49% gewijzigd door klinz op 09-07-2003 13:59 ]


  • MicroWhale
  • Registratie: Februari 2000
  • Laatst online: 18-06 12:42

MicroWhale

The problem is choice

klinz schreef op 09 July 2003 @ 13:57:
Probeer dit eens:
code:
1
FileStream.Size := 0;
Maar het zetten van de size kan dus niet zag ik in de "help" . Daar stond letterlijk:
"Setting the Size property of TStream does nothing."
le-zen

Het enige belangrijke is dat je vandaag altijd rijker bent dan gisteren. Als dat niet in centen is, dan wel in ervaring.


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 10-08 15:44

klinz

weet van NIETS

Ik besefte het op het moment dat ik op Verstuur klikte. SetSize(0) dus. Overigens hebben ze het over TStream. Er staat nog iets bij:

*Some descendants* of TStream override this property to allow applications to change the size of the resource accessed using the stream. Le-zen :-)

THandleStream (en daar is TFileStream weer een afgeleide van), implementeert the Size property.

[ Voor 49% gewijzigd door klinz op 09-07-2003 14:04 ]


  • MicroWhale
  • Registratie: Februari 2000
  • Laatst online: 18-06 12:42

MicroWhale

The problem is choice

klinz schreef op 09 July 2003 @ 14:01:
[...]

Ik besefte het op het moment dat ik op Verstuur klikte. SetSize(0) dus. Overigens hebben ze het over TStream. Er staat nog iets bij:

*Some descendants* of TStream override this property to allow applications to change the size of the resource accessed using the stream.

THandleStream (en daar is TFileStream weer een afgeleide van), implementeert the Size property. Le-zen :-)
mijn excuses :+

het doorlezen van de Delphi help geeft hier inderdaad een verhelderend beeld over

Het enige belangrijke is dat je vandaag altijd rijker bent dan gisteren. Als dat niet in centen is, dan wel in ervaring.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Dus even samenvattend: TFileStream.Size := 0 cleared je stream.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Yupz, got that. Thnx. Toch wel de size zetten dus :P

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:29

Creepy

Tactical Espionage Splatterer

TFileStream.Size werkt dus niet. Size word geimplementeerd in TStream en NIET (!!) in THandleStream of TFileStream. THandleStream (en dus TFileStream ook) heeft wel een SetSize Method zoals Klinz al aangaf. Dus TFileStream.SetSize(0) should do the trick.

Edit: Disclaimer: Gecontroleerd in de Help en Sourcecode van Delphi 6.

[ Voor 13% gewijzigd door Creepy op 09-07-2003 15:04 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Die conclusie kan ik niet trekken. Alhoewel ik het niet getest heb ben ik er zeer zeker van dat TFileStream.Size := 0 werkt na het lezen van de (D6) sourcode. En sterker nog, het zal hetzelfde doen als TFileStream.SetSize(0) aangezien dat de setter is van die Size property.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  TStream = class(TObject)
    procedure SetSize64(const NewSize: Int64);
    ...
    procedure SetSize(NewSize: Longint); overload; virtual;
    procedure SetSize(const NewSize: Int64); overload; virtual;
    ...
    property Size: Int64 read GetSize write SetSize64;
  end;

  THandleStream = class(TStream)
    ...
    procedure SetSize(NewSize: Longint); override;
    procedure SetSize(const NewSize: Int64); override;
    ...
  end;

  TFileStream = class(THandleStream)
    ...
  end;

procedure TStream.SetSize64(const NewSize: Int64);
begin
  SetSize(NewSize);
end;


Zoals je ziet wordt de functie SetSize64 aangeroepen als setter van de property Size. Deze functie roept op zijn beurt 1 van de overloaded SetSize functies aan welke wat doen. Wat de implementatie van die laatste functies zijn is niet zo heel interresant in dit verhaal. Wat wel interresant is dat ze beide virtual zijn en dus samen met override polymorphisme veroorzaken.

THandleStream leid van TStream af en override de beide geoverloade SetSize functies. Hierin zit die extra implementatie die niet in TStream zat.

TFileStream leid weer af van THandleStream, maar voegt weinig toe in dit verhaal.

Uiteindelijk door de hulp van polymorphisme wordt de correcte THandleStream implementatie van Size := 0 aangeroepen. En dus moet het gewoon goed werken zolang de instantie maar een THandleStream of afgeleide is.

PS: Bovendien kan je TFileStream.SetSize(0) niet zomaar aanroepen, het is namelijk een protected functie.

We adore chaos because we like to restore order - M.C. Escher


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:29

Creepy

Tactical Espionage Splatterer

Beetje jammer (van mij dus).
* Creepy gaat zich in een hoekje zitten schamen..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1