📄 ch20.htm
字号:
private:
TListHierarchy *Hierarchy;
Currency FCost;
TDateTime FTimeCreated;
AnsiString FDescription;
void __fastcall SetTimeCreated(AnsiString S);
AnsiString __fastcall GetTimeCreated();
protected:
virtual void __fastcall
Paint(void);
public:
__fastcall virtual TWidget(TComponent *AOwner): TCustomControl(AOwner)
{ Hierarchy = new TListHierarchy(); Width = 25; Height = 25; }
__fastcall virtual TWidget(TComponent *AOwner, int ACol, int ARow);
__fastcall
virtual ~TWidget() { delete Hierarchy; }
virtual AnsiString GetName() { return "Widgets"; }
TStringList *GetHierarchy() { return Hierarchy->GetHierarchy(this); }
void __fastcall WidgetMouseDown(TObject *Sender, TMouseButton
Button,
TShiftState Shift, int X, int Y);
__published:
__property Currency Cost={read=FCost, write=FCost};
__property AnsiString TimeCreated={read=GetTimeCreated, write=SetTimeCreated};
__property AnsiString
Description={read=FDescription, write=FDescription};
};
#endif
</FONT></PRE>
<P><A NAME="Heading17"></A><FONT COLOR="#000077"><B>Listing 20.3. The main file for
the Widgets units.</B></FONT></P>
<PRE><FONT
COLOR="#0066FF">///////////////////////////////////////
// Widgets.cpp
// Learning how to use objects
// Copyright (c) 1997 by Charlie Calvert
//
#include <vcl\vcl.h>
#include <conio.h>
#pragma hdrstop
#include
"widgets.h"
#pragma link "myobject.obj"
void WriteWidgetToStream(AnsiString StreamName, TWidget *Widget)
{
TFileStream *Stream = new TFileStream(StreamName, fmCreate | fmOpenRead);
Stream->WriteComponent(Widget);
delete Stream;
}
TWidget *ReadWidgetFromStream(AnsiString StreamName)
{
Widgets::Register();
TFileStream *Stream = new TFileStream(StreamName, fmOpenRead);
TWidget *Widget = (TWidget *)Stream->ReadComponent(NULL);
delete Stream;
return Widget;
}
__fastcall TWidget::TWidget(TComponent *AOwner, int ACol, int ARow)
: TCustomControl(AOwner)
{
Hierarchy = new TListHierarchy();
Left = ACol;
Top = ARow;
Width = 25;
Height = 25;
OnMouseDown = WidgetMouseDown;
}
AnsiString __fastcall TWidget::GetTimeCreated()
{
return FTimeCreated.DateTimeString();
}
void __fastcall TWidget::SetTimeCreated(AnsiString S)
{
FTimeCreated = TDateTime(S);
}
void__fastcall TWidget::Paint()
{
Canvas->Brush->Color = clBlue;
Canvas->Rectangle(0, 0, ClientWidth, ClientHeight);
Canvas->Brush->Color = clYellow;
Canvas->Ellipse(0, 0, ClientWidth, ClientHeight);
}
void __fastcall TWidget::WidgetMouseDown(TObject
*Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
ShowMessage(Format("%m", OPENARRAY(TVarRec, (FCost))));
}
namespace Widgets
{
void __fastcall Register()
{
TComponentClass classes[1] =
{__classid(TWidget)};
RegisterClasses(classes, 0);
}
}
</FONT></PRE>
<P><A NAME="Heading18"></A><FONT COLOR="#000077"><B>Listing 20.4. The header file
for MyObjects with the new TListHiearchy object added to it.</B></FONT></P>
<PRE><FONT
COLOR="#0066FF">///////////////////////////////////////
// MyObject.h
// Learning how to use objects
// Copyright (c) 1997 by Charlie Calvert
//
#ifndef MyObjectH
#define MyObjectH
#include <conio.h>
#include <vcl\stdctrls.hpp>
class TMyObject :public TObject
{
protected:
virtual void PrintString(AnsiString S);
public:
TMyObject() : TObject() {}
void ShowHierarchy(TObject *AnObject);
};
class TListHierarchy: public TMyObject
{
private:
TStringList
*FList;
protected:
virtual void PrintString(AnsiString S)
{ FList->Add(S); }
public:
TListHierarchy() { FList = new TStringList(); }
__fastcall virtual ~TListHierarchy() { delete FList; }
TStringList *GetHierarchy(TObject
*AnObject)
{ ShowHierarchy(AnObject); return FList; }
};
class __declspec(delphiclass) TVCLHierarchy;
class THierarchy: public TMyObject
{
friend TVCLHierarchy;
int FTextColor;
int FBackColor;
protected:
virtual void
SetTextColor(int Color)
{ FTextColor = Color; textcolor(FTextColor); }
virtual void SetBackColor(int Color)
{ FBackColor = Color; textbackground(FBackColor); }
public:
THierarchy() : TMyObject() {}
virtual void
PrintString(AnsiString S);
virtual void ClrScr();
__property int TextColor={read=FTextColor,write=SetTextColor};
__property int BackColor={read=FBackColor,write=SetBackColor};
};
class TVCLHierarchy : public THierarchy
{
TMemo *FMemo;
protected:
virtual void SetTextColor(int Color)
{ FTextColor = Color; FMemo->Font->Color = TColor(FTextColor); }
virtual void SetBackColor(int Color)
{ FBackColor = Color; FMemo->Color = TColor(FBackColor); }
public:
TVCLHierarchy(TMemo *AMemo): THierarchy() { FMemo = AMemo; }
virtual void PrintString(AnsiString S)
{ FMemo->Lines->Add(S); }
virtual void ClrScr() { FMemo->Clear(); }
};
#endif
</FONT></PRE>
<P><A NAME="Heading19"></A><FONT
COLOR="#000077"><B>Listing 20.5. The main file of
the MyObject module.</B></FONT></P>
<PRE><FONT COLOR="#0066FF">///////////////////////////////////////
// MyObject.cpp
// Learning how to use objects
// Copyright (c) 1997 by Charlie Calvert
//
#include <vcl\vcl.h>
#include <conio.h>
#pragma hdrstop
#include "myobject.h"
void TMyObject::PrintString(AnsiString S)
{
printf("%s\n", S.c_str());
}
void TMyObject::ShowHierarchy(TObject *AnObject)
{
TClass AClass;
AnsiString AClassName = AnsiString(AnObject->ClassName()).c_str();
PrintString(AClassName);
AClass = AnObject->ClassParent();
while (True)
{
AClassName = AnsiString(AClass->ClassName());
PrintString(AClassName);
if (AClassName == "TObject")
break;
AClass = AClass->ClassParent();
}
}
void THierarchy::PrintString(AnsiString S)
{
char Temp[250];
sprintf(Temp, "%s\n\r", S.c_str());
cputs(Temp);
}
void THierarchy::ClrScr()
{
clrscr();
}
</FONT></PRE>
<P>The functionality associated with this program is still severely limited. An object
of type <TT>TWidget</TT> is created, and its hierarchy is shown. The program assigns
a
price to the widget, and a bare representation of a widget is displayed on the
screen. The program also saves and loads the <TT>Widget</TT> object to disk.</P>
<P>The output from this program is shown in Figure 20.2.<BR>
<BR>
<A
NAME="Heading20"></A><A HREF="20ebu02.jpg" tppabs="http://pbs.mcp.com/ebooks/0672310228/art/20/20ebu02.jpg">FIGURE 20.2.</A><FONT COLOR="#000077">
</FONT><I>The output from the Widget2 program.</I></P>
<P>From a user's point of view, this is pretty tame stuff. However, the declaration
for class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -