Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.17;
Скачать: CL | DM;

Вниз

TComboBox+TEdit   Найти похожие ветки 

 
Тимофей   (2007-05-17 14:21) [0]

Друзья, товарищи, помогите пожалуйста с созданием компонента на базе TEdit и TComboBox. По задумке он должен по выбору единиц измерения из TComboBox менять значения в TEdit. Бросьте пожалуйста исходники. Заранее благодарю.


 
clickmaker ©   (2007-05-17 14:35) [1]


> Бросьте пожалуйста исходники

жжошь!
может сразу web-money на счет? :)


 
DrAndrey ©   (2007-05-17 14:38) [2]

Укажи эти самые единицы измерения, коэффициенты пересчета, тип значения на выходе - число или текст?


 
Тимофей   (2007-05-18 11:28) [3]

В TComboBox:
сек
метры
В TEdit:
число
Заранее спасибо


 
ЮЮ ©   (2007-05-18 11:35) [4]

Положи их рядом. Зачем нужен компонент на каждый чих?


 
Плохиш ©   (2007-05-18 11:42) [5]


> По задумке он должен по выбору единиц измерения из TComboBox
> менять значения в TEdit.


> сек
> метры

Интересно, 1 сек это сколько метров?

> ЮЮ ©   (18.05.07 11:35) [4]
> Положи их рядом. Зачем нужен компонент на каждый чих?

В вопросе главное - > Бросьте пожалуйста исходники.


 
DrAndrey ©   (2007-05-18 11:55) [6]

> сек
> метры

>Интересно, 1 сек это сколько метров?

Объясни толком задачу, какие метры в какие секунды?


 
Тимофей   (2007-05-21 12:32) [7]

У меня уже дела продвинулись. Написал класс, Delphi все компилирует, но класс не работает. Вот текст. Помогите разобраться, в чем ошибка?
type
   TComBEdit = class
    private
     fX: real;
     fV: real;
     fk: integer;
     fEdit:TEdit;
     fComboBox:TComboBox;
     Constructor Create;
     Destructor Destroy;
     procedure GetX(Sender:TObject);
     procedure SetX(Sender:TObject;NewX:real);
     public
     //property X:real read GetX write SetX;
     property k:integer read fk;
     property V:real read fV;
    end;
................
Constructor TComBEdit.Create();
begin
fEdit:=TEdit.Create(;
fComboBox:=TComboBox.Create();
OnExit:=GetX;
//fEdit.OnExit:=fEdit.
fComBEdit.GetX;
if fComboBox.OnChange then do
fComBEdit.SetX;
end;

function fComBEdit.GetX(Sender: TObject);
begin
case fComboBox.ItemIndex of
0:fk:=1;
1:fk:=1024;
2:fk:=1024*1024;
3:fk:=8;
4:fk:=8*1024;
5:fk:=8*1024*1024;
end;
fV:=StrToInt(fEdit.Text);
fX:=fV*fk;
Result:=fX;
end;

procedure fComBEdit.SetX(NewX:real);
begin
case fComboBox.ItemIndex of
0:fk:=1;
1:fk:=1024;
2:fk:=1024*1024;
3:fk:=8;
4:fk:=8*1024;
5:fk:=8*1024*1024;
end;
fEdit.Text:=FloatToStr(NewX/fk);
end;


 
Плохиш ©   (2007-05-21 12:36) [8]


> Тимофей   (21.05.07 12:32) [7]
> У меня уже дела продвинулись. Написал класс, Delphi все
> компилирует

Врёшь... у тебя куча синтаксических ошибок в коде...


 
{RASkov} ©   (2007-05-21 12:43) [9]

> [7] Тимофей   (21.05.07 12:32)

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


 
Jkmuf!   (2007-05-21 12:56) [10]

[9] {RASkov} ©   (21.05.07 12:43)
> да и само чудо фик знает кто оно...

Это класс:

>   TComBEdit = class


 
{RASkov} ©   (2007-05-21 13:27) [11]

> [10] Jkmuf!   (21.05.07 12:56)
> Это класс:

Это Супер Класс )
И оно(чудо) точно не может сожержать на себе контролы(в данном случае TComboBox и TEdit). И куда это чудо их помещает(кто их "рисует") фик знает.


 
Сергей М. ©   (2007-05-21 13:39) [12]


> Тимофей   (21.05.07 12:32) [7]
> У меня уже дела продвинулись


Придется все же вернуть "дела" на стартовую позицию)

Компонент - это класс-наследник TComponent, а твой класс почему-то вдруг есть наследник TObject..


 
Jkmuf!   (2007-05-21 14:03) [13]

> [11] {RASkov} ©   (21.05.07 13:27)

Я ":)" Забыл написовать [10] - мой (Так получилось)


 
iXT ©   (2007-05-21 14:12) [14]

В смысле мой :)


 
Тимофей   (2007-05-22 13:45) [15]

Друзья, я прописал класс следующим образом:
type
   TComBEdit = class
    private
     fX: real;
     fV: real;
     fk: integer;
     fEdit:TEdit;
     fComboBox:TComboBox;
     fPanel:TPanel;
     Constructor Create(OwnerParent:TPanel);
     Destructor Destroy;
     procedure GetEdit(Sender:TObject);
     function GetX:real;
     procedure SetEdit(Sender:TObject);
     procedure SetX(fX:real);
     public
     property X:real read GetX write SetX;
     property k:integer read fk;
     property V:real read fV;
    end;
........................
var
 MainForm: TForm1;
 ComBEdit: TComBEdit;
..........................
Constructor TComBEdit.Create(OwnerParent:TPanel);
begin
fPanel:=OwnerParent;
fEdit:=TEdit.Create(OwnerParent);
fComboBox:=TComboBox.Create(OwnerParent);
fEdit.OnExit:=GetEdit;
GetX;
//fEdit.OnExit:=fEdit.
//fComBEdit.GetX;
fComboBox.OnChange:=SetEdit;
SetX(fX);
//fComBEdit.SetX;
end;

Destructor TComBEdit.Destroy;
begin
fPanel:=nil;
fEdit.Destroy;
fComboBox.Destroy;
end;

procedure TComBEdit.GetEdit(Sender: TObject);
begin
GetX;
end;

procedure TComBEdit.SetEdit(Sender: TObject);
begin
SetX(fX);
end;

function TComBEdit.GetX:real;
begin
case fComboBox.ItemIndex of
0:fk:=1;
1:fk:=1024;
2:fk:=1024*1024;
3:fk:=8;
4:fk:=8*1024;
5:fk:=8*1024*1024;
end;
fV:=StrToInt(fEdit.Text);
fX:=fV*fk;
Result:=fX;
end;

procedure TComBEdit.SetX(fX:real);
begin
case fComboBox.ItemIndex of
0:fk:=1;
1:fk:=1024;
2:fk:=1024*1024;
3:fk:=8;
4:fk:=8*1024;
5:fk:=8*1024*1024;
end;
fEdit.Text:=FloatToStr(fX/fk);
end;
Пожалуйста, помогите найти ошибку. Компиляция проходит успешно.


 
Тимофей   (2007-05-22 13:47) [16]

Вот второй вариант. Мне с ним помогли, но компиляция не выполняется. Помогите пожалуйста найти здесь ошибку, если можете:
// -----------------------------------------------------------------------------
type CAbstractEditBox  = class(TObject)
 constructor Create(var edit : TEdit; var box : TComboBox);
 destructor Destroy; override;
 procedure recalc(); virtual; abstract;

 protected
   m_edit : ^TEdit;
   m_box : ^TComboBox;
   m_pastUnit : string;
end;

// -----------------------------------------------------------------------------
type CTimeEditBox = class(CAbstractEditBox)
 constructor Create(var edit : TEdit; var box : TComboBox);
 destructor Destroy; override;
 procedure recalc(); override;
end;

// -----------------------------------------------------------------------------
type CDistanceEditBox = class(CAbstractEditBox)
 constructor Create(var edit : TEdit; var box : TComboBox);
 destructor Destroy; override;
 procedure recalc(); override;
end;

// -----------------------------------------------------------------------------
type
 TForm1 = class(TForm)
   timeEdit: TEdit;
   timeBox: TComboBox;
   distEdit: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   distBox: TComboBox;
   procedure FormCreate(Sender: TObject);
   procedure timeBoxChange(Sender: TObject);
   procedure distBoxChange(Sender: TObject);
 private
   m_timeEditBox : CTimeEditBox;
   m_distEditBox : CDistanceEditBox;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

// -----------------------------------------------------------------------------
// class CAbstractEditBox
// -----------------------------------------------------------------------------
constructor CAbstractEditBox.Create(var edit : TEdit; var box : TComboBox);
begin
 inherited Create;

 m_edit := @edit;
 m_box := @box;
 m_pastUnit := box.Text;
end;

// -----------------------------------------------------------------------------
destructor CAbstractEditBox.Destroy;
begin
 inherited Destroy;
end;

// -----------------------------------------------------------------------------
// class CTimeEditBox
// -----------------------------------------------------------------------------
constructor CTimeEditBox.Create(var edit : TEdit; var box : TComboBox);
begin
 inherited Create(edit, box);
end;

// -----------------------------------------------------------------------------
destructor CTimeEditBox.Destroy;
begin
 inherited Destroy;
end;

// -----------------------------------------------------------------------------
procedure CTimeEditBox.recalc();
begin
 // åñëè âûáðàëè òó æå åä.èçìåðåíèÿ, ÷òî è áûëà äî ýòîãî - íå ñ÷èàòåì
 if(m_pastUnit = m_box^.Text) then
   Exit

 // åñëè íè÷åãî íå áûëî ââåäåíî
 else if(m_edit^.Text = "") then
 begin
   m_pastUnit := m_box^.Text;
   Exit;
 end

 // sec to some
 else if((m_pastUnit = "sec") and (m_box^.Text = "min")) then
   m_edit^.Text := FloatToStrF(StrToFloat(m_edit^.Text)/60, ffGeneral, 4, 8)
 else if((m_pastUnit = "sec") and (m_box^.Text = "hour")) then
   m_edit^.Text := FloatToStrF(StrToFloat(m_edit^.Text)/3600, ffGeneral, 4, 8)

 // min to some
 else if((m_pastUnit = "min") and (m_box^.Text = "sec")) then
   m_edit^.Text := FloatToStrF(StrToFloat(m_edit^.Text)*60, ffGeneral, 4, 8)
 else if((m_pastUnit = "min") and (m_box^.Text = "hour")) then
   m_edit^.Text := FloatToStrF(StrToFloat(m_edit^.Text)/60, ffGeneral, 4, 8)

 // hour to some
 else if((m_pastUnit = "hour") and (m_box^.Text = "sec")) then
   m_edit^.Text := FloatToStrF(StrToFloat(m_edit^.Text)*3600, ffGeneral, 4, 8)
 else if((m_pastUnit = "hour") and (m_box^.Text = "min")) then
   m_edit^.Text := FloatToStrF(StrToFloat(m_edit^.Text)*60, ffGeneral, 4, 8);

 m_pastUnit := m_box^.Text;
end;

// -----------------------------------------------------------------------------
// class CDistanceEditBox
// -----------------------------------------------------------------------------
constructor CDistanceEditBox.Create(var edit : TEdit; var box : TComboBox);
begin
 inherited Create(edit, box);
end;

// -----------------------------------------------------------------------------
destructor CDistanceEditBox.Destroy;
begin
 inherited Destroy;
end;

// -----------------------------------------------------------------------------
procedure CDistanceEditBox.recalc;
begin
 // åñëè âûáðàëè òó æå åä.èçìåðåíèÿ, ÷òî è áûëà äî ýòîãî - íå ñ÷èàòåì
 if(m_pastUnit = m_box^.Text) then
   Exit

 // åñëè íè÷åãî íå áûëî ââåäåíî
 else if(m_edit^.Text = "") then
 begin
   m_pastUnit := m_box^.Text;
   Exit;
 end

 // m to km
 else if((m_pastUnit = "m") and (m_box^.Text = "km")) then
   m_edit^.Text := FloatToStrF(StrToFloat(m_edit^.Text)/1000, ffGeneral, 4, 8)

 // km to m
 else if((m_pastUnit = "km") and (m_box^.Text = "m")) then
   m_edit^.Text := FloatToStrF(StrToFloat(m_edit^.Text)*1000, ffGeneral, 4, 8);

 m_pastUnit := m_box^.Text;
end;

// -----------------------------------------------------------------------------
// class TForm1
// -----------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
 m_timeEditBox := CTimeEditBox.Create(timeEdit, timeBox);
 m_distEditBox := CDistanceEditBox.Create(distEdit, distBox);
end;

// -----------------------------------------------------------------------------
procedure TForm1.timeBoxChange(Sender: TObject);
begin
 m_timeEditBox.recalc;
end;

// -----------------------------------------------------------------------------
procedure TForm1.distBoxChange(Sender: TObject);
begin
 m_distEditBox.recalc;
end;
Ошибку выдает следующую:
Could not create output file "Unit1.dcu"


 
iXT ©   (2007-05-22 13:59) [17]

"Не могу создать файл Unit1.dcu" Чем то занят наверное :)


 
Плохиш ©   (2007-05-22 14:03) [18]


> Тимофей   (22.05.07 13:45) [15]

Надо установить свойства Parent у создаваемых тобой компотентов TEdit и TComboBox.


 
iXT ©   (2007-05-22 14:21) [19]

> Надо установить свойства Parent у создаваемых тобой компотентов
> TEdit и TComboBox.

И поэтому он не может создать DCU? :)


 
Тимофей   (2007-05-22 14:33) [20]

А по первому варианту кто-нибудь подсказать что-нибуть может? Может быть перерисовку эдитов и боксов нужно совершать (создавать объект) при генерации формы? Прошу, умоляю помогите кодом!!!


 
Johnmen ©   (2007-05-22 14:46) [21]

Что, припекает? Завтра сдавать? :)


 
DrAndrey ©   (2007-05-22 14:50) [22]

to Тимофей: "Остров докторо Моро" Г.Уэлса читал? Зачем скрещивать 2 нормальных компонента, чтобы получить одного уродца?! Неделю уже ломаешь голову? Я в своё время тоже хотел объединить Едит со СпидБаттоном и рад, что отказался от этой затеи.


 
Тимофей   (2007-05-22 15:03) [23]


> Зачем скрещивать 2 нормальных компонента, чтобы получить
> одного уродца?!

Я бы рад отказаться от этой затеи, дак препод поставил эту задачу.


 
DrAndrey ©   (2007-05-22 16:19) [24]

>Плохиш ©   (22.05.07 14:03) [18]

> Тимофей   (22.05.07 13:45) [15]

>Надо установить свойства Parent у создаваемых тобой компотентов TEdit и >TComboBox.

type
 TComboEdit = class(TPanel)
 private
  FEdit: TEdit;
  FComboBox: TComboBox;
   { Private declarations }
 protected
   { Protected declarations }
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   property Edit: TEdit read FEdit;
   property ComboBox: TComboBox read FComboBox;
 published
   { Published declarations }
 end;

///

constructor TComboEdit.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FEdit := TEdit.Create(Self);
 FEdit.Width:= 60;
 FEdit.Visible := True;
 FEdit.Parent := Self;

 FComboBox := TComboBox.Create(Self);
 FComboBox.Width:= 60;
 FComboBox.Left:= 64;
 FComboBox.Visible := True;
 FComboBox.Parent := Self;
 //Self.AutoSize:= True;
 //Self.BevelOuter:= bvNone;

end;

destructor TComboEdit.Destroy;
begin
 FComboBox := nil;  FEdit := nil;  inherited Destroy;
end;

Изучай исходники vcl, там все написано.


 
Плохиш ©   (2007-05-22 16:31) [25]


> iXT ©   (22.05.07 14:21) [19]
> > Надо установить свойства Parent у создаваемых тобой компотентов
>
> > TEdit и TComboBox.
>
> И поэтому он не может создать DCU?

Я говорил про первый вариант, а измываться над телепатором по второму варианту, себе дороже :-)


 
Тимофей   (2007-05-23 12:06) [26]

Спасибо огромное! Буду испытовать.



Страницы: 1 вся ветка

Текущий архив: 2007.06.17;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.021 c
2-1179942226
Anubis448462972
2007-05-23 21:43
2007.06.17
Процессы


15-1179689134
Kostafey
2007-05-20 23:25
2007.06.17
Как вникать в структуру базы данных ?


2-1179816234
unnamed777
2007-05-22 10:43
2007.06.17
GetFileSize


3-1175072882
Xmen
2007-03-28 13:08
2007.06.17
проверка базы для соединения


15-1179762759
Dawid,
2007-05-21 19:52
2007.06.17
Основы программирования