2010-11-22 7 views
0

Ich versuche, eine Excel-Datei in meine Delphi 5-Anwendung einzubetten, so dass ich vermeiden kann, dass meine Benutzer die Datei versehentlich löschen.Excel-Datei in Delphi 5 einbetten

Mithilfe der eingebetteten Datei, ich erstelle es auf der Festplatte mit einem Speichern-Dialog, und öffnen Sie es dann mit der Excel := CreateOleObject('Excel.Application'); Methode. Ich habe Beispiele zum Laden einer Ressource mit THandles gesehen, aber ich glaube nicht, dass es funktioniert mit Excel.WorkBooks.Open(EmbeddedExcelFile);.

Haben Sie so etwas schon einmal gemacht? Wie würdest du es machen?

Danke!

+1

Ich bin Ich bin mir nicht sicher, was du verlangst. Kannst du deine Frage klären? Haben Sie jetzt funktioniert, indem Sie die Ressource aus der EXE-Datei extrahieren und CreateOleObject verwenden und Open-Aufrufe öffnen, um sie in Excel zu öffnen? Wenn ja, warum willst du etwas ändern? – RobertFrank

+0

Ich füge angeblich Daten aus dem Programm hinzu, bevor der Benutzer mit dem Blatt interagiert, aber ich wusste nicht wirklich, wie ich die Ressource an andere Objekte weitergeben soll. Vielen Dank! –

Antwort

5

Sie müssen die Datei als Ressource einschließen. Angenommen, Sie haben ein blah.xls

erstellen blah.rc Datei mit folgendem Inhalt

blah RCDATA blah.xls 

es mit der Ressource-Compiler

betten die RES-Datei innerhalb der ausführbaren

{$R 'blah.res'} 

kompilieren in blah.res

extrahieren Sie die Datei in Ihrem Anwendungscode und führen Sie sie mit diesem Code

01 aus
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; 

Sie ShellAPI Klausel in Ihrer uses

vielleicht müssen hinzufügen müssen Sie diese Funktion GetTempDir

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

aufrufen, um die Funktion wie diese

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

Vielen Dank! Ich dachte auch daran, es zuerst zu speichern, aber ich konnte mir keinen Weg vorstellen, dies zu tun, obwohl ich Beispiele für die Verwendung von Streams gesehen hatte. Wie auch immer, danke! –

1

Ich bin mir ziemlich sicher, es wird nicht funktionieren. Sie müssen die Datei in einem temporären Ordner speichern, ändern und dann tun, was Sie wollen.