Урок 1     "Азы Delphi"      Frank Fortino (ffortino@svn.net)  Copyright 1999  

Перевод на русский язык : 2001 год   Руденко Е.В. janerev@hotmale.ru


Содержание:


В этих уроках я привлекаю Ваше внимание к важным, с моей точки зрения, моментам написания хорошо читаемых и основательных программ. Я не считаю, что это самый лучший путь, просто мне это помогает.

Возможности огромны, в этом - мощность Delphi, но и проблема Delphi.


Стиль этих уроков несколько сумбурный, я прыгаю от темы к теме.
Это делается для сохранения времени и для объяснения нового по мере его появления.

Программируя на Delphi вы:
    - Используете самую мощную на сегодняшний день среду программирования
    - Сами выстраиваете свое окружение
    - Сохраняете в виде библиотеки все то, что вы сделали
    - Обретаете отличный стиль программирования


При работе с Delphi вы можете использовать небольшие хитрости
    например, удерживая нажатой клавишу Ctrl при размещении компонентов на форме или
         уерживая нажатой левую кнопку мыши при создании бокса вокруг выбранных вами компонентов
                - Вы можете изменять свойства одновременно для всей выбранной группы.

     или , нажимая клавишу Shift на отдельном компоненте, вы можете группировать компоненты вместе.

При работе с Delphi :
    Щелчок правой кнопкой мыши:   обычно вызывает появление выпадающего меню (PopsUpMenu)
    двойной щелчок:   обычно приводит к событию OnClickEvent и т.д.


Для различных компонентов Delphi имеет мощные Meтоды и Свойства.

Например::
    ListBox1.Items.LoadFromFile('c:\autoexec.bak');

Items представляет собой тип TStrings (Ну как!)
Что вы скажете...
Тип TStrings имеет метод LoadFromFile , который:
    связывет, открывает, читает и закрывает текстовый файл - и все в одной команде
    ListBox1.Items.LoadFromFile('c:\autoexec.bak');

ListBox1 теперь включает весь текст из файла 'autoexec.bak'

Таким образом, любые компоненты, имеющие свойство TStrings , могут использовать метод LoadFromFile:

    Memo                Memo1.Lines.LoadFromFile('  ');
    ListBox             ListBox1.Items.LoadFromFile('  ');
    ComboBox        ComboBox1.Items.LoadFromFile('  ');

Все вышесказанное верно и для метода  SaveToFile.


Ниже приведен очень полезный способ получения помощи(HELP).
  Щелкните на Component,
      Нажмите F1,
          Выберите Properties,...

Вы также можете щелкнуть на Component's Property:
    -Разместите ListBox1 на форме
      -Щелкните на ListBox1
        -В Object Inspector
          -Щелкните на 'Sorted' свойстве (с левой стороны)
            - Нажмите на F1
              -Щелкните на Example ....

Или вы можете выбрать Search для 'TStrings'
    -Help (Menu)
      -Выберите Search
        -Введите 'TStrings'
          - Щелкните на Methods
             -Щелкните на LoadFromFile


Начало.

Окружение Delphi :
            Программы на Delphi состоят из трех основных типов файлов (.dpr .pas .dfm)

    .dpr файл вашего проекта
        - небольшая программа (текстовый файл)
       - определает модули (Units) в проекте

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

1) инициализируются данные
2) создаются (creates) формы
3) запускается приложение (program)

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

    .pas    1 или более модулей (код на Pascal)
    .dfm    1 или более файлов определения форм


Заметим:
   - Каждая форма (.dfm) ДОЛЖНА иметь Модуль (.pas)
    -Могут быть Модули без Формы (только код)

    Файл .dfm - специальный файл на псевдокоде.
    Чтобы его прочитать, требуется специальная программа
        (Укажите на форму, щелкните правой кнопкой мыши, выберите VIEW AS TEXT)  или нажмите Alt F12
            - теперь вы можете видеть код , создающий форму:

Пример .dfm файла:

object Form1: TForm1
  Left = 200
  Top = 108
  Width = 696
  Height = 480
  Caption = 'Form1'
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 176
    Top = 116
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
  end
end

Этот файл Вы можете редактировать (только внутри Delphi) , используя VIEW AS TEXT
Однако, обычно Вы НЕ РЕДАКТИРУЕТЕ .dfm файл (как текст), вы размещаете объекты на форме, а Delphi создает .dfm файл для Вас.
Если Вы некорректно отредактируете .dfm файл, это может вызвать определенные проблемы.

Для переключения между формой и ее текстовым видом (.dfm файл) используйте:
    VIEW AS TEXT
    VIEW AS FORM
    или   Alt F12 


Комментарий:

Щелкайте правой кнопкой мыши на всем.  Обычно в Delphi при этом появляется выпадающее меню

используйте правую кнопку мыши для:
    - закрытия (CLOSE) текущей страницы
        (например, если вы открывали файл , не входящий в ваш проект )
          вырезания (Cut) и вставки (Paste)  кусочков кода, группы компонент
   - VIEW AS FORM
   - VIEW AS TEXT


Разработка проектов на Delphi

Запомните:  ПЕРЕИМЕНОВЫВАЙТЕ ВСЕ С САМОГО НАЧАЛА!

- Используйте отдельные директории для каждого проекта
    Всегда начинайте с пункта NEW APPLICATION и немедленно делайте:

    -File (из Menu)
         -Create New Folder   например :   c:\Delphi5\SysSetup
              -Save Project As   'SysSetup'

    -File   (как Unit1.pas)
        -Save As    'Main'

Пример:

    Project1     // разместите в новой директории ( ..\SysSetup )
        SAVE AS   SysSetup.dpr

    Form1         MainF   (Переименуйте)
    Unit1           Main.pas  (SAVE AS)

    Form2         PriceF   (Переименуйте)
    Unit2           Price   (SAVE AS)

Именуйте все устанавливаемые компоненты при первом их появлении

    Button1       переименуйте в StartBtn
    ListBox1     переименуйте в CustList


Стиль программирования автора (Frank's Fortino)

- Небольшие , но информативные имена
        SysSetup.dpr
        XFileName (глобальная переменная)

- Определите способ поименования ваших компонентов
    Мой способ (который меняется)
        T1 : TTable;      // сформированная таблица, которая локально расположена на форме
                                    или будет переименовываться и сохраняться

        BrandTbl : TTable;       // более лучший способ

    или TblBrand : TTable;
            TblCost : TTable

Далее приводятся другие способы поименования компонентов:

  Используйте короткую аббревиатуру в верхнем регистре с нижней чертой:
      B_OK как для TButton так и для TBitbtn,
      E_Name для EditBox, CHK_Checkbox, M_Memo,
      TT_MyTable DS_Mytable, Q_MyQuery и так далее.


Некоторые хитрости программирования:

Сохраняйте версии проекта в отдельных директориях (где имя директории - текущая дата):
    c:\Freedom\Setup\1228     дата  = 1228

Копируйте ТОЛЬКО *.dpr *.pas *.dfm файлы в новую директорию
    Запустите проект (.dpr файл в Delphi)
        Save Project As     'SysSetup.dpr'

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


Ваш собственный Tool Bar

Для изменения Tool Bar по вашему желанию:
    Щелкните правой кнопкой мыши по Tool Bar и выберите PROPERTIES
        С помощью мыши уберите (перетащите) ненужные иконки с ToolBar
        С помощью мыши добавьте (перетащите) нужные вам иконки из списка на ToolBar


Хороший стиль программирования:

    1) Используйте заглавную первую букву каждого нового слова (в имени)
            убирайте нижнюю черту, например, вместо New_Data должно быть NewData

    2) начинайте код внутри ВСЕХ блоков begin end с отступом на 2 - 3 символа
       for x:=1 to 22 do
    begin
      if y>32 then ....
    end;
    ----------------

if ... then
begin
  ...
end

else if ... then
begin
  ...
end;


ОТКЛЮЧИТЕ ОПТИМИЗАЦИЮ КОДА В КОМПИЛЯТОРЕ

    -Project (menu)
      -Options
        -Compiler (tab)
          -Optimization TURN OFF

    - Выберите Default (CheckBox)
    - Нажмите OK

Оптимизатор кода СЛИШКОМ НАДОЕДАЕТ иногда и не дает возможности установить точки останова (Breakpoints).

Использование точек останова может многое дать вам
    - Вы можете увидеть последовательность  выполнения кода в  Delphi 

    - Вы можете наблюдать значения ваших переменных (при наведении курсора мыши на переменную )
         или в Окне Просмотра


Новая тема : Сущность формы

События формы :
    OnCreate
    OnShow
    OnActivate

Свойства формы :
    Visible

Это все события и свойства, которые используются , когда форма создается, появляется, открывается, закрывается, становится активной
Какое между ними отличие и Как и Когда их использовать?

Сначала форма создается (Created).
Она создается только один раз в .dpr файле

  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1); // Именно здесь создается Form1
    Application.Run;
  end.

Form1.Show;   // этот метод делает форму видимой (открывает (Open));

Form1.Visible:=True; // Делает форму видимой (Visible)

Form1.Close;  // Делает форму невидимой (not Visible)
    (Если Form1 ваша главная (Main) форма, то при этом закрывается ваш проект (Quit)

Не следует закрывать форму следующим образом
    Form1.Visible:=False;


"Горячие" клавиши

   F1     = Помощь
   F12   = Переключение форма / модуль
   Alt + F12   = Переключение форма /файл .dfm

    F7  = Пошаговая компиляция (Заход в процедуры)
    F8  = Пошаговая компиляция (Без захода в процедуры)
    F9  = Запуск программы
    Ctrl + F2  = Сброс (Остановка) программы


Причуды Delphi

    Будьте уверены, в Delphi многое происходит "за сценой".
        (ниже приведен не полный пример - это только попытка показать возможные проблемы)

     Например:
       При работе с таблицами и компонентом DBGrids
       Щелкните правой кнопкой мыши на таблице
            - Выберите FIELDS EDITOR
                - Щелкните правой кнопкой
                    - Add Fields
                          - ...
    Свяжите DBGrid с таблицей
    Отредактируйте или удалите некоторые поля таблицы.

    Что мы видим ---
        Delphi считает, что поля , которые вы удалили, еще существуют.

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

    Иногда тяжело вернуться назад в  Delphi.


Комментарии:

    Программирование  на C++ подобно работе с "песчинками".
        Вы можете сделать "кирпич" ( за часы)
        Вы можете использовать "кирпичи" для постройки "стены" (за дни)
        Вы можете использовать "стены" для постройки "комнаты" (за недели)
        Вы можете использовать "комнаты" для постройки "дома"   (за месяцы)

    В Delphi вы программируете с "комнатами"
        Мы можем использовать "комнаты" для постройки "домов" (ВСЕГО ЗА НЕСКОЛЬКО ЧАСОВ !)


Создайте свою Help библиотеку

За короткий срок вы так много узнаете в Delphi, что вам необходим простой и быстрый способ сохранить все то, что вы изучили:
    - в примерах программ
    - в виде текстовых файлов и кусков кода

Вы изучаете так много, что можете запутаться. Когда вы возвращаетесь к предмету (скажем к ListBoxes) , то забываете некоторые детали как использовать ListBox и какие его основные свойства.

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

Всегда держите открытым текстовый редактор (типа EditPad) , чтобы вы могли в любое время вырезать (cut) и вставить (paste) куски кода из примеров помощи или из вашей собственной программы в текстовый файл и сохранить их в виде текста ( например   'ListBoxLoading.txt')

Также, хороший способ изучить новый компонент, который вы не использовали раньше, это - создать новый проект с данным компонентом  (скажем: ComboBox1) , с несколькими кнопками, которые изменяют Свойства или Методы ComboBox1.

"Поиграйтесь" с программой некоторое время и затем сохраните ее
    (.dpr .pas .dfm) файлы в отдельной директории (например,    'c:\D3 Help\ComboBoxes')

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

Это и есть то, что отличает "Мощного" программиста (У него есть множество примеров кода для копирования и вставки, для создания проектов)


Некоторые основы Объектно Ориентированного Программирования (OOP)

    Предок (Parent)
    Собственник (Owner)
    Источник (Sender)

    Что есть что?

    Отличие между Собственником и Предком:
    У вас есть форма Form1
        На Form1 вы разместили панель Panel1
        На панели вы разместили кнопку Button1

    Form1 -  Предок для Panel1
    Panel1 -  Предок для Button1
    Form1 -  Собственник для  Panel1 и Button1

    Form1 включает все, Form1 является Собственником (Owner) и Предком (Parent) для Panel1

    Form1 - Собственник для  Button1, но в то же время Предком для Button1 является  Panel1 (потому что кнопка  Button1 расположена на  Panel1).

     Собственник важен, особенно когда  Form1 создается в процессе работы  .dpr файла:
        Application.CreateForm(TForm1, Form1);

    Form1 теперь существует в памяти (занимает пространство)
    При создании  Form1 создаются также и  Panel1 и Button1 , потому что  Form1 - Собственник.

    Когда Form1 закрывается (вы закрываете ваш проект) , память , используемая Form1, Panel1 и Button1 освобождается (возвращается в кучу).

    Не получили ли вы  "Утечку" памяти ?
    "Утечка" памяти  происходит при закрытии  Form1 , когда не освобождается память RAM , используемая кнопкой Button1.  Это - "глюк" в Delphi (что не случайно).

       Только несколько компонентов могут быть Предками
        Они могут включать другие компоненты

    Кнопка (Button) не может содержать другую кнопку, так что она не может быть Предком

    Только несколько компонентов могут удерживать другие компоненты; в общем случае это:
        Form
        Panel
        GroupBox
        NoteBook (Delphi 2)
        PageControl
        TabSheets

    Как используются свойства Предка?
    Для кнопки Button1 Предком (Родителем) является Panel1 , так что кнопка  Button1 НАСЛЕДУЕТ (INHERITS) некоторые     

     свойства  панели Panel1.

       Например, если вы измените свойство Font на Bold на компоненте Panel что случится?
       Шрифт стал жирным как для панели  Panel1 так и для кнопки Button1.
       Если вы посмотрите на свойства кнопки в Инспекторе объектов, то увидите свойство ParentFont , установленное в TRUE
Если вы измените это свойство к False, то кнопка (Button1) не будет наследовать шрифт (Font) от Panel1.

Я надеюсь , что  немного помог вам.


Примечание для читателей.

Не расстраивайтесь, если вы не поняли всего, что я здесь сказал.
Я прыгаю вокруг и не объясняю детально как и почему!

После того, как вы поработаете немного с  Delphi , то начнете понимать что к чему, и ранее трудные для вас вещи станут легкими и тривиальными.

Работа Delphi основана на событиях; это значит , что ничего не случается до тех пор, пока ничего не случится (хорошая логика???) (например, нажата кнопка и т.д.)


Новый пункт:  инициализирующая последовательность событий в Delphi :

1) Запускается .dpr программа и создаются формы (и все , что находится на формах)
    (создание означает, что для каждого объекта выделяется участок памяти)

    В Delphi это называется INSTANTIATED (странное слово), оно означает, что форма теперь занимает участок оперативной памяти ( RAM ).

2) При запуске программы происходят следующие события (Events)
    Form OnCreate     =>     FormCreate( )     // remember they drop the 'On' ???
    Form OnShow      =>     FormShow( )

3) Далее программа ждет, что пользователь что-то сделает (Щелкнет мышкой,...)

Если вы хотите инициализировать некоторые переменные только один раз при запуске программы, где вам поместить код инициализации?
    Ответ: Вам необходимо инициализировать переменные в событии FormCreate( ) , поскольку оно происходит перед всем остальным и случается только однажды.

Есть и другие места для инициализации переменных, но FormCreate( ) - это все , что нам надо.


Источник (Sender) ????

Почти каждый компонент имеет События, которые срабатывают при щелчке кнопкой мыши или клавиатуры

Если вы "кликнули" на  Button1, то вызывается следующая процедура:


procedure TForm1.Button1Click(Sender: TObject);
                                        |               |            | -- OnClick Event( имена события начинаются с  On?)
                                        |               |
                                        |               | --- Эта процедура была вызвана при нажатии на  Button1 
                                        |
                                        |- TForm1 собственник  кнопки Button1 , поэтому  (TForm1.Button1)

The Источник(Caller) этой процедуры - кнопка Button1

Вы можете использовать параметр  Sender , который имеет тип  TObject
    Все в  Delphi имеет тип  TObject.

Любой другой компонент (например, Edit1 ) может использовать эту  же процедуру для события  OnClick  (если вы не хотите пписать другую процедуру для компонента  Edit1).

Edit1 - тип TEdit и TObject
Button1 - тип TButton и TObject

Таким образом параметр  Sender , посланный  Button1 или  Edit1 при событии OnClick (щелчок на кнопке или на окне редактирования), может быть либо типа  TEdit (от Edit1) либо типа TButton (от Button1).

Именно поэтому параметр  Sender определяется как тип  TObject, потому что он может быть типа  TButton, TEdit ... и так далее.

Внутри процедуры  OnClick вы можете определить какой компонент ее вызвал:

Разделяемая процедура OnClick Event (используется и Button1 и Edit1)

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (Sender is TButton) then Pane1.Color:=clRed      \\ "Клик" пришел от Button
  else if (Sender is TEdit) then Panel1.Color:=clLime \\ "Клик" пришел от Edit
end;

-----------------------

Разделяйте события OnClick

procedure TForm1.Button1Click(Sender: TObject);
begin
  Pane1.Color:=clRed
end;

procedure TForm1.Edit1Click(Sender: TObject);
begin
  Pane1.Color:=clLime
end;


Изучайте Delphi по ее исходным кодам:

Лазерные диски с материалами по DELPHI - это большой ресурс для поиска примеров кода,новых компонент или свойств, которые вы хотите использовать.

В Windows нажмите кнопку "ПУСК"
    -  Найти
        - Файлы и Директории
            -Имя файла  *.pas
                -Содержащий текст   .LOCATE(

При этом будут найдены все  *.pas  файлы , в которых используется LOCATE(
Затем помещайте каждый найденный файл в редактор  (например, WordPad) и ищите текст  .LOCATE ( и исследуйте его).

Это огромный ресурс.


DELPHI заметки:

Будьте внимательны, написанный вами код в Delphi может вас подвести.

Скажем, вы хотите , чтобы при нажатии кнопки Button панель  Panel меняла цвет на красный (Red) на три секунды , а затем опять становилась зеленой.
Вы пишете следующее событие  OnClick для кнопки Button:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.Color:=clRed; // красный
  sleep(3000); // задержка на  3000 миллисекунд
  Panel1.Color:=clGreen; // зеленый
end;

-----

Вы запускаете программу, нажимаете кнопку;      Что же случилось?

Ничего не происходит в течении 3 секунд, затем панель становится зеленой (Green).
    А где же красный (Red) цвет?

Ха-Ха!

Очевидно, что находясь внутри процедуры  Button1Click , вы не перерисовываете форму Form ДО ВЫХОДА ИЗ процедуры.

Во время выполнения процедуры вы не видите ничего изменяющегося на вашей форме, до тех пор , пока не скажете "магические" слова :  Application.ProcessMessages;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.Color:=clRed;
  Application.ProcessMessages; // это перерисовывает вашу форму
  sleep(3000);
  Panel1.Color:=clGreen;
end;

Теперь при нажатии кнопки панель имеет красный цвет в течении 3 секунд, а потом цвет сменяется на зеленый.

Итак, чему же мы научились.Если вы находитесь внутри процедуры и хотите изменить что-то на вашей форме так, чтобы пользователь это увидел, вам надо использовать:   Application.ProcessMessages;

Во всех местах , где вы хотите получить изменение на форме.

Таким образом обеспечивается   "МНОГОЗАДАЧНОСТЬ"  в Delphi.


Другой путь сделать простую МНОГОЗАДАЧНУЮ программу (с таймером):

Для получения многозадачности в  Delphi можно использовать "нити" ( Threads) , однако они немного трудны для понимания; и большинство начинающих программистов могут использовать :

    -Application.ProcessMessages; техника описана выше
    -или Timer (как - я объясню далее)

Компонент Timer имеет свойство INTERVAL (с установкой по умолчанию 1000 (1 sec)), и событие OnTimer которое происходит каждую секунду

Начните с New Application
    - Расположите Panel1 на вашей форме
    - Расположите Timer1 на форме (он выглядит как часы)
    - Сделайте двойной щелчок на событии OnTimer (с правой стороны) в Инспекторе Объектов

и напишите следующий код:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Panel1.Color=clRed then Panel1.Color:=clGreen
  else Panel1.Color:=clRed;
end;

Запустите программу. Панель меняет цвет с красного на зеленый и обратно каждую секунду.


DELPHI ЗАМЕТКИ:

Вы можете не знать этого, но ПОЧТИ ВСЕ в Delphi - это указатели (pointer), однако вы нигде не встретите слово pointer .

Все осуществляется за сценой.

Это - не то, что в C++ или TP с **char @data ^xyz или что-либо подобное.

Delphi - это прекрасно, Delphi is grand.  Слава Господу!

В Delphi даже есть  тип переменной, называемый VARIANT , который может быть всем:
    a char, word, string[3000], real, double, currency, boolean
Он меняется сам в необходимый вам тип.

Например.
    XVar : variant;

Это все верно:
    begin
      XVar:='Frank'; // строка
      XVar:=True; // логическое значение
      XVar:=244.34567; // действительное число
    end;

"Варианты" мы обсудим позже, но я не использую их и не рекомендую это делать.


Change of Topic:

В Delphi используется много имен для обозначения действительных чисел, в зависимости от того, где вы их используете:
    float
    real
    double
    currency
    number
    money
    - и некоторые другие


Мощная техника программирования:

Delphi имеет возможность Вырезания и Вставки Компонентов, Группы компонентов, Форм ...
    Ctrl X CUT
    Ctrl C COPY
    Ctrl V PASTE

Это реально увеличивает скорость написания программ и уменьшает количество ненужной работы.

Поэкспериментируем с Вырезанием и Вставкой и научимся их использовать. Что нужно и что не нужно делать .
Разместите кнопку  Button на форме Form, и скопируйте ее (Ctrl+C,  Ctrl +V)

Также, попытайтесь добавить другой модуль Unit к вашему проекту Project.
    -Project Mgr (on Toolbar)
        - Add
            - Select Folder/File Name
                -Open

Затем свяжите два модуля вместе добавляя:
    в модуль Unit1 (после слова  Implementation)
    uses Unit2;

    в модуль Unit2(после слова  Implementation)
    uses Unit1;

Теперь в модуле  Unit1, вы можете вызвать процедур из модуля  Unit2:
    Form2.Panel1.Color:=clRed;

Что произойдет?

Я "сказал" модулюUnit1 использовать модуль Unit2; почему же я не могу написать так:
    Unit2.Panel1.Color:=clRed;     // НЕПРАВИЛЬНО

ВЫ НЕ МОЖЕТЕ ТАК СДЕЛАТЬ, потому что форма  Form2  - собственник.  ЭТО  Delphi !
    Form2.Panel1.Color:=clRed;     // ПРАВИЛЬНО


Примечание: ЗАМЕТЬТЕ ДЛЯ СЕБЯ

Когда вы добавляете  модуль (например,. Sales.pas) в какой-нибудь свой новый проект, то  Delphi НЕ ДЕЛАЕТ копию Sales.pas.

Delphi хранит путь к оргигинальному модулю Sales.pas и любые изменения, которые вы сделаете в этом модуле Sales.pas изменят оригинал. (Это и есть так называемое Объектно Ориентированное Программирование ( OOP)! )

Как работать с копией модуля Sales.pas , а не с оргигиналом?

Есть 2 пути :
    1)  Когда вы видите модуль Sales.pas в вашем новом проекте выполните следующие действия в Меню:

        -File 
        -Save As
        - Измените директорию и сохраните модуль Sales.pas в директории вашего нового проекта.

     2) Перед началом работы скопируйте файлы Sales.pas and Sales.dfm в директорию вашего нового проекта.


Также, вы можете создать свои собственные компоненты и разместить их на  "Палитре" компонент (Component Palette), без написания даже строчки кода.

Это называется ШАБЛОНЫ КОМПОНЕНТОВ (COMPONENT TEMPLATES)

ЭТО ВЕЛИКОЛЕПНО

Откройте новую форму  Form
Добавьте панель  Panel
Разместите несколько кнопок Buttons на панели Panel
Выделите панель Panel и далее следуйте по пунктам меню (Menu)
    -Component
        -Create Component Template
            - Измените  COMPONENT NAME на P1
                - Нажмите OK!

Посмотрите на "Палитру компонент" ( Component Palette)
У вас есть теперь НОВЫЙ Компонент по имени  P1
Щелкните на  P1 (на  Palette)
Разместите  P1 на форме (Form)
О. Мой Бог, это работает!!!

Информация к размышлению :

Когда вы создаете  Шаблон Компонента (COMPONENT TEMPLATE) , то получаете графическую копию Компонента
        и большую часть Свойств и все События всех Объектов на Шаблоне.
Экспериментируя с использованием Шаблонов Компонент ( Component Templates), наблюдайте как они работают.  Это большой ресурс.

Примечание: Я рекомендую размещать все компоненты на Панели (Panel), а затем делать шаблон Панели.

В любом случае, это хороший путь для собрания Библиотеки Компонент, которую вы можете легко и неоднократно использовать;  это - ваша "палитра" ( Palette).
Позже я создам Проект Delphi с множеством Панелей ( Panels) , который вы можете сохранить как Шаблоны Компонент (COMPONENT TEMPLATES).


КОПИРУЙ ФОРМУ В РЕПОЗИТОРИЙ

Создайте новую форму и разместите на ней кнопки и панели
Щелкните правой кнопкой мыши на форме
    - Выберите ADD TO REPOSITORY
        - Введите TITLE (например TEST1)
            - Нажмите OK

Теперь перейдите к пункту меню:
    -File
        -New
-Forms(Tab)

Среди возможного выбора вы видите TEST1
Сделайте двойной щелчок мышью

УРА!!!

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


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

Для кнопки Button в "Инспекторе объектов" ( ObjectInspector) вы видите 24 свойства. Обычно вы используете или меняете только  4 или  5 их них.  Но  Delphi показывает вам  24. Для начинающих программистов это - небольшой перебор.

После прочтения моих "Уроков" , you should get a feel for the core (or essence or flavor) of Delphi.
Теперь, когда вы смотрите в "Инспектор объектов" , то видите только нужные вам свойства.


Пока это все.

Я надеюсь, что эти заметки помогли вам лучше понять, как использовать мощные ресурсы  Delphi.


Возврат в список переводов
Lesson 2
 Lesson 3
 Lesson 4