Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
6 / 6 / 0
Регистрация: 22.02.2010
Сообщений: 67

трудности с собственным компонентом

27.05.2011, 22:58. Показов 2230. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, господа хорошие программисты!
Возникло у меня затруднение при написании собственного компонента (RAD Studio 2010 C++Builder). Объявляю компонент так:
файл Person.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef PersonH
#define PersonH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
#define PANEL_HEIGHT 10
class PACKAGE TCustomPanel1 : public TCustomPanel
{
private:
protected:
public:
  TImage *Foto;
  TPanel *LeftSpouse;
  __fastcall TCustomPanel1(TComponent* Owner);
__published:
};
//---------------------------------------------------------------------------
#endif
файл Person.cpp
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Person.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
static inline void ValidCtrCheck(TCustomPanel1 *)
{
  new TCustomPanel1(NULL);
}
//---------------------------------------------------------------------------
__fastcall TCustomPanel1::TCustomPanel1(TComponent* Owner)
  : TCustomPanel(Owner)
{
  Foto = new TImage(NULL);
  Foto->Parent = this;
  Foto->Picture->LoadFromFile("C:\\Abort.bmp");
  Foto->Height = this->Height;
  Foto->Width = this->Height;
  Foto->Left = PANEL_HEIGHT;
  Foto->Stretch = true;
  Foto->Top = 0;
 
  LeftSpouse = new TPanel((TComponent*)NULL);
  LeftSpouse->Left = 0;
  LeftSpouse->Top  = 10;
  LeftSpouse->Height = PANEL_HEIGHT;
  LeftSpouse->Width = PANEL_HEIGHT;
  LeftSpouse->ParentColor = false;
  LeftSpouse->Color = clRed;
  LeftSpouse->Parent = this;
  LeftSpouse->Update();
  this->Update();
}
//---------------------------------------------------------------------------
namespace Person
{
  void __fastcall PACKAGE Register()
  {
     TComponentClass classes[1] = {__classid(TCustomPanel1)};
     RegisterComponents(L"MyComponents", classes, 0);
  }
}
//---------------------------------------------------------------------------
Т.е. компонент представляет собой панель, на которой лежат еще одна панель TPanel и изображение TImage. Проблема вот в чем: ни приведенный конструктор, ни установка в программе (CustomPanel11->LeftSpouse->Color = clRed) не меняют цвет дочерней панели LeftSpouse, если панель создается динамически. Т.е. в отладчике видно, что значение цвета изменилось, а на экране никаких изменений. Если же разместить компонент в desine time, то срабатывает только конструктор, программно цвет опять таки не меняется. Это очень меня озадачило, т.к. с изображением TImage из программы можно сделать все, что угодно. Подскажите, где грабли?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2011, 22:58
Ответы с готовыми решениями:

Создание БД с собственным интерфейсом
Всем добрый день. Я учусь на странной айти-специальности (ранее с подобными вещами не имел дел). И суть моей диссертации - создание БД, но...

Сортировка с собственным компаратором
class Comprasion def self.compare(a, b) c1 = findMaxSub(a) c2 = findMaxSub(b) c1 &lt;=&gt; c2 end def...

Что делать с собственным непостоянством?
Как быть. вот я такой вот человек . У меня была любимая девушка я ее любил больше всех на свете, потом разлюбил и бросил. Теперь история...

14
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
28.05.2011, 02:30
Цитата Сообщение от m_kostik Посмотреть сообщение
Подскажите, где грабли?
LeftSpouse->ParentBackground = false;

Зачем ты это делаешь?
Цитата Сообщение от m_kostik Посмотреть сообщение
(TComponent*)NULL
Есть ряд замечаний, вот, набросал код для сравнения

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
//---------------------------------------------------------------------------
 
#ifndef FotoPanelPackageH
#define FotoPanelPackageH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
#define FOTO_PANEL_DEF_WIDTH        50
#define FOTO_PANEL_DEF_COLOR        15780518
//---------------------------------------------------------------------------
class PACKAGE TFotoPanel : public TPanel
{
private:
    // for internal use only
    TImage *fpFotoImage;
    TPanel *fpPanel;
    // image property get and set methods
    void __fastcall SetFotoFileName(AnsiString val);
    AnsiString FFotoFileName;
    void __fastcall SetImageWidth(int val);
    int FImageWidth;
    // panel property get and set methods
    void __fastcall SetPanelColor(TColor val);
    TColor FPanelColor;
    void __fastcall SetPanelCaption(AnsiString val);
    AnsiString FPanelCaption;
protected:
    /* for descedants */
public:
 
    __fastcall TFotoPanel(TComponent* Owner);
    __fastcall ~TFotoPanel();
 
__published:
    // image properties
    __property AnsiString FotoFileName = {read=FFotoFileName, write=SetFotoFileName};
    __property int ImageWidth = {read=FImageWidth, write=SetImageWidth, default=FOTO_PANEL_DEF_WIDTH};
    // panel properties
    __property AnsiString PanelCaption = {read=FPanelCaption, write=SetPanelCaption};
    __property TColor PanelColor = {read=FPanelColor, write=SetPanelColor,default=FOTO_PANEL_DEF_COLOR}; /* clSkyBlue */
};
//---------------------------------------------------------------------------
#endif
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// ---------------------------------------------------------------------------
 
#include <vcl.h>
 
#pragma hdrstop
 
#include "FotoPanelPackage.h"
#pragma package(smart_init)
// ---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
 
static inline void ValidCtrCheck(TFotoPanel *) {
    new TFotoPanel(NULL);
}
 
// ---------------------------------------------------------------------------
__fastcall TFotoPanel::TFotoPanel(TComponent* Owner) : TPanel(Owner) {
    // fill default data
    FImageWidth = FOTO_PANEL_DEF_WIDTH;
    FPanelColor = FOTO_PANEL_DEF_COLOR;
    // switch off own panel's caption
    this->ShowCaption = false;
    // create image at left part of the own panel
    fpFotoImage = new TImage(this);
    fpFotoImage->Parent = this;
    fpFotoImage->Align = alLeft;
    fpFotoImage->AlignWithMargins = true;
    fpFotoImage->Stretch = true;
    fpFotoImage->Width = FImageWidth;
    // create subpanel as client
    fpPanel = new TPanel(this);
    fpPanel->Parent = this;
    fpPanel->Align = alClient;
    fpPanel->AlignWithMargins = true;
    fpPanel->Color = FPanelColor;
    fpPanel->Caption = FPanelCaption;
    fpPanel->ParentColor = false;
    fpPanel->ParentBackground = false;
}
 
// ---------------------------------------------------------------------------
__fastcall TFotoPanel::~TFotoPanel() {
    if (fpFotoImage) {
        delete fpFotoImage;
    }
    if (fpPanel) {
        delete fpPanel;
    }
}
 
// ---------------------------------------------------------------------------
namespace Fotopanelpackage {
    void __fastcall PACKAGE Register() {
        TComponentClass classes[1] = {__classid(TFotoPanel)};
        RegisterComponents(L"Samples", classes, 0);
    }
}
 
// ---------------------------------------------------------------------------
void __fastcall TFotoPanel::SetFotoFileName(AnsiString val) {
    if (FileExists(val)) {
        try {
            fpFotoImage->Picture->LoadFromFile(val);
                        FFotoFileName = val;   
        }
        catch (...) {
            throw Exception("Can not load image from <" + val + ">!");
        }
    }
    else
        throw Exception("<" + val + "> does not exist!");
}
 
// ---------------------------------------------------------------------------
void __fastcall TFotoPanel::SetPanelColor(TColor val) {
    FPanelColor = val;
    fpPanel->Color = FPanelColor;
}
 
// ---------------------------------------------------------------------------
 
void __fastcall TFotoPanel::SetImageWidth(int val) {
    FImageWidth = val;
    fpFotoImage->Width = FImageWidth;
}
 
// ---------------------------------------------------------------------------
void __fastcall TFotoPanel::SetPanelCaption(AnsiString val) {
    FPanelCaption = val;
    fpPanel->Caption = val;
}
 
// ---------------------------------------------------------------------------
2
6 / 6 / 0
Регистрация: 22.02.2010
Сообщений: 67
28.05.2011, 14:52  [ТС]
Спасибо, в самую точку! Особое спасибо за красивый грамотный пример
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.05.2011, 00:21
Хороший пример мне тоже пригодился, спасибо.
Может кто знает как создавать свойства так что бы они корректно работали при задании через инспектор объектов как в изначальных свойствах копонентов?
Например как сделать так что бы можно было задавать путь(в новом свойстве) к картинке в инспекторе объектов через окно Picture Editor как свойстве Picture компонента Image при нажатии на "...".

Дайте пожайлуста ссылку или примерчик.
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
29.05.2011, 00:58
Цитата Сообщение от Avazart Посмотреть сообщение
как сделать так что бы можно было задавать путь(в новом свойстве) к картинке в инспекторе объектов через окно Picture Editor как свойстве Picture компонента Image при нажатии на "...".
Используя мой пример:

