![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TComboBox+TEdit
Тимофей © (2007-05-17 14:21:00)Друзья, товарищи, помогите пожалуйста с созданием компонента на базе TEdit и TComboBox. По задумке он должен по выбору единиц измерения из TComboBox менять значения в TEdit. Бросьте пожалуйста исходники. Заранее благодарю.
Тимофей (2007-05-23 12:06:00) [1]Спасибо огромное! Буду испытовать.
Плохиш (2007-05-22 16:31:00) [2]
> iXT © (22.05.07 14:21) [19]
> > Надо установить свойства Parent у создаваемых тобой компотентов
>
> > TEdit и TComboBox.
>
> И поэтому он не может создать DCU?
Я говорил про первый вариант, а измываться над телепатором по второму варианту, себе дороже :-)
DrAndrey (2007-05-22 16:19:00) [3]>Плохиш © (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 15:03:00) [4]
> Зачем скрещивать 2 нормальных компонента, чтобы получить
> одного уродца?!
Я бы рад отказаться от этой затеи, дак препод поставил эту задачу.
DrAndrey (2007-05-22 14:50:00) [5]to Тимофей: "Остров докторо Моро" Г.Уэлса читал? Зачем скрещивать 2 нормальных компонента, чтобы получить одного уродца?! Неделю уже ломаешь голову? Я в своё время тоже хотел объединить Едит со СпидБаттоном и рад, что отказался от этой затеи.
Johnmen (2007-05-22 14:46:00) [6]Что, припекает? Завтра сдавать? :)
Тимофей (2007-05-22 14:33:00) [7]А по первому варианту кто-нибудь подсказать что-нибуть может? Может быть перерисовку эдитов и боксов нужно совершать (создавать объект) при генерации формы? Прошу, умоляю помогите кодом!!!
iXT (2007-05-22 14:21:00) [8]> Надо установить свойства Parent у создаваемых тобой компотентов
> TEdit и TComboBox.
И поэтому он не может создать DCU? :)
Плохиш (2007-05-22 14:03:00) [9]
> Тимофей (22.05.07 13:45) [15]
Надо установить свойства Parent у создаваемых тобой компотентов TEdit и TComboBox.
iXT (2007-05-22 13:59:00) [10]"Не могу создать файл Unit1.dcu" Чем то занят наверное :)
Тимофей (2007-05-22 13:47:00) [11]Вот второй вариант. Мне с ним помогли, но компиляция не выполняется. Помогите пожалуйста найти здесь ошибку, если можете:
// -----------------------------------------------------------------------------
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'
Тимофей (2007-05-22 13:45:00) [12]Друзья, я прописал класс следующим образом:
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;
Пожалуйста, помогите найти ошибку. Компиляция проходит успешно.
iXT (2007-05-21 14:12:00) [13]В смысле мой :)
Jkmuf! (2007-05-21 14:03:00) [14]> [11] {RASkov} © (21.05.07 13:27)
Я ":)" Забыл написовать [10] - мой (Так получилось)
Сергей М. (2007-05-21 13:39:00) [15]
> Тимофей (21.05.07 12:32) [7]
> У меня уже дела продвинулись
Придется все же вернуть "дела" на стартовую позицию)
Компонент - это класс-наследник TComponent, а твой класс почему-то вдруг есть наследник TObject..
{RASkov} (2007-05-21 13:27:00) [16]> [10] Jkmuf! (21.05.07 12:56)
> Это класс:
Это Супер Класс )
И оно(чудо) точно не может сожержать на себе контролы(в данном случае TComboBox и TEdit). И куда это чудо их помещает(кто их "рисует") фик знает.
Jkmuf! (2007-05-21 12:56:00) [17][9] {RASkov} © (21.05.07 12:43)
> да и само чудо фик знает кто оно...
Это класс:
> TComBEdit = class
{RASkov} (2007-05-21 12:43:00) [18]> [7] Тимофей (21.05.07 12:32)
Только не говори, что у тебя, после создания твоего чуда, не видно ни комбо ни эдита... да и само чудо фик знает кто оно...
Плохиш (2007-05-21 12:36:00) [19]
> Тимофей (21.05.07 12:32) [7]
> У меня уже дела продвинулись. Написал класс, Delphi все
> компилирует
Врёшь... у тебя куча синтаксических ошибок в коде...
Тимофей (2007-05-21 12:32:00) [20]У меня уже дела продвинулись. Написал класс, 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;