Skocz do zawartości

[delphi] - jak plik zrobić PChar.SaveToFile


Integer

Polecane posty

Cześć. Jak zapisać Plik typu PChar.SaveToFile do pliku w klasie, aby można to było robić podobnie jak TStrings.SaveToFile.

Zależy mi na tym aby plik można było zapisać pod różnymi nazwami a nie jak w AssignFile () jedna nazwa przez całe działanie programu,

chyba że jest jakaś alternatywa.

 

Konstrukcja klasy:

 

const

{ Maximum TList size }
 MaxListSize = Maxint div 16;

type

 MPCharItemList = array[0..MaxListSize] of ^PChar;

 MPCharList = class
 private
   FInicjujDir,
   FPlikNazwa,
   FPlikRozsz: ShortString;     

   FList: ^MPCharItemList;
   FCount: Integer;
   FSorted: Boolean;

 protected

 public

   constructor Create; virtual;
   destructor  Destroy; override;

   procedure Clear; override;
   function Add(const P: PChar): Integer; override;
   procedure Insert(Index: Integer; const P: PChar); override;
   procedure Delete(Index: Integer); override;
   function Find(const P: PChar; var Index: Integer): Boolean; virtual;
   function IndexOf(const P: PChar): Integer; override;
   procedure Sort; virtual;

   property Sorted: Boolean read FSorted write FSorted;
   property Count: Integer read FCount;

   property InicjujDir: ShortString read FInicjujDir write FInicjujDir;
   property PlikNazwa: ShortString read FPlikNazwa write FPlikNazwa;
   property PlikRozsz: ShortString read FPlikRozsz write FPlikRozsz;

 published
 end;

 

 

wszystkie ShortString wolałbym zamienić na PChar, ale do tego potrzebna jest procedura zapisująca i wczytująca bez użycia:

 

SaveDialog i OpenDialog

 

Chciałem rozgryść to wchodząc w moduł ale:

procedure LoadFromFile(const FileName: string); virtual;

procedure SaveToFile(const FileName: string); virtual;

 

nie dają się podejrzeć jak sa zbudowane.

Link do komentarza
Udostępnij na innych stronach

ROTFL :D

 

0. Ty naprawdę myślisz ze jak naskrobiesz własną klasę do string-list to będzie szybsza od tej z biblioteki standardowej?

1. Skoro są wirtualne to mają implementacje, nie są przecież abstrakcyjne...

2. Read, Write, Reset itp. albo strumienie

3. Od kiedy jakikolwiek zapis, czy odczyt pliku wymaga dialogów? To są tylko elementy GUI, a nie mechaniki samego kodu...

Obrazek
Link do komentarza
Udostępnij na innych stronach

poczytaj o plikach w delphi to sam sobie zrobisz klasę, która zapisuje do pliku ciąg PChar :) czy to tak naprawdę trudne? czy ty się nabijasz po prostu?? bo coraz częściej jak czytam te Twoje posty to części nie rozumiem :) (jakiś kosmos), a drugiej części to widzę, że po prostu nie czytasz wiadomości z internetu dotyczących podobnych problemów... ;] na 4prog... (reklama) masz tyle kursów, tyle rozwiązań i powiedz szczerze... czy choć część przeczytałeś dot. plików :) ??

Bo jaką sztuką jest zapisać PChar do pliku??

Zależy mi na tym aby plik można było zapisać pod różnymi nazwami a nie jak w AssignFile () jedna nazwa przez całe działanie programu,

A kto Ci tak powiedział? że jedna nazwa przez działanie całego programu??

procedure savetofile(filename:pchar; data:pchar);
var F : file;
begin
assignfile(F,filename);
{$I-}
rewrite(F);
{$I+}
write(f,data);
closefile(f);
end;

mówi Ci to coś ? ?

Prawdziwy programista wiesza sie wraz ze swoim programem.

Link do komentarza
Udostępnij na innych stronach

PS. To jest tylko przykład prezentujący zasadę działania..

 

 

0. Chcę mieć kontrolę nad tym co zapisuje i powstawiać flagi potrzebne w programie, chcę się pozbyć się niepotrzebnego kodu,

a jednocześnie się uczę ..

 

1. Przepraszam, nie zauważyłem że ostatnie linijki mi się rozmazały.. teraz jest ok

 

2. assignfile (F,filename); no faktycznie zamieszałem .. dzięki

 

3. teraz się pojawił inny problem - być może to literówka, ale nie nie widzę gdzie...

 

 

 
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type

 TFilePChar1 = File of PChar;

 TForm1 = class(TForm)
   Button1_ZapiszPlik1: TButton;
   Button2_ZapiszPlik2: TButton;
   Button3_DodajDoPlik2: TButton;
   procedure Button1_ZapiszPlik1Click(Sender: TObject);
   procedure Button2_ZapiszPlik2Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure SaveToFileAll(FileName: PChar);
   procedure Button3_DodajDoPlik2Click(Sender: TObject);
   procedure AddSaveToFile( NrPos: Word);
 private
   FFileName: String;
   FFileName1: String;
   FFileName2: String;
   FInicjujDir: String;
   FFileAssPCh: TFilePChar1;
 public
   procedure SaveToFile(FileName: PChar; tmpP: PChar);

 end;



var
 Form1: TForm1;

implementation

{$R *.DFM}

// faza pierwsza --------------------

procedure TForm1.FormCreate(Sender: TObject);
begin //
 GetDir(0, FInicjujDir);

end;

procedure TForm1.SaveToFile(FileName: PChar; tmpP: PChar);
begin //
 FFileName:= FileName;

 AssignFile(FFileAssPCh, FFileName);
 {$I-} ReWrite(FFileAssPCh); {$I+}
 Write(FFileAssPCh, tmpP);
 CloseFile(FFileAssPCh);

end;

procedure TForm1.Button1_ZapiszPlik1Click(Sender: TObject);
begin //
 FFileName1:= FInicjujDir + '\Plik1.txt';
 Form1.SaveToFile (PChar(FFileName1), PChar ('zapis z pliku 1') );
end;

procedure TForm1.Button2_ZapiszPlik2Click(Sender: TObject);
begin //
 FFileName2:= FInicjujDir + '\Plik2.txt';
 Form1.SaveToFile (PChar(FFileName2), PChar ('zapis z pliku 2') );
end;








// faza druga --------------------

procedure TForm1.AddSaveToFile( NrPos: Word );
var S: ShortString;
begin //

 S:= 'symulacja dane rekordu zmienna nr ' + IntToStr(NrPos) ;
 Write( FFileAssPCh, PChar(S) );                  // Invalid typecast <<<<<<<<<<<<<<<<

end;


procedure TForm1.SaveToFileAll(FileName: PChar);
var NrPos: Word;
begin //
 FFileName:= FileName;

 AssignFile(FFileAssPCh, FFileName);
 {$I-} ReWrite(FFileAssPCh); {$I+}

 for NrPos:= 0 to 10 do
 begin
   AddSaveToFile(NrPos);

 end;

 CloseFile(FFileAssPCh);
end;


procedure TForm1.Button3_DodajDoPlik2Click(Sender: TObject);
begin //
 Form1.SaveToFileAll( PChar(FFileName2) );
end;


end.

 

 

Mam błąd w AddSaveToFile podpowiedzcie co to..

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...