добавьте в .h
C++
1
2
3
4
5
 // добавить в раздел private
    void __fastcall SetImagePicture(TPicture * val);
    TPicture * __fastcall GetImagePicture();
// добавить в раздел __published:
    __property TPicture * ImagePicture = {read=GetImagePicture, write=SetImagePicture};
в .cpp
C++
1
2
3
4
5
6
7
8
9
// ---------------------------------------------------------------------------
void __fastcall TFotoPanel::SetImagePicture(TPicture * val) {
    fpFotoImage->Picture->Assign(val);
}
 
// ---------------------------------------------------------------------------
TPicture * __fastcall TFotoPanel::GetImagePicture() {
    return fpFotoImage->Picture;
}
Картинка будет выбираться как в TImage через Picture Editor
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.05.2011, 22:03
Спасибо за подробный пример, все как обычно в упор просто.

Я столкнулся еще с одной проблемой: как сделать свойсво ImageIndex c указанием на ImageList так что бы в свойстве выпадал список изображений и соответствующий индекс.
Так же заметил что при задании свойств через инспектор изменения в компоненте возникают только после нажетия Enter в поле ввода, в отличии от обычных свойств.
Есть ли возможность перерисовывать (заливку канвы) Image при изменении его размера во время проектирования?

Добавлено через 18 часов 18 минут
Можно ли в данном примере передать событие OnClick от динамического компонента Image(fpFotoImage) передать нашему компоненту Panel (TFotoPanel)?
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
29.05.2011, 22:37
Добавил поддержку TImageList и добавил событие OnFotoClick

.h
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
//---------------------------------------------------------------------------
 
#ifndef FotoPanelPackageH
#define FotoPanelPackageH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
#define FOTO_PANEL_DEF_WIDTH        50
#define FOTO_PANEL_DEF_COLOR        15780518
//---------------------------------------------------------------------------
class PACKAGE TFotoPanel : public TPanel
{
private:
    // for internal use only
    TImage *fpFotoImage;
    TPanel *fpPanel;
    // image property get and set methods
    void __fastcall SetFotoFileName(AnsiString val);
    AnsiString FFotoFileName;
    void __fastcall SetImageWidth(int val);
    int FImageWidth;
    // panel property get and set methods
    void __fastcall SetPanelColor(TColor val);
    TColor FPanelColor;
    void __fastcall SetPanelCaption(AnsiString val);
    AnsiString FPanelCaption;
    void __fastcall SetImagePicture(TPicture * val);
    TPicture * __fastcall GetImagePicture();
    void __fastcall SetImageIndex(Imglist::TImageIndex val);
    Imglist::TImageIndex FImageIndex;
    void __fastcall SetImages(Imglist::TCustomImageList* val);
    Imglist::TCustomImageList* FImages;
    // notify private methods
    void __fastcall FOnFotoPanelRealClick(System::TObject *Sender); /* real method of TImage*/
 
    void __fastcall SetOnFotoClick(TNotifyEvent val);
    TNotifyEvent FOnFotoClick;
 
protected:
    /* for descedants */
public:
 
    __fastcall TFotoPanel(TComponent* Owner);
    __fastcall ~TFotoPanel();
 
__published:
    // image properties
    __property TPicture * ImagePicture = {read=GetImagePicture, write=SetImagePicture};
    __property Imglist::TCustomImageList* Images = {read=FImages, write=SetImages};
    __property Imglist::TImageIndex ImageIndex = {read=FImageIndex, write=SetImageIndex, default=-1};
    __property AnsiString FotoFileName = {read=FFotoFileName, write=SetFotoFileName};
    __property int ImageWidth = {read=FImageWidth, write=SetImageWidth, default=FOTO_PANEL_DEF_WIDTH};
    // panel properties
    __property AnsiString PanelCaption = {read=FPanelCaption, write=SetPanelCaption};
    __property TColor PanelColor = {read=FPanelColor, write=SetPanelColor,default=FOTO_PANEL_DEF_COLOR}; /* clSkyBlue */
    // notify events
    __property TNotifyEvent OnFotoClick = {read=FOnFotoClick, write=SetOnFotoClick};
};
//---------------------------------------------------------------------------
#endif
.cpp
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// ---------------------------------------------------------------------------
 
#include <vcl.h>
 
#pragma hdrstop
 
#include "FotoPanelPackage.h"
#pragma package(smart_init)
// ---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
 
static inline void ValidCtrCheck(TFotoPanel *) {
    new TFotoPanel(NULL);
}
 
