Qualcuno ha un'idea su come fare ? Preferiri codice piuttosto che componenti
già pronti (ma vanno bene anche questi se non avete codice ! :o)
Ciao e grazie a tutti ! {MSX}
{MSX} <Lugatoso...@iol.it> wrote in message
V8c54.27120$Bg7.2...@typhoon.libero.it...
{MSX} ha scritto nel messaggio ...
>Salve a tutti !
>Sto cercando un metodo per salvare dei dati all'interno di un programma in
>modo da non dover ricorrere a file esterni quando devo leggerli e in modo
da
>far stare tutto su un solo file.
>
>Qualcuno ha un'idea su come fare ? Preferiri codice piuttosto che
componenti
>già pronti (ma vanno bene anche questi se non avete codice ! :o)
il tuo problema lo puoi risolvere perfettamente utilizzando le risorse.
Se non sei pratico, dovrai documentarti.
In questo news ho lasciato due o tre messaggi (indietro di qualche giorno o
settimana) dove c' è scritto come includere nell' eseguibile un MID nell'
eseguibile, un wave, bmp o altro genere di file.
Comunque ora sono un po' di fretta e per spiegarti le risorse mi occorre un
po' di tempo ed un bel messaggione.
Se mi scrivi in privato posso inviarti un esempio che avevo preparato tempo
fa e poi mi sono dimenticato di inviarlo a chi l' aveva richiesto.
Non ti assicuro di averlo al 100%, però mi pare di averlo visto in giro
nell' HD !! eheh (è si....si stava facendo una passeggiata tra le varie
directory)
A parte gli scherzi, se vuoi scrivimi !!
Ciaoooooooo !!!!!
Antonio Tarolla
BSSoftware Tips Mailing - List Support
--
Pier Luigi Fiorini
www.fiorinisoft.n3.net
Funziona in questo modo:
1. crei il file OBJ con un comando simile
binobj file.dat file.obj MieiDati
2. poi includi il codice
procedure MieiDati; external; {$L file.obj}
Ricordati di non chiamare quella procedura, a meno che si tratti
veramente
di codice eseguibile.
Puoi usare i tuoi dati con un puntatore, ad esempio:
var f: file;
begin
assignfile(f,'c:\temp\prova.dat');
blockwrite(f, @MieiDati, 12345); // 12345 è la dimensione di MieiDati
(quella devi saperla)
closefile(f);
end;
P.S. per scaricare binobj (se non hai Turbo Pascal) abbi pazienza: io ho
impirgato
2-3 minuti (anche se sono solo 9 kb)! Mi sembra che in Tailandia le
connessioni non
siano molto rapide...
Non è così semplice scrivere su un file aperto...
Penso che si potrebbe fare così: includere (come risorsa) un piccolo exe che
non fa altro che scrivere alla fine dell'exe vero e seguire quest'ordine:
- estrarre il mini-exe dall'exe-normale
- avviare il mini-exe che dovrà aspettare che l'exe-normale termini
- termine exe-normale
- il mini-exe scrive in coda all' exe-normale i dati [con le dovute
considerazioni (cancella i vecchi dati, dimensione dei dati ecc ecc)]
- il mini-exe, prima di terminare, elimina il file di appoggio che ha
inglobato nell'exe-normale, riavvia l'exe-normale [magari con un parametro
per poter dare un feedback adeguato all'utente] e segnala all'exe-normale di
eliminare il mini-exe...
Un po' contorto ma efficace per poter salvare dati direttamente nell'exe...
Ps: io prenderei in considerazione il registry...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply
Ciao Antonio,
le risorse possono essere utili se vuoi salvare un
certo dato e mantenerlo costante nel tempo...
Non credo si possa (tranne che sotto NT) scrivere a run-time le risorse di
un altro Exe ma aspetto smentite... ;-)
Contorto?? NOOOooo :))
No... ..allora, per fare un pó di chiarezza:
Non ci sono assolutamente problemi ad appendere dati ad un file eseguibile
anche durante il suo funzionamento, non grazie alla condivisione poiché l'ho
sempre fatto anche in Dos, i problemi si presentano quando si interagisce
con la collocazione dei blocchi del file nell'hard disk con ad esempio
operazioni di riscrittura o cancellazione. Ma "appendere" non da problemi.
Lo stesso vale per gli antivirus. Non si accorgono di niente proprio perché
l'eseguibile rimane immutato, provate pure a fare l'inoculazione!
Poi é chiaro che se il ragazzo doveva usare bmp o wav ecc fisse gli
conveniva usare le risorse ma non era questo il suo caso, e certo se i dati
non sono molti conviene usare il registry!
CIAO@@ :)
Ci tengo a dare un grande saluto ad Andrea Magni che insieme ad Alex
Martelli sono quelli che postando mi danno le idee migliori!
Andrea Magni ha scritto:
>Ciao Antonio,
> le risorse possono essere utili se vuoi salvare un
>certo dato e mantenerlo costante nel tempo...
e io avevo capito proprio questo.
Ma perchè lui vuole modificare l' eseguibile mentre questo è in esecuzione
aggiungendo dei dati che interessano a lui ?
Allora se è così ho capito male !!
>Non credo si possa (tranne che sotto NT) scrivere a run-time le risorse di
>un altro Exe ma aspetto smentite... ;-)
In effetti il problema è complesso.
Comunque forse si può fare ma dovrei vedere bene l' help.
In pratica è possibile modificare l' exe a run-time utilizzando un exe
copia.
A questo punto bisognerebbe far in modo di dedicare una sezione dell' exe
alle risorse che ci interessano.
Logicamente questa sezione è statica e può essere solo modificata ma non
ampliata altrimenti l' exe diventa fasullo !!
Ora che mi hai detto che ho capito male mi hai messo questa pulce nell'
orecchio. Peccato che sono accupato ma appena mi libero voglio darci un'
occhiata !!
Ti saluto Andrea.
Ciaoooo !!!!
Antonio Tarolla
Ciao Wayl,
non sapevo di quello che scrivi...
Mi pare plausibile ma fammi un esempio: con cosa ci scrivi? Se usi i
Pascal-files penso che la write fallisca (perchè il file è in
read-only,no?)...
Se usi gli stream forse... (non ho mai provato ma la cosa mi incuriosisce,
ci provo appena ho 5 minuti liberi...) :-)
Buono a sapersi comunque, può essere comodo... :-)
> Ci tengo a dare un grande saluto ad Andrea Magni che insieme ad Alex
> Martelli sono quelli che postando mi danno le idee migliori!
Ti ringrazio e ricambio, ma non penso che Alex sia troppo contento di essere
paragonato ad un ragazzino che smanetta un po' con l'API di Win32... ;-)
Seriamente, Alex è molto bravo, dubito che sia anche solo paragonabile con
me...
Tra l'altro su it.comp.programmareWin32 (dove penso tu abbia letto i msg di
Alex e i miei) trovi un sacco di persone molto + preparate di me (ad es.
Lorenzo Lutti o Ivanbrugh)
Ho utilizzato il text, perché nei typed file non é implementato il metodo
append. Io so che utilizzando i file tipizzati questi possono essere anche
rewritati, e quindi non solo appesi ma anche modificati, purtroppo ció
comporta l'utilizzo del file di appoggio... veramente penso esistano limiti
(che non conosco) in questa seconda operazione. Non so che dirti di piú, ti
conviene fare tutte le prove che ti servono.
Programmando in c++ faccio uso e abuso delle classi fstream, che mi
permettono di fare pressoché qualsiasi cosa!
Per quanto riguarda le differenze tra te e gli altri non so, veramente non
ci credo molto a queste cose nel senso che ognuno é piú bravo degli altri in
qualche settore. I post tuoi e di Alex sono quelli che leggo con piú piacere
perché ultimamente sto cercando di dominare la piattaforma windows e le sue
classi demoniache, mi sto divertendo come non mai, ma ogni tanto capita di
bloccarsi, e questi ng mi danno un sacco di idee nuove per risolvere o
aggirare. Per quanto riguarda i guru non lo so, molti post non capisco
neanche se stiano parlando di programmazione :)
: Next (cosí ho citato anche il basic)
Peccato che sia difficile da usare come il male e che non sono ancora
riuscito a farlo funzionare del tutto... se Wayl o Andrea Magni volessero
favorire qui sotto posto il codice sorgente di un mio componente (ehm posso
postare codice vero ?) che dovrebbe poter "depositare" file binari
incapsulati nell'exe principale. Non badate se è incasinato, è che sto
tentando di fa funzionare il TFiler. Se a qualcuno interessa mi risponda
pure sul newsgroup che posso dare altre informazioni (non molte purtroppo)
CIAO ! {MSX}
http://gpi.eden.it/abc/delphi/
unit DeployerUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
dsgnintf;
type Dep_data=array of byte;
PDep_data=^Dep_data;
type
TDeployer = class(TComponent)
private
fsize:integer;
p:Pdep_data;
{ Private declarations }
protected
procedure DefineProperties(Filer: TFiler);override;
procedure ReadData(Stream:Tstream);
procedure WriteData(Stream:Tstream);
{ Protected declarations }
public
{ Public declarations }
procedure Deploy(FName:string);
Constructor Create(Aowner:Tcomponent);override;
published
property Size:integer read fsize;
{ Published declarations }
end;
Type TDeployerEditor = Class(tcomponentEditor)
procedure Edit; override;
end;
procedure Register;
implementation
Constructor TDeployer.Create(Aowner:Tcomponent);
begin
Inherited Create(Aowner);
p:=nil;
end;
procedure TDeployer.DefineProperties(Filer: TFiler);
function DoWrite: Boolean;
var
Ancestor: TDeployer;
begin
Ancestor := TDeployer(Filer.Ancestor);
if Ancestor <> nil then
Result := (p<>nil) and
(not CompareMem(ancestor.P, P ,size))
else Result := p <> nil;
end;
begin
Filer.DefineBinaryProperty('Data', ReadData, WriteData, DoWrite);
end;
procedure TDeployer.WriteData(Stream: TStream);
begin
Stream.WriteBuffer(p^,size);
end;
procedure TDeployer.ReadData(Stream: TStream);
begin
Stream.ReadBuffer(p^,size);
end;
procedure Tdeployer.Deploy(FName:string);
var f:file;
begin
assignfile(f,fname);
rewrite (f,1);
blockwrite(f,p^,size);
closefile(f);
end;
procedure TDeployerEditor.edit;
var open:TOpenDialog;
//f:TDeployerEditorForm;
s:tfilestream;
begin
open:=TOpenDialog.Create(self.component);
//f:=TDeployerEditorForm.Create(nil);
if open.execute then
begin
s:=TFileStream.Create(open.FileName,fmOpenRead);
if Tdeployer(self.Component).p<>nil then
freemem(Tdeployer(self.Component).p);
getmem(Tdeployer(self.Component).p,s.Size);
Tdeployer(self.Component).fSize:=s.size;
Tdeployer(self.Component).ReadData(s);
s.Free;
end;
open.free;
end;
procedure Register;
begin
RegisterComponentEditor(TDeployer,TDeployerEditor);
RegisterComponents('MSX', [TDeployer]);
end;
end.
Non l'ho provato [il tempo manca sempre, tra l'altro tra poco esco (se vi
state chiedendo "Ma che ccavolo ci fai a casa sabato sera?")] ma ci credo
sulla fiducia :-)
> Ho utilizzato il text, perché nei typed file non é implementato il metodo
> append.
Penso che potresti usare una Seek al posto dell'append...
> Programmando in c++ faccio uso e abuso delle classi fstream, che mi
> permettono di fare pressoché qualsiasi cosa!
Mhmm... scommetto che non hai ancora dato un'occhiata alla classe
TFileStream (o in generale a TStream)... ;-)