Консультация № 199841
11.12.2020, 03:20
0.00 руб.
1 22 0
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Есть программа с кодом:

Код:
unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ComObj, Vcl.StdCtrls, Vcl.Grids,Math;

type
TForm1 = class(TForm)
ButtonLaunch: TButton;
ButtonClose: TButton;
OpenDialog1: TOpenDialog;
ButtonOpen: TButton;
EditA11: TEdit;
EditA21: TEdit;
EditA31: TEdit;
EditA12: TEdit;
EditA22: TEdit;
EditA32: TEdit;
EditA13: TEdit;
EditA23: TEdit;
EditA33: TEdit;
EditB1: TEdit;
EditB2: TEdit;
EditB3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
ButtonSolve: TButton;
StringGrid1: TStringGrid;
ButtonFill: TButton;
Button1: TButton;
procedure ButtonLaunchClick(Sender: TObject);
procedure ButtonCloseClick(Sender: TObject);
procedure ButtonOpenClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ButtonFillClick(Sender: TObject);
procedure ButtonSolveClick(Sender: TObject);
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
var
Exc:Variant;
n: boolean ;

{$R *.dfm}



procedure TForm1.ButtonFillClick(Sender: TObject);
begin
ButtonLaunch.Click;
//clear;
Randomize;
Exc.Range['A1']:=IntToStr(Random(10));
Exc.Range['A2']:=IntToStr (Random(10));
Exc.Range['A1:A2'].AutoFill(Exc.Range['A1:A12'],2);
EditA11.Text:=Exc.Range['A1'];
EditA21.Text:=Exc.Range['A2'];
EditA31.Text:=Exc.Range['A3'];
EditA12.Text:=Exc.Range['A4'];
EditA22.Text:=Exc.Range['A5'];
EditA23.Text:=Exc.Range['A6'];
EditA13.Text:=Exc.Range['A7'];
EditA32.Text:=Exc.Range['A8'];
EditA33.Text:=Exc.Range['A9'];
EditB1.Text:=Exc.Range['A10'];
EditB2.Text:=Exc.Range['A11'];
EditB3.Text:=Exc.Range['A12'];
end;

procedure TForm1.ButtonLaunchClick(Sender: TObject);
begin
Exc:=CreateOleObject('Excel.Application');
Exc.Visible := true;
Exc.Workbooks.Add
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Exc.Visible= true then
Button1.Caption:='Скрыть окно';
Exc.Quit;
end;

procedure TForm1.ButtonCloseClick(Sender: TObject);
begin
Exc.Quit;
end;

procedure TForm1.ButtonOpenClick(Sender: TObject);
begin
if OpenDialog1.Execute then
Exc.Workbooks.Open(OpenDialog1.Filename);
end;

procedure TForm1.ButtonSolveClick(Sender: TObject);
var path:string;
i:integer;
begin
Exc.Range ['A1'] := EditA11.Text;
Exc.Range ['B1'] := EditA12.Text;
Exc.Range ['C1'] := EditA13.Text;
Exc.Range ['A2'] := EditA21.Text;
Exc.Range ['B2'] := EditA22.Text;
Exc.Range ['C2'] := EditA23.Text;
Exc.Range ['A3'] := EditA31.Text;
Exc.Range ['B3'] := EditA32.Text;
Exc.Range ['C3'] := EditA33.Text;

Exc.Range['A5'].FormulaArray:='=МОПРЕД(A1:C3)';
Exc.Range['C5:E7'].FormulaArray:='=МОБР(A1:C3)';
Exc.Range['G5:G7'].FormulaArray:='=МУМНОЖ(C5:E7;E1:E3)';
for i:=0 to 2 do
begin
path:='G'+IntToStr(5+i);
StringGrid1.Cells[i,1]:=Exc.Range[path];
end;

end;

{procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Exc.Ouit;
n:=true;
if n=1 then Button1.Click and Form1.Close
else Excel.exe.Close
end; }

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[0,0]:= 'X';
StringGrid1.Cells[1,0]:= 'Y';
StringGrid1.Cells[2,0]:= 'Z';
end;

end.


Выполнял по методичке(прикрепил), но есть несколько нюансов, которые мне непонятны:
1. Почему выскакивает ошибка, при нажатии на кнопку "Решить";
2. Почему не заполняется StringGrid;
3. Добавить фрагмент кода, проверяющий содержимое ячейки А5 на равенство нулю. Обратите внимание, что изначально содержимое ячейки А5 имеет строковый тип.
4. Скройте кнопки «Открыть» и «ЗапуститьExcel». Отключите отображение рабочего окна MSExcelи реализуйте следующий порядок работы программы:
При нажатии кнопки «Решить» должен запускается невидимый пользователю MS Excel и становится видимой кнопка «Закрыть программу».
Добавьте кнопку, позволяющую скрывать и отображать рабочее окно MS Excel. Когда рабочее окно скрыто, кнопка должна называться «Отобразить окно», а когда оно видно –«Скрыть окно».
Для того чтобы по завершении работы программы закрывался скрытый процесс Excel.exe, создайте обработчик событияOnClose. Напишите в нем код программы, реализующий следующий алгоритм: если кнопка «Закрыть программу» была нажата, то программа завершается; в противном случае перед завершением программы сначала закрывается процесс Excel.exe. Используйте логическую переменную для фиксации факта нажатия на кнопку «Закрыть программу».
Прикрепленные файлы:
35878776dcb98afffd984e4e0ef40c6e0d268ebf.pdf

Обсуждение

давно
Посетитель
404025
131
11.12.2020, 03:21
общий
Фото ошибки
Прикрепленные файлы:
75148e2462775e492c2cec7f0f35e916.JPG
давно
Старший Модератор
31795
6196
11.12.2020, 20:53
общий
Адресаты:
Вот реальный код который работает с EXCEL
Код:
{процедура создания формы и начальных установок}
procedure TForm1.FormCreate(Sender: TObject);
var
Find:TSearchRec;
i:integer;
SMenu:TMenuItem;
begin{FormCreate}
. . .
{проверка возможности работы с MSOffice-Excel}
try MSApp:=CreateOLEObject('Excel.Application');
except ShowMessage('Error: cannot open MSApplication - Exel');end;
{Формирование списка меню "Выбеоите файл"}
if FindFirst(Path+'\work\*.xls',faAnyFile,Find)=0then
begin
Form1.MainMenu1.Items[0].Enabled:=True;
repeat{создаем пункт меню с именев файла}
SMenu:=TMenuItem.Create(MainMenu1);
SMenu.Caption:=Find.Name;
SMenu.OnClick:=Form1.SelectMenu;
Form1.MainMenu1.Items[0].Add(SMenu);
until FindNext(Find)<>0;
FindClose(Find);
end ;
end;{FormCreate}
. . .
procedure LoadGrid(a:string);
var
Book:OleVariant;
i,j:integer;
begin{LoadGrid}
Form1.Label1.Caption:='Загружаю файл:'+Path+'\work\'+a;{информируем пользователя}
MSApp.WorkBooks.Open(Path+'\work\'+a, 0, True);{открываем Excel-файл}
{устанавливаем размеры таблицы}
Form1.StringGrid1.ColCount:=MSApp.ActiveWorkbook.ActiveSheet.UsedRange.Columns.Count;
Form1.StringGrid1.RowCount:=MSApp.ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count;
{готовимся к быстрому копированию}
Book:=MSApp.ActiveWorkbook.ActiveSheet.UsedRange.Value;
{копируем в рабочую Грид}
for i:=0 to Form1.StringGrid1.RowCount-1 do
for j:=0 to Form1.StringGrid1.ColCount-1 do
Form1.StringGrid1.Cells[j,i]:=Book[i+1,j+1];
MSApp.WorkBooks.Close;{закрываем Excel-файл}
end;{LoadGrid}


Это код обработки прайсов дилеров.
В папке work ищут все xls, из них формируется меню "выберите файл"


После выбора своего прайса, все остальные обрабатываются на его основе.
Программа формирует несколько файлов : XML-реклама(то что качают движки рекламаторы), ТХТ - SQL-update shop(обновление базы данных самого магазина); No - shop(список товаров, которых нет в магазине); No - diler( список товаров, которые какбы есть в магазине, но их нет у дилеров) .


В программе есть ситема обучения, которая при незнакомом XLS-файле, предагает ответить на несколько вопросов и после этого формирует в файле shop.ini записи типа
iAEFG@@@@@C@@@@@@@@@@@|model2|rrc2|
iAIJK@@@@@@@@@@@@@@@@@|model3|RRC3|
iACIE@@@@H@@@@@@@@@@@@|Артикул|РРЦ|
iIAED@@@@@@@@@@@@@@@@@|Артикул|РРЦ|

Также программа проеряет наличие, и самообучается, если в памяти нет записей типа
c0|
c5V|
c5VV|
c5VVV|
c5VVVV|
c5есть|
c5есть |
c1есть 1 шт.|
c0нет в наличии|
c2уточняйте|
c1временно нет, ожидаем|
c2временно нет, уточняйте|
c5есть в собранном виде с коробкой|
c2заканчивается|
c0нет|

Если в этом списке нет нужной категории "наличия" программа сама уточнит, что есть ху.
Это не реклама, просто к тому, что бы Вы поняли, я на Delphi + Excel = несколько собак сожрал.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
11.12.2020, 21:08
общий
11.12.2020, 21:08
Адресаты:
заметьте даже в своем коде я пишу комменты, на всяуий случай.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
12.12.2020, 00:44
общий
Адресаты:
Да я все понимаю, помогите чем сможете мне, прикрепляю проект сюда...
Прикрепленные файлы:
3ae1ac31a6743fa242225b3a5d7dd9c4.zip
давно
Посетитель
404025
131
14.12.2020, 01:04
общий
Адресаты:
Кое что сделать получилось. У меня к вам вопрос, как сделать проверку ячейки A5 на равенство нулю, если изначально задается строковый тип данных.
давно
Старший Модератор
31795
6196
14.12.2020, 12:51
общий
Адресаты:
Код:
function StrToInt(const S: string): Integer;

Но так как пользователь может ввести ЧТО УГОДНО, поэтому рекомендуется
Код:
function TryStrToInt(const S: string; out Value:Integer):Boolean;

Если строку можно перевести в число, то результат будет TRUE и Value будет содержать значение, иначе
Код:
if TryStrToInt(stroкa,number) then begin . . . end
else ShowMessage(' типа бум-бум по голове ');

Если использовать первую функцию, то при ошибке программа аварийно закроется.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
14.12.2020, 14:21
общий
Адресаты:
Что-то непонятно, куда это относится в моей программе?
давно
Старший Модератор
31795
6196
14.12.2020, 14:53
общий
Адресаты:
Цитата: Nedix
Что-то непонятно, куда это относится в моей программе


Цитата: Nedix
вопрос, как сделать проверку ячейки A5 на равенство нулю,

Поле которое в StringGrid1.Cells или Excel - строка и её нужно переводить в число, а потом уже сравнивать с нулем.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
14.12.2020, 14:55
общий
Адресаты:
То есть эту функцию надо в StringGrid прописать?
давно
Старший Модератор
31795
6196
14.12.2020, 16:30
общий
Адресаты:
Код:
if TryStrToInt(Exc.Range['A5'],number) then = if number=0 then begin . . . end 
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
15.12.2020, 02:12
общий
Адресаты:
Константин, подскажите пожалуйста каким образом можно реализовать следующее:

Скройте кнопки «Открыть» и «ЗапуститьExcel». Отключите отображение рабочего окна MSExcelи реализуйте следующий порядок работы программы:
При нажатии кнопки «Решить» должен запускается невидимый пользователю MS Excel и становится видимой кнопка «Закрыть программу».
Добавьте кнопку, позволяющую скрывать и отображать рабочее окно MS Excel. Когда рабочее окно скрыто, кнопка должна называться «Отобразить окно», а когда оно видно –«Скрыть окно».
Для того чтобы по завершении работы программы закрывался скрытый процесс Excel.exe, создайте обработчик событияOnClose. Напишите в нем код программы, реализующий следующий алгоритм: если кнопка «Закрыть программу» была нажата, то программа завершается; в противном случае перед завершением программы сначала закрывается процесс Excel.exe. Используйте логическую переменную для фиксации факта нажатия на кнопку «Закрыть программу».
давно
Старший Модератор
31795
6196
15.12.2020, 11:23
общий
Цитата: Nedix
Скройте кнопки «Открыть» и «ЗапуститьExcel»

Свойство VISIBLE=false;
Цитата: Nedix
Отключите отображение рабочего окна MSExcel

Свойство MSApp.DisplayAlerts:=false; подавляет создание окна MSExcel,у Вас Exc=MSApp
Можно также использовать VISIBLE

Принцыпе все Ваши вопросы - свойство Visible true | false либо методы Show | Hide
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
15.12.2020, 12:02
общий
Адресаты:
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Button1.Caption:='Show 2';
Form1.Button2.Caption:='Show 1';
Form1.Edit2.Visible:=false;
Form1.Button2.Visible:=false;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Edit1.Hide;
Form1.Button1.Hide;
Form1.Edit2.Visible:=true;
Form1.Button2.Visible:=true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Edit2.Hide;
Form1.Button2.Hide;
Form1.Edit1.Visible:=true;
Form1.Button1.Visible:=true;
end;
end.

Код Delphi 6 - побалуйтесь
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
16.12.2020, 17:27
общий
Адресаты:
Получилось?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
16.12.2020, 17:33
общий
Адресаты:
Ох, Константин, сейчас буду пробовать, сообщу вам.)
давно
Посетитель
404025
131
16.12.2020, 22:17
общий
Адресаты:
Константин, не совсем понял для каких целей вы Edit 1/2 делали если у меня должна быть одна кнопка, просто она должна как бы синхронизировать процесс с MS Excel, когда его нет то "Отобразить окно" при нажатии должен отображаться процесс MS Excel, когда его видно наоборот, "Скрыть окно" вот и вся суть. Вроде легко, а все сделать никак не могу...
давно
Посетитель
404025
131
17.12.2020, 00:01
общий
Адресаты:
Константин, приложу проект полностью, может посмотрите по возможности.
Прикрепленные файлы:
76fa11037b5f15a718a5ff208797e351.zip
давно
Посетитель
404025
131
18.12.2020, 03:32
общий
Адресаты:
Прописал ваш код, для своих кнопок. Мне нужно скрывать и открывать запущенный Excel, а у меня после нажатия данных кнопок ничего не происходит. Каким образом мне это реализовать?
давно
Посетитель
404025
131
18.12.2020, 03:33
общий
Адресаты:
Код :

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[0,0]:= 'X';
StringGrid1.Cells[1,0]:= 'Y';
StringGrid1.Cells[2,0]:= 'Z';
Form1.Button1.Caption:='Отобразить окно';
Form1.Button2.Caption:='Скрыть окно';
Form1.Button2.Visible:=false;
end;

end.
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Button1.Hide;
Exc.Quit;
Form1.Button2.Visible:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Button2.Hide;
Exc.Quit; / Это просто прописал для закрытия, нужно чтобы скрывала
Form1.Button1.Visible:=true;
end;
давно
Посетитель
404025
131
18.12.2020, 03:42
общий
Адресаты:
Exc.ShowWindow(Excel.Application.Handle, SW_RESTORE); //Восстановить
Exc.ShowWindow(Excel.Application.Handle, SW_HIDE); //скрыть

Таким образом не работает ...
давно
Посетитель
404025
131
19.12.2020, 15:06
общий
Адресаты:
??
давно
Старший Модератор
31795
6196
19.12.2020, 17:55
общий
Адресаты:
Цитата: Nedix
Константин, не совсем понял для каких целей вы Edit 1/2 делали если у меня должна быть одна кнопка,


Я писал код не для Вашей программы, а показывал пример использования свойства:
Цитата: Зенченко Константин Николаевич
Принцыпе все Ваши вопросы - свойство Visible true | false либо методы Show | Hide
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа