Integer Napisano Kwiecień 11, 2009 Zgłoś Share Napisano Kwiecień 11, 2009 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 More sharing options...
Cubixmeister Napisano Kwiecień 11, 2009 Zgłoś Share Napisano Kwiecień 11, 2009 ROTFL 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... Link do komentarza Udostępnij na innych stronach More sharing options...
DevPort Napisano Kwiecień 11, 2009 Zgłoś Share Napisano Kwiecień 11, 2009 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 More sharing options...
Integer Napisano Kwiecień 12, 2009 Autor Zgłoś Share Napisano Kwiecień 12, 2009 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.