Как сделать треугольник в делфи

Обновлено: 05.07.2024

Ввод и редактирование текста выполняется в специальных полях или областях формы. При необходимости пользователь может изменить отображаемые данные. Для этих целей система Delphi предлагает различные компоненты, например, Edit, MaskEdit, Memo, RichEdit и LabeledEdit.

Однострочный редактор, или поле редактирования (поле ввода), представляет собой поле ввода текста, в котором возможно отображение и изменение текста. В Delphi есть несколько однострочных редакторов, из них наиболее часто используется компонент Edit.

Компонент ввода и редактирования текста Edit

Компонент Edit позволяет вводить и редактировать с клавиатуры различные символы, при этом поддерживаются операции, такие как перемещение по строке с использованием клавиш управления курсором, удаление символов с помощью клавиш и , выделение части текста и др. Отметим, что у однострочного редактора отсутствует реакция на управляющие клавиши и .

Свойство CharCase

Для изменения регистра символов в поле редактирования служит свойство СharСase типа TEditcharCase, которое может принимать одно из трех значений:

  • ecLowerCase — текст преобразуется к нижнему регистру;
  • ecNormal — регистр символов не изменяется (по умолчанию);
  • ecUpperCase — текст преобразуется к верхнему регистру.

Свойство PasswordChar

При использовании компонента Edit для ввода пароля можно воспользоваться свойством PasswordChar типа Char, задающим символ для отображения в поле ввода. Этот символ при вводе текста появляется вместо фактически введенного символа. Например, после выполнения инструкций

в поле редактирования появится строка ******, в то время как в действительности свойство Text имеет значение — 'Пароль'.

Компонент MaskEdit

Компонент MaskEdit также является однострочным редактором, но по сравнению с компонентом Edit он предоставляет дополнительную возможность ввода информации по шаблону. С помощью шаблона (маски) можно ограничить число вводимых пользователем символов, тип вводимых символов (алфавитный, цифровой и т. д.). Кроме того, во вводимую информацию можно вставить дополнительные символы (разделители при вводе даты, времени и т. п.). С помощью редактирования по маске удобно вводить телефонные номера, даты, почтовые индексы и другую информацию заранее определенного формата.

Свойство EditMask

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

Маска состоит из разделенных символом трех полей:

  1. первое поле является собственно маской;
  2. второе поле— это символ, определяющий, считаются ли литеральные символы частью данных. По умолчанию используется 1, и литеральные символы маски являются частью не только значения, редактируемого в визуальном компоненте, но и значения, содержащегося в поле. Если вместо 1 установить символ о, то литеральные символы маски по-прежнему будут отображаться при редактировании значения, однако в поле не сохраняются. Литеральные символы удобно применять в качестве разделителей, например, при вводе телефонных номеров;
  3. третье поле содержит символ, используемый для указания незаполненных символов во вводимом тексте, по умолчанию это символ подчеркивания.

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

В маске могут использоваться следующие специальные символы:

Примеры масок:

Для составления маски можно использовать редактор шаблонов (Input Mask Editor). Редактор шаблонов вызывается двойным щелчком мыши в поле значения свойства EditMask или командой Input Mask Editor контекстного меню.

Маска вводится в поле Input Mask, ее также можно выбрать из образцов в поле Sample Masks и затем изменить. Флажок Save Literal Characters управляет включением в маску литеральных символов, а поле Character for Blanks содержит символ, используемый для указания незаполненных позиций во входной строке. Поле Test Input позволяет проверить функционирование подготовленной маски. Маску также можно загрузить из файла с расширением dem, который выбирается в окне Open Mask File, открываемом нажатием кнопки Masks.

Подготовить маску можно и самому, но это более сложно. Удобно, воспользовавшись редактором маски, выбрать наиболее близкую к требуемой маску, а затем уже откорректировать ее вручную.

Компонент LabeledEdit

Компонент LabeledEdit представляет собой однострочный редактор с надписью и, в отличие от обычного однострочного редактора Edit, дополнительно имеет три свойства, управляющие надписью: EditLabel, LabelPosition и LabelSpacing.

Свойство EditLabel

Свойство EditLabel типа TBoundLabel указывает объект надписи, основные свойства которого (Caption, Alignment, AutoSize, Transparent, Color, Font) не отличаются от свойств рассмотренной ранее надписи Label.

Свойство LabelPosition

Свойство LabelPosition типа TLabeiPosition задает расположение надписи относительно поля редактирования и может принимать значения:

  • lpAbove (над полем) — по умолчанию;
  • lpBelow (под полем);
  • lpLeft (слева от поля);
  • lpRight (справа от поля).

Свойство LabelSpacing типа Integer указывает расстояние (в пикселах) между надписью и полем редактирования (по умолчанию 3).

Обработчик события onKeyPress

Для проверки информации, вводимой в редакторы, можно использовать обработчики событий нажатия клавиш, например обработчик события onKeyPress.

В следующем примере для редактора Edit1 установлено разрешение ввода только десятичных цифр:

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

Задать реакцию однострочного редактора на нажатие клавиши можно так:

Информация последовательно вводится в три поля, являющихся компонентами Edit1, Edit2 и Edit3. При окончании ввода в первое или второе поля нажатие клавиши автоматически активизирует очередное поле. Из третьего поля фокус ввода автоматически не передается. Передача фокуса ввода из разных полей реализована двумя способами: с использованием свойства ActiveControl формы и с помощью метода SetFocus.

Часто при окончании ввода в элемент редактирования и переходе к следующему (в порядке табуляции) элементу управления удобнее использовать разделяемый (общий) обработчик события, связанного с нажатием клавиши . Эта процедура должна быть общей для всех элементов редактирования и может выглядеть так:

При нажатии клавиши выполняется метод SelectNext, передающий фокус ввода следующему элементу управления. Процедура SelectNext (CurControl: TWinControl; GoForward, CheckTabStop: Boolean) имеет три параметра, из которых CurControl указывает оконный элемент управления, относительно которого выполняется передача фокуса. Параметр GoForward определяет направление передачи фокуса. Если его значение равно True, то фокус получает следующий элемент управления, в противном случае — предыдущий элемент управления. Параметр CheckTabStop определяет, нужно ли учитывать значение свойства TabStop элемента управления, который должен получить фокус. При значении True параметра элемент управления получит фокус, если его свойство Tabstop также имеет значение True.

Чтобы приведенная процедура вызывалась в качестве обработчика для всех трех редакторов, ее нужно включить в описание класса формы и указать в качестве обработчика события OnKeyPress:

Аналогично можно создать разделяемую процедуру, общую для нескольких компонентов (в том числе и разных, например, Edit и Memo), выполняющую обработку других событий.

Аналогичным образом выполняется обработка нажатия клавиши и других клавиш.

Репутация: нет
Всего: нет

Изобразила в Делфи треугольник, сделала на нем мерцающую надпись (по заданию). Подскажите, как его теперь залить любым цветом. Получается только закрасить надпись на нем.

Репутация: 7
Всего: 42

Появляюсь редко, но часто метко

Изображать идиота сложнее, чем изображать умного: полезнее и не каждому дано

Репутация: нет
Всего: нет

Репутация: нет
Всего: нет

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

[ Время генерации скрипта: 0.0997 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Здесь я бы хотел рассказать не о том, как работать с DelphiX, OpenGL или Direct, а о том, как можно вращать многогранники с помощью простых действий: moveto и lineto.

Здесь рассмотрим пример вращения куба. Будем рисовать на Canvase (например Listbox). Сначала нарисуем врашающийся квадрат (точнее 2 квадрата и соединим их). Пусть q - угол поворота квадрата, который мы рисуем. Очевидно, что нам надо задать координаты вершин квадрата - a:array [1..5,1..2] of integer. 1..4+1 - количество вершин квадрата (почему +1 будет объяснено позже). 1..2 - координата по X и Y. Кто учился в школе, наверное помнит, что уравнение окружности: X^2+Y^2=R^2, кто хорошо учился в школе, возможно вспомнит уравнение эллипса: (X^2)/(a^2)+ (Y^2)/(b^2)=1. Но это нам не надо. Нам понадобится уравнение эллипса в полярных координатах: x=a*sin(t); y=a*cos(t);t=0..2*PI; (учащиеся университетов и институтов ликуют).

С помощью данного уравнения мы заполняем массив с координатами.

Сейчас будем рисовать квадрат:

Вот почему array[1..5,1..2], иначе - выход за границы. end;

Затем рисуем второй такой же квадрат, но пониже (или повыше). Соединяем линиями первый со вторым:

Осталось очистить Listbox, увеличить q и сделать сначала. Все.

Можно также скрывать невидимые линии - когда q находится в определенном интервале. Также можно поизвращаться: повернуть куб в другой плоскости - поворот осей(для тех, кто знает формулу).

Вот что у нас получилось:

Такие же вращающиеся кубики (додекаэдр, икосаэдр и 3 других (не знаю названия)) находятся здесь.

В OpenGL все объекты находятся в 3D-пространстве, но окно программы или экран компьютера являются 2D-массивом пикселей, поэтому большая часть работы OpenGL заключается в преобразовании всех 3D-координат в 2D-пиксели, отображаемые на нашем экране. Поэтому на данном уроке мы с вами создадим свой первый треугольник в OpenGL и по пути рассмотрим все концепции, которые требуются для выполнения этого задания.

Графический конвейер

первая часть преобразует наши 3D-координаты в 2D-координаты;

вторая часть преобразует 2D-координаты в реальные цветные пиксели.

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


Как вы можете видеть, графический конвейер содержит большое количество этапов, каждый из которых обрабатывает одну конкретную часть преобразования элементов данных, задающих вершины будущего объекта, в полностью визуализированный пиксель. Чтобы вы лучше понимали, как работает конвейер, мы кратко рассмотрим каждый его этап.

Этап №0: В качестве входных данных для графического конвейера мы передаем массив Vertex Data[] , содержащий список из трех 3D-координат, из которых впоследствии будет образован треугольник; эти данные представляют собой набор вершин.

Этап №2: Этап сборки примитива в качестве входных данных принимает все вершины (или одну вершину, если тип примитива задан как GL_POINTS ) из вершинного шейдера, которые образуют примитив, и собирает все точки в заданной для примитива форме; в нашем случае данной формой является треугольник.

Фрагмент в OpenGL — это все данные, необходимые OpenGL для визуализации одного пикселя.

В современном OpenGL мы должны определить, по крайней мере, по одному собственному вершинному и фрагментному шейдеру (т.к. графический процессор не имеет заданных по умолчанию шейдеров данных типов). По этой причине часто бывает довольно трудно начать изучать современный OpenGL, так как требуется очень много знаний, прежде чем мы сможем нарисовать свой первый треугольник.

Ввод вершин

Чтобы что-то нарисовать, мы сначала должны передать OpenGL некоторые входные данные, описывающие вершины будущего объекта. Исходя из того, что OpenGL — это библиотека 3D-графики, то все координаты, которые мы указываем в OpenGL, являются точками в 3D-пространстве (с координатами X , Y , Z ). OpenGL не просто преобразует все наши 3D-координаты в 2D-пиксели на экране; OpenGL обрабатывает 3D-координаты только тогда, когда они находятся в определенном диапазоне между -1.0 и 1.0 по всем трем осям (x, y и z). Все координаты в этом, так называемом, нормализованном диапазоне координат устройства в конечном итоге будут видны на нашем экране (а все координаты за пределами этой области — нет).

Поскольку мы хотим визуализировать один треугольник, то нам нужно указать в общей сложности три вершины, причем каждая из этих вершин имеет по 3 координаты. Для этого представим их в нормализованном диапазоне координат устройства (видимой области OpenGL), используя массив значений типа float:

Читайте также: