Newsgroup: it.comp.lang.c++
Titolo: Document da più formati di files

Compilatore VC++ 5.0 (MFC)
Ho la necessità di fare si che tramite la open file possa aprire più tipi
di files. L'applicativo è stato creato con MFC e AppWizard impostando al
momento opportuno l'estensione di default XYZ (ad esempio). Vorrei pero'
che tale applicativo possa aprire anche i file di estensione ABC.
Ho notato che nella Stringtable esiste la voce:
IDR_DOCNAMETYPE: \nNomeDoc\nNomeDoc\nFile NomeDoc
(*.cfn)\n.cfn\nNomeDoc.Document
in cui compare l'estensione dei files di default. Ho provato a modificare
la suddette risorsa per vedere se riuscivo ad ottenere il risultato cercato
ma non ci sono riuscito.
1) E' corretto agire su tale risorsa o devo comportarmi in altro mod?
2) Se e' corretto agire qui, come devo fare?
--
Posted from [195.223.129.35]
via Mailgate.ORG Server - 
http://www.mailgate.org

 di files. L'applicativo è stato creato con MFC e AppWizard impostando al
Se devi supportare piu` di un tipo di documenti, devi aggiungere
una chiamata ad AddDocTemplate per ogni tipo supplementare
di documento (in MFC, le icone usate saranno automaticamente
la 2a, 3a, ecc dell'applicazione -- la 1a e` l'icona dell'applicazione
stessa; indice 0 per l'icona di applicazione, 1 per il primo template
di documento aggiunto con AddDocTemplate, eccetera).
Alla AddDocTemplate passerai il puntatore (ottenuto con una
new) ad un oggetto di tipo CSingleDocTemplate se la tua
applicazione ha interfaccia SDI, CMultiDocTemplate se e'
invece MDI; entrambi prendono nel costruttore l'identificatore
di risorsa [che identifica la stringa che tu hai visto, ma anche
il menu di quel tipo di documento, ecc] come primo argomento,
poi le RUNTIME_CLASS della classe dell'oggetto documento,
poi della classe dell'oggetto-frame, infine della classe
dell'oggetto-vista.  La classe-frame e` normalmente la
CMDIChildWnd per CMultiDocTemplate, la CFrameWnd
per CSingleDocTemplate, ma in entrambi i casi puo` anche
essere una classe derivate da queste; gli oggetti documento
e vista spero che tu li abbia gia` ben inquadrati, se no con
l'architettura doc/view delle MFC non si va molto lontano:-).
www.codeguru.com
 e` una preziosa risorsa per tutto quel
che riguarda le MFC, comprese spiegazioni ed esempi su
vari temi piu` o meno complicati come questo, i modi per
avere molteplici viste dello stesso documento, eccetera.
Alex

Il mio problema non e questo... Forse nella mia prima e-mail non mi sono
spiegato bene.
Il Doc che devo trattare è uno solo ma i dati del doc possono provenire da
due differenti formati di file (in realtà i due formati di file sono molto
simili).
Per la lettura di tali file non posso usare la CArchive perchè tali file
non sono stati creati con questo artifizio.
Pensavo di gestire il loro caricamento (algoritmo mirato) discernendo in
base alla loro estensione.
Come faccio a fare apparire nella finestra di open file la possibilità di
caricare files con estensione differente.
Era corretto agire sulla risorsa di cui dicevo nella prima e-mail.
Paolo


 Era corretto agire sulla risorsa di cui dicevo nella prima e-mail.
La risorsa in questione (la stringa identificata dall'id associato al
tuo document-template, normalmente qualcosa come
    IDR_QUALCOSA_TYPE
nei progetti generati dal Wizard) contiene vari "campi" (un poco
di documentazione e` sotto CDocTemplate::GetDocString nella
doc in linea) separati da \n.  Uno dei campi e` l'estensione dei
file corrispondenti a quel tipo di document-template.  Una sola
di queste stringhe, quindi una sola extension, e` ammessa per
un dato document-template.
Se vuoi usare molteplici stringhe di questo tipo, ad esempio
molteplici extension per i tuoi file, continuando pero` ad avere
a disposizione il massimo possibile degli automatismi che il
framework mette a tua disposizione, devi, come gia` spiegavo,
avere molteplici document-template.  Due document-template
possono differire anche solo per uno dei vari campi che li
contraddistinguono, e sono, ti ripeto:
    l'ID della risorsa per usare per stringa, menu, eccetera
    classe del documento
    classe della view
    classe del frame
Dunque: duplica le tue esistenti risorse, di ID IDR_PIPPO_TYPE
o quel che e`, come IDR_PLUTO_TYPE, lasciandole per
il resto identiche -- eccetto che, per la risorsa-stringa di questo
ID, vorrai invece cambiare, almeno l'extension che contiene, e
probabilmente anche altri sottocampi (studia le doc e decidi);
poi, nella InitInstance del tuo oggetto applicativo, trova il punto
in cui viene generato e aggiunto l'unico document template che
ora usi -- duplica quelle due istruzioni, che assegnano un valore
a pDocTemplate e poi lo passano come argomento alla
AddDocTemplate -- cambia solo, nella seconda copia, l'ID
connesso alla risorsa, da IDR_PIPPO_TYPE, al tuo
nuovo IDR_PLUTO_TYPE, lasciando invece le stesse
classi per documento, view, e frame.
Tutto chiaro, sin qui?  Bene, a questo punto il tuo oggetto
documento puo` ricevere indifferentemente files con i due
tipi di estensione -- e quando fai New, ti apparira` la scelta
fra i due tipi di file (questa scelta` usera`, come "descrizione
dei tipi di file", il terzo campo fra i tanti separati da \n nella
tua stringa-risorsa).
Il documento puo` chiedere da quale doc template sia
gestito con la propria funzione GetDocTemplate, e se
vuoi dovresti potere usare questo per distinguere i due
casi che ti interessano, ad esempio in OnNewDocument;
se fai l'override di OnOpenDocument, invece, li` ricevi
l'intera path del file che ti e` stato chiesto di caricare e
quindi puoi a tuo piacimento esaminare l'estensione, o
che altro.  Ci sono differenze fra i casi SDI e MDI, ma
spero che questo ti basti, insieme alla documentazione
in linea, per realizzare quel che hai in mente -- facci
sapere (come al solito, sul gruppo, please, non in mail)!
Alex