Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2019, 03:43   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Delphi - Место объявление переменной, непонятная ситуация

Доброе время суток,
Есть код заполнения шаблона Excel:

Код:
var
  Form2: TForm2;
  Excel_Templs: variant;

procedure TForm2.bVariant2Click(Sender: TObject);
var
  WBk : OleVariant;
  Sheet: variant;
begin
  Excel_Templs := CreateOleObject('Excel.Application');
  WBk := Excel_Templs.Workbooks;
  WBk.Open('d:\Prog\_Example2\Книга1.xlsx');

  Sheet:= Excel_Templs.ActiveSheet;
  Sheet.Cells[1,3]:='23';

  Excel_Templs.ActiveWorkBook.SaveAs('d:\test1.xlsx');
  WBk.Close;
  Excel_Templs.Quit;
  Excel_Templs:= UnAssigned;
end;
он работает – все отлично, после выполнения Excel удаляется из менеджера задач.
Но если переменную «

Цитата:
WBk : OleVariant;
», объявить не в процедуре, а в «private», то файл «d:\test1.xlsx» создается, но Excel ОСТАЕТСЯ в менеджере задач и не удаляется. А удаляется из него только после закрытия приложения.

Почему это так, и как обявить переменную в “private” чтоб Excel удаляется из менеджера задач сразу после создания файла?.
KBO вне форума Ответить с цитированием
Старый 13.03.2019, 08:28   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

попробуйте:
Код:
 Excel_Templs.ActiveWorkBook.SaveAs('d:\test1.xlsx');
  WBk.Close;
  WBk := UnAssigned;
  Excel_Templs.Quit;
  Excel_Templs:= UnAssigned;
p.s. а ещё можно и совсем без этой переменной обойтись:
Код:
 
  Excel_Templs.Workbooks.Open('d:\Prog\_Example2\Книга1.xlsx');

  Sheet:= Excel_Templs.ActiveSheet;
  Sheet.Cells[1,3]:='23';
ну и последнее.
Какой в этом смысл?!
а зачем Вам WBk выносить в private ? Это же временная переменная, испольузуемая только на этапе работы с книгой. Для чего её хранить между вызовами процедуры?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.03.2019, 09:35   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Спасибо:
1) да действительно, не хватало:
Код:
WBk := UnAssigned;
2) может выносить и не нужно, сейчас буду смотреть
KBO вне форума Ответить с цитированием
Старый 13.03.2019, 10:25   #4
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

К сожалению, НЕ выносить не получится, т.к. у меня разнесены по разным функциям создание и разрушение.
Так же работа происходит сейчас и с "Microsoft Word" в библиотеке.

Код:
var
  Form2: TForm2;
  Excel_Templs: variant;
  LWorkSheet, LDoc: OLEVariant;


Const
  C_MsExcel_not_found = 'Пакет Microsoft Excel не найден';

implementation

{$R *.dfm}

function CreateExcel: boolean;
//create word application
begin
  CoInitialize(Nil);
  CreateExcel := true;
  try
    Excel_Templs := CreateOleObject('Excel.Application');
  except
    begin
      Application.MessageBox(C_MsExcel_not_found, 'C_Warning', MB_OK+MB_ICONEXCLAMATION);
      CreateExcel := false;
    end;
  end;
End;

function Open_Excel_Template(APath_file: string): boolean; export;
//open template file
begin
  CreateExcel;
  Open_Excel_Template := true;
  try
    LDoc := Excel_Templs.Workbooks;
    LDoc.Open(APath_file);
  except
    Open_Excel_Template := false;
  end;
End;

function CloseDoc:boolean;
begin
  CloseDoc:=true;
  try
    LDoc.Close;
    LDoc := Unassigned;
  except
    CloseDoc:=false;
  end;
end;

function Close_Document(AMode: integer): boolean; export;
{close document
0 - MS Word
1 - MS Excel}
begin
  if AMode = 0 then
  begin
    Close_Document := true;
    try
      Excel_Templs.Quit;
      Excel_Templs := Unassigned;
      except
        Close_Document := false;
    end;
  end;
end;

function SaveDocAs(ANamePath, ANameFile: string; AOpenDoc: integer):boolean; export;
//save created doc
{
LOpenDoc
  0 - not open created doc
  1 - open created doc
}
var
  LPath: string;
begin
  SaveDocAs := true;
  try
    begin
      Excel_Templs.ActiveWorkBook.SaveAs(ANamePath+VERIFICATION_NAME_FILE(ANameFile));
      CloseDoc;
      Close_Document(0);
      CoUninitialize;
     // if AOpenDoc = 1 then
     //   OPEN_MAKE_DOC(ANamePath, VERIFICATION_NAME_FILE(ANameFile), '', 0, LPath);

    end;
  except
    SaveDocAs := false;
  end;
end;

procedure INSERT(ANumWorkSheet, ARow, ACol: integer;
                 AString: string);
var
  LWorkSheet: variant;
begin
  LWorkSheet := Excel_Templs.ActiveWorkBook.WorkSheets[ANumWorkSheet];
  LWorkSheet.Cells[ARow, ACol] := AString;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Open_Excel_Template('d:\Prog\_Example2\Книга1.xlsx');
  INSERT(1, 1, 2, 'ex1');
  INSERT(2, 3, 4, 'ex2');
  SaveDocAs('d:\', '1.xlsx', 0);
end;
KBO вне форума Ответить с цитированием
Старый 13.03.2019, 10:42   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Кто мешает параметрами передавать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.03.2019, 11:49   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

конечно это дело вкуса, но...
Код:
 CreateExcel := true; false;//мы еще не создали так что логичнее было бы
  try
    Excel_Templs := CreateOleObject('Excel.Application');
    CreateExcel:=true; //а вот теперь можно было бы и так
  except
    begin
      Application.MessageBox(C_MsExcel_not_found, 'C_Warning', MB_OK+MB_ICONEXCLAMATION);
      CreateExcel := false; // если создание не прошло(случился except), то так и останется "ранее установленное" false
    end;
  end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объявление переменной Алексей_2012 Общие вопросы Delphi 1 06.11.2016 02:13
Непонятная ситуация с эмулированием нажатия ЛКМ Illusiony Общие вопросы Delphi 1 28.01.2016 20:31
Непонятная ситуация с IdUDPServer1 в XE5 Mars2107 Общие вопросы Delphi 3 19.09.2013 15:08
Непонятная ситуация с количеством подключений TServerSocket ManowarVIP Работа с сетью в Delphi 0 07.04.2011 07:03
Непонятная ситуация с ПО Pando hk47 Софт 0 18.06.2010 20:46