powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / TObject->MethodAddress
3 сообщений из 3, страница 1 из 1
TObject->MethodAddress
    #33551224
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Пишу на C++Builder.
Проблема такая:
У меня есть TPageControl на главной форме. Есть несколько классов, производных от TFrame.
При определеных действиях я создаю новую TTabbSheet в PageControl, создаю TMyFrame1(или TMyFrame2, или TMyFrame3, ...) присавиваю этот класс указателю на TFrame и помещаю этот объект на вновь созданную закладку.

Т.е. на закладке у меня хранится указатель, типа TFrame, на мой какой-то фрейм. Точной тип неизвестен.

Далее, мне надо вызывать методы именно моего фрейма используя указатель на TFrame, который есть на закладке.

Я пытался сделать вставить свой чисто (без реализации методов) абстрактный класс между TFrame и TMyFrame1 (TMyFrame2, ...), соответственно в TTabSheet сохраняя указатель на тип абстрактного класса, делал так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
//Объявлял чисто абстрактный класс
class TAbsFrame : public TFrame {
  public:
    virtual void f1(void)= 0 ;
    TAbsFrame(TComponent* Owner) : TFrame(Owner) {};
};

//Далее указывал, что мои фреймы наследуются от TAbsFrame
class TMyFrame : public TAbsFrame 
{
     int a= 5 ;
...
     //И в теле преопределял функцию
     void f1(void) {a= 5 ;}
}

Благодаря полиморфизму такой подход работал, но появилась проблема с
самим Builder. Он начал записывать в .dfm файл (файл настроек фрема),
свойства, которые совершенно не относились к классу TFrame.
Например свойство OldCreateOrder, которое было обнаружено в классе
TCustomForm (даже не в TCustomFrame!!!).. Так и не поняв причину такого
поведения, стал искать другой подход к решению данной задачи.
Вспомнив механизм отражения Java, который отлично работает, решил
использовать его и в Builder - т.е. воспользоваться методом MethodAddress
класса TObject, благо он является предком для всех фреймов.
Объявил в своих фреймах нужнуб мне функцию с ключевым словом
__published:
Естественно получил адреса этих методов и смог даже вызвать их!!
Но появилась другая проблема. Когда функция была пустая (содержала
только к примеру ShowMessage("Функция f1() работает")), она прекрасно
отрабатывалась, как только я поместил туда код с оператором new
сразу стало возникать непонятное исключение о записи по какому-то там адресу. Тоже не совсем понятно почему.
Вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//Объявление нужной мне функции
__published:
        void f1();

...

//Получение указателя на функцию и выполнение ее:
    //Указатель на функцию
    void __fastcall (*f)();
    //Собственно получения адреса метода
    f=(void __fastcall (*)())ts->Components[ 0 ]->MethodAddress("f1");
    if(f!=NULL) f();

Если кто-нибудь знает в чем ошибки обоих методов, подскажите, пожалуйста.
С уважением Vector.
...
Рейтинг: 0 / 0
TObject->MethodAddress
    #33551427
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а че кросспостишь-то ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
TObject->MethodAddress
    #33551867
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.sql.ru/forum/actualthread.aspx?tid=263550
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / TObject->MethodAddress
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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