// ---------------------------------------------------------------------------
__fastcall TFotoPanel::TFotoPanel(TComponent* Owner) : TPanel(Owner) {
    // fill default data
    FImageWidth = FOTO_PANEL_DEF_WIDTH;
    FPanelColor = FOTO_PANEL_DEF_COLOR;
    FImageIndex = -1;
    FOnFotoClick = NULL;
    FImages = NULL;
    // switch off own panel's caption
    this->ShowCaption = false;
    // create image at left part of the own panel
    fpFotoImage = new TImage(this);
    fpFotoImage->Parent = this;
    fpFotoImage->Align = alLeft;
    fpFotoImage->AlignWithMargins = true;
    fpFotoImage->Stretch = true;
    fpFotoImage->Width = FImageWidth;
    fpFotoImage->OnClick = &FOnFotoPanelRealClick; /* assign our TNotifyEvent */
    // create subpanel as client
    fpPanel = new TPanel(this);
    fpPanel->Parent = this;
    fpPanel->Align = alClient;
    fpPanel->AlignWithMargins = true;
    fpPanel->Color = FPanelColor;
    fpPanel->Caption = FPanelCaption;
    fpPanel->ParentColor = false;
    fpPanel->ParentBackground = false;
}
 
// ---------------------------------------------------------------------------
__fastcall TFotoPanel::~TFotoPanel() {
    if (fpFotoImage) {
        delete fpFotoImage;
    }
    if (fpPanel) {
        delete fpPanel;
    }
}
 
// ---------------------------------------------------------------------------
namespace Fotopanelpackage {
    void __fastcall PACKAGE Register() {
        TComponentClass classes[1] = {__classid(TFotoPanel)};
        RegisterComponents(L"Samples", classes, 0);
    }
}
 
// ---------------------------------------------------------------------------
void __fastcall TFotoPanel::SetFotoFileName(AnsiString val) {
    if (FileExists(val)) {
        try {
            fpFotoImage->Picture->LoadFromFile(val);
        }
        catch (...) {
            throw Exception("Can not load image from <" + val + ">!");
        }
    }
    else
        throw Exception("<" + val + "> does not exist!");
}
 
// ---------------------------------------------------------------------------
void __fastcall TFotoPanel::SetPanelColor(TColor val) {
    FPanelColor = val;
    fpPanel->Color = FPanelColor;
}
 
// ---------------------------------------------------------------------------
 
void __fastcall TFotoPanel::SetImageWidth(int val) {
    FImageWidth = val;
    fpFotoImage->Width = FImageWidth;
}
 
// ---------------------------------------------------------------------------
void __fastcall TFotoPanel::SetPanelCaption(AnsiString val) {
    FPanelCaption = val;
    fpPanel->Caption = val;
}
 
// ---------------------------------------------------------------------------
void __fastcall TFotoPanel::SetImagePicture(TPicture * val) {
    fpFotoImage->Picture->Assign(val);
}
 
// ---------------------------------------------------------------------------
TPicture * __fastcall TFotoPanel::GetImagePicture() {
    return fpFotoImage->Picture;
}
 
// ---------------------------------------------------------------------------
void __fastcall TFotoPanel::SetImages(Imglist::TCustomImageList* val) {
    FImages = val;
}
// ---------------------------------------------------------------------------
 
void __fastcall TFotoPanel::SetImageIndex(Imglist::TImageIndex val) {
    if (!FImages) {
        FImageIndex = val;
        return;
    }
    if (val == -1) {
        FImageIndex = val;
        fpFotoImage->Picture->Assign(NULL);
    }
    else if ((val < FImages->Count) && (val > -1)) {
        FImageIndex = val;
        FImages->GetBitmap(FImageIndex, fpFotoImage->Picture->Bitmap);
    }
    this->Repaint();
}
 
// ---------------------------------------------------------------------------
void __fastcall TFotoPanel::SetOnFotoClick(TNotifyEvent val) {
    FOnFotoClick = val;
}
// ---------------------------------------------------------------------------
 
void __fastcall TFotoPanel::FOnFotoPanelRealClick(System::TObject *Sender) {
    if (FOnFotoClick) {
        FOnFotoClick(Sender);
    }
}
// ---------------------------------------------------------------------------
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.05.2011, 00:59
Builder 6 ругается на :
C++
1
2
3
4
this->ShowCaption = false;
fpFotoImage->AlignWithMargins = true;
fpFotoImage->AlignWithMargins = true;
fpPanel->ParentBackground = false;
(Что понятно в нем просто нет такого в TPanel).
В Builder 2009 норм.

Предупреждение FPanelColor = TColor(FOTO_PANEL_DEF_COLOR);

Но в любом случае ImageIndex не высвечивает список с изображениями ImageList-а, там просто поле ввода без выпадающего списка.

Насчет события еще обдумываю, если точнее выразится мне нужно что бы клик по Image вызывал клик по нашему компоненту Panel (TFotoPanel)
Т.е у меня затруднение с пониманием этого фрагментаО_о
C++
1
fpFotoImage->OnClick = &FOnFotoPanelRealClick; /* assign our TNotifyEvent */
Можно ли как то вызвать "напрямую" метод Click нашего компонента,возможно без добавления события?
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
30.05.2011, 01:05
C++
1
FPanelColor = TColor(FOTO_PANEL_DEF_COLOR);
Попробуй:
C++
1
FPanelColor = TColor(RGB(FOTO_PANEL_DEF_COLOR));
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.05.2011, 10:20
Цитата Сообщение от Nouko Посмотреть сообщение
FPanelColor = TColor(FOTO_PANEL_DEF_COLOR);
Не вот так правильно, у меня просто было написано
C++
1
FPanelColor = FOTO_PANEL_DEF_COLOR;
Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Но в любом случае ImageIndex не высвечивает список с изображениями ImageList
Надо писать свой редактор свойств. Я думал, что он автоматом подхватит.
По свободе сделаю.


Цитата Сообщение от Avazart Посмотреть сообщение
Можно ли как то вызвать "напрямую" метод Click
Конечно, можно. Причём 5 разными способами

Вот здесь очень хорошо описано
http://cppbuilder.ru/articles/0015.php

Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
fpFotoImage->OnClick = &FOnFotoPanelRealClick;
Вот здесь мы создаём событие OnClick у нашего дочернего компонента,
а в теле его мы можем вызвать что угодно
C++
1
2
3
4
5
6
void __fastcall TFotoPanel::FOnFotoPanelRealClick(System::TObject *Sender) {
        // здесь вызовется обработчик события панели-родителя
        if (this->OnClick) {
                this->OnClick(Sender);
        }
}
Добавлено через 1 минуту
Да, кстати можно просто написать
C++
1
fpFotoImage->OnClick = &this->OnClick;
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.05.2011, 17:46
Надо писать свой редактор свойств
а есть ссылка или примерчик по написанию своего редактора?

Первый способ работает,второй-
fpFotoImage->OnClick = &this->OnClick;
[C++ Error] myPI.cpp(37): E2027 Must take address of a memory location
[C++ Error] myPI.cpp(37): E2034 Cannot convert
'void (_fastcall * (_closure *)(TObject *) *)(TObject *)' to
'void (_fastcall * (_closure )(TObject *) )(TObject *)'
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.05.2011, 21:59
Цитата Сообщение от Avazart Посмотреть сообщение
fpFotoImage->OnClick = &this->OnClick;
Да, здесь я уже ошибся, надо без ссылки

C++
1
fpFotoImage->OnClick = this->OnClick;

Цитата Сообщение от Avazart Посмотреть сообщение
а есть ссылка или примерчик по написанию своего редактора?
Я сам эти редакторы никогда не писал, навскидку нашёл пару примеров на Delphi,
завтра, если время будет, разберу и выложу
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.05.2011, 22:49
C++
1
fpFotoImage->OnClick = this->OnClick;
Пробывал, просто не реагирует.
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.05.2011, 14:59
Цитата Сообщение от Avazart Посмотреть сообщение
Пробывал, просто не реагирует.
А ты его в обработчике сформировал у главной панели?

У меня проект дома, прийду домой проверю.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.05.2011, 20:29
В конструкторе формы нашего компонента
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.05.2011, 20:29
Помогаю со студенческими работами здесь

Создание компонента с собственным дизайном
Как сделать компонент со своим дизайном, например скроллбар или listbox, Заранее спасибо

Найти матрицу по её собственным векторам
Привет всем. Дана какая.то матрица А (2*2). Её собственные вектора v1=\begin{pmatrix}1/3\\ 1/3\end{pmatrix} and...

Разрешение проблем с собственным установщиком
Есть установщик собранный с помощью спец. средств. Хочу свой, в-принципе все готово. Но в голову пришла проблема доступа к установочной...

Структуры проекта с собственным классом
Всем привет. Возникла такая трудность: есть проект на основе трех файлов. Нужно переделать его двумя способами чтобы 1) был один файл *.cpp...

Сборка ноутбука с собственным конфигом
Сборкой стационарника никого не удивишь, а вот про самостоятельную сборку ноутбуков инфы мало. Мне не удалось найти подходящего конфига по...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru