Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/146: Рейтинг темы: голосов - 146, средняя оценка - 4.69
 Аватар для AshBringer4eg
27 / 27 / 4
Регистрация: 25.11.2010
Сообщений: 72

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

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

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

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

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

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

8
 Аватар для SalterOk
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
01.08.2011, 21:40
Цитата Сообщение от AshBringer4eg Посмотреть сообщение
Всем доброго времени суток. Столкнулся с проблемой что при использовании TObject *Sender в своей функции все красиво, но только до тех пор пока не нужно вызвать эту функцию. Я не знаю что этой функции дать на место Sender'a.
Как быть? Если не трудно то на примере вот такой функции.
C++
1
2
3
4
 void func(TObject *Sender)
{
 Form1->Caption = "некий текст";
}
Sender это указатель на объект которому принадлежит сообщение (в каком компоненте произошло событие).
Приведенная выше функция вообще не нуждается в подобном параметре.
Фактическим параметром при вызове функции может быть любой объект класс которого унаследован от TObject - это все VCL-классы.
0
 Аватар для AshBringer4eg
27 / 27 / 4
Регистрация: 25.11.2010
Сообщений: 72
02.08.2011, 13:19  [ТС]
Так вот я же и хочу узнать, как именно мне отследить кто вызвал мою функцию.
0
25 / 25 / 8
Регистрация: 27.10.2009
Сообщений: 81
03.08.2011, 10:35
можешь передавать число в функцию и в свитче определять кто вызвал, ну как вариант...
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
 Аватар для AshBringer4eg
27 / 27 / 4
Регистрация: 25.11.2010
Сообщений: 72
03.08.2011, 16:51  [ТС]
Мда, я сам себе на мягкое место приключений искал... Зачем искать того кто вызвал если можно просто так из функции потыкать палочкой того кто мне нужен. А делается это очень просто... В *.h файле основной формы прописываются все мои unit'ы, и к *.cpp в котором я работаю подключаем главный *.h файл. Вот и все. Фсе фунции могут трогать все методы, всех компонентов
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.08.2011, 14:36
C++
1
2
3
4
 void func(TObject *Obj)
{
 Form1->Caption = Obj->Name;
}
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
05.08.2011, 21:36
Цитата Сообщение от 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
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.08.2011, 00:52
Да неподумал, подразумевал TComponent
0
0 / 0 / 0
Регистрация: 06.03.2014
Сообщений: 13
17.04.2016, 08:53
если вы хотите использовать в функции свойства, которые наследуются от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.04.2016, 08:53
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru