Author:admin

Date:2008-09-25T16:19:15.000000Z


git-svn-id: https://svn.eiffel.com/eiffel-org/trunk@44 abb3cda0-5349-4a8f-a601-0c33ac3a8c38
This commit is contained in:
jfiat
2008-09-25 16:19:15 +00:00
parent 7d4e6a18b3
commit 2780526eae
234 changed files with 374 additions and 382 deletions

View File

@@ -3,7 +3,10 @@
[[Property:uuid|12c3409d-165b-b1df-e26a-b05d49969661]]
This sample consists of a command line reverse Polish notation (RPN) calculator.
{{note| '''Note:''' A RPN calculator works slightly differently from standard calculators. It consists of a stack of numbers. Operations are applied to the two numbers on top of the stack. The result is then put on top of the stack so that it can be used in the next operation. This sample refers to the top of the stack as ''Accumulator''.
{{note|A RPN calculator works slightly differently from standard calculators. It consists of a stack of numbers. Operations are applied to the two numbers on top of the stack. The result is then put on top of the stack so that it can be used in the next operation. This sample refers to the top of the stack as ''Accumulator''.This sample consists of a command line reverse Polish notation (RPN) calculator. }}
{{note|A RPN calculator works slightly differently from standard calculators. It consists of a stack of numbers. Operations are applied to the two numbers on top of the stack. The result is then put on top of the stack so that it can be used in the next operation. This sample refers to the top of the stack as ''Accumulator''. }}
==Compiling==
To compile the example:
@@ -36,7 +39,7 @@ Enter a number, followed by :
Enter the first number to be put onto the stack, for example <code>3</code>.
{{note| '''Note:''' Failing to enter a number at this stage will cause the sample to stop. This sample was designed to showcase the use of EiffelBase data structures and is not protected against unexpected entries. }}
{{note|Failing to enter a number at this stage will cause the sample to stop. This sample was designed to showcase the use of EiffelBase data structures and is not protected against unexpected entries. }}
You may then add another number on the stack by entering the character <code>a</code>:
<code>
@@ -77,7 +80,7 @@ Next operation?
You may use the operation <code>0</code> to clear the stack at any time. You may use <code>q</code> to quit the program.
{{tip| '''Tip:''' You can use the command <code>?</code> to display the list of available operations. }}
{{tip|You can use the command <code>?</code> to display the list of available operations. }}
==Under the Hood==
@@ -94,7 +97,7 @@ Each of these classes implement the feature do_one_state from STATE which perfor
Every descendant of STATE implement the feature operation which performs the corresponding stack transformation.
See the reference for the class interfaces.
}}

View File

@@ -36,7 +36,7 @@ Creating a thread is like creating an Eiffel object:
create my_thread
</code>
{{note| '''Note''': You have created a thread object but have not started the thread itself yet. <br/>
{{note|You have created a thread object but have not started the thread itself yet. <br/>
To run the thread, use the feature <eiffel>launch</eiffel> from <eiffel>THREAD</eiffel>. }}
<code> my_thread.launch</code>
On the Eiffel side, the procedure <eiffel>execute</eiffel> will be launched. This procedures deferred in class <eiffel>THREAD</eiffel>, you have to define it in <eiffel>MY_THREAD</eiffel>.
@@ -65,7 +65,7 @@ The implementation of the class <eiffel>MUTEX</eiffel> is mapped on the C standa
<code> my_mutex.is_set</code>
{{note| '''Note''': on Windows: The <eiffel>MUTEX</eiffel> objects on Windows are recursive while they are not on Unix. A recursive mutex can be locked twice by the same thread. }}
{{note|on Windows: The <eiffel>MUTEX</eiffel> objects on Windows are recursive while they are not on Unix. A recursive mutex can be locked twice by the same thread. }}
{{warning| '''Caution''': be sure that a mutex is unlocked when it is disposed. }}

View File

@@ -27,7 +27,7 @@ Name: smith
Password: mypass
</code>
{{note| '''Note:''' '' Name'' and ''Password'' are no required with ODBC. If you don't need ''Name'' and ''Password'', you can simply hit '''Return''' when prompted ''.'' }}
{{note|Name'' and ''Password'' are no required with ODBC. If you don't need ''Name'' and ''Password'', you can simply hit '''Return''' when prompted ''.'' }}
* For Oracle:
<code>
@@ -36,7 +36,7 @@ Name: smith@HANDSON
Password: mypass
</code>
{{note| '''Note:''' you have to specify the Oracle User Name and Net Service Name with the syntax ''<user>@<service> ''where ''<user>'' stands for the User Name and ''<service>'' stands for the Net Service Name. }}
{{note|you have to specify the Oracle User Name and Net Service Name with the syntax ''<user>@<service> ''where ''<user>'' stands for the User Name and ''<service>'' stands for the Net Service Name. }}
Then you can enter standard SQL queries to interact with your database, for instance:
@@ -46,7 +46,7 @@ John Smith
SQL>
</code>
{{note| '''Note:''' enter ''exit'' to quit the application. }}
{{note|enter ''exit'' to quit the application. }}
==Under the Hood==

View File

@@ -31,7 +31,7 @@ Name: smith
Password: mypass
</code>
{{note| '''Note:''' '' Name'' and ''Password'' are no required with ODBC. If you don't need ''Name'' and ''Password'', you can simply hit '''Return''' when prompted ''.'' }}
{{note|Name'' and ''Password'' are no required with ODBC. If you don't need ''Name'' and ''Password'', you can simply hit '''Return''' when prompted ''.'' }}
* For Oracle:
<code>
@@ -42,7 +42,7 @@ Name: smith@HANDSON
Password: mypass
</code>
{{note| '''Note:''' you have to specify the Oracle User Name and Net Service Name with the syntax ''<user>@<service> ''where ''<user>'' stands for the User Name and ''<service>'' stands for the Net Service Name. }}
{{note|you have to specify the Oracle User Name and Net Service Name with the syntax ''<user>@<service> ''where ''<user>'' stands for the User Name and ''<service>'' stands for the Net Service Name. }}
Then you can insert a book in the database, for instance:
@@ -64,7 +64,7 @@ Double value? 12.675
Object inserted
</code>
{{note| '''Note:''' if your database does not contain a <eiffel>DB_BOOK</eiffel> table, this example will create it. }}
{{note|if your database does not contain a <eiffel>DB_BOOK</eiffel> table, this example will create it. }}
==Under the Hood==

View File

@@ -40,7 +40,7 @@ Name: smith
Password: mypass
</code>
{{note| '''Note:''' '' Name'' and ''Password'' are no required with ODBC. If you don't need ''Name'' and ''Password'', you can simply hit '''Return''' when prompted. }}
{{note|Name'' and ''Password'' are no required with ODBC. If you don't need ''Name'' and ''Password'', you can simply hit '''Return''' when prompted. }}
* For Oracle:
<code>
@@ -49,7 +49,7 @@ Name: smith@HANDSON
Password: mypass
</code>
{{note| '''Note:''' you have to specify the Oracle User Name and Net Service Name with the syntax ''<user>@<service> ''where ''<user>'' stands for the User Name and ''<service>'' stands for the Net Service Name. }}
{{note|you have to specify the Oracle User Name and Net Service Name with the syntax ''<user>@<service> ''where ''<user>'' stands for the User Name and ''<service>'' stands for the Net Service Name. }}
Then you can select rows from this table with author's name, for instance:
@@ -77,7 +77,7 @@ First publication:07/01/1992 12:00:00.0 AM
Author? ('exit' to terminate):
</code>
{{note| '''Note:''' enter ''exit'' to quit the application. }}
{{note|enter ''exit'' to quit the application. }}
==Under the Hood==

View File

@@ -179,7 +179,7 @@ Table components can be associated to reflect relation of database tables repres
* 1 master component enables to manually select database table rows.
* Slave components automatically select table rows that are associated to the current table row of the master component.
{{note| '''Note''': Notice that table associations can be '''nested'''. }}
{{note|Notice that table associations can be '''nested'''. }}
2 types of associations are possible to reflect table relations:
* The slave table is dependent on the master table (1:N relationship)
@@ -265,7 +265,7 @@ Basic relationship between table component class and navigation class
DV_TABLEROWS_NAVIGATOR clients
{{note| '''Note''': DV_TABLEROWS_COMPONENT class merely carries a set of table rows and enables to select one table row. }}
{{note|DV_TABLEROWS_COMPONENT class merely carries a set of table rows and enables to select one table row. }}
DV_CONTROL_NAVIGATOR affords a way to navigate among searched table rows.
@@ -275,7 +275,7 @@ This class enables 2 navigation systems:
* Navigating among table rows with "previous" and "next" controllers.
* Navigating among table rows through a display list.
{{tip| '''Tip''': Notice that both systems can be used. }}
{{tip|Notice that both systems can be used. }}
You can directly set [[#dv_s_control| controllers]] for "previous" and"next" actions. A 3rd controller, "edit list", enables to show or raise the display list.
@@ -384,9 +384,9 @@ This cluster provides the model with an interface to input or output data on the
The [[ref:libraries/store/reference/dv_sensitive_control_chart|DV_SENSITIVE_CONTROL]] class lets a model class trigger a specific action on a determined user event. Furthermore, the model class lets the user know when its state enables to trigger the action, by setting the controller sensitivity (i.e. if the controller is insensitive, the action cannot be triggered).
{{note| '''Note''': sensitivity excepted, these controllers could have been implemented by Eiffel ''agents''. }}
{{note|sensitivity excepted, these controllers could have been implemented by Eiffel ''agents''. }}
{{note| '''Note''': sensitivity enables to let the user know ''before''triggering an action if this is possible or not. The other possibility is to let the user know ''after'' trying to trigger the action that it was not possible(with a warning for instance): this is often less convenient. }}
{{note|sensitivity enables to let the user know ''before''triggering an action if this is possible or not. The other possibility is to let the user know ''after'' trying to trigger the action that it was not possible(with a warning for instance): this is often less convenient. }}
The standard controllers are buttons or menu items: the specific action is triggered when button is clicked or menu item selected.
@@ -400,7 +400,7 @@ The standard graphical widgets to perform this are text fields, but several othe
* A combo-box so that the interface can suggest different values.
* A label if the text only need to be output.
{{note| '''Note''': customized, specific widgets can be defined, you can for instance take a look at the DV_STRING_LIST class. }}
{{note|customized, specific widgets can be defined, you can for instance take a look at the DV_STRING_LIST class. }}
===5.3. DV_SENSITIVE_INTEGER class===
@@ -425,7 +425,7 @@ The [[ref:libraries/store/reference/dv_tablerow_list_chart|DV_TABLEROW_LIST]] c
[[ref:libraries/store/reference/dv_tablerow_multilist_chart|DV_TABLEROW_MULTILIST]] implements DV_TABLEROW_LIST with an EiffelVision2 multi-column list.
{{note| '''Note''': This class is used for the [[#dv_control_navigator|standard implementation]] of [[ref:libraries/store/reference/dv_tablerows_navigator_chart|DV_TABLEROW_NAVIGATOR]] to [[#dv_tablerow_navigator|navigate among table rows]] selected from the database. }}
{{note|This class is used for the [[#dv_control_navigator|standard implementation]] of [[ref:libraries/store/reference/dv_tablerows_navigator_chart|DV_TABLEROW_NAVIGATOR]] to [[#dv_tablerow_navigator|navigate among table rows]] selected from the database. }}

View File

@@ -45,7 +45,7 @@ You can then access or modify [[ref:libraries/store/reference/db_table_flatshort
end
</code>
{{note| '''Note:''' to access attributes data with ''code'', you need to use the [[ref:/libraries/store/reference/db_table_description_flatshort|DB_TABLE_DESCRIPTION]] object associated to your [[ref:libraries/store/reference/db_table_flatshort|DB_TABLE]] object. }}
{{note|to access attributes data with ''code'', you need to use the [[ref:/libraries/store/reference/db_table_description_flatshort|DB_TABLE_DESCRIPTION]] object associated to your [[ref:libraries/store/reference/db_table_flatshort|DB_TABLE]] object. }}
===2.3. Getting objects metadata===
@@ -168,7 +168,7 @@ As seen in the previous section, to manipulate abstract table/view rows content,
As descriptions are unique, this means that description objects are also associated to a specific table object to deal with it (i.e. access or modify its content). Actually, the table_description feature associates the description with the current object and then returns this description.
{{note| '''Note:''' The table_description feature is still a query as the association part should not be visible at the interface level. }}
{{note|The table_description feature is still a query as the association part should not be visible at the interface level. }}
On the whole, you have to pay attention to always execute table_descriptionon your table/view row to get the appropriate description.

View File

@@ -64,7 +64,7 @@ Let us give some details about the set_base feature:
** Login information.
** Status information.
{{note| '''Note''': When database is inactive, its information is stored in the <eiffel>DATABASE_APPL</eiffel> object. }}
{{note|When database is inactive, its information is stored in the <eiffel>DATABASE_APPL</eiffel> object. }}
The corresponding code looks like:
@@ -82,7 +82,7 @@ The corresponding code looks like:
...
</code>
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[EiffelStore Interface Layer|The interface layer]] <br/>
}}

View File

@@ -3,7 +3,7 @@
[[Property:uuid|ef5568ff-dc7c-4c85-0174-335fdab1bd84]]
Use the [[ref:/libraries/store/reference/db_change_flatshort|DB_CHANGE]] class to perform any operation on your database that does not require access to a result. You can for instance modify table row content, drop table rows, create and delete tables.
{{note| '''Note''': Take a look at the [[Data Object Coupling|Data Storing]] capability if you want to '''insert''' table rows. }}
{{note|Take a look at the [[Data Object Coupling|Data Storing]] capability if you want to '''insert''' table rows. }}
[[ref:/libraries/store/reference/db_change_flatshort|DB_CHANGE]] allows you to modify the database data using the SQL language:
* Prepare your SQL query and use modify:
@@ -23,10 +23,10 @@ Use the [[ref:/libraries/store/reference/db_change_flatshort|DB_CHANGE]] class
session_control.commit
</code>
{{tip| '''Tip''': It is always better to check the database status for errors before committing changes. }}
{{tip|It is always better to check the database status for errors before committing changes. }}
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Data Object Coupling|Data storing]] <br/>
[[Stored Procedures|Stored procedures]] <br/>
[[EiffelStore Implementation Layer|Implementation]] <br/>

View File

@@ -19,7 +19,7 @@ A [[ref:/libraries/store/reference/db_repository_flatshort|DB_REPOSITORY]] obje
end
</code>
{{tip| '''Tip''': Loading a table description is often a costly operation: table has to be fetched among existing tables then every table column description must be loaded. Hence it is better to store and reuse a repository (maybe with a HASH_TABLE) once it has been loaded. }}
{{tip|Loading a table description is often a costly operation: table has to be fetched among existing tables then every table column description must be loaded. Hence it is better to store and reuse a repository (maybe with a HASH_TABLE) once it has been loaded. }}
Using the table information, [[ref:/libraries/store/reference/db_repository_flatshort|DB_REPOSITORY]] then helps generating Eiffel classes mapping relational tables:
* You can directly use {[[ref:/libraries/store/reference/db_repository_flatshort|DB_REPOSITORY]] }.generate_class. Generated class may look like:
@@ -40,7 +40,7 @@ Using the table information, [[ref:/libraries/store/reference/db_repository_flat
...
</code>
{{note| '''Note''': The EiffelStore Wizard uses the generation.generator cluster to generate the classes mapped to your database. }}
{{note|The EiffelStore Wizard uses the generation.generator cluster to generate the classes mapped to your database. }}
==Inserting data in the database==
@@ -79,10 +79,10 @@ This is straight-forward since you only have to give [[ref:/libraries/store/refe
end
</code>
{{note| '''Note''': You can see how actions are used in [[ref:/libraries/store/reference/db_selection_flatshort|DB_SELECTION]] . }}
{{note|You can see how actions are used in [[ref:/libraries/store/reference/db_selection_flatshort|DB_SELECTION]] . }}
<br/>
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Database Selection|Performing a database selection.]] <br/>
[[Data structures use|Database-specific structures use.]] <br/>
}}

View File

@@ -11,11 +11,11 @@
</code>
<br/>
{{note| '''Note''': Calling set_base links the EiffelStore interface to this specific handle. }}
{{note|Calling set_base links the EiffelStore interface to this specific handle. }}
{{tip| '''Tip''': You can manage handles to many databases: as an instance of <eiffel>DATABASE_APPL</eiffel> stands for a specific database handle, you only have to create one instance of <eiffel>DATABASE_APPL</eiffel> for every DBMS handle you wish to create. Do not forget to call set_base to activate appropriate handle. }}
{{tip|You can manage handles to many databases: as an instance of <eiffel>DATABASE_APPL</eiffel> stands for a specific database handle, you only have to create one instance of <eiffel>DATABASE_APPL</eiffel> for every DBMS handle you wish to create. Do not forget to call set_base to activate appropriate handle. }}
{{note| '''Note''': The generic parameter of <eiffel>DATABASE_APPL</eiffel> specifies the actual DBMS used. }}
{{note|The generic parameter of <eiffel>DATABASE_APPL</eiffel> specifies the actual DBMS used. }}
# Once your handle is created, you have to create a session manager which will allow you to manage your database, specifically to establish connection, disconnect and also handle errors. The class <eiffel>DB_CONTROL</eiffel> enables your application to plainly control the functioning and status of your database and to request any information about it.
<code>
@@ -26,10 +26,10 @@
session_control.connect
</code>
{{note| '''Note''': Take a look at the [[Database control|database control]] part to see how to use <eiffel>DB_CONTROL</eiffel> capabilities. }}
{{note|Take a look at the [[Database control|database control]] part to see how to use <eiffel>DB_CONTROL</eiffel> capabilities. }}
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Database control|Database control and error handling]] <br/>
[[EiffelStore Implementation Layer|Implementation]] <br/>
}}

View File

@@ -59,7 +59,7 @@ The loop performs a multi-step transaction. If transaction is not carried out en
{{warning| '''Caution''': Some databases can be in an auto-commit mode. Furthermore, some special database commands can automatically commit database changes. }}
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Database Connection|Database connection]] <br/>
[[EiffelStore Implementation Layer|Implementation]] <br/>
}}

View File

@@ -3,7 +3,7 @@
[[Property:uuid|de759a74-b3e1-c937-e620-67526c116925]]
Use the [[ref:/libraries/store/reference/db_selection_flatshort|DB_SELECTION]] class to select data from the database. Once you have selected the data, you can [[Selection Access|access]] it with convenience using adaptative EiffelStore structures.
{{note| '''Note''': Take a look at the [[Data Object Coupling|Database/Eiffel objects Coupling]] if you need information about your database structure. }}
{{note|Take a look at the [[Data Object Coupling|Database/Eiffel objects Coupling]] if you need information about your database structure. }}
[[ref:/libraries/store/reference/db_selection_flatshort|DB_SELECTION]] enables your application to get database content using SQL 'select' queries:
* You can carry out 'select' queries in an intuitive way using directly the SQL language:
@@ -15,11 +15,11 @@ Use the [[ref:/libraries/store/reference/db_selection_flatshort|DB_SELECTION]]
selection.execute
</code>
{{tip| '''Tip''': Always check the database status for errors after your 'select' query. }}
{{tip|Always check the database status for errors after your 'select' query. }}
* You can also customize your selection using [[Query variables|bind variables]] .
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Query variables|Binding variables in a database query.]] <br/>
[[Data Object Coupling|Coupling database objects with Eiffel objects.]] <br/>
[[Selection Access|Accessing selected data from the database.]] <br/>

View File

@@ -13,9 +13,9 @@ The interface affords these main capabilities:
* Using [[Stored Procedures|stored procedures]] .
* Dealing with database [[Database control|status and behavior]] .
{{note| '''Note''': In general, each of these capabilities corresponds to one EiffelStore class. }}
{{note|In general, each of these capabilities corresponds to one EiffelStore class. }}
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[EiffelStore Implementation Layer|The implementation layer]] }}

View File

@@ -22,7 +22,7 @@ Variables syntax is simple: the ':' special character followed by the variable n
selection.set_query ("Select * from CONTACTS where Firstname = ':" + Bind_var + "'")
</code>
{{note| '''Note''': The code example shows how to bind variables to a [[ref:/libraries/store/reference/db_selection_chart|DB_SELECTION]] object but the mechanism is exactly the same for [[ref:/libraries/store/reference/db_change_chart|DB_CHANGE]] objects. }}
{{note|The code example shows how to bind variables to a [[ref:/libraries/store/reference/db_selection_chart|DB_SELECTION]] object but the mechanism is exactly the same for [[ref:/libraries/store/reference/db_change_chart|DB_CHANGE]] objects. }}
==Binding variables to a query==
@@ -40,7 +40,7 @@ Once you have created your query, you can map variable names to values and execu
end
</code>
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Database Selection|Performing a database selection.]] <br/>
[[Data Modification|Modifying database content.]] <br/>
}}

View File

@@ -3,7 +3,7 @@
[[Property:uuid|3b4fdde3-d903-55c8-0068-cee2407db280]]
Once you have [[Database Selection|selected data]] from the database, it returns a set of rows containing queried columns values. Each row loaded with DB_SELECTION is stored in a DB_RESULT object. The easiest way to access the data is thus to refer to DB_RESULT objects themselves.
{{note| '''Note''': Take a look at the [[Data Object Coupling|Database/Eiffel objects Coupling]] to learn advanced data handling features. }}
{{note|Take a look at the [[Data Object Coupling|Database/Eiffel objects Coupling]] to learn advanced data handling features. }}
To use DB_RESULT, process in 2 steps:
* [[#retrieve|retrieve]] DB_RESULT objects.
@@ -41,7 +41,7 @@ To use DB_RESULT, process in 2 steps:
end
</code>
{{tip| '''Tip''': Provide [[ref:/libraries/store/reference/db_selection_flatshort|DB_SELECTION]] with the LIST structure convenient for what you need to do with the results. }}
{{tip|Provide [[ref:/libraries/store/reference/db_selection_flatshort|DB_SELECTION]] with the LIST structure convenient for what you need to do with the results. }}
* You want to '''select part''' of the result set: you can set an action in [[ref:/libraries/store/reference/db_selection_flatshort|DB_SELECTION]] that will be executed each time a row is loaded. This action can for instance manipulate current row and define a stop condition.
** You need to define a descendant of class ACTION and set it to [[ref:/libraries/store/reference/db_selection_flatshort|DB_SELECTION]] :
@@ -93,7 +93,7 @@ A DB_RESULT object merely carries data retrieved from the database. You have to
end
</code>
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Database Selection|Performing a database selection.]] <br/>
[[Data Object Coupling|Coupling database data and Eiffel objects.]] <br/>
}}

View File

@@ -22,11 +22,11 @@ To execute a stored procedure:
</code>
* Execute the procedure through a [[ref:/libraries/store/reference/db_selection_chart|DB_SELECTION]] (if a result is expected) or a [[ref:/libraries/store/reference/db_change_chart|DB_CHANGE ]] object (otherwise).
{{note| '''Note''': Requests with a result ([[ref:/libraries/store/reference/db_selection_chart|DB_SELECTION]] ) or without ([[ref:/libraries/store/reference/db_change_chart|DB_CHANGE]] ) are both abstract '''expressions'''. DB_PROC executes an abstract expression using an object of [[ref:/libraries/store/reference/db_expression_chart|DB_EXPRESSION]] type, which corresponds to an abstract expression. [[ref:/libraries/store/reference/db_selection_chart|DB_SELECTION]] and [[ref:/libraries/store/reference/db_change_chart|DB_CHANGE]] inherits from [[ref:/libraries/store/reference/db_expression_chart|DB_EXPRESSION]] . }}
{{note|Requests with a result ([[ref:/libraries/store/reference/db_selection_chart|DB_SELECTION]] ) or without ([[ref:/libraries/store/reference/db_change_chart|DB_CHANGE]] ) are both abstract '''expressions'''. DB_PROC executes an abstract expression using an object of [[ref:/libraries/store/reference/db_expression_chart|DB_EXPRESSION]] type, which corresponds to an abstract expression. [[ref:/libraries/store/reference/db_selection_chart|DB_SELECTION]] and [[ref:/libraries/store/reference/db_change_chart|DB_CHANGE]] inherits from [[ref:/libraries/store/reference/db_expression_chart|DB_EXPRESSION]] . }}
You can execute your request mostly like a basic one:
** Create your request.
** Bind request variables. Variables are stored procedure arguments.
{{note| '''Note''': Take a look at how to [[Query variables|bind variables]] to a query. }}
{{note|Take a look at how to [[Query variables|bind variables]] to a query. }}
** Execute the query through the DB_PROC object.
<code>
@@ -62,7 +62,7 @@ The following example shows how to overwrite a procedure in the database:
end
</code>
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Database Selection|Performing a database selection.]] <br/>
[[Data Object Coupling|Coupling database data and Eiffel objects.]] <br/>
}}

View File

@@ -5,19 +5,19 @@ An EiffelBuild [[EiffelBuild Notation|object]] is a representation of a Vision2
To create a new instance of an object, [[EiffelBuild Notation|pick]] a type from the [[Type selector|type selector]] and [[EiffelBuild Notation|drop]] onto an existing [[EiffelBuild Notation|object]] (Accessible from the [[Layout constructor|layout constructor]] or [[Builder window|builder window]] ). You will only be able to complete the [[EiffelBuild Notation|drop]] if the targeted [[EiffelBuild Notation|object]] will accept a new object of the transported type.
{{note| '''Note''': Once an [[EiffelBuild Notation|object]] has been [[Create an object|created]] , it will always be contained in a parent [[EiffelBuild Notation|object]] until [[Delete an object|deleted]] . }}
{{note|Once an [[EiffelBuild Notation|object]] has been [[Create an object|created]] , it will always be contained in a parent [[EiffelBuild Notation|object]] until [[Delete an object|deleted]] . }}
==Creating Window and Dialog Objects==
Window and dialog objects are created by picking a type from the [[Type selector|type selector]] and dropping into the [[Widget selector|widget selector]] . If the target of the drop is a directory within the widget selector, the new object is created within that directory, otherwise in the root of the project location. Window and dialog objects are generated as individual classes by EiffelBuild.
{{note|'''Note''' If there are no other windows or directories in the project, the newly created object is set as the root window.}}
{{note|If there are no other windows or directories in the project, the newly created object is set as the root window.}}
==Creating objects for re-use==
If you wish to create an object that may be re-used in multiple locations within your EiffelBuild project, pick the type from the [[Type selector|type selector]] and drop into the [[Widget selector|widget selector]] . This ensures that at generation time, the object is generated as a seperate class (as with all objects in the [[Widget selector|widget selector]] ). Objects within the [[Widget selector|widget selector]] may be used in a client fashion within other object structures as required, and any changes made to these objects are reflected at all locations in which they are used.
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Type selector|Type selector]] <br/>
[[Reparent an Object|Reparent an object]] <br/>
[[Delete an object|Delete an object]] }}

View File

@@ -5,9 +5,9 @@ To remove an [[EiffelBuild Notation|object]] from your EiffelBuild system, [[Ei
You may also delete via the keyboard by pressing the delete key while the tool containing the objects representation has the focus. Whichever [[EiffelBuild Notation|object]] has the selection is deleted.
{{note| '''Note''': To restore a deleted object, you may use the [[History|History]] }}
{{note|To restore a deleted object, you may use the [[History|History]] }}
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[History|History]] <br/>
[[Type selector|Type selector]] }}

View File

@@ -15,7 +15,7 @@ Selecting 'Ok' will create a new project, overwriting the existing project, and
Selecting 'Cancel' will return you to the directory selection dialog, from which you can select the directory in which you wish to create the new Build project.
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Retrieving a project from a Build project file|Retrieving a project from a Build project file]] <br/>
}}

View File

@@ -13,7 +13,7 @@ You may also open a recent EiffelBuild project via the 'Recent Projects' entry o
This list contains the most recent projects that have been used within EiffelBuild, and if none are available, this list is empty and the menu option disabled.
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[EiffelBuild: Creating a new project|Creating a new project]] }}

View File

@@ -14,7 +14,7 @@ Upon completion of the import, there are two possible outcomes:
* One or more name clashes occurred: One or more objects or constants from the imported project had names that matched that of objects in the open project. As the names are used directly in the generated code, they must be unique within their scope (accessible within the code), and therefore EiffelBuild must resolve these clashes. A dialog is displayed on screen showing all the names that were resolved by EiffelBuild:
[[Image:import-project-clashes]]
{{note| '''Note''': If a name clash occurs, the names of the imported project are modified, not the open project. }}
{{note|If a name clash occurs, the names of the imported project are modified, not the open project. }}

View File

@@ -7,11 +7,11 @@ When an [[EiffelBuild Notation|object]] is inserted into a parent, it is always
You can access [[EiffelBuild Notation|objects]] from both the [[Builder window|builder window]] and [[Layout constructor|layout constructor]] .
{{note|'''Note''' Although window and dialog objects may be accessed within the [[Widget selector|widget selector]] , it is not possible to build into these objects, you should use the [[Layout constructor|layout constructor]] or [[Builder window|builder window]] directly in this situation. }}
{{note|Although window and dialog objects may be accessed within the [[Widget selector|widget selector]] , it is not possible to build into these objects, you should use the [[Layout constructor|layout constructor]] or [[Builder window|builder window]] directly in this situation. }}
For more information about an [[EiffelBuild Notation|objects]] capacity and permitted children, see the [[EiffelVision Introduction|EiffelVision2]] documentation.
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Create an object|Create an object]] <br/>
[[Delete an object|Delete an object]] <br/>
[[Builder window|Builder window]] <br/>

View File

@@ -5,9 +5,9 @@ To save the project that is currently open, select '''Save''' from the '''File''
Alternatively, you may use the keyboard shortcut - '''Ctrl+S'''
{{note| '''Note''': If no changes have been made to the system, the save command will be disabled. }}
{{note|If no changes have been made to the system, the save command will be disabled. }}
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[EiffelBuild: Key shortcuts|Key shortcuts]] }}

View File

@@ -10,7 +10,7 @@ This window may either be shown or hidden (default). To change between these two
The content of this window is a representation of the [[EiffelBuild Notation|objects]] you have defined in your project. Each [[EiffelBuild Notation|object]] is represented by the [[EiffelVision Introduction|EiffelVision2]] control matching its type. For example, an [[EiffelBuild Notation|object]] representing an <eiffel>EV_BUTTON</eiffel> will be displayed in here using an <eiffel>EV_BUTTON</eiffel>. As this view provides direct access to the objects ( [[EiffelBuild Notation|Pick]] any of the controls in this window), it enables you to build your interface within a view which provides rich visual feedback.
Because this window is just a view of the [[EiffelBuild Notation|objects]] , it will be always synchronized with the [[Layout constructor| layout constructor]] . This means you can [[Reparent an Object| re-parent objects]] , using the [[EiffelBuild Notation|pick and drop]] transport method, seamlessly between the two views. <br/>
{{note|'''Note:''' Holding Ctrl while right clicking on an [[EiffelBuild Notation|object]] in the Builder Window creates a new [[Object editor|object editor]] targeted to the [[EiffelBuild Notation|object]] . Holding Ctrl and Shift while right clicking on an [[EiffelBuild Notation|object]] , highlights it within the [[Layout constructor|layout constructor]] .}}
{{note|Holding Ctrl while right clicking on an [[EiffelBuild Notation|object]] in the Builder Window creates a new [[Object editor|object editor]] targeted to the [[EiffelBuild Notation|object]] . Holding Ctrl and Shift while right clicking on an [[EiffelBuild Notation|object]] , highlights it within the [[Layout constructor|layout constructor]] .}}
==Visual Differences==
@@ -24,7 +24,7 @@ The properties of the [[EiffelBuild Notation|objects]] in you system are always
* 'user_can_resize', 'maximum_width', 'maximum_height' and 'title_string' are not reflected in this window.
* 'minimum_width' and `minimum_height' are not reflected in any of the controls representing [[EiffelBuild Notation|objects]] within this window.
{{seealso| '''See also''' <br/>
{{seealso|<br/>
[[Display window|Display window]] <br/>
[[Layout constructor| Layout constructor]] }}

View File

@@ -24,13 +24,13 @@ If the [[EiffelBuild Notation|pick and drop]] completed successfully, then you
To remove a [[EiffelBuild Notation|component]] from your EiffelBuild system, [[EiffelBuild Notation|pick]] it, and then [[EiffelBuild Notation|drop]] it on [[Image:icon-delete-small-color]] in the [[Main toolbar| main toolbar]] .
{{note| '''Note''': The deletion of a [[EiffelBuild Notation|component]] cannot be undone. }}
{{note|The deletion of a [[EiffelBuild Notation|component]] cannot be undone. }}
==Viewing a component==
To view an existing component, use the [[Component viewer|component_viewer]] .
{{seealso| '''See also''' <br/>
{{seealso|<br/>
[[Component viewer|Component_viewer]] <br/>
[[Builder window|Builder window]] <br/>
[[Layout constructor| Layout Constructor]] }}

View File

@@ -19,9 +19,9 @@ Looking at the left-hand screenshot above, you can see that the [[Image:icon-co
* '''Builder view''' - This view is similar to the view used by the [[Display window|display window]] . i.e. the [[EiffelVision Introduction|EiffelVision2]] controls are displayed exactly as is defined in the [[EiffelBuild Notation|component]] .
* '''Display view''' - This view is similar to the view used by the [[Builder window|builder window]] . i.e. all [[EiffelVision Introduction|EiffelVision2]] containers are represented by frames so they are immediately visible. This makes the actual structure represented by the [[EiffelBuild Notation|component]] completely visible.
{{note| '''Note''': The type of the "root_object" within the component is displayed in the toolbar of the component viewer. }}
{{note|The type of the "root_object" within the component is displayed in the toolbar of the component viewer. }}
{{seealso| '''See also''' <br/>
{{seealso|<br/>
[[Builder window|Builder window]] <br/>
[[Layout constructor| Layout constructor]] }}

View File

@@ -30,7 +30,7 @@ To add a new constant to your project, select the type of the constant that you
* '''Font''' - Enter a name in the "Name" field, and then select "New" which displays a font dialog. Selecting a font from this dialog and pressing "OK" adds the new font constant to the project.
* '''Color''' - Enter a name in the "Name" field, and then select "New" which displays a color dialog. Selecting a color from this dialog and pressing "OK" adds the new color constant to the project.
{{note| '''Note''': After adding a new constant, it is immediately displayed with all constants in the dialog. }}
{{note|After adding a new constant, it is immediately displayed with all constants in the dialog. }}
===Modifying an existing constant===
@@ -50,7 +50,7 @@ To remove a constant from the project, select it in the multi column list, and s
As objects are reliant on the constant you are removing, you must confirm that you really wish to remove it from the system. If you select "OK", the constant is removed, and the object property relying on that constant is converted to a manifest value. For example, if you are using an Integer constant with a value of 100, and you remove the constant, the property no longer references the constant, but is set explicitly to 100.
{{note| '''Note''': You may sort the constants displayed in the dialog, by clicking the associated column header. }}
{{note|You may sort the constants displayed in the dialog, by clicking the associated column header. }}
==String constant==
@@ -148,7 +148,7 @@ The Pixmap Constant dialog is used to select pixmaps for addition to an EiffelBu
[[Image:pixmap-selection-dialog]]
An individual pixmap may be selected, or a whole directory of pixmaps may be selected from this dialog for addition. In the screenshot above, a directory containing two pixmaps was selected. The "Build from" option at the bottom of the dialog permits you to select if you wish to add an absolute or relative pixmap, and if multiple pixmaps are being added, the currently selected pixmap from the list above is active. The relative "DIRECTORY" for relative pixmaps is filled in automatically if EiffelBuild finds a directory constant in the system that matches the path chosen. If not, you may enter a name in this field to create a new directory matching the required path. If you do not enter a directory name for one or more relative pixmaps, upon closing the dialog, you will be prompted to enter a name for a directory constant used for these pixmaps.
{{note| '''Note''': If you are selecting new pixmaps, and they appear in the dialog as unchecked, it means that an equivalent pixmap already exists in the project. }}
{{note|If you are selecting new pixmaps, and they appear in the dialog as unchecked, it means that an equivalent pixmap already exists in the project. }}
==Loading constants==
@@ -162,9 +162,9 @@ By default, all constant values are hard coded into the implementation class, bu
Constants may be associated to properties of your [[EiffelBuild Notation|objects]] via an [[Object editor|object editor]] targeted to that [[EiffelBuild Notation|object]] . The [[Image:icon-format-onces-color]] button denotes the use of a constant value. For more information regarding using constants, in [[Object editor|object editors]] , see [[Object editor|object editor]] .
When an EiffelBuild project is generated, all constants are added to a class, inherited by each window class. There is an "_IMP" and interface versions of these classes as with each window. For more information regarding the generation of constants, see [[EiffelBuild: Code Generation|code generation]] .
{{note| '''Note''': To modify pixmap constants based on the current installation of an EiffelBuild generated interface, simply redefine the Directory constant used to access the pixmaps within the interface constants class (not "_IMP"), which is not re-generated if it already exists. }}
{{note|To modify pixmap constants based on the current installation of an EiffelBuild generated interface, simply redefine the Directory constant used to access the pixmaps within the interface constants class (not "_IMP"), which is not re-generated if it already exists. }}
{{seealso| '''See also''': <br/>
{{seealso|<br/>
[[EiffelBuild: Code Generation|Code generation]] <br/>
[[Object editor|Object editor]] <br/>
[[EiffelBuild: Project settings window|Project settings]] }}

View File

@@ -11,7 +11,7 @@ This view is provided so that you can really see what your project will look lik
All properties that have been set on the [[EiffelBuild Notation|objects]] in your project are set in the [[EiffelVision Introduction|EiffelVision2]] control matching its type.
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Builder window|Builder window]] <br/>
[[Layout constructor|Layout constructor]] }}

View File

@@ -21,7 +21,7 @@ If the "generate as client" option is selected for a particular object (changeab
[[Image:class-project-diagram-client]]
{{note| '''Note''': All other diagrams on this page show only the non client version of the settings, where the generated widget inherits from the EiffelVision class. }}
{{note|All other diagrams on this page show only the non client version of the settings, where the generated widget inherits from the EiffelVision class. }}
==Project build type==
@@ -40,11 +40,11 @@ The choice to generate an interface and an implementation class for the windows
Using this mechanism, you can generate your initial system using EiffelBuild, and implement any event features that have been generated (in the interface) by EiffelBuild. If you then decide that you wish to modify the look and the feel of the interface, you can return to EiffelBuild, make the necessary adjustments and then re-generate the system.
{{note| '''Note''': When returning to EiffelBuild to modify the interface, if you delete or rename controls, then it is quite possible that you will break your existing code. Care should be taken with all changes of this type. }}
{{note|When returning to EiffelBuild to modify the interface, if you delete or rename controls, then it is quite possible that you will break your existing code. Care should be taken with all changes of this type. }}
Looking at a generated system, you will see that the [[Object editor|events]] connected to your controls are defined as deferred in the implementation and actually implemented in the interface class. This means that if you return to EiffelBuild with a previously generated system, and add a new event to a control, then you will have to implement the definition in the interface class yourself (as the class interface class is not re-generated).
{{seealso| '''See also''': <br/>
{{seealso|<br/>
[[EiffelBuild: Project settings window|Project settings]] }}

View File

@@ -16,7 +16,7 @@ The tool may now be freely moved to any location on screen, in the same fashion
** '''Closing the window''' - Clicking the cross displayed to the right hand side of the windows title bar causes the window to be destroyed, and the tool contained to be restored back to its original position within the main window.
{{note| '''Note''': The position of tools that have been docked, is maintained automatically between EiffelBuild sessions. When a new project is opened, they are restored to the positions that they had during the last use. }}
{{note|The position of tools that have been docked, is maintained automatically between EiffelBuild sessions. When a new project is opened, they are restored to the positions that they had during the last use. }}
==Main window with externally docked tools==
@@ -24,7 +24,7 @@ The following screenshot illustrates the appearance of the main window with all
[[Image:main-window-with-docked-tools]]
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[EiffelBuild: General interface description|General interface description]] }}

View File

@@ -38,7 +38,7 @@ This page gathers all the keyboard shortcuts available in the environment.
'''Note''': These shortcuts are not always available and are dependent on the state of EiffelBuild. For example, Ctrl+S does nothing if there is no modified project open.
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[EiffelBuild: General interface description|General interface description]] }}

View File

@@ -16,7 +16,7 @@ The window contains several different tools, highlighted below:
The [[Type selector|type selector]] , [[Component selector|component selector]] and [[Widget selector|widget selector]] may all be docked from their original position, permitting re-ordering and customization of the main window. Each of these may be docked external to the main window, permitting each to be displayed in their own movable window. For more information regarding the docking mechanism, see [[Docking|docking]] .
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Main toolbar| Main toolbar]] <br/>
[[Layout constructor| Layout constructor]] <br/>
[[Type selector|Type selector]] <br/>

View File

@@ -13,9 +13,9 @@ The button marked "Restore Defaults" in the lower left hand corner of the dialog
When you have finished modifying the preferences, select the "Close" button to close the dialog.
{{note| '''Note''': The preferences are saved automatically by EiffelBuild, even if the open project is not saved, the preferences are saved whenever a property changes. }}
{{note|The preferences are saved automatically by EiffelBuild, even if the open project is not saved, the preferences are saved whenever a property changes. }}
{{seealso| '''See also''': <br/>
{{seealso|<br/>
[[EiffelBuild: General interface description|General interface description]] <br/>
[[EiffelBuild Reference|EiffelBuild reference]] }}

View File

@@ -31,7 +31,7 @@ This entry is used as the name of the constants class generated by EiffelBuild t
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[EiffelBuild: Code Generation|Code generation]] <br/>
[[EiffelBuild: Project settings window|Project settings window]] <br/>
[[Generation Tab|Generation tab]] <br/>

View File

@@ -15,7 +15,7 @@ The window is organized as two tabs:
All options are enabled and saved into the project settings file, 'build_project.bpr' as soon as the window is closed.
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[EiffelBuild: Code Generation|Code generation]] }}

View File

@@ -25,9 +25,9 @@ Looking at the screenshot above, you will see that the last action in the histor
If you execute an action which will be added to the history while the history is not at the final position, all history events after this current position will be removed, and the history will be up to date again.
{{note| '''Note''': If you use the history list to move through many recorded actions at once, there may be a slight delay dependent on the systems complexity and steps moved. }}
{{note|If you use the history list to move through many recorded actions at once, there may be a slight delay dependent on the systems complexity and steps moved. }}
{{seealso| '''See also''' <br/>
{{seealso|<br/>
[[Builder window|Builder window]] <br/>
[[Layout constructor| Layout constructor]] }}

View File

@@ -41,7 +41,7 @@ You may convert an existing widget structure into a locked instance of a widget
{{note|Double clicking on a locked object within the Layout Constructor, targets the object of which it is an instance to the Layout Constructor. }}
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Builder window|Builder window]] <br/>
[[Object editor|Object editor]] <br/>
[[Display window|Layout window]] }}

View File

@@ -19,7 +19,7 @@ These object editors appear in their own window, and you may open as many of the
To open a new floating object editor, [[EiffelBuild Notation|drop]] an [[EiffelBuild Notation|object]] on [[Image:icon-object-editor-color]] , displayed in the [[Main toolbar| main toolbar]] and also in each existing object editor. The new object editor will then be targeted to the [[EiffelBuild Notation|object]] that was [[EiffelBuild Notation|dropped]] .
{{note| '''Note''': If the [[EiffelBuild Notation|object]] targeted to floating object editor is deleted, then the editor will be destroyed. This helps stop the screen becoming cluttered with empty editors. }}
{{note|If the [[EiffelBuild Notation|object]] targeted to floating object editor is deleted, then the editor will be destroyed. This helps stop the screen becoming cluttered with empty editors. }}
As a shortcut to a complete [[EiffelBuild Notation|pick and drop]] transport, you may hold down the Ctrl key while starting the [[EiffelBuild Notation|pick]] , which will immediately open a new floating object editor targeted to the [[EiffelBuild Notation|object]] you clicked.
@@ -33,7 +33,7 @@ When an object editor is targeted to an [[EiffelBuild Notation|object]] , you wi
All properties that may be manipulated in an object editor correspond directly to a property of the [[EiffelVision Introduction|EiffelVision2]] control that is represented by the [[EiffelBuild Notation|object]] (Displayed in an object editor as '''type'''). There is one exception to that rule though, and that is the '''Name''' field which is specific to EiffelBuild. This field is used for your identification of the [[EiffelBuild Notation|object]] and as the attribute name in the generated code. For example, when EiffelBuild generates code corresponding to the [[EiffelBuild Notation|object]] targeted in the editor shown above, it would declare the vision2 component as - button1: EV_BUTTON
{{note| '''Note''': You may have as many object editors targeted to the same [[EiffelBuild Notation|object]] as you wish. Whenever a change is made to the [[EiffelBuild Notation|object]] through one of the editors, all other editors targeted to that [[EiffelBuild Notation|object]] are synchronized. }}
{{note|You may have as many object editors targeted to the same [[EiffelBuild Notation|object]] as you wish. Whenever a change is made to the [[EiffelBuild Notation|object]] through one of the editors, all other editors targeted to that [[EiffelBuild Notation|object]] are synchronized. }}
==Using Constants==
@@ -52,7 +52,7 @@ For all "top level" objects (those contained within the [[Widget selector|widget
As well as being able to manipulate the standard properties of an [[EiffelBuild Notation|object]] , facilities are provided for connecting to the events of an [[EiffelBuild Notation|object]] . Looking at the object editor screenshot above, you will see that there is a button marked '''Select events''' which is also available in all targeted editors.
{{note| '''Note''': The button will be marked '''Modify events''' when one or more events are already selected for the current [[EiffelBuild Notation|object]] . }}
{{note|The button will be marked '''Modify events''' when one or more events are already selected for the current [[EiffelBuild Notation|object]] . }}
Clicking this button will cause the following dialog to be displayed:
@@ -62,9 +62,9 @@ Looking at the screenshot above, you will see that this dialog contains all the
If you check a button connected with one of the action sequences, you will be then able to enter the name of a feature that you wish to connect to the action sequence. The screenshot above shows the user has connected a feature named `button_pressed' to the `select_actions'. When [[EiffelBuild: Code Generation|code is generated]] , this will cause EiffelBuild to generate an empty feature named `button_pressed' already connected to the `select_actions' of the button.
{{note| '''Note''': You will only be allowed to enter valid and unique Eiffel feature names. If a name is invalid, it will be highlighted in red, and a dialog will warn you when you attempt to close the dialog. }}
{{note|You will only be allowed to enter valid and unique Eiffel feature names. If a name is invalid, it will be highlighted in red, and a dialog will warn you when you attempt to close the dialog. }}
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Create an object|Create an object]] <br/>
[[Delete an object|Delete an object]] }}

View File

@@ -10,7 +10,7 @@ With this control, you can merge two or more instances of <eiffel>EV_CONTAINER</
==Merging==
To create a new merge, [[EiffelBuild Notation|pick]] an [[EiffelBuild Notation|object]] of type <eiffel>EV_CONTAINER</eiffel>, and [[EiffelBuild Notation|drop]] it anywhere on the control. This will merge the radio button group of the <eiffel>EV_CONTAINER</eiffel> referenced in the object editor, to the transported one. Each merge, will show up as a new item in the control.
{{note| '''Note''': Container objects may only be grouped once, and as such, you will not be permitted to add an [[EiffelBuild Notation|object]] that is already contained in the list. }}
{{note|Container objects may only be grouped once, and as such, you will not be permitted to add an [[EiffelBuild Notation|object]] that is already contained in the list. }}
==Unmerging==

View File

@@ -7,7 +7,7 @@ If the current [[EiffelBuild Notation|object]] in the object editor is of type
* '''Moving''' - Press and hold the left mouse button within the selected child, and move the mouse.
* '''Resizing''' - Move the mouse over the border of the child, until the cursor changes to a resize cursor, then press and hold the left mouse button to re-size the child.
{{note| '''Note''': As placing a child in an <eiffel>EV_FIXED</eiffel> does not modify the size of the child, it is possible that some children have a size of 0x0 pixels, and hence do not show up in the diagram. In this case, there will be the following displayed in the status bar "Widget is 0x0 pixels, click HERE to enlarge". If you subsequently click on the status bar, then the widget will be enlarged to a more useful size. }}
{{note|As placing a child in an <eiffel>EV_FIXED</eiffel> does not modify the size of the child, it is possible that some children have a size of 0x0 pixels, and hence do not show up in the diagram. In this case, there will be the following displayed in the status bar "Widget is 0x0 pixels, click HERE to enlarge". If you subsequently click on the status bar, then the widget will be enlarged to a more useful size. }}
==Grid Properties==

View File

@@ -9,7 +9,7 @@ Each of the children are displayed on a grid representing the table cells that e
* '''Moving''' - Press and hold the left mouse button within the selected child, and move the mouse.
* '''Resizing''' - Move the mouse over the border of the child, until the cursor changes to a resize cursor, then press and hold the left mouse button to re-size the child.
{{note| '''Note''': Each child, may only occupy a unique set of cells within the table, and if you attempt to move or re-size a child to an invalid position, it will be displayed in gray. }}
{{note|Each child, may only occupy a unique set of cells within the table, and if you attempt to move or re-size a child to an invalid position, it will be displayed in gray. }}
When you have finished manipulating the children of the table, click the button marked "Done" to close the dialog.

View File

@@ -7,7 +7,7 @@ The type selector contains all the available Vision2 types supported by EiffelBu
The types are organized into three groups - Primitives, Containers and Items. All types that may be used in EiffelBuild have a text in uppercase, corresponding to their type in [[EiffelVision Introduction|EiffelVision2]] . For example, looking at the screenshot above, the <eiffel>BUTTON</eiffel> item represents an <eiffel>EV_BUTTON</eiffel>, and the <eiffel>EV_COMBO_BOX</eiffel> item represents <eiffel>EV_COMBO_BOX</eiffel>.
{{note| '''Note''': The types available in the type selector are fixed, and cannot be modified. Almost all [[EiffelVision Introduction|EiffelVision2]] components are available. }}
{{note|The types available in the type selector are fixed, and cannot be modified. Almost all [[EiffelVision Introduction|EiffelVision2]] components are available. }}
==Creating a new object==
[[EiffelBuild Notation|Objects]] are the building blocks used in EiffelBuild to construct your interface. To create a new [[EiffelBuild Notation|object]] for use in your system, [[EiffelBuild Notation|pick]] the type corresponding to the type of object you wish to create,and [[EiffelBuild Notation|drop]] onto an [[EiffelBuild Notation|object]] representation. If an object is full, or does not allow other objects of the new type to be contained, then you will not be able to [[EiffelBuild Notation|drop]] on it. <br/>
@@ -18,7 +18,7 @@ This shows how simple it is to Build new [[EiffelBuild Notation|objects]] in Ei
You may drop an object directly from the Type Selector into the [[Widget selector|widget selector]] which creates the object as a "top level object" ensuring that upon generation, it is represented by an individual set of classes. These top level objects may then be re-used within your interface as desired.
{{note| '''Note''': To understand the types accepted, and the capacity of objects, you should consult the [[EiffelVision Introduction|EiffelVision2]] library reference. }}
{{note|To understand the types accepted, and the capacity of objects, you should consult the [[EiffelVision Introduction|EiffelVision2]] library reference. }}
==Changing the type of an existing object==
@@ -32,7 +32,7 @@ The following rules govern if the type of an existing object may be changed to a
* The parent of the existing [[EiffelBuild Notation|object]] must accept children of type corresponding to the new type.
* The new type must be able to accept all of the existing [[EiffelBuild Notation|objects]] children.
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[Layout constructor|Layout constructor]] <br/>
}}

View File

@@ -11,7 +11,7 @@ To add an Object to your project, [[EiffelBuild Notation|pick]] the object type
* '''The Widget Selector itself''' - The newly created object is added to the root directory of the project.
* '''A Directory node''' - The newly created object is added to the directory that was the target of the drop.
Both of these outcomes create a new object in your project that is to be generated as an individual class during code generation.
{{note| '''Note''': The selected object in the Widget Selector is automatically targeted as the root window of the [[Layout constructor|layout constructor]] , permitting building. You may not build directly into the representation of an object within the Widget Selector, as this must be performed within the [[Layout constructor|layout constructor]] or [[Builder window|builder window]] . }}
{{note|The selected object in the Widget Selector is automatically targeted as the root window of the [[Layout constructor|layout constructor]] , permitting building. You may not build directly into the representation of an object within the Widget Selector, as this must be performed within the [[Layout constructor|layout constructor]] or [[Builder window|builder window]] . }}
==Root Window==
@@ -27,10 +27,10 @@ The ability to add directories to your project permit organization of objects in
Enter a unique name that is not already in use, and select "OK" to add the directory to your project. The newly added directory is then visible, as a node in the Widget Selector.
{{note| '''Note''': Creating a new directory in the Widget Selector causes the actual directory on the disk to be created immediately. }}
{{note|Creating a new directory in the Widget Selector causes the actual directory on the disk to be created immediately. }}
You may insert objects into a directory, or move an object between directories by [[EiffelBuild Notation|picking]] the object from its representation in the Widget Selector, and [[EiffelBuild Notation|dropping]] on the desired directory. Each object contained in the Widget Selector is generated as a seperate class and the parent directory is used as the generated location on disk.
{{note| '''Note''': If you move an object between directories within an EiffelBuild project that has already generated the Eiffel code for that object, the code files are moved immediately on the disk. }}
{{note|If you move an object between directories within an EiffelBuild project that has already generated the Eiffel code for that object, the code files are moved immediately on the disk. }}
Directories may be nested as deeply as required, and the following buttons are available to help with directory nesting:
* [[Image:directory-search-small]] Selecting this button recursively adds all directories from the current project location to the project.
@@ -50,7 +50,7 @@ The OK_CANCEL_BUTTONS object is used is used in two different places within the
To use an instance of a widget contained within the Widget Selector as a client, simply pick the representation of the object and drop into the desired parent object within the [[Type selector|type selector]]
{{seealso| '''See also''': <br/>
{{seealso|<br/>
[[Layout constructor|Layout constructor]] }}

View File

@@ -22,7 +22,7 @@ This sample contains the following class:
* ACCELERATOR
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
[[ref:/libraries/vision2/reference/ev_accelerator_chart|EV_ACCELERATOR]] <br/>
[[ref:/libraries/vision2/reference/ev_key_chart|EV_KEY]] <br/>
}}

View File

@@ -26,7 +26,7 @@ This sample contains the following class:
* GAUGES
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
EV_GAUGE <br/>
EV_SCROLL_BAR <br/>
EV_RANGE <br/>

View File

@@ -26,7 +26,7 @@ This sample contains the following class:
* VIEWPORT
{{seealso| '''See Also''' <br/>
{{seealso|<br/>
EV_VIEWPORT <br/>
EV_SPIN_BUTTON <br/>
[[ref:/libraries/vision2/reference/ev_button_chart|EV_BUTTON]] <br/>

View File

@@ -7,7 +7,7 @@ The kernel cluster contains classes that provide functionality that are common t
[[ref:libraries/vision2/reference/ev_application_chart|EV_APPLICATION]] is the basis for every Vision2 application and is considered the most important class in the library. It is responsible for initializing the underlying toolkit that is driving the windowing system on the platform that you decide to compile your system on. It also also where the main event loop that drives your application is executed.
{{note| '''Note:''' It is ''' not''' possible to create a Vision2 component unless an application exists (query [[ref:/libraries/vision2/reference/ev_environment_chart|EV_ENVIRONMENT]] ). }}
{{note|It is ''' not''' possible to create a Vision2 component unless an application exists (query [[ref:/libraries/vision2/reference/ev_environment_chart|EV_ENVIRONMENT]] ). }}
You may inherit [[ref:libraries/vision2/reference/ev_application_chart|EV_APPLICATION]] or use it as a client in order to create your vision2 application. A simple method of using EV_APPLICATION is as follows:
# Create an instance of EV_APPLICATION.
# Create one or more windows for your application.
@@ -71,7 +71,7 @@ This is the same Vision2 application but instead using <eiffel>[/libraries/visio
==What does Launch actually do?==
In Vision2, to launch an application means to pass control to the underlying graphical toolkit. Simply creating an application does not launch it. An explicit call to launch is required for the event processing to begin.
{{note| '''Note: '''A Vision2 system is event based. This means that you do not have control of the execution within a Vision2 system, but must respond appropriately to [[Events|events]] as they occur. Therefore, if you call launch on an [[ref:libraries/vision2/reference/ev_application_chart|EV_APPLICATION]] , the processing for the application will continue indefinitely unless you have provided a way to exit the application. It is essential to initialize your components correctly, so your application can be exited (call <eiffel>destroy</eiffel> on the application). }}
{{note|A Vision2 system is event based. This means that you do not have control of the execution within a Vision2 system, but must respond appropriately to [[Events|events]] as they occur. Therefore, if you call launch on an [[ref:libraries/vision2/reference/ev_application_chart|EV_APPLICATION]] , the processing for the application will continue indefinitely unless you have provided a way to exit the application. It is essential to initialize your components correctly, so your application can be exited (call <eiffel>destroy</eiffel> on the application). }}
==Building your application skeleton==

View File

@@ -19,7 +19,7 @@ A simple example of this is demonstrated here:
As print takes an argument of type [[ref:/libraries/base/reference/string_8_chart|STRING_8]] , button2 becomes a valid target for the pebble contained in button1. Right clicking the mouse pointer over the '''source''' will start the transport, and right clicking with the mouse pointer over a valid '''target''' will end the transport. The transport can be canceled anytime with a simple left click, just as you would do in EiffelStudio.
{{note| '''Note''': When a transport completes, the '''pebble''' that was transported is passed as an argument to all features in the '''targets'''drop_actions whose argument type matches the '''pebble''' }}
{{note|When a transport completes, the '''pebble''' that was transported is passed as an argument to all features in the '''targets'''drop_actions whose argument type matches the '''pebble''' }}
==Three different modes of transport==

View File

@@ -30,7 +30,7 @@ Use <eiffel>minimum_width</eiffel> and <eiffel>minimum_height</eiffel> to find i
{{note| '''Note:''' [[ref:libraries/vision2/reference/ev_containable_chart|EV_CONTAINABLE]] has no features for setting the parent. In Vision2, a child has no features for setting its parent, while a parent such as ev_container contains routines for adding children (one example is <eiffel>extend</eiffel>). }}
{{note|[[ref:libraries/vision2/reference/ev_containable_chart|EV_CONTAINABLE]] has no features for setting the parent. In Vision2, a child has no features for setting its parent, while a parent such as ev_container contains routines for adding children (one example is <eiffel>extend</eiffel>). }}
The following properties are also used within Vision2:
* [[ref:libraries/vision2/reference/ev_deselectable_chart|EV_DESELECTABLE]]

View File

@@ -7,7 +7,7 @@ All Vision2 containers inherit [[ref:libraries/vision2/reference/ev_container_ch
A container is a Vision2 widget that may contain other widgets. Some containers such as [[ref:libraries/vision2/reference/ev_cell_chart|EV_CELL]] may only hold one widget while containers such as [[ref:libraries/vision2/reference/ev_box_chart|EV_BOX]] may hold multiple widgets. As a container is of type [[ref:libraries/vision2/reference/ev_widget_chart|EV_WIDGET]] , this means that a container may be placed within a container. Windows inherit from [[ref:libraries/vision2/reference/ev_cell_chart|EV_CELL]] and are therefore classed as containers also.
{{note| '''Note: '''Containers may only contain other widgets. Items may only be placed in certain primitives. For example, an [[ref:libraries/vision2/reference/ev_list_item_chart| EV_LIST_ITEM]] may be contained in an [[ref:libraries/vision2/reference/ev_list_chart| EV_LIST]] . }}
{{note|Containers may only contain other widgets. Items may only be placed in certain primitives. For example, an [[ref:libraries/vision2/reference/ev_list_item_chart| EV_LIST_ITEM]] may be contained in an [[ref:libraries/vision2/reference/ev_list_chart| EV_LIST]] . }}
==Inheritance from Base==
@@ -47,7 +47,7 @@ The mapping of a Vision2 container interface is very close to that of containers
* To empty a container call `wipe_out'.
* To traverse the container, you can use features such as start, forth, item and off.
{{note| '''Note''': When a widget is added to a container, the container is the parent of the widget. }}
{{note|When a widget is added to a container, the container is the parent of the widget. }}
==Size of widget within a container==
@@ -55,7 +55,7 @@ The size of a widget in a container is always at least its minimum size. By defa
==Sizing of containers==
As [[ref:libraries/vision2/reference/ev_container_chart|EV_CONTAINER]] is of type [[ref:libraries/vision2/reference/ev_widget_chart|EV_WIDGET]] , the following facilities are provided for setting the minimum size: set_minimum_width, set_minimum_height and set_minimum_size. It is important to remember that as a general rule, '''the current size of a container is always at least the minimum size of all its contents.'''
{{note| '''Note: '''The exception to this is: [[ref:libraries/vision2/reference/ev_fixed_chart|EV_FIXED]] , [[ref:libraries/vision2/reference/ev_viewport_chart|EV_VIEWPORT]] and [[ref:libraries/vision2/reference/ev_scrollable_area_chart|EV_SCROLLABLE_AREA]] which do actually allow their contents to be larger than their current size. <br/>
{{note|The exception to this is: [[ref:libraries/vision2/reference/ev_fixed_chart|EV_FIXED]] , [[ref:libraries/vision2/reference/ev_viewport_chart|EV_VIEWPORT]] and [[ref:libraries/vision2/reference/ev_scrollable_area_chart|EV_SCROLLABLE_AREA]] which do actually allow their contents to be larger than their current size. <br/>
}}

View File

@@ -30,7 +30,7 @@ This would be in place of
a_button.set_text ("Click Me")
</code>
{{note|Note: When a widget is created no extra initialization has to be performed. '''The only exception is for a window where you have to call show in order for it to be displayed on screen'''. }}
{{note|When a widget is created no extra initialization has to be performed. '''The only exception is for a window where you have to call show in order for it to be displayed on screen'''. }}
==Sizing==
@@ -38,7 +38,7 @@ As [[ref:libraries/vision2/reference/ev_primitive_chart|EV_PRIMITIVE]] is of ty
The minimum size of a widget is the smallest possible size that it can possibly be inside its parent container. If an [[ref:libraries/vision2/reference/ev_button_chart|EV_BUTTON]] was created and set with a minimum_size of width/height (100, 100), if this button was inserted in to an [[ref:libraries/vision2/reference/ev_horizontal_box_chart| EV_HORIZONTAL_BOX]] , then the box's size could never be below (100, 100) or it would break the minimum size of the button. '''The size of a container must always be greater or equal to the minimum sizes of its children.'''
{{note| '''Note: '''In Vision2, there is no way to set the current size of the primitive. The current size is dependent on the size of the parent or the minimum_size. }}
{{note|In Vision2, there is no way to set the current size of the primitive. The current size is dependent on the size of the parent or the minimum_size. }}
==Now what do I do?==
Now that you can create a widget, you will need to actually make it usable to your intended user. This will usually involve these three steps. <br/>

View File

@@ -14,9 +14,9 @@ The EIFFEL include files define types for every EIFFEL types:
Generally, you should use these types when implementing external C functions bound to be used from Eiffel or when you want to manipulate Eiffel objects from the C side. EIF_REFERENCE, EIF_OBJECT, EIF_POINTER all correspond in C to a (char *), but their semantic remains different in Eiffel.
{{note|'''Note:''' In the following code samples, the class <eiffel>OBJECT</eiffel> is a placeholder for one of your type that you wish to use via CECIL.}}
{{note|In the following code samples, the class <eiffel>OBJECT</eiffel> is a placeholder for one of your type that you wish to use via CECIL.}}
{{sample| '''Sample''': Calling C external `foo' from Eiffel, which takes a pointer and an eiffel object of type OBJECT as arguments and returns an INTEGER. }}
{{sample|Calling C external `foo' from Eiffel, which takes a pointer and an eiffel object of type OBJECT as arguments and returns an INTEGER. }}
<div>
<code>
c_foo (ptr: POINTER; obj: OBJECT): INTEGER is
@@ -118,7 +118,7 @@ EIF_INTEGER foo (EIF_POINTER ptr, EIF_OBJECT obj);
'''Important rules when using eif_access:'''
{{note| '''Note''': The first argument of ''(ep)'' is the target of the function (the eiffel object to which you want to apply the Eiffel feature ''(ep)'') and the second argument corresponds to the first argument of ` ''print'''. Any Eiffel object could have been the 1st argument of ''(ep)'' since all of them inherit ''ANY''. }}
{{note|The first argument of ''(ep)'' is the target of the function (the eiffel object to which you want to apply the Eiffel feature ''(ep)'') and the second argument corresponds to the first argument of ` ''print'''. Any Eiffel object could have been the 1st argument of ''(ep)'' since all of them inherit ''ANY''. }}
* '''Never pre compute the value returned by eif_access. ''' <br/>
@@ -262,7 +262,7 @@ main (int argc,char **argv,char **envp)
</code>
{{note| '''Note''': `eif_create' does not call any creation procedure. It just allocates memory and initializes an object. }}
{{note|`eif_create' does not call any creation procedure. It just allocates memory and initializes an object. }}
===Protecting the objects returned by Eiffel functions.===
@@ -309,7 +309,7 @@ main (int argc,char **argv,char **envp)
</code>
{{note| '''Note''': Although you must protect Eiffel references returned by eif_attribute, you do not have to protect attributes of basic types - they are not Eiffel references and not supposed to move. }}
{{note|Although you must protect Eiffel references returned by eif_attribute, you do not have to protect attributes of basic types - they are not Eiffel references and not supposed to move. }}
===Getting the type id of an Eiffel type: eif_type_id===
'''# include "eif_gen_conf. h"''' # include "eif_gen_conf. h"
@@ -375,7 +375,7 @@ EIF_REFERENCE eif_wean(EIF_OBJECT object)
Tell the GC to remove the artificial reference to the nested Eiffel reference returned by eif_access (object). Then, the GC will be able to collect this nested object, as soon as it is not referenced from Eiffel any longer.
{{note| '''Note:''' Object must have been previously created with eif_adopt, eif_protect or eif_create. }}
{{note|Object must have been previously created with eif_adopt, eif_protect or eif_create. }}
eif_wean (object) returns an Eiffel reference, which corresponds to eif_access (object). After a call to eif_wean (object), eif_access (object) is NULL, which does not mean that the nested Eiffel object is Void, but that the indirection pointer does not reference it any longer. It is possible to reuse object later on. <br/>
Calling eif_wean (external_argument) where external_argument is an Eiffel object given by a C external can cause erratic behaviors. Indeed, external_argument is an indirection pointer, which is automatically deleted after the external call (not the nested Eiffel object), deleting it prematurely can corrupt the indirection pointers stack. <br/>
See also <eiffel>eif_access</eiffel>.
@@ -423,7 +423,7 @@ RETURN VALUE:
<div>upon failure, it returns (EIFFEL_TYPE) 0, otherwise, the attribute is returned. If the return value is not a basic type, you must protect it with eif_protect</div>
COMPATIBILITY:
<div>eif_attribute (object, name, type, NULL) is equivalent to eif_field (object, name, type)</div>
{{tip| '''Tips''': You cannot access a constant attribute, or the result of a function (once or not) with eif_attribute. Use eif_procedure or eif_xx_function instead. <br/>
{{tip|s''': You cannot access a constant attribute, or the result of a function (once or not) with eif_attribute. Use eif_procedure or eif_xx_function instead. <br/>
<br/>
EIF_BOOLEAN attribute_exists (EIF_REFERENCE object, char *name) returns EIF_TRUE or EIF_FALSE depending if the attribute exists or not, is visible or not. }}
@@ -443,7 +443,7 @@ Return the address of the Eiffel routine by giving its name rout_name and the ty
The Eiffel object returned by an Eiffel function must be protected afterwards with 'eif_protect' (this only applies for functions whose addresses are returned by `eif_reference_function', since the other function types returns basic types, which are not Eiffel objects).
{{note| '''Note''': The address returned by these functions must be called between parenthesis. }}
{{note|The address returned by these functions must be called between parenthesis. }}
{{warning| '''Caution''': Be sure that the Eiffel routine is not a C External. In this case, you should call directly the C external instead of its Eiffel wrapper. }}
@@ -461,7 +461,7 @@ EIF_REFERENCE eif_string (char *string) /* Macro */
Return the direct reference to an Eiffel string by giving the corresponding C string . The result of eif_string does not reference the C string passed as argument: it copies it, before creating the Eiffel string.
{{note| '''Notes''': The return value must be protected with eif_protect for later use. <br/>
{{note|s''': The return value must be protected with eif_protect for later use. <br/>
<br/>
The C string must be manually freed by the user, if it has been dynamically allocated. }}
@@ -494,7 +494,7 @@ printf ("type is %d\n"); /* Should be EIF_INTEGER_TYPE since it returns an Ei
</code>
{{tip| '''Tip''': *(EIFFEL_TYPE *) eif_attribute_safe (EIF_REFERENCE object, char *name, int type_int, int *status) can be used for debugging or type checking. It returns the attribute reference of name from the object of type type_int. status contains the status of the function call: it can be EIF_CECIL_OK, EIF_CECIL_ERROR, EIF_NO_ATTRIBUTE or EIF_WRONG_TYPE (type_int does not match with real type of object). }}
{{tip|*(EIFFEL_TYPE *) eif_attribute_safe (EIF_REFERENCE object, char *name, int type_int, int *status) can be used for debugging or type checking. It returns the attribute reference of name from the object of type type_int. status contains the status of the function call: it can be EIF_CECIL_OK, EIF_CECIL_ERROR, EIF_NO_ATTRIBUTE or EIF_WRONG_TYPE (type_int does not match with real type of object). }}
===Getting the class name corresponding to a type id: eif_name===
''' #include "eif_cecil. h"'''

View File

@@ -21,7 +21,7 @@ Note that through CECIL you can use an Eiffel system compiled in any of the Eiff
* Finalized C code.
* Workbench (melted/frozen) code, usually for development purposes. In this case you must copy the ''<system name>.melted'' file ( where ''<system name>'' is the name of your system) located in EIFGENs\<target_name>\W_code to the directory where you intend to execute your C application from.
{{note| '''Note''': each time you melt the Eiffel system, the ''<system name>. melted'' file is updated. }}
{{note|each time you melt the Eiffel system, the ''<system name>. melted'' file is updated. }}
{{warning| '''Caution''': in the second case (workbench mode), it is not possible to call through the CECIL interface any routine that has been melted in the last compilation; this would raise the run-time exception: <br/>
''' $ applied to melted routine''' <br/>

View File

@@ -6,7 +6,7 @@ The CECIL archive already incorporates the Eiffel run-time. To use the functions
on Unix/linux:
<code>ld -o [name of your CECIL executable] [your C object files and archives]lib<system name>.a -lm</code>
{{note| '''Note''': On Unix, linking with "-lm" is required since the Eiffel run-time uses the standard math libraries. You may need to link with other libraries (for example, on linux: with "-lbsd", in MT mode with "-lpthread" (posix threads) or "-lthread" (solaris)). }}
{{note|On Unix, linking with "-lm" is required since the Eiffel run-time uses the standard math libraries. You may need to link with other libraries (for example, on linux: with "-lbsd", in MT mode with "-lpthread" (posix threads) or "-lthread" (solaris)). }}
@@ -33,7 +33,7 @@ or , if you are on Windows using MS VC++:
or, if you are on Windows using Borland:
<code>bcc32 -c -I$ISE_EIFFEL\studio\spec\windows\include -I<SOME_INCLUDE_PATH> -D<SOME_FLAGS> your_file.c</code>
{{sample| '''Sample''': if you want to use the multithreaded facilities of Eiffel, you should define the EIFFEL MT flags by adding "-DEIF_THREADS" to the command line and follow the instructions of your C compiler and platform to find out which additional flags you may need '''. For example:''' on Solaris you need to add "-DSOLARIS_THREADS -D_REENTRANT". }}
{{sample|if you want to use the multithreaded facilities of Eiffel, you should define the EIFFEL MT flags by adding "-DEIF_THREADS" to the command line and follow the instructions of your C compiler and platform to find out which additional flags you may need '''. For example:''' on Solaris you need to add "-DSOLARIS_THREADS -D_REENTRANT". }}
You can specify a Makefile in your configuration file, so that your C files will be compiled automatically after the Eiffel compilation and before the final linking. See [[Externals Options|the manipulation of external]] in the project settings to add <code>$PATH_TO_MAKEFILE/your_makefile</code>.
@@ -61,7 +61,7 @@ int main(int argc, char **argv, char **envp)
EIF_DISPOSE_ALL
}</code>
{{note| '''Notes''': <br/>
{{note|s''': <br/>
The above mentioned macros must imperatively be in the body of the "main" function for the Eiffel exception handling mechanism to work correctly. You also need to add the Eiffel run time directory to the list of directories in which the C compiler searches for include files. You can do so by using the "-I" option of your C compiler. You can only link one CECIL library into your C applications at a time. }}
{{warning| '''Caution''': Even though external object files and archives are correctly specified in the "object" clause of the configuration file, you will need to explicitly link them to your C application. }}

View File

@@ -190,7 +190,7 @@ In WEL, the encapsulation is written as:
"SendMessage"
end</code>
{{seealso| '''See also''' <br/>
{{seealso|<br/>
[[C++ Externals|C++ externals]] }}

View File

@@ -51,7 +51,7 @@ Access to Java classes. Static methods and attributes are accessed via this clas
This class gives Eiffel access to Java objects. You can use it directly or inherit from to and create a more convenient Eiffel class that makes the Java object look like an Eiffel object. The Eiffel representation of a Java Object.
{{warning| '''Warning:''' to access the static fields or routines of a Java Class, you have to use the features of a JAVA_CLASS instance!! }}
{{warning|to access the static fields or routines of a Java Class, you have to use the features of a JAVA_CLASS instance!! }}
===JAVA_EXTERNALS===

View File

@@ -171,7 +171,7 @@ If you do not want to make the class a descendant of [[ref:/libraries/base/refer
To analyze a text, call <eiffel>set_file </eiffel>or <eiffel>set_string </eiffel>to specify the document to be parsed. With the first call, the analysis will be applied to a file; with the second, to a string.
{{note| '''Note''': if you use procedure analyze of [[ref:/libraries/lex/reference/scanning_chart|SCANNING]] , you do not need any such call, since analyze calls set_file on the file name passed as argument. }}
{{note|if you use procedure analyze of [[ref:/libraries/lex/reference/scanning_chart|SCANNING]] , you do not need any such call, since analyze calls set_file on the file name passed as argument. }}
===Obtaining the tokens===
@@ -354,7 +354,7 @@ You may freely combine the various construction mechanisms to describe complex r
===Dealing with keywords===
Many languages to be analyzed have keywords - or, more generally, "reserved words". Eiffel, for example, has reserved words such as <code> class </code> and <code> Result </code>.
{{note| '''Note''': in Eiffel terminology reserved words include keywords; a keyword is a marker playing a purely syntactical role, such as <code> class </code>. Predefined entities and expressions such as <code> Result </code> and <code> Current </code>, which have an associated value, are considered reserved words but not keywords. The present discussion uses the term "keyword" although it can be applied to all reserved words. }}
{{note|in Eiffel terminology reserved words include keywords; a keyword is a marker playing a purely syntactical role, such as <code> class </code>. Predefined entities and expressions such as <code> Result </code> and <code> Current </code>, which have an associated value, are considered reserved words but not keywords. The present discussion uses the term "keyword" although it can be applied to all reserved words. }}
In principle, keywords could be handled just as other token types. In Eiffel, for example, one might treat each reserved words as a token type with only one specimen; these token types would have names such as Class or Then and would be defined in the lexical grammar file:
@@ -386,7 +386,7 @@ BOOLEAN
{{warning| '''Caution''': every keyword in the keyword section must be a specimen of one of the token types defined for the grammar, and that token type must be the last one defined in the lexical grammar file, just before the '''Keywords''' line. So in Eiffel where the keywords have the same lexical structure as identifiers, the last line before the keywords must be the definition of the token type ''Identifier'', as shown above. }}
{{note| '''Note''': the rule that all keywords must be specimens of one token type is a matter of convenience and simplicity, and only applies if you are using SCANNING and lexical grammar files. There is no such restriction if you rely directly on the more general facilities provided by [[ref:/libraries/lex/reference/metalex_chart|METALEX]] or [[ref:/libraries/lex/reference/lex_builder_chart|LEX_BUILDER]] . Then different keywords may be specimens of different regular expressions; you will have to specify the token type of every keyword, as explained later in this chapter. }}
{{note|the rule that all keywords must be specimens of one token type is a matter of convenience and simplicity, and only applies if you are using SCANNING and lexical grammar files. There is no such restriction if you rely directly on the more general facilities provided by [[ref:/libraries/lex/reference/metalex_chart|METALEX]] or [[ref:/libraries/lex/reference/lex_builder_chart|LEX_BUILDER]] . Then different keywords may be specimens of different regular expressions; you will have to specify the token type of every keyword, as explained later in this chapter. }}
===Case sensitivity===
@@ -467,7 +467,7 @@ The calls seen so far record a number of regular expressions and keywords, but d
<code> make_analyzer</code>
After that call, you may not record any new regular expression or keyword. The analyzer is usable through attribute analyzer.
{{note| '''Note''': for readers knowledgeable in the theory of lexical analysis: one of the most important effects of the call to make_analyzer is to transform the non-deterministic finite automaton resulting from calls such as the ones above into a deterministic finite automaton. }}
{{note|for readers knowledgeable in the theory of lexical analysis: one of the most important effects of the call to make_analyzer is to transform the non-deterministic finite automaton resulting from calls such as the ones above into a deterministic finite automaton. }}
Remember that if you use procedure read_grammar, you need not worry about make_analyzer, as the former procedure calls the latter.
Another important feature of class [[ref:/libraries/lex/reference/metalex_chart|METALEX]] is procedure <eiffel>store_analyzer</eiffel>, which stores the analyzer into a file whose name is passed as argument, for use by later lexical analysis sessions. To retrieve the analyzer, simply use procedure <eiffel>retrieve_analyzer</eiffel>, again with a file name as argument.

View File

@@ -53,7 +53,7 @@ Parsing is seldom an end in itself; rather, it serves as an intermediate step fo
Parsing takes care of one of the basic tasks of a document processor: reconstructing the logical organization of a document, which must conform to a certain '''syntax''' (or structure), defined by a '''grammar'''.
{{note| '''Note''': the more complete name '''syntactic grammar''' avoids any confusion with the ''lexical'' grammars discussed in the [[EiffelLex Tutorial]]. By default, "grammar" with no further qualification will always denote a syntactic grammar. A syntactic grammar normally relies on a lexical grammar, which gives the form of the most elementary components - the tokens - appearing in the syntactic structure. }}
{{note|the more complete name '''syntactic grammar''' avoids any confusion with the ''lexical'' grammars discussed in the [[EiffelLex Tutorial]]. By default, "grammar" with no further qualification will always denote a syntactic grammar. A syntactic grammar normally relies on a lexical grammar, which gives the form of the most elementary components - the tokens - appearing in the syntactic structure. }}
Once parsing has reconstructed the structure of a document, the document processor will perform various operations on the basis of that structure. For example a compiler will generate target code corresponding to the original text; a command language interpreter will execute the operations requested in the commands; and a documentation tool such as the short and flat-short commands for Eiffel will produce some information on the parsed document. Such operations are called '''semantic actions'''. One of the principal requirements on a good parsing mechanism is that it should make it easy to graft semantics onto syntax, by adding semantic actions of many possible kinds to the grammar.
@@ -109,7 +109,7 @@ An aggregate production defines a construct whose specimens are obtained by conc
This means that a specimen of Conditional (a conditional instruction) is made of the keyword <code> if </code>, followed by a specimen of Then_part_list, followed by zero or one specimen of Else_part (the square brackets represent an optional component), followed by the keyword <code> end </code>.
{{note| '''Note''': this notation for productions uses conventions similar to those of the book Eiffel: The Language. Keywords are written in '''boldface italics''' and stand for themselves. Special symbols, such as the semicolon, are written in double quotes, as in ";". The [=] symbol means "is defined as" and is more accurate mathematically than plain =, which, however, is often used for this purpose (see "Introduction to the Theory of Programming Languages", Prentice Hall, 1991, for a more complete discussion of this issue). }}
{{note|this notation for productions uses conventions similar to those of the book Eiffel: The Language. Keywords are written in '''boldface italics''' and stand for themselves. Special symbols, such as the semicolon, are written in double quotes, as in ";". The [=] symbol means "is defined as" and is more accurate mathematically than plain =, which, however, is often used for this purpose (see "Introduction to the Theory of Programming Languages", Prentice Hall, 1991, for a more complete discussion of this issue). }}
A choice production defines a construct whose specimens are specimens of one among a number of specified constructs. For example, the production for construct Type in an Eiffel grammar may read:
<code>Type [=] Class_type | Class_type_expanded | Formal_generic_name | Anchored | Bit_type</code>
@@ -469,7 +469,7 @@ For <eiffel>TERMINAL</eiffel>, only one semantic action makes sense. To avoid an
Often, the semantic procedures need to compute various elements of information. These may be recorded using appropriate attributes of the corresponding construct classes.
{{note| '''Note''': readers familiar with the theory of parsing and compiling will see that this scheme, using the attributes of Eiffel classes, provides a direct implementation of the "attribute grammar" mechanism. }}
{{note|readers familiar with the theory of parsing and compiling will see that this scheme, using the attributes of Eiffel classes, provides a direct implementation of the "attribute grammar" mechanism. }}
===Polynomial semantics===
@@ -499,7 +499,7 @@ As an example let us examine the semantics of the Product construct for the poly
Here each relevant construct class has an attribute info used to record the semantic information associated with polynomials and their components, such as child_value, an <eiffel>INTEGER</eiffel>. The post_action takes care of computing the product of all child_values for the children. First, of course, post_action must recursively be applied to each child, to compute its own child_value.
{{note| '''Note''': recall that an instance of <eiffel>CONSTRUCT</eiffel> is also a node of the abstract syntax tree, so that all the <eiffel>TWO_WAY_TREE</eiffel> features such as child_value, child_start, child_after and many others are automatically available to access the syntactical structure. }}
{{note|recall that an instance of <eiffel>CONSTRUCT</eiffel> is also a node of the abstract syntax tree, so that all the <eiffel>TWO_WAY_TREE</eiffel> features such as child_value, child_start, child_after and many others are automatically available to access the syntactical structure. }}
===Keeping syntax and semantics separate===
@@ -591,7 +591,7 @@ specimens could begin with an opening parenthesis "(".</code>
Because of this property, if the parser goes so far as to recognize an opening parenthesis as part of parsing any construct <eiffel>C</eiffel> for which NESTED is an alternative, but further tokens do not match the structure of <eiffel>NESTED</eiffel> specimens, then we will have failed to recognize not only a <eiffel>NESTED</eiffel> but also a <eiffel>C</eiffel>.
{{note| '''Note''': some readers will have recognized commit as being close to the Prolog "cut" mechanism. }}
{{note|some readers will have recognized commit as being close to the Prolog "cut" mechanism. }}
In this example, <eiffel>NESTED</eiffel> is used in only one right-hand side production: the choice production for TERM, for which the other alternatives are <eiffel>SIMPLE_VAR</eiffel> and <eiffel>POLY_INTEGER</eiffel>, none of whose specimens can include an opening parenthesis.
@@ -611,7 +611,7 @@ Different processors for the same grammar may use different top constructs. }}
A document processor will be a particular system made of construct classes, complemented by semantic classes, and usually by other auxiliary classes. One of the construct classes corresponds to the top construct and is called the '''top construct class'''.
{{note| '''Note''': this notion of top construct class has a natural connection to the notion of root class of a system, as needed to get executable software. The top construct class could indeed be used as root of the processor system. In line with the previous discussion, however, it appears preferable to keep the top construct class (which only depends on the syntax and remains independent of any particular processor) separate from the system's root class. With this approach the root class will often be a descendant of the top construct class. <br/>
{{note|this notion of top construct class has a natural connection to the notion of root class of a system, as needed to get executable software. The top construct class could indeed be used as root of the processor system. In line with the previous discussion, however, it appears preferable to keep the top construct class (which only depends on the syntax and remains independent of any particular processor) separate from the system's root class. With this approach the root class will often be a descendant of the top construct class. <br/>
This policy was adopted for the Polynomial language example as it appears in the delivery: the processor defined for this example uses <eiffel>LINE</eiffel> as the top construct class; the root of the processor system is a class <eiffel>PROCESS</eiffel>, which inherits from <eiffel>LINE</eiffel>. }}
===Steps in the execution of a document processor===

View File

@@ -3,7 +3,7 @@
[[Property:uuid|da8f72cb-0ecd-464a-a558-cbf7d24301e3]]
This sample shows how to retrieve and display information from a basic form on a web page.
{{note| '''Note:''' This sample requires a web server supporting CGI in order to be run. Both the Internet Information Services web server from Microsoft and the GNU Apache server may be used.
{{note|This sample requires a web server supporting CGI in order to be run. Both the Internet Information Services web server from Microsoft and the GNU Apache server may be used.
==Compiling==
To compile the example:

View File

@@ -23,7 +23,7 @@ The browser sends in the ''In'' a stream containing the data relative to the use
The response has to contain an HTTP header in order to be understood by the browser. Depending on the nature of the reply, an HTML page, a simple re-direction, an error notification, you will select different features and options. Your application must send at least a response header, indicating the status of the request if known. You may want to attach to it the text you wish to send back to the user. This text is usually written in HTML, so that it will display nicely on the user's browser; you can use for this purpose the class HTML_PAGE. You may then send the header followed by your text using the features send_to_browser of classes CGI_RESPONSE_HEADER and HTML_PAGE.
{{note| '''Note''': You may not write into a file before you have sent the answer to the browser. }}
{{note|You may not write into a file before you have sent the answer to the browser. }}
===Dealing with Cookies===