Материалы урока-конкурса по дисциплине «Основы алгоритмизации и программирования» По теме «Работа с массивами в Delphi. Компоненты создания списков и выпадающих списков»
Министерство образования и науки Республики Казахстан
РГКП «Семипалатинский финансово-экономический колледж имени Рымбека Байсеитова»
Материалы урока-конкурса по дисциплине «Основы алгоритмизации и программирования»
По теме «Работа с массивами в Delphi. Компоненты создания списков и выпадающих списков»
Преподователь: Р.С. Раева
2015-2016 учебный год
Технологическая карта (план) урока №37Группа Дата
2 осн ВТ-1 10.12
Дисциплина: Основы алгоритмизации и программирования
Раздел 5 Основные компоненты Delphi. Структурированные типы и их реализация в Delphi Тема курса: 5.4 Компоненты списки, работа с массивами
Тема урока: №37 Работа с массивами в Delphi. Компоненты создания списков и выпадающих списков Тип урока: комбинированный
Вид урока:, лекция, урок конкурс
Требования предъявляемые к уровню подготовленности обучающихся
Базовые компетенции БК 1. Соблюдать технику безопасности и правила пожарной безопасности;
БК 4. Организовать работу с различными источниками информации – находить, обрабатывать, хранить и воспроизводить;
БК 7. Определять наиболее актуальные подходы алгоритмизации и способы решения поставленной задачи.
Профессиональные компетенции ПК 1. Проводить трансляцию и отладку программы, управлять данными при решении задач;
ПК 2. Осуществлять решение задач из различных областей науки, техники, экономики и производства с применением математических методов и вычислительной техники на всех этапах от постановки до получения результата на ЭВМ;
Цели урока обучающая Работа с массивами в Delphi. Компоненты создания списков и выпадающих списков
воспитательная Воспитание информационной культуры учащихся, внимательности, приветие интереса к изучаемому предмету, аккуратности, дисциплинированности, усидчивости, сознательное отношение к учебе.
развивающая Развитие интеллектуального мышления, познавательных интересов, навыков работы на компьютере, самоконтроля, умения конспектировать, анализировать, логическиий излагать свои мысли.
Межпредметные связи
Обеспечивающие Предмет: Основы объектно-ориентированного программирования
Тема курса 5.3 Массивы. Одномерные массивы
Обеспечиваемые Предмет: Основы объектно-ориентированного программирования
Тема курса 5.4 Компоненты списки, работа с массивами
Оборудование урока
Наглядные пособия Опорный конспект
Раздаточный материал карта
Технические средства обучения ПК, Turbo Pascal 7.0.
Литература: основная Семакин И.Г., Шестаков А.П. «Основы программирования»
Дополнительная Гофман В., Хомоненко А «Delphi 6»
Содержание урока
№ эле-ментаЭлементы урока, учебные вопросы,
формы и методы обучения Дополнения, изменения
1. Организационный (2 мин)
Приветствие обучающихся
Проверка готовности учебной аудитории к учебным занятиям
Проверка готовности обучающихся к учебно-практической деятельности
Проверка отсутствующих, заполнение учебного журнала
Постановка цели и хода урока 2. Проверка домашнего задания (20 мин)
Индивидуальный опрос:
1.В общем случае массив?
это структурированный тип данных, состоящий из некоторого числа элементов, имеющих один и тот же тип. В качестве элементов массива можно использовать любой другой ранее описанный тип, поэтому вполне правомерно существование массивов записей, массивов указателей, массивов строк, массивов массивов и т. д. Объявление массивов:
var a:array[1..10] of integer;
b:array[1..20] of char;
2.Одномерные массивы
Элементами массива могут быть данные любого типа, включая структурированные. К необходимости применения массивов (прямого или опосредованного) мы приходим всегда, когда требуется связать и использовать ряд однотипных величин. При описания массива используются зарезервированные слова array и of. За словом array в квадратных скобках указывается диапазон или перечислимый(ordinal) тип, определяющий количество элементов массива. После слова of указывается тип элементов, образующих массив. Доступ к каждому элементу массива осуществляется с помощью индекса. Нельзя указывать значение индекса, не входящий в диапазон массива.
var a:array[1..10]of integer;
begin
a[7]:=14;
a[2]:=11;
a[0]:=20; //Ошибка!
end.
В отличие от C-подобных языков(C/C++/Java/C#), в которых начальным индексом массива всегда служит нулевое целое, в Delphi при объявлении переменной-массива или типа-массива, указывается диапазон значений индекса, а не количество элементов. Это означает, что первым элементом массива может быть элемент с индесом, отличным от нуля.
3.Заполнение массивов?
происходит поэлементно, обычно использую оператор for:
{$APPTYPE CONSOLE}
var a:array[1..100] of integer;
i,j:integer;
beginfor i:=1 to 100 do //Заполнение массива случайными числами.
a[i]:=random(9)+1; //ф-ция random возвращает псевдослучайное число в интервале 0..<параметр>-1
for i:=0 to 9 do begin //Вывод по 10 чисел на строку
for j:=1 to 10 do //Внутренний цикл
write(a[i*10+j],' ');
writeln(' ');
end;
readln;
end.
4.Допускается инициализация каких переменных?
не-локальных переменных-массивов:
var t:array[1..3] of Integer=(1,2,3);
type TRec=record
s:string;
v:integer;
end;
var ra:array[1..2] of TRec=((s:'test';v:3), (s:'test2';v:4));
5.Другие примеры объявления массивов
procedure test4();
type TWorkingDays=(Monday,Tuesday,Wednesday,Thursday, Friday);
var ar:array[boolean]of integer;
ar2:array[TWorkingDays] of Cardinal;
ar3:array[Tuesday..Thursday] of Cardinal;
bl:boolean;
wd:TWorkingDays;
begin
RandSeed:=2;
for bl in [true,false] do begin
ar[bl]:=random(13);
end;
for wd := Monday to Friday do ar2[wd]:=random(100);
for wd :=Tuesday to Thursday do ar3[wd]:=random(4);
end;
6.Переменные-массивы?
имеющие аналогичный, но не идентичный тип, вообще говоря, не являются совместимыми.
procedure test();
var tt,tt2:array[1..3] of Integer;//=(1,2,3);
tt3:array[1..3] of integer;
begin
tt[1]:=3;tt[2]:=4; tt[3]:=5;
tt2:=tt;//OK
tt3:=tt;//EROOR: Incompatible types
end; 3. Объяснение нового материала (40 мин)
Тема урока: Работа с массивами в Delphi. Компоненты создания списков и выпадающих списков 4. Закрепление полученных знаний (10 мин)
1.Компонент TCoolBar, это новая разновидность TToolBar. TCoolBar этоэлемент управления, который обычно содержит в себе два или более TCoolBand-ов,размеры и местоположение которых можно изменять во время выполнения программы.CoolBand в свою очередь является областью элемента управления, которая можетсодержать другие оконные контролы, главным образом панели инструментов, окошкиредактирования, выпадающие списки и анимация.
Создать coolbar довольно просто: достаточно поместить компонентCoolBar из набора Win32 VCL на форму. У CoolBar-а есть довольно много настроек(настройка осуществляется через свойства): Align - поумолчанию, расположение Coolbar настроено на верхнюю часть окна, поэтому, чтобыизменить расположение кулбара, нам прийдётся подредактировать этосвойство; Bitmap - используется для закрашивания фонаCoolBar-а картинкой; свойство FixedOrder определяет, может липользователь переопределить порядок панелей.
2.TCoolBandКак уже упоминалось выше, компонент Coolbar, это обычно наборобъектов TCoolBand. Чтобы добавить несколько CoolBand-ов в CoolBar, нампотребуется вызвать редактор Coolbar Band-ов. Сделать это можно путём нажатияна значёк, расположенный сразу после свойства Bands.
Один из способов разместить компонент (или компонент-контейнер) наCoolBar-е, это перетащить его из палитры VCL, при этом автоматически создастсяновый band для хранения компонента. Другой способ заключается в том, чтокомпонент вставляется в форму напрямую, а затем, при помощи редактора CoolBarBand-ов связывается с каким либо CoolBand-ом. Далее на кулбар обычно добавлетсяToolbar, путём простого перетаскивания его из палитры Win32 на Coolbar. Потомна тулбар добавляются одна или несколько кнопок.
Самая интересная возможность CoolBar-а, это то, что он можетсодержать в себе элементы управления, отличные от кнопок.
Давайте перетащим на CoolBar выпадающий список, окошкоредактирования и один элемент анимации. Предположим, что у нас на формеприсутствует компонент memo с некоторым текстом. Например, мы можемиспользовать окно редактирования для установки размера шрифта, выпадающийсписок для установки названия шрифта, а анимацию для отображения каких-либособытий, происходищих в программе.
Во время выполнения программы пользователь может изменятьместоположение элементов управления путём перемещения и, тем самым меняяразмер.
3.Вам хочется добавить ещё компонентов ?
Как упоминалось выше, на CoolBar можно добавлять различные оконныекомпоненты. Оконные компоненты, это те, которые наследованы от TWinControl. Этозначит, что Labels и Shapes, например, не получится добавить на CoolBar.Однако, если внимательно посмотреть на Delphi IDE, то можно обнаружить, чтоcoolbar может так же содержать меню, хотя меню и не является оконнымкомпонентом. Значит должен быть способ добавлять на кулбар неоконныекомпоненты!
4.Кульные менюшки на Cool Band-ах
Итак, сперва, нам необходимо разместить на форме компонентMainMenu и добавить в него пункты при помощи Menu designer. Обратите внимание,что когда мы помещаем компонент TMainMenu на форму, то значение свойства формыMenu устанавливается в MainMenu1. Нам необходимо очистить это свойство и темсамым отключить объект MainMenu от формы, потому что нам необходимоиспользовать его в Coolbar-е.
Далее, добавляем Toolbar в Coolbar а так же добавляем несколькоToolButton - один ToolButton для каждого выпадающего меню. Если, например, уВас два меню верхнего уровня File и Edit, то добавить необходимо всего дваToolButton-а.
Далее, устанавливаем свойства тулбара. Flat и ShowCaptions устанавливаемв True. Свойства AutoSize и Grouped компонентаToolButton так же должны быть установлены в True. И, в заключение, соединяемкаждую кнопку с выпадающим меню, используя для этого свойство MenuItem.
Воттак должен выглядеть результат проделанных шагов (запущенная программа):
5.Немного программирования
Во время выполнения приложения, можно добавлять CoolBand-ы.Следующий код, добавляет CoolBand на CoolBar с размещённым на нёмTDateTimePicker.
procedure CreateDatePickerOnCoolBar;
var dtPick: TDateTimePicker;
begin
dtPick := TDateTimePicker.Create(CoolBar1);
dtPick.Parent := CoolBar1;
CoolBar1.Bands.Items[Count-1].Text := 'Pick a date';
...
end; 5 Подведение итогов урока (6 мин) 6 Постановка домашнего задания (2 мин)
Бобровский С.И. «Delphi 7», повторение Преподаватель __________ Р.С. Раева
Цели урока:
Развивать логическое мышление у учащихся путем нестандартных форм обучения.
Развивать творческую деятельность учащихся.
Воспитывать интерес к профессии «техник-программист»
МТО: интерактивная доска, ноутбук.
Картинки, клей, кисти, крупы: гречневая, пшено, рис, перловая, пшеничная и горох.Технологические карты, чайнворд, черный ящик, маркер, таблички.
Форма организации урока: творческий урок-конкурс.
Ход урока-конкурса
Организационная часть:
Приветствие.
Подгруппа делится на команды, состоящие из трех человек. Каждая команда дает себе название и указывает это на табличках.
Вводный инструктаж:
Сообщить о форме проведения урока в виде творческого конкурса.Сообщить цели и условия проведения конкурса.Выбрать экспертную комиссию из числа учащихся.
Роль, ведущего конкурса отводится мастеру технического обучения.
Конкурс сопровождается слайдами.
Мастер т/о: Добрый день дамы и господа! Сегодняшний урок у нас пройдет в нестандартной форме в виде творческого конкурса среди учащихся второго курса группы 2 основной ВТ-1. Группа разделилась на команды по три участника. Роль жюри будут выполнять наши учащиеся:
Конкурс будет, проходит в пять туров: 1 — разминка, 2 — «черный ящик», 3 — «угадай-ка», 4 — «золотые руки», 5 — аппликация из круп. Для каждого конкурса будут свои условия проведения и оценивание.
Уважаемые участники дайте название вашей команде.
Текущий инструктаж и самостоятельная работа учащихся
I тур «Разминка»
Условия конкурса: чайнворд будет оцениваться по количеству отгаданных слов. Каждое правильно отгаданное слово будет равно 1 баллу. Время для разгадывания — 7 минут.
Чайнворд
Составить цепочку слов. Конечная буква первого слова является начальной второго: например, оператор присваивания — Язык программирования.
1. Главное меню программы. Компонент способен создавать и обслуживать сложные иерархические меню. (оператор присваивания)2. Турбо Паскаль это (Язык программирования)
II тур «Черный ящик»
Условия конкурса: по подсказкам команды должны, решать задачу. Команда, не угадавшая свой продукт проигрывает в этом конкурсе и дается шанс решить задачу другой команде и при этом отгадавшая команда получает дополнительные баллы — 3.Жюри подсчитывает баллы.
Задача:
Среди трех чисел найти среднее. Если среди чисел есть равные, вывести сообщение "Ошибка".
Алгоритм решения задачи:
Хотя задача кажется простой, ее решение не такое очевидное. Можно, например, проверить каждое число, лежит ли оно между двумя другими. Или найти минимальное из трех, после чего вывести минимальное из оставшихся двух. Ниже выбран первый способ.
Исключаем равенство чисел. Если первое число равно второму или первое равно третьему или второе равно третьему или все три числа равны (первое равно второму и второе равно третьему), то вывести сообщение "Ошибка". Иначе переходим к п. 2.
Проверяем лежит ли первое число между вторым и третьим. Если первое число больше второго, но меньше третьего (т.е. второе минимально), или первое число меньше второго, но больше третьего (т.е. третье минимально), то значит оно среднее. Иначе переходим к п. 3.
Проверяем лежит ли второе число между первым и третьим. Если второе число больше первого, но меньше третьего, или меньше первого, но больше третьего, то оно среднее. Иначе переходим к п. 4.
Среднее число третье, так как ни один другой вариант не подошел. Действительно, числа не равны друг другу, первое и второе числа средними не являются.
Программа на языке Паскаль:
var a1, a2, a3: integer;
begin write ('Введите три числа: ');
readln (a1, a2, a3);
if (a1 = a2) or (a1 = a3) or (a2 = a3) or ((a1 = a2) and (a2 = a3)) then
writeln('Ошибка')
else if ((a1 > a2) and (a1 < a3)) or ((a1 < a2) and (a1 > a3)) then
writeln(a1)
else if ((a2 > a1) and (a2 < a3)) or ((a2 < a1) and (a2 > a3)) then
writeln(a2)
else writeln(a3);
end.
Пример работы программы:
Введите три числа: 7 4 6
Задача:
Дано трехзначное число. Вывести на экран все трехзначные числа, которые можно получить из цифр данного числа.
Алгоритм решения задачи:
Несмотря на кажущуюся простоту задачи, она не так проста. Если в числе есть одинаковые цифры или нули, то получается ограниченное число комбинаций.
Допустим, дано число abc, где a, b и c - цифры. Возможных вариантов, помимо abc, вроде бы будет 5: acb, bac, bca, cab, cba. Однако, если цифра a равна цифре b, то само число можно записать в виде aac, и тогда других вариантов будет всего два - это aca и caa. B таких нюансов в данной задаче много.
Предусмотреть все варианты в конструкции if-else непосильная задача. Ниже приводится лишь часть.
Есть вариант решения через массив. Записывать туда каждое очередное число, если оно больше 99 и меньше 1000 и если его еще нет в этом массиве. Но и тут возникают сложности, связанные с повторением кода.
Программа на языке Паскаль:
var n: 100..999;
a,b,c: byte;
beginreadln(n);
a := n div 100;
b := n div 10 mod 10;
c := n mod 10;
if (a<>b) and (a<>c) and (b<>c) and (a<>0) and (b<>0) and (c<>0) then begin
n := a * 100 + c * 10 + b;
writeln(n);
n := b * 100 + a * 10 + c;
writeln(n);
n := b * 100 + c * 10 + a;
writeln(n);
n := c * 100 + a * 10 + b;
writeln(n);
n := c * 100 + b * 10 + a;
writeln(n);
end else
if (a=b) and (a<>c) and (a<>0) and (b<>0) and (c<>0) then begin
n := a * 100 + c * 10 + b;
writeln(n);
n := c * 100 + a * 10 + b;
writeln(n);
end;
end.
III тур Конкурс «Угадай-ка»
Условия конкурса: перед участниками конкурса представлены несколько компоненты приложений стандарт ваша задача угадать эти компоненты. Произнести вслух название их.
Представлены следующие компоненты:
Пикто-грамма Имя Назначение
MainMenuГлавное меню программы. Компонент способен создавать и обслуживать сложные иерархические меню.
PopupMenuВсплывающее меню. Обычно это меню появляется после нажатия правой кнопкой мыши.
LabelМетка. Используется для размещения не очень длинных сообщений в виде статического текста
EditСтрока ввода. Предназначена для ввода пользователем текстовой информации в виде одной строки. Имеет возможности по управлению вводимой информацией, например, переопределению символов до их появления в поле ввода, что используется в формах для ввода пароля.
MemoМногострочный текстовый редактор. Используется для ввода пользователем и отображения многострочного текста без функций форматирования.
ButtonКомандная кнопка. Используется для реализации в программе команд с помощью обработчика события OnClick этого компонента.
CheckBoxНезависимый переключатель. Используется его свойство Checked (отмечено), имеющее значения true или false, меняющееся при щелчке мышью.
RadioButtonЗависимый переключатель. Используется для выбора только одного из нескольких вариантов. Для этого компонент объединяется как минимум с одним или несколькими такими же компонентами в группу. Щелчок по компоненту приводит к его выделению и снятию выделения ранее выбранного компонента. Также имеет свойство Checked.
ListBoxСписок выбора. Содержит список предлагаемых вариантов (опций) и даёт возможность проконтролировать текущий выбор.
ComboBox"Выпадающий" список выбора. Представляет собой комбинацию компонентов Edit и ListBox.
ScrollBarПолоса прокрутки. Представляет собой вертикальную или горизонтальную полосу, управляющую визуальным представлением компонентов, не помещающихся целиком в окне программы.
GroupBoxКонтейнер группы компонентов. Используется для группировки нескольких связанных по смыслу компонентов.
RadioGroupГруппа зависимых переключателей. Содержит специальные свойства для обслуживания нескольких связанных между собой зависимых переключателей.
PanelПанель. Этот компонент, как и GroupBox, служит для объединения нескольких компонентов. Содержит внутреннюю и внешнюю кромки, что позволяет создавать эффекты "вдавленности" и "выпуклости".
ActionListСписок действий. Служит для централизованной реакции программы на действия пользователя, связанные с выбором одного из группы однотипных управляющих элементов, таких как опции меню, кнопки и т.д.
Команды получают баллы по количеству отгаданных компонентов.
Заключительный инструктаж
— Провести анализ и подвести итог конкурса.
Жюри подводит итоги за все конкурсы вместе. Объявляется команда победителя. Все студенты, участвовавшие в данном конкурсе получают оценку — пять.
Дисциплина: Основы алгоритмизации и программирования
Раздел 5 Основные компоненты Delphi. Структурированные типы и их реализация в Delphi
Тема курса: 5.4 Компоненты списки, работа с массивами
Тема урока: №37 Работа с массивами в Delphi. Компоненты создания списков и выпадающих списков
TCoolBar
Компонент TCoolBar, это новая разновидность TToolBar. TCoolBar этоэлемент управления, который обычно содержит в себе два или более TCoolBand-ов,размеры и местоположение которых можно изменять во время выполнения программы.CoolBand в свою очередь является областью элемента управления, которая можетсодержать другие оконные контролы, главным образом панели инструментов, окошкиредактирования, выпадающие списки и анимация.
Создать coolbar довольно просто: достаточно поместить компонентCoolBar из набора Win32 VCL на форму. У CoolBar-а есть довольно много настроек(настройка осуществляется через свойства): Align - поумолчанию, расположение Coolbar настроено на верхнюю часть окна, поэтому, чтобыизменить расположение кулбара, нам прийдётся подредактировать этосвойство; Bitmap - используется для закрашивания фонаCoolBar-а картинкой; свойство FixedOrder определяет, может липользователь переопределить порядок панелей.
TCoolBandКак уже упоминалось выше, компонент Coolbar, это обычно наборобъектов TCoolBand. Чтобы добавить несколько CoolBand-ов в CoolBar, нампотребуется вызвать редактор Coolbar Band-ов. Сделать это можно путём нажатияна значёк, расположенный сразу после свойства Bands.
Один из способов разместить компонент (или компонент-контейнер) наCoolBar-е, это перетащить его из палитры VCL, при этом автоматически создастсяновый band для хранения компонента. Другой способ заключается в том, чтокомпонент вставляется в форму напрямую, а затем, при помощи редактора CoolBarBand-ов связывается с каким либо CoolBand-ом. Далее на кулбар обычно добавлетсяToolbar, путём простого перетаскивания его из палитры Win32 на Coolbar. Потомна тулбар добавляются одна или несколько кнопок.
Самая интересная возможность CoolBar-а, это то, что он можетсодержать в себе элементы управления, отличные от кнопок.
Давайте перетащим на CoolBar выпадающий список, окошкоредактирования и один элемент анимации. Предположим, что у нас на формеприсутствует компонент memo с некоторым текстом.
Во время выполнения программы пользователь может изменятьместоположение элементов управления путём перемещения и, тем самым меняяразмер.
Как упоминалось выше, на CoolBar можно добавлять различные оконныекомпоненты. Оконные компоненты, это те, которые наследованы от TWinControl. Этозначит, что Labels и Shapes, например, не получится добавить на CoolBar.Однако, если внимательно посмотреть на Delphi IDE, то можно обнаружить, чтоcoolbar может так же содержать меню, хотя меню и не является оконнымкомпонентом. Значит должен быть способ добавлять на кулбар неоконныекомпоненты!
Кульные менюшки на Cool Band-ах
нам необходимо разместить на форме компонентMainMenu и добавить в него пункты при помощи Menu designer. Обратите внимание,что когда мы помещаем компонент TMainMenu на форму, то значение свойства формыMenu устанавливается в MainMenu1. Нам необходимо очистить это свойство и темсамым отключить объект MainMenu от формы, потому что нам необходимоиспользовать его в Coolbar-е.
Далее, добавляем Toolbar в Coolbar а так же добавляем несколькоToolButton - один ToolButton для каждого выпадающего меню. Если, например, уВас два меню верхнего уровня File и Edit, то добавить необходимо всего дваToolButton-а.
Далее, устанавливаем свойства тулбара. Flat и ShowCaptions устанавливаемв True. Свойства AutoSize и Grouped компонентаToolButton так же должны быть установлены в True. И, в заключение, соединяемкаждую кнопку с выпадающим меню, используя для этого свойство MenuItem.
Компонент TCoolBar, это новая разновидность TToolBar. TCoolBar этоэлемент управления, который обычно содержит в себе два или более TCoolBand-ов,размеры и местоположение которых можно изменять во время выполнения программы.CoolBand в свою очередь является областью элемента управления, которая можетсодержать другие оконные контролы, главным образом панели инструментов, окошкиредактирования, выпадающие списки и анимация.
Создать coolbar довольно просто: достаточно поместить компонентCoolBar из набора Win32 VCL на форму. У CoolBar-а есть довольно много настроек(настройка осуществляется через свойства): Align - поумолчанию, расположение Coolbar настроено на верхнюю часть окна, поэтому, чтобыизменить расположение кулбара, нам прийдётся подредактировать этосвойство; Bitmap - используется для закрашивания фонаCoolBar-а картинкой; свойство FixedOrder определяет, может липользователь переопределить порядок панелей.
TCoolBandКак уже упоминалось выше, компонент Coolbar, это обычно наборобъектов TCoolBand. Чтобы добавить несколько CoolBand-ов в CoolBar, нампотребуется вызвать редактор Coolbar Band-ов. Сделать это можно путём нажатияна значёк, расположенный сразу после свойства Bands.
Один из способов разместить компонент (или компонент-контейнер) наCoolBar-е, это перетащить его из палитры VCL, при этом автоматически создастсяновый band для хранения компонента. Другой способ заключается в том, чтокомпонент вставляется в форму напрямую, а затем, при помощи редактора CoolBarBand-ов связывается с каким либо CoolBand-ом. Далее на кулбар обычно добавлетсяToolbar, путём простого перетаскивания его из палитры Win32 на Coolbar. Потомна тулбар добавляются одна или несколько кнопок.
Самая интересная возможность CoolBar-а, это то, что он можетсодержать в себе элементы управления, отличные от кнопок.
Давайте перетащим на CoolBar выпадающий список, окошкоредактирования и один элемент анимации. Предположим, что у нас на формеприсутствует компонент memo с некоторым текстом.
Во время выполнения программы пользователь может изменятьместоположение элементов управления путём перемещения и, тем самым меняяразмер.
Как упоминалось выше, на CoolBar можно добавлять различные оконныекомпоненты. Оконные компоненты, это те, которые наследованы от TWinControl. Этозначит, что Labels и Shapes, например, не получится добавить на CoolBar.Однако, если внимательно посмотреть на Delphi IDE, то можно обнаружить, чтоcoolbar может так же содержать меню, хотя меню и не является оконнымкомпонентом. Значит должен быть способ добавлять на кулбар неоконныекомпоненты!
Кульные менюшки на Cool Band-ах
нам необходимо разместить на форме компонентMainMenu и добавить в него пункты при помощи Menu designer. Обратите внимание,что когда мы помещаем компонент TMainMenu на форму, то значение свойства формыMenu устанавливается в MainMenu1. Нам необходимо очистить это свойство и темсамым отключить объект MainMenu от формы, потому что нам необходимоиспользовать его в Coolbar-е.
Далее, добавляем Toolbar в Coolbar а так же добавляем несколькоToolButton - один ToolButton для каждого выпадающего меню. Если, например, уВас два меню верхнего уровня File и Edit, то добавить необходимо всего дваToolButton-а.
Далее, устанавливаем свойства тулбара. Flat и ShowCaptions устанавливаемв True. Свойства AutoSize и Grouped компонентаToolButton так же должны быть установлены в True. И, в заключение, соединяемкаждую кнопку с выпадающим меню, используя для этого свойство MenuItem.
Создание визуальных (и не визуальных) компонентов в режиме RunTime и работа с ними может показаться не простой задачей для начинающих программистов. В данной статье, на примере своеобразного каклькулятора будет продемонстрирована работа с RunTime-созданными компонентами.Описание будущей программы: по количеству, указанному пользователем, будет создавать N выпадающих списков, в которых можно выбрать математическое действие: сложение, вычитани, умножение, деление. И N полей ввода сумм. В зависимости от выбранного действия будет подсчитываться Итог.Начнем с создания интерфейса.Кидаем на форму панель TPanel на неё 2 кнопки TButton, 2 лейбла TLabel и 1 поле TEdit.Выстраиваем их в следующей последовательности:1) TLabel — Caption: Создать;2) TEdit — Name: eCmpCount; Text: 0;3) TLabel — Caption: елементов;4) TButton — Name: btnCreate; Caption: Создать;5) TButton — Name: btnClear; Caption: Очистить.В панели TPanel очистим Caption и свойство Align устанавливаем в alTop.Добавляем еще 1 панель TPanel с 1 лейблом TLabel и 1 полем TEdit.TPanel — очищаем Caption и Align устанавливаем в alBottom.TLabel — Caption: Результат;TEdit — Name: eResult; Text: 0; ReadOnly: True;В середину кладем TScrollBox, называем sbElements и свойство Align устанавливаем в alClient.На него кидаем 2 лейбла lblAction и lblSum с заголовками Действие и Сумма соответственно.В итоге наша форма должна выглядеть примерно вот так:В поле eCmpCount мы будем указывать кол-во компонент, которое необходимо создать. Поэтому нужно добавить обработку на событие OnKeyPress поля eCmpCount, которое не будет давать вводить ничего кроме цифр.
1
2
3
4
5 procedure TfmMain.eCmpCountKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', #8]) then
Key := #0
end;
Если вводимый символ Key не входит в диапозон от 0 до 9 и не равняется #8 (Клавиша Backspace), то обнуляем вводимый символ.
Аналогично полю eCmpCount нам необходимо ограничивать ввод для создаваемых в RunTime полей ввода сумм, однако мы хотим вводить не только целые, но и дробные числа.Код события будет выглядеть следующим образом:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 private // Описываем процедуру в разделе Private procedure onSumEditKeyPress(Sender: TObject; var Key: Char);
public
{ Public declarations }
end;
***
// и реализацию в разделе implementation
procedure TfmMain.onSumEditKeyPress(Sender: TObject; var Key: Char);
var fs: TFormatSettings;
begin
fs := TFormatSettings.Create;
if not (Key in ['0'..'9', #8, fs.DecimalSeparator]) then
Key := #0
end;
В зависимости от настроек системы дробные числа можно писать через точку или через запятую. Что бы оградить от ошибок, получим эти настройки из специальной структуры:TFormatSettings — Текущие настройки форматов системы.fs.DecimalSeparator — разделитель целой и дробной части указанный в системе.
Перейдем непосредственно к созданию компонентов.Для начала добавим глобальную переменную FTop: integer; для определения верхней границы создаваемого элемента.На событие OnCreate формы задаим начальное значение FTop:
1
2
3
4
5
6
7
8
9
10
11 private
FTop: integer;
procedure onSumEditKeyPress(Sender: TObject; var Key: Char);
public
{ Public declarations }
end;
procedure TfmMain.FormCreate(Sender: TObject);
begin
FTop := lblAction.Top + lblAction.Height + 10;
end;
Которое будет равняться верхней границе метки lblAction плюс её высота плюс отступ в 10 пикселей.
Теперь напишем код для кнопки «Создать».
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 procedure TfmMain.btnCreateClick(Sender: TObject);
var i,x: integer;
cb: TComboBox;
edt: TEdit;
begin
x := StrToInt(eCmpCount.Text);
if x > 0 then
for i := 0 to x - 1 do begin
cb := TComboBox.Create(sbElements);
cb.Parent := sbElements;
cb.Top := FTop;
cb.Left := 8;
cb.Width := 72;
cb.Style := csDropDownList;
cb.Items.Add('Выбрать');
cb.Items.Add('+');
cb.Items.Add('-');
cb.Items.Add('*');
cb.Items.Add('/');
cb.ItemIndex := 0;
cb.OnChange := calcTotal;
edt := TEdit.Create(sbElements);
edt.Parent := sbElements;
edt.Top := FTop;
edt.Left := cb.Left + cb.Width + 8;
edt.OnKeyPress := onSumEditKeyPress;
edt.OnChange := calcTotal;
cb.Tag := Integer(Pointer(edt));
Inc(FTop, cb.Height + 10);
end;
end;
Разберем код по подробнее:x := StrToInt(eCmpCount.Text); — Получаем кол-во елементов, которое нужно создать.cb := TComboBox.Create(sbElements); — Создаем выпадающий список.cb.Parent := sbElements; — В качестве родительского элемента указываем ScrollBox.cb.Top := FTop; — Задаем верхнюю координату.cb.Left := 8; — Левая граница.cb.Width := 72; — Ширина.cb.Style := csDropDownList; — Тип выпадающейго списка, который позволяет только выбрать из существующих элементов и не позволяет вводить значение вручную.cb.Items.Add — Добавляем типы математических действий.cb.ItemIndex := 0; — По умолчанию будет выбран пункт «Выбрать».cb.OnChange := calcTotal; — На изменение значения будет вызываться событие calcTotal, код которого я напишу немного ниже.
edt := TEdit.Create(sbElements); — Создаем поле ввода сумм.edt.Parent := sbElements; — В качестве родительского элемента указываем ScrollBox.edt.Top := FTop; — Задаем верхнюю координату.edt.Left := cb.Left + cb.Width + 8; — Левая граница высчитывается относительно выпадающего списка, как его левая граница плюс ширина плюс 8 пикселей отступа.edt.OnKeyPress := onSumEditKeyPress; — Проверяем кооректный ввод данных.edt.OnChange := calcTotal; — При изменении пересчитываем итоговую сумму.cb.Tag := Integer(Pointer(edt)); — Сохраняем указатель на поле суммы в свойство Tag выпадающейго списка, тем самым как бы связывая их в пару.Inc(FTop, cb.Height + 10); — Увеличиваем переменную верхней границы на высоту созданного выпадающего списка плюс отступ 10 пикселей.
Напишем код процедуры calcTotal, которая будет подсчитывать итог:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 private
FTop: integer;
procedure onSumEditKeyPress(Sender: TObject; var Key: Char);
procedure calcTotal(Sender: TObject);
public
***
procedure TfmMain.calcTotal(Sender: TObject);
var i: integer;
res: currency;
begin
res := 0;
for i := 0 to sbElements.ComponentCount - 1 do
if (sbElements.Components[i] is TComboBox)
and (TComboBox(sbElements.Components[i]).ItemIndex > 0) then
case TComboBox(sbElements.Components[i]).ItemIndex of
1: res := res + StrToCurr(TEdit(Pointer(TComboBox(sbElements.Components[i]).Tag)).Text);
2: res := res - StrToCurr(TEdit(Pointer(TComboBox(sbElements.Components[i]).Tag)).Text);
3: res := res * StrToCurr(TEdit(Pointer(TComboBox(sbElements.Components[i]).Tag)).Text);
4: res := res / StrToCurr(TEdit(Pointer(TComboBox(sbElements.Components[i]).Tag)).Text);
end;
eResult.Text := CurrToStr(res);
end;
res := 0; — Обнулим переменную результата.for i := 0 to sbElements.ComponentCount — 1 do — Цикл для всех комонентов содержащихся в sbElements.if (sbElements.Components[i] is TComboBox) — Если i-ый компонент пренадлежит к классу TComboBoxand (TComboBox(sbElements.Components[i]).ItemIndex > 0) then — и выбранный в нем элемент больше 0 (так как нулевой элемент в списке у нас «Выбрать»).case TComboBox(sbElements.Components[i]).ItemIndex of — В зависимости от выбранного элемента в списке выполним действие:Поле суммы получаем через указатель, который мы сохранили в свойстве Tag выпадающего списка при создании компонентов.1: res := res + StrToCurr(TEdit(Pointer(TComboBox(sbElements.Components[i]).Tag)).Text);2: res := res — StrToCurr(TEdit(Pointer(TComboBox(sbElements.Components[i]).Tag)).Text);3: res := res * StrToCurr(TEdit(Pointer(TComboBox(sbElements.Components[i]).Tag)).Text);4: res := res / StrToCurr(TEdit(Pointer(TComboBox(sbElements.Components[i]).Tag)).Text);eResult.Text := CurrToStr(res); — Результат запишем в соответствующее поле. Функция CurrToStr переводит число типа currency в строку.
И последнее, что нам осталось это написать код для кнопки «Очистить»:
1
2
3
4
5
6
7
8
9
10 procedure TfmMain.btnClearClick(Sender: TObject);
var i: integer;
begin
for i := sbElements.ComponentCount - 1 downto 0 do
if (sbElements.Components[i] <> lblAction) and (sbElements.Components[i] <> lblSum) then
sbElements.Components[i].Free;
FTop := lblAction.Top + lblAction.Height + 10;
eResult.Text := '0';
end;
for i := sbElements.ComponentCount — 1 downto 0 do — Выполняем цикл для всех компонентов содержащихся в sbElements в обратном порядке.if (sbElements.Components[i] <> lblAction) and (sbElements.Components[i] <> lblSum) then — Если это не лейблы «Действие» и «Сумма»sbElements.Components[i].Free; — Уничтожим этот компонент.FTop := lblAction.Top + lblAction.Height + 10; — Отсчет верхней границы вернем в исходное состояние.eResult.Text := ‘0’; — Обнулим результат.
Запускаем — проверяем:Сумма считается, все ОК!
Задача:
Среди трех чисел найти среднее. Если среди чисел есть равные, вывести сообщение "Ошибка".
Алгоритм решения задачи:
Хотя задача кажется простой, ее решение не такое очевидное. Можно, например, проверить каждое число, лежит ли оно между двумя другими. Или найти минимальное из трех, после чего вывести минимальное из оставшихся двух. Ниже выбран первый способ.
Исключаем равенство чисел. Если первое число равно второму или первое равно третьему или второе равно третьему или все три числа равны (первое равно второму и второе равно третьему), то вывести сообщение "Ошибка". Иначе переходим к п. 2.
Проверяем лежит ли первое число между вторым и третьим. Если первое число больше второго, но меньше третьего (т.е. второе минимально), или первое число меньше второго, но больше третьего (т.е. третье минимально), то значит оно среднее. Иначе переходим к п. 3.
Проверяем лежит ли второе число между первым и третьим. Если второе число больше первого, но меньше третьего, или меньше первого, но больше третьего, то оно среднее. Иначе переходим к п. 4.
Среднее число третье, так как ни один другой вариант не подошел. Действительно, числа не равны друг другу, первое и второе числа средними не являются.
Задача:
Дано трехзначное число. Вывести на экран все трехзначные числа, которые можно получить из цифр данного числа.
Алгоритм решения задачи:
Несмотря на кажущуюся простоту задачи, она не так проста. Если в числе есть одинаковые цифры или нули, то получается ограниченное число комбинаций.
Допустим, дано число abc, где a, b и c - цифры. Возможных вариантов, помимо abc, вроде бы будет 5: acb, bac, bca, cab, cba. Однако, если цифра a равна цифре b, то само число можно записать в виде aac, и тогда других вариантов будет всего два - это aca и caa. B таких нюансов в данной задаче много.
Предусмотреть все варианты в конструкции if-else непосильная задача. Ниже приводится лишь часть.
Есть вариант решения через массив. Записывать туда каждое очередное число, если оно больше 99 и меньше 1000 и если его еще нет в этом массиве. Но и тут возникают сложности, связанные с повторением кода.