|
#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
В инете же масса примеров как запускать офисы через ОЛЕ. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#7
|
|||
|
|||
Дак я как будто не смотрел эту массу...
Да не обращайте внимания на оле этот... Почему метод клик кнопки работает двумя разными способами если его вызывать из кода и если непосредственно нажать на кнопку рукой? |
#8
|
||||
|
||||
Ткни носом, где не работает?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#9
|
|||
|
|||
В первом посте пытался описать, даже не знаю как поточней сказать.
В общем кнопка Button4 открывает новый документ. кнопка Button1 закрывает имеющийся. Если из кнопки открытия перед самим открытием вызвать метод клик кнопки закрытия то документ закрывается как-то не так... Вылетает оле ошибка в общем. Но вылетает через раз! То есть открыли новый док, тут же открываем следующий - вылетает ошибка, тут же открываем третий - открывается нормально. А если закрывать документ нажатием мышки на кнопку Button1 то все закрывается нормально. И новый док открывается корректно. |
#10
|
||||
|
||||
скинь хоть минимальный проект что-ли...
Пишу программы за еду. __________________ |
#11
|
|||
|
|||
1234567890
|
#12
|
||||
|
||||
Цитата:
sorry for offtop Пишу программы за еду. __________________ |
#13
|
|||
|
|||
Да сам по себе проект не большой просто.
Просто наглядно можете видеть. В коде кнопки Открыть раскоментируйте клик кнопки закрыть и попробуйте поотркывать разные документы. =) |
#14
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |
#15
|
|||
|
|||
А как мне теперь узнать почему у меня ошибка?
|