Newsgroup: it.comp.lang.delphi
Titolo: Salvare e importare immagine da un file ini

Attraverso queste semplici righe di codice:
var
  Form1: TForm1;
  save: TiniFile;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  save:=TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'save.ini');
  save.WriteString('Save','immagine',OpenPictureDialog1.FileName);
  save.Free;
end;   
 
Quello che non riesco a fare, e mi chiedo se sia possibile , è l'operazione inversa, cioè una volta che il percorso del file cioè l'immagine è memorizzzata nel file ini, come importare l'immagine andando a leggere il percorso del file memorizzato nel file ini, associando il tutto ad esempio all'evento onclick di un pulsante.
Capisco che questa descrizione è un pò confusa ma spero che qualcuno abbia capito il mio probema.
Grazie
 
 

Non ho capito, intendi una cosa del tipo?
 
procedure TForm1.Button1Click(Sender: TObject);
Var txt : String;
begin
   save:=TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'save.ini');
   txt := save.ReadString('Save','immagine','');
   save.Free;
end;
 
 
 
-- 
-------------------------------
per scrivere in privato
togliere "1975nosp"
 
to reply remove "1975nosp"


Intanto grazie posto il codice:
var
  Form1: TForm1;
  save: TiniFile;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  save:=TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'save.ini');
  save.WriteString('Save','Memo',memo1.Text);
  save.WriteBool('Save','ceck',Checkbox1.Checked);
  save.WriteInt64('Save','color', Memo1.Color);
  save.WriteString('Save','immagine',OpenPictureDialog1.FileName);
  save.Free;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  if ColorDialog1.Execute then
  Memo1.Color:=ColorDialog1.Color;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
 
 
 
procedure TForm1.FormCreate(Sender: TObject);
 Var txt : String;
 
begin
  save:=TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'save.ini');
  Memo1.Text:= save.ReadString('Save','Memo',memo1.Text);
  Checkbox1.Checked:= save.ReadBool('Save','ceck',Checkbox1.Checked);
  Memo1.Color:=save.ReadInt64('Save','color',Memo1.Color);
  txt := save.ReadString('Save','immagine','');
  save.Free;
end;
 
end.    
 
In poche parole:  io chiudo l'app, appena rieseguo il programma   si deve
ricaricare l'immagine il cui percorso è memorizzato nel file ini.
Per essere più preciso l'imagine si deve ricaricare a runtime.
 
Grazie                            
 
 
 
 
 
 
 
 
 

 end;
 
Ciao.

 > Il 02/06/2022 13:57, Maurizio Alberti ha scritto:
 >>
 >> procedure TForm1.FormCreate(Sender: TObject);
 >>   Var txt : String;
 >>
 >> begin
 >>    save:=TiniFile.Create(ExtractFilePath(ParamStr(0)) + 'save.ini');
 >>    Memo1.Text:= save.ReadString('Save','Memo',memo1.Text);
 >>    Checkbox1.Checked:= save.ReadBool('Save','ceck',Checkbox1.Checked);
 >>    Memo1.Color:=save.ReadInt64('Save','color',Memo1.Color);
 >>    txt := save.ReadString('Save','immagine','');
 >>    save.Free;
 
Puoi anche metterla qui: Image1.Picture.LoadFromFile(txt);
 
 >> end;


