Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > ошибка при работе с OLE


Автор: Norfonzor 29.5.2010, 08:01
Возникает ошибка при последовательности действий:
1) Загружаю документ Office, сохраняю его в mht функцией "chekFile"
2)Загружаю БД процедурой "LOAD_BD"
Скрин с ошибкой:
IMG: http://img.pixs.ru/storage/4/1/6/1JPG_3139657_694416.jpg
ссылка на проект http://webfile.ru/4513736
код программы:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
    OleServer, Word97, ComCtrls, WordXP, ExtCtrls, OleCtrls, SHDocVw, jpeg,
  Buttons, ComObj, ActiveX,{MSHTML_TLB, ImgList,} ImgList, ExcelXP, PowerPointXP,
  ADODB, DB, Grids, DBGrids;//,WbPopup;

type
  TfrmMain = class(TForm)
    Button1: TButton;
    OpenDialog: TOpenDialog;
    Button2: TButton;
    ADOConnection: TADOConnection;
    ADOCommand: TADOCommand;
    ADODataSet: TADODataSet;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;
Global_Fn:string;
Global_test:string;

implementation

{$R *.dfm}
const BDpass='111';

function chekFile:boolean;
var n,Fname2,Global_Fmht: string;
f:TextFile;
WordApp,ExcelApp,PowerPointApp: OleVariant;
findex:byte;


begin//0
Global_Fn:='';
result:=false;

if frmMain.opendialog.Execute then
BEGIN//1
findex:=frmMain.opendialog.FilterIndex;

result:=true;
Global_Fn:=frmMain.opendialog.FileName;

n:=Global_Fn;


  //Сохранение в Mht

showmessage('findex'+inttostr(findex));
case findex of
1:
BEGIN///////////////////////////////////////////////////////////////////WORD
WordApp:=CreateOleObject('Word.Application');
try

WordApp.Visible:=False;
WordApp.DisplayAlerts:=False;

WordApp.Documents.Open(Global_Fn, ReadOnly:=True);

Global_Fn:=ExtractFileName(Global_Fn);
delete(Global_Fn,length(Global_Fn)-length(ExtractFileExt(Global_Fn))+1,length(ExtractFileExt(Global_Fn)));

Global_Fmht:=Global_Fn+'.mht';
showmessage('SAve'+Global_Fmht);
WordApp.ActiveDocument.SaveAs(ExtractFilePath(Application.Exename)+'LIB\'+Global_Fmht, wdFormatWebArchive);


//showmessage('Global_Fmht='+Global_Fmht);

//Global_Fmht- путь к документу
//Global_Fn - название документа
  finally
    WordApp.Quit;
    WordApp:=Unassigned;
  end;

END;///////////////////////////////////////////////////////////////////WORD
2:
BEGIN///////////////////////////////////////////////////////////////////EXCEL
ExcelApp:=CreateOleObject('Excel.Application');
  try
ExcelApp.Visible:=False;
ExcelApp.DisplayAlerts:=False;

ExcelApp.Workbooks.Open(Global_Fn, ReadOnly:=True);

Global_Fmht:=n+'.mht';
ExcelApp.ActiveWorkbook.SaveAs(ExtractFilePath(Application.Exename)+'LIB\'+Global_Fmht, xlWebArchive);

Global_Fn:=ExtractFileName(Global_Fn);
delete(Global_Fn,length(Global_Fn)-length(ExtractFileExt(Global_Fn))+1,length(ExtractFileExt(Global_Fn)));
//showmessage('Global_Fmht='+Global_Fmht);

//Global_Fmht- путь к документу
//Global_Fn - название документа
  finally
    ExcelApp.Quit;
    ExcelApp:=Unassigned;
  end;


END;///////////////////////////////////////////////////////////////////EXCEL

3:
BEGIN//////////////////////////////////////////////////////////////PowerPoint
PowerPointApp:=CreateOleObject('PowerPoint.Application');
  try
PowerPointApp.Visible:=True; //неприятный момент, придётся показать окно PowerPoint'а, иначе на каждом методе будите получать "Invalid request" (хотя может уже и есть решение)
PowerPointApp.DisplayAlerts:=False;

PowerPointApp.Presentations.Open(Global_Fn, ReadOnly:=True);

Global_Fmht:=n+'.mht';
PowerPointApp.ActivePresentation.SaveAs(ExtractFilePath(Application.Exename)+'LIB\'+Global_Fmht,ppSaveAsWebArchive);

Global_Fn:=ExtractFileName(Global_Fn);
delete(Global_Fn,length(Global_Fn)-length(ExtractFileExt(Global_Fn))+1,length(ExtractFileExt(Global_Fn)));
//showmessage('Global_Fmht='+Global_Fmht);

//Global_Fmht- путь к документу
//Global_Fn - название документа
  finally
    PowerPointApp.Quit;
    PowerPointApp:=Unassigned;
  end;


END;///////////////////////////////////////////////////////////////PowerPoint
end;



end;//2

end; //1

procedure LOAD_BD;
var
ConectionST:string;

begin
ConectionST:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=LIB\'+Global_test+'.mdb;jet oledb:database password="'+BDpass+'";Persist Security Info=False;';
FrmMain.ADOConnection.Connected:=false;
FrmMain.ADOConnection.LoginPrompt:=false;
FrmMain.ADOConnection.ConnectionString:=ConectionST;
FrmMain.ADOConnection.Connected:=true;
showmessage('БД Загружена');
end;



procedure TfrmMain.Button1Click(Sender: TObject);
begin
if chekFile then showmessage('Check ok');
end;


procedure TfrmMain.Button2Click(Sender: TObject);
begin
Global_test:='bd';
LOAD_BD;
end;

end.

Автор: Akella 31.5.2010, 14:55
Тебе же там на русском написали, что путь неправильный.

Автор: Norfonzor 1.6.2010, 09:42
этот путь правильный в том то и дело, я подозреваю что происходит сбой на уровне  OLE. Сбой происходит только после открытия Word/Excel/Power Point. если не открывать Word/Excel/Power Point то БД работает отлично.

Автор: chip_and_dayl 2.6.2010, 12:33
Norfonzor
Приколистsmile

Добавлено через 22 секунды
Путь на скрине точно-точно проверял!?!

Добавлено через 1 минуту и 40 секунд
А то когда я сразу жму на кнопку загрузить то  путь получается один.
А  если я жму открыть документ, а потом открыть базу, то что я вижу. Путь уже левый, берется тот откуда я открывал документ, а базы там и близко нету

Добавлено через 2 минуты и 8 секунд
Код

LIB\'+Global_test+'.mdb

Вот это меня сразу смутило

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)