Главная » Программирование » Delphi - проникновение в компонент
Delphi — проникновение в компонент

Delphi — проникновение в компонент

Delphi… Для многих людей это почти культовое слово. Но как часто вам приходила идея, что неплохо было бы вот эту кнопочку «всунуть» в это TEdit? Или один компонент загораживал другой и ничего с этим не сделать? Видимо нужно искать специальный компонент и применять его? Нет! Есть простой способ, по большому счету даже не требующий навыков программирования, позволяющий «вставлять» одни компоненты в другие.

Начинаем эксперимент!

Создаем новый проект из обычной формы, появляющейся по умолчанию. Пусть проект называется: “Project1.dpr”, файл с нашим программным кодом “unit1.pas”, а форма – “Form1” – это имена по умолчанию. В свойстве “Caption” формы напишем “Слияние komponents — 0123 =)”. Заметьте – я специально написал так, чтобы были и кириллические символы, и латинские и цифры. Откомпилируемся с сохранением. А теперь заглянем в файл “unit1.dfm”, который будет находиться в папке с нашим проектом, или просто щелкаем правой кнопкой мыши по форме и выбираем пункт «view as text»

Код формы.

Рис. 1. Посмотреть код формы.

. Что же там? А там описание нашей формы:

object Form1: TForm1
  Left = 467
  Top = 111
  Width = 724
  Height = 499
  Caption = #1057#1083#1080#1103#1085#1080#1077' komponents - 0123 =)'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
end

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

Если изменить какое ни будь дефолтовое значение в инспекторе объектов, то оно появится в описании формы в данном файле. Если изменить какое ни будь значение в файле описания формы – это отобразиться после открытия проекта. Например, заменим строчку

Caption = #1057#1083#1080#1103#1085#1080#1077' komponents - 0123 =)'

на

Caption = 'Junction component'

Откроем проект в Delphi и посмотрим:

Подпись изменилась

Рис. 1. Подпись изменилась

подпись на форме изменилась.

И так, становится понятной главная мысль эксперимента – управляя значениями, записанными в файл “unit1.dfm”, можно управлять формой. А пока продолжим.

Положим на форму обычную кнопку. Я положил вот так:

Рис. 2

Рис. 2

Компилируем и сохраняем проект, смотрим содержимое файла “unit1.dfm”:

object Form1: TForm1
  Left = 648
  Top = 371
  Width = 474
  Height = 371
  Caption = 'Junction component'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
  end
end

Сразу же становится видно, что внутри объекта-формы (object Form1: TForm1) появился еще один объект-кнопка (object Button1: TButton)

Теперь перейдем к практической части. Попытаемся вставить картинку в кнопку. Наша задача сделать так, чтобы на кнопке отображалась небольшая картинка, при наведении на которую курсор изменял бы свой вид. Кроме того, у кнопки и у картинки на кнопке должны быть разные события “onClick”.

Для этого увеличим немного кнопку “Button1”, добавим на форму компонент “TImage”, его имя будет “Image1”. Попробуйте положить компонент “Image1” на кнопку “Button1”. Компонент никак не хочет влезать в кнопку. Более того, картинка все время оказывается под кнопкой. Что же, перестанем мучить кнопку с картинкой и приведем все примерно к такому виду:

Рис. 3.

Рис. 3.

Компилируем и закрываем проект. Открываем файл “unit1.dfm” и видим такую картину:

object Form1: TForm1
  Left = 643
  Top = 238
  Width = 474
  Height = 371
  Caption = 'Junction component'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Image1: TImage
    Left = 16
    Top = 88
    Width = 25
    Height = 25
  end
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 177
    Height = 73
    Caption = 'Button1'
    TabOrder = 0
  end
end

В объекте-форме теперь два объекта: object Button1: TButton и object Image1: Timage. Все что нужно сделать – просто положить картинку внутрь кнопки. Получается так:

object Form1: TForm1
  Left = 643
  Top = 238
  Width = 474
  Height = 371
  Caption = 'Junction component'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 177
    Height = 73
    Caption = 'Button1'
    TabOrder = 0
    object Image1: TImage
      Left = 1
      Top = 1
      Width = 25
      Height = 25
    end
  end
end

Заметьте, что в объекте object Image1: TImage значения Left и Top были изменены на 1. Иначе картинку будет невидно за пределами кнопки. Сохраняем файл “unit1.dfm” и открываем проект в Delphi. Вот что должно было получиться:

Результат слияния компонентов

Рис. 4. Результат слияния компонентов

Картинка не просто на кнопке, она в кнопке. Убедиться в этом можно подвигав мышкой картинку и попытавшись вытащить её на форму.

Через инспектор объектов в Delphi картинке “Image1” свойству “Cursor” выбираем значение например “crHandPoint”. Присваиваем объекту “Image1” картинку. Компилируем, сохраняем, запускаем. Вот что должно получиться:

Рис. 5.

Рис. 5.

Наводим мышь на кнопку – курсор обычный. Наводим на картинку – курсор становится в виде пальчика. Щелкаем по кнопке и …. И тут видим весьма неприятный сюрприз: картинка исчезла с кнопки. Если схватить наше окно за заголовок и задвинуть за край рабочего стола так, чтобы кнопка ушла за пределы видимости, а потом вытащить обратно, то увидим, что картинка опять появилась на кнопке. Очевидно, что после нажатия на кнопку наша картинка не перерисовалась… Что же, красота требует жертв – потребуется в некоторых событиях кнопки заставлять перерисовываться картинку на кнопке.

Кстати, если сейчас открыть файл “unit1.dfm”, то увидим там следующий код:

object Form1: TForm1
  Left = 602
  Top = 166
  Width = 474
  Height = 371
  Caption = 'Junction component'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 177
    Height = 65
    Caption = 'Button1'
    TabOrder = 0
    object Image1: TImage
      Left = 10
      Top = 17
      Width = 31
      Height = 32
      Cursor = crHandPoint
      Picture.Data = {
        055449636F6E0000010001002020100000000000E80200001600000028000000
        2000000040000000010004000000000080020000000000000000000000000000
        0000000000000000000080000080000000808000800000008000800080800000
        80808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000
        FFFFFF0000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000077000000000000000000000000000077F87700000
        00000000000000000007788F8887700000000000000000000779888F88889770
        00000000000000077889888F8888988770000000000000078889888F88889888
        70000000000000078889888F8888988870000000000000078889888F88889888
        70000000000000078889888F8888988870000000000000078889888F88889888
        70000000000000078889888FF8889888700000000000000788898FFFFFF89888
        700000000000000788899FFFFFF9988870000000000000078FFFF99FF99FFFF8
        7000000000000007FFFFFFF99FFFFFFF70000000000000077FFFF99FF99FFFF7
        700000000000000007799FFFFFF99770000000000000000000077FFFFFF77000
        00000000000000000000077FF770000000000000000000000000000770000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFF
        FFF81FFFFFE007FFFF8001FFFE00007FFE00007FFE00007FFE00007FFE00007F
        FE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFF8001FF
        FFE007FFFFF81FFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
        FFFFFFFF}
    end
  end
end

Заметьте, фактически, картинка описана в этом файле.

Открываем проект, и напишем несколько обработчиков.

Обработчик события на кнопке:

procedure TForm1.Button1Click(Sender: TObject);

И Обработчик события на картинке:

procedure TForm1.Image1Click(Sender: TObject);

Для индикации событий я положил на форму два компонента “TStaticText” с именами “StaticText1” и “StaticText2”. Через файл “unit1.dfm” вставил в “StaticText1” его собрата “StaticText2”. Этого можно было бы не делать, но так интереснее. А потом поигрался цветами и шрифтами. Вот что получилось:

Рис. 6.

Рис. 6.

И написал такой код:

procedure TForm1.Button1Click(Sender: TObject);
BEGIN
Form1.StaticText2.Caption := 'Щелк кнопкой';
Form1.Image1.Picture := Form1.Image1.Picture;
END;

procedure TForm1.Image1Click(Sender: TObject);
BEGIN
Form1.StaticText2.Caption := 'Щелк картинкой';
END;

Теперь после отпускания кнопки картинку снова видно. Но её не видно пока кнопка нажата мышкой. Это тоже поправимо – у кнопки много всяких событий.

Скачать готовый проект

delphicomp
delphicomp
project.zip
224.6 KiB
46 Downloads
Детали

Скачивайте, кликайте мышью по кнопкам, картинкам, смотрите реакцию программы.

А после не стесняйтесь задавать вопросы в комментариях!

Метки::

Ваш отзыв