![]() |
|
|
|
|
#1
|
|||
|
|||
|
У меня уже мозги поехали...
В прошлых версях исходника прога хотя бы открывала документы всегда без исключения когда я открывал их кнопкой Открыть. Потом оказалось что если вставить абсолютно одинаковый код в speedbutton и в простой button то на второй раз speedbutton начинает выдавать olevarianterror, в то время как button продолжает открывать их нормально. С этим не стал заморачиваться, пожертвовал интерфейсом ради работоспособности. Но сейчас вообще не пойму в чем дело. Кнопка Открыть работает ровно через раз. Один раз нормально открывает, другой получаем invalid variant operation. Потом опять нормально, потом опять... Если сначала закрыть открытый документ кнопкой Закрыть. И потом открыть новый то ошибки не возникает. И вот то что меня сводит с ума - это факт что в кнопке Открыть вызывается метод кнопки Закрыть! Почему она не хочет работать таким образом? Почему ее обязательно надо нажать руками? Код:
//кнопка открыть
procedure TFrameXLT.Button4Click(Sender: TObject);
Var
MyBitmap: TBitmap;
begin
if OpenDialog1.Execute then
try
FilePath := OpenDialog1.FileName;
Button1Click(self);
OleContainer1.CreateObjectFromFile(FilePath, false);
ReadExcelFile;
RefreshDocClick(self);
OleContainer1.SetFocus;
lSourceDocument.Caption := 'Открытый документ: ' + FilePath;
lSourceDocument.Visible := true;
CanSave := false;
CanSave:=true;
ChangeSaveIcon;
except
on E: exception do
begin
lExcelError.Caption := 'Ошибка открытия документа: '+E.message;
lExcelError.Visible := true;
Timer1.Enabled:=true;
end;
end;
end;
//кнопка закрыть
procedure TFrameXLT.Button1Click(Sender: TObject);
var
i: Integer;
begin
if (OleContainer1.State=osEmpty) or (OleContainer1.State=osLoaded) then exit;
AskSaveDocument;
//OleContainer1.OleObject.DisplayAlerts:=False;
OleContainer1.SetFocus;
ExApp.ActiveWorkbook.close;
if not VarIsEmpty(ExApp) then
begin
ExApp.Quit;
// FreeAndNil(ExApp);
end;
OleContainer1.Close;
OleContainer1.DestroyObject;
lSourceDocument.Visible := false;
ExApp := Unassigned;
ExBook := Unassigned;
ExSheet := Unassigned;
ExURng := Unassigned;
for i:=1 to SGRepeats.RowCount-1 do
SGRepeats.Rows[i].Clear;
for i:=1 to SGData.RowCount-1 do
SGData.Rows[i].Clear;
for i:=1 to SGAutoInc.RowCount-1 do
SGAutoInc.Rows[i].Clear;
EditCommonAdr.Text:='';
SetCommonAddress.Enabled:=false;
ChResume.Checked:=false;
end;
procedure TFrameXLT.ReadExcelFile;
begin
try
OleContainer1.SetFocus;
ExApp := GetActiveOleObject('excel.application');
ExBook := ExApp.ActiveWorkbook;
ExSheet := ExBook.ActiveSheet;
ExURng := ExSheet.UsedRange; // используемый диапазон ячеек
except
on E: exception do
begin
lExcelError.Caption := 'Ошибка чтения документа: '+E.message;
lExcelError.Visible := true;
Timer1.Enabled:=true;
end;
end;
end;
Ошибка invalid variant operation на строчке ExApp := GetActiveOleObject('excel.application'); Как такое возможно?(( Подскажите что-нибудь. |
|
#2
|
|||
|
|||
|
Цитата:
Правильная ошибка. Подумай сам. Если у тебя excel не открыт ни в твоей программе, ни сам по себе, то КАК МОЖЕТ СУЩЕСТВОВАТЬ НУЖНЫЙ ТЕБЕ ОБЪЕКТ??? Тебе надо обработать такую ситуацию и в слкчае ошибки попробовать создать НОВЫЙ экземпляр объекта. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
одинадцатый (03.12.2012)
| ||
|
#3
|
|||
|
|||
|
Ладно, сейчас попробую так.
Но все таки вопрос остается открытым: Почему ошибок не возникает если открывать новый документ, предварительно закрыв старый(руками нажать на Закрыть), а если закрыть старый документ вызовом метода Click кнопки Закрыть из кнопки Открыть то ошибка появляется? |
|
#4
|
|||
|
|||
|
Кстати новый экземпляр создается на строчке:
OleContainer1.CreateObjectFromFile(FilePath, false); и там почему-то НИКОГДА не возникает исключения... |
|
#5
|
|||
|
|||
|
помогите пожалуйста(
|
|
#6
|
||||
|
||||
|
CreateOleObject
В инете же масса примеров как запускать офисы через ОЛЕ. |