Учёба. Классы. Нужна помощь. - страница 4

 
Vitaly Murlenko #:

Вот это, пожалуй, самое простое определение изо всех.

Если более по-русски, то класс — это шаблон кода, по которому создаётся какой-то объект. Это как рецепт приготовления блюда или инструкция по сборке мебели: сам по себе класс ничего не делает, но с его помощью можно создать новый объект и уже его использовать в работе.

Класс подобен рецепту блюда. Хорошая аналогия.

И вот простое определение про указатели

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Интересное и Юмор

Alexey Viktorov, 2024.11.01 07:44

Доходчиво про объекты и указатели:

«Вообще, создание объектов через new - это как слепил шарик из какахи (чтобы соседу 1 на коврик положить потом) и кинул в мешок чтоб не воняло. Потом слепил второй шарик (для соседа 2) и тоже его в мешок... потом третий, четвёртый, десятый ... ну.. сколько соседей обрадовать хочешь - столько шариков в мешок.
И когда наступает час Ч ты понимаешь, что какахи не пронумерованы, и ты не знаешь какая принадлежит какому соседу... Засада, да?
Так вот - указатели - это верёвочки с бирочками с номерами соседа 1, 2, 3, 100 ... они привязаны к шарикам, которые в мешке (памяти), а второй конец с бирочками - у тебя в руках (в списке). Теперь по номеру соседа ты тянешь за нужную верёвочку (указатель) и достаёшь из мешка (памяти) нужную какаху (объект), получая к нему доступ и делая с ним нужные делишки.»


 

Походил по просторам интернета. На многих сайтах в качестве примера новичкам объясняют что такое класс на примере человека. Например, на одном из ресурсов приводится пример создания "Программиста". У него есть ФИО, рост, вес, возраст, навыки. Далее в описании сказано: "Теперь создадим объект класса". Хорошо, они создали программиста Иванова. Далее говорят, мол, а теперь создадим ему друга. Создали программера Петрова. Хорошо, это понятно. Получается, что создавая всё новые и новые объекты класса, мы просто заполняем очередную строку базы данных.

У меня всвязи с этим возник вопрос. Вот смотрите, у меня есть некая панель. Я уже ранее её показывал.


На заднем фоне - объект типа OBJ_RECTANGLE_LABEL. На его фоне я создаю метки, поля ввода, кнопки. Можно сделать это с помощью классов?

Тут вот в чём фокус. Если мне сейчас нужно будет добавить между её строк ещё одну информационную строку, то 1) всё низлежащее сдвинется на высоту этой строки и вылезет за нижнюю границу прямоугольника; 2) высоту прямоугольника нужно вручную увеличить.

Если я захочу сильно увеличить размеры шрифтов, то метки вылезут за пределы прямоугольника, будут налазить друг на друга; Тексты кнопок выйдут за пределы кнопок.

Можно ли сделать так классами, чтоб изменение шрифта приводило к тому, что метки и кнопки, как и размеры прямоугольника и кнопок автоматически под это масштабировались? Я к тому, что делать процедурно - это муторно. Классами это сделать проще?

 
Vitaly Murlenko #:

Походил по просторам интернета. На многих сайтах в качестве примера новичкам объясняют что такое класс на примере человека. Например, на одном из ресурсов приводится пример создания "Программиста". У него есть ФИО, рост, вес, возраст, навыки. Далее в описании сказано: "Теперь создадим объект класса". Хорошо, они создали программиста Иванова. Далее говорят, мол, а теперь создадим ему друга. Создали программера Петрова. Хорошо, это понятно. Получается, что создавая всё новые и новые объекты класса, мы просто заполняем очередную строку базы данных.

У меня всвязи с этим возник вопрос. Вот смотрите, у меня есть некая панель. Я уже ранее её показывал.


На заднем фоне - объект типа OBJ_RECTANGLE_LABEL. На его фоне я создаю метки, поля ввода, кнопки. Можно сделать это с помощью классов?

Тут вот в чём фокус. Если мне сейчас нужно будет добавить между её строк ещё одну информационную строку, то 1) всё низлежащее сдвинется на высоту этой строки и вылезет за нижнюю границу прямоугольника; 2) высоту прямоугольника нужно вручную увеличить.

Если я захочу сильно увеличить размеры шрифтов, то метки вылезут за пределы прямоугольника, будут налазить друг на друга; Тексты кнопок выйдут за пределы кнопок.

Можно ли сделать так классами, чтоб изменение шрифта приводило к тому, что метки и кнопки, как и размеры прямоугольника и кнопок автоматически под это масштабировались? Я к тому, что делать процедурно - это муторно. Классами это сделать проще?

Конечно можно..можно темы и даже расположение элементов менять на лету

Вообще GUI пишут так чтобы ты, как прикладник,  не задумывался над пикселями и кто куда может налезть и которого оно цвета.. Даже и про что на заднем или что на переднем плане..

пишут так, чтобы ты затрачивал как можно меньше усилий и времени на создание этой (к примеру) формы.

Это в нормальных местах :-) Здесь на форуме наоборот...чем объёмней код, тем больше платят за статьи :-)

 
Vitaly Murlenko #:

Походил по просторам интернета. На многих сайтах в качестве примера новичкам объясняют что такое класс на примере человека. Например, на одном из ресурсов приводится пример создания "Программиста". У него есть ФИО, рост, вес, возраст, навыки. Далее в описании сказано: "Теперь создадим объект класса". Хорошо, они создали программиста Иванова. Далее говорят, мол, а теперь создадим ему друга. Создали программера Петрова. Хорошо, это понятно. Получается, что создавая всё новые и новые объекты класса, мы просто заполняем очередную строку базы данных.

У меня всвязи с этим возник вопрос. Вот смотрите, у меня есть некая панель. Я уже ранее её показывал.


На заднем фоне - объект типа OBJ_RECTANGLE_LABEL. На его фоне я создаю метки, поля ввода, кнопки. Можно сделать это с помощью классов?

Тут вот в чём фокус. Если мне сейчас нужно будет добавить между её строк ещё одну информационную строку, то 1) всё низлежащее сдвинется на высоту этой строки и вылезет за нижнюю границу прямоугольника; 2) высоту прямоугольника нужно вручную увеличить.

Если я захочу сильно увеличить размеры шрифтов, то метки вылезут за пределы прямоугольника, будут налазить друг на друга; Тексты кнопок выйдут за пределы кнопок.

Можно ли сделать так классами, чтоб изменение шрифта приводило к тому, что метки и кнопки, как и размеры прямоугольника и кнопок автоматически под это масштабировались? Я к тому, что делать процедурно - это муторно. Классами это сделать проще?

Конечно можно. Но будет ли лучше — вопрос открытый. Дело ведь не в классе, а в том как всё это написано. У вас сейчас как определяется высота и ширина OBJ_RECTANGLE_LABEL? Вероятно прописано вручную и в зависимости от этого так же вручную прописаны высота и ширина полей и кнопок. А если вы сделаете высоту полей и кнопок в зависимости от размера шрифта, и в зависимости от размеров и количества полей и кнопок по высоте и по ширине, то изменяя размер шрифта у вас вся панель изменит размеры. И немаловажно параметры монитора. Тоже надо учесть DPI о чём в документации нормально рассказано.

зы. Вот тут мой код где меняется размер шрифта и вслед за этим меняется высота строк оставляя расстояние между строками как было.
ClosingLots
ClosingLots
  • www.mql5.com
Индикатор информер.
 
Alexey Viktorov #:

Конечно можно. Но будет ли лучше — вопрос открытый. Дело ведь не в классе, а в том как всё это написано. У вас сейчас как определяется высота и ширина OBJ_RECTANGLE_LABEL? Вероятно прописано вручную и в зависимости от этого так же вручную прописаны высота и ширина полей и кнопок. А если вы сделаете высоту полей и кнопок в зависимости от размера шрифта, и в зависимости от размеров и количества полей и кнопок по высоте и по ширине, то изменяя размер шрифта у вас вся панель изменит размеры. И немаловажно параметры монитора. Тоже надо учесть DPI о чём в документации нормально рассказано.

зы. Вот тут мой код где меняется размер шрифта и вслед за этим меняется высота строк оставляя расстояние между строками как было.

Я почему-то прямоугольник создаю ПЕРЕД лейблами. Очевидно изменения порядка создания приводит к тому, что метки на заднем фоне. Я довольно долго экспериментровал с разными настройками того, на заднем плане объект или на переднем. Уже не помню. Скорее всего. что прямоугольник с заливкой, поставленный после создания лейблов скрывает их.

А так да, я меняю шрифт и всё как у Вас в информере.

 
Кажется, до меня дошло. Класс - действительно удобная штука, если его описание находится во внешнем файле, а не внутри кода советника. Вот тогда он - универсальное средство.
 
Vitaly Murlenko #:

Я почему-то прямоугольник создаю ПЕРЕД лейблами. Очевидно изменения порядка создания приводит к тому, что метки на заднем фоне. Я довольно долго экспериментровал с разными настройками того, на заднем плане объект или на переднем. Уже не помню. Скорее всего. что прямоугольник с заливкой, поставленный после создания лейблов скрывает их.

А так да, я меняю шрифт и всё как у Вас в информере.

Я говорил не о последовательности создания, а о последовательности определения размеров.

По размеру шрифта определяете размер кнопки, по размеру и количеству пересчитываете размер прямоугольника, создаёте прямоугольник. И потом определяете координаты и создаёте кнопки.

 
Vitaly Murlenko #:
Кажется, до меня дошло. Класс - действительно удобная штука, если его описание находится во внешнем файле, а не внутри кода советника. Вот тогда он - универсальное средство.

Описание может быть в другом файле в виде обычной пользовательской функции, не обязательно в виде класса. А вот если вы хотите использовать класс стандартной библиотеки, тогда да, лучше писать класс… Хотя и не обязательно.

 
Alexey Viktorov #:

Я говорил не о последовательности создания, а о последовательности определения размеров.

По размеру шрифта определяете размер кнопки, по размеру и количеству пересчитываете размер прямоугольника, создаёте прямоугольник. И потом определяете координаты и создаёте кнопки.

Меняете название шрифта и пропорции сторон кнопки летят к чертям. Есть шрифты, у которых размер, например, 10, по высоте у одного икс пикселов, у другого игрек, значительно отличающийся от икса. Чтоб этого не было придётся описывать размеры каждого типа шрифта. Это гемор. Я задаю стартовые размеры кнопки. Затем в коде просто расширяю или сужаю по мере необходимости стартовые размеры.

Сдвиг по вертикали для каждой строки лейблов тоже идёт на стандартный шаг. Если увеличил шрифт и строки налазят друг на друга, я просто увеличиваю шаг (меняю значение одной переменной, меняю 1 раз) и всё становится нормально.

То же самое для координаты икс. Есть стартовая позиция. Если в строке, скажем кнопка и поле ввода, то для поля ввода нужен сдвиг на размер кнопки + зазор. После отрисовки поля возвращаем икс в исходное и всё. Короче, могу дать код - всё увидите. А то так на пальцАх плохо видно. Сделать? Дать код?

 
Alexey Viktorov #:

Описание может быть в другом файле в виде обычной пользовательской функции, не обязательно в виде класса. А вот если вы хотите использовать класс стандартной библиотеки, тогда да, лучше писать класс… Хотя и не обязательно.

А вот тут у меня пока что пробел в знаниях. Если описание может быть обычной функцией, то нужно создавать файл, который мы кладём в Libraries. Описание класть в инклудники (как делают некоторые - кладут туда готовые функции) мне не нравится. В этом случае заголовочный файл превращается в мешанину кода.

Скажите, что если в инклуднике без объявления функции просто написать :

class MyDateClass 
  { 
private: 
   int               m_year;          // год 
   int               m_month;         // месяц 
   int               m_day;           // день месяца 
   int               m_hour;          // час в сутках 
   int               m_minute;        // минуты 
   int               m_second;        // секунды 
public: 
  //--- конструктор с параметрами 
                     MyDateClass(int h,int m,int s); 
  };

Сработает это? Можно будет после подключения инклудника к советнику сразу создавать экземпляр класса?

И такой же вопрос про файл библиотеки. Можно ли таким же образом (без объявления функции) просто создавать класс в файле библиотеки? Создавать вне подпрограммы?