Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Мастер-Эксперт

970

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

633

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

354

Россия, Санкт-Петербург


ID: 400669

epimkin

Профессионал

350


ID: 137394

Megaloman

Мастер-Эксперт

277

Беларусь, Гомель


ID: 400484

solowey

Профессор

96


ID: 401888

puporev

Профессор

53

Россия, Пермский край


8.1.6

02.01.2021

JS: 2.2.2
CSS: 4.2.0
jQuery: 3.5.1


 

Создание программ на языках Pascal, Delphi и Lazarus.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)


Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 226
Gluck
Статус: 6-й класс
Рейтинг: 222
puporev
Статус: Профессор
Рейтинг: 53
 

Перейти к консультации №:
 

Консультация онлайн # 199841
Раздел: • Pascal / Delphi / Lazarus
Автор вопроса: Nedix (Посетитель)
Дата: 11.12.2020, 03:20
Поступило ответов: 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. Используйте логическую переменную для фиксации факта нажатия на кнопку «Закрыть программу».

-----
Прикрепленный PDF:  скачать (PDF) [1.24 Mб]

Состояние: Консультация закрыта

Oтветов пока не поступило.

Мини-форум консультации № 199841

Nedix

Посетитель

ID: 404025

1

= общий = |  11.12.2020, 03:21 |  цитировать |  профиль |  личное сообщение
Экспертам раздела:

Фото ошибки

-----
Прикрепленное изображение (кликните по картинке для увеличения):

Зенченко Константин Николаевич

Старший модератор

ID: 31795

2

= общий = |  11.12.2020, 20:53 |  цитировать |  профиль |  личное сообщение
Nedix:

Вот реальный код который работает с 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 = несколько собак сожрал.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич

Старший модератор

ID: 31795

3

= общий = |  11.12.2020, 21:08 |  цитировать |  профиль |  личное сообщение
Nedix:

заметьте даже в своем коде я пишу комменты, на всяуий случай.
smile

Последнее редактирование 11.12.2020, 21:08 Зенченко Константин Николаевич (Старший модератор)

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Nedix

Посетитель

ID: 404025

4

= общий = |  12.12.2020, 00:44 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Да я все понимаю, помогите чем сможете мне, прикрепляю проект сюда...

-----
Прикрепленный архив:  скачать (ZIP) [3.39 Mб]

Nedix

Посетитель

ID: 404025

5

= общий = |  14.12.2020, 01:04 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Кое что сделать получилось. У меня к вам вопрос, как сделать проверку ячейки A5 на равенство нулю, если изначально задается строковый тип данных.

Зенченко Константин Николаевич

Старший модератор

ID: 31795

6

= общий = |  14.12.2020, 12:51 |  цитировать |  профиль |  личное сообщение
Nedix:

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(' типа бум-бум по голове ');

Если использовать первую функцию, то при ошибке программа аварийно закроется.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Nedix

Посетитель

ID: 404025

7

= общий = |  14.12.2020, 14:21 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Что-то непонятно, куда это относится в моей программе?

Зенченко Константин Николаевич

Старший модератор

ID: 31795

8

= общий = |  14.12.2020, 14:53 |  цитировать |  профиль |  личное сообщение
Nedix:

Цитата: Nedix
Что-то непонятно, куда это относится в моей программе


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

Поле которое в StringGrid1.Cells или Excel - строка и её нужно переводить в число, а потом уже сравнивать с нулем.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Nedix

Посетитель

ID: 404025

9

= общий = |  14.12.2020, 14:55 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

То есть эту функцию надо в StringGrid прописать?

Зенченко Константин Николаевич

Старший модератор

ID: 31795

10

= общий = |  14.12.2020, 16:30 |  цитировать |  профиль |  личное сообщение
Nedix:

if TryStrToInt(Exc.Range['A5'],number) then = if number=0 then begin . . . end

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Nedix

Посетитель

ID: 404025

11

= общий = |  15.12.2020, 02:12 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Константин, подскажите пожалуйста каким образом можно реализовать следующее:

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

Зенченко Константин Николаевич

Старший модератор

ID: 31795

12

= общий = |  15.12.2020, 11:23 |  цитировать |  профиль |  личное сообщение

Цитата: Nedix
Скройте кнопки «Открыть» и «ЗапуститьExcel»

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

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

Принцыпе все Ваши вопросы - свойство Visible true | false либо методы Show | Hide

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич

Старший модератор

ID: 31795

13

= общий = |  15.12.2020, 12:02 |  цитировать |  профиль |  личное сообщение
Nedix:

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 - побалуйтесь

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич

Старший модератор

ID: 31795

14

= общий = |  16.12.2020, 17:27 |  цитировать |  профиль |  личное сообщение
Nedix:

Получилось?

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Nedix

Посетитель

ID: 404025

15

= общий = |  16.12.2020, 17:33 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Ох, Константин, сейчас буду пробовать, сообщу вам.)

Nedix

Посетитель

ID: 404025

16

= общий = |  16.12.2020, 22:17 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Константин, не совсем понял для каких целей вы Edit 1/2 делали если у меня должна быть одна кнопка, просто она должна как бы синхронизировать процесс с MS Excel, когда его нет то "Отобразить окно" при нажатии должен отображаться процесс MS Excel, когда его видно наоборот, "Скрыть окно" вот и вся суть. Вроде легко, а все сделать никак не могу...

Nedix

Посетитель

ID: 404025

17

= общий = |  17.12.2020, 00:01 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Константин, приложу проект полностью, может посмотрите по возможности.

-----
Прикрепленный архив:  скачать (ZIP) [3.39 Mб]

Nedix

Посетитель

ID: 404025

18

= общий = |  18.12.2020, 03:32 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Прописал ваш код, для своих кнопок. Мне нужно скрывать и открывать запущенный Excel, а у меня после нажатия данных кнопок ничего не происходит. Каким образом мне это реализовать?

Nedix

Посетитель

ID: 404025

19

= общий = |  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;

Nedix

Посетитель

ID: 404025

20

= общий = |  18.12.2020, 03:42 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Exc.ShowWindow(Excel.Application.Handle, SW_RESTORE); //Восстановить
Exc.ShowWindow(Excel.Application.Handle, SW_HIDE); //скрыть

Таким образом не работает ...

Nedix

Посетитель

ID: 404025

21

= общий = |  19.12.2020, 15:06 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

??

Зенченко Константин Николаевич

Старший модератор

ID: 31795

22

= общий = |  19.12.2020, 17:55 |  цитировать |  профиль |  личное сообщение
Nedix:

Цитата: Nedix
Константин, не совсем понял для каких целей вы Edit 1/2 делали если у меня должна быть одна кнопка,


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

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.