Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
1

Создание компонентов на форме внутри кода

06.09.2013, 19:02. Показов 2100. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! У меня проблема при создании компонента на форме...
Я пишу код, но компонент не отображается, хотя, по идеи, всё написал правильно...
Мне нужно сделать компонент Edit на Form1, после чего прописать на нём действие OnClick, и при клике на этот компонент-содержание Text должно очищаться.
Однако, проблема в том, что Edit на форме, просто не появляется...
Подскажите пожалуйста, что не так в коде?
Кликните здесь для просмотра всего текста

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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Form1->Width=550;
    Form1->Height=50;
    Form1->BorderStyle=bsNone;
    Form1->Left=Screen->Width/2 - Form1->Width/2;
    Form1->Top=Screen->Height/2 - Form1->Height/2;
    TEdit* Edit1=new TEdit(Form1);//Пытаемся создать компонент Edit1 на форме...
        //Мне бы хотелось создать компонент именно внутри главной функции...
        //Пробовал объявить TEdit* Edit1=new TEdit(Form1), как глобальная переменная-результат тот же...
    {
    Edit1->Width=Form1->ClientWidth;//Получение ширины компонента Edit1, как ширина клиентской области окна
    Edit1->Height=Form1->ClientHeight-25;//Получение высоты компонента Edit1, как клиентская высота формы минус 25
    Edit1->Text="Текст для проверки программы";//Текст, внутри компонента будет следующим...
    Edit1->Visible=true;//Включение видимости компонента на форме
    Edit1->Left=0;//Положение Edit1 слева равно нулю
    Edit1->Top=0;//Положение Edit1 справа равно нулю
        //Вроде бы правильно, однако, компонента на форме - нету...
    }
}
//---------------------------------------------------------------------------
Результат работы программы:
Кликните здесь для просмотра всего текста




P.S.
И ещё, подскажите пожалуйста, как задать внутри кода действие при клике Edit1->OnCLick, что бы Edit1->Text был равен ""(т.е. был пуст)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2013, 19:02
Ответы с готовыми решениями:

Динамическое создание компонентов на форме
Не получается в событии OnCreate компонента Form1 создать, например, кнопку. procedure...

Создание компонентов на форме из DLL
Бьюсь уже несколько дней и без результата( Требуется из функции в DLL создать на указанной форме...

Динамическое создание компонентов на модальной форме
Всем привет. Не пойму в чем проблема, создаю модальную форму, на ней в onCreate должны динамически...

Динамическое создание компонентов в форме с AutoScroll = true
Всем привет. В моей программе предусмотрено динамическое создание трех полей ввода с тремя...

9
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
06.09.2013, 19:16 2
Цитата Сообщение от Jack Wade Посмотреть сообщение
Однако, проблема в том, что Edit на форме, просто не появляется...
Чтобы что-то появилось на форме, этому "чему-то" надо назначить форму Parent-ом. У тебя в коде этого назначения просто нет...

Цитата Сообщение от Jack Wade Посмотреть сообщение
задать внутри кода действие при клике Edit1->OnCLick
Так и задать:

C++
1
Edit1->OnClick = MyClick;
, где MyClick - вот такой метод:
C++
1
2
3
4
5
void __fastcall TForm1::MyClick(TObject *Sender)
{
    TEdit *edit = dynamic_cast<TEdit*>(Sender);
    if(edit) edit->Clear();
}
1
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
06.09.2013, 19:43  [ТС] 3
UI, конечно, большое спасибо за совет с Parent...
Код к стати вот такой:
C++
1
Edit->Parent=Form1;
Однако, у Меня вопрос по OnClick...
Как я понял - для работы созданной функции для OnClick, нужно добавить в класс TForm1 данную функцию(т.е. в классе в параметрах функции, которые доступны для данного класса), но можно ли как то без этого обойтись(точнее, есть ли, "альтернативные" пути задания действий OnClick)?
Код программы:
Кликните здесь для просмотра всего текста

Главный код программы
Кликните здесь для просмотра всего текста

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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;//В данный класс(TForm1) добавляем в параметры Public следующую функцию:
    //Public: void __fastcall TForm1::OnEditClick(TObject *Sender);
//---------------------------------------------------------------------------
 
 
 
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Form1->Width=550;
    Form1->Height=50;
    Form1->BorderStyle=bsNone;
    Form1->Left=Screen->Width/2 - Form1->Width/2;
    Form1->Top=Screen->Height/2 - Form1->Height/2;
    TEdit* Edit=new TEdit(Form1);//Пытаемся создать компонент Edit1 на форме...
    {
        Edit->Width=Form1->ClientWidth;//Получение ширины компонента Edit1, как ширина клиентской области окна
        Edit->Height=Form1->ClientHeight-25;//Получение высоты компонента Edit1, как клиентская высота Form1 минус 25(высота Edit)
        Edit->Text="Текст для проверки программы";//Текст, внутри компонента будет следующим...
        Edit->Visible=true;//Включение видимости компонента на форме
        Edit->Left=0;//Положение Edit1 слева равно нулю
        Edit->Top=0;//Положение Edit1 справа равно нулю
        Edit->Parent=Form1;//Установка для Edit родительского(главного) окна
        Edit->OnClick=OnEditClick;
    }
}
//---------------------------------------------------------------------------
 
 
//Объявление действий Нашей функции
void __fastcall TForm1::OnEditClick(TObject *Sender)
{
    TEdit* Edit=dynamic_cast<TEdit*>(Sender);//Как Я понимаю - здесь идёт получение компонента TEdit* из Form1(т.е. там, где была вызвана функция - тот элемент и берётся)
    if (Edit) Edit->Clear();//Очистка содержимого Edit
}

Код класса TForm1:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    void __fastcall TForm1::OnEditClick(TObject *Sender);//Наша функция действий при клике на компонент
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
06.09.2013, 20:36 4
Есть возможность во время исполнения задавать обработчики событий, если об этом речь.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
06.09.2013, 21:16 5
Цитата Сообщение от Jack Wade Посмотреть сообщение
есть ли, "альтернативные" пути задания действий OnClick
Альтернативные - это какие? Чтобы ничего не добавлять в класс формы? Можно сделать обычную функцию обработчиком события, или тебе нужно нечто вроде Дельфийского:

Delphi
1
2
3
4
5
  @Edit1.OnClick := PPointer(Cardinal(PPointer(
    procedure(Sender: TObject)
    begin
      (Sender as TEdit).Clear;
    end)^) + $0C)^;
?
0
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
07.09.2013, 00:49  [ТС] 6
BRcr, ну, примерно, об этом и речь(т.е. я бы хотел создать процедуру, в которой просто очищался бы TEdit). Однако, я делал процедуру типа void, делал типа __fastcal, но, когда я указывал Edit->OnClick=MyFunction(), компилятор выдавал мне ошибку об несоответствии типов:
C++
1
E2034 Cannot convert 'int' to 'TNotifyEvent'
А когда функция типа void __fastcall, то следующая ошибка:
C++
1
E2109 Not an allowed type
Т.е. всё равно, функция должна быть описана в классе...
Подскажите пожалуйста, как тогда объявить функцию обработки события OnClick для Edit вне класса TForm, или как тогда, по другому, задать функцию обработки событий для Edit->OnClick?
0
Практикантроп
4826 / 2718 / 526
Регистрация: 23.09.2011
Сообщений: 5,777
07.09.2013, 01:12 7
Цитата Сообщение от Jack Wade Посмотреть сообщение
Not an allowed type
Если вы писали как выше у вас:
C++
1
Edit->OnClick=MyFunction()
то так и будет... - как это ни непривычно, но в данном случае сработает вот это:
C++
1
Edit->OnClick=MyFunction
(без скобок); но типы аргументов, передаваемых функции MyFunction должны совпадать с EditClick (в данном случае TObject).

Добавлено через 2 минуты
П.С. хотя, это, возможно, не обязательно.
0
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
07.09.2013, 01:20  [ТС] 8
nick42, ну, вот при таком коде:
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
void MyFunction(TEdit* Edit)
{
    Edit->Clear();
}
 
void __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    if (FontDialog1->Execute())
    {
    TFont* MyFont;
    MyFont=FontDialog1->Font;
    TEdit* Edit=new TEdit(Form1);
        {
            Edit->Width=200;
            Edit->Height=25;
            Edit->Left=0;
            Edit->Top=0;
            Edit->Text="Test text!";
            Edit->Parent=Form1;
            Edit->Visible=true;
            Edit->Font=MyFont;
            Edit->OnClick=MyFunction;
        }
    }
}
компилятор мне выдаёт следующую ошибку:
C++
1
E2034 Cannot convert 'void(TEdit *)' to 'TNotifyEvent'
Так что это получается, мне вообще тогда туда параметров посылать не надо?
Пробовал делать функцию след. типа:
C++
1
2
3
4
5
void __fastcall MyFunction(void)
{
    TEdit* Edit;//TEdit* Edit=new TEdit(); или TEdit* Edit=new TEdit(Form1); = результат одинаковый...
    Edit->Clear();
}
делал ещё и такого типа функцию:
C++
1
2
3
4
5
__fastcall MyFunction(void)
{
    TEdit* Edit;//TEdit* Edit=new TEdit(); или TEdit* Edit=new TEdit(Form1); = результат одинаковый...
    Edit->Clear();
}
Теперь, компилятор не мог перевести int в TNotifyEvent... Запускал функцию след. образом:
C++
1
2
Edit->OnClick=MyFunction;
//результат=такой же, как и при Edit->OnClick=MyFunction(); или даже Edit->OnClick=MyFunction(Edit);
Подскажите-что я делаю не так?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
07.09.2013, 01:23 9
Jack Wade, я ссылку просто так, для красоты оставил, или чтобы ты по ней прошел, и почитал, что надо сделать?
0
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
07.09.2013, 01:35  [ТС] 10
UI, не заметил...
И спасибо, что помогли! Теперь всё так, как мне и хотелось!
Вот код:
Кликните здесь для просмотра всего текста

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
#include <vcl.h>
#include "Unit1.h"
 
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"
 
TForm1 *Form1;
 
 
 
 
void ClearEdit(TEdit* Edit)
{
    Edit->Clear();
}
 
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Form1->Width=400;
    Form1->Height=150;
    Form1->BorderStyle=bsToolWindow;
    Form1->Color=(TColor)RGB(0,0,0);
    Form1->Left=Screen->Width/2 - Form1->Width/2;
    Form1->Top=Screen->Height/2 - Form1->Height/2;
    Form1->Caption="FormMain";
    TEdit* Edit=new TEdit(Form1);
        {
            Edit->Parent=Form1;
            Edit->Width=250;
            Edit->Height=25;
            Edit->Visible=true;
            Edit->Left=Form1->ClientWidth/2 - Edit->Width/2;
            Edit->Top=Form1->ClientHeight/2 - Edit->Height/2;
            Edit->Text="Введите сюда пробный текст";
                TMethod Method;
                Method.Code=ClearEdit;
                Method.Data=Edit;
                Edit->OnClick=*(TNotifyEvent*)&Method;
        }
}
0
07.09.2013, 01:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2013, 01:35
Помогаю со студенческими работами здесь

Разработка приложений с использованием стандартных и дополнительных компонентов. Динамическое создание компонентов.
Здравствуйте! Помогите мне, пожалуйста. Условие задачи состоит в следующем: из списка выбираю...

Создание кода для кнопок редактирования в форме (Вставить, Добавить, Изменить, Удалить)
Не могу написать код для кнопок Вставить, Добавить, Изменить, Удалить.

Создание Delphi-компонентов. Правила создания компонентов
Текстовый файл содержит несколько вопросов и 4 варианта ответа , из которых только один...

Запуск неуправляемого кода внутри кода c#
часто требуется при выполнении программы запускать исполняемые файлы (exe) с ключами. Для этого...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru