Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2011, 11:47   #1
ЛиКЁР
Новичок
Джуниор
 
Регистрация: 28.06.2011
Сообщений: 3
По умолчанию Как задать код чтобы пользователь сам определял ширину линии

Form1->Image1->Canvas->Pen->Whidth=6 задаётся в коде самой программы, а как прописать чтобы через edit пользователь задавал свои параметры ширины линии...

Последний раз редактировалось ЛиКЁР; 28.06.2011 в 12:27.
ЛиКЁР вне форума Ответить с цитированием
Старый 28.06.2011, 14:37   #2
Dogmat
Пользователь
 
Регистрация: 12.06.2008
Сообщений: 76
По умолчанию

Код:
/* ____________________Unit1.h______________________*/

class TForm1 : public TForm
{
// ваши секции __published, public, protected, private
// добавить следущее:
__published
    void __fastcall PenWidthEditChange(TObject *Sender);
    void __fastcall PenWidthEditKeyPress(TObject *Sender, char& Key);
private:
    TEdit *penWidthEdit;
};

/* ____________________Unit1.cpp______________________*/

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
    int penWidth = Image1->Canvas->Pen->Width;

    TEdit *penWidthEdit = new TEdit(this);
    penWidthEdit->Parent = this;
    penWidthEdit->Name = "PenWidthEdit";
    penWidthEdit->Top = 10;
    penWidthEdit->Left = 10;
    penWidthEdit->Width = 121;
    penWidthEdit->Height = 21;
    penWidthEdit->Text = IntToStr(penWidth);
    penWidthEdit->OnChange = PenWidthEditChange;
    penWidthEdit->OnKeyPress = PenWidthEditKeyPress;
}

void __fastcall TForm1::PenWidthEditChange(TObject *Sender)
{
    AnsiString text = penWidthEdit->Text;

    if (text.IsEmpty())
        return;

    Image1->Canvas->Pen->Width = text.ToIntDef(0);
}

void __fastcall TForm1::PenWidthEditKeyPress(TObject *Sender, char& Key)
{
    bool isDigit = ((Key >= '0') && (Key <= '9'));
    bool isBackspace = (Key == 8);

    if (!isDigit && !isBackspace)
        Key = 0;
}

Последний раз редактировалось Dogmat; 28.06.2011 в 15:24.
Dogmat вне форума Ответить с цитированием
Старый 28.06.2011, 15:24   #3
ЛиКЁР
Новичок
Джуниор
 
Регистрация: 28.06.2011
Сообщений: 3
По умолчанию

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream.h>
#include <string.h>
#include <cstring.h>
#include <CONIO.H>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int i,j,n,m,s1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
class my{
public:
void draw(int xx1, int yy1, int xx2, int yy2, int xx3, int yy3);
void draw(int xx1, int yy1, int xx2, int yy2, int xx3, int yy3, int col);
void draw(int xx1, int yy1, int xx2, int yy2, int xx3, int yy3, AnsiString s);
};
void my:raw(int xx1, int yy1, int xx2, int yy2, int xx3, int yy3){
Form1->Image1->Canvas->Pen->Color=clRed;
Form1->Image1->Canvas->Pen->Style<<fsBold;
Form1->Image1->Canvas->Pen->Width=6;
TPoint points[3];
points[0]=TPoint(xx1,yy1);
points[1]=TPoint(xx2,yy2);
points[2]=TPoint(xx3,yy3);
Form1->Image1->Canvas->Polygon(points,3);
};
void my:raw(int xx1, int yy1, int xx2, int yy2, int xx3, int yy3, int col){
Form1->Image1->Canvas->Pen->Color=clGreen;
Form1->Image1->Canvas->Pen->Style<<fsBold;
Form1->Image1->Canvas->Pen->Width=6;
if(col==1){Form1->Image1->Canvas->Brush->Color=clRed;}
if(col==2){Form1->Image1->Canvas->Brush->Color=clBlue;}
if(col==3){Form1->Image1->Canvas->Brush->Color=clGreen;}
TPoint points[3];
points[0]=TPoint(xx1,yy1);
points[1]=TPoint(xx2,yy2);
points[2]=TPoint(xx3,yy3);
Form1->Image1->Canvas->Polygon(points,3);
if(col==1){
Form1->Image1->Canvas->FloodFill(int((xx1+xx2)/2),int((yy1+yy2)/2),clRed,fsSurface);}
if(col==2){
Form1->Image1->Canvas->FloodFill(int((xx1+xx2)/2),int((yy1+yy2)/2),clBlue,fsSurface);}
if(col==3){
Form1->Image1->Canvas->FloodFill(int((xx1+xx2)/2),int((yy1+yy2)/2),clGreen,fsSurface);}
}
void my:raw(int xx1, int yy1, int xx2, int yy2, int xx3, int yy3, AnsiString s){
Form1->Image1->Canvas->Pen->Color=clBlack;
Form1->Image1->Canvas->Pen->Style<<fsBold;
Form1->Image1->Canvas->Pen->Width=6;
using namespace Windows;
TPoint points[3];
points[0]=TPoint(xx1,yy1);
points[1]=TPoint(xx2,yy2);
points[2]=TPoint(xx3,yy3);
Form1->Image1->Canvas->Polygon(points,3);
Form1->Image1->Canvas->Brush->Color=clWhite;
Form1->Image1->Canvas->Pen->Color=clBlack;
Form1->Image1->Canvas->Pen->Style<<fsBold;
Form1->Image1->Canvas->Pen->Width=6;
Form1->Image1->Canvas->TextOutA((xx1+yy3)+10,int((yy1+xx1 +xx3)/2),s);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int x1,y1,x2,y2,x3,y3;
my ob;
if(Edit1->Text=="" || Edit2->Text=="" || Edit3->Text=="" || Edit4->Text==""){
Application->MessageBoxA("Данные не введены","Внимание",MB_OK);
}
else{
x1=StrToInt(Edit1->Text); y1=StrToInt(Edit2->Text);
x2=StrToInt(Edit2->Text); y2=StrToInt(Edit3->Text);
x3=StrToInt(Edit3->Text); y3=StrToInt(Edit4->Text);
Application->MessageBoxA("Данные введены","Внимание",MB_OK);
ob.draw(x1,y1,x2,y2,x3,y3);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int x1,y1,x2,y2,x3,y3,c;
my ob;
if((Edit1->Text=="")||(Edit2->Text=="")||(Edit3->Text=="")||(Edit4->Text=="")||(Edit5->Text=="")||(ComboBox1->Text=="")){
Application->MessageBoxA("Данные не введены Выбирите цвет",MB_OK);
}
else{
c=ComboBox1->ItemIndex+1;
x1=StrToInt(Edit1->Text); y1=StrToInt(Edit2->Text);
x2=StrToInt(Edit2->Text); y2=StrToInt(Edit3->Text);
x3=StrToInt(Edit3->Text); y3=StrToInt(Edit4->Text);
Application->MessageBoxA("Данные введены",MB_OK);
ob.draw(x1,y1,x2,y2,x3,y3,c);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
int x1,y1,x2,y2,x3,y3,s;
AnsiString s1;
my ob;
if((Edit1->Text=="")||(Edit2->Text=="")||(Edit3->Text=="")||(Edit4->Text=="")||(Edit5->Text=="")){
Application->MessageBoxA("Данные не введены","Внимание",MB_OK);
}
else {
s1=Edit5->Text;
x1=StrToInt(Edit1->Text); y1=StrToInt(Edit2->Text);
x2=StrToInt(Edit2->Text); y2=StrToInt(Edit3->Text);
x3=StrToInt(Edit3->Text); y3=StrToInt(Edit4->Text);
Application->MessageBoxA("Данные введены","Внимание",MB_OK);
ob.draw(x1,y1,x2,y2,x3,y3,s1);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button5Click(TObject *Sender)
{
Form1->Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));
}
//---------------------------------------------------------------------------

и куда его тут =(((
ЛиКЁР вне форума Ответить с цитированием
Старый 28.06.2011, 15:38   #4
Dogmat
Пользователь
 
Регистрация: 12.06.2008
Сообщений: 76
По умолчанию

Вообще, не есть хорошо, что вы внутри функции члена класса my обращаетесь к полям экземпляра другого класса (TForm1 *Form1) напрямую в то время, как он не является полем класса my.

Сделайте функции draw, членами TForm1. И внутри тела функции draw уберите настройки канвы, в частности ваш Pen->Width, коли хотите регулировать его из эдита.

Ну и добавте куда вам нужно на форму TEdit. Или создавайте TEdit динамически, как у меня. Опишите для него обработчики событий OnKeyPress и OnChange, как у меня. Названия, только переменных подправте и все.
Dogmat вне форума Ответить с цитированием
Старый 28.06.2011, 15:41   #5
Dogmat
Пользователь
 
Регистрация: 12.06.2008
Сообщений: 76
По умолчанию

Ну или, если так приспичело. Создайте в классе my поле с указателем на картинку или вообще на канву. Сделайте функцию-член инициализирующую это поле и в теле draw обращайтесь к этой канве или картинке.
Dogmat вне форума Ответить с цитированием
Старый 28.06.2011, 15:45   #6
ЛиКЁР
Новичок
Джуниор
 
Регистрация: 28.06.2011
Сообщений: 3
По умолчанию

ну я понимаю, просто задание создать собственный класс, содержащий перегруженные методы...
ЛиКЁР вне форума Ответить с цитированием
Старый 28.06.2011, 15:57   #7
Dogmat
Пользователь
 
Регистрация: 12.06.2008
Сообщений: 76
По умолчанию

ну и заведите какой-нибудь TImage *image или TCanvas *canvas.

Код:
class my{
public:
    my(): canvas(NULL) {};
   ~my() {};

    void SetCanvas(TCanvas *canvas);

    void draw(int xx1, int yy1, int xx2, int yy2, int xx3, int yy3);
    void draw(int xx1, int yy1, int xx2, int yy2, int xx3, int yy3, int col);
    void draw(int xx1, int yy1, int xx2, int yy2, int xx3, int yy3, AnsiString s);

protected:

private:
   TCanvas *canvas;
};

void my::SetCanvas(TCanvas *Canvas)
{
    if (Canvas == NULL)
        return;

    canvas = Canvas;
}
а в теле draw уберите инициализацию параметров канвы. Пусть настраивается на сомой форме. Наверное, правильней хранить указатель на TCanvas, получится, что-то вроде рисования на чем угодно, где есть канва. Это все нюансы.

Если работаете с экземплярами классов унаследованных от TObject, может так же стоит унаследоваться от TObject.

Последний раз редактировалось Dogmat; 28.06.2011 в 16:01.
Dogmat вне форума Ответить с цитированием
Старый 28.06.2011, 16:01   #8
Dogmat
Пользователь
 
Регистрация: 12.06.2008
Сообщений: 76
По умолчанию

Кстати, код на форуме оформляйте со специальным тегом (иконка с символом # при редактировании сообщения). А то съедят.
Dogmat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA удалить столбцы, задать фикс. ширину столбца и задать перенос по словам johny_03 Microsoft Office Excel 1 14.04.2011 20:53
как задать ширину div'a Arassir HTML и CSS 3 22.01.2011 11:12
Как задать ширину полей DropDownBox для TDBLookupComboboxEh? altcore БД в Delphi 11 26.10.2010 00:08
Как сделать чтобы макрос выполнялся сам каждые 10 минут? Град SQL, базы данных 0 26.05.2008 16:12