Ciao...
in realta' tu non stai "salvando" e "caricando" un'immagine dal un file 
ini. Quello che stai facendo e' "salvare" un percorso e un nome di un 
file all'interno di un .ini
Questa strategia (che ho usato per anni ...) non e' del tutto corretta.
Infatti cosa succede se (per caso o pe qualsiasi motivo) il file viene 
cancellato o sostituito???
Per questo motivo ho adottato un altro approccio.
Nelle mie applicazioni (ad uso quasi esclusivamente personale) tutti i 
file che servono al programma (immagini o altro) li salvo tutti nell'exe 
come "risorse". In questo modo eviti mille complicanze che, potrebbero, 
verificarsi (molto piu' di quanto si possa credere).
 
Ciao
Daniele


Grazie cercherò di seguire il tuo consiglio.

 implementation 
 
Queste semplici righe di codice sono una bestemmia.
Usare variabili globali nel 2022 è fa pazzi.
Poi, hai le idee confuse.
Non stai salvando l'immagine, stai salvando il PATH dell'immagine:
 
 
 
procedure TForm1.Button1Click(Sender: TObject); 
var
  save: TiniFile; 
  filenameandpath: string;
begin 
  filenameandpath := save:=ExtractFilePath(ParamStr(0)) + 'save.ini';
 save:=TiniFile.Create(filenameandpath); 
TRY
  save.WriteString('Save','immagine',OpenPictureDialog1.FileName); 
 
FINALLY
  save.Free; 
end; 
 
A.

 Per questo motivo ho adottato un altro approccio. 
 
Prendi una qualsiasi applicazione che, A RUNTIME, permette all'utente di caricare delle immagini.....
Cosa fai, ricompili l'applicazione ogni volta...?
 
A.


Onestamente detta cosi' non e' che si capisca molto.
Tuttavia per il numero delle immagini che utilizzo (una decina in tutto) 
salvarle nelle risirse lo trovo molto comodo.
Poi ognuno segue la strategia che ritiene piu' efficace ...
 
Ciao
Daniele

 Poi ognuno segue la strategia che ritiene piu' efficace ... 
Non cambiano le carte in tavola.
Qua non si tratta di "strategia efficace"...
La tua strategia non è applicabile per il caso specifico...tutto qua.
 
A.

Concordo con Alberto, dipende da cosa devi fare con le immagini.
 
Se sono parte integrante del programma (tipo icone o simili) è sicuramente comodo integrarle nell'eseguibile inserendole nelle risorse.
 
Se si tratta di immagini specifiche dell'azienda/cliente che utilizza il programma è più comodo che siano esterne, quindi la memorizzazione in un file di configurazione del path + nome file è la scelta ottimale (o se preferisci in un database o nel registro di windows)
Vedi ad esempio il logo dell'azienda per la stampa dei documenti o la compilazione di una mail con firma e immagini
 
 
Alessandro


Rimango sulla mia posizione.
Ovvero per quelle immagini che sono utilizzate nel programma e che non 
richiedono personalizzazioni, le salvo nelle risorse.
L'immagine del logo la salvo nel db insieme ai dati dell'azienda.
 
Solo Alessandro sa cosa deve fare con questa/e immagine/i quindi sara' 
lui a decidere cosa utilizzare secondo le sue necessita'.
 
Per quanto rigurda la seconda parte della domanda, come puoi scrivere un 
file ini lo puoi anche leggere. Quando premi il pulsante leggi il file 
ini, recuperi il nome del file cosi' come lo hai salvato (completo di 
percorso) e poi carichi l'immagine dove serve.
 
Ciao
Daniele
 
 

 L'immagine del logo la salvo nel db insieme ai dati dell'azienda. 
 
Non in un RES? Come mai...?
 
 
A.

 o se preferisci in un database o nel registro di windows) 
 
Il registro di Windows meglio non toccarlo.
Un db garantisce maggior sicurezza, cosa non trascurabile oggi giorno, visto che con troppa frequenza ci sono problemi di cyber security.
Il file system è meno sicuro e, sopratutto, non centralizzato.
 
A.


Stiamo esprimendo lo stesso concetto ...
 
Ciao
Daniele
 
PS: Quotansdo la tua "riga"
 > Ti sembra plausibile che a runtime l'utente scelga un immagine da 
usare in una toolbar....?
 
Ebbene lo scorso anno la nuova versione del nostro gestionale (inteso 
quello utilizzato sul lavoro) indroduceva, con una certa enfasi ed 
orgoglio, la possibilita' di scegliere le immagini per i vari pulsanti 
del programma (quasi tutti...).
 
 

 del programma (quasi tutti...).
 
..follia...ma certo quelle immagini non finiscono in un res, strategia che tu spingi dall'inizio della discussione
 
A.