Ниже перечислены основные составные части Delphi:
1. Дизайнер Форм (Form Designer) (рис.3.1)
2. Окно Редактора Исходного Текста (Editor Window) (рис.3.2)
3. Палитра Компонент (Component Palette) (рис.3.3)
4. Инспектор Объектов (Object Inspector) (рис.3.4)
5. Справочник (On-line help) (рис.3.5)
|

|

.
Дизайнер Форм первоначально состоит из одного пустого окна, которое Вы заполняете всевозможными объектами, выбранными на Палитре Компонент.
Несмотря на всю важность Дизайнера Форм, местом, где программисты проводят основное время является Редактор. Логика является движущей силой программы и Редактор - то место, где Вы ее "кодируете".
Палитра Компонент (см. рис.3.3) позволяет Вам выбрать нужные объекты для размещения их на Дизайнере Форм. Выбранный Вами объект появится на проектируемом окне и им можно манипулировать с помощью мыши.
|

.
Предположим, Вы помещаете компонент TEdit на форму; Вы можете двигать его с места на место. Вы также можете использовать границу, прорисованную вокруг объекта для изменения его размеров. Большинством других компонент можно манипулировать тем же образом. Однако, невидимые во время выполнения программы компоненты (типа TMenu или TDataBase) не меняют своей формы.
Слева от Дизайнера Форм Вы можете видеть Инспектор Объектов (рис.3.4). Заметьте, что информация в Инспекторе Объектов меняется в зависимости от объекта, выбранного на форме. Важно понять, что каждый компонент является настоящим объектом и Вы можете менять его вид и поведение с помощью Инспектора Объектов.
Инспектор Объектов состоит из двух страниц, каждую из которых можно использовать для определения поведения данного компонента. Первая страница - это список свойств, вторая - список событий
|

Последняя важная часть среды Delphi - Справочник (on-line help). Для доступа к этому инструменту нужно просто выбрать в системном меню пункт Help и затем Contents. На экране появится Справочник.
Рис.3.5. Справочник - быстрый поиск любой информации.
Справочник является контекстно-зависимым; при нажатии клавиши F1, Вы получите подсказку, соответствующую текущей ситуации. Например, находясь в Инспекторе Объектов, выберите какое-нибудь свойство и нажмите F1 - Вы получите справку о назначении данного свойства. Если в любой момент работы в среде Delphi возникает неясность или затруднение - жмите F1 и необходимая информация появится на экране.
4. Основная часть
Расчет стоимости разговора
Рис.4.1. Расчет стоимости разговора.
Исходный код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const
PAY=0.15; //цена одной минуты разговора 0,15 рубля
DISCOUNT=0.2; // скидка 20 процентов
var
Time:Real; // длительность разговора
Day:integer; // день недели
Summa:real; // стоимость разговора
begin
// получить исходные данные
Time:=StrToFloat(Edit1.Text);
Day:=StrToInt(Edit2.Text);
// Вычислить стоимость разговора
Summa:=PAY*Time;
// Если день суббота или воскресенье, то уменьшить
// стоимость на величину скидки
if (Day = 6) OR (Day=7)
then Summa:=Summa*(1-DISCOUNT);
// вывод результата вычисления
label3.caption:='К оплате'
+ FloatToStr(Summa)+'руб.';
end;
end.
Расчет оптимального веса:
Рис.4.2. Расчет оптимального веса.
Исходный код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
w:real;{вес}h:real;{рост}opt:real;
{оптимальный вес}
d:real;
{отклонение от оптимального веса}
begin
w:=StrToFloat(Edit1.Text);
h:=StrToFloat(Edit2.Text);
opt:=h-100;
if w=opt then
Label3.Caption:='Вы в хорошей форме!'
else
if w<opt then
begin
d:=opt-w;
Label3.caption:='Вам надо поправиться, на '
+FloatToStr(d)+'кг.';
end
else
begin
d:=w-opt;
Label3.caption:='Вам надо немного похудеть, на '
+FloatToStr(d)+'кг.';
end;
end;
end.
Пример использования case:
Рис.4.3. Пример использования case.
Исходный код:
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
ListBox1: TListBox;
Label3: TLabel;
Label4: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
funt:real; // вес в фунтах
kg:real; // вес в килограммах
k:real; // коэффициент пересчета
begin
case ListBox1.Itemindex of
0: k:=0.4095; // Россия
1: k:=0.453592; // Англия
2:k:=0.56001; // Австрия
3..5,7:k:=0.5; // Германия, Дания, Исландия, Нидерланды
6: k:=0.31762; // Италия
end;
funt:=StrToFloat(Edit1.Text);
kg:=k*funt;
label4.caption:=Edit1.Text
+ ' ф. — это ' + FloatToStrF(kg,ffFixed, 6,3) + 'кг.';
end;
end.
Сложение двух чисел:
Рис.4.4. Сложение двух чисел.
Исходный код:
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
a,b:integer;
c:real;
begin
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);
c:=a/b;
if b=0 then Edit3.Text:='На ноль делить нельзя!';
if b=0 then Edit3.Font.Color:=clRed
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
end.
Деление двух чисел:
Рис.4.5. Деление двух чисел.
Калькулятор:
Рис.4.6. Приложение «Калькулятор».
Исходный код:
unit Unit6;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
RadioGroup1: TRadioGroup;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
a,b:integer;
c:variant;
begin
if Edit1.Text='' then ShowMessage('Ошибка...незаданы значения!') else
if Edit2.Text='' then ShowMessage('Ошибка...незаданы значения!') else
begin
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);
case RadioGroup1.ItemIndex of
0: c:=a+b;
1: c:=a-b;
2: c:=a*b;
3: c:=a/b;
end;
Edit3.Text:=IntToStr(c);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in [ '0'.. '9', '+', '-' ]) then Key:=#0;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in [ '0'.. '9', '+', '-' ]) then Key:=#0;
end;
end.
Приложения для обработки строк:
Рис.4.7. Обработка строк.
Рис.4.8. Обработка строк(с функцией замены).
Исходный код:
unit Unit8;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i,zam:integer;
s:string;
begin
begin
zam:=0;
s:=edit1.text;
if CheckBox1.Checked then
for i:=1 to length(s) do
if s[i]='а' then
begin
s[i]:='б';
zam:=zam+1;
end;
if CheckBox2.Checked then
for i:=1 to length(s) do
if s[i]=' ' then
begin
s[i]:='-';
zam:=zam+1;
end;
if CheckBox3.Checked then Edit3.Text:=IntToStr(zam);
Edit2.Text:=s;
end; end; end.
Работа с массивами:
Рис.4.9. Работа с одномерными массивами.
Исходный код:
unit Unit9;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
GroupBox1: TGroupBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Button2: TButton;
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
N:string;
i,max,min,Sum,plys:integer;
M:array[1..20] of integer;
implementation
{$R *.dfm}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in [ '0'.. '9' ]) then Key:=#0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit3.Clear;
Edit4.Clear;
Edit5.Clear;
Edit6.Clear;
N:=Edit1.Text;
if StrToInt(N)>20 then ShowMessage ('Дорогой пользователь, для вас специально написано, что указать размер массива не более 20') else begin
randomize;
for i:=1 to StrToInt(N) do begin
m[i]:=random(20);
Edit2.Text:=Edit2.Text+IntToStr(m[i])+ ', ';
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if CheckBox2.Checked then
begin
max:=m[1];
for i:=1 to StrToInt(N) do
begin
if m[i]>max then
begin
max:=m[i];
end;
end;
Edit4.Text:=IntToStr(max);
end;
if CheckBox1.Checked then
begin
min:=m[1];
for i:=1 to StrToInt(N) do
begin
if m[i]<min then
begin
min:=m[i];
end;
end;
Edit3.Text:=IntToStr(min);
end;
if CheckBox3.Checked then
begin
Sum:=0;
for i:=1 to StrToInt(N) do
begin
Sum:=m[i]+Sum;
end;
Edit5.Text:=IntToStr(Sum);
end;
if CheckBox4.Checked then
begin
plys:=0;
for i:=2 to StrToInt(N) do
begin
if m[i]>0 then
begin
plys:=plys+1;
end;
end;
Edit6.Text:=IntToStr(plys);
end;
end;
end.
Обработка двумерного массива:
Рис.4.10. Обработка двумерного массива(случайный ввод чисел в таблицу).
Рис.4.11. Обработка двумерного массива(ввод чисел производится пользователем с клавиатуры).
Исходный код:
unit Unit10;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
GroupBox1: TGroupBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i,j,min,max,S:integer;
m: array[1..100,1..100] of integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
with StringGrid1 do
begin
for i:=1 to ColCount-1 do
begin
for j:=1 to RowCount-1 do
begin
cells[i,j]:=IntToStr(random(100));
end;
end;
for i:=1 to RowCount-1 do
begin
cells[0,i]:=IntToStr(i);
cells[i,0]:=IntToStr(i);
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
if CheckBox2.Checked then
begin
max:=m[1,1];
for i:=1 to 100 do
for j:=1 to 100 do
begin
if m[i,j]>max then
begin
max:=m[i,j];
end;
end;
Edit1.Text:=IntToStr(max);
end;
if CheckBox1.Checked then
begin
min:=m[1,1];
for i:=1 to 100 do
for j:=1 to 100 do
begin
if m[i,j]<min then
begin
min:=m[i,j];
end;
end;
Edit2.Text:=IntToStr(min);
end;
if CheckBox3.Checked then
begin
S:=0;
for i:=1 to 100 do
for j:=1 to 100 do
begin
S:=m[i,j]+S;
end;
Edit3.Text:=IntToStr(S);
end;
end;
end.
Рис.4.12. Обработка файла.
Рис.4.13. Обработка файла.
Рис.4.14. Обработка файла.
Рис.4.15. Текстовый редактор.
Исходный код:
unit Unit5;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,PRINTERS, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
PrintDialog1: TPrintDialog;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
S,f:string;
FN:TextFile;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
with OpenDialog1, Memo1 do
if Execute then
Lines.LoadFromFile(FileName);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines.SaveToFile(OpenDialog1.FileName); // Сохраняем туда, откуда считали
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if PrintDialog1.Execute then
begin
AssignPrn(FN);{открыть доступ к принтеру}
Rewrite(FN);
Writeln(FN,Memo1.Text);
System.CloseFile(FN);{закрыть доступ к принтеру }
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
with SaveDialog1, Memo1 do
if Execute then
begin
Lines.SaveToFile(FileName);
OpenDialog1.FileName:=FileName; // Чтобы исправленный текст не затёр источник
end;
end;
end.
Многооконный текстовый редактор:
Рис.4.16. Многооконный текстовый редактор.
Исходный код:
unit main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.ActnList, Vcl.StdActns,Printers,
Vcl.ExtActns;
type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N15: TMenuItem;
N16: TMenuItem;
N17: TMenuItem;
WindowMenu: TMenuItem;
N19: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
N23: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
FontDialog1: TFontDialog;
PrintDialog1: TPrintDialog;
FindDialog1: TFindDialog;
ReplaceDialog1: TReplaceDialog;
ActionList1: TActionList;
N18: TMenuItem;
N24: TMenuItem;
N25: TMenuItem;
WindowCascade1: TWindowCascade;
WindowTileHorizontal1: TWindowTileHorizontal;
WindowTileVertical1: TWindowTileVertical;
EditCut1: TEditCut;
EditCopy1: TEditCopy;
EditPaste1: TEditPaste;
EditUndo1: TEditUndo;
EditDelete1: TEditDelete;
RichEditAlignLeft1: TRichEditAlignLeft;
RichEditAlignRight1: TRichEditAlignRight;
RichEditAlignCenter1: TRichEditAlignCenter;
SearchFind1: TSearchFind;
SearchReplace1: TSearchReplace;
procedure N4Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N16Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N14Click(Sender: TObject);
procedure FindDialog1Find(Sender: TObject);
procedure N15Click(Sender: TObject);
procedure N23Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
FName:variant;
F:TextFile;
SPos:integer;
implementation
{$R *.dfm}
uses Child, AboutUnit;
procedure TMainForm.FindDialog1Find(Sender: TObject);
begin
with FindDialog1 do
begin
if frMatchCase In Options then {поиск с учетом регистра}
ChildForm.RichEdit1.SelStart:=Pos(FindText,Copy(ChildForm.RichEdit1.Lines.Text, SPos+1, Length(ChildForm.RichEdit1.Lines.Text)))+Spos-1
else {поиск без учета регистра}
ChildForm.RichEdit1.SelStart:=Pos(AnsiLowerCase(FindText), AnsiLowerCase(Copy(ChildForm.RichEdit1. Lines.text, SPos+1, Length(ChildForm.RichEdit1.Lines.Text))))+SPos-1;
if ChildForm.RichEdit1.SelStart>=SPos then
begin {выделение найденного текста}
ChildForm.RichEdit1.SelLength:=Length(FindText);
Spos:=ChildForm.RichEdit1.SelStart+ChildForm.RichEdit1.SelLength+1;
end
else
if MessageDlg('Текст «'+FindText+'» не найден. Продолжать диалог?',mtConfirmation,mbYesNoCancel,0) = mrYes then CloseDialog;
end;
ChildForm.RichEdit1.SetFocus;
end;
procedure TMainForm.N14Click(Sender: TObject);
begin
SPos:=(ActiveMDIChild as TchildForm).RichEdit1.SelStart; {запомнить позицию курсора}
with FindDialog1 do
begin
FindText:=(ActiveMDIChild as TChildForm).RichEdit1.SelText;
{начальное значение искомого текста - выделенный текст}
{позиционирование окна диалога поиска}
//Position:=Point(ChildForm.Left+ChildForm.Top+ChildForm.RichEdit1.Top+ChildForm.RichEdit1.Height);
Options:=Options+[frHideUpDown,frHideWholeWord];
{удаление из диалога кнопок «Вверх». «Вниз», «только слово целиком»}
Execute; {выполнение поиска}
end;
end;
procedure TMainForm.N15Click(Sender: TObject);
begin
SPos:=ChildForm.RichEdit1.SelStart; //(запомнить позицию курсора)
with ReplaceDialog1 do
begin
FindText:=ChildForm.RichEdit1.SelText; {начальное значение искомого текста -выделенный текст}
{позиционирование окна диалога поиска}
//Position:=Point(ChildForm.Left+ChildForm.Top+ ChildForm.RichEdit1.Top+ChildForm.RichEdit1.Height);
Options:=Options+[frHideUpDown,frHideWholeWord,frReplaceAll]; {удаление из диалога кнопок}
Execute; {выполнение поиска-замены}
end;
end;
procedure TMainForm.N16Click(Sender: TObject);
begin
if FontDialog1.Execute then {если пользователь выбрал шрифт}
begin
(ActiveMDIChild as TChildForm).RichEdit1.Font:=FontDialog1.Font; {установить выбранный шрифт}
end;
end;
procedure TMainForm.N23Click(Sender: TObject);
begin
About.ShowModal;
end;
procedure TMainForm.N4Click(Sender: TObject);
begin
TChildForm.Create(Self);
end;
procedure TMainForm.N5Click(Sender: TObject);
begin
if OpenDialog1.Execute then {если файл выбран, то выполнять следующее}
begin
ChildForm:=TChildForm.Create(Self); {создать дочернее окно}
ChildForm.RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName); {загрузить в RichEditl выбранный файл}
ChildForm.Caption:=OpenDialog1.FileName; {установить в заголовок дочернего окна название файла}
ChildForm.RichEdit1.Tag:=0; {признак неизмененного файла}
end;
end;
procedure TMainForm.N6Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit; {если нет MD1 дочерних окон, то выйти из процедуры}
if (ActiveMDIChild as TChildForm).Caption='Новый' then {если документ имеет заголовок окна «Новый»}
N5Click(Sender) {вызвать процедуру «Сохранить как...»}
else
begin {Сохранить файл с именем, указанным в заголовке}
(ActiveMDIChild as TChildForm).RichEdit1.Lines.
SaveToFile((ActiveMDIChild as TChildForm).Caption);
(ActiveMDIChild as TChildForm).RichEdit1.Tag:=0;
end;
end;
procedure TMainForm.N7Click(Sender: TObject);{сохранить как...}
begin
if MDIChildCount=0 then Exit; {если нет MDI дочерних окон, то выйти из процедуры}
SaveDialog1.FileName:=FName; {присвоить свойству FileName значение из FName}
SaveDialog1.Title:='Сохранить как...'; {заголовок диалогового окна сохранения файла}
if SaveDialog1.Execute then
begin
FName:=SaveDialog1.FileName; {открыть диалог и запомнить новое имя файла}
case SaveDialog1.FilterIndex of {Изменить расширение файла}
1: FName:=ChangeFileExt(FName,'.doc');
2: FName:=ChangeFileExt(FName,'.rtf');
3: FName:=ChangeFileExt(FName,'.txt');
end;
end;
(ActiveMDIChild as TChildForm).RichEdit1.Lines.SaveToFile(FName); {записать в файл содержимое из свойства Lines объекта RichEdit активного окна}
(ActiveMDIChild as TChildForm).Caption:=FName; {заменить имя файла в заголовке активного окна}
(ActiveMDIChild as TChildForm).RichEdit1.Tag:=0; {изменения в файле сохранены}
end;
procedure TMainForm.N8Click(Sender: TObject);
begin
if PrintDialog1.Execute then
begin
AssignPrn(F);{открыть доступ к принтеру}
Rewrite(F);
Writeln(F,(ActiveMDIChild as TChildForm).RichEdit1.Text);
System.CloseFile(F);{закрыть доступ к принтеру }
end;
end;
procedure TMainForm.N9Click(Sender: TObject);
begin
Close;
end;
end.
Медиаплеер:
Рис.4.17. Медиаплеер.
Исходный код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.MPlayer, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
Button1: TButton;
MediaPlayer1: TMediaPlayer;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
FileName:string;
x1, y1, x2, y2: integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
MediaPlayer1.FileName:= OpenDialog1.FileName;
MediaPlayer1.Open;
MediaPlayer1.DisplayRect:= Rect(0, 0, 433, 257);
end;
end;
end.
Термометр(конвертор):
Рис.4.18. Термометр(конвертор).
Исходный код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
PaintBox1: TPaintBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit2Enter(Sender: TObject);
procedure Edit1Enter(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a,b:real;
x,y: integer; // координаты левого верхнего угла прямоугольника
w,h: integer; // ширина и высота прямоугольника
bs: TBrushStyle;// стиль заполнения области
k: integer; // номер стиля заполнения
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
b:=StrToFloat(Edit2.Text);
if b>212 then
begin
a:=(212-32)/1.8;
Edit1.Text:=FloatToStr(a);
Edit2.Text:=FloatToStr(212);
end else
if b<32 then
begin
a:=0;
Edit1.Text:=FloatToStr(a);
Edit2.Text:=FloatToStr(32);
end else
begin
a:=(b-32)/1.8;
Edit1.Text:=FloatToStr(a);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
a:=StrToFloat(Edit1.Text);
if a>100 then
begin
b:=100*1.8+32;
Edit2.Text:=FloatToStr(b);
Edit1.Text:=FloatToStr(100);
end else
if a<0 then
begin
b:=32;
Edit2.Text:=FloatToStr(b);
Edit1.Text:=FloatToStr(0);
end else
begin
a:=StrToFloat(Edit1.Text);
b:=a*1.8+32;
Edit2.Text:=FloatToStr(b);
end;
end;
procedure TForm1.Edit1Enter(Sender: TObject);
begin
Button1.Visible:=False;
Button2.Visible:=True;
end;
procedure TForm1.Edit2Enter(Sender: TObject);
begin
Button2.Visible:=False;
Button1.Visible:=True;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
w:=81;h:=321; // размер области(прямоугольника)
y:=8;x:=232;
Canvas.Brush.Color:= clWhite; // цвет закраски - зеленый
Canvas.Brush.Style:= bs; // стиль закраски
Canvas.Rectangle(x,y,x+w,y+h);
Canvas.TextOut(245, 280,'C');
Canvas.TextOut(295,280,'F');
w:=17;h:=310; // размер области(прямоугольника)
y:=15;x:=264;
Canvas.Brush.Color:= clRed; // цвет закраски - белый
Canvas.Brush.Style:= bs; // стиль закраски
Canvas.Rectangle(x,y,x+w,y+h);
end;
end.
5. Индивидуальное задание. Арифметические операции, функции, выражения. Арифметический оператор присваивания
К арифметическим типам данных относятся группы вещественных и целых типов. К ним применимы арифметические операции и операции отношений.
Операции над данными бывают унарными (применимые к одному операнду) и бинарными (применимые к двум операндам). Унарная арифметическая операция одна. Это операция изменения знака. Ее формат:
Бинарные арифметические операции стандартного Паскаля описаны в табл. 3.3. В ней I обозначает целые типы, R — вещественные типы.
Таблица 3.3
К арифметическим величинам могут быть применены стандартные функции Паскаля. Структура обращения к функции представлена на рис. 16.
Функция выступает как операнд в выражении. Например, в следующем операторе присваивания
операндами являются три функции: sin, ln, cos. Их запись такая же, как в математике. Аргументы называются фактическими параметрами и являются в общем случае выражениями арифметического типа. Аргументы записываются в круглых скобках. Результат вычисления функции — величина соответствующего типа.
Табл. 3.4 содержит описания математических стандартных функций Турбо Паскаля.
Таблица 3.4
Арифметическое выражение задает порядок выполнения действий над числовыми величинами. Арифметические выражения содержат арифметические операции, функции, операнды, круглые скобки. Одна константа или одна переменная — простейшая форма арифметического выражения.
Например, запишем по правилам Паскаля следующее математическое выражение:
На Паскале это выглядит так:
Для того чтобы правильно записывать арифметические выражения, нужно соблюдать следующие правила:
1. Все символы пишутся в строчку на одном уровне. Проставляются все знаки операций (нельзя пропускать знак умножения).
2. Не допускаются два следующих подряд знака операций (нельзя A+-B; можно А+(-B)).
3. Операции с более высоким приоритетом выполняются раньше операций с меньшим приоритетом. Порядок убывания приоритетов:
• вычисление функции;
• унарная операция смены знака (-);
• *, /, div, mod;
• +, -.
4. Несколько записанных подряд операций одинакового приоритета выполняются последовательно слева направо.
5. Часть выражения, заключенная в скобки, вычисляется в первую очередь. (Например, (A+B) * (C—D) — умножение производится после сложения и вычитания.)
Не следует записывать выражений, не имеющих математического смысла. Например, деление на нуль, логарифм отрицательного числа и т. п.
Пример. Цифрами сверху указан порядок выполнения операций:
Данное арифметическое выражение соответствует следующей математической формуле:
В Паскале нет операции или стандартной функции возведения числа в произвольную степень. Для вычисления xy рекомендуется поступать следующим образом:
• если у — целое значение, то степень вычисляется через умножение; например, х3 → х ∙ х ∙ х; большие степени следует вычислять умножением в цикле;
• если у — вещественное значение, то используется следующая математическая формула: хy = eyln(x).
На Паскале это будет выглядеть так:
Очевидно, что при вещественном у не допускается нулевое или отрицательное значение х. Для целого у такого ограничения нет.
Например,
На Паскале это будет так:
Выражение имеет целый тип, если в результате его вычисления получается величина целого типа. Выражение имеет вещественный тип, если результатом его вычисления является вещественная величина.
Арифметический оператор присваивания имеет структуру, представленную на рис. 17.
Например:
Порядок выполнения оператора присваивания нами уже рассматривался. Следует обратить особое внимание на следующее правило: типы переменной и выражения должны быть одинаковыми. Исключение составляет случай, когда выражение имеет целый тип, а переменная — вещественный.
Можно ли того же самого результата достичь более простым способом?
Ввод с клавиатуры и вывод на экран
Ввод данных — это передача информации от внешних устройств в оперативную память. Вводятся, как правило, исходные данные решаемой задачи. Вывод — обратный процесс, когда данные передаются из оперативной памяти на внешние носители (принтер, дисплей, магнитные устройства и т.д.). Результаты решения всякой задачи должны быть выведены на один из этих носителей.
Основными устройствами ввода-вывода у персонального компьютера являются клавиатура и дисплей (экран монитора). Именно через эти устройства главным образом осуществляется диалог между человеком и ПК.
Процедура ввода с клавиатуры имеет следующий формат:
Read(<cписок ввода>)
где <список ввода> — это последовательность имен переменных, разделенных запятыми. Слово read переводится как читать. (Точнее говоря, Read — это оператор обращения к стандартной процедуре ввода.)
Например,
При выполнении этого оператора происходит прерывание работы компьютера, после чего пользователь должен набрать на клавиатуре значения переменных а, b, с, d, отделяя их друг от друга пробелами. При этом вводимые значения высвечиваются на экране. В конце нажимают клавишу Enter. Значения должны вводиться в строгом соответствии с синтаксисом Паскаля.
Пример:
Набираем на клавиатуре:
Если в программе имеется несколько операторов Read, то данные для них вводятся потоком, т. е. после считывания значений переменных для одного оператора Read данные для следующего оператора читаются из той же строки на экране, что и для предыдущего до окончания строки, затем происходит переход на следующую строку.
Пример:
Набираем на клавиатуре:
Другой вариант оператора ввода с клавиатуры имеет вид:
Здесь слово ReadLn означает read line — читать строку. Этот оператор отличается от Read только тем, что после считывания последнего в списке значения для одного оператора ReadLn данные для следующего оператора будут считываться с начала новой строки. Если в предыдущем примере заменить операторы Read на ReadLn:
то ввод значений будет происходить из двух строк:
Оператор вывода на экран (обращение к стандартной процедуре вывода) имеет следующий формат:
Здесь элементами списка вывода могут быть выражения различных типов (в частности, константы и переменные).
Пример:
При выводе на экран нескольких чисел в строку они не отделяются друг от друга пробелами
Программист сам должен позаботиться о таком разделении. Пусть, например, I = 1; J = 2, К = 3. Тогда, написав в программе
получим на экране строку: 1 2 3. После вывода последнего символа курсор остается в той же строке. Следующий вывод на экран будет начинаться с этой позиции курсора.
Второй вариант процедуры вывода на экран:
Слово WriteLn — write line — означает писать строку. Его действие отличается от оператора Write тем, что после вывода последнего в списке значения происходит перевод курсора к началу следующей строки. Оператор WriteLn, записанный без параметров, вызывает перевод строки.
Форматы вывода. В списке вывода могут присутствовать указатели форматов вывода (форматы). Формат определяет представление выводимого значения на экране. Он отделяется от соответствующего ему элемента двоеточием. Если указатель формата отсутствует, то машина выводит значение по определенному правилу, предусмотренному по умолчанию.
Ниже кратко, в справочной форме, приводятся правила и примеры бесформатного и форматированного вывода величин различных типов. Для представления списка вывода здесь будут использованы следующие обозначения:
I, Р, Q — целочисленные выражения;
R — выражение вещественного типа;
В — выражение булевского типа;
Ch — символьная величина;
S — строковое выражение;
# — цифра;
* — знак «+» или «—»;
_ — пробел.
Форматы процедуры Write
I — выводится десятичное представление величины I, начиная с позиции расположения курсора: