Avatar billede Slettet bruger
18. juli 2002 - 21:43 Der er 9 kommentarer og
1 løsning

Lave sin egen filtype

jeg skal have opbygget min egen filtype til at gemme både records og andre ting. Jeg har kun fundet en løsning på mit problem til VB som i kan se på linket her
<a href="http://www.vbweb.co.uk/show/85/5/" target="_blank">http://www.vbweb.co.uk/show/85/5/</a>
<a href="http://www.vbweb.co.uk/show/85/6/"
target="_blank">http://www.vbweb.co.uk/show/85/6/</a>

jeg skal enlig bare bruge en løsning med delphi eksempel i stedet for VB som er beskrevet i de 2 links.
Avatar billede Slettet bruger
18. juli 2002 - 21:44 #1
hov jeg glemte at man ikke kunne lave lidt html sorry!
Avatar billede stoney Nybegynder
18. juli 2002 - 22:26 #2
Avatar billede borrisholt Novice
19. juli 2002 - 08:15 #3
Jeg vil anbefale dig at bruge en stream .....
download eksemplet fra dette spm : http://exp.dk/spm/235218. Der viser jeg hvordan man laver en frecord, og gemmer den i en stream, som så bliver krypteret og gemt på din HD !

Jesn B
Avatar billede Slettet bruger
19. juli 2002 - 12:06 #4
Problemet meddit link Stoney er at jeg ville gemme både nogle records og en masse andre ting som de også gør i de link jeg henviste til.

Jeg skal eksempel hvis først skrive en record den indeholder info om hvilken version osv. så jeg kan tjekke det er den rigtige filtype

TFiltype record
Version : integer
AppVersion : integer
AppInfo : string

Bagefter skal jeg f.eks. have skrevet en streng som kan være at forskellig længde og der skal jeg først skrive lægden på strengen og derefter selve strengen.

Hvordan skriver og læser jeg dette. Helst ved brug af TFileStream.
Avatar billede borrisholt Novice
19. juli 2002 - 13:19 #5
noget alla det her ... Det er nok ike fejlfrit .. men det giver dig en ide til at komme videre :

unit UnitHorseFile;

interface
uses
  Classes, Sysutils;

type
  TFileType = packed record
    Version : integer;
    AppVersion : integer;
    AppInfo : String;
  end;

  TFileRecord = packed record
    SomeInfo : String;
  end;

  THorseFile = class
  private
    FFileStream : TFileStream;
    FFileType: TFileType;
    function GetBOF: Boolean;
    function GetEOF: Boolean;
    procedure SetFileType(const Value: TFileType);
    constructor Create; overload;
  protected
    procedure doWriteFileRecord(const aFileRecord : TFileRecord);
  public
    constructor Create(const FileName : TFileName); overload;
    destructor Destroy; override;

    procedure WriteFileType;
    procedure ReadFileType;
    property EOF : Boolean read GetEOF;
    property BOF : Boolean read GetBOF;
    property FileType : TFileType read FFileType write SetFileType;
  end;



implementation

{ THorseFile }



constructor THorseFile.Create;
begin
  inherited;
end;

constructor THorseFile.Create(const FileName: TFileName);
var
  Mode : Word;
begin
  inherited Create;

  if FileExists(FileName) then
    mode := fmOpenReadWrite or fmShareDenyWrite
  else
    mode := fmCreate or fmShareExclusive;

  FFileStream := TFileStream.Create(FileName, Mode);
end;


destructor THorseFile.Destroy;
begin
  WriteFileType;
  FFileStream.Free;
  inherited;
end;

procedure THorseFile.doWriteFileRecord(const aFileRecord: TFileRecord);
begin
  FFileStream.Write(aFileRecord, Sizeof(aFileRecord));
end;

function THorseFile.GetBOF: Boolean;
begin
  Result := FFileStream.Position = 0;
end;

function THorseFile.GetEOF: Boolean;
begin
  Result:= FFileStream.Position >= FFileStream.Size;
end;

procedure THorseFile.ReadFileType;
begin
  FFileStream.Position := 0;
  FFileStream.Read(FFileType, Sizeof(FFileType));
end;

procedure THorseFile.SetFileType(const Value: TFileType);
begin
  FFileType := Value;
end;


procedure THorseFile.WriteFileType;
begin
  FFileStream.Position := 0;
  FFileStream.Write(FFileType, Sizeof(FFileType));
end;


end.


Jens B
Avatar billede Slettet bruger
19. juli 2002 - 22:48 #6
OK det var meget tæt på svaret men så vidt jeg kan se læser og skriver den kun FFiletype og skriver aFilerecord- jeg kan ikke se hvordan den læser aFileRecord.

Altså når jeg har skrevet en TFileType sætter den så automatisk stedet(position) hvor den læser/skriver fra til det sted efter det den har skrevet/læst eller skal jeg selv gøre dette?

Hvordan gør jeg hvis jeg skal flytte x antal bytes frem i filen få at læse der?

Hvis jeg først skriver en størrelse på selve strengen som jeg bruger når jeg skal læse selve strengen (da jeg ikke ved hvor lang den er) hvordan skal jeg så læse selve størrelsen af strengen i starten - når jeg skal skrive den størrelse hvor meget fylder sådan en i filen?

Håber i forstår det
Avatar billede borrisholt Novice
20. juli 2002 - 14:09 #7
http://borrisholt.com/eksperten/ThorseFile.zip

Den kan læse og skrive records til en fil eller en Stream. Den kan registere en filtype til sig selv eller andere programmer.

Det med streamen er smart hvis du på sigt vil have krypering eller komprimering på .... Den læser hele filen op i ram. Så hvis den er stor mange MB tja så fylder den meget .... Det kan du etv selv lave om på ....

Der er også et lille eksempel med ...

Nu har jeg vist svaret rigelige på dette spm.

Jens B
Avatar billede borrisholt Novice
23. juli 2002 - 08:43 #8
og .....
Avatar billede Slettet bruger
23. juli 2002 - 19:02 #9
Åh ja, jeg har haft så travlt med så meget andet at jeg lige glemte det - sorry

Svaret var 90% godt nok så du får dine point, jeg mangler dog stadig lidt mere research... mærkligt at det ikke er let at finde på nettet.
Avatar billede borrisholt Novice
24. juli 2002 - 08:37 #10
Det der med først at skrive størelsen på strengen og der efter så at sjrive karekterene sker ned i TWriter.

Studer TWriter og TReader .... De er næglen til at lave sine egne filtyper ....

Når man skal lave den slags skal du ALTID lave LoadFromStream og SaveToStream fordi du så senere kan krypere det pakke det og gøre ved på det ...

Jeg har ikke kigger på de to links ... Så du må fortælle mig hvordan min løsning afviger ....

Jens b :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester