С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
1

Обработчик событий для компонента (TLabel, TButton)

11.12.2012, 23:19. Показов 3103. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет.
Задание создать Design-Time форму, создать Run-Time форму. На дезайн тайм есть какие-то компоненты, например три надписи TLabel. Нужно в Run-Time вывести их на форме ран-тайм и создать обработчики событий для этих кнопок.
В Design-Time по клику удваивался/уменьшался размер. В run-time нужно сделать то же самое.

Как это нужно сделать? Есть наброски.
1) Помогите доработать наброски.
2) Скажите, как сделать проще? Без класса.
Что-то типа
Delphi
1
TmpLabel.OnClick := @ClickEvent;
?

Мой вариант:
Для обработчика событий использую класс.
Delphi
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
36
37
38
39
40
41
42
43
type
  TEvent = procedure(Sender: TObject) of object;
type
  TEventClass = class(TObject)
    private
      SimpleObject: TObject;
      FEvent: TEvent;
      procedure LabelEvent(Sender:TObject);
    public
      IsResized: boolean;
      constructor Create(SimpLabel: TObject);
      destructor Destroy; override;
      property Event: TEvent read FEvent write FEvent;
  end;
 
implementation
   constructor TEventClass.Create(SimpLabel: TObject);
   begin
     if SimpLabel is TLabel then
     begin
       SimpleObject := SimpLabel as TLabel;
       (SimpleObject as TLabel).OnClick := @LabelEvent;
     end;
   end;
 
   destructor TEventClass.Destroy;
   begin
     inherited;
   end;
 
   procedure TEventClass.LabelEvent(Sender: TObject);
   var
     size: integer;
   begin
     size := (SimpleObject as TLabel).Font.Size;
     if (IsResized) then
        (SimpleObject as TLabel).Font.Size := size div 2
     else
        (SimpleObject as TLabel).Font.Size := size * 2;
     (SimpleObject as TLabel).Update;
   end;
 
end.
в класс попадаем, экземпляр класса создаем и т.д. проблема вот в чем.
строка
Delphi
1
(SimpleObject as TLabel).Font.Size := size div 2
вызывает у лазаруса бурную реакцию. такую:
Обработчик событий для компонента (TLabel, TButton)

а дальше такую:
Обработчик событий для компонента (TLabel, TButton)


При чем это связано не только с размером, если менять Capacity-свойство, например, имеем то же самое. Я так понимаю это связано с тем, что класс TEventClass не имеет права трогать свойства TmpLabel. Так? Как сделать так, чтобы имел? Или я вообще не прав? Разъясните пожалуйста как мне поступить.

И по поводу просто одной процедуры объясните, если возможно.

P.S.: аттач почему-то не приклеился. руки видно кривые, пытался вставить его в нужное место, не вставил вообще. не бейте.
P.P.S: заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2012, 23:19
Ответы с готовыми решениями:

Проектирование форм и создание обработчика события для компонентов TEdit, TButton, TBitBtn. Компоненты TLabel, TMemo
Всем привет! Помогите написать код для приложения. Как правило, использование семейного бюджета...

Компонента от TButton
Создана новая компонента (от TButton), которая при нажатии издает звук. Ставлю кнопку которая...

Свойство color компонента TLabel
Что значит это свойство - меняю его, а цвет лэйбла не меняется. Меняется только когда я меняю...

Обработчик событий в Run-Time для формы (TForm)
Привет. Проблемы при создании обработчика событий для формы. Приведу пример. Если создавать...

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32995 / 21301 / 8180
Регистрация: 22.10.2011
Сообщений: 36,595
Записей в блоге: 8
12.12.2012, 02:29 2
VladSharikov, а чего, статический метод класса использовать (чтоб не было необходимости экземпляр класса создавать, он всё одно не нужен, вся работа ж через Sender идёт) - никак нельзя? Смотри:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type
  { TEventClass }
  TEventClass = class
  public
    class procedure myLabelOnClick(Sender : TObject);
  end;
 
implementation
 
{ TEventClass }
class procedure TEventClass.myLabelOnClick(Sender: TObject);
var
  size : Integer;
begin
  with Sender as TLabel do // Работа - через Sender, он не просто так передается...
  begin
    size := Font.Size;
    if Tag = 1 then Font.Size := size div 2
    else Font.Size := size * 2;
 
    Update;
    Tag := 1 - Tag; // В Tag-е будем хранить признак "изменялся/не изменялся"
  end;
end;
и всё. Назначать обработчик:
Delphi
1
2
3
4
5
  L := TLabel.Create(MyForm);
  // ... тут назначаются остальные свойства, родитель, положение на форме, Font.Size ...
 
  with TEventClass do 
    L.OnClick := @myLabelOnClick; // Вот так
1
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
12.12.2012, 16:04  [ТС] 3
Вот только вчера читал статью какого-то дядьки - у него был такой же способ организации обработчика событий, но я не смог нормально все описать.
Хорошо, сейчас попробую.

Добавлено через 33 минуты
уиии
все получилось, неделю бился
спасибо.
0
12.12.2012, 16:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2012, 16:04
Помогаю со студенческими работами здесь

Напишите обработчик события OnClick для компонента Button
Ну в общем нужно создать несколько приложений, вроде бы не трудно, но у меня не получается ((( я в...

Обработчик события OnMouseMove для компонента Memo, с выводом сообщения "Курсор находится над объектом"
Конечно это перебор, но не могли вы помочь с этими мелкими программками))) 1. В компоненте...

Если можно создать массив TButton, то как создать массив их событий?
Пишу программу в которой много однообразных Едитов и кнопок. Чтобы "облегчить сбе жизнь" создал...

При добавлении компонента к примеру кнопки. В коде Button1: TButton; выдает ошибку что TButton не известно.
Прошу у вас помощи. Rad Studio XE 3 выдает глупую ошибку. При добавлении компонента к примеру...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru