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

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

01.08.2011, 20:54. Показов 28324. Ответов 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru