Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/83: Рейтинг темы: голосов - 83, средняя оценка - 4.93
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1

Cannot find implementation of method Button1Click

27.04.2011, 13:21. Показов 18452. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Эта ошибка появляется тогда, когда пытаюсь перейти к обработчику события OnClick через инспектор объектов. Сама программа при этом запускается без ошибок.

Дело в том, что обработку события OnClick перенес в другой cpp-файл.
Есть ли выход в такой ситуации?

P.S. кнопку и обработку OnClick взял для примера, в реальности в другом cpp находится около 10 обработчиков.
Прошу отвечать конкретно по этой проблеме.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.04.2011, 13:21
Ответы с готовыми решениями:

Ошибка: Cannot find implementation of method
procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=0 to Form1.ComponentCount-1 do begin if...

Ошибка "Cannot find implementation of method DataSource1.DataChange"
Здравствуйте. Столкнулся с такой проблемой: при кампиляции проекта выдаётся ошибка и выделяется строка procedure...

Error: cannot find symbol method
Почему-то ругается на вот эту строчку drawer.addDrawerListener(toggle); И выдает такую ошибку error: cannot find symbol method...

11
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
27.04.2011, 13:45
Скорее всего, потому что, нет объявления функции в заголовочном файле, которому принадлежит данная кнопка
(выход - вручную переходить а не через инспектор)
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
27.04.2011, 13:49  [ТС]
Gremlin
В Unit1.h есть объявление. Прикрепил сам проект.
Не удобно вручную переходить
Вложения
Тип файла: rar проблемка.rar (11.4 Кб, 87 просмотров)
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
27.04.2011, 14:14
интересный подход, правда не понял зачем так мучатся, ну да ладно...
инспектор ищет эту функцию в файле где описан класс с его функциями, а это только 2 файла
"Unit1.h и cpp соответственно", а "File1.cpp" отдельный файл, он как бы... чужой получается

(потому что создано событие было Инспектором в Unit1cpp, а вы его перенесли, инспектор уверен что событие должно быть описано в Unit1cpp а там - болт, тот же вариант будет, если создать обработчик например для Buton2 и удалить функцию из цпп файла)
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
27.04.2011, 14:22  [ТС]
Подход нужен этот для того, чтобы обработчики не мешались в Unit1.cpp, а находились в другом cpp.
В первом юните у меня объявлены главные обработчики, а во втором второстепенные.
Заставить бы как-нибудь этот инспектор объектов искать обработчики в других cpp файлах...
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
28.04.2011, 00:07
Тебе надо очень внимательно разобраться, что такое заголовочный файл, что такое класс вообще, что такое свойство __published в системе RTTI.

Так, чтобы вызвать у тебя интерес, во всём этом разобраться приведу след. пример, как можно хранить обработчики событий в совершенно другом файле.

C++
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
//MyEvents.h
#ifndef EVENTS_HPP
#define EVENTS_HPP
#include <Classes.hpp>
// ---------------------------------------------------------------------------
namespace  MyEvents {
       void __fastcall GlobalNotify(void* This, TObject *Sender);
}
// ---------------------------------------------------------------------------
#endif       // EVENTS_HPP
 
// MyEvents.cpp
#include <vcl.h>
#pragma hdrstop
 
#include "MyEvents.h"
 // ---------------------------------------------------------------------------
 #pragma package(smart_init)
 
// ---------------------------------------------------------------------------
namespace  MyEvents {
    void __fastcall GlobalNotify(void* This, TObject *Sender) {
        TComponent *ClickedComponent = dynamic_cast<TComponent *>(Sender);
        if (ClickedComponent) {
            ShowMessage("<" + ClickedComponent->Name + "> was clicked!");
        }
    }
}
 
// Unit1.h
class TForm1 : public TForm {
__published: // IDE-managed Components
 
    TButton *Button1;
    TButton *Button2;
    TButton *Button3;
    TButton *Button4;
    TButton *Button5;
 
    void __fastcall FormCreate(TObject *Sender);
 
private: // User declarations
 
public: // User declarations
    __fastcall TForm1(TComponent* Owner);
};
 
// Unit1.cpp
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "MyEvents.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}
 
// ---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender) {
    TMethod method;
    method.Data = this;
    method.Code = &MyEvents::GlobalNotify;
    SetMethodProp(Button1, "OnClick", method);
    SetMethodProp(Button2, "OnClick", method);
    SetMethodProp(Button3, "OnClick", method);
    SetMethodProp(Button4, "OnClick", method);
    SetMethodProp(Button5, "OnClick", method);
}
// ---------------------------------------------------------------------------
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
28.04.2011, 07:50  [ТС]
Maluda Попробовал этот способ, но это не то. Мне нужно, как я уже писал, переходить через инспектор объектов к обработчику, находящемуся в другом файле.
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
28.04.2011, 11:59
Ещё раз объясняю: есть система RTTI, есть базовый класс TObject,
все объекты, которые являются дочерними от этого класса, могут иметь __published свойства.
Когда ты в инспекторе клацаешь на объект - форма, кнопка, таймер и т.д.,
он получает список всех опубликованных свойств этого объекта. Эти опубликованные свойства есть не что иное, как члены класса.
Теперь дальше, эти опубликованные свойства могут быть разных типов: INTEGER, CLASS, METHOD и т.д.
Все опубликованные свойства-МЕТОДЫ элементов класса при создании автоматом (когда ты два раза клацаешь на свойство-метод и появляется тело функции) должны размещаться в теле КЛАССА-ВЛАДЕЛЬЦА КОМПОНЕНТА.
То есть клацая на кнопку BUTTON1, инспектор определяет, что её OWNER - FORM1,
когда ты выбираешь свойство OnClick, инспектор получает список всех TNotifyEvent методов класса Form1 и предлагает тебе выбрать один из них (выпадающий список) или формирует персональный метод, но он ВСЕГДА БУДЕТ В ТЕЛЕ КЛАССА-ВЛАДЕЛЬЦА.
То есть ты можешь на кнопку Button1 повесить обработчик OnEnter другого компонента, главное,
чтобы это объявление находилось в классе-владельце.
Но если ты хочешь, чтобы описания функций хранились в другом файле, тогда назначение только программно, так как инспектор объектов ничего не знает о твоём подключаемом файле с прототипами функций.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
28.04.2011, 12:54  [ТС]
Maluda Не надо меня учить Мне нужно только решение моей проблемы.
Есть минимальный проект с решением этой проблемы?
Догадываюсь, что решения этой проблемы нету, но в это не верится, т.к. компилятор без проблем находится эти обработчики, а в режиме дизайна не может найти.
Ведь это же серьезный недостаток билдера. Не пойму, как это не предусмотрели.
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
28.04.2011, 14:19
Не путай инспектор и компилятор.
Компилятору надо единоразово собрать и забыть,
а инспектору надо постоянно отслеживать за названием метода, за тем, у кого этот метод указан
в свойствах.
Представь, что тело ты разместил в каком-то другом файле.
В инспекторе ты поменял название, а у тебя в проекте 100 файлов,
(ему надо каждый раз пропарсить все эти файлы, найти тело функции и изменить название).
Бедняга Билдер и так тормозит так, что в нём, когда большой проект невозможно работать,
а если ещё и это будет - вообще ляжет.

Выход здесь один - ждать, когда VisualAssist для Билдера сделают
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
28.04.2011, 15:29  [ТС]
Хотя бы предусмотрели возможность указать каким-то образом билдеру, чтобы помимо главного юнита искал в другом указанном файле...
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
29.04.2011, 16:46
Оказывается можно находить тело функции и в другом файле. Единственное, это надо делать в Class Explorer. Я работаю в CBuilder 2010 и не знаю, есть ли он в пред.версиях.
В общем, в 2010 это делается так:
- жмёшь Ctrl + '-'
- находишь свой класс, где функция объявлена, она появляется в TreeView слева,
два раза щёлкаешь на неё и автоматом переход в этот файл, и в эту функцию

-можно найти там по поиску названия этой функции

Если честно, до этого сам не знал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2011, 16:46
Помогаю со студенческими работами здесь

Recordset method Find. Поиск по нескольким условиям
Привет, All! Опять я с проблемой, не получается без нее приходить... Кто использовал метод Find объекта Recordset? Вопрос может и...

Graphics.SetClip Method (GraphicsPath) и Graphics.Clear Method vs Graphics.FillPath Method (System.Drawing)
У нас два способа залить форму: 1. Graphics.SetClip Method (GraphicsPath) and Graphics.Clear 2. Graphics.FillPath Method...

Ошибка "Could not find source location to add method <...> "END." or INITIALIZATION not found in unit source"
Помогите пожалуйста какого значение ошибки Could not find source location to add method Button3.Click. &quot;END.&quot; or INITIALIZATION...

Cannot convert method group 'to_get' to non-delegate type 'int'. Did you intend to invoke the method?
При обращении в методе объекта к методу объекта другого класса, вываливается такая ошибка. Причём код всёравно работает без косяков ...

[Warning] Unit1.pas(57): Method 'WndProc' hides virtual method of base type 'TCustomForm'
Как исправить procedure WndProc (var Msg: TMsg; var Handled:boolean); чтобы не было предупреждения Unit1.pas(57): Method 'WndProc' hides...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru