* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 29, 2024, 02:31:37 pm

Inserisci il nome utente, la password e la durata della sessione.

310 Visitatori, 0 Utenti

Autore Topic: creazione file.. contenente immagini ..e non solo come fare  (Letto 9547 volte)

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 116
  • Karma: +0/-0
creazione file.. contenente immagini ..e non solo come fare
« il: Dicembre 02, 2012, 11:48:13 am »
Salve,
mi servirebbe di creare un file che contenga al suo interno dei dati da utilizzare runtime.... ma questi dati sono misti... testo e immagini... e quindi le immagini non hanno una dimnsione fissa....

Stavo pensando ad un file di risorse.. ma il problema è che tale file deve crearlo pure chi non ha il compilatrore... quindi devo per forza agire runtime sia per la creazione che per la lettura...

ho creato un tipo personale che contiene i dati testuali che salvo in un file... come potrei accodarci le immagini e come potrei poi loadarle?

spiego meglio

type
mytype: record
alunno, nome:string[200];
voti:array[1..50] of integer;
fotoalunno:string[200]// percorso dove cercare la foto
end;
type tclasse=record
alunno:array[1..40] of mytype;

var classe: mytype;

per salvare il file .....

var f:file of classe
assignfile (f,'mia classe.fls');
rewrite(f);
write(f,classe);
closefile(f);

per caricare il file .....

var f:file of classe
assignfile (f,'miaclasse.fls');
reset(f);
read(f,classe);
closefile(f);


mi piacerebbe accodare al file 'miaclasse.fls' le immagini e poterle poi riprendere runtime...


Se avete qualche idea e se mi sono spiegato bene.... aspetto risposte....




Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:creazione file.. contenente immagini ..e non solo come fare
« Risposta #1 il: Dicembre 03, 2012, 11:14:30 am »
Ciao Narciso,
allora io applico una regolina tutta mia.
1) Formato fisso : File Of Record
2) Formato variabile : FileStream.
3) Testo: ... TStringList è tanto comoda per leggere e scrivere testo che non mi sbatto nemmeno a usare File of Text.

Oppure potrebbe essere interessante la lettura di questo articolo ;)

http://www.gamedev.net/page/resources/_/technical/apis-and-tools/creating-a-pak-file-format-r1991

Ciao
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 116
  • Karma: +0/-0
Re:creazione file.. contenente immagini ..e non solo come fare
« Risposta #2 il: Dicembre 03, 2012, 03:38:09 pm »
ALLORA AMMETTIAMO CHE IN UNO STREAM VOGLIA METTERE 4 ( O 40 O QUANTE NE VOGLIO) IMMAGINI E 4 ( O 40 O QUANTE NE VOGLIO)  STRINGHE...... IN MODO TALE DA POTERLE LEGGERE A PIACERE... ( ANCHE TUTTE INSIEME IN MODO SEQUENZIALE)..... COME DOVREI FARE?

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:creazione file.. contenente immagini ..e non solo come fare
« Risposta #3 il: Dicembre 03, 2012, 08:01:19 pm »
nel tuo caso avresti bisogno di salvare i tuoi dati con uno schema preciso, io userei il FileStream.

Per ogni oggetto da salvare:
1) "write" del tipo di oggetto ad esempio come char ('T' = testo, 'B' = bitmap, 'J' = jpeg, 'G' = gif e così via)
2) "write" della dimensione in byte come intero (bigint mi sembra esagerato)
3) "write" di N byte che compongono l'informazione da salvare
questo schema lo dovresti ripetere per ogni cosa che salvi.

Andando a rileggere dovresti rileggere con la stesa sequenza:
1) "read" di 1 char per il tipo
2) "read" di 1 integer per la dimensione
3) "read" di N bytes che è il contenuto.

In questo modo salvi quello che tipare quante volte ti pare.
Imagination is more important than knowledge (A.Einstein)

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 116
  • Karma: +0/-0
Re:creazione file.. contenente immagini ..e non solo come fare
« Risposta #4 il: Dicembre 03, 2012, 10:02:41 pm »
Allora.. io ci ho provato.. il codice non da' errori ma non sortisce effetto desiderato.....
se carico lo stream, non appaiono immagini e testo salvato....

creata 1 form con
1 pulsante
1 timage
1 menu per salvare e caricare (sia immagini che stream)
4 dialog (2 per salvare  2 per caricare)



//**************************codice*****************************

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Menus, ExtDlgs;

type

  { TForm1 }

  TForm1 = class(TForm)
    Edit1: TEdit;
    Image1: TImage;
    MainMenu1: TMainMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    MenuItem6: TMenuItem;
    MenuItem7: TMenuItem;
    OpenDialog1: TOpenDialog;
    OpenPictureDialog1: TOpenPictureDialog;
    SaveDialog1: TSaveDialog;
    SavePictureDialog1: TSavePictureDialog;
    procedure MenuItem3Click(Sender: TObject);
    procedure MenuItem4Click(Sender: TObject);
    procedure MenuItem6Click(Sender: TObject);
    procedure MenuItem7Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.MenuItem6Click(Sender: TObject);
begin
  if openpicturedialog1.execute then

  image1.picture.loadfromfile(openpicturedialog1.filename);

end;

procedure TForm1.MenuItem4Click(Sender: TObject);
var
  f : TFileStream;
  Lung:longint;
  tipo:char;
  bmp:tbitmap;
begin
if savedialog1.Execute then begin
f := TFileStream.Create(savedialog1.FileName, fmCreate);
f.Position := 0;
tipo:='s';//stringa definizione del tipo ridondante perche' prestabilita, ma non si sa mai!
lung:=sizeof(edit1.text);
f.Write(edit1.text,lung);
bmp:=tbitmap.create;
bmp.assign(image1.picture.bitmap);
tipo:='b';//bitmap
lung:=sizeof(bmp);
f.Write(bmp,lung);
f.Free;
bmp.free;
end;
end;

procedure TForm1.MenuItem3Click(Sender: TObject);
var

  f : TFileStream;
  Lung:longint;
  tipo:char;
  bmp:tbitmap;
  s:string;
begin
if opendialog1.Execute then begin
f := TFileStream.Create(opendialog1.FileName, fmOpenReadWrite);
f.Position := 0;
f.read(tipo,sizeof(tipo));
f.read(lung,sizeof(lung));
f.read(s,lung);
bmp:=tbitmap.create;
lung:=sizeof(bmp);
f.read(tipo,sizeof(tipo));
f.read(lung,sizeof(lung));
f.read(bmp,lung);
image1.picture.bitmap.assign(bmp);
edit1.text:=s;
f.Free;
bmp.free;

end;
end;



procedure TForm1.MenuItem7Click(Sender: TObject);
begin
  if savepicturedialog1.execute then
  image1.picture.savetofile(savepicturedialog1.filename);
end;

end.


Che c'e' di sbagliato?
     

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:creazione file.. contenente immagini ..e non solo come fare
« Risposta #5 il: Dicembre 04, 2012, 11:35:52 am »
SizeOf sospetto che restituisca sempre 4 ... o 8 se hai un'architettura a 64 bit ...
Per le stringhe c'è un'altra strada da usare ... o fai un loop tu che scriva ogni singolo carattere o ti affidi al metodo degli stream per la scrittura delle stringhe. In altternativa puoi modificare il codice esistente +o - così:
Codice: [Seleziona]
lung:=sizeof(edit1.text);
f.Write(edit1.text,lung);
....
lung:=sizeof(bmp);
f.Write(bmp,lung);
diventerebbe
Codice: [Seleziona]
  lung:=length(edit1.text);
  f.Write(lung,sizeOf(integer);
  f.Write(edit1.text[1],lung);
...
 bmp.savetoStream(f);

codice non testato, ma scritto a memoria.
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:creazione file.. contenente immagini ..e non solo come fare
« Risposta #6 il: Dicembre 05, 2012, 12:12:04 am »
f.read(bmp,lung);
[...]
Che c'e' di sbagliato?   

non puoi leggere un componente in questo modo, per fare qualcosa del genere dovresti avere un buffer che punta al primo byte dell'oggetto bitmap e ne devi conoscere anche la dimensione (non dell'immagine, ma dell'intera istanza di TBitmap).
Se vuoi intraprendere questa strada, leggi qua
http://wiki.lazarus.freepascal.org/Streaming_components

In alternativa ho fatto un piccolo esempio per lavorare con un file di risorse fatto in casa.
Una volta compilato il progetto puoi cliccare direttamente su bottone a destra che legge tutte le risorse dal file.

Per farti un tuo file di risorse, cancella "Resource.data" e poi:
1) aggiungi qualche stringa
2) aggiungi 1 immagine (è un esempio, se ne metti più di una in Image1 c'è sempre l'ultima :P)
3) aggiungi ancora qualche stringa
4) chiudi il programma
5) rilancialo e poi clicca su leggi

E' un progettino semplice ma aiuta a capire come muoversi.
Imagination is more important than knowledge (A.Einstein)

El Salvador

  • Visitatore
Re:creazione file.. contenente immagini ..e non solo come fare
« Risposta #7 il: Dicembre 05, 2012, 01:36:44 am »
Magari non sarà veloce quanto la gestione di file binari, ma non è più semplice zippare le risorse in un unico file zip (magari senza compressione per avere il massimo della velocità) e decomprimere all'avvio del programma in una cartella temporanea del sistema?

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:creazione file.. contenente immagini ..e non solo come fare
« Risposta #8 il: Dicembre 05, 2012, 08:56:32 am »
si, zippando il tutto è più semplice ma c'è qualche limite e quindi dipende dall'applicazione che si deve realizzare.
Lasciare i file già decompressi in una sottocartella sarebbe ancora più facile ma non è detto che sia la soluzione migliore (si è a rischio smanettoni ad esempio :D).

Serializzare le risorse in un file, oltre al vantaggio della velocità, dà l'opportunità di memorizzare molte più informazioni rispetto al dato nudo e crudo. Ad esempio una immagine potrebbe non essere sufficiente, potrebbe essere necessario memorizzare anche Top, Left, Width, Heigth, Stretch ed altro ancora del TBitmap che andrà a contenerla a runtime.

ciao

Edit:
forse Narciso saprà toglierci la curiosità ;)
« Ultima modifica: Dicembre 05, 2012, 09:01:24 am da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:creazione file.. contenente immagini ..e non solo come fare
« Risposta #9 il: Dicembre 05, 2012, 12:22:42 pm »
@El Salvador. Quello che narciso sta cercando di fare è una cosa che i videogiochi fanno da un sacco di tempo ...
in più le "stringhe" diventerebbero dei file.

@Narciso ... prova a prendere ispirazione da questo progettino : https://bitbucket.org/cheriff/packlib

Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 116
  • Karma: +0/-0
Re:creazione file.. contenente immagini ..e non solo come fare
« Risposta #10 il: Dicembre 08, 2012, 08:05:45 pm »
Ringrazio Tutti coloro che hanno risposto... ho risolto anche questo dilemma grazie alle drittte di nomerologic.. quindi a lui un Grazie speciale

 

Recenti

How To

Utenti
Stats
  • Post in totale: 18781
  • Topic in totale: 2235
  • Online Today: 375
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 310
Total: 310

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.