powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с типом дынных C++ Builder
7 сообщений из 7, страница 1 из 1
Помогите с типом дынных C++ Builder
    #38458693
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необходимо создать массив для хранения функция

static TObject fun[] = {CheckBoxClick}; так не работает, где CheckBoxClick - это
void __fastcall CheckBoxClick(TObject *Sender); - это событие OnClick контрола TCheckBox

функция CheckBoxClick в классе

void __fastcall TMain::CheckBoxClick(TObject *Sender)
{

}
...
Рейтинг: 0 / 0
Помогите с типом дынных C++ Builder
    #38458708
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323массив для хранения функцияА по-русски?
...
Рейтинг: 0 / 0
Помогите с типом дынных C++ Builder
    #38458714
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftgera3323массив для хранения функцияА по-русски?

Массив для хранения адресов функций.

Код: plaintext
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.
/*Функция для создания флажков на разных панелях */
void TMain::create_leaf_selection(AnsiString name, int &position, EList where)
{


       static AnsiString   Prefix[] = {"D","T","S"};
       static TWinControl *Parent[] = {PanelListDisciplines, PanelTopicsList, PanelListQuestions};
       static TCheckBox  **Boxes[]  = {FunctionDisciplines,  FunctionTheme,   FunctionTests};
       
   /*Адреса функций. тип данных я не знаю какой, написал TObject */

       static TObject        fun[]    = {CheckBoxClick};



           Boxes[where][position]          = new TCheckBox(Main);
           Boxes[where][position]->Parent  = Parent[where];
           Boxes[where][position]->Top     = indent_top + position*30;
           Boxes[where][position]->Left    = indent_left - 20;
           Boxes[where][position]->Name    = Prefix[where]+name;
           Boxes[where][position]->Width   = 15;

/*Вот сюда должны подставляться адреса функций */
           Boxes[where][position]->OnClick = fun[where]; 


}
...
Рейтинг: 0 / 0
Помогите с типом дынных C++ Builder
    #38458719
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323miksoftпропущено...
А по-русски?

Массив для хранения адресов функций.Если функции одного типа, то этот тип и указывать, например, TNotifyEvent .
...
Рейтинг: 0 / 0
Помогите с типом дынных C++ Builder
    #38458721
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323Массив для хранения адресов функций.
Не путай функции (для которых тип, например, void(*)()) и методы классов. В твоём случае
это будет массив Classes::TNotifyEvent.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с типом дынных C++ Builder
    #38458728
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНе путай функции (для которых тип, например, void(*)()) и методы классов. В твоём случае
это будет массив Classes::TNotifyEvent.


Спасибо.
...
Рейтинг: 0 / 0
Помогите с типом дынных C++ Builder
    #38458742
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно будет интересен пример, в котором используется TNotifyEvent
Сначала класс TDebugInterceptor находит, запоминает и подменяет OnClick компонента на свой обработчик - HookOnClick
Далее в процессе работы HookOnClick находит адрес оригинального обработчика клика - по имени из заранее созданного списка MethodNamesList, и вызывает его.
Все это написано для глубокого логирования вызовов функций - обработчиков событий.

Код: plaintext
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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
void __fastcall  TDebugInterceptor::HookOnClick(TObject *Sender)
{
TCursor last_cursor=Screen->Cursor;
Screen->Cursor=crHourGlass;
bool LastEnableButton;
 
 static         HookOnClickCounter = 0;
                HookOnClickCounter++;
 TNotifyEvent   clc;
 TMethod        Method;
  String        SenderInfo="";
  String        FullObjectName=String(((TComponent*)Sender)->Owner->ClassName())+"::"+((TComponent*)Sender)->Owner->Name+"::"+String(Sender->ClassName())+"::"+((TComponent*)Sender)->Name;
  String        FuncName=MethodNamesList->Values[FullObjectName];
  String        FieldType="";
 
 if(IsPublishedProp(Sender, "Caption"))
                        {
                        SenderInfo=GetStrProp(Sender, "Caption");
                        FieldType="Caption";
                        }
 if(IsPublishedProp(Sender, "Text"))
                        {
                        SenderInfo=SenderInfo+" "+GetStrProp(Sender, "Text");
                        FieldType="Text";
                        }
if(IsPublishedProp(Sender, "Enabled") && String(Sender->ClassName()).Pos("Button")>0)
                        {
                        LastEnableButton=((TWinControl*)Sender)->Enabled;
                        ((TWinControl*)Sender)->Enabled=false;
                        }
 
 
void * AddrProc  = ((TComponent*)Sender)->Owner->MethodAddress(FuncName);
 
 
dbg_fields_dbg
Log_fields[di_obj_name]=((TComponent*)Sender)->Name;
Log_fields[di_obj_class]=String(Sender->ClassName());
Log_fields[di_owner_name]=((TComponent*)Sender)->Owner->Name;
Log_fields[di_owner_class]=((TComponent*)Sender)->Owner->ClassName();
Log_fields[di_obj_field_type]= FieldType;
Log_fields[di_obj_field_value]=SenderInfo;
Log_fields[di_event_counter]=IntToStr(HookOnClickCounter);
Log_fields[di_event_name]="Start";
Log_fields[di_func_name]=FuncName;
WriteLog(Log_fields);
 
   if (AddrProc !=NULL)
        {
                        Method.Code=AddrProc;
                        Method.Data=((TForm*)((TComponent*)Sender)->Owner);
                        clc= *(TNotifyEvent*)&Method;
                try{
                   clc(Sender);
                   }catch(Exception &exception)
                   {
                   Screen->Cursor=last_cursor;
                   if(IsPublishedProp(Sender, "Enabled")&& String(Sender->ClassName()).Pos("Button")>0) { ((TWinControl*)Sender)->Enabled=LastEnableButton; }
 
                   Log_fields[di_event_name]="End_ERROR";
                   Log_fields[di_info]=exception.Message;
                   WriteLog(Log_fields);
                   throw Exception(exception) ;
                   }
        }
        else
        {
        Screen->Cursor=last_cursor;
        if(IsPublishedProp(Sender, "Enabled")&& String(Sender->ClassName()).Pos("Button")>0) { ((TWinControl*)Sender)->Enabled=LastEnableButton; }
 
        Log_fields[di_event_name]="End_NOT_FOUND_METHOD";
        WriteLog(Log_fields);
 
        return;
        }
 
        Screen->Cursor=last_cursor;
        if(IsPublishedProp(Sender, "Enabled")&& String(Sender->ClassName()).Pos("Button")>0) { ((TWinControl*)Sender)->Enabled=LastEnableButton; }
 
        Log_fields[di_event_name]="End_OK";
        WriteLog(Log_fields);
}


Еще с того же сайта можно скачать пример работы с плагинами, самое интересное в PluginObject.h
Там все тоже очень динамично с адресами функций, в том числе и при загрузке их из dll.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с типом дынных C++ Builder
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]