Страницы

Поиск по вопросам

Показаны сообщения с ярлыком диаграммы. Показать все сообщения
Показаны сообщения с ярлыком диаграммы. Показать все сообщения

среда, 4 марта 2020 г.

Как правильно задать тип chart-а c помощью delphi

#delphi #excel #vba #chart #диаграммы


Есть часть кода на Delphi:  

chart:=sheet.chartobjects.add(270,205,397,220);
chart.chart.charttype:=4;
chart.Chart.SetSourceData(Sheet.Range['A3:B34']);


который выводит в Excel график (диаграмму):



Мне нужен другой тип графика, через макрос (excel-vba) он выглядит так:  

ActiveSheet.Shapes.AddChart2(332, xlLineMarkersStacked).Select


Вопрос: какой код на Delphi должен выполняться вместо этой строчки, чтоб он вывел
мне вот такой тип графика:

 
    


Ответы

Ответ 1



Вам достаточно заменить chart.chart.charttype:=4; на chart.chart.charttype:=66; // xlLineMarkersStacked = 66 чтобы сменить тип диаграммы на нужный. Если часто приходится использовать построение диаграмм в Excel внутри Delphi-программ, стоит завести модуль, где будут перечислены основные константы. Вот все константы энумерации для диаграмм Excel, скопируйте их в новый юнит, оформите как const и вам проще будет транслировать макросы Excel в код Delphi.

четверг, 9 января 2020 г.

Как задать left position диаграммы во время экспорта в excel?

#delphi #excel #vba #chart #диаграммы


Делаю отчет в Excel-е с диаграммой на delphi.
У него фиксированная позиция:  

chart := sheet.chartobjects.add(270,205,397,220);


Как сделать, чтоб диаграмма началась с нужной мне колонки?
    


Ответы

Ответ 1



Амирхон, чтобы вам проще было работать в Delphi (да и в других программах) с офисными продуктами, постарайтесь разобраться в иерархии объектов. Как только вы разберетесь, многие вещи сразу станут понятны. Я не могу посоветовать вам какую-то конкретную книгу, поскольку сам когда-то разбирался методом научного тыка, но, возможно, кто-то другой посоветует. Хороший тон - использовать инструменты разработчика, они очень сильно помогают. В офисе 2003 и ранее - это запись макросов с последующим их анализом, позже - то же самое + использование вкладки Разработчик (её необходимо предварительно включить в настройках). Итак, Chart входит в семейство Shapes, которое принадлежит Sheet (принадлежащий, в свою очередь, Book). Фишка в том, что к одному и тому же объекту можно обратиться по-разному, OLE это позволяет. И тот факт, что у каждого программиста есть свои любимые подходы, порождает массу непонятного. Но стоит прочувствовать иерархию, всё становится на свои места. У меня подход несколько иной, чем у вас. Я вначале определяю объект, а уже затем задаю его свойства. На мой взгляд, так удобнее. Допустим, мы создали лист в Excel и заполнили несколько ячеек для диаграммы данными: Excel:=CreateOleObject('Excel.Application'); Excel.Visible:=True; Book:=Excel.Workbooks.Add; // мне не жалко переменных для каждого объекта Sheet:=Book.Worksheets[1]; // поскольку дальше проще работать for i := 1 to 5 do begin Sheet.Cells[i, 1].FormulaR1C1:=i; Sheet.Cells[i, 2].FormulaR1C1:=cos(i); // пусть будет косинус end; Все переменные здесь - OleVariant. Теперь создаем диаграмму: ch:=Sheet.Shapes.AddChart; Я специально выбрал для диаграммы переменную ch, а не chart, поскольку у диаграммы несколько уровней свойств, в том числе и свойство Chart, многие начинающие путаются в этом. Далее: Ch.Name := 'График 1'; // обзовём диаграмму так Ch.Chart.ChartType := xlLineMarkers; // тип диаграммы Типы диаграмм мы обсуждали в Как правильно задать тип chart-а c помощью delphi. Либо вы поступаете так, как я порекомендовал, либо можно использовать один из встроенных модулей Delphi, например, ExcelXP или Excel2010, в которых эти константы определены. Отмечу, что, чтобы изменить некоторые свойства диаграммы, например, название, я обращаюсь непосредственно к переменной ch, а вот для работы с графиком я должен уже обращаться к свойству Chart. Ну, а теперь вернемся к нашему основному вопросу. Изменим координаты. Координаты - свойства непосредственно диаграммы, это Left и Top. Задаются они в пикселях, причём только для левого верхнего угла, а правый нижний уже определяется Width и Height (шириной и высотой, причём, как правило, в долях экрана, а не в пикселях). Так как вам нужно поместить диаграмму не в координатах пикселей, а в координатах ячеек, то нам нужно вначале их рассчитать: Ch.Left := Sheet.Range['A1:D1', EmptyParam].Width + 2; Ch.Top := Sheet.Range['E1:E3', EmptyParam].Width + 2; Я поместил, таким образом, свою диаграмму в ячейку E4, сместив её край на 2 пикселя. Кстати, тот же самый результат можно получить по-другому: Ch.Left := Sheet.Range['E4', EmptyParam].Left + 2; Ch.Top := Sheet.Range['E4', EmptyParam].Top + 2; Что ещё раз демонстрирует разные подходы.

среда, 12 июня 2019 г.

Что такое диаграмма потоков данных действий?

Готовлюсь к экзамену, там вопрос о диаграмме потоков данных действий. Читаю книгу Салли Шлеер, Стефан Меллор - Объектно-ориентированный анализ: моделирование мира в состояниях, чтобы разобраться в этом вопросе. Но там все так написано, что, вообще, не понятно.
Может кто-нибудь, пожалуйста, нормальным языком объяснить, что такое процесс и диаграмма потоков данных действий?
Из книги:
Процесс - фундаментальный модуль операции. Диаграмма потоков данных действий обеспечивает графическое представление модулей процесса в пределах действий и взаимодействия между ними.
P.S. Это не относится непосредственно к написанию кода, но я не знаю, где еще спросить.


Ответ

Читать желательно внимательнее. Там все есть.
... в ООА задача разбивается сначала на объекты, затем на действия, и наконец, на процессы внутри действия, выдавая в нижней части этой иерархии одну однообразную диаграмму потоков данных для каждого действия. Это отличается от традиционных методик , которые предписывают последовательную декомпозицию функции (единственной) и производят многоуровневый набор диаграмм потоков данных
и
Управление представляется на диаграммах потоков данных действий: явно через потоки управления, и неявно через определенные потоки данных
и
читаем про DFD, IDEF0 (пригодиться и IDEF1)

понедельник, 20 мая 2019 г.

Как правильно задать тип chart-а c помощью delphi

Есть часть кода на Delphi:
chart:=sheet.chartobjects.add(270,205,397,220); chart.chart.charttype:=4; chart.Chart.SetSourceData(Sheet.Range['A3:B34']);
который выводит в Excel график (диаграмму):

Мне нужен другой тип графика, через макрос (excel-vba) он выглядит так:
ActiveSheet.Shapes.AddChart2(332, xlLineMarkersStacked).Select
Вопрос: какой код на Delphi должен выполняться вместо этой строчки, чтоб он вывел мне вот такой тип графика:


Ответ

Вам достаточно заменить
chart.chart.charttype:=4;
на
chart.chart.charttype:=66; // xlLineMarkersStacked = 66
чтобы сменить тип диаграммы на нужный.
Если часто приходится использовать построение диаграмм в Excel внутри Delphi-программ, стоит завести модуль, где будут перечислены основные константы. Вот все константы энумерации для диаграмм Excel, скопируйте их в новый юнит, оформите как const и вам проще будет транслировать макросы Excel в код Delphi.

понедельник, 18 февраля 2019 г.

Как задать left position диаграммы во время экспорта в excel?

Делаю отчет в Excel-е с диаграммой на delphi. У него фиксированная позиция:
chart := sheet.chartobjects.add(270,205,397,220);
Как сделать, чтоб диаграмма началась с нужной мне колонки?


Ответ

Амирхон, чтобы вам проще было работать в Delphi (да и в других программах) с офисными продуктами, постарайтесь разобраться в иерархии объектов. Как только вы разберетесь, многие вещи сразу станут понятны. Я не могу посоветовать вам какую-то конкретную книгу, поскольку сам когда-то разбирался методом научного тыка, но, возможно, кто-то другой посоветует.
Хороший тон - использовать инструменты разработчика, они очень сильно помогают. В офисе 2003 и ранее - это запись макросов с последующим их анализом, позже - то же самое + использование вкладки Разработчик (её необходимо предварительно включить в настройках).
Итак, Chart входит в семейство Shapes, которое принадлежит Sheet (принадлежащий, в свою очередь, Book). Фишка в том, что к одному и тому же объекту можно обратиться по-разному, OLE это позволяет. И тот факт, что у каждого программиста есть свои любимые подходы, порождает массу непонятного. Но стоит прочувствовать иерархию, всё становится на свои места.
У меня подход несколько иной, чем у вас. Я вначале определяю объект, а уже затем задаю его свойства. На мой взгляд, так удобнее. Допустим, мы создали лист в Excel и заполнили несколько ячеек для диаграммы данными:
Excel:=CreateOleObject('Excel.Application'); Excel.Visible:=True; Book:=Excel.Workbooks.Add; // мне не жалко переменных для каждого объекта Sheet:=Book.Worksheets[1]; // поскольку дальше проще работать for i := 1 to 5 do begin Sheet.Cells[i, 1].FormulaR1C1:=i; Sheet.Cells[i, 2].FormulaR1C1:=cos(i); // пусть будет косинус end;
Все переменные здесь - OleVariant. Теперь создаем диаграмму:
ch:=Sheet.Shapes.AddChart;
Я специально выбрал для диаграммы переменную ch, а не chart, поскольку у диаграммы несколько уровней свойств, в том числе и свойство Chart, многие начинающие путаются в этом. Далее:
Ch.Name := 'График 1'; // обзовём диаграмму так Ch.Chart.ChartType := xlLineMarkers; // тип диаграммы
Типы диаграмм мы обсуждали в Как правильно задать тип chart-а c помощью delphi. Либо вы поступаете так, как я порекомендовал, либо можно использовать один из встроенных модулей Delphi, например, ExcelXP или Excel2010, в которых эти константы определены. Отмечу, что, чтобы изменить некоторые свойства диаграммы, например, название, я обращаюсь непосредственно к переменной ch, а вот для работы с графиком я должен уже обращаться к свойству Chart
Ну, а теперь вернемся к нашему основному вопросу. Изменим координаты. Координаты - свойства непосредственно диаграммы, это Left и Top. Задаются они в пикселях, причём только для левого верхнего угла, а правый нижний уже определяется Width и Height (шириной и высотой, причём, как правило, в долях экрана, а не в пикселях). Так как вам нужно поместить диаграмму не в координатах пикселей, а в координатах ячеек, то нам нужно вначале их рассчитать:
Ch.Left := Sheet.Range['A1:D1', EmptyParam].Width + 2; Ch.Top := Sheet.Range['E1:E3', EmptyParam].Width + 2;
Я поместил, таким образом, свою диаграмму в ячейку E4, сместив её край на 2 пикселя. Кстати, тот же самый результат можно получить по-другому:
Ch.Left := Sheet.Range['E4', EmptyParam].Left + 2; Ch.Top := Sheet.Range['E4', EmptyParam].Top + 2;
Что ещё раз демонстрирует разные подходы.