2010-11-22 3 views
0

Я пытаюсь внедрить файл Excel в свое приложение Delphi 5, поэтому я могу избежать того, что мои пользователи просто удалили файл случайно.Вставить файл Excel в Delphi 5

Используя встроенный файл, я создаю его на диске с помощью диалогового окна «Сохранить», а затем откройте его с помощью метода Excel := CreateOleObject('Excel.Application');. Я видел примеры того, как загружать ресурс, используя THandles, но мне кажется, что он не работает с Excel.WorkBooks.Open(EmbeddedExcelFile);.

Вам нужно было сделать что-то подобное раньше? Как бы вы это сделали?

Спасибо!

+1

Я нахожусь не уверен, что вы спрашиваете. Вы можете уточнить свой вопрос? У вас есть это сейчас, извлекая ресурс из .exe, а затем используя CreateOleObject и Open вызовы, чтобы открыть его в Excel? Если да, то почему вы хотите внести изменения. – RobertFrank

+0

Я добавляю данные из программы, предположительно, до того, как пользователь взаимодействует с листом, но я действительно не знал, как передать ресурс другим объектам. Благодаря! –

ответ

5

Вы должны указать файл как ресурс. Скажем, у вас есть blah.xls

Создать blah.rc файл со следующим содержимым

blah RCDATA blah.xls 

скомпилировать его с компилятором ресурсов в blah.res

встраивать файл RES в исполняемом

{$R 'blah.res'} 

в коде приложения, извлеките файл и запустите его с помощью этого кода

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; 

вам придется добавить ShellAPI в вашей статье изеза

может быть, вы будете нуждаться в этом GetTempDir функции

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

вызывать функцию как этот

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

Большое спасибо! Я также думал о том, чтобы сохранить его в первую очередь, но я не мог придумать, как это сделать, хотя я видел примеры использования Streams. В любом случае, спасибо! –

1

Я уверен, что это не сработает. Вы должны сохранить файл в папке temp, изменить его и затем делать все, что хотите.

Смежные вопросы