Форум: "Начинающим";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.043 c