2010-11-22 24 views
0

J'essaie d'intégrer un fichier Excel dans mon application Delphi 5, donc je peux éviter que mes utilisateurs ne suppriment le fichier accidentellement. À l'aide du fichier incorporé, je le crée sur le disque avec une boîte de dialogue Enregistrer, puis l'ouvre avec la méthode Excel := CreateOleObject('Excel.Application');. J'ai vu des exemples sur la façon de charger une ressource, en utilisant THandles, mais je ne semble pas le faire fonctionner avec Excel.WorkBooks.Open(EmbeddedExcelFile);.Incorporer le fichier Excel dans Delphi 5

Avez-vous déjà dû faire quelque chose comme ça? Comment le feriez-vous?

Merci!

+1

Je suis pas sûr de ce que vous demandez. Pouvez-vous clarifier votre question? Le faites-vous fonctionner maintenant en extrayant la ressource du fichier .exe et en utilisant CreateOleObject et Open appels pour l'ouvrir dans Excel? Si oui, pourquoi voulez-vous faire un changement? – RobertFrank

+0

J'ajoute des données du programme, supposément, avant que l'utilisateur n'interagisse avec la feuille, mais je ne savais pas vraiment comment passer la ressource à d'autres objets. Merci! –

Répondre

5

Vous devez inclure le fichier en tant que ressource. Disons que vous avez un blah.xls

Créer un fichier blah.rc avec le contenu suivant

blah RCDATA blah.xls 

compiler avec le compilateur de ressources en blah.res

incorporer le fichier RES dans le fichier exécutable

{$R 'blah.res'} 

dans votre code d'application, extrayez le fichier et exécutez-le avec ce code

procedure ExtractAndRun(resourceID:string; resourceFn:string); 
var 
    resourceStream: TResourceStream; 
    fileStream: TFileStream; 
    tempPath: string; 
    fullFileName: string; 

begin 
    tempPath:=GetTempDir; 
    FullFilename:=TempPath+'\'+resourceFN; 
    if not FileExists(FullFilename) then 
    begin 
    resourceStream := TResourceStream.Create(hInstance, resourceID, RT_RCDATA); 
    try 
     fileStream := TFileStream.Create(FullFilename, fmCreate); 
     try 
     fileStream.CopyFrom(resourceStream, 0); 
     finally 
     fileStream.Free; 
     end; 
    finally 
     resourceStream.Free; 
    end; 
    end; 
    ShellExecute(0,'open', pchar(FullFilename), nil, nil, SW_SHOWNORMAL); 
end; 

vous devrez ajouter ShellAPI dans votre clause uses

peut-être vous aurez besoin de cette fonction GetTempDir

function GetTempDir: string; 
var 
    Buffer: array[0..MAX_PATH] of char; 
begin 
    GetTempPath(SizeOf(Buffer) - 1, Buffer); 
    result := StrPas(Buffer); 
end; 

appeler la fonction comme celui-ci

extractAndRun('blah','blah.xls'); 
+0

Merci beaucoup! Je pensais aussi à le sauvegarder en premier, mais je ne pouvais pas penser à un moyen de le faire, même si j'avais vu des exemples sur l'utilisation de Streams. Quoi qu'il en soit, merci! –

1

Je suis presque sûr que ça ne marchera pas. Vous devez enregistrer le fichier dans un dossier temporaire, le modifier et puis faire ce que vous voulez.