Консультация № 170118
03.07.2009, 00:12
0.00 руб.
03.07.2009, 05:01
0 16 1
Здравсвуйте, эксперты!
Подскажите, пожалуйста: создаю свой класс, имею на форме 4 линейных поля ввода (TEdit) и одну кнопку. Хочу, чтобы из 2ух полей ввода данные при этом грузились в конструктор этого класса, а потом методом show() отображались в других двух полях ввода. Как мог написал это, но не работает, подскажите, что да как надо и правильно. Пишу в C++ Builder.

Приложение:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

class man
{
char name[10];
char fam[20];
man::man (char *,char *) ;
void show();
};
man::man(char *n,char *f)
{
strcpy(name,n);
strcpy(fam,f);
};



//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
man man1(&(Edit1->Text),&(Edit2->Text));
}
//---------------------------------------------------------------------------
void man::show()
{
strcpy(Edit3->Text,name);
strcpy(Edit4->Text,fam);
}

Обсуждение

Неизвестный
03.07.2009, 00:52
общий
Кто ж Вам даст лезть в контрол без последствийВ Builder не помню как, но вообще доступ к этим данным обычно проще:
man man1(Edit1->Text,Edit2->Text);

Edit3->Text=name;
Edit4->Text=fam;

Как там реализованно - не знаю. Наверняка есть свой тип String. И лучше пользоваться им, не char*.
Неизвестный
03.07.2009, 01:27
общий
Tribak:
Подумайте.
Откуда man::show() знает, что такое Edit3 и Edit4?

Вам надо почитать что-либо по ООП. Например, Р.Лафоре "Объектно-ориентированное программирование в C++".
давно
Старший Модератор
17042
808
03.07.2009, 06:03
общий
это ответ
Здравствуйте, Tribak!
Общие замечания по проекту:
1) Давайте осмысленные имена переменным, в том числе именам компонентов на форме (например, NameEdit и NameLastEdit - для полей ввода, получающих информацию, и OutNameEdit и OutNameLastEdit - для полей ввода, выводящих информацию).
2) Собственные классы лучше реализовывать в отдельных файлах (например, для класса TMan файлы TMan.h и TMan.cpp).
3) Используйте для вывода текстовой информации в компоненты класс Builder AnsiString. Для использования его в своих классах, подключайте его директивами #include <iostream> и #include<system.hpp>.
Комментированный код в приложении (модуль главной формы приложения назван MainUnit).


Приложение:
// Файл TMan.h
//---------------------------------------------------------
#ifndef _TMan_
#define _TMan_
//---------------------------------------------------------
#include <iostream>
#include <system.hpp> // Подключаем AnsiString
//---------------------------------------------------------
class TMan
{
public:
TMan(AnsiString sName, AnsiString sLastName);
AnsiString ShowName(); // Вывод имени
AnsiString ShowLastName(); // Вывод фамилии

private:
AnsiString sName; // Хранение имени
AnsiString sLastName; // Хранение фамилии
};
//---------------------------------------------------------
#endif
//---------------------------------------------------------
// Файл TMan.cpp
//---------------------------------------------------------
#include "TMan.h"
//---------------------------------------------------------
TMan::TMan(AnsiString sName, AnsiString sLastName)
{
this->sName = sName; // Получаем и сохраняем имя и фамилию
this->sLastName = sLastName;
}
//---------------------------------------------------------
AnsiString TMan::ShowName()
{
return sName;
}
//---------------------------------------------------------
AnsiString TMan::ShowLastName()
{
return sLastName;
}
//---------------------------------------------------------
// Файл MainUnit.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "MainUnit.h"
#include "TMan.h" // Подключаем наш класс
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::SubmitButtonClick(TObject *Sender)
{
TMan Man(NameEdit->Text, LastNameEdit->Text); // Создаём объект нашего класса и получаем данные из полей ввода
OutNameEdit->Text = Man.ShowName(); // Выводим его имя
OutLastNameEdit->Text = Man.ShowLastName(); // Выводим его фамилию
}
//---------------------------------------------------------------------------
5
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
03.07.2009, 08:47
общий
так я читаю сейчас сейчас, правда Архангельского, мне вот понравилось с классами собственными работать, методы свои писать
Неизвестный
03.07.2009, 08:52
общий
Dr_Andrew
Я хочу чтобы сам метод записывал куда надо информацию, чтобы просто вызвал метод, а метод уже знает что и в какие компоненты вывести.
давно
Старший Модератор
17042
808
03.07.2009, 12:27
общий
В таком случае необходимо определить метод главной формы приложения, который а) будет получать переменные Вашего класса и б) записывать в нужные компоненты.
Как совершенно справедливо заметил Micren, "откуда man::show() знает, что такое Edit3 и Edit4". Можно, разумеется, включить в объявление Вашего класса заголовочный файл формы, но какой тогда смысл в Вашем классе? Лучше уж объявить строковые переменные для хранения имени и фамилии как члены класса формы и, соответственно, метод формы show, который будет выводить информацию в её компоненты.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
03.07.2009, 12:47
общий
Tribak:
Как вариант можно добавить, что методу man::show(); можно передавать объект-форму куда он будет писать данные.

Код:

void man::show(TForm1* form)
{
if(form)
{
form->Edit3->Text=name;
form->Edit4->Text=fam;
}
}

name и fam должны иметь тип TCaption.
Вызывать этот метод из метода формы надо manreference.show(this);

Но все это извращение.

В нормально написанных программах такое никто не делает. Программу делят на несколько уровней(минимум два). Уровень данных и уровень представления. Классы уровня данных занимаются исключительно манипуляцией с данными(чтение/запись/организация списков и др. структур и т.п.). Классы уровня представления отображают то, что надо на экране/принтере и т.п. Классы разных уровней взаимодействуют друг с другом через какой-либо интерфейс, но никак не напрямую модифицируют поля/свойства друг друга. Каждый класс занимается своей задачей.

Исходя из этого скажите, какое отношение имеет класс man к свойствам Edit3 и Edit4 вообще?
Если Вы будете так делать как хотите, то отладка небольшого приложения с парой окон и несколькими классами данных может превратиться в кошмар.
Неизвестный
06.07.2009, 16:28
общий
я хочу сейчас чтобы конструктор класса заполнял свойства класса, часть полей класса анализировала свойства, а часть методов тем или иным образом выводила значения каких-то свойств пользователю.
Неизвестный
06.07.2009, 16:44
общий
конструктор когда вызывается, считывает информацию с формы, через какие либо компоненты. А потом так же, по команде выводит информацию
Неизвестный
06.07.2009, 17:57
общий
Tribak:
А почему это должен делать конструктор чужого для формы класса? Почему не форма передает эти данные конструктору и получает информацию потом от этого класса и визуализирует ее?
Неизвестный
06.07.2009, 21:26
общий
а эт интересно, но как это? так конструктор собрал всю какую надо информацию, и класс уже сам ее всю анализирует, а потом выдает результаты
недавно писал программу для расчета протяженности сети, была дана матрица соединений, матрица расходов и т.д. Вот я сейчас хочу чтобы эти матрицы конструктор допустим взял. Разные шаги анализа разные методы класса осуществляют, и чтобы постоянно смотреть что я имею при анализе, нужны методы которые бы отображали что у меня с этими матрицами на данном этапе твориться.
Неизвестный
06.07.2009, 21:27
общий
Тогда все это делал при помощи отдельных массивов, отдельных функций, сейчас для красоты, систематизации и наглядности все это хочу все это в один класс собрать.
давно
Старший Модератор
17042
808
07.07.2009, 09:56
общий
Tribak:
"все это хочу все это в один класс собрать" - так и соберите. В класс главной формы приложения. Подобное решение само собой напрашивается.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
07.07.2009, 10:04
общий
то есть класс данной формы, можно чуток подробнее если не сложно
давно
Старший Модератор
17042
808
07.07.2009, 13:14
общий
Tribak:
Когда Вы начинаете новое VCL-приложение в среде Borland C++ Builder, то создаётся форма (Вы её видите при проектировании) и генерируется код её класса (TForm1 по умолчанию). По умолчанию файл объявления этого класса - Unit1.h, а файл реализации - Unit1.cpp.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
07.07.2009, 13:26
общий
пасибо, я сейчас еще вопрос задам
Форма ответа