Go Up to Windows Developer’s Guide
The C++Builder Developer’s Guide contains information for both Delphi and C++.
- Tip: To select the language you want to see, click the Display Preferences control, located in the upper right corner of the page.
- To see C++ information only, enable the C++ checkbox and disable the Delphi checkbox, as shown here:
Contents
- 1 Part I: Programming with C++Builder
- 1.1 Developing Applications with C++Builder
- 1.2 Understanding the Component Library
- 1.3 Working with Components Index
- 1.4 Working with Controls Index
- 1.5 Building Applications, Components, and Libraries Index
- 1.6 Developing the Application User Interface Index
- 1.7 Types of Controls Index
- 1.8 Working with Graphics and Multimedia Index
- 1.9 Writing Multithreaded Applications Index
- 1.10 Exception Handling in C++Builder
- 1.11 Working with Packages and Components Index
- 1.12 Creating International Applications Index
- 1.13 Deploying RAD Studio Applications
- 2 Part II: Developing Database Applications
- 2.1 Designing Database Applications — Overview
- 2.2 Using Data Controls
- 2.3 Connecting to Databases Index
- 2.4 Understanding Datasets Index
- 2.5 Working with Field Components Index
- 2.6 Using BDE Index
- 2.7 Using Client Datasets Index
- 2.8 Using Provider Components Index
- 2.9 Creating Multi-Tiered Applications Index
- 2.10 Using XML in Database Applications Index
- 3 Part III: Writing Internet Applications
- 3.1 Creating Internet Server Applications Index
- 3.2 Using Web Broker Index
- 3.3 Using Web Services Index
- 3.4 Working with Sockets
- 4 Part IV: Developing COM-based Applications Index
- 4.1 Overview of COM Technologies
- 4.2 Working with Type Libraries
- 4.3 Creating COM Clients
- 4.4 Creating Simple COM Servers
- 4.5 Creating an Active Server Page
- 4.6 Using ActiveX Controls
- 5 Part V: Component Writer’s Guide
- 6 See Also
Part I: Programming with C++Builder
Developing Applications with C++Builder
- Integrated Development Environment
- Designing Applications
- Creating Projects
- Editing Code
- Compiling Applications
- Debugging Applications
- Deploying Applications
Understanding the Component Library
- Understanding the Component Library
- Properties, Methods, and Events
- Types of Events
- Properties, Methods, and Events
- Objects, Components, and Controls
- TObject Branch
- TPersistent Branch
- TComponent Branch
- TControl Branch
- TWinControl Branch
Working with Components Index
- Setting Properties and Events
-
- Using Property Editors
-
- Calling Methods
- Working with Events and Event Handlers
- Generating a New Event Handler
- Generating a Handler for a Component’s Default Event
- Locating Event Handlers
- Associating an Event with an Existing Event Handler
- Using the Sender Parameter
- Displaying and Coding Shared Events
- Associating Menu Events with Event Handlers
- Deleting Event Handlers
- Adding Custom Components to the Tool Palette
Working with Controls Index
- Implementing Drag and Drop in Controls
- Starting a Drag Operation
- Accepting Dragged Items
- Dropping Items
- Ending a Drag Operation
- Customizing Drag and Drop with a Drag Object
- Changing the Drag Mouse Pointer
- Implementing Drag and Dock in Controls
- Making a Windowed Control a Docking Site
- Making a Control a Dockable Child
- Controlling How Child Controls Are Docked
- Controlling How Child Controls Are Undocked
- Controlling How Child Controls Respond to Drag-and-dock Operations
- Working with Text in Controls
- Setting Text Alignment
- Adding Scroll Bars at Run-Time
- Adding the Clipboard Object
- Selecting Text
- Selecting All Text
- Cutting, Copying, and Pasting Text
- Deleting Selected Text
- Disabling Menu Items
- Providing a Pop-up Menu
- Handling the OnPopup Event
- Adding Graphics to Controls
- Indicating That a Control Is Owner-drawn
- Adding Graphical Objects to a String List
- Adding Images to an Application
- Adding Images to a String List
- Drawing Owner-drawn Items
- Sizing Owner-draw Items
- Drawing Owner-draw Items
- Screen Scaling and ChangeScale
Building Applications, Components, and Libraries Index
- Creating Applications
- GUI Applications
- User Interface Models
- SDI Applications
- MDI Applications
- Setting IDE, Project, and Compiler Options
- Console Applications
- Service Applications
- Service Threads
- Service Name Properties
- Debugging Service Applications
- Programming Templates
- GUI Applications
- Creating Packages and DLLs
- When to Use Packages and DLLs
- Using DLLs in RAD Studio (C++)
- Creating DLLs in C++Builder
- Creating DLLs Containing VCL Components (C++)
- Linking DLLs (C++)
- Writing Database Applications
- Distributing Database Applications
- Creating Web Server Applications
- Creating Web Services Applications
- Creating WebBroker Applications
- Writing Applications Using COM
- Using Data Modules
- Creating and Editing Standard Data Modules
- Naming a Data Module and Its Unit File
- Placing and Naming Components
- Using Component Properties and Events in a Data Module
- ClassGroup pseudo-property of TDataModule
- Creating Business Rules in a Data Module
- Accessing a Data Module from a Form
- Adding a Remote Data Module to an Application Server Project
- Setting the Framework Affinity for a Data Module
- Creating and Editing Standard Data Modules
- Using the Object Repository
- Sharing Items Within a Project
- Adding Items to the Object Repository
- Sharing Objects in a Team Environment
- Using an Object Repository Item in a Project
- Using Project Templates
- Modifying Shared Items
- Enabling Help in Applications
- Calling HTML Help from Applications
- Types of HTML Help
- Default Handling of F1 Help in VCL Applications
- Customizing F1 Help in VCL Applications
- Showing Help with Help Buttons
- Associating Help with Menu Commands
- Showing Help About Selected Menu Commands
- Using the Hint Property to Show Contextual Help About Screen Objects
- Help System Interfaces
- Implementing ICustomHelpViewer
- Communicating with the Help Manager
- Asking the Help Manager for Information
- Displaying Keyword-based Help
- Displaying Tables of Contents
- Implementing IExtendedHelpViewer
- Using IHelpSystem
- Implementing IHelpSelector
- Registering Help System Objects
- Using Help in a VCL Application
- How TApplication Processes VCL Help
- How VCL Controls Process Help
- Calling a Help System Directly
- Calling HTML Help from Applications
Developing the Application User Interface Index
- Developing the Application User Interface — Overview
- Controlling Application Behavior
- Working at the Application Level
- Handling the Screen
- Using the Main Form
- Hiding the Main Form
- Adding Forms
- Managing Layout
- Using Forms
- Controlling When Forms Reside in Memory
- Displaying an Auto-created Form
- Creating Forms Dynamically
- Creating Modeless Forms Such as Windows
- Creating a Form Instance Using a Local Variable
- Passing Additional Arguments to Forms
- Retrieving Data from Forms
- Retrieving Data from Modal Forms
- Retrieving Data from Modeless Forms
- Controlling When Forms Reside in Memory
- Reusing Components and Groups of Components
- Creating and Using Component Templates
- Working with Frames
- Creating Frames
- Using and Modifying Frames
- Sharing Frames
- Developing Dialog Boxes
- Using Windows Common Dialog Boxes
- Creating and Managing Menus
- Opening the Menu Designer
- Building Menus
- Naming Menus
- Naming the Menu Items
- Adding, Inserting, and Deleting Menu Items
- Adding Separator Bars
- Specifying Accelerator Keys and Keyboard Shortcuts
- Creating Submenus
- Moving Menu Items
- Adding Images to Menu Items
- Viewing the Menu
- Editing Menu Items in the Object Inspector
- Switching Between Menus at Design Time
- Using Menu Templates
- Saving a Menu as a Template
- Naming Conventions for Template Menu Items and Event Handlers
- Manipulating Menu Items at Runtime
- Merging Menus
- Specifying the Active Menu: Menu Property
- Determining the Order of Merged Menu Items: GroupIndex Property
- Importing Resource Files
- Designing Toolbars and Cool Bars
- Adding a Toolbar Using a Panel Component
- Adding a Speed Button to a Panel
- Assigning a Speed Button’s Glyph
- Setting the Initial Condition of a Speed Button
- Creating a Group of Speed Buttons
- Allowing Toggle Buttons
- Adding a Toolbar Using the Toolbar Component
- Adding a Tool Button
- Assigning Images to Tool Buttons
- Setting Tool Button Appearance and Initial Conditions
- Creating Groups of Tool Buttons
- Allowing Toggled Tool Buttons
- Adding a Cool Bar Component
- Setting the Appearance of the Cool Bar
- Responding to Clicks
- Assigning a Menu to a Tool Button
- Adding Hidden Toolbars
- Hiding and Showing Toolbars
- Adding a Toolbar Using a Panel Component
- Common Controls and XP Themes
Types of Controls Index
- Text Controls
- Edit Controls
- Memo and Rich Edit Controls
- Text Viewing Controls
- Labels
- Edit Controls
- Specialized Input Controls
- Scroll Bars
- Track Bars
- Up-down Controls
- Hot Key Controls
- Splitter Controls
- Buttons and Similar Controls
- Button Controls
- Bitmap Buttons
- Speed Buttons
- Check Boxes
- Radio Buttons
- Toolbar Controls
- Cool Bars
- List Controls
- List Boxes and Check-list Boxes
- Combo Boxes
- Tree Views
- List Views
- Grouping Controls
- Group Boxes and Radio Groups
- Panels
- Scroll Boxes
- Tab Controls
- Page Controls
- Header Controls
- Display Controls
- Status Bars
- Progress Bars
- Help and Hint Properties
- VCL Taskbars
- Grids
- Draw Grids
- String Grids
- Value List Editors
- Graphic Controls
- Images
- Shapes
- Bevels
- Paint Boxes
- Animation Control
Working with Graphics and Multimedia Index
- Working with Graphics and Multimedia — Overview
- Overview of Graphics Programming
- Refreshing the Screen
- Types of Graphic Objects
- Common Properties and Methods of Canvas
- Using the Properties of the Canvas Object
- Creating Drawing Spaces
- Colors
- Printing
- Using Pens
- Changing the Pen Color
- Changing the Pen Width
- Changing the Pen Style
- Changing the Pen Mode
- Getting the Pen Position
- Using Brushes
- Changing the Brush Color
- Changing the Brush Style
- Setting the Brush Bitmap Property
- Reading and Setting Pixels
- Using Canvas Methods to Draw Graphic Objects
- Drawing Lines and Polylines
- Drawing Lines
- Drawing Polylines
- Drawing Shapes
- Drawing Rectangles and Ellipses
- Drawing Rounded Rectangles
- Drawing Polygons
- Drawing Lines and Polylines
- Handling Multiple Drawing Objects in Your Application
- Keeping Track of Which Drawing Tool to Use
- Changing the Tool with Speed Buttons
- Using Drawing Tools
- Drawing Shapes (Code)
- Sharing Code Among Event Handlers
- Drawing On a Graphic
- Making Scrollable Graphics
- Adding an Image Control
- Placing the Control
- Setting the Initial Bitmap Size
- Drawing On the Bitmap
- Loading and Saving Graphics Files
- Loading a Picture from a File
- Saving a Picture to a File
- Replacing the Picture
- Using the Clipboard with Graphics
- Copying Graphics to the Clipboard
- Cutting Graphics to the Clipboard
- Pasting Graphics from the Clipboard
- Rubber Banding Example
- Responding to the Mouse
- What’s in a Mouse Event
- Responding to a Mouse-down Action
- Responding to a Mouse-up Action
- Responding to a Mouse Move
- Adding a Field to a Form Object to Track Mouse Actions
- Refining Line Drawing
- Tracking the Origin Point
- Tracking Movement
- Responding to the Mouse
- Working with Multimedia
- Adding Silent Video Clips to an Application
- Example of Adding Silent Video Clips
- Adding Audio or Video Clips to an Application
- Example of Adding Audio or Video Clips (VCL Only)
- Adding Silent Video Clips to an Application
Writing Multithreaded Applications Index
- Writing Multi-threaded Applications
- Defining thread objects
- Defining Thread Objects
- Initializing the Thread
- Writing the Thread Function
- Using Thread-local Variables
- Checking for Termination by Other Threads
- Handling Exceptions in the Thread Function
- Writing Clean-up Code
- Coordinating threads
- Coordinating Threads
- Avoiding Simultaneous Access
- Locking Objects
- Using Critical Sections
- Using the Multi-read Exclusive-write Synchronizer
- Other Techniques for Sharing Memory
- Waiting for Other Threads
- Waiting for a Thread to Finish Executing
- Waiting for a Task to Be Completed
- Executing thread objects
- Executing Thread Objects
- Overriding the Default Priority
- Starting and Stopping Threads
- Debugging Multi-threaded Applications
- Naming a Thread
- Converting an Unnamed Thread to a Named Thread
- Assigning Separate Names to Similar Threads
- Naming a Thread
Exception Handling in C++Builder
- Standard C++ Exception Handling
- Standard C++ Exception Handling Syntax
- Rethrowing Exceptions (C++)
- Exception Specifications (C++)
- Unwinding Exceptions (C++)
- Constructors in Exception Handling (C++)
- Handling Uncaught and Unexpected Exceptions (C++)
- Leaking C++ Exceptions into Delphi RTL
- Structured Exceptions Under Win32 (C++)
- Syntax of Structured Exceptions (C++)
- Handling Structured Exceptions (C++)
- Filtering Structured Exceptions (C++)
- Mixing Standard Exceptions with Structured Exceptions (C++)
- Defining Structured Exceptions (C++)
- Raising Structured Exceptions (C++)
- SEH Termination Blocks (C++)
- Delphi Exception Handling in C++
- C++Builder Exception Handling Compiler Options
- External Exception EEFFACE
Working with Packages and Components Index
- Working with Packages and Components — Overview
- Why Use Packages
- Packages and Standard DLLs
- Runtime Packages
- Loading Packages in an Application
- Loading Packages with the LoadPackage Function
- Deciding Which Runtime Packages to Use
- Custom Packages
- Loading Packages in an Application
- Design-time Packages
- Installing Component Packages
- Creating and Editing Packages
- Creating a Package
- Editing an Existing Package
- Understanding the Structure of a Package
- Editing Package Source Files Manually
- Compiling Packages
- Package-specific Compiler Directives
- Using the Weak Packaging Directive
- Compiling and Linking from the Command Line
- Package Files Created by Compiling
- Building Static Packages
- Deploying Packages
- Packaging Components Or Libraries Written In Classic and Clang C++ Win32 Compilers
Creating International Applications Index
- Internationalization and Localization
- Internationalizing Applications
- Enabling Application Code to Work for Different Locales
- Character Sets
- Including Bi-directional Functionality in Applications
- Locale-specific Features
- Enabling Application Code to Work for Different Locales
- Localizing Applications
- Localization Considerations in UI Design
- Text
- Graphic Images
- Formats and Sort Order
- Keyboard Mappings
- Isolating Resources
- Using Resource DLLs
- Creating Resource DLLs
- Dynamic Switching of Resource DLLs
- Localization Considerations in UI Design
- Internationalizing Applications
- Deploying Localized Applications
Deploying RAD Studio Applications
- Deploying Applications — Overview
- Deploying General Applications
- Using Installation Programs
- Identifying Application Files
- Application Files, Listed by File Name Extension
- Package Files
- Deploying ActiveX Controls
- Helper Applications
- DLL Locations
- Using Installation Programs
- Deploying Database Applications
- Deploying dbExpress Database Applications
- Deploying BDE Applications
- BDE
- Deploying Web Applications
- Programming for Varying Host Environments
- Screen Resolutions and Color Depths
- Considerations When Dynamically Resizing Forms and Controls
- Considerations When Not Dynamically Resizing
- Accommodating Varying Color Depths
- Fonts
- Operating System Versions
- Software License Requirements
Part II: Developing Database Applications
Designing Database Applications — Overview
- Using Databases
- Types of Databases
- Database Security
- Transactions
- Referential Integrity, Stored Procedures, and Triggers
- Database Architecture
- Connecting Directly to a Database Server
- Using a Dedicated File on Disk
- Connecting to Another Dataset
- Connecting a Client Dataset to Another Dataset in the Same Application
- Using a Multi-Tiered Architecture
- Combining Approaches
- Designing the User Interface
- Analyzing Data
Using Data Controls
- Using Common Data Control Features
- Associating a Data Control with a Dataset
- Changing the Associated Dataset at Runtime
- Enabling and Disabling the Data Source
- Responding to Changes Mediated by the Data Source
- Editing and Updating Data
- Enabling Editing in Controls On User Entry
- Editing Data in a Control
- Disabling and Enabling Data Display
- Refreshing Data Display
- Enabling Mouse, Keyboard, and Timer Events
- Associating a Data Control with a Dataset
- Choosing How to Organize the Data
- Displaying a Single Record
- Displaying Data as Labels
- Displaying and Editing Fields in an Edit Box
- Displaying and Editing Text in a Memo Control
- Displaying and Editing Text in a Rich Edit Memo Control
- Displaying and Editing Graphics Fields in an Image Control
- Displaying and Editing Data in List and Combo Boxes
- Displaying and Editing Data in Lookup List and Combo Boxes
- Using TDBListBox and TDBComboBox
- Handling Boolean Field Values with Check Boxes
- Restricting Field Values with Radio Controls
- Displaying Multiple Records
- Viewing and Editing Data with TDBGrid
- Using a Grid Control in Its Default State
- Creating a Customized Grid
- Creating Persistent Columns
- Deleting Persistent Columns
- Arranging the Order of Persistent Columns
- Setting Column Properties at Design Time
- Defining a Lookup List Column
- Putting a Button in a Column
- Restoring Default Values to a Column
- Displaying ADT and Array Fields
- Setting Grid Options
- Editing in the Grid
- Controlling Grid Drawing
- Responding to User Actions at Runtime
- Creating a Grid That Contains Other Data-aware Controls
- Navigating and Manipulating Records
- Choosing Navigator Buttons to Display
- Displaying Fly-over Help
- Using a Single Navigator for Multiple Datasets
Connecting to Databases Index
- Connecting to Databases — Overview
- Using Implicit Connections
- Controlling Connections
- Connecting to a Database Server
- Disconnecting from a Database Server
- Controlling Server Login
- Managing Transactions
- Specifying the Transaction Isolation Level
- Sending Commands to the Server
- Working with Associated Datasets
- Obtaining Metadata
Understanding Datasets Index
- Understanding Datasets — Overview
- Using TDataSet Descendants
- Determining Dataset States
- Opening and Closing Datasets
- Navigating Datasets
- Using the First and Last Methods
- Using the Next and Prior Methods
- Using the MoveBy Method
- Using the Eof and Bof Properties
- Marking and Returning to Records
- Searching Datasets
- Using Locate
- Using Lookup
- Displaying and Editing a Subset of Data Using Filters
- Enabling and Disabling Filtering
- Creating Filters
- Setting the Filter Property
- Writing an OnFilterRecord Event Handler
- Setting Filter Options
- Navigating Records in a Filtered Dataset
- Modifying Data
- Editing Records
- Adding New Records
- Deleting Records
- Posting Data
- Canceling Changes
- Modifying Entire Records
- Calculating Fields
- Types of Datasets
- Using Table Type Datasets
- Sorting Records with Indexes
- Obtaining Information About Indexes
- Specifying an Index with IndexName
- Creating an Index with IndexFieldNames
- Using Indexes to Search for Records
- Executing a Search with Goto Methods
- Executing a Search with Find Methods
- Specifying the Current Record After a Successful Search
- Searching On Partial Keys
- Repeating or Extending a Search
- Limiting Records with Ranges
- Understanding the Differences Between Ranges and Filters
- Specifying Ranges
- Modifying a Range
- Applying or Canceling a Range
- Creating Master-Detail Relationships
- Making the Table a Detail of Another Dataset
- Using Nested Detail Tables
- Controlling Read-Write Access to Tables
- Creating and Deleting Tables
- Emptying Tables
- Synchronizing Tables
- Sorting Records with Indexes
- Using Query-type Datasets
- Specifying the Query
- Using Parameters in Queries
- Supplying Parameters at Design Time
- Supplying Parameters at Runtime
- Establishing Master-detail Relationships Using Parameters
- Preparing Queries
- Executing Queries That Don’t Return a Result Set
- Using Unidirectional Result Sets
- Using Stored Procedure-type Datasets
- Working with Stored Procedure Parameters
- Preparing Stored Procedures
- Executing Stored Procedures That Don’t Return a Result Set
- Fetching Multiple Result Sets
Working with Field Components Index
- Working with Field Components — Overview
- Dynamic Field Components
- Persistent Field Components
- Creating Persistent Fields
- Arranging Persistent Fields
- Defining New Persistent Fields
- Defining a Data Field
- Defining a Calculated Field
- Programming a Calculated Field
- Defining a Lookup Field
- Defining an Aggregate Field
- Deleting Persistent Field Components
- Setting Persistent Field Properties and Events
- Setting Display and Edit Properties at Design Time
- Setting Field Component Properties at Runtime
- Creating Attribute Sets for Field Components
- Associating Attribute Sets with Field Components
- Removing Attribute Associations
- Controlling and Masking User Input
- Using Default Formatting for Numeric, Date, and Time Fields
- Handling Events
- Working with Field Component Methods at Runtime
- Displaying, Converting, and Accessing Field Values
- Displaying Field Component Values in Standard Controls
- Converting Field Values
- Accessing Field Values with the Default Dataset Property
- Accessing Field Values with a Dataset’s FieldByName Method
- Accessing Field Values with a Dataset’s Fields Property
- Setting a Default Value for a Field
- Working with Constraints
- Creating a Custom Constraint
- Using Server Constraints
- Using Object Fields
- Working with ADT Fields
- Working with Array Fields
- Working with Dataset Fields
- Working with Reference Fields
Using BDE Index
- BDE-based Architecture
- Using BDE
- Executing an Update Statement
- Using Multiple Update Objects
- Connecting to databases with TDatabase
- Managing database sessions
- Using BDE-enabled datasets
- Using TBatchMove
- Using the BDE to cache updates
- Using transactions with the BDE=== Working with ADO Components Index===
- Working with ADO Components
- Overview of ADO Components
- Connecting to ADO Data Stores
- Connecting to a Data Store Using TADOConnection
- Accessing the Connection Object
- Fine-tuning a Connection
- Forcing Asynchronous Connections
- Controlling Timeouts
- Indicating the Types of Operations the Connection Supports
- Specifying Whether the Connection Automatically Initiates Transactions
- Accessing the Connection’s Datasets
- ADO Connection Events
- Connecting to a Data Store Using TADOConnection
- Using ADO datasets
- Connecting an ADO Dataset to a Data Store
- Working with Record Sets
- Filtering Records Based On Bookmarks
- Filtering Multiple Rows Based On Update Status
- Fetching Records Asynchronously
- Using Batch Updates
- Loading Data from and Saving Data to Files
- Inspecting the Update Status of Individual Rows
- Opening the Dataset in Batch Update Mode
- Using TADODataSet
- Connecting an ADO Dataset to a Data Store
- Using Command Objects
- Specifying the Command
- Using the Execute Method
- Canceling Commands
- Retrieving Result Sets with Commands
- Applying the Batch Updates to Base Tables
- Canceling Batch Updates
- Handling Command Parameters=== Using dbExpress Components Index===
- Using dbExpress Datasets
- Types of dbExpress Datasets
- Connecting to a Database Server Using dbExpress
- Setting Up TSQLConnection
- Specifying What Data to Display
- Representing the Results of a Query
- Representing the Records in a Table
- Representing the Results of a Stored Procedure
- Fetching the Data
- Executing Commands That Do Not Return Records
- Specifying the Command to Execute
- Executing the Command
- Creating and Modifying Server Metadata
- Setting Up Master-Detail Linked Relationships
- Accessing dbExpress Schema Information
- Fetching Metadata into a dbExpress Dataset
- The Structure of Metadata Datasets
- Debugging dbExpress Applications
Using Client Datasets Index
- Using Client Datasets — Overview
- Working with Data Using a Client Dataset
- Navigating Data in Client Datasets
- Limiting What Records Appear
- Editing Data
- Undoing Changes
- Saving Changes
- Constraining Data Values
- Sorting and Indexing
- Adding a New Index
- Deleting and Switching Indexes
- Using Indexes to Group Data
- Representing Calculated Values
- Using Internally Calculated Fields in Client Datasets
- Using Maintained Aggregates
- Specifying Aggregates
- Aggregating over groups of records
- Obtaining Aggregate Values
- Copying Data from Another Dataset
- Assigning Data Directly
- Cloning a Client Dataset Cursor
- Adding Application-specific Information to the Data
- Using a Client Dataset to Cache Updates
- Overview of Using Cached Updates
- Choosing the Type of Dataset for Caching Updates
- Indicating What Records Are Modified
- Updating Records
- Applying Updates
- Intervening as Updates Are Applied
- Reconciling Update Errors
- Using a Client Dataset with a Provider
- Specifying a Provider
- Requesting Data from the Source Dataset or Document
- Getting Parameters from the Application Server
- Passing Parameters to the Source Dataset
- Sending Query or Stored Procedure Parameters
- Limiting Records with Parameters
- Handling Constraints from the Server
- Refreshing Records
- Communicating with Providers Using Custom Events
- Overriding the Dataset On the Application Server
- Using a Client Dataset with File-based Data
- Creating a New Dataset
- Loading Data from a File or Stream
- Merging Changes into Data
- Saving Data to a File or Stream
- Using a Simple Dataset
- When to Use TSimpleDataSet
- Setting Up a Simple Dataset
Using Provider Components Index
- Using Provider Components
- Determining the Source of Data
- Communicating with the Client Dataset
- Choosing How to Apply Updates Using a Dataset Provider
- Controlling What Information Is Included in Data Packets
- Specifying What Fields Appear in Data Packets
- Setting Options That Influence the Data Packets
- Adding Custom Information to Data Packets
- Responding to Client Data Requests
- Responding to Client Update Requests
- Editing Delta Packets Before Updating the Database
- Influencing How Updates Are Applied
- Screening Individual Updates
- Resolving Update Errors On the Provider
- Applying Updates to Datasets That do Not Represent a Single Table
- Responding to Client-generated Events
- Handling Server Constraints
Creating Multi-Tiered Applications Index
- Creating Multi-tiered Applications — Overview
- Advantages of the Multi-tiered Database Model
- Understanding Multi-tiered Database Applications
- Overview of a Three-tiered Application
- The Structure of the Client Application
- The Structure of the Application Server
- Using Transactional Data Modules (COM)
- Data Module Lifetime Management
- Choosing a Connection Protocol
- Using dbExpress Connections
- Using DCOM Connections
- Using SOAP Connections
- Using Socket Connections
- Using Web Connections
- Building a Multi-tiered Application
- Creating the Server Application
- Filtering the DataSnap Communication Stream
- Setting Up the Data Module
- Configuring DataSnap Data Module
- Configuring TDSServerModule
- Configuring TRemoteDataModule
- Configuring TMTSDataModule
- Configuring TSOAPDataModule
- Using Multiple Server Data Modules (COM)
- Extending the Interface of the Application Server (COM)
- Managing Transactions in Multi-tiered Applications (COM)
- Supporting Master/detail Relationships
- Supporting State Information in Exposed Data Modules
- Registering the Application Server
- Creating the Client Application
- Connecting to the Application Server
- Specifying a Connection Using dbExpress
- Specifying a Connection Using DCOM
- Specifying a Connection Using Sockets
- Specifying a Connection Using HTTP
- Specifying a Connection Using SOAP
- Brokering Connections
- Managing Server Connections
- Connecting to the Server
- Dropping or Changing a Server Connection
- Calling Server Interfaces
- Connecting to an Application Server That Uses Multiple Data Modules
- Connecting to the Application Server
- Writing Web-based Client Applications
- Distributing a Client Application as an ActiveX Control
- Creating an Active Form for the Client Application
- Using an XML Broker
- Distributing a Client Application as an ActiveX Control
Using XML in Database Applications Index
- Using XML in Database Applications
- Defining Transformations
- Mapping Between XML Nodes and Data Packet Fields
- Using XMLMapper
- Converting XML Documents into Data Packets
- Using an XML Document as the Source for a Provider
- Using an XML Document as the Client of a Provider
Part III: Writing Internet Applications
Creating Internet Server Applications Index
- Creating Internet Applications — Overview
- About Web Broker
- Terminology and standards
- Terminology and Standards
- Parts of a Uniform Resource Locator
- HTTP Request Header Information
- HTTP server activity
- Composing Client Requests
- HTTP Server Activity
- Responding to Client Requests
- Serving Client Requests
- Types of Web Server Applications
- Debugging server applications
- Debugging Web Applications That Are DLLs
- Debugging Server Applications
Using Web Broker Index
- Using Web Broker
- Creating Web Server Applications with Web Broker
- The Web Application Object
- The Web Module
- The Structure of a Web Broker Application
- The Web Dispatcher
- Adding Actions to the Dispatcher
- Dispatching Request Messages
- Action Items
- Determining When Action Items Fire
- The Target URL
- The Request Method Type
- Enabling and Disabling Action Items
- Choosing a Default Action Item
- Responding to Request Messages with Action Items
- Determining When Action Items Fire
- Accessing Client Request Information
- Properties That Contain Request Header Information
- Properties That Identify the Target
- Properties That Describe the Web Client
- Properties That Identify the Purpose of the Request
- Properties That Describe the Expected Response
- Properties That Describe the Content
- The Content of HTTP Request Messages
- Properties That Contain Request Header Information
- Creating HTTP Response Messages
- Filling in the Response Header
- Indicating the Response Status
- Indicating the Need for Client Action
- Describing the Server Application
- Describing the Content
- Setting the Response Content
- Sending the Response
- Filling in the Response Header
- Generating the Content of Response Messages
- Using Page Producer Components
- HTML Templates
- Specifying the HTML Template
- Converting HTML-transparent Tags
- Using Page Producers from an Action Item
- Chaining Page Producers Together
- Using Predefined HTML-transparent Tag Names
- Using Page Producer Components
- Using Database Information in Responses
- Adding a Session to the Web Module
- Representing a Dataset in HTML
- Using Dataset Page Producers
- Using Table Producers
- Specifying the Table Attributes
- Specifying the Row Attributes
- Specifying the Columns
- Embedding Tables in HTML Documents
- Using TDataSetTableProducer
- Using TQueryTableProducer ===Using IntraWeb (VCL for the Web) Index===
- Getting started with IntraWeb
- Creating Web Server Applications Using IntraWeb
- Using IntraWeb Components
- Using IntraWeb with Web Broker ===Working with XML documents===
- Working with XML Documents
- Using the Document Object Model
- Working with XML Components
- Using TXMLDocument
- Working with XML Nodes
- Abstracting XML Documents with the Data Binding Wizard
- Using the XML Data Binding Wizard
- Using Code That the XML Data Binding Wizard Generates
Using Web Services Index
- Using Web Services
- Understanding Invokable Interfaces
- Using Nonscalar Types in Invokable Interfaces
- Registering Nonscalar Types
- Using Remotable Objects
- Remotable Object Example
- Using Nonscalar Types in Invokable Interfaces
- Writing Servers that Support Web Services
- Using the SOAP Application Wizard
- Adding New Web Services
- Using the WSDL Importer
- Defining and Using SOAP Headers
- Creating Custom Exception Classes for Web Services
- Generating WSDL Documents for a Web Service Application
- Writing Clients for Web Services
- Importing WSDL Documents
- Calling Invokable Interfaces
- Processing Headers in Client Applications
Working with Sockets
- Working with Sockets
- Installing Socket Components
- Implementing Services Overview
- Understanding Service Protocols
- Services and Ports
- Types of Socket Connections
- Client Connections
- Listening Connections
- Server Connections
- Describing Sockets
- Describing the Host
- Using Ports
- Using Socket Components — Overview
- Getting Information About the Client or Server Socket Connection
- Using Client Sockets
- Specifying the Desired Server
- Forming the Connection
- Getting Information About the Client Socket Connection
- Closing the Connection
- Using Server Sockets
- Specifying the Port
- Listening for Client Requests
- Connecting to Clients
- Closing Server Connections Overview
- Responding to Socket Events
- Error Events
- Client Events
- Server Events
- Reading and Writing Over Socket Connections — Overview
- Non-blocking Connections
- Reading and Writing Events
- Blocking Connections
- Non-blocking Connections
Part IV: Developing COM-based Applications Index
Overview of COM Technologies
- Overview of COM Technologies
- C++Builder Uses DAX for ActiveX and COM
- Parts of a COM Application
- COM Interfaces
- The Fundamental COM Interface, IUnknown
- COM Interface Pointers
- COM Servers
- CoClasses and Class Factories
- In-process, Out-of-process, and Remote Servers
- The Marshaling Mechanism
- Aggregation (COM)
- COM Clients
- COM Interfaces
- COM Extensions
- Automation Servers
- Active Server Pages
- ActiveX Controls
- Active Documents
- Type Libraries
- Implementing COM Objects with Wizards
- Code Generated by Wizards
- COM+ Event And Event Subscriber Objects
Working with Type Libraries
- Working with Type Libraries — Overview
- Type Library Editor
- Parts of the Type Library Editor
- Toolbar
- Object List Pane
- Status Bar
- Pages of Type Information
- Type Library Elements
- Parts of the Type Library Editor
- Using the Type Library Editor
- Valid Types
- Using Delphi or RIDL Syntax
- RIDL File
- GenTLB.exe
- SafeArrays
- Creating a New Type Library
- Opening an Existing Type Library
- Adding an Interface to the Type Library
- Modifying an Interface Using the Type Library
- Adding Properties and Methods to the Type Library
- Adding a CoClass to the Type Library
- Adding an Interface to a CoClass
- Adding an Enumeration to the Type Library
- Adding an Alias to the Type Library
- Adding a Record or Union to the Type Library
- Adding a Module to the Type Library
- Saving and Registering Type Library Information
- Apply Updates Dialog
- Saving a Type Library
- Refreshing the Type Library
- Registering the Type Library
- Deploying Type Libraries
Creating COM Clients
- Creating COM Clients
- Importing Type Library Information
- Code Generated When You Import Type Library Information
- Controlling an Imported Object
- Using Component Wrappers
- Writing Client Code Based On Type Library Definitions
- Connecting to a Server
- Controlling an Automation Server Using a Dispatch Interface
- Controlling an Automation Server Using a Dual Interface
- Handling Events in an Automation Controller
- Creating Clients for Servers That Do Not Have a Type Library
Creating Simple COM Servers
- Creating Simple COM Servers — Overview
- Designing a COM Object
- Using the COM Object Wizard
- Using the Automation Object Wizard
- COM Object Instancing Types
- Choosing a Threading Model
- Defining a COM Object’s Interface
- Managing Events in Your Automation Object
- Automation Interfaces
- Dual Interfaces
- Dispatch Interfaces
- Custom Interfaces
- Marshaling Data
- Registering a COM Object
- Current-User Registration for ActiveX Servers
- Testing and Debugging the Application
Creating an Active Server Page
- Creating an Active Server Object
- Creating Active Server Pages — Overview
- Using the ASP Intrinsics
- Creating ASPs for In-process or Out-of-process Servers
- Registering an Active Server Object
- Testing and Debugging the Active Server Page Application
Using ActiveX Controls
- Creating an ActiveX Control
- Elements of an ActiveX Control
- Designing an ActiveX Control
- Generating an ActiveX Control from a VCL Control
- Generating an Active Form Based on a VCL Form
- Licensing ActiveX Controls
- Customizing the ActiveX Control’s Interface
- Adding Additional Properties, Methods, and Events
- Adding Events
- Adding Properties
- Enabling Simple Data Binding with the Type Library
- Adding Additional Properties, Methods, and Events
- Creating a Property Page for an ActiveX Control
- Creating a New Property Page
- Adding Controls to a Property Page
- Associating Property Page Controls with ActiveX Control Properties
- Updating the Property Page
- Updating the Object
- Connecting a Property Page to an ActiveX Control
- Registering an ActiveX Control
- Testing an ActiveX Control
- Creating a 64-bit Windows C++ ActiveX Form or ActiveX Control (C++)
Part V: Component Writer’s Guide
- Introduction to Component Creation
- Object-oriented Programming for Component Writers
- Creating Properties
- Creating Events
- Creating Methods
- Using Graphics in Components
- Using Messages
- Making Components Available at Design Time
- Modifying an Existing Component
- Creating a Graphic Component
- Customizing a Grid
- Making a Control Data Aware
- Making a Dialog Box a Component
- Extending the IDE (Tools API)
- Deploying Components
- Packaging Components Or Libraries Written In Classic and Clang C++ Win32 Compilers
See Also
- Language Support for the RAD Studio Libraries (C++)
Виктор Алексанкин, Наталия Елманова
Содержание
- Введение
- Среда разработки C++ Builder
- Компоненты C++ Builder
- Свойства компонентов
- События
- Методы
- Менеджер проектов
- Создание приложений в С++ Builder
- Пример: создание простейшего приложения
Введение
Borland C++ Builder — выпущенное недавно компанией Borland средство быстрой
азработки приложений, позволяющее создавать приложения на языке C++, используя
при этом среду разработки и библиотеку компонентов Delphi. В настоящей
статье рассматривается среда разработки C++ Builder и основные приемы,
применяемые при проектировании пользовательского интерфейса.
Среда разработки C++ Builder
C++ Builder представляет собой SDI-приложение, главное окно которого содержит
настраиваемую инструментальную панель (слева) и палитру компонентов (справа).
Помимо этого, по умолчанию при запуске C++ Builder появляются окно инспектора
объектов (слева) и форма нового приложения (справа). Под окном формы приложения
находится окно редактора кода.
Рис.1. Среда разработки C++ Builder
Формы являются основой приложений C++ Builder. Создание пользовательского
интерфейса приложения заключается в добавлении в окно формы элементов объектов
C++ Builder, называемых компонентами. Компоненты C++ Builder располагаются
на палитре компонентов, выполненной в виде многостраничного блокнота. Важная
особенность C++ Builder состоит в том, что он позволяет создавать собственные
компоненты и настраивать палитру компонентов, а также создавать различные
версии палитры компонентов для разных проектов.
Компоненты C++ Builder
Компоненты разделяются на видимые (визуальные) и невидимые (невизуальные).
Визуальные компоненты появляются во время выполнения точно так же, как
и во время проектирования. Примерами являются кнопки и редактируемые поля.
Невизуальные компоненты появляются во время проектирования как пиктограммы
на форме. Они никогда не видны во время выполнения, но обладают определенной
функциональностью (например, обеспечивают доступ к данным, вызывают стандартные
диалоги Windows 95 и др.)
Рис. 2. Пример использования видимых и невидимых компонентов
Для добавления компонента в форму можно выбрать мышью нужный компонент
в палитре и щелкнуть левой клавишей мыши в нужном месте проектируемой формы.
Компонент появится на форме, и далее его можно перемещать, менять размеры
и другие характеристики.
Каждый компонент C++ Builder имеет три разновидности характеристик:
свойства, события и методы.
Если выбрать компонент из палитры и добавить его к форме, инспектор
объектов автоматически покажет свойства и события, которые могут быть использованы
с тим компонентом. В верхней части инспектора объектов имеется выпадающий
список, позволяющий выбирать нужный объект из имеющихся на форме.
Рис.3. Инспектор объектов
Свойства компонентов
Свойства являются атрибутами компонента, определяющими его внешний вид
и поведение. Многие свойства компонента в колонке свойств имеют значение,
устанав иваемое по умолчанию (например, высота кнопок). Свойства компонента
отображаются а странице свойств (Properties). Инспектор объектов отображает
опубликованные (published) свойства компонентов. Помимо published-свойств,
компоненты могут и чаще всего имеют общие (public), опубликованные свойства,
которые доступны только во время выполнения приложения. Инспектор объектов
используется для установки свойств во время проектирования. Список свойств
располагается на странице свойств инспектора объектов. Можно определить
свойства во время проектирования или написать код для видоизменения свойств
компонента во время выполнения приложения.
При определении свойств компонента во время проектирования нужно выбрать
компонент на форме, открыть страницу свойств в инспекторе объектов, выбрать
определяемое свойство и изменить его с помощью редактора свойств (это может
быть п остое поле для ввода текста или числа, выпадающий список, раскрывающийся
список, диалоговая панель и т.д.).
События
Страница событий (Events) инспектора объектов показывает список событий,
распознаваемых компонентом (программирование для операционных систем с
графическим пользовательским интерфейсом, в частности, для Windows 95 или
Windows NT пре полагает описание реакции приложения на те или иные события,
а сама операционная система занимается постоянным опросом компьютера с
целью выявления наступления какого-либо события). Каждый компонент имеет
свой собственный набор обработчиков событий. В C++ Builder следует писать
функции, называемые обработчиками событий, и связывать события с этими
функциями. Создавая обработчик того или и ого события, вы поручаете программе
выполнить написанную функцию, если это событие произойдет.
Для того, чтобы добавить обработчик событий, нужно выбрать на форме
с помощью мыши компонент, которому необходим обработчик событий, затем
открыть страницу событий инспектора объектов и дважды щелкнуть левой клавишей
мыши на колонке з ачений рядом с событием, чтобы заставить C++ Builder
сгенерировать прототип обработчика событий и показать его в редакторе кода.
При этом автоматически генерируется текст пустой функции, и редактор открывается
в том месте, где следует вводить код. Курсор позиционируется внутри операторных
скобок { … }. Далее нужно ввести код, который должен выполняться при
наступлении события. Обработчик событий может иметь параметры, которые
указываются после имени функции в круглых скобках.
Рис.4. Прототип обработчика событий.
Методы
Метод является функцией, которая связана с компонентом, и которая объявляется
как часть объекта. Создавая обработчики событий, можно вызывать методы,
используя следующую нотацию: ->, например:
Edit1->Show();
Отметим, что при создании формы связанные с ней модуль и заголовочный файл
с расширением *.h генерируются обязательно, тогда как при создании нового
модуля он не обязан быть связан с формой (например, если в нем содержатся
процедуры расчетов). Имена формы и модуля можно изменить, причем желательно
сделать это сразу после создания, пока на них не появилось много ссылок
в других формах и модулях.
Менеджер проектов
Файлы, образующие приложение — формы и модули — собраны в проект. Менеджер
проектов показывает списки файлов и модулей приложения и позволяет осуществ
ять навигацию между ними. Можно вызвать менеджер проектов , выбрав пункт
меню View/Project Manager. По умолчанию вновь созданный проект получает
имя Project1.cpp.
Рис.5. Менеджер проектов
По умолчанию проект первоначально содержит файлы для одной формы и исходного
кода одного модуля. Однако большинство проектов содержат несколько форм
и модулей. Чтобы добавить модуль или форму к проекту, нужно щелкнуть правой
кнопкой мыши и выбрать пункт New Form из контекстного меню. Можно также
добавлять существующие формы и модули к проекту, используя кнопку Add контекстного
меню менеджера проектов и выбирая модуль или форму, которую нужно добавить.
Формы и модули можно удалить в любой момент в течение разработки проекта.
Однако, из-за того, что форма связаны всегда с модулем, нельзя удалить
одно без удаления другого, за исключением случая, когда модуль не имеет
связи с формой. Удалить модуль из проекта можно, используя кнопку Remove
менеджера проектов.
Если выбрать кнопку Options в менеджере проектов, откроется диалоговая
панель опций проекта, в которой можно выбрать главную форму приложения,
определить, какие формы будут создаваться динамически, каковы параметры
компиляции модулей (в том числе созданных в Delphi 2.0, так как C++ Builder
может включать их в проекты) и компоновки.
Рис. 6. Установка опций проекта
Важным элементом среды разработки C++ Builder является контекстное меню,
появ яющееся при нажатии на правую клавишу мыши и предлагающее быстрый
доступ к наиболее часто используемым командам.
Разумеется, C++ Builder обладает встроенной системой контекстно-зависимой
помощи, доступной для любого элемента интерфейса и являющейся обширным
источником справочной информации о C++ Builder.
Создание приложений в С++ Builder
Первым шагом в разработке приложения C++ Builder является создание проекта.
Файлы проекта содержат сгенерированный автоматически исходный текст, который
становится частью приложения, когда оно скомпилировано и подготовлено к
выполнению. Чтобы создать новый проект, нужно выбрать пункт меню File/New
Application.
C++ Builder создает файл проекта с именем по умолчанию Project1.cpp,
а также make-файл с именем по умолчанию Project1.mak. При внесении изменений
в проект, таких, как добавление новой формы, C++ Builder обновляет файл
проекта.
Рис.7 Файл проекта
Проект или приложение обычно имеют несколько форм. Добавление формы
к проекту создает следующие дополнительные файлы:
-
Файл формы с расширением.DFM, содержащий информацию о ресурсах окон для
конструирования формы - Файл модуля с расширением.CPP, содержащий код на C++.
- Заголовочный файл с расширением .H, содержащий описание класса формы.
Когда вы добавляете новую форму, файл проекта автоматически обновляется.
Для того чтобы добавить одну или более форм к проекту , выберите пункт
меню File/New Form. Появится пустая форма, которая будет добавлена к проекту.
Можно воспользоваться пунктом меню File/New, выбрать страницу Forms и выбрать
подходящий шаблон из репозитория объектов.
Рис.8 Шаблоны форм
Для того, чтобы просто откомпилировать текущий проект, из меню Compile
нужно выбрать пункт меню Compile. Для того, чтобы откомпилировать проект
и создать исполняемый файл для текущего проекта, из меню Run нужно выбрать
пункт меню Run. Компоновка проекта является инкрементной (перекомпилируются
только изменившиеся модули).
Если при выполнении приложения возникает ошибка времени выполнения,
C++ Builder делает паузу в выполнении программы и показывает редактор кода
с курсором, установленным на операторе, являющемся источником ошибки. Прежде
чем делать необходимую коррекцию, следует перезапустить приложение, выбирая
пункт меню Run из контекстного меню или из меню Run, закрыть приложение
и лишь затем вносить изменения в проект. В этом случае уменьшится вероятность
потери ресурсов Windows.
Пример: создание простейшего приложения
Теперь попробуем создать простейшее приложение, позволяющее вводить текст
в редактируемое поле и добавлять этот текст к списку при нажатии мышью
на кнопку. Выберем пункт меню File/New Application для создания проекта
и сохраним его главную форму под именем samp1.cpp, а сам проект под именем
samp.mak. Поместим на форму компоненты Button, Edit и ListBox со страницы
Standard палитры компонент.
Рис. 9. Размещение компонентов на форме
После этого выберем на форме компонент Edit и удалим текущее значение
свойства Text. Затем установим свойство Caption для Button1 равным «Добавить».
Чтобы добавить обработчик события OnClick для кнопки Добавить, нужно
выбрать эту кнопку на форме, открыть страницу событий в инспекторе объектов
и дважды щелкнуть мышью на колонке справа от события OnClick. В соответствующей
строке ввода появится имя функции. C++ Builder сгенерирует прототип обработчика
событий и покажет его в редакторе кода. После этого следует ввести следующий
код в операторные скобки { … } тела функции:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (!(Edit1->Text == «»))
{
ListBox1->Items->Add(Edit1->Text);
Edit1->Text = «» ;
}
}
Для компиляции приложения в меню Run выберем пункт Run. Теперь можно что-нибудь
ввести в редактируемое поле, нажать мышью на кнопку Добавить и убедиться,
что вводимые строки добавляются к списку.
Рис.10. Так выглядит готовое приложение.
Теперь модифицируем приложение, добавив кнопки Удалить и Выход. Для
этого добавим еще две кнопки, изменим их свойство Caption и создадим обработчики
событий, связанных с нажатием на эти кнопки:
Рис. 11. Модифицированное приложение
Для кнопки Удалить:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (!(ListBox1->ItemIndex == -1))
ListBox1->Items->Delete(ListBox1->ItemIndex);
}
Для кнопки Выход:
Close();
Сохраним и скомпилируем приложение, а затем протестируем его.
Итак, мы познакомились со средой разработки Borland C++ Builder и создали
простое приложение. В следующих статьях этого цикла будут описаны приемы
манипуляции компонентами на форме и более подробно рассмотрены особенности
поведения различных компонентов в приложении.
Вернутся к оглавлению
В данной статье рассказывается о том, как легко и просто освоить один из новых продуктов Borland C++ Builder 6.0 для разработки программ и быстро начать создавать собственные программы, работающие в операционной системе Windows.
Я решил написать данную статью потому, что сам прошел непростой путь обучении Borland C++ Builder и хотел бы эначи телыю облегчить процесс освоении этого продукта новичками. Сегоднн я могу с уверенностью сказать, что процесс создания Программ на Borland C++ Builder является не только простым и понятным, но самое главное — творческим, полезным и захватывающим занятием. Написав свою первую программу в ЭТОМ пакете, вы наверняка не сможете остановиться и начнете творить. Я не претендую на звание программиста, т. к. в основном занимаюсь схемотехникой. По поскольку н настоящее время электронная техника органично включает в себя микроконтроллеры и процессоры, которые необходимо программировать, а компьютеры становятся привычными инструментами, также требующими программирования, становится очевидным, что программированием необходимо овладевать. Эти знания позволят самостоятельно создавать тестовые программы, утилиты и несложные программно-инструментальные средства для отладки и тестирования схемотехнических устройств, а также позволят создавать различные электронные устройства с программной поддержкой.
Данная статья не претендует на полное и детальное описание программного продукта Borland C++ Builder 6.0, но благодаря своей компактности она позволяет не боясь большого объема материала для изучения начать осваивать этот пакет и быстро научиться писать свои программы. Работать в среде Borland C++ Builder 6.0 может любой пользователь компьютера» имеющий хотя бы минимальные знания о программировании» например из программы школьного курса. Постепенно этот человек может увлечься и стать настоящим программистом. В своем изложении я хочу, не отягощая избыточностью материала, увлечь в этот удивительный и прекрасный мир программирования. Хочу дать первый импульс к творчеству и ключ к простому пониманию непростых специальных понятий и терминов. Программы разрабатываются в данном пакете настолько просто и легко, что после первых упражнений с этим продуктом с ним уже не хочется расставаться никогда. Мы вместе с вами не только изучим основные инструменты пакета Borland C++ Builder, но и напишем свои первые программы с поразительной быстротой и легкостью. И я думаю, что после этого вы сами захотите читать больше и больше об этом удивительном продукте. Самое главное — все, что вы прочтете здесь, необходимо закреплять практикой при работе на компьютере. Только так, с помощью практики можно добиться хороших и прочных знаний в любом полезном деле. Не пытайтесь усвоить весь материал за один присест. Не ленитесь перечитать то, что не поняли или недопоняли или забыли.
Новые понятия обычно усваиваются только после третьего прочтения. Придерживайтесь этих правил, и вы обязательно добьетесь успеха.
Далее в тексте я буду использовать некоторые специальные термины, поясняя по ходу изложения, что они означают. Эти термины являются общеупотребительными для программистов, и к ним необходимо привыкнуть. В дальнейшем это очень поможет в изучении и освоении новых программных продуктов и специальной технической литературы. Одним из первых таких терминов является объектно-ориентированное программирование — ООП. Данный термин означает, что при разработке программ не требуется продумывать весь алгоритм работы программы от начала и до конца, как это делалось в структурном программировании. Именно таким продуктом является Borland C++ Builder 6.0 и ему подобные пакеты для создания программ под Windows. OOII дает возможность писать программу постепенно, шаг за шагом, создавая отдельные небольшие программы (функции-методы) для обработки действий (событий), вызываемых объектами (кнопками и окнами программы, кнопками клавиатуры и т.п.).
УСТАНОВКА
В настоящее время инсталляционный (установочный) пакет Borland C++ Builder 6.0 можно приобрести на компакт-диске (CD) во многих магазинах по доступной цене. Установка данного пакета не вызывает сложностей и подробно расписана на упаковке самого компакт-диска, в тексте инсталлятора или в справочном файле (типа readme.txt), входящем в инсталляционный пакет. Поскольку программа может быть установлена в нескольких редакциях (вариантах), от самого простого до профессионального уровня, выберите для начала самый простой или типовой вариант установки. Вместо предлагаемого для установки каталога с длинным названием C:Program Files Borland C++ Builder 6 рекомендую создать каталог с коротким названием С:СВ6 и установить пакет именно в него. 11ри запросе на установку специального пакета СОКВА для базы данных можно отключить галочку установки. В дальнейшем вы всегда сможете установить необходимые компоненты пакета по мере необходимости в них.
НАЧАЛО
После установки пакета в меню программ компьютера появится новый раздел на английском языке пол названием Borland C++ Builder 6, в который входит множество программ и справочных файлов. Со временем эти программы станут привычными и понятными инструментами для вас. Поэтому не пугайтесь их изобилия и замысловатости названий. Для начала работы в среде Borland C++ Builder 6.0 нам понадобится только один файл C:CB6Binbcb.exe. Из него мы сможем вызывать остальные программы пакета по мере необходимости. Я советую поместить значок (ярлык) этой программы на рабочий стол (экран) компьютера для последующего быстрого и простого поиска и запуска этой программы. Для этого необходимо свернуть все окна запущенных на компьютере программ или закрыть их. Далее необходимо найти через 11уск—^Программы—» Borland C++ Builder программу C++ Builder 6, нажать левую кнопку мышки и, удерживая нажатой кнопку мыши и клавишу Ctrl (для копирования) перенести ярлык программы на свободное место рабочего стола. Теперь можно запустить программу C++ Builder 6, щелкнув на ее значке» помещенном на рабочем столе, два раза левой клавишей мышки.
После запуска программы на экране монитора появится окно, изображенное на рис. 1, которое демонстрирует процесс загрузки программы Borland C++ Builder 6.0.
В терминах программистов этот интерфейс называется средой быстрой разработки приложений RAD, сокращение от английских слов Rapid Application Development. Такое название этот интерфейс получил за то, что создание программы в нем сводится в основном к простому конструированию окна будущей программы из готовых кубиков, а большую часть стандартных и рутинных операций за человека выполняет компьютер. Например, компьютер создает автоматически заготовку текста программы для функций обработки событий.
В верхнем окне интерфейса программы расположена строка заголовка C++ Builder 6-Projectl. Она отражает название всего программного пакета и имя нового проекта. Проектом называется вся группа файлов, которые необходимы для создания конечной исполняемой программы. Так, например, в состав проекта могут включаться файлы с текстами программ, файл ресурсов с рисунками курсоров и иконок (значков), звуковые файлы и т. п. Первоначально проект хранится в памяти компьютера, и для того, чтобы сохранить его на диске, необходимо будет выполнить стандартные операции сохранения, создав при этом отдельную пайку. Кроме того, интерфейс сам предложит вам сохранить проект, если вы решите выйти из программы или попытаетесь создать новый проект.
Так же на строке заголовка находятся кнопки свертывания, восстановления и закрытия окна. Под заголовком находится строка главного меню, которая предоставляет доступ ко всем функция и командам программы. Под главным меню находятся быстрые кнопки, объединенные в группы по назначению. Они позволяют получить быстрый доступ к наиболее часто используемым командам. Справа от быстрых кнопок расположена палитра визуальных компонентов VCL. Это те самые объекты или программные компоненты, предназначенные для быстрого создания программы для Windows. В их число входят кнопки, рисунки, надписи, таймеры, календари и т. д. Палитра состоит из нескольких закладок, на которых располагаются визуальные компоненты, распределенные по группам. Именно с этими компонентами мы будем создавать новые программы. При малых разрешениях экрана все эти закладки не умещаются в пределах рабочей области экрана. Для получения доступа к ним необходимо воспользоваться кнопками прокрутки (стрелками), которые расположены в правой верхней части палитры компонентов. Подведите курсор к одной из кнопок и нажмите левую кнопку мыши. При этом закладки сдвинутся и появится та группа, которая первоначально не отображалась (была недоступна). В левой нижней части экрана располагается инспектор объектов Object Inspector. В этом окне производится настройка основных свойств визуальных компонентов. Расположение окна инспектора объектов в программе не фиксировано и при желании его можно переместить в ту часть рабочей области программы, которая для вас наиболее удобна. Для этого необходимо нажать левую кнопку мыши на строке заголовка окна и, удерживая ее, переместить окно. Над окном инспектора объектов расположено окно просмотра объектов Object Tree View. Оно отображает в виде дерева всю структуру проекта, состоящего из форм, кодов (текстов) программ и других ресурсов (файлов). Справа от инспектора объектов располагается окно дизайнера форм (окон будущей программы). Это окно содержит строку заголовка, в котором отображается название формы Forml (созданное по умолчанию) и кнопки управления окном. Над ним располагается окно редактора кода Unitl.cpp, (также созданное по умолчанию) в котором производится набор и редактирование кода программы.
Советую вам некоторое время самостоятельно познакомиться с этим интерфейсом для того, чтобы вы привыкли к нему и появились вопросы, на которые хочется получить ответы. Ведь только интерес порождает процесс изучения. Данный интерфейс будет нашим самым главным инструментом при создании программ.
ПЕРВАЯ ПРОГРАММА
Думаю, многим читателям уже не терпится написать первую программу под Windows. Пожалуйста, нет ничего проще. Фактически она уже написана, и сделал это за вас RAD интерфейс. Выполните команду Run из главного меню Run или щелкните левой кнопкой мышки по зеленой кнопкестрелке на панели быстрых кнопок или просто нажмите клавишу F9 на клавиатуре. После этого произойдет компиляция проекта (преобразование программы в машинный код, понятный компьютеру) с отображением на экране окна, подобного изображенному на рис. 3, и программа запустится.
рис.3
На экране появится изображение пустого окна вашей первой программы (рис. 4).
рис.4
В верхней части этой программы будет виден фирменный значок пакета Borland C++ Builder и название окна программы Forml. Итак, мы создали новую программу, не написав при этом ни строчки кода! Какая же польза от такой программы? Что она умеет делать? Пока не очень много, но кое-что все же умеет. Во-первых, мы получили полноценное оконное приложение, которое работает в операционной системе Windows. Во-вторых, это приложение имеет интерфейс Windows и привычные стандартные органы управления, расположенные справа вверху. Вы можете сворачивать данное приложение и разворачивать его на весь экран, изменять размеры окна программы и перемещать его с помощью мышки. А мы с вами создали такую программу в считанные секунды. Конечно же, это заслуга RAD интерфейса. Именно благодаря такому интерфейсу нам удалось создать приложение так быстро и легко. Это одно из его замечательных свойств, поэтому он и получил очень большое распространение и признание во всем мире. Обратите внимание, что при сворачивании приложение будет иметь имя Project 1. Теперь перед нами встают вопросы, как сделать наше приложение полезным, изменить его название и значок и т. д. Очень хорошо, что эти вопросы появились. Они пробуждают в нас интерес и жажду к знаниям — основной источник прогресса. Остановим работу нашей программы, щелкнув левой клавишей мышки по крестику в верхней правой части ее окна и продолжим обучение.
Теперь рассмотрим более подробно каждое из описанных выше окон интерфейса и других органов управления пакета Borland C++ Builder 6.0.
ГЛАВНОЕ МЕНЮ
Главное меню предоставляет доступ к основным командам программы Borland C++ Builder 6.0, объединенным в группы.
Первая группа меню под названием File (Файл) изображена на рис. 5.
Рис.5
Команды этого меню осуществляют работу с файлами и предоставляют доступ к операциям создания (New) новых форм (окон) и приложений, открытия (Open), сохранения (Save) и закрытия (Close) файлов и проектов, печати текстов программ (Print) и добавления заголовков модулей (Include), т. е. файлов с расширением h. Обратите внимание на то, что перед некоторыми командами этого и последующих меню находятся значки-иконки. Эти же значки изображены на кнопках быстрого запуска, что позволяет без труда понять их назначение. Кроме того, справа от некоторых команд меню написано соответствие команд горячим клавишам, т. е. клавишам, с помощью которых вызывается данная команда. Еще правее этих надписей кое-где имеются треугольные стрелки, которые говорят о том, что данная команда имеет расширенные возможности, которые становятся доступными после наведения на эту стрелку курсора мышки.
Вторая по порядку группа команд меню называется Edit (Редакторова-ние), она изображена на рис. 6.
Рис.6
В этом меню собраны команды редактирования, такие как отмена (Undelete) и повторение (Redo) операций, вырезание (Cut), копирование (Сору) вставка (Paste) и удаление (Delete), команды выделения всего текста (Select All), выравнивания компонентов (Align) и настройки редактора кода (текста программы).
Следующая группа команд Search (Поиск) изображена на рис. 7.
Рис.7
Команды данного меню позволяют осуществить поиск текста в файле, продолжить поиск после запуска программы, произвести автоматическую замену, быстро перейти к строке кода, задав ее номер.
Группа команд View (Вид) изображена на рис. 8.
Из этого пункта меню вызываются основные диалоговые окна управления проектом и компонентами, такие как менеджер проектов Project Manager, список компонентов Component List и список окон Windows List Также из этого пункта меню открываются все окна отладки программ Debug Windows, работу с которыми мы рассмотрим позже.
Группа команд Project (Проект) приведена на рис. 9.
Рис.9
В этом меню собраны команды управления проектом. С их помощью можно добавлять и удалять модули (файлы с текстами программ), добавить библиотеку компонентов VCL, откомпилировать проект и так далее.
Группа команд Run (Выполнить) изображена на рис. 10.
С помощью команд этого меню выполняется запуск и останов программ, запуск программ в непрерывном и пошаговом режимах, добавление переменных для просмотра, установка точек останова и другие действия по отладке программы.
Группа команд Component (Компонент) представлена на рис. 11.
Рис.11
Из этого меню вызываются команды добавления в систему новых компонентов и конфигурации их палитры.
Рис.12
Группа Database (База данных) представлена на рис. 12, она содержит команды для работы с базами данных. Изучение компонентов этой группы не входит в содержание данной статьи ввиду большого объема.
Группа Tools (Инструменты) изображена на рис. 13.
Рис.13
В этом меню собраны команды как по настройке параметров программы, так и команды вызова различных дополнительных утилит.
Рис.14
Группа Windows приведена на рис. 14.
С помощью команд данного меню производится управление окнами интерфейса.
Замыкает главное меню группа команд Help, представленная на рис. 15.
Рис.15
В нее включены команды, с помощью которых можно получить справку как о языке C++, так и о работе с пакетом Borland C++ Builder 6 и всеми его компонентами. Выбрав в данном меню команду About, вы увидите сведения о данном пакете и некоторые сведения о вашем компьютере. Это окно изображено на рис. 16.
Рис.16
БЫСТРЫЕ КНОПКИ
Быстрые кнопки расположены под главным меню (рис. 2). С их помощью осуществляется быстрый доступ к основным и часто используемым командам главного меню. Все эти кнопки имеют вплывающие меню, появляющиеся при наведении на них курсора мыши, и горячие клавиши, показываемые в скобках. Все быстрые кнопки также, как и главное меню, разделены на группы.
Кнопки Standard (Стандартные) позволяют создавать новые объекты программы. Для этого необходимо нажать кнопку New. При этом появится диалоговое окно New Items, в котором можно выбрать необходимый для создания программы объект. Также кнопки этой группы позволяют сохранять (Save) и открывать (Open) как отдельные файлы, так и целые проекты. Замыкают группу две кнопки управления проектами, с помощью которых можно добавлять файлы к проекту (Add File To Project) и удалять их из него (Remove File From Project).
Кнопки View (Вид). В эту группу собраны кнопки, управляющие просмотром форм и модулей, а также кнопка создания новой формы. Для создания новой формы необходимо нажать кнопку New Form. При этом появится новое окно дизайнера форм в заголовке, в котором будет отображаться название новой формы Form2. Для переключения между формой и редактором кода служит кнопка Toggle Form Unit (F12). Если в вашей программе используется несколько форм, то с помощью кнопки View Form (Shift+F12) вы можете выбрать форму для просмотра.
Кнопки Debug (Отладка). В этой группе собраны кнопки для отладки программы. Кнопка Run (F9) запускает проект на выполнение. Кнопка Pause позволяет приостановить выполнение проекта. С помощью кнопок Trace Into (F7) и Step over (F8) задается запуск программ в пошаговом режиме для детальной отладки программы. Положение кнопок быстрого доступа в среде разработки не фиксировано и их можно разместить на главной панели по своему усмотрению. Для этого необходимо подвести курсор к левому краю группы кнопок и, нажав и удерживая левую кнопку мыши, переместить группу на новое место. Если группа вынесена за пределы главной панели, ей отводится отдельное окно. Кроме того, нажав правую кнопку мыши на панели быстрых кнопок, можно открыть окно для настройки отображения любой группы кнопок на главной панели системы.
Продолжение следует…
Статья 1 2 3 4 5 6 7 8 9 10 11
Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
Скачиваний:
431
Добавлен:
11.06.2015
Размер:
1.3 Mб
Скачать
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
МЕХАНИКО-МАТЕМАТИЧЕСКИЙ ФАКУЛЬТЕТ
Кафедра численных методов и программирования
ПРОГРАММИРОВАНИЕ В С++ BUILDER
Учебное пособие по курсу «МЕТОДЫ ПРОГРАММИРОВАНИЯ»
для студентов специальностей
G31 03 01 «Математика», G31 03 03 «Механика»
Минск
2007
УДК 004.43(075.8)
ББК 32.973.26-018.1я73 Б69
А в т о р ы :
В. С. Романчик, А. Е. Люлькин
Р е ц е н з е н т ы :
старший преподаватель Н. А. Аленский, кандидат физико-математических наук, доцент, зав. кафедрой информационных технологий БГУК П. В. Гляков
кандидат физико-математических наук, доцент С. В. Суздаль
Рекомендовано Ученым советом механико-математического факультета БГУ 2006 года, протокол № ___
Программирование в C++ BUILDER: учебное пособие для студ. механико-матем. фак. / В. С. Романчик, А.Е.Люлькин. Мн.: БГУ, 2007. –126 с.
ISBN 985-485-498-1.
В пособии рассматриваются вопросы, относящиеся к использованию технологии объект- но-ориентированного программирования в системе C++ Builder. Описание методологии построения классов и использования компонентов сопровождается многочисленными примерами. Предназначено для студентов 2-го курса механико-математического факультета, изучающих курс «Методы программирования».
УДК 004.43(075.8) |
|
ББК 32.973.26-018.1я73 |
|
©Романчик В.С., |
|
ISBN 985-485-498-1 |
Люлькин А.Е. |
БГУ, 2007 |
2
ВВЕДЕНИЕ
Основные характеристики С++Builder. C++Builder включает язык
C++, компилятор, интегрированную среду разработки приложений IDE (Integrated Development Environment), отладчик и различные инструмен-
ты. C++Builder содержит комплект общих элементов управления, доступ к Windows API, библиотеку визуальных компонентов VCL (Visual Component Library), компоненты и инструменты для работы с базами данных.
C++Builder добавляет к процессу программирования на языке C++ возможность быстрой визуальной разработки интерфейса приложений.
Кроме библиотек OWL (Object Windows Library) и MFC (Microsoft Foundation Classes), он использует библиотеку VCL и позволяет включить в форму диалоги с пользователем, оставляя разработчику для реализации только функциональную часть, воплощающую алгоритм решения задачи.
C++Builder имеет общую с Delphi библиотеку классов, часть из которых осталась написанной на языке Object Pascal. Благодаря этому, а также включению в С++Builder компиляторов С++ и Object Pascal, в приложениях можно использовать компоненты и код, написанные на
Object Pascal, а также формы и модули Delphi.
Компоненты C++Builder. Создание пользовательского интерфейса приложения заключается в добавлении в окно формы объектов, называемых компонентами. C++Builder позволяет разработчику создавать собственные компоненты и настраивать Палитру компонентов.
Компоненты разделяются на видимые (визуальные) и невидимые (невизуальные). Визуальные компоненты появляются как во время выполнения, так и во время проектирования. Невизуальные компоненты появляются во время проектирования как пиктограммы на форме. Они не видны во время выполнения, но обладают функциональностью. Для добавления компонента в форму можно выбрать мышью нужный компонент в Палитре компонентов и щелкнуть левой клавишей мыши в нужном месте проектируемой формы. Компонент появится на форме, и далее его можно перемещать и изменять. Каждый компонент C++ Builder имеет три характеристики: свойства, события и методы. Инспектор объ-
3
ектов автоматически показывает свойства и события, которые могут быть использованы с компонентом. Свойства являются атрибутами компонента, определяющими его внешний вид и поведение. Инспектор объектов отображает опубликованные (published) свойства компонентов на странице свойств (properties) и используется для установки publishedсвойств во время проектирования. Для изменения свойств компонента во время выполнения приложения нужно добавить соответствующий код. Помимо published-свойств, компоненты могут иметь открытые (public) свойства, которые доступны только во время выполнения приложения.
Рис. 1. Окно Инспектора объектов
События. Страница событий (Events) Инспектора объектов показывает список событий, распознаваемых компонентом и возникающих при изменении состояния компонента. Каждый экземпляр компонента имеет свой собственный набор функций — обработчиков событий. Создавая обработчик события, вы поручаете программе выполнить указанную функцию, если это событие произойдет. Чтобы добавить обработчик события, нужно выбрать компонент, затем открыть страницу событий Инспектора объектов и дважды щелкнуть левой клавишей мыши рядом с событием. Это заставит C++ Builder сгенерировать текст пустой функции с курсором в том месте, где следует вводить код. Далее нужно ввести код, который должен выполняться при наступлении данного события.
4
Среда разработки (IDE). C++ Builder представляет собой приложение, главное окно которого содержит меню (сверху), инструментальную панель (слева) и Палитру компонентов (справа). Помимо этого при запуске C++ Builder появляются окно Инспектора объектов и окно Object TreeView (слева), а также форма нового приложения (справа). Под окном формы приложения находится окно Редактора кода.
Рис. 2. Главное окно интегрированной среды разработки
Создание приложений в С++Builder. Первым шагом в разработке приложения C++ Builder является создание проекта. Чтобы создать новый проект, нужно выбрать пункт меню File|New| Application.
C++ Builder создает файл Project.bpr, а также головной файл проекта
Project.cpp, содержащий функцию WinMain(). Функция WinMain() в Windows-приложениях используется вместо функции main(). При добавление новой формы C++ Builder обновляет файл проекта и создает следующие дополнительные файлы:
•файл формы с расширением .dfm, содержащий информацию о форме;
•файл модуля с расширением .cpp, содержащий код на C++;
•заголовочный файл с расширением .h, содержащий описание класса формы.
5
Для того чтобы откомпилировать текущий проект, нужно выбрать пункт меню Compile. Для того чтобы откомпилировать проект и создать исполняемый файл, из меню Run нужно выбрать пункт Run. В результате выполнения будет получена следующая форма:
Рис. 3. Результат выполнения приложения
Структура файла проекта. Для каждого приложения C++Builder
создается xml-файл проекта Project.bpr и файл ресурсов. Еще один файл — головной файл проекта, содержащий функцию WinMain(), генерируется при выборе пункта меню File|New Application. Первоначально по умолчанию этому файлу присваивается имя Project1.cpp. Если в процессе разработки приложения добавляются формы и модули, C++Builder обновляет файл. Для просмотра файла следует выбрать пункт меню Project|View Source.
В головном файле проекта имеется определенный набор ключевых элементов:
•Директива препроцессора #include <vcl.h> предназначена для включения заголовочного файла, ссылающегося на описания классов библиотеки VCL.
•Директива #pragma hdrstop предназначена для ограничения списка заголовочных файлов, доступных для предварительной компиляции.
•Директива USEFORM показывает модули и формы используемые
впроекте.
•Директива USERES компилятора присоединяет файлы ресурсов к выполняемому файлу. При создании проекта автоматически создается файл ресурсов .res для хранения курсоров, пиктограмм и других ресурсов.
•Application->Initialize(). Это утверждение инициализирует приложение.
6
•Application->CreateForm(). Это утверждение создает форму приложения. Каждая форма в приложении имеет свое утверждение
CreateForm.
•Application->Run(). Это утверждение запускает приложение.
•Блок try…catch используется для корректного завершения приложения в случае возникновения ошибки.
Типичный головной файл проекта имеет следующий вид:
//Project1.cpp ———————————————————
#include <vcl.h> #pragma hdrstop USERES(«Project1.res»);
USEFORM(«Unit1.cpp», Form1); //—————————————————————————
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run();
}
catch (Exception &exception)
{ Application->ShowException(&exception); } return 0;
}
Структура файла Project1.bpr. Файл Project1.bpr представляет XML-проект (C++Builder XML Project), содержащий описание создаваемого приложения. Это текстовый файл, содержащий указания на то, какие файлы должны компилироваться и компоноваться в проект, а также пути к используемым каталогам.
Структура модуля. Модуль содержит реализацию функциональной части объекта на языке C++ и по умолчанию представляет собой файл Unit1.cpp. Каждый такой файл компилируется в объектный файл с расширением .obj. При добавлении к проекту новой формы генерируется новый модуль.
Имя исходного файла модуля и файла формы (*.dfm) должны быть одинаковыми. При создании обработчика событий в тексте модуля генерируется шаблон функции обработчика события, в который вводится код, выполняемый при наступлении обрабатываемого события.
Ниже приводится текст модуля, генерируемый для исходной формы:
//Unit1.cpp ————————————————————
#include <vcl.h> #pragma hdrstop
7
#include «Unit1.h»
#pragma package(smart_init) #pragma resource «*.dfm»
TForm1 *Form1;//указатель на объект
//—————————————————————————
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //реализация конструктора
Структура заголовочного файла. Заголовочный файл (файл с расширением .h, по умолчанию Unit1.h) генерируется при создании нового модуля и содержит описание класса формы. Такие описания генерируются автоматически и изменяются при внесении в форму новых компонентов или генерации новых обработчиков событий. В заголовочном файле содержится интерфейс, а в самом модуле – реализация методов.
При удалении из формы компонентов их описания удаляются из заголовочного файла. При переименовании компонентов изменяются их описания в заголовочном файле, а также имена и описания обработчиков событий. Однако при этом не изменяются ссылки на эти компоненты и обработчики событий, используемые в других функциях. В связи с этим рекомендуется переименовывать компоненты и обработчики событий сразу же после их создания, пока на них не появились ссылки.
В модуле могут содержаться классы и функции, не описанные в заголовочном файле, однако видимость их в этом случае ограничивается данным модулем.
Ниже приводится заголовочный файл для исходной формы:
//Unit1.h—————————————————————————
#ifndef Unit1H #define Unit1H
//—————————————————————————
#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp>
class TForm1 : public TForm
{ |
|
__published: |
// IDE-managed Components |
private: // User declarations |
|
public: |
// User declarations |
__fastcall TForm1(TComponent* Owner);
}; //—————————————————————————
extern PACKAGE TForm1 *Form1; #endif
//—————————————————————————
8
Файл формы. Форма является одним из важнейших элементов приложения C++ Builder. Процесс редактирования формы происходит при добавлении к форме компонентов, изменении их свойств, создании обработчиков событий. Когда к проекту добавляется новая форма, создаются три отдельных файла: 1) файл модуля (*.cpp) содержит код методов, связанных с формой; 2) заголовочный файл (*.h) содержит описание класса формы; 3) файл формы (*.dfm) содержит сведения об опубликованных (доступных в Инспекторе объектов) свойствах компонентов, содержащихся в форме.
При добавлении компонента к форме заголовочный файл и файл формы модифицируются. При редактировании свойств компонента в Инспекторе объектов эти изменения сохраняются в файле формы.
Хотя в C++ Builder файл *.dfm сохраняется в двоичном формате, его содержание можно просмотреть с помощью редактора кода. Для этого нужно нажать правую клавишу мыши над формой и из контекстного меню формы выбрать пункт View as Text.
Ниже приводится листинг файла некоторой формы:
//Unit1.dfm—————————————————————————
object Form1: TForm1 Left = 197
Top = 358
Width = 544
Height = 181 Caption = ‘Form1’ Color = clBtnFace
Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11
Font.Name = ‘MS Sans Serif’ Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13
End
Простейшее приложение. Важнейшей особенностью C++Builder является автоматическая генерация кода программы. Когда к форме добавляете компонент, в тексте файла Unit1.h появляется объявление объекта класса данного компонента. Например, перенос на пустую форму компонента кнопки TButton сгенерирует объявление объекта Button1, а определение события OnClick – объявление метода ButtonlClick , являющегося обработчиком этого события.
9
Рассмотрим простейшее приложение. Создается форма для сложения двух чисел. Используются компоненты: TEdit – для ввода чисел и отображения результата; TLabel – для вывода строк “+” и “=”; TButton – кнопка, связанная с событием OnClick, для сложения чисел.
Будем использовать следующие свойства и методы для компонентов: TEdit: Name (имя объекта), ReadOnly (режим «только чтение»), Text
(текстовое поле);
TLabel: Caption (текстовое поле);
TButton: Caption (надпись на кнопке), OnClick (событие типа нажатия кнопки).
На рис. 4 приводятся окна Инспектора объектов в процессе работы со свойствами компонентов.
Двойной щелчок по компоненту Button1 приведет к выводу окна редактирования для Unit1.cpp и предложит определить тело метода Button1Click(), которое для рассматриваемой задачи должно иметь вид:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit3->Text=IntToStr(StrToInt(Edit1->Text)+StrToInt(Edit2->Text));
}
Рис. 4. Работа с компонентами Edit1 и Button1
10
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- Главная
- Directory
Справочник по С++
Раздел содержит развернутые пояснения многих терминов определения свойств, методов, типов и, особенно, структур. В приведенном разделе слова и термины изменены и упрощены по сравнению с документацией C++Builder, чтобы было проще в них ориентироваться. Например, опущены ссылки на методы записи и чтения свойств, которые не представляют интереса для программистов. Кардинально сокращены объявления многих структур — в них оставлены только имена и типы полей, устранены многие промежуточные ссылки на типы.
Директива (указание) по использованию похожа на какую-либо команду, так как также используется для описания некоторых конструкций языка программирования, т.е. указаний компилятору особенностей обработки при компиляции.
В языки программирования С++ и C++ Builder встроена поддержка препроцессора. Строки в исходном коде, которые должны быть обработаны препроцессором в виде #define и #include называются препроцессорными директивами.
Библиотека (от англ. library) — сборник подпрограмм или объектов, используемых для разработки программного обеспечения (ПО).
Язык C++ включает в себя те же библиотеки, что и Си, организованы они также. Каждый элемент библиотек определен в стандартном пространстве имен. Тем не менее, для совместимости с языком Cи, традиционный формат записи имен заголовочных файлов «имя файла.h» (например, stdlib.h) также предоставляется с теми же определениями в рамках глобального пространства имен.
Функция — это поименованная часть программы, которая может вызываться из других частей программы столько раз, сколько необходимо. Функция, в отличие от процедуры, обязательно возвращает значение.
С точки зрения теории систем, функция — отдельная система, подсистема или подпрограмма, на вход которой поступают управляющие воздействия в виде значений аргументов. На выходе функция возвращает результат, который может быть как скалярной величиной, так и векторным значением структура, индексный массив и т.п. По ходу выполнения функции могут выполняться, также, некоторые изменения в управляемой системе, причём как обратимые, так и необратимые.
Операция — конструкция в языках программирования, аналогичная по записи математическим операциям, то есть специальный способ записи некоторых действий. Наиболее часто применяются арифметические, логические и строковые операции. В отличие от функций, операции часто являются базовыми элементами языка и обозначаются различными символами пунктуации, а не алфавитно-цифровыми. Они имеют специальный инфиксный синтаксис и нестандартные правила передачи аргументов.
Оператор — наименьшая автономная часть языка программирования, т.е. команда. Программа обычно представляет собой последовательность инструкций.
Многие языки, к примеру C++, различают инструкцию и определение. Различие в том, что инструкция исполняет код, а определение создаёт идентификатор, т.е. можно рассматривать определение как инструкцию присваивания.
Свойство — это способ доступа к внутреннему состоянию объекта, имитирующий переменную некоторого типа. Обращение к свойству объекта выглядит так же, как и обращение к структурному полю, но, в действительности, реализовано через вызов функции. При попытке задать значение данного свойства вызывается один метод, а при попытке получить значение данного свойства — другой.
Как правило, свойство связано с некоторым внутренним полем переменной объекта. Но свойству вообще может не быть сопоставлена ни одна переменная объекта, хотя пользователь данного объекта имеет дело с ним так, как если бы это было настоящее поле.
Свойства повышают гибкость и безопасность программирования, поскольку, являясь частью открытого интерфейса, позволяют менять внутреннюю реализацию объекта без изменения его свойств. По своей сути, свойства предназначены для того, чтобы свести программирование к операциям над свойствами, скрывая вызовы методов.
Метод — это функция, принадлежащая какому-то классу или объекту.
Как и процедура, метод состоит из некоторого количества операторов для выполнения какого-то действия, имеет набор входных аргументов и возвращаемое значение.
Методы предоставляют интерфейс, при помощи которого осуществляется доступ к данным объекта некоторого класса, тем самым, обеспечивая инкапсуляцию данных.
Событие — это какое-либо действие, которое позволяет классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций.
Класс, отправляющий или вызывающий событие, называется издателем, а классы, принимающие или обрабатывающие событие, называются подписчиками.
В C++ в стандартном приложении Windows Forms или веб-приложении пользователь подписывается на события, вызываемые элементами управления, такими как кнопки и поля со списками.
Тип — это данные, которые могут принадлежать к нескольким классам, а класс, в свою очередь, может требовать, чтобы каждый его тип обязательно принадлежал к другому классу, или даже нескольким.
Класс — разновидность абстрактного типа данных, характеризуемый способом своего построения. Другие абстрактные типы данных — метаклассы, интерфейсы, структуры, перечисления характеризуются какими-то своими, другими особенностями. Суть отличия классов от других абстрактных типов данных состоит в том, что при задании типа данных класс определяет одновременно и интерфейс, и реализацию для всех своих экземпляров, а вызов метода-конструктора обязателен.
Все что не вошло в остальные разделы, но так же является очень интересным и полезным в написании различных программ.