Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: mecoman - Dicembre 16, 2012, 04:46:41 pm

Titolo: Salvataggio e apertura di file
Inserito da: mecoman - Dicembre 16, 2012, 04:46:41 pm
Ciao a tutti.

Apro questo topic per chiedervi un consiglio sul salvataggio dei file. Spero che l'argomento non sia stato già trattato; se è così chiedo scusa.

Ipotizziamo di avere un form contenente un MemoBox ed due pulsanti, rispettivamente per il salvataggio e l'apertura del file.

Nello scrivere il codice per il salvataggio del file di testo non ho nessun problema in quanto il file lo salva in formato .txt e quindi apribile anche con il blocco note di windows.
Ciò che voglio fare io è quello di far salvare il file in un formato personale (ad esempio .abc) apribile solo con il mio programma.

Qualcuno è in grado di aiutarmi?

Grazie 1000 in anticipo. Ciao.
Titolo: Re:Salvataggio e apertura di file
Inserito da: bonmario - Dicembre 16, 2012, 07:36:02 pm
Cosa sarebbe il MemoBox? Un TMemo? Se è così, la leggi riga per riga e la salvi some più ti piace.

Ciao, Mario
Titolo: Re:Salvataggio e apertura di file
Inserito da: mecoman - Dicembre 16, 2012, 11:57:02 pm
Ciao Mario. Grazie per la risposta.

Non so perchè ho scritto MemoBox, ma mi riferivo ad un TMemo.

Detto questo, potresti essere un pochino più chiaro? Non ho ben capito cosa volevi dire.

Grazie, ciao.
Titolo: Re:Salvataggio e apertura di file
Inserito da: Stilgar - Dicembre 17, 2012, 12:20:36 am
Ciao Mecoman...
allora le strade in informatica sono sempre molteplici, e portano al medesimo risultato.
Il TMemo espone una bellissima property : Lines.
Questa è un TStrings come classe astratta.
Questa rappresenta il modello dei dati che la TMemo usa.
Alla fine della fiera è una grande stringa organizzata in linee logiche. Quelle che vedi a video in fase di rendering del componente.
Lines.GetText ti da accesso diretto alla ram (PChar) dove viene contenuta la stringa.
Occhio che in lettura è molto potente, accedere alla memoria, in scrittura dovresti rifarti mezzo meccanismo di lettura.
Altrimenti hai Lines.Text. Questa rappresenta una stringa pascal open classica.
A questo punto non ci sono molte altre cose da dirti, non sapendo il "formato" dati che vuoi utilizzare per scrivere/leggere le info.
Qui sta a te e alla tua fantasia.

Visto che sei appena approdato a Lazarus/Freepascal non ti imbarco nella scrittura ex nodo di un componente per la lettura/scrittura di un formato ad hoc basato sul rifacimento di un TMemo.

Stilgar
Titolo: Re:Salvataggio e apertura di file
Inserito da: nomorelogic - Dicembre 17, 2012, 09:17:32 am
ciao

Ciò che voglio fare io è quello di far salvare il file in un formato personale (ad esempio .abc) apribile solo con il mio programma.

un file di testo alla fine è un file di testo, per aprirlo solo con il tuo programma credo che dovresti criptare il contenuto.
Titolo: Re:Salvataggio, apertura e stampa di file di testo
Inserito da: mecoman - Dicembre 17, 2012, 01:08:27 pm
Ciao a tutti e grazie mille per le informazioni, sono state utili.

Vorrei porvi un altra domanda. Partendo dalla ipotesi iniziale ho aggiunto il tasto "Stampa" e vorrei che il contenuto della TMemo venisse stampato su carta. Riesco a far partire la stampa ma tutto il contenuto della TMemo mi viene stampato su un solo rigo.

Mi spiego meglio: dopo aver scritto il codice inerente il tasto "stampa" ho lanciato il programma per provarlo ed nella TMemo ho scritto 5 righe di testo. Quando clicco su stampa la stampante comincia a stampare, ma le 5 righe di testo le stampa su un unico rigo.
Come mai?
Di nuovo grazie a tutti. Ciao.   
Titolo: Re:Salvataggio e apertura di file
Inserito da: Stilgar - Dicembre 17, 2012, 02:01:42 pm
Come dicevo prima ... bisogna vedere il codice che hai scritto...
Se hai fatto un Canvas.textout secco senza prevedere il "tirono a capo" ... non c'è da meravigliarsi.
Titolo: Re:Salvataggio e apertura di file
Inserito da: mecoman - Dicembre 17, 2012, 02:31:14 pm
Ciao Stilgar.

Per quanto riguarda il "salvataggio" ho scritto questo codice:

procedure TForm1.ButtonSalvaClick(Sender: TObject);
Begin
  If SaveDialog.Execute then
  Begin
    Memo.Lines.SaveToFile(SaveDialog.FileName);
  end;
end;

Nella proprietà "Filter" del TSaveDialog ho inserito sia il filtro *.txt che il filtro *.abc ma il testo salvato lo riesco ad aprire anche con il blocco note di windows (ma questo vorrei che non accadesse).

Per quanto riguarda la "stampa" ho scritto questo codice:

procedure TForm1.StampaTextClick(Sender: TObject);
const MargineSx = 100;
var
  MargineUp:Integer;
begin
  If PrintDialog.Execute then
  Begin
    with Printer do
    try
      MargineUp:= 100;
      BeginDoc;
      Canvas.Font.Name:= 'Arial';
      Canvas.Font.Size:= 12;
      Canvas.Font.Color:= clBlack;
      Canvas.TextOut (MargineSx, MargineUp,Memo.Text);
    finally;
    EndDoc;
    end;
  end;
end;

Ciao.
Titolo: Re:Salvataggio e apertura di file
Inserito da: nomorelogic - Dicembre 17, 2012, 03:30:50 pm
Nella proprietà "Filter" del TSaveDialog ho inserito sia il filtro *.txt che il filtro *.abc ma il testo salvato lo riesco ad aprire anche con il blocco note di windows (ma questo vorrei che non accadesse).

per risolvere questo problema puoi solo criptare il contenuto


      Canvas.TextOut (MargineSx, MargineUp,Memo.Text);

la proprietà Text di TStrings ti da l'opportunità di vedere tutto il memo come una unica stringa, probabilmente è quello il problema.
dovresti stampare in un loop, leggi qua che dovrebbe andare bene
http://www.delphicorner.f9.co.uk/articles/op9.htm (http://www.delphicorner.f9.co.uk/articles/op9.htm)
Titolo: Re:Salvataggio e apertura di file
Inserito da: mecoman - Dicembre 27, 2012, 09:46:18 pm
Ciao a tutti.

Sono tornato ancora con questo problema, in parte risolto. Mi spiego meglio: ho un form contenente due Edit, un TMemo, un bottone "Salva" ed un bottone "Apri".

Gli obbiettivi che vorrei raggiungere sono due:
1) salvare i dati contenuti negli Edit e nel TMemo in un file cliccando sul tasto "Salva";
2) aprire il file salvato in precedenza ed inserire i dati nei rispettivi campi.

Con il primo obiettivo non ho avuto problemi mentre ne ho con il secondo.

Quando lancio l'applicazione, se clicco sul bottone "Apri", seleziono il file che mi deve aprire ma mi compare una finestra di "Notifica dell' eccezione del debugger".
Nella finestra è scritto testualmente:"Il progetto project1 ha sollevato una eccezione di classe 'RunError(103)'. In file 'unit1.pas' at line 80: Read (AddrFile, AddrRec);
Cliccando su continua ne apre un'altra con scritto:"Il progetto ha sollevato una eccezione di classe 'EinOutError' con messaggio:File not open. In file 'unit1.pas' at line 80: Read (AddrFile, AddrRec);

Qualcuno sa aiutarmi a risolvere il problema?

Ringraziando chiunque possa aiutarmi, riporto di seguito il codice che ho scritto:

Codice: [Seleziona]
unit Unit1;

{$mode objfpc}{$H+}

interface

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

{ Indirizzo di salvataggio }
type
  TAddressRec = record
    Testo1 : String [255];
    Testo2 : String [255];
    Testo3 : String [255];
  end;


  { TForm1 }

  TForm1 = class(TForm)
    ButtonCarica: TButton;
    ButtonSalva: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Memo: TMemo;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    procedure ButtonCaricaClick(Sender: TObject);
    procedure ButtonSalvaClick(Sender: TObject);

  public
    { public declarations }
  end;

var
  Form1: TForm1;
  AddrFile : File of TAddressRec;
  AddrRec : TAddressRec;

const
  MAXRECS = 2000;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.ButtonSalvaClick(Sender: TObject);
var
  salvataggio: TAddressRec;
begin
  salvataggio.Testo1:= Edit1.Text;
  salvataggio.Testo2:= Edit2.Text;
  salvataggio.Testo3:= Memo.Text;
  If Savedialog.Execute then
  assignfile (AddrFile,Savedialog.FileName);
  If FileExists (Savedialog.FileName) then
  begin
    Reset (AddrFile);
  end
  else
    Rewrite (AddrFile);
  with AddrRec do
  begin
    Testo1:= Edit1.Text;
    Testo2:= Edit2.Text;
    Testo3:= Memo.Text;
  end;
  write (AddrFile, AddrRec);
end;

procedure TForm1.ButtonCaricaClick(Sender: TObject);
begin
  try
  if opendialog.Execute then
  if fileexists (Opendialog.Filename) then
    Read (AddrFile, AddrRec);
    with AddrRec do
    begin
      Edit1.Text:= Testo1;
      Edit2.Text:= Testo2;
      Memo.Text:= Testo3;
    end;
  finally
  end;
end;

end.
Titolo: Re:Salvataggio e apertura di file
Inserito da: Stilgar - Dicembre 27, 2012, 10:02:15 pm
Ciao,
http://www.frameworkpascal.com/helphtml/run_errors.htm
Il file non sembra essere aperto.
In caso di salvataggio fai così:
Codice: [Seleziona]
 If Savedialog.Execute then
  assignfile (AddrFile,Savedialog.FileName);
  If FileExists (Savedialog.FileName) then
  begin
    Reset (AddrFile);
  end
  else
    Rewrite (AddrFile);
in lettura :
Codice: [Seleziona]
 if fileexists (Opendialog.Filename) then
    Read (AddrFile, AddrRec);
    with AddrRec do

Dovresti aprirlo ...
http://www.freepascal.org/docs-html/rtl/system/reset.html
Titolo: Re:Salvataggio e apertura di file
Inserito da: mecoman - Dicembre 28, 2012, 02:26:39 pm
Ciao Stilgar. Grazie per l'aiuto.

Anche io ho pensato che il file non sembrava aperto, ma non capisco dove sbaglio.
I due codici che mi hai scritto sono identici a quelli presenti nel mio listato e come risultato mi genera la finestra di notifica dell'eccezione.
Hai mai provato qualcosa di simile?

Ciao, grazie
Titolo: Re:Salvataggio e apertura di file
Inserito da: nomorelogic - Dicembre 28, 2012, 04:17:41 pm
per la lettura, prendi spunto da qua
http://www.freepascal.org/docs-html/rtl/system/read.html (http://www.freepascal.org/docs-html/rtl/system/read.html)

in fondo al reference trovi un esempio
Titolo: Re:Salvataggio e apertura di file
Inserito da: bonmario - Dicembre 28, 2012, 06:20:56 pm
Ciao Stilgar. Grazie per l'aiuto.

Anche io ho pensato che il file non sembrava aperto, ma non capisco dove sbaglio.

Prima di questa istruzione:
Codice: [Seleziona]
Read (AddrFile, AddrRec);
devi aprire il file con:
Codice: [Seleziona]
Reset (AddrFile);

Alla fine sia della routine di scrittura che di quella di lettura, devi chiudere il file con:
Codice: [Seleziona]
CloseFile(AddrFile);

Ciao, Mario
Titolo: Re:Salvataggio e apertura di file
Inserito da: Stilgar - Dicembre 28, 2012, 08:30:27 pm
mecoman, i listati che ho postato sono pezzi del tuo.
Volevo farti notare la differenze tra l'apertura in lettura e in scrittura.

Edit
Prova a scrivere e leggere il file, non importa il nome che dai al file da leggere, vedrai che rilegge il file che hai appena scritto, ma dalla fine. Quindi ti dirà che hai provato a leggere oltre il file o che il file non è aperto in lettura.
Titolo: Re:Salvataggio e apertura di file
Inserito da: mecoman - Dicembre 28, 2012, 11:59:48 pm
Grazie a tutti. Sono riuscito a risolvere il problema.

Vorrei porvi un'altra domanda (sperando di non essere "pesante"): se oltre al testo volessi far salvare anche un'immagine, il metodo che sto usando potrebbe andare bene?

Ciao e grazie di nuovo.
Titolo: Re:Salvataggio e apertura di file
Inserito da: Stilgar - Dicembre 29, 2012, 12:07:07 am
Con le immagini ci sono molti modi per incasinarsi la vita.
Le immagini di Lazarus supportano lo streaming.
Tu hai preso un'altra strada.
Così a sentimento, dico che non puoi farlo. Ma inventandosi sistemi assurdi penso che tu possa farlo.
Ti consiglierei di cambiare con la classe TFileStream.
Questa permette anche la lettura/scrittura di blocchi di memoria, quindi supportano il sistema di scrittura/lettura che avevi in mente.
Di base cambiano le istruzioni da usare.


Stilgar