Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: alexarmato66 - Maggio 29, 2021, 06:42:51 pm

Titolo: OpenDialog SaveDialog
Inserito da: alexarmato66 - Maggio 29, 2021, 06:42:51 pm
Qualcuno ha un esempio di come salvare ed aprire un file con SaveDialog ed OpenDialog un
componente TEdit ed una griglia TStringGrid contemporaneamente ?
Titolo: Re:OpenDialog SaveDialog
Inserito da: bonmario - Maggio 30, 2021, 09:54:58 am
Scusa, ma non sono sicuro di avere capito ...
Vuoi che nello stesso momento vengano aperte sia la finestra della "SaveDialog" che quella della "OpenDialog" ?

Se è così, l'unico modo che mi viene in mente, è quello di aprire una delle 2 tramite un thread separato, e l'altra nel thread principale.

Se non è così, potresti spiegare un po' più approfonditamente cosa vorresti fare?

Ciao, Mario

Titolo: Re:OpenDialog SaveDialog
Inserito da: alexarmato66 - Maggio 30, 2021, 05:02:39 pm
NO, vorrei salvare in un unico file sia dei componeneti Tstringgrid che dei componenti tipo TEdit
Titolo: Re:OpenDialog SaveDialog
Inserito da: bonmario - Maggio 30, 2021, 06:16:39 pm
Puoi adattare questo per salvare:
Codice: [Seleziona]
    with SaveDialog1 do begin
      DefaultExt:= '.CSV';
      Filter:= 'File CSV (*.CSV)|*.CSV';
      SaveDialog1.Title:='Seleziona il file';
      SaveDialog1.Options:=[ofEnableSizing,ofViewDetail,ofReadOnly];

      //Preimposto il valore attuale
      FileName:=NomefileCSV;
      if Execute then begin
        NomefileCSV:=FileName;
      end;
    end;

    Scrivi:=False;
    if (NomefileCSV <> '') then begin
      qui metti il tuo codice
    end;

Questo invece per leggere:
Codice: [Seleziona]
  with OpenDialog1 do begin
    DefaultExt:= '.CSV';
    Filter:= 'File CSV (*.CSV)|*.CSV';
    OpenDialog1.Title:='Seleziona il file';
    OpenDialog1.Options:=[ofEnableSizing,ofViewDetail,ofReadOnly];

    //Preimposto il valore attuale
    FileName:=NomeFileCSV;
    if Execute then begin
      NomeFileCSV:=FileName;
    end;
  end;
 
  //... lo apro
  if FileExists(NomeFileCSV) then begin
      qui metti il tuo codice
  end else begin
    ShowMessage('Il file da aprire non esiste');
  end;
Titolo: Re:OpenDialog SaveDialog
Inserito da: alexarmato66 - Maggio 30, 2021, 06:36:12 pm
Grazie. E se dovessi salvare anche un componenete TEdit dovrei aggiungere un altro OpenDialog2 e SaveDialog2
o posso inglobarlo nello stesso Open/SaveDialog?
Titolo: Re:OpenDialog SaveDialog
Inserito da: bonmario - Maggio 30, 2021, 06:40:42 pm
Forse stiamo parlando di 2 cose diverse ...

OpenDialog, serve per selezionare un file, e passare tale nome al sorgente. Poi sta a te scrivere il codice di come leggere il file.
Stessa logica per SaveDialog.

Ciao, Mario
Titolo: Re:OpenDialog SaveDialog
Inserito da: DragoRosso - Maggio 30, 2021, 07:45:58 pm
Immagino che ciò che vuole fare @alexarmato66 è serializzare un componente.

La serializzazione di un componente è una operazione che comporta alcune problematiche, una tra le principali controindicazioni è la possibile variazione del componente in una successiva versione dell'ambient edi sviluppo.

E' bene che invece di salvare il componente (serializzare), vengano salvate le sue proprietà notevoli: ad esempio in una TEdit il suo valore TEXT è in una TStringGrid i valori Strings.

Cioò rende compatibile il codice comunque il componente venga modificato in futuro (o almeno con meno possibilità di incompatibilità).

Ciao
 
Titolo: Re:OpenDialog SaveDialog
Inserito da: nomorelogic - Maggio 31, 2021, 10:18:48 am
ciao alexarmato66

se non ho capito male, devi salvare su un unico file

La cosa non è proprio immediata, bisognerebbe chiarire un po' di cose.

Per gli oggetti che derivano da TPersistent hai a disposizione le informazioni RTTI.
Comunque sia questo ti permette di poter salvare facilmente le proprietà che sono dichiarate published.
Devi vedere però se hai necessità di salvare anche proprietà non published (cioè le public).
Ad esempio il TOpenDialog ha solo le opzioni come published mentre può darsi tu voglia salvare filtri e magari il filename selezionato. Questo vuol dire che devi inventarti un tuo serializzatore.

Per gli oggetti che non derivano da TPersistent come TStringList, non hai proprietà published (quindi ricadi nel caso OpenDialog), in più, probabilmente immagino vorrai salvare il contenuto dei dati.

Quindi, visto che la necessità è di salvare tutto su un unico file, potrei consigliarti di realizzare una classe che si occupi della serializzazione in generale.
In questa classe dovresti predisporre un metodo per ogni classe da serializzare, esempio:

poi un metodo per lettura e scrittura:

In questo modo isoli i problemi di serializzazione in metodi diversi ed hai una classe che gestisce il tutto.

nomorelogic
Titolo: Re:OpenDialog SaveDialog
Inserito da: alexarmato66 - Giugno 03, 2021, 04:13:24 pm
Non sono molto esperto...mi basterebbe un esempio di scrittura ed apertura di un file formato testo dove ci siano
almeno due stringgrid ed un TEdit.
Titolo: Re:OpenDialog SaveDialog
Inserito da: DragoRosso - Giugno 03, 2021, 07:17:32 pm
Allego progetto per il salvatagggio e il caricamento di una TEdit e di una TStringGrid.
Il codice dovrebbe essere chiaro.

Quando lanci la prima volta il programma, puoi aprire il file di esempio (prova.cpst) presente nella cartella stessa e vedi cosa accade.

Parti da qui, è la cosa più semplice secondo me.

Ciao
Titolo: Re:OpenDialog SaveDialog
Inserito da: alexarmato66 - Giugno 03, 2021, 08:38:36 pm
GRAZIE!!!!DRAGO ROSSO SEI UN FENOMENO!!!
Titolo: Re:OpenDialog SaveDialog
Inserito da: alexarmato66 - Ottobre 20, 2021, 08:42:31 am
Se volessi modificare l'esempio Save.zip per il salvataggio diretto,
senza Save As, come dovrei fare?Grazie
Titolo: Re:OpenDialog SaveDialog
Inserito da: DragoRosso - Ottobre 20, 2021, 10:12:32 am
Il codice originale, in particolare il "SaveDialog1.Execute" (e così pure per la OpenDialog1)
Codice: [Seleziona]
    if SaveDialog1.Execute then
      begin
        MemStr := TFileStream.Create(SaveDialog1.FileName, fmCreate); 
viene usato esclusivamente per assegnare un nome al file che dovrà essere elaborato (scritto in questo caso).

Il nome del file scelto dall'utente viene assegnato dal componente alla proprietà "SaveDialog1.FileName".
Se commenti l'Execute e sostituisci a FileName una stringa (o una variabile stringa) hai ciò che chiedi.
Codice: [Seleziona]
    //if SaveDialog1.Execute then
      begin
        //MemStr := TFileStream.Create(SaveDialog1.FileName, fmCreate);
        MemStr := TFileStream.Create('sono il nome del file dal creare.cpst', fmCreate); 

Ciao
Titolo: Re:OpenDialog SaveDialog
Inserito da: alexarmato66 - Ottobre 20, 2021, 11:31:54 am
GRAZIE!!!
Titolo: Re:OpenDialog SaveDialog
Inserito da: alexarmato66 - Settembre 15, 2022, 08:32:12 am
Per il mio progetto ho utilizzato l'esempio di DRAGOROSSO postato il Giugno 03, 2021, 07:17:32.Ho un solo problema quando carico più files sembrerebbe che alcuni dati , forse delle stringgrid, rimangano in memoria contaminando così i risultati.Forse dovrei pulire in qualche modo le stringgrid?Qualcuno può aiutarmi?Grazie
Titolo: Re:OpenDialog SaveDialog
Inserito da: Stilgar - Settembre 15, 2022, 08:52:27 am
Forse ti basta un doppio ciclo for per pulire i dati prima di caricarli.
Intendo una cosa del tipo: cells[x,y] := '';




Stilgar
Titolo: Re:OpenDialog SaveDialog
Inserito da: DragoRosso - Settembre 15, 2022, 09:07:29 am
Puoi eseguire la procedura Clean (e.g. StringGrid1.Clean) per "svuotare" la griglia prima di caricare i nuovi dati.
 

Ciao
Titolo: Re:OpenDialog SaveDialog
Inserito da: alexarmato66 - Settembre 22, 2022, 08:05:13 am
Devo pulire anche i TEdit o simili?
Titolo: Re:OpenDialog SaveDialog
Inserito da: DragoRosso - Settembre 22, 2022, 09:48:48 pm
Devo pulire anche i TEdit o simili?

Farlo non fà mai male. Per sapere se è necessario o no devi solo provare.
Ciao.
Titolo: Re:OpenDialog SaveDialog
Inserito da: alexarmato66 - Gennaio 26, 2023, 01:42:02 pm
Nello stesso esempio di DRAGOROSSO postato il Giugno 03, 2021, 07:17:32 ho provato a salvare
un CHEKBOX ma senza risultato.
Allego il file, Grazie.
Titolo: Re:OpenDialog SaveDialog
Inserito da: quack - Gennaio 26, 2023, 07:50:10 pm
Prova a sostituire il clico for
Codice: [Seleziona]
 
for p in SG_1.Columns do 
  p.Free;
con l'istruzione
Codice: [Seleziona]
SG_1.Columns.Clear;
e dovrebbe andare.

Non conosco questo componente ma così sembra funzionare.
Titolo: Re:OpenDialog SaveDialog
Inserito da: alexarmato66 - Gennaio 27, 2023, 08:33:24 am
forse ho risolto così:
Codice: [Seleziona]
CheckBox1.Checked:=false;
          MemStr.ReadComponent(CheckBox1);