27 / 27 / 4
Регистрация: 25.11.2010
Сообщений: 72
1

Использование TObject *Sender в своих функциях

01.08.2011, 20:54. Показов 26639. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. Столкнулся с проблемой что при использовании TObject *Sender в своей функции все красиво, но только до тех пор пока не нужно вызвать эту функцию. Я не знаю что этой функции дать на место Sender'a.
Как быть? Если не трудно то на примере вот такой функции.
C++
1
2
3
4
 void func(TObject *Sender)
{
 Form1->Caption = "некий текст";
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2011, 20:54
Ответы с готовыми решениями:

Откуда берется FormPaint(TObject *Sender)?
Здравствуйте! Мы только начали изучать графику, и я никак не могу разобраться откуда берется во...

Вызывается 2 раза void __fastcall TForm2::ListBox1Click(TObject *Sender)
Помогите. В чём дело? Функция void __fastcall TForm2::ListBox1Click(TObject *Sender) сробатывает...

Обработка параметром Sender as TObject
Подскажите как отладить код с параметром Sender такого типа : TForm1 = class(TForm) Shape1:...

procedure TForm1.Edit1Change(Sender: TObject);
edit должен увеличиваться ,если в него вводят больше букв,чем он однавременно может отобразить...

8
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
01.08.2011, 21:40 2
Цитата Сообщение от AshBringer4eg Посмотреть сообщение
Всем доброго времени суток. Столкнулся с проблемой что при использовании TObject *Sender в своей функции все красиво, но только до тех пор пока не нужно вызвать эту функцию. Я не знаю что этой функции дать на место Sender'a.
Как быть? Если не трудно то на примере вот такой функции.
C++
1
2
3
4
 void func(TObject *Sender)
{
 Form1->Caption = "некий текст";
}
Sender это указатель на объект которому принадлежит сообщение (в каком компоненте произошло событие).
Приведенная выше функция вообще не нуждается в подобном параметре.
Фактическим параметром при вызове функции может быть любой объект класс которого унаследован от TObject - это все VCL-классы.
0
27 / 27 / 4
Регистрация: 25.11.2010
Сообщений: 72
02.08.2011, 13:19  [ТС] 3
Так вот я же и хочу узнать, как именно мне отследить кто вызвал мою функцию.
0
25 / 25 / 8
Регистрация: 27.10.2009
Сообщений: 81
03.08.2011, 10:35 4
можешь передавать число в функцию и в свитче определять кто вызвал, ну как вариант...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void func(int i)
{
 switch(i)
{
 case 1: 
 ...
 break;
 case 2: 
 ...
 break;
}
 Form1->Caption = "некий текст";
}
0
27 / 27 / 4
Регистрация: 25.11.2010
Сообщений: 72
03.08.2011, 16:51  [ТС] 5
Мда, я сам себе на мягкое место приключений искал... Зачем искать того кто вызвал если можно просто так из функции потыкать палочкой того кто мне нужен. А делается это очень просто... В *.h файле основной формы прописываются все мои unit'ы, и к *.cpp в котором я работаю подключаем главный *.h файл. Вот и все. Фсе фунции могут трогать все методы, всех компонентов
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.08.2011, 14:36 6
C++
1
2
3
4
 void func(TObject *Obj)
{
 Form1->Caption = Obj->Name;
}
0
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
05.08.2011, 21:36 7
Цитата Сообщение от Avazart Посмотреть сообщение
Form1->Caption = Obj->Name;
У класса TObject нет свойства Name. Можно только узнать ClassName()

Рассмотрим случай, когда ты точно знаешь, какого класса объект должен тебе передаваться
C++
1
2
3
4
5
6
7
8
void func(TObject *Obj)
{
      if (Obj->ClassNameIs("TButton")) {
              Form1->Caption = GetPropValue(Obj,"Name",true);
      }
      else 
            throw Exception("Error! Got <" + Obj->ClassName() +" instead of <TButton!>");
}
Рассмотрим случай, когда тебе может передаваться любой компонент,
а ты должен у него получить свойство Name
C++
1
2
3
4
5
6
7
8
9
void func(TObject *Obj)
{
        TComponent *AComponent = dynamic_cast<TComponent *>(Obj);      
        if (AComponent ) {
              Form1->Caption = AComponent->Name;
        }
        else 
            throw Exception("Error! Got <" + Obj->ClassName() +" instead of <TComponent!>");
}
3
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.08.2011, 00:52 8
Да неподумал, подразумевал TComponent
0
0 / 0 / 0
Регистрация: 06.03.2014
Сообщений: 13
17.04.2016, 08:53 9
если вы хотите использовать в функции свойства, которые наследуются от TComponent то нет смысла извращать и передавать параметром TObject. лучше параметром TComponent и отправлять:
C++
1
void func(TComponent *Obj)
это избавит от ошибок приведения типа как допущена выше:
C++
1
Form1->Caption = Obj->Name;
то есть передавать параметром лучше тот класс, который:
1. ближайший к TObject в иерархии классов.
2. содержит в себе все требуемые функции свойства\методы.
например нам нужно создать функцию, которая будет двигать КНОПКУ по форме(я пишу на Delphi. для Builder могу ошибаться с синтаксисом). можно написать такую функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
void SetObjectPosition(TObject *myButton; int X; int Y)
{
  TControl *AControl = dynamic_cast<TControl *>(myButton);
  if (AControl ) 
  {
    AControl->Left = X;
    AControl->Top = Y;
  }
    else 
      throw Exception("Error! Got empty param or <" + Obj->ClassName() +" instead of <TComponent!>");
}
чуть правильнее будет такая:
C++
1
2
3
4
5
6
7
8
9
10
11
void SetButtonPosition(TButton *myButton; int X; int Y)
{
  if (myButton) 
  {
    myButton->Left = X;
    myButton->Top = Y;
  }
    else 
      throw Exception("Error! Got empty param in SetButtonPosition");
}
}
но тут нужна проверка на существование нужных нам свойств у объекта и название не соответствует содержанию(для 1й функции. ошибку во второй опишу позже). поэтому лучше эту функцию переписать так:
C++
1
2
3
4
5
6
7
8
9
10
11
void SetControlPosition(TControl *myControl; int X; int Y)
{
  if (myControl) 
  {
    myControl->Left = X;
    myControl->Top = Y;
  }
    else 
      throw Exception("Error! Got empty param in SetObjectPosition");
}
}
никаких dynamic_cast не нужно делать и если когда-то нам понадобится добавить подобную возможность другим объектам(некнопкам), наша функция останется красивым решением. если бы мы создали нашу функцию с именем SetButtonPosition(требовалось же двигать только кнопку), при добавлении возможности двигать НЕКНОПКИ пришлось бы переименовывать функцию либо писать подобный код:
C++
1
SetButtonPosition(myPanel, 0, 0)
согласитесь выглядит нелепо передавать компонент Panel в функцию с Button в названии.
ПЫ. СЫ имею небольшой опыт промышленного программирования и часто подобные ляпы сбивают с толку
0
17.04.2016, 08:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2016, 08:53
Помогаю со студенческими работами здесь

Procedure TForm1.Button3Click(Sender: TObject);
procedure TForm1.Button3Click(Sender: TObject); begin tab1.cells:=Edit1.text;...

Как создать процедуру RadioButtonClick(Sender: TObject)
общая процедура— RadioButtonClick используется одновременно для RadioButton1, RadioButton2,...

Ошибка в строке procedure Button1Click(Sender: TObject);
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Показывает ошибку в procedure Form2Button1Click(Sender: TObject);
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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