Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Технологии
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.12.2012, 22:11
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию Бред какой-то...

У меня уже мозги поехали...
В прошлых версях исходника прога хотя бы открывала документы всегда
без исключения когда я открывал их кнопкой Открыть.
Потом оказалось что если вставить абсолютно одинаковый код в
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  
Старый 03.12.2012, 07:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от одинадцатый
Ошибка invalid variant operation на строчке

ExApp := GetActiveOleObject('excel.application');

Как такое возможно?((
Подскажите что-нибудь.

Правильная ошибка. Подумай сам. Если у тебя excel не открыт ни в твоей программе, ни сам по себе, то КАК МОЖЕТ СУЩЕСТВОВАТЬ НУЖНЫЙ ТЕБЕ ОБЪЕКТ??? Тебе надо обработать такую ситуацию и в слкчае ошибки попробовать создать НОВЫЙ экземпляр объекта.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
одинадцатый (03.12.2012)
  #3  
Старый 03.12.2012, 07:27
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

Ладно, сейчас попробую так.
Но все таки вопрос остается открытым:
Почему ошибок не возникает если открывать новый документ, предварительно закрыв старый(руками нажать на Закрыть), а если закрыть старый документ вызовом метода Click кнопки Закрыть из кнопки Открыть то ошибка появляется?
Ответить с цитированием
  #4  
Старый 03.12.2012, 09:35
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

Кстати новый экземпляр создается на строчке:

OleContainer1.CreateObjectFromFile(FilePath, false);
и там почему-то НИКОГДА не возникает исключения...
Ответить с цитированием
  #5  
Старый 03.12.2012, 19:29
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

помогите пожалуйста(
Ответить с цитированием
  #6  
Старый 03.12.2012, 21:29
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

CreateOleObject

В инете же масса примеров как запускать офисы через ОЛЕ.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 03.12.2012, 22:56
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

Дак я как будто не смотрел эту массу...
Да не обращайте внимания на оле этот... Почему метод клик кнопки работает двумя разными способами если его вызывать из кода и если непосредственно нажать на кнопку рукой?
Ответить с цитированием
  #8  
Старый 04.12.2012, 09:17
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ткни носом, где не работает?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #9  
Старый 04.12.2012, 19:33
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

В первом посте пытался описать, даже не знаю как поточней сказать.
В общем кнопка Button4 открывает новый документ. кнопка Button1 закрывает имеющийся.
Если из кнопки открытия перед самим открытием вызвать метод клик кнопки закрытия то документ закрывается как-то не так... Вылетает оле ошибка в общем. Но вылетает через раз! То есть открыли новый док, тут же открываем следующий - вылетает ошибка, тут же открываем третий - открывается нормально.
А если закрывать документ нажатием мышки на кнопку Button1 то все закрывается нормально. И новый док открывается корректно.
Ответить с цитированием
  #10  
Старый 05.12.2012, 08:40
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

скинь хоть минимальный проект что-ли...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 06.12.2012, 10:58
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

1234567890
Вложения
Тип файла: zip 1.zip (823.8 Кбайт, 5 просмотров)
Ответить с цитированием
  #12  
Старый 06.12.2012, 11:21
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

Цитата:
Сообщение от одинадцатый
1234567890
ничего себе минимальный проект о_О у меня форма монитор порвала)))
sorry for offtop
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #13  
Старый 06.12.2012, 12:30
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

Да сам по себе проект не большой просто.
Просто наглядно можете видеть.
В коде кнопки Открыть раскоментируйте клик кнопки закрыть и попробуйте поотркывать разные документы. =)
Ответить с цитированием
  #14  
Старый 06.12.2012, 13:11
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от одинадцатый
попробуйте поотркывать разные документы. =)
открывает, хотя и закрывается кнопка панелью экселя. никаких исключений не возникает.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #15  
Старый 06.12.2012, 15:05
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

А как мне теперь узнать почему у меня ошибка?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter