Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Clay Shannon
2002 Danypress
[www.danypress.com]
Dedicatoria
Para:
Mi esposa, Cherri.
Mis hijos, Kelvin Caleb Mordecai Immerfort Purify Shannon y Morgan
Tell Mackenzie Immerfort Purify (Sluggo) Shannon.
Mis padres, Thedore Russell Shannon y Alice Rosalie Shannon.
Mis hermanos y hermanos polticos, Theodore Patrick Ted Shannon;
Jonathan Kelly Barn Shannon y Melinda Mindiana Shannon; Patricia
Maureen Trish Baugus y Jimmy Don Jim Baugus.
Roger S. L. Hugi.
The Cartwrights (Jerry Dunn, Eddie J. Nelson, Alex Szajki y otros).
Sin su apoyo, amor, sacrificio, peleas con almohadas, ejemplo y lealtad,
este esfuerzo, y la vida misma, habran perdido gran parte de su significado y su belleza.
Finalmente, tambin quiero extender mi agradecimiento a las siguientes
personas, que han hecho mi vida ms agradable gracias a su inteligencia
creativa o habilidades deportivas:
Johann Sebastian Bach, Bruce Springsteen, Dwight Yoakam, the Desert
Rose Band, Mark Twain, Jack London, Marlon Brando, David Muench y
Ansel Adams, Baltimore Orioles, Green Bay Packers y Milwaukee Bucks.
iii
Comentarios sobre:
iv
Contenido
Cmo este libro se diferencia de los dems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Los mensajes de error son sus amigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Cmo encontrar mensajes de error especficos en este libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxx
Cuando hay muchas causas potenciales para el mismo error . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
Cuando necesite ms informacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxii
Mensajes de Error
. Expected. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
$2109 Cannot initialize the BDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
$DENYPACKAGEUNIT <> cannot be put into a package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
$DESIGNONLY and $RUNONLY both specified . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
$DESIGNONLY and $RUNONLY only allowed in package unit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
$WEAKPACKAGEUNIT & $DENYPACKAGEUNIT both specified . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
$WEAKPACKAGEUNIT <> cannot have initialization or finalization code . . . . . . . . . . . . . . . . . . . . . . 4
$WEAKPACKAGEUNIT <> contains global data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
; not allowed before Else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
<> already exists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
<> cant be added to this package because another file with the same base name (<>) is already in the directory of
the package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
<> clause not allowed in interface type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
<> directive not allowed in interface type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
<> expected but <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
<> has no index for fields <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
<> has the descendent <> in the Repository and therefore cannot be removed . . . . . . . . . . . . . . . . . . 10
<> is a read-only file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
<> is a reserved word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
<> is already in the Repository. Replace it? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
<> is already in use by <>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
<> is an invalid filename . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
<> is an invalid PageIndex value. PageIndex must be between 0 and <> . . . . . . . . . . . . . . . . . . . . . 13
<> is not a type identifier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
<> is not a unique name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
<> is not a valid component name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
<> is not a valid date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
<> is not a valid date and time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
<> is not a valid floating point value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
<> is not a valid floating point value for field <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
vi
vii
viii
ix
Couldnt perform the edit because another user changed the record
Data Base Error: Database access resulted in error. . . . . . . . .
Data Segment Too Large . . . . . . . . . . . . . . . . . . . . . .
Data Structure Corruption . . . . . . . . . . . . . . . . . . . . .
Data Type too large: exceeds 2 GB . . . . . . . . . . . . . . . . .
Database name missing . . . . . . . . . . . . . . . . . . . . . .
Database not Assigned . . . . . . . . . . . . . . . . . . . . . . .
Dataset is not a query . . . . . . . . . . . . . . . . . . . . . . .
Dataset not configured for network access . . . . . . . . . . . . .
Dataset [is] not in edit or insert mode . . . . . . . . . . . . . . .
DAX Error: Class not registered. . . . . . . . . . . . . . . . . . .
DAX Error: Name not unique in this context . . . . . . . . . . . .
DAX Error: Unexpected failure . . . . . . . . . . . . . . . . . . .
DCOM not installed . . . . . . . . . . . . . . . . . . . . . . . .
Debug process is already running . . . . . . . . . . . . . . . . . .
Debug session in progress. Terminate? . . . . . . . . . . . . . . .
Debugger kernel error. Error code: <> . . . . . . . . . . . . . . .
Decla ration expected but <> found . . . . . . . . . . . . . . . .
Decla ration of <> differs from declaration in interface <> . . . .
Decla ration of <> differs from previous declaration . . . . . . . .
Decla ration of class <> is missing or incorrect . . . . . . . . . .
DEFAULT clause not allowed in OLE automation section . . . . . .
Default parameter <> must be by-value or const . . . . . . . .
Default property must be an array property . . . . . . . . . . . .
Default value required for <> . . . . . . . . . . . . . . . . . . .
Default values must be of ordinal, pointer, or small set type . . . .
Destination must be indexed . . . . . . . . . . . . . . . . . . . .
Directory Is Busy . . . . . . . . . . . . . . . . . . . . . . . . . .
Directory is controlled by other .NET file . . . . . . . . . . . . . .
Disk Error. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Disk full. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Disk read error . . . . . . . . . . . . . . . . . . . . . . . . . . .
Disk write error . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dispid <> already used by <> . . . . . . . . . . . . . . . . . .
Dispid clause only allowed in OLE automation section . . . . . . .
Dispose not supported (nor necessary) for dynamic arrays . . . . .
Division by zero . . . . . . . . . . . . . . . . . . . . . . . . . . .
Duplicate case label . . . . . . . . . . . . . . . . . . . . . . . .
Duplicate database name <> . . . . . . . . . . . . . . . . . . .
Duplicate dynamic method index . . . . . . . . . . . . . . . . . .
Duplicate field name <> . . . . . . . . . . . . . . . . . . . . .
Duplicate implements clause for interface <> . . . . . . . . . . .
Duplicate message method index . . . . . . . . . . . . . . . . . .
Duplicate resource . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
163
163
164
166
168
168
169
170
171
171
172
173
173
173
173
174
175
176
177
177
178
179
179
180
181
181
183
184
185
188
188
189
189
190
191
191
192
193
194
195
195
196
197
197
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
199
199
200
201
201
201
201
202
202
203
204
204
204
205
205
206
206
206
207
207
207
207
208
208
209
209
210
211
211
211
211
212
212
213
214
214
214
215
216
216
216
217
217
217
xi
xii
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
try again. .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
233
233
234
235
235
236
236
236
236
237
237
239
239
240
240
240
241
242
242
243
243
244
244
245
245
246
247
248
249
250
251
252
253
254
255
256
256
257
258
259
259
261
261
262
xiii
xiv
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
292
293
293
294
294
295
295
296
297
297
298
298
299
299
304
305
306
306
307
308
308
309
312
312
313
313
314
314
315
316
316
317
318
319
320
321
321
322
322
323
323
324
325
326
xv
xvi
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
326
326
327
327
328
329
329
329
330
330
331
332
332
333
334
334
335
337
337
337
338
338
340
340
341
341
342
342
343
343
344
345
345
346
347
347
348
351
351
353
354
354
355
355
Label expected . . . . . . . . . . . . . . . . . . . . . . . .
Left side cannot be assigned to . . . . . . . . . . . . . . . .
Line number must be between 1 and <> . . . . . . . . . .
Line too long [more than 255 characters] . . . . . . . . . .
List capacity out of bounds (<>) . . . . . . . . . . . . . .
List index out of bounds (<>) . . . . . . . . . . . . . . . .
Local class, interface or object types not allowed . . . . . . .
Local class or object types not allowed . . . . . . . . . . . .
Local procedure/function <> assigned to procedure variable.
Lock file [has grown] too large . . . . . . . . . . . . . . . .
Lock time out . . . . . . . . . . . . . . . . . . . . . . . . .
Lock Violation. . . . . . . . . . . . . . . . . . . . . . . . .
Lookup information for field <> is incomplete . . . . . . . .
Low bound exceeds High bound. . . . . . . . . . . . . . . .
Master has detail records. Cannot delete or modify. . . . . .
Master has detail records. Cannot empty it. . . . . . . . . .
Master record missing . . . . . . . . . . . . . . . . . . . .
Maximum Validity Check Failed. . . . . . . . . . . . . . . .
Memo too large. . . . . . . . . . . . . . . . . . . . . . . .
Metafile is not valid. . . . . . . . . . . . . . . . . . . . . .
Method <> hides virtual method of base class <> . . . . .
Method <> not found in base class . . . . . . . . . . . . .
Method <> not supported by automation object . . . . .
Method <> with identical parameters exists already . . . .
Method identifier expected . . . . . . . . . . . . . . . . . .
Microsoft Transaction Server is not installed . . . . . . . . .
Minimum Validity Check failed . . . . . . . . . . . . . . . .
Mismatch in datapacket . . . . . . . . . . . . . . . . . . .
Missing comma . . . . . . . . . . . . . . . . . . . . . . . .
Missing Connection or Connection String . . . . . . . . . . .
Missing Data Provider or Data Packet . . . . . . . . . . . .
Missing ENDIF directive . . . . . . . . . . . . . . . . . . .
Missing operator or semicolon . . . . . . . . . . . . . . . .
Missing or invalid conditional symbol in <$> directive . . . .
Missing parameter type. . . . . . . . . . . . . . . . . . . .
Missing right quote . . . . . . . . . . . . . . . . . . . . . .
Missing TableName property . . . . . . . . . . . . . . . . .
Module <>s time/date changed. Reload? . . . . . . . . . .
Module header is missing or incorrect . . . . . . . . . . . .
Multiple Net Files found . . . . . . . . . . . . . . . . . . .
Multiple Paradox Net files found/in use . . . . . . . . . . . .
Must apply updates before refreshing data . . . . . . . . . .
Name conflicting . . . . . . . . . . . . . . . . . . . . . . .
Name not unique in this context . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
356
357
359
359
359
360
363
363
363
364
365
366
367
368
368
369
370
370
371
371
372
373
373
374
375
376
377
378
378
379
380
381
381
383
383
384
384
385
386
387
389
389
390
390
xvii
xviii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
391
391
392
392
393
393
394
395
395
396
397
397
398
398
398
399
400
401
402
402
403
404
405
405
406
408
408
409
409
410
411
411
412
413
413
414
415
416
417
419
420
421
422
423
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
424
424
425
425
425
426
427
427
428
428
429
429
430
430
431
431
432
432
432
433
433
434
435
435
436
437
437
438
439
439
440
441
442
443
443
444
444
445
446
446
447
447
448
449
xix
xx
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
449
450
450
451
451
452
452
453
453
454
454
455
455
456
456
457
458
458
460
460
461
462
463
463
464
465
465
466
466
467
467
468
469
469
470
470
471
471
472
473
474
474
475
476
xxi
xxii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
503
504
505
505
506
506
507
508
508
509
509
510
510
511
512
512
513
514
514
515
515
516
516
517
518
519
519
519
520
520
521
525
526
526
526
526
527
528
528
528
529
529
531
533
xxiii
xxiv
Prlogo
Prlogo
Desarrollar software es una tarea difcil. Algunas veces se sentir como si
estuviera buscando un camino a travs de un campo minado. Algunas
minas son letales y explotan en su cara, haciendo que su aplicacin deje
de funcionar. Otras podran simplemente causarle heridas de diversa consideracin. Y otras podran activarse tempranamente, para comenzar a
causar daos slo al cabo de cierto tiempo.
El problema es, por supuesto, doble: algunas minas son colocadas por Ud.
mismo y otras por poderes extraos podra ser Windows, una actualizacin de Windows, una DLL descarriada que ha quedado en memoria, o
alguna aplicacin incorrectamente programada que comparte el ordenador con su aplicacin.
Por supuesto, la solucin verdadera pasa por tener un mapa del campo de
minas. Conociendo donde estn las minas, ciertamente ser ms fcil
encontrar el camino seguro.
Los mensajes de error, por supuesto, sirven para un propsito vlido y
pueden ayudar a detectar esas minas de programacin. Aunque los
desarrolladores generalmente detestan ver mensajes de error, francamente estaran perdidos sin ellos. No obstante, histricamente el proceso
de resolver los problemas de una aplicacin que se comporta incorrectamente a partir de los mensajes de error ha tenido generalmente un cierto
componente de magia negra. Muchas veces los mensajes de error no son
muy tiles, y en ocasiones pueden ser totalmente engaosos.
Cuando se produce un error, es generalmente responsabilidad del creador
de esa pieza de cdigo particular (aplicacin, controlador, componente,
control, etc.) proporcionar una descripcin significativa de lo que ha ocurrido. Desafortunadamente, escribir mensajes de error significativos es
una tarea que cae siempre en la parte inferior de la lista de prioridades
del desarrollador. Como resultado, un mensaje de error podra no explicar
con suficiente claridad cul es el problema. Mi favorito es General SQL
Error (Error general de SQL). Claramente es un mensaje de error nada
til usted sabe que el error tiene relacin con SQL, pero nada ms. El
problema puede estar en cualquier lugar, haberse producido por cualquier
causa, y eso sera todo lo que podra suponerse para corregir el problema.
Un problema de an ms difcil solucin se produce cuando un mensaje de
error no tiene absolutamente nada que ver con el problema real. El
xxv
Prlogo
xxvi
Agradecimientos
Agradecimientos
Ningn libro es una isla. Aunque mucha de la informacin que se presenta aqu fue adquirida a travs de la aproximacin directa (programando!), alguna informacin transmitida en este libro ha sido
indirectamente adaptada de muchas y variadas fuentes. Entre estas otras
fuentes se incluyen otros libros de Delphi, publicaciones peridicas, grupos de noticias y listas de correo, la documentacin de ayuda de Delphi, el
cdigo de otras personas y conversaciones con colegas.
Cuando era joven escuch muchas veces la expresin Construya una
ratonera, y el mundo encontrar el camino hasta ella. Ahora s que eso
no es cierto. El mundo debe saber de la existencia de su ratonera, y normalmente habr que darla a conocer para que la tengan en cuenta, no
importa cun buena sea. Una gran ayuda para m en el proceso de hacer
mi ratonera conocida ha sido Internet, a travs de los grupos de noticias
y el correo electrnico.
Aprecio la ayuda que recib de Borland, fundamentalmente de Kendyll
Uppstrom, Karen Giles, Christine Ellis, John Kaster, Anneke Leigh,
David Intersimone, Dale Fuller, Bill Widmer y Charlie Calvert.
Un agradecimiento especial a Mark Johnson por ponerme en contacto con
Wordware cuando estaba buscando un editor y ellos estaban buscando
autores de libros sobre Delphi.
Me gustara agradecer tambin al autor de Delphi John Ayres y a las
siguientes personas en Wordware: Kellie Henderson, Jim Hill, Beth Kohler, Denise McEvoy, Diane Mueller y Paula Price.
Por ltimo, quiero agradecer a las siguientes personas la contribucin de
diversos materiales: Michael Burton, Eric Engler, Ken Hale, Dave Klein,
Walter Novacek, Numega, Atanas Stoyanov, Bob Swart, TurboPower Software y Robert Vivrette.
xxvii
Sobre el autor
Sobre el autor
Clay Shannon ha gastado muchos y variados sombreros a lo largo de su
vida. En su juventud, su actividad principal eran los deportes (bisbol,
ftbol y baloncesto), la msica (guitarra rtmica y bajo elctrico) y la fotografa. Como baloncestista, l se describe a s mismo como un pequeo,
gordo y viejo Arvydas Sabonis. En otro tiempo un msico vido (blues,
rock, country-rock, bluegrass), ahora rara vez encuentra tiempo para
tocar. Como fotgrafo, muchas de sus fotos fueron publicadas en revistas
y materiales publicitarios. Ahora ni siquiera tiene ahora una cmara
decente.
A la temprana edad de 35, Clay descubri la programacin, y nada ha
sido lo mismo desde entonces. Como anteriormente ocurri con la fiebre
de la guitarra, hoy se ha convertido en un rehn de la fiebre de la codificacin, ya que trabaja en el desarrollo de software da y noche, tanto los
das laborables como los fines de semana.
Shannon ha trabajado intensivamente y extensivamente con Delphi desde
el surgimiento de ste. Nativo de California (naci en Fort Bragg, creci
en Eureka, San Jos y la regin de la fiebre del oro del norte de California), reside actualmente en Coeur dAlene, Idaho. Ha trabajado como
escritor tcnico y desarrollador de Delphi y Access para Information
Anywhere en Jackson, CA, y como desarrollador de Delphi para Marotz
en Sacramento, CA; Softgear en Milwaukee, WI; John Deere en Brookfield, WI; Source Services (Romac International) en New Berlin, WI; Stratagem en Wauwatosa, WI; y eMake (antes Smart Shop) en Post Falls, ID.
Actualmente es consultor independiente de Delphi, instructor y autor
(Have Compiler, Will Travel).
Shannon puede ser contactado en bclayshannon@earthlink.net.
xxviii
Introduccin
Introduccin
Cmo este libro se diferencia de los dems
Una excelente coleccin de libros de Delphi est disponible en el mercado.
Pocos, sin embargo, contienen suficiente informacin sobre los mensajes
de error especficos de Delphi, qu significan y cmo resolverlos. Averiguar las causas y dar soluciones a los mensajes de error leyendo los archivos de ayuda de Delphi y escudriando los ndices de los libros
tradicionales de Delphi puede ser un proceso que consuma mucho tiempo.
Este libro llena ese vaco y sirve como una referencia rpida para implementar soluciones rpidas a ms de 800 mensajes de error que podr recibir mientras trabaja con Delphi. Adems, cada mensaje de error se
explica con suficiente detalle para que pueda entender cmo evitar la reaparicin del mismo problema en el futuro.
xxix
Introduccin
Introduccin
Introduccin
Publicaciones
Impresas
Delphi Developers Journal
Visite su sitio web en http://www.cobb.com/ddj para obtener artculos de
ejemplo, informacin de suscripcin, etc.
The Delphi Informant Magazine
Visite su sitio web en http://www.delphizine.com para obtener artculos de
ejemplo, componentes freeware, informacin de suscripcin, etc.
The Delphi Magazine
Visite su sitio web en http://www.itecuk.com/dmag/ para obtener artculos
de ejemplo, componentes freeware, informacin de suscripcin, etc.
Electrnicas
Boletn informativo Danysoft. Puede sucribirse, y tambin descargar
artculos, informacin y recursos desde http://www.danysoft.com
UNDU (Unofficial Newsletter of Delphi Users). Puede suscribirse, y tambin descargar todas las ediciones anteriores de UNDU de su sitio web:
Http://www.undu.com
Introduccin
http://www.borland.com/delphi/
http://www.danysoft.com/
http://SunSITE.icm.edu.pl/delphi/
http://www.delphi32.com
http://www.delphicorner.f9.co.uk
http://www.chami.com/tips/delphi/
http://www.mindspring.com/~cityzoo/cityzoo.html
http://www.advdelphisys.com
http://www.drbob42.com
http://www.icss.net/~nhodges
http://www.borland.com/codecentral
http://www.borland.com/devsupport
http://www.efg2.com/Lab/Library/Delphi/IO/IOResult.htm
Para obtener una lista de otros sitios dedicados a Delphi, visite:
http://www.borland.com/delphi/
y
www.undu.com (siga el enlace Delphi links)
Se puede acceder al sitio web de Borland directamente desde Delphi 3 y
superiores (si tiene un navegador instalado y una cuenta de Internet)
seleccionando Help | Borland Home Page o Help | Delphi Home
Page.
Introduccin
borland.public.delphi.multi-tier
borland.public.delphi.winapi
borland.public.delphi.internet
Para obtener un lista completa y actualizada de los grupos de noticias
sobre Delphi de Borland, visite http://www.borland.com
Otros libros
Los Tomos de Delphi: Algortmos y estructuras de datos por Julian
Bucknall.
Programacin COM en Delphi por Eric Harmon.
Los Tomos de Delphi: API grfico Win 32 por John Ayres y otros.
Los Tomos de Delphi: Ncleo del API Win 32 por John Ayres y otros.
201 Principles of Software Development por Alan M. Davis.
Code Complete por Scott McConnell.
Delphi Component Design por Danny Thorpe.
Delphi Developers Handbook por Marco Cantu, Tim Gooch y John Lam.
Delphi in a Nutshell por Ray Lischner.
Delphi Programming Problem Solver por Neal Rubenking.
Delphi X Developers Guide por Steve Teixeira y Xavier Pacheco.
Delphi X Unleashed por Charles Calvert.
Mastering Delphi X por Marco Cantu.
Teach Yourself Delphi in 21 Days por Kent Reisdorph
Otra fuente importante es la documentacin de Borland (incluyendo los
FAQs y TIs en el CD de Delphi) y los programas de ejemplo (situados por
defecto en C:\Archivos de programa\Borland\Delphi X\Demos y
C:\Archivos de programa\Delphi X\Help\Examples).
xxxiv
Mensajes de error
Mensajes de error
. Expected
Posible causa de error
Puede haber asignado un objeto o una clase a una variable. Por ejemplo, si el
nombre de la unidad es BigUnit, lo siguiente generar este error:
procedure TForm1.WhateverClick(Sender: TObject);
var
DiamondbackPitcher: String;
begin
DiamondbackPitcher := BigUnit;
end;
Solucin rpida
Cambie el nombre de la variable. En el contexto mostrado anteriormente, una
cadena debera ser asignada a la variable, as:
procedure TForm1.WhateverClick(Sender: TObject);
var
DiamondbackPitcher: String;
begin
DiamondbackPitcher := 'BigUnit';
end;
Informacin adicional
Cuando se intenta asignar un nombre de clase a una variable, el compilador
estar esperando encontrar un punto y una propiedad de la clase de un tipo
adecuado a continuacin del nombre de la clase.
Utilice nombres descriptivos para todos los identificadores formularios, unidades, componentes, variables y constantes.
Solucin rpida
Introduzca el camino de IDAPI32.DLL en la siguiente clave del Registro:
HKEY_LOCAL_MACHINE\SOFTWARE\BORLAND\DATABASE
ENGINE\DLLPATH.
El valor usual de esta entrada es: \Borland\Common files\BDE.
Informacin adicional
Puede que la entrada requerida est ausente solamente en el Registro de la
mquina en la que se realiza la distribucin de una aplicacin.
Para acceder a RegEdit (el editor del Registro), seleccione Inicio| Ejecutar,
escriba regedit, y pulse el botn Aceptar.
Solucin rpida
Elimine la directiva de compilador {$DENYPACKAGEUNIT ON} de la unidad
o cmbiela a {$DENYPACKAGEUNIT OFF}.
Informacin adicional
Este mensaje de error es nico para Delphi 3 y posteriores, ya que Delphi 1 y 2
no utilizan paquetes.
La directiva de compilador {$DENYPACKAGEUNIT ON} prohibe que la unidad que la contiene pueda ser colocada en un paquete.
{$DENYPACKAGEUNIT OFF} es la configuracin por defecto.
Mensajes de error
Solucin rpida
Elimine una o ambas directivas de compilador del archivo fuente donde
aparecen.
Informacin adicional
Ambas directivas de compilador estn desactivadas (off) por defecto. Pueden
ser activadas (on) o desactivadas (off) de la siguiente manera:
{$DESIGNONLY ON} o {$DESIGNONLY OFF}
{$RUNONLY ON} o {$RUNONLY OFF}
Solucin rpida
Elimine estas directivas de compilador del archivo fuente donde aparecen.
Informacin adicional
Estas directivas de compilador afectan la forma en que el entorno integrado de
Delphi trata una DLL que contiene un paquete. Por esa razn, solamente pueden estar contenidas en archivos fuente de paquetes (.DPK).
Solucin rpida
Elimine una o ambas directivas de compilador del archivo fuente donde
aparecen.
Informacin adicional
Si la directiva de compilador {$WEAKPACKAGEUNIT ON} aparece en un
archivo de unidad, el compilador omite esa unidad de los .DPLs (las bibliotecas
de paquetes de Delphi) si es posible.
No utilice la directiva de compilador {$WEAKPACKAGEUNIT ON} en una unidad que contenga variables globales, secciones Initialization o secciones
Finalization.
Solucin rpida
Elimine la directiva de compilador $WEAKPACKAGEUNIT o las secciones
Initialization/Finalization.
Informacin adicional
La razn para que una unidad que incluye la directiva de compilador
$WEAKPACKAGEUNIT no pueda contener cdigo de inicializacin o finalizacin (o datos globales, en realidad) es que potencialmente podran aparecer
mltiples copias de las mismas unidades dbilmente empaquetadas en la
misma aplicacin.
Mensajes de error
Una unidad puede tener una seccin Initialization sin una seccin Finalization, pero no lo contrario. Si necesita esta ltima pero no la primera, puede
simplemente declarar una seccin Initialization vaca, as:
initialization
// Nada !!!
finalization
{Sacar el gato fuera, cerrar la puerta, apagar las luces,
dar las buenas noches}
Solucin rpida
Elimine la directiva de compilador $WEAKPACKAGEUNIT o los datos
globales.
Informacin adicional
La razn para que una unidad que incluye la directiva de compilador
$WEAKPACKAGEUNIT no pueda contener cdigo de inicializacin o finalizacin (o datos globales, en realidad) es que potencialmente podran aparecer
mltiples copias de las mismas unidades dbilmente empaquetadas en la
misma aplicacin.
Solucin rpida
Elimine el punto y coma.
Informacin adicional
Un punto y coma significa el final de una sentencia If. Por ejemplo, el siguiente
ejemplo generar el mensaje de error bajo discusin:
if SunIsShining then
PlayBaseball; {causa el error}
else
PlayBasketballIndoors;
Solucin rpida
Elimine la segunda declaracin del procedimiento, funcin o propiedad.
Informacin adicional
Se debe tener abierto un proyecto para crear un objeto de automatizacin.
<> cant be added to this package because another file with the
same base name (<>) is already in the directory of the package
Posible causa de error
Est intentando insertar en un paquete un archivo que ya existe o que tiene el
mismo nombre de un archivo ya incluido en el paquete.
Solucin rpida
Si el archivo ya est contenido en el paquete, no intente aadirlo de nuevo. Si
quiere incorporar al paquete una nueva versin del archivo, elimine primero el
archivo original. Si el archivo difiere en funcionalidad pero tiene el mismo
nombre (y los necesita a ambos), renombre el que est intentando aadir e
intntelo de nuevo.
Mensajes de error
Informacin adicional
Los paquetes aparecieron con Delphi 3. Hay dos tipos de paquetes: de tiempo
de diseo y de tiempo de ejecucin. Para ms detalles, consulte packages en
la ayuda de Delphi.
Solucin rpida
Elimine de la declaracin de interfaz la clusula culpable (en el caso de arriba,
la directiva Stored).
Informacin adicional
Las interfaces son similares en cierto modo a las clases abstractas; ellas no
implementan sus propios mtodos. Se diferencian en que no proveen almacenamiento para las propiedades. No hay campos de datos en una interfaz. Una
clase concreta debe implementar la interfaz; una clase puede implementar
mltiples interfaces. Para ms informacin, consulte implements en la ayuda
de Delphi.
Solucin rpida
Elimine de la declaracin de interfaz la directiva responsable (en el caso de
arriba, la directiva Private).
Informacin adicional
Las interfaces no soportan ningn identificador de visibilidad. Consulte implements en la ayuda de Delphi para ms informacin sobre la implementacin
de interfaces en las clases de Delphi.
2. Puede haber omitido algo necesario, como por ejemplo la palabra reservada
End en una sentencia Case.
Solucin rpida
1. Reemplace el elemento encontrado por uno adecuado.
2. Aada el elemento omitido.
Informacin adicional
1. Si viene a Delphi/Object Pascal de un lenguaje que, como Visual Basic, utiliza el smbolo = como operador de comparacin (igualdad) y como smbolo
Mensajes de error
Solucin rpida
1. Cree el ndice antes de intentar asignarlo.
2. Borre el valor de la propiedad IndexFieldNames o cmbielo a uno apropiado para la tabla actual.
Informacin adicional
1. El cdigo que provoca este error compilar, debido a que hasta donde el
compilador sabe, usted podr crear el ndice mediante cdigo antes de
activarlo. En otras palabras, el error se detectar solamente en tiempo de
ejecucin.
Para crear un ndice mediante cdigo (lo contrario de hacerlo durante la
creacin de la tabla), utilice el procedimiento AddIndex.
Las propiedades IndexFieldNames e IndexName son mutuamente exclusivas. Cuando se asigna un valor a una, el valor de la otra es borrado.
10
<> has the descendent <> in the Repository and therefore cannot
be removed
Posible causa de error
Puede haber heredado de un objeto del Almacn de Objetos (Object Repository), haber luego aadido el objeto heredado al Almacn (presumiblemente
despus de hacerle algunos cambios), y ahora intenta eliminar el objeto original del cual ha heredado.
Solucin rpida
Si realmente desea eliminar un objeto del Almacn, debe primero eliminar
cualquier otro objeto que herede alguna funcionalidad de l.
Informacin adicional
Este mensaje de error es causado por lo que se conoce en el mundo de las bases
de datos como integridad referencial. No se puede borrar un registro maestro
del que dependen otros registros. La situacin es similar aqu, ya que el objeto
heredado en el Almacn depende del objeto que se pretende eliminar.
Solucin rpida
1. Puede cambiar el atributo de slo lectura del archivo de True a False utilizando el Explorador de Windows u otro programa de manipulacin de
archivos. En el Explorador, siga estos pasos:
a. Localice el archivo y pulse sobre l con el botn derecho del ratn.
b. Si la casilla de verificacin de slo lectura est activada, pulse sobre
ella para desmarcarla.
2. Marque (check out) el archivo e intente grabarlo de nuevo. Asegrese de no
haber marcado el archivo en modo de slo lectura.
Mensajes de error
11
Informacin adicional
1. Compruebe que realmente quiere modificar el archivo. Puede ser que se
haya definido como de slo lectura (por usted u otra persona) por una
buena razn.
2. Si ha realizado una modificacin que afecta al archivo .DFM (como haber
cambiado una propiedad del formulario o sus hijos), la presencia de un
archivo .DFM tambin marcado (checked out) ser necesaria cuando se
graben los cambios a un archivo .PAS.
Solucin rpida
Renombre el identificador. D al identificador un nombre significativo (lo que
har el cdigo ms fcil de leer y depurar), comenzando ya sea con una letra o
un guin bajo y continuando despus con cualquier combinacin de letras,
dgitos y guiones bajos.
Informacin adicional
Delphi/Object Pascal reserva las siguientes palabras para su propio uso:
12
Solucin rpida
Pulse el botn Cancel.
Informacin adicional
Los objetos en el Almacn pueden ser compartidos entre desarrolladores y proyectos. Si aade un objeto del Almacn a un proyecto, tiene tres posibilidades:
copiar, heredar o utilizar. Si hace una copia del objeto, obtendr una copia
independiente, sin conexin con el original que reside en el Almacn. Si hereda
del objeto del Almacn, los cambios futuros que se hagan al objeto del Almacn
se reflejarn en su objeto. Si decide usar directamente el objeto, estar trabajando sobre la copia original en el Almacn - los cambios que haga sobre el
objeto se reflejarn en todos los objetos que sean heredados de l.
Para ms informacin, consulte sharing objects in a team environment en la
ayuda de Delphi.
Solucin rpida
1. Cierre el Database Desktop, si tiene la tabla en cuestin abierta.
2. Cierre la(s) tabla(s), asignando False a la propiedad Active de los componentes TDataset (TTable, TQuery y TStoredProc en todas las versiones de
Delphi; TClientDataset en las versiones Cliente/Servidor de Delphi 3 en
adelante; TNestedTable a partir de Delphi 4), y False a la propiedad
Connected de los componentes TDatabase.
Mensajes de error
13
Informacin adicional
Si ha experimentado una terminacin anormal de la aplicacin (o una cada del
sistema), puede que sea necesario salir y luego reiniciar Delphi antes de poder
acceder a la tabla para uso exclusivo.
Solucin rpida
Borre la extensin, de modo que la extensin apropiada sea aadida automticamente, o cambie la extensin por una apropiada.
Informacin adicional
Un ejemplo de accin que podra causar este error es si est utilizando el ActiveX Control Wizard (Asistente de controles ActiveX) y est intentando grabar
el nombre del proyecto con una extensin diferente de .DPR.
Windows y Delphi dependen de las extensiones de los nombres de archivos
para saber qu tipo de informacin stos contienen y por tanto cmo deben ser
tratados. Si cambia la extensin de un archivo, la mquina no tiene forma de
saber si es un archivo de texto, un archivo fuente, un archivo objeto, un
archivo de proyecto, un archivo ejecutable, etc. (a menos que especifique la asociacin usted mismo).
14
Solucin rpida
Cambie el ndice de pgina a asignar por uno que exista, o cree una nueva
pgina en el Editor de Formularios (Form Editor) o en el cdigo antes de hacer
la asignacin.
Informacin adicional
Este error no ser detectado en tiempo de compilacin, debido a que el compilador supone que la pgina podr ser creada en el cdigo antes de ser activada
mediante un cdigo similar al de arriba.
Solucin rpida
Asegrese de que ha escrito el nombre del tipo correctamente.
Informacin adicional
Un ejemplo de cundo se podra obtener este mensaje de error es si se est tratando de escribir una versin ms corta de un tipo de datos. Por ejemplo,
podra intentar esto:
var
s: Str;
i: Int;
tidy: Bool;
wooly: Boolean;
Solucin rpida
Asigne nombres nicos a todos los alias de bases de datos.
Mensajes de error
15
Informacin adicional
Todas las cosas deben tener nombres nicos para ser identificadas correcta y
absolutamente. Las personas, por ejemplo, tienen nombres que permiten distinguir a unos de otros. Si dos nombres coinciden hasta un cierto nivel de detalle (por ejemplo, si tanto el nombre como el primer apellido coinciden), entonces
se debe continuar con otro nivel de detalle, tal como el segundo apellido, la
fecha de nacimiento, etc. para que de una manera nica y precisa se pueda
identificar a una persona. Los alias de bases de datos deben identificarse de
manera nica, y de hecho el mecanismo es mucho ms simple que en el caso de
los seres humanos. Si un nombre de alias tiene una slaba y es nico, eso es
suficiente.
Solucin rpida
Asigne al componente un nombre que se adhiera a las siguientes reglas:
Debe comenzar con una letra o un caracter de guin bajo (_).
Los caracteres siguientes deben ser letras, nmeros o el caracter de guin
bajo.
No utilice una palabra reservada de Object Pascal para nombrar un
componente. Las palabras reservadas de Object Pascal son:
and, array, as, asm, begin, case, class, const, constructor, destructor, dispinterface, div, do, downto, else, end, except, exports, file, finalization,
finally, for, function, goto, if, implementation, in, inherited, initialization,
inline, interface, is, label, library, mod, nil, not, object, of, or, out, packed,
procedure, program, property, raise, record, repeat, resourcestring, set, shl,
shr, string, then, threadvar, to, try, type, unit, until, uses, var, while, with,
xor.
Informacin adicional
Por defecto, Delphi asigna a los objetos nombres secuenciales basados en el
tipo del componente, tales como Button1, Button2, Timer1, etc. Para hacer el
cdigo ms legible (y de fcil mantenimiento), cambie esos nombres por otros
ms significativos. Por ejemplo, puede utilizar nombres como btnSave,
btnClose, tmrSplash, etc.
Puede utilizar hasta 63 caracteres para un nombre de componente.
16
Solucin rpida
Asegrese de que la fecha introducida sea vlida.
Informacin adicional
Internamente, un valor TDateTime es almacenado como un nmero real (para
ser ms especficos, un Double). La parte entera (la situada a la izquierda del
punto decimal) representa la fecha (donde el valor 0 representa al 31 de
diciembre de 1899, el valor 366 representa el 1 de enero de 1901, etc.); la parte
fraccionaria (a la derecha del punto decimal) representa la hora del da.
Se puede almacenar fechas anteriores al 31 de diciembre de 1899 utilizando
nmeros negativos (2 representa el 29 de diciembre de 1899, etc.).
Puede atrapar fcilmente este error encerrando un intento de conversin de
tipos a un tipo de datos TDateTime en un bloque Try...Except, de esta manera:
var
Fig: TDateTime;
try
Fig := StrToDate(Edit1.Text);
except
on EConvertError do ...
Mensajes de error
17
Solucin rpida
Verifique que el valor TDateTime que intenta convertir es vlido.
Si est almacenando directamente un valor en una variable TDateTime, utilice
este formato:
var
TheDay: TDateTime;
begin
TheDay := 30678.001 {28/12/1983 12:01:26}
Informacin adicional
No es necesario aadir la parte correspondiente a la hora del valor (la parte a
la derecha del punto decimal). Por ejemplo, en los ejemplos de arriba se podra
haber asignado los valores 30678 y 18/11/2001 (sin las partes de hora, .001 y
2:11 am, respectivamente).
Internamente, un valor TDateTime es almacenado como un valor de tipo
Double. La parte entera (la situada a la izquierda del punto decimal) representa la fecha (donde el valor 0 representa al 31 de diciembre de 1899, el valor
366 representa el 1 de enero de 1901, etc.); la parte fraccionaria (a la derecha
del punto decimal) representa la hora del da.
Se puede almacenar fechas anteriores al 31 de diciembre de 1899 utilizando
nmeros negativos (2 representa el 29 de diciembre de 1899, etc.).
18
y el usuario introduce cualquier nmero en el campo Edit1, el valor ser convertido a un nmero de punto flotante y almacenado en la variable indicada.
Pero si el usuario introduce cualquier cosa que no puede ser interpretada como
un nmero real, el mensaje de error bajo discusin se desplegar.
Solucin rpida
Verifique que el valor es un valor de punto flotante vlido antes de asignarlo a
la variable. Por ejemplo, podra utilizar algo como esto:
var
Trouble: Double;
try
Trouble := StrToFloat(Edit1.Text);
except
on EConvertError do ...
Informacin adicional
Los tipos de datos Real, Single, Double, Extended, Comp y Currency son todos
tipos de punto flotante.
Si se intenta asignar un valor de un tipo invlido a una variable real (por
ejemplo, asignar el valor True, de tipo Boolean, a la variable Trouble del ejemplo), se obtendr el error Incompatible types: <> and <> en tiempo de
compilacin.
Mensajes de error
19
Solucin rpida
Puede evitar que un usuario introduzca un valor invlido permitiendo slo un
dgito para el primer carcter y un dgito o el punto decimal para los siguientes
caracteres. Por ejemplo, aadiendo el siguiente cdigo al evento KeyPress:
procedure TfrmGetNosy.dbedtSalaryKeyPress(
Sender: TObject; var Key: Char);
begin
{ solamente permite dgitos y el carcter de retroceso }
if not (key in ['0'..'9','.',#8]) then
begin
MessageBeep(0);
Key := #0
end;
end;
Informacin adicional
Consulte adems la propiedad EditMask de los componentes TField y
TMaskEdit (en caso de que pueda prescindir de un componente con conexin a
datos).
20
Solucin rpida
1. Haga la seleccin adecuada en el cuadro de dilogo antes de pulsar el botn
OK.
2. Utilice las extensiones por defecto (o ninguna, en cuyo caso la extensin
apropiada ser aadida automticamente) para los archivos que Delphi
debe administrar.
Informacin adicional
Un ejemplo (de entre muchos similares) donde se obtendra este mensaje de
error, es si est intentando instalar un componente y pulsa OK en el cuadro de
dilogo sin introducir un valor en el control de edicin del nombre de archivo
de unidad.
y el usuario introduce un valor entero en el campo Edit1, el valor ser convertido a un entero y almacenado en la variable correspondiente. Pero si el
usuario introduce algo que no se puede interpretar como un entero, el mensaje de error bajo discusin se visualizar.
2. Puede estar intentando abrir un proyecto con una versin de Delphi anterior a la versin utilizada la ltima vez que lo compil, en cuyo caso puede
hacerse referencia a un formulario como el valor entero invlido
Solucin rpida
1. Verifique que el valor es un entero vlido antes de asignarlo a la variable.
Por ejemplo, se podra intentar algo parecido a esto:
var
CountOfMonteCarlo: Integer;
try
CountOfMonteCarlo := StrToInt(Edit1.Text);
except
on EConvertError do ...
Mensajes de error
21
Informacin adicional
S est intentando asignar un valor de un tipo inadecuado a un entero (por
ejemplo, asignar el valor Drcula a la variable entera CountOfMonteCarlo)
obtendr en tiempo de compilacin el error Incompatible types: <> y <> (y
no en tiempo de ejecucin, como en el ejemplo de arriba).
ShortInt, SmallInt, Integer, Byte, Word y Cardinal son todos tipos enteros.
Solucin rpida
Puede impedir que un usuario introduzca valores invlidos permitindole
introducir en el campo slo dgitos y el carcter de retroceso. Por ejemplo, aadiendo el siguiente cdigo al evento KeyPress:
procedure TfrmLilBigCity. dbedtWaynesWorld(Sender: Tobject;
var Key: Char);
begin
{ permite solamente dgitos y el carcter de retroceso}
if not (key in ['0'..'9', #8]) then
begin
MessageBeep(0);
Key := #0
end;
end;
Informacin adicional
Consulte adems la propiedad EditMask de los componentes TField y
TMaskEdit (si puede prescindir de un componente con conexin a datos).
22
<> is not a valid path. Make sure that the path name is spelled
correctly and that you are connected to the server on which the file
resides.
Posible causa de error
Puede estar utilizando un componente TADOConnection cuya propiedad
ConnectionString est apuntando a una base de datos en una localizacin que
no existe. Puede que haya borrado el directorio en el que la base de datos
reside, cambiado su nombre, o movido el proyecto a una mquina distinta en la
que no existe la misma estructura de directorios.
Solucin rpida
Siga estos pasos:
1. Haga doble clic sobre el componente TADOConnection para abrir el editor
de la propiedad ConnectionString.
2. Pulse el botn de radio Use connection string.
3. Pulse el botn Build.
4. Modifique la informacin del camino de la base de datos de tal forma que
coincida con la realidad.
5. Pulse OK dos veces.
Alternativamente, modifique el archivo de Enlace a Datos (Data Link), si est
utilizando alguno.
Informacin adicional
Utilice siempre el editor de la propiedad ConnectionString para construir su
cadena de conexin. Hacerlo a mano es para masoquistas. De esta forma, se
asegurar tambin de que est introduciendo un camino vlido de la base de
datos (por supuesto, si mueve un proyecto de una mquina a otra, puede que
necesite modificar esta propiedad como se ha descrito arriba).
Solucin rpida
Asegrese de que el valor a convertir sea vlido.
Mensajes de error
23
Informacin adicional
Internamente, un valor TDateTime es almacenado como un nmero real (para
ser ms especficos, un Double). La parte entera (la situada a la izquierda del
punto decimal) representa la fecha (donde el valor 0 representa al 31 de
diciembre de 1899, el valor 366 representa el 1 de enero de 1901, etc.); la parte
fraccionaria (a la derecha del punto decimal) representa la hora del da.
Puede atrapar fcilmente este error encerrando un intento de conversin de
tipos a un tipo de datos TDateTime en un bloque Try...Except, de esta manera:
var
TheTimeOfOurLives: TDateTime;
begin
try
TheTimeOfOurLives := StrToTime(Edit1.Text);
except
on EConvertError do begin
ShowMessage('La hora no es correcta');
ActiveControl := Edit1;
end;
end;
end;
<> is not a valid value for field <>. The allowed range is <> to <>
Posible causa de error
Puede haber intentado asignar a un campo de base de datos un valor que es
menor que la propiedad MinValue o mayor que la propiedad MaxValue del
campo.
24
Solucin rpida
Introduzca un valor que pertenezca al rango especificado para el campo, o
ample el rango permitido disminuyendo la propiedad MinValue y/o incrementando la propiedad MaxValue.
Informacin adicional
Todos los descendientes numricos de TField (que son creados por Delphi
cuando los campos de bases de datos subyacentes son inicializados) tienen las
propiedades MinValue y MaxValue.
Solucin rpida
Guarde la unidad, seleccionando File | Save, y luego adala al Almacn.
Para ello pulse el botn derecho del ratn sobre l y seleccione Add to Repository, o bien seleccione Project | Add to Repository.
Informacin adicional
Si est trabajando en un entorno de programacin en equipo, se puede configurar un directorio compartido de la red como Almacn de Objetos de Delphi, al
que todos los desarrolladores puedan acceder. Puede configurar Delphi para
que utilice este directorio seleccionando Tools | Environment Options, e
introduciendo la localizacin de este directorio compartido en el campo Shared
Repository, en la parte inferior de la pestaa Preferences.
La localizacin por defecto de la copia local del Almacn de Objetos es
C:\Archivos de programa\Borland\Delphi X\ObjRepos.
Mensajes de error
25
Solucin rpida
1-6.Sustituya el smbolo existente por el esperado.
7. Coloque las declaraciones de tipos solamente en secciones Type.
8. Sustituya el nombre de la unidad por el nombre de la clase.
Informacin adicional
Consulte la ayuda de Delphi para ms informacin sobre las sentencias de
declaracin de tipos, procedimientos y funciones.
26
Solucin rpida
Introduzca un valor vlido para la propiedad. En el caso de las propiedades
TabHeight y TabWidth de los controles TabControl y PageControl, asigne a la
propiedad un valor entre 0 y 32767.
Informacin adicional
Si asigna un valor mayor que 32767 a las propiedades TabHeight o TabWidth
de un TabControl o PageControl, se generar el mensaje de error Value must
be between 32768 and 32767. Sin embargo, realmente el valor debe estar
entre 0 y 32767. Introducir un nmero negativo produce el mensaje de error
bajo discusin.
Solucin rpida
Verifique que el archivo .DPR del proyecto contiene la lnea:
{$R *.RES}
entre sus secciones Uses y Begin. . . End. Seleccione View | Project Source y
aada o modifique esta lnea si es necesario.
Informacin adicional
La directiva de compilador {$R *.RES} especifica que el archivo con el mismo
nombre base del proyecto y la extensin .RES debe ser enlazado al proyecto.
Este archivo de recursos normalmente contiene solamente el icono de la aplicacin del proyecto.
No edite este archivo de recursos, ya que cualquier cambio que haga se perder
la prxima vez que recompile. Utilice un archivo de recursos separado para
aadir recursos adicionales.
Mensajes de error
27
Solucin rpida
Verifique que el ao est entre 1 y 9999, el mes est entre 1 y 12, la semana
del mes est entre 1 y 5, y el da de la semana est entre 1 y 7.
Informacin adicional
Delphi 6 contiene muchas unidades de utilidades nuevas, tales como DateUtils,
StrUtils, VarUtils, IBUtils, ConvUtils y MaskUtils.
Solucin rpida
Verifique que el ao est entre 1 y 9999, la semana del ao est entre 1 y 52, y
el da de la semana est entre 1 y 7.
Informacin adicional
Delphi 6 contiene muchas unidades de utilidades nuevas, tales como DateUtils,
StrUtils, VarUtils, IBUtils, ConvUtils, y MaskUtils.
Solucin rpida
Utilice un archivo objeto que no contenga definiciones de segmento de 16 bits.
Informacin adicional
Consulte la documentacin del producto que fue utilizado para crear el archivo
objeto, y busque instrucciones sobre la conversin de definiciones de segmento
de 16 bits a definiciones de segmento de 32 bits.
28
Solucin rpida
1. Seleccione Component | Configure Palette
2. Localice la pgina en la que el componente debera aparecer en el cuadro
de lista Pages y seleccinela. Se puede determinar cul es la pgina adecuada inspeccionando la llamada a RegisterComponents en la unidad del
componente o su unidad de registro. Por ejemplo, en este caso, la pgina es
Samples:
RegisterComponents('Samples', [TAISWebLauncher1]);
Informacin adicional
Este problema ocurre ms frecuentemente cuando se intenta instalar componentes propios. Usted intenta instalarlo, no puede hacerlo debido a un mensaje
de error, soluciona el problema, e intenta instalarlo de nuevo; entonces recibir
este mensaje de error.
Solucin rpida
Siga estos pasos:
Mensajes de error
29
Informacin adicional
Adems de simplemente solucionar el error de sintaxis generado por no tener
una interfaz por defecto o interfaces para el objeto CoClass, seguramente tambin desear aadir procedimientos, funciones y propiedades a la interfaz (en
caso de que no lo haya hecho todava). Para informacin especfica sobre cmo
hacer esto, consulte creating a new type library en la ayuda de Delphi.
El Editor de Bibliotecas de Tipos (Type Library Editor) puede ser accedido
seleccionando File | New | ActiveX | Type Library. Utilice el Editor de
Bibliotecas de Tipos para crear e inspeccionar la informacin de tipos de los
controles ActiveX y los objetos COM.
Debe tener abierto un proyecto para poder seleccionar File | New | ActiveX
| Automation Object, ya que los objetos de automatizacin son especficos
para un proyecto. Este no es el caso para la seleccin File | New | ActiveX |
Type Library.
Solucin rpida
Aada al menos una interfaz al objeto CoClass, o elimine el objeto CoClass.
Para aadir una interfaz a un objeto CoClass, siga estos pasos:
1. En Editor de Bibliotecas de Tipos, pulse el icono que representa las interfaces (parecido a una raqueta de ping-pong roja).
30
Informacin adicional
Adems de simplemente solucionar el error de sintaxis generado por no tener
ninguna interfaz asociada al objeto CoClass, seguramente tambin desear
aadir procedimientos, funciones y propiedades a la interfaz (en caso de que no
lo haya hecho todava). Para informacin especfica sobre cmo hacer esto, consulte creating a new type library en la ayuda de Delphi.
El Editor de Bibliotecas de Tipos (Type Library Editor) puede ser accedido
seleccionando File | New | ActiveX | Type Library. Utilice el Editor de
Bibliotecas de Tipos para crear e inspeccionar la informacin de tipos de los
controles ActiveX y los objetos COM.
Debe tener abierto un proyecto para poder seleccionar File | New | ActiveX
| Automation Object, ya que los objetos de automatizacin son especficos
para un proyecto. Este no es el caso para la seleccin File | New | ActiveX |
Type Library.
Solucin rpida
Cambie el nombre en el cuadro de edicin Class Name a uno que sea nico
para su VCL.
Informacin adicional
Por defecto, Delphi seleccionar un nombre que no entre en conflicto con los
componentes que estn instalados en la VCL del usuario.
Mensajes de error
31
Por ejemplo, si selecciona THeader como el tipo ancestro del componente que
va a crear, Delphi introducir THeader1 en el cuadro de edicin Class Name
(si ya hay una clase THeader1 en la VCL del usuario, ser THeader2, etc.).
La frase la VCL del usuario es utilizada en lugar de la VCL, debido que
cada usuario de Delphi probablemente tenga una coleccin nica de componentes VCL. Seguramente tendr el ncleo de los componentes de la VCL de Delphi que vienen con el producto (que es diferente para las distintas versiones y
ediciones de Delphi), pero podr tambin tener instalados en su sistema variados componentes de terceros (como los ofrecidos por Danysoft), componentes
shareware, componentes freeware, as como tambin algunos propios. Todos
ellos, en su conjunto, constituyen la VCL del usuario.
Solucin rpida
Asigne a cada componente un nombre nico, preferiblemente uno que describa
el propsito del componente, tal como mniAbout para un tem de men que
despliega una caja About (Acerca de...), btnClose para un botn que cierra un
formulario o cuadro de dilogo, etc.
Informacin adicional
Delphi asigna automticamente a cada componente que se coloca sobre un formulario un nombre nico basado en el tipo de componente y un nmero incremental. Por ejemplo, si se colocan tres etiquetas sobre un formulario, Delphi
les dar los nombres Label1, Label2, y Label3. Puede cambiar estos nombres
por otros ms descriptivos si lo desea, pero cada nombre de componente debe
ser nico.
32
Solucin rpida
Asigne al formulario original (ancestro) y a todos los componentes situados
sobre l nombres nicos al proyecto.
Informacin adicional
Puede tener (y probablemente tendr) componentes en formularios descendientes que tengan el mismo nombre que los colocados sobre el formulario ancestro,
pero stos sern aquellos componentes que fueron colocados inicialmente sobre
el formulario ancestro (y que son heredados por el formulario descendiente incluyendo el nombre). En otras palabras, los componentes colocados sobre el
formulario ancestro son heredados por el formulario descendiente e incluso tienen el mismo nombre. Los componentes colocados sobre el formulario descendiente redefinen o extienden la declaracin del formulario ancestro, y el
ancestro no puede heredar nada del formulario descendiente.
Por ejemplo, cree un formulario descendiente siguiendo estos pasos:
1. Seleccione File | New.
2. Seleccione la pestaa que tiene el mismo nombre que el proyecto.
3. Seleccione el formulario del que desea heredar.
4. Verifique que el botn de radio Inherit est seleccionado.
Si aade un componente TLabel sobre el formulario ancestro, Delphi asignar
al componente el nombre Label1. El formulario descendiente tambin tendr
un Label1 en la misma posicin (lo ha heredado de su ancestro). Sin embargo,
si ahora aade un componente TLabel directamente sobre el formulario descendiente (al cual Delphi asignar el nombre Label2), luego aade otro TLabel
sobre el formulario ancestro (al cual Delphi asignar el nombre Label3), y
finalmente intenta asignar a Label3 en el formulario ancestro el nombre
Label2, se producir el mensaje de error bajo discusin.
Solucin rpida
Verifique que la aplicacin de servidor est configurada para escuchar por el
puerto correcto, y que la aplicacin cliente est intentando conectarse a ese
mismo puerto.
Mensajes de error
33
Informacin adicional
Si est probando una aplicacin Site Express, puede utilizar el siguiente tipo
de URL: http://localhost:1024/Svrinfo.exe
Localhost es su mquina (IP # 127.0.0.1), a la que est intentando conectarse
por el puerto 1024 y ejecutar la aplicacin Svrinfo.
Site Express hizo su aparicin con Delphi 6.
Solucin rpida
1. Verifique que todas las DLLs requeridas, incluyendo los paquetes, estn
disponibles en el sistema y ubicadas en el lugar adecuado. Deben estar en
el camino de bsqueda de Delphi (Tools | Environment Options, pestaa Library, cuadro Library Path), y los paquetes, especficamente,
deben estar en el directorio \Windows\System.
2. Si usted es el autor del paquete, recompile el paquete con la versin de
Delphi en la que est intentando instalarlo. Si no es el autor, intente contactar con su autor para obtener la versin compilada apropiada.
Informacin adicional
Este es uno de esos mensajes de error que realmente no aportan muchas indicaciones en relacin con el problema real.
Antes de obtener este mensaje de error, se puede haber obtenido The <>.EXE
file is linked to missing export <>.DPL:<>. Consulte esa entrada en este
libro para ms informacin.
34
Solucin rpida
No declare otra interfaz como ancestro de un tipo disp-interfaz.
Informacin adicional
Un tipo de interfaz especificado mediante la palabra reservada Dispinterface
no puede especificar una interfaz ancestro, debido a que se trata de interfaces
abstractas.
Consulte dispatch interfaces, creating and accessing interfaces y dual
interfaces en la ayuda de Delphi para ms informacin.
Solucin rpida
Suministre un GUID para que el tipo disp-interfaz sea accesible.
Informacin adicional
Un GUID es un valor binario de 16 bytes cuya unicidad est garantizada
(GUID significa Globally Unique Identifier - Identificador Globalmente Unico).
Solucin rpida
Primero elimine del archivo .PAS la referencia al objeto o mtodo que no tiene
una referencia correspondiente en el archivo .DFM de formulario; luego vuelva
a aadir el objeto o mtodo al archivo .DFM.
Mensajes de error
35
Informacin adicional
Cuando aade un objeto o mtodo al formulario, Delphi intenta asignarle el
prximo nombre disponible para una instancia de su clase (por ejemplo, si
arrastra un botn sobre el formulario, recibir el nombre Button1 si no hay
ms botones en el formulario, Button2 si ya existe uno, etc.). Si hay una referencia a Button1 en el archivo .PAS (pero no en el archivo .DFM), Delphi
intentar nombrar el botn Button1 (debido a que no hay referencias a botones
en el archivo .DFM), lo que ocasionar el mensaje de error bajo discusin, ya
que no puede haber dos componentes llamados Button1 en el mismo archivo
.PAS.
Solucin rpida
Siga estos pasos:
1. Cierre el cuadro de mensaje, pulsando el botn OK.
2. En el cuadro de la lista Installed Units, seleccione la unidad que est
intentando instalar.
3. Pulse el botn Remove.
4. Intente instalar el componente de nuevo
Informacin adicional
El mdulo (unidad de componente) estaba instalado parcialmente, impidindole utilizarlo o intentar reinstalarlo (debido a que la instalacin se qued a
mitad de camino).
Esto no se aplica a Delphi 3 y superiores, en los que los componentes se instalan dentro de paquetes. No existe el cuadro de lista Installed Units en esas
versiones de Delphi. Para ver qu componentes han sido instalados en las pginas de la Paleta de Componentes en Delphi 3 y superiores, seleccione Component | Configure Palette. Para ver qu componentes estn instalados por
paquete, siga estos pasos:
1. Seleccione Component | Install Packages.
2. En la seccin Design Packages del cuadro de dialogo que se despliega,
seleccione el paquete que desea inspeccionar.
3. Pulse el botn Components.
36
Solucin rpida
Elimine todos los componentes de una pgina antes de intentar eliminar la
pgina. Si desea quedarse con los componentes pero deshacerse de la pgina,
arrstrelos de la pgina que desea eliminar a otra pgina; entonces podr eliminar la pgina.
Informacin adicional
Delphi 1 y 2
Para eliminar un componente, siga estos pasos:
1. Seleccione Component | Configure Palette.
2. En el cuadro de lista Pages, del lado izquierdo del cuadro de dilogo que se
despliega, seleccione la pgina que contiene el componente que desea
eliminar. Los componentes que la integran aparecern en el cuadro de lista
Components al lado derecho.
3. Seleccione el componente que desea eliminar.
4. Pulse el botn Delete.
5. Pulse el botn OK.
Delphi 3
Para eliminar completamente un componente (a diferencia de moverlo a una
pgina diferente), tendr que eliminarlo del paquete en el que reside.
Para borrar un componente de un paquete, siga estos pasos:
1. Seleccione Project | Options, y luego pulse sobre la pestaa Packages.
2. En la seccin Design Packages de la pgina Packages, seleccione el
paquete donde est el componente que quiere eliminar (para ver qu componentes estn contenidos en cada paquete, pulse el botn Components).
3. Pulse el botn Edit (no pulse el botn Remove, a menos que se quiera deshacer de todo el paquete).
4. Seleccione Yes en el cuadro de dilogo de confirmacin que aparece.
5. Pulse con el botn derecho sobre la unidad que quiere eliminar y seleccione
Remove Unit del men de contexto.
Mensajes de error
37
Delphi 4 y superiores
Para eliminar un componente, debe eliminar el paquete en el que ste reside.
Para hacerlo, siga estos pasos:
1. Seleccione Project | Options, y luego pulse sobre la pestaa Packages.
2. En la seccin Design Packages de la pgina Packages, seleccione el
paquete donde se encuentra el componente que quiere eliminar (para ver
qu componentes estn contenidos en cada paquete, pulse el botn
Components).
3. Pulse el botn Remove.
4. Seleccione Yes en el cuadro de dilogo que aparece para confirmar la eliminacin del paquete.
Solucin rpida
Cambie el nombre en el cuadro de edicin New ActiveX Name a uno que sea
nico entre los componentes de su VCL.
Informacin adicional
Cuando se deriva un control ActiveX de un componente de Delphi utilizando el
Asistente de Controles ActiveX (File | New | ActiveX | ActiveX Control),
el asistente crea un nombre por defecto para el nuevo control ActiveX eliminando la T del principio del nombre de la clase del componente y aadiendo
una X al final. Por ejemplo, si deriva un control ActiveX de un componente de
su biblioteca llamado TNavPanel, el asistente generar para el nuevo control el
nombre NavPanelX. Usted puede cambiar este nombre si lo desea, y si ya ha
creado un control ActiveX a partir del componente y ha utilizado este nombre
por defecto la vez anterior, tendr que utilizar un nuevo nombre en las ocasiones subsiguientes o recibir el mensaje de error bajo discusin.
38
Solucin rpida
Asegrese de que todos los paquetes requeridos estn instalados en el directorio de sistema de Windows (C:\Windows\System).
Informacin adicional
En Delphi 3, VCL30.DPL es el archivo de biblioteca de componentes principal.
En Delphi 4, es VCL40.BPL, y en Delphi 5 - VCL50.BPL. En Delphi 6, sin
embargo, las cosas cambian: es simplemente VCL.BPL. Todos los problemas de
versiones se resolvern conservando estos archivos en localizaciones separadas
para cada versin de Delphi que tenga instalada. En otras palabras, Delphi 7
presumiblemente vendr con un archivo denominado VCL.BPL (como lo hace
Delphi 6), pero ste ser instalado en un lugar diferente del disco que el
VCL.BPL que viene con Delphi 6. Estos ficheros (VCL*.BPL) sustituyen parcialmente a COMPLIB.DCL (Delphi 1) y CMPLIB32.DCL (Delphi 2). Decimos
parcialmente debido a que la biblioteca de cdigo completa de Delphi est
ahora dividida en varios ficheros .BPL diferentes (VCL.BPL, RTL.BPL, etc.).
Cuando est construyendo aplicaciones para utilizar los paquetes de tiempo de
ejecucin, asegrese de que todos los paquetes requeridos se instalen en la
mquina de destino. Puede hacer esto utilizando InstallShield Express, que es
proporcionado con la mayora de las versiones de Delphi.
Solucin rpida
Debe confirmar o deshacer cualquier transaccin antes de iniciar otra.
Informacin adicional
En DBExpress, las transacciones son numeradas. Por ejemplo:
SQLTransaction1.StartTransaction(1);
Mensajes de error
39
Solucin rpida
Debe finalizar una transaccin de base de datos confirmndola o deshacindola
antes de iniciar otra.
Informacin adicional
Consulte StartTransaction e InTransaction en la ayuda de Delphi para ms
informacin.
40
Solucin rpida
Asegrese de asignar siempre un valor a todos los campos obligatorios de las
tablas.
Informacin adicional
Se pueden utilizar tres niveles diferentes de validacin de los datos de una
tabla: a nivel de tabla, a nivel de registro y a nivel de campo. Adicionalmente,
se puede imponer una validacin a nivel de caracteres en el momento que el
usuario est introduciendo valores utilizando la propiedad EditMask de TField
o a travs de cdigo personalizado aadido a cualquiera de los eventos OnKeyDown u OnKeyPress.
La validacin a nivel de tabla se establece durante el diseo de la tabla para
garantizar que el tipo de datos y el tamao del campo es apropiado para los
valores con los que el campo ser llenado. Por ejemplo, un campo llamado
DateOfBirth (Fecha de Nacimiento) deber utilizar el tipo de datos Date, un
campo llamado LastName (Apellido) deber contener un String (conocido como
Alpha en Paradox, Char y VarChar en las bases de datos SQL), etc.
Puede (y se recomienda hacerlo) especificar un campo o columna de una tabla
como su clave primaria. Esto evita que a dos registros se les pueda asignar el
mismo valor para este campo. Un ejemplo de dnde podra utilizar esta caracterstica es en un campo SSN (Nmero de Seguridad Social) para una tabla
Employee (Empleados). Los campos de tipo Autoincrement tambin se utilizan
frecuentemente como claves primarias.
Utilizando el Database Desktop y tablas Paradox, se establece un campo como
clave primaria de la tabla durante su diseo haciendo doble clic sobre la
columna Key (o pulsando cualquier tecla cuando la columna tenga el foco). Si
crea la tabla mediante cdigo, puede utilizar el mtodo AddIndex y el valor
ixPrimary en el parmetro Options para indicar que el campo es clave primaria. Consulte TTable.AddIndex en la ayuda de Delphi para ms informacin.
Adicionalmente, puede designar campos como obligatorios (required) para evitar que puedan ser dejados en blanco. Para hacer esto en el Database Desktop
con tablas Paradox, seleccione la casilla de verificacin 1. Required Field
mientras el campo que se quiere hacer obligatorio est seleccionado en la seccin Field Roster.
Mensajes de error
41
42
Mensajes de error
43
Solucin rpida
1. Debe redefinir e implementar cualquier mtodo virtual abstracto antes de
llamarlo. Para el ejemplo de TCustomGrid, redefina el mtodo DrawCell en
la declaracin del componente, de esta forma:
protected
procedure DrawCell(ACol, ARow: Longint; ARect:
TRect; AState: TGridDrawState); override;
. . .
44
Informacin adicional
Los mtodos virtuales pueden ser redefinidos en las clases descendientes. Los
mtodos virtuales abstractos deben ser redefinidos en las clases descendientes.
Tenga en cuenta este tipo de situaciones cuando herede de un componente
TCustomX, as como de la clase TStrings.
Solucin rpida
Incluya la directiva Virtual o Dynamic detrs de la signatura del mtodo,
antes de la directiva Abstract.
Informacin adicional
Para los mtodos normales (no abstractos), el tipo de mtodo por defecto es el
esttico. Para mtodos abstractos, se debe especificar Virtual o Dynamic. Los
mtodos Abstract deben ser redefinidos, ya que no estn definidos en la clase
donde han sido declarados. Esa es la razn por la cual este tipo de clases se
conoce generalmente como clases base (otras clases heredan de ellas, redefiniendo el comportamiento abstracto). Las tres declaraciones siguientes son
todas aceptables:
procedure Radio(Interference: Variant);
{mtodo esttico}
procedure Reality(Memory: Extended); virtual; {mtodo virtual}
procedure Fluid(Duo: Boolean); dynamic;
{virtual y dinmico}
Mensajes de error
45
Para ms informacin sobre las diferencias y las ventajas/desventajas de utilizar mtodos estticos, virtuales y dinmicos en diferentes circunstancias, consulte dispatching methods en la ayuda de Delphi.
46
Solucin rpida
1. Asegrese de que los objetos a los que hace referencia ya hayan sido creados, y que no se haga ninguna referencia a objetos despus que hayan sido
destruidos. Por ejemplo, asegrese de que el formulario (o mdulo de datos)
en el que su objeto reside haya sido creado (y no haya sido todava destruido) cuando haga referencia a cualquiera de sus propiedades y mtodos.
2. Redefina el mtodo Notification y asigne Nil a la propiedad en caso de que
el componente al que se hace referencia sea eliminado del formulario. Por
ejemplo, he aqu las partes relevantes para la implementacin del cdigo
de notificacin:
TForTheTillerman = class(TComponent);
private
FReferencedObject: TBird;
. . .
protected
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
. . .
implementation
. . .
procedure TForTheTillerman.Notification(AComponent:
TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = FReferencedObject) then
FReferencedObject := nil;
end;
Mensajes de error
47
Informacin adicional
Para crear dinmicamente un formulario (y posteriormente destruirlo), siga
estos pasos:
a. Seleccione View | Project Manager.
48
Mensajes de error
49
GetMem(ptrBuf, RightSize);
FillChar(ptrBuf, RightSize, 0);
Solucin rpida
Utilice el operador de derreferenciacin (^), de esta manera:
var
ptrBuf: Pointer; //o cualquier otro tipo puntero, como PChar
begin
GetMem(ptrBuf, RightSize);
FillChar(ptrBuf^, RightSize, 0);
Informacin adicional
En el contexto del ejemplo anterior, el cdigo compila sin error, ya que es sintcticamente correcto. Sin embargo, dado que el puntero en s (y no la memoria
a la que apunta) es quien ha sido rellenado con ceros, cuando el programa
eventualmente vuelva a la pila para ver a dnde debe retornar, la direccin
que leer no ser una direccin vlida, sino $00000000 (lo que provocar el
mensaje de error).
Obtendr este mensaje de error, ya que es imposible para el compilador determinar a cul de los dos procedimientos est llamando.
50
Solucin rpida
Puede llamar al mtodo que utiliza el parmetro por defecto proporcionndole
el segundo parmetro (an cuando su valor sea el mismo que el valor por
defecto proporcionado en la declaracin), de esta manera:
procedure TForm1.Button1Click(Sender: TObject);
begin
PTBoat(109, 0) {llama al segundo mtodo PTBoat}
end;
Informacin adicional
La solucin mostrada arriba no es la aproximacin recomendada, ya que usted
no sera capaz de llamar al otro mtodo PTBoat. Es mejor evitar la utilizacin
conjunta de mtodos con el mismo nombre (sobrecargados) y parmetros por
defecto, a menos que las signaturas de los mtodos difieran lo suficiente como
para no causar confusin (al hombre o a la mquina) cuando se llame a cualquiera de los mtodos.
a:
TFormMaintainanceScript = class(TForm)
Solucin rpida
Si la intencin es realmente cambiar a TForm como clase base, simplemente
pulse OK en respuesta a todos los mensajes Component was deleted, delete
reference?.
Informacin adicional
Si quiere colocar los componentes sobre el formulario que ahora desciende de
TForm, seleccione Create component as new on the descendant.
Mensajes de error
51
Solucin rpida
Llame a Sessions.OpenSession antes de llamar a la funcin del BDE.
Informacin adicional
Tambin es posible que est ejecutando con insuficiente memoria.
Si el cdigo del error es $2C08, consulte Not initialized for accessing network files.
Si el cdigo del error es $2C09, consulte Share not loaded. It is required
to share local files.
Si el cdigo del error es $2108, consulte Cannot locate IDAPI32.DLL.
Si el cdigo del error es $2109, consulte Cannot load IDAPI32.DLL.
Another file with the same base name (<>) is already on the search
path
Posible causa de error
Puede estar intentando instalar en la VCL un componente del que ya hay una
versin instalada (o un componente diferente con el mismo nombre ya est
instalado).
Solucin rpida
Si est reemplazando una versin ms antigua por una nueva versin, primero
elimine la versin ms vieja de la biblioteca de componentes antes de instalar
la nueva versin.
52
Informacin adicional
Para eliminar un componente existente de su biblioteca de componentes, siga
estos pasos:
Delphi 1y 2
Para eliminar un componente, siga estos pasos:
1. Seleccione Component | Configure Palette.
2. En el cuadro de lista Pages situado a la izquierda del cuadro de dilogo
que se despliega, seleccione la pgina que contiene el componente que
desea eliminar. Los componentes que integran esa pgina aparecern en el
cuadro de lista Components al lado derecho.
3. Seleccione el componente que desea borrar.
4. Pulse el botn Delete.
5. Pulse el botn OK.
Delphi 3
Para eliminar un componente en Delphi 3 pueden utilizarse dos mtodos:
Puede eliminar un componente de una pgina en particular:
1. Seleccione Component | Configure Palette.
2. Seleccione la pgina en la que el componente reside en el cuadro de lista
Pages.
3. Pulse sobre el componente en el cuadro de lista Components (no es suficiente que el componente est simplemente resaltado debe pulsar sobre
l para evitar obtener el mensaje de error A page must be empty
before it can be deleted).
4. Pulse el botn Delete.
O puede eliminar un componente de un paquete en particular:
1. Seleccione Project | Options, y luego pulse sobre la pestaa Packages.
2. En la seccin Design Packages de la pgina Packages, seleccione el paquete
en el que reside el componente que desea eliminar (para ver qu componentes estn contenidos en cada paquete, pulse el botn Components).
3. Pulse el botn Edit (no pulse el botn Remove, a menos que quiera deshacerse del paquete entero).
4. Seleccione Yes en el cuadro de dilogo de confirmacin que aparece.
5. Pulse con el botn derecho sobre la unidad que desea eliminar y seleccione
la opcin Remove Unit del men de contexto.
Mensajes de error
53
Para localizar el archivo que tiene el mismo nombre del que se est intentando
instalar, seleccione Tools | Environment Options. . . y luego inspeccione el
cuadro Library path de la pgina Library para determinar el camino de bsqueda que Delphi est utilizando. Puede luego buscar el archivo en esos directorios utilizando las caractersticas del Explorador de Windows.
Delphi 4 y superiores
Puede ocultar un componente de modo que no aparezca en la Paleta de Componentes, o eliminar el paquete en el que reside.
Para hacer que un componente no aparezca en la Paleta (esconderlo), siga
estos pasos:
1. Seleccione Component | Configure Palette.
2. Seleccione la pgina de la paleta en la que el componente aparece en el
cuadro de lista Pages.
3. Pulse sobre el componente en el cuadro de lista Components (no basta
con simplemente seleccionar el componente debe pulsar sobre l para
evitar obtener el mensaje de error A page must be empty before it can
be deleted ).
4. Pulse el botn Hide.
Para eliminar un componente de un paquete en particular, siga estos pasos:
1. Seleccione Project | Options, y luego pulse sobre la pestaa Packages.
2. En la seccin Design Packages de la pgina Packages, seleccione el
paquete en el que el componente que desea eliminar reside (para ver qu
componentes estn contenidos en cada paquete, pulse el botn
Components).
3. Pulse el botn Remove.
Solucin rpida
Si no tiene Delphi Cliente/Server (Enterprise), tendr que desistir de intentar
ejecutar el programa de demostracin o adquirir la edicin Cliente/Server
(Enterprise).
Si tiene Delphi Cliente/Server y todava obtiene este mensaje de error, deber
desinstalar Delphi y luego volverlo a instalar siguiendo estos pasos:
54
Informacin adicional
Como las diferentes ediciones de Delphi difieren en caractersticas y componentes, no es posible mezclar y combinar proyectos creados con diferentes ediciones. Esto tambin es vlido entre versiones. Es decir, usted no puede compilar
un proyecto creado con una versin de Delphi de 32 bits en Delphi 1 (sin hacer
algunas modificaciones). Consulte la pgina principal de Delphi en el sitio web
de Borland (http://www.borland.com) para obtener informacin especfica sobre
las diferencias en cuanto a caractersticas y componentes entre las distintas
ediciones de Delphi.
Consulte el mensaje Your application is not enabled for use with this
driver.
Solucin rpida
Cuando declare variables, verifique que sus tipos son adecuados para contener
todos los posibles valores que podra querer almacenar en ellas. Por ejemplo, si
una variable particular puede manejar valores hasta 100.000, no utilice un tipo
de variable Word; en lugar de ello, utilice un Integer (LongInt en Delphi 1).
Informacin adicional
La excepcin es Runtime Error 215. Esta excepcin solamente se produce si
ha habilitado la comprobacin de desbordamiento en el entorno integrado o en
el cdigo.
Para habilitar la comprobacin de desbordamiento en el entorno integrado,
siga estos pasos:
Mensajes de error
55
Delphi 1
Seleccione Options | Project, y sobre la pgina Compiler, verifique que la
casilla de verificacin Overflow checking est habilitada.
Delphi de 32 bits
Seleccione Project | Options, y sobre la pgina Compiler, verifique que la
casilla de verificacin Overflow checking (Q) est habilitada.
Para habilitar la comprobacin de desbordamiento mediante cdigo, aada la
directiva {$Q+} en la parte superior de la(s) unidad(es) donde desee habilitarla.
Solucin rpida
Asegrese de que solamente aplica ndices a variables de tipo array.
Informacin rpida
El siguiente cdigo producir el mensaje de error bajo discusin, debido a que
en l se hace un intento de acceder a un elemento de RuggedIndividualist, y
esta variable no es un array y por ello no tiene elementos que puedan ser
indizados:
procedure IndexIntoTheArray(element: integer);
var
RuggedIndividualist: integer;
begin
RuggedIndividualist[1] := element;
end;
Assertion failed
Posible causa de error
Una expresin de tipo Boolean pasada a la funcin Assert ha producido False.
Solucin rpida
Si la asercin debera cumplirse, revise el cdigo para averiguar la causa por la
que est fallando.
56
Informacin adicional
Si el valor de la expresin debe ser True para que el programa se ejecute efectivamente o proporcione resultados vlidos, interrumpa el programa en caso de
que la asercin falle.
Aqu se muestra un ejemplo de cmo utilizar el procedimiento Assert:
procedure ScrutinizePayCheck(amtpaid, amtexpected: Currency);
begin
try
Assert(amtpaid >= amtexpected, 'Qu est pasando aqu?');
except
on EAssertionFailed do
Halt;
end;
end;
Solucin rpida
Elimine la asignacin a la variable de control del bucle For.
Informacin adicional
La variable de control de un bucle For es la variable (comnmente una variable entera como i) a la cual se asigna un valor inicial como valor de partida, y
que se incrementa en 1 al finalizar cada iteracin. Este valor frecuentemente
se inicializa a 0. El valor final es generalmente una variable, cuyo valor determina cuntas veces el bucle For se ejecutar. Por ejemplo, a continuacin se
muestra un bucle For con sus elementos anotados en los comentarios:
procedure SimpleLoop(TimesToLoop: integer);
var
i: integer; {i es la variable de control del bucle}
s: string;
begin
s := '';
for i := 0 to TimesToLoop do {valores inicial y final}
s := s + IntToStr(i); {cuerpo del bucle}
end;
Mensajes de error
57
Solucin rpida
Asigne a las propiedades Port de ambos componentes el mismo valor; de esta
forma, el componente TClientSocket se conectar al mismo puerto por el cual
el componente TServerSocket est escuchando.
Informacin adicional
Consulte el archivo Services (en C:\Windows) para determinar los nmeros de
puertos que ya estn asociados normalmente para otros usos. Por ejemplo, este
es un extracto del archivo:
58
ftp
Telnet
smtp
21/tcp
23/tcp
25/tcp
At end of table
Posible causa de error
Puede estar intentando acceder a la propiedad OldValue de un campo al insertar un nuevo registro en modo de actualizaciones en cach (CachedUpdates).
Debido a que no existe una versin anterior de este registro, es imposible acceder a su valor anterior.
Solucin rpida
Antes de intentar acceder a la propiedad OldValue, primero determine si es
factible efectuar una comprobacin para ver si el estado del DataSet es dsEdit,
as:
if Table1.State = dsEdit then
FogieVal := OldValue;
Informacin adicional
Cuando se utilizan actualizaciones en cach, los registros almacenados en la
cach se conocen como valores antiguos. Esto le permite cancelar las
modificaciones realizadas, y que los campos vuelvan a sus valores anteriores
(con los valores antiguos recuperando su status como valores actuales).
Mensajes de error
59
SlErrMsgs.Add(
Format(SErrorMessage, [E.Message,
RaiseLastWin32Error, DateTimeToStr(Now)]);
2. Puede haber intentado insertar una sentencia en el lugar donde se esperaba un array constante, como la seccin de argumentos de la funcin
Format. Por ejemplo, el siguiente cdigo generar este mensaje de error:
VariableFormat := Format('%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s\',
[ SEGMENT_IDENTIFIER,
{3}
TaxPayerIdentification,
{4}
TAX_TYPE_CODE,
{5}
PayrollDate,
{6}
if length(Trim(NYStateTaxWithheld)) > 0 then
StateAmountTypeCode := STATE_AMOUNT_TYPE_CODE; {7}
. . .
Solucin rpida
1. Elimine el procedimiento, o sustityalo por una funcin o variable del tipo
de datos apropiado. Para reparar la lnea de cdigo mostrada arriba, por
ejemplo, podra cambiarla a:
SlErrMsgs.Add(
Format(SErrorMessage, [E.Message,
SysErrorMessage(GetLastError), DateTimeToStr(Now)]);
Informacin adicional
En todo jardn se cuelan algunos insectos.
60
Solucin rpida
Ignore el error si la definicin especificada en el mensaje de error no es necesaria para sus propsitos, o modifique el archivo .OBJ.
Informacin adicional
Si recibe este mensaje de error, la definicin del archivo objeto (.OBJ) que provoca el error sea ignorado.
Las directivas $L y $LINK son sinnimas, y se utilizan para enlazar procedimientos y funciones escritos en otros lenguajes y declarados en Delphi como
externos.
La sintaxis que se utiliza para ello es:
$L[INK] <Archivo objeto>
Mensajes de error
61
Solucin rpida
Delphi 3
Mueva o borre el archivo .DCP mencionado en el mensaje de error y recompile
el paquete.
Delphi 4 y superiores
Mueva o borre el archivo .DCP mencionado en el mensaje de error y reinstale
el paquete.
Informacin adicional
Para recompilar un paquete despus de borrar el archivo .DCP, siga estos
pasos:
1. Seleccione Component | Install Packages. . . .
2. Seleccione el paquete apropiado en el cuadro de lista Design Packages.
3. Pulse el botn Edit.
4. Pulse el botn Yes en el cuadro de dilogo de confirmacin que aparece.
5. Pulse el icono Compile.
Si contina recibiendo el mismo mensaje de error despus de borrar el archivo
corrupto y recompilar el paquete, contacte con Borland por telfono o a travs
de su sitio web.
Solucin rpida
Recompile el archivo fuente de la unidad (.PAS) para producir un nuevo
archivo de unidad compilada (.DCU).
Informacin adicional
Si el .DCU es un archivo de componente, siga estos pasos para recompilar el
archivo fuente de unidad (.PAS) para producir un nuevo archivo de unidad
compilada (.DCU):
1. Seleccione la siguiente opcin, en dependencia de su versin de Delphi:
Delphi 1: Options | Install Components
Delphi 2: Component | Install
Delphi 3-6: Component | Install Component
62
Solucin rpida
Cambie los valores de los parmetros SHAREDMEMLOCATION y
SHAREDMEMSIZE con la Utilidad de Configuracin del BDE (pgina System
| nodo Init). Incremente el valor de SHAREDMEMSIZE a $4096 u $8192 (es
$2048 por defecto).
Si est ejecutando Windows 95/98, introduzca un valor para
SHAREDMEMLOCATION entre $9000 y $FFFF; si es Windows NT/2000,
entre $1000 y $7F00. Intntelo primero con $1000. Despus cambiar el valor,
cierre todas las aplicaciones que utilicen el BDE. Puede ser necesario probar
con varios valores antes de encontrar uno que funcione bien.
Informacin adicional
Este error corresponde a Insufficient memory for this operation (memoria insuficiente para esta operacin).
Para ms informacin, consulte la ayuda del BDE.
Mensajes de error
63
Before you can deploy, you must complete the Web Deployment
page of the Project|Web Deploy Options dialog
Posible causa de error
Puede haber seleccionado Project | Web Deploy sin haber proporcionado
toda la informacin necesaria en la pestaa Projects del cuadro de dilogo
Web Deploy Options (no hay una pgina Web Deployment, a pesar del texto
del mensaje de error).
Solucin rpida
Pulse OK para desechar el mensaje de error y volver a la pgina Projects del
cuadro de dilogo Web Deploy Options (Project | Web Deploy Options).
Debe proporcionar entradas en los cuadros de edicin Target Dir, Target
URL y HTML Dir.
Informacin adicional
Adems de las entradas requeridas en la pgina Projects, hay tambin otras
opciones que debe especificar tambin en las pginas Packages, Additional
Files y Code Signing del cuadro de dilogo Web Deploy Options.
Los tems de men Web Deploy Options y Web Deploy no estn disponibles
si no ha abierto un proyecto o est trabajando con un tipo de proyecto
convencional.
Solucin rpida
1. Asegrese de que cualquier archivo que intente cargar en la propiedad
Picture del componente TImage sea realmente un archivo grfico vlido.
2. Cambie el valor de la propiedad Picture.Bitmap.PixelFormat.
3. Haga lo siguiente en el evento AfterScroll del objeto TDataset:
64
Informacin adicional
3. Las bases de datos de Microsoft antes mencionadas almacenan los grficos
como objetos OLE y no como datos puros.
Nota: <TFieldName> es la concatenacin de un nombre de Dataset y un
nombre de campo.
Delphi proporciona soporte nativo para cuatro formatos de archivos grficos, concretamente .BMP (mapas de bits), .ICO (iconos), .WMF (Windows
Metafile) y .EMF (Enhanced Metafile).
Puede ser que alguien haya cambiado la extensin de un archivo, de modo
que parezca ser un archivo de mapa de bits por su extensin aunque realmente no lo es.
Mensajes de error
65
Solucin rpida
No utilice como ndice un nmero negativo o un nmero mayor que el valor de
la propiedad Size de TBits. Si no se asigna explcitamente un valor a la propiedad Size, el array se expandir automticamente tanto como sea necesario
cuando se asignen valores a elementos de un array TBits.
Informacin adicional
Los Bits a los que se refiere el mensaje de error es el objeto TBits, que implementa un array de valores Boolean.
En el ejemplo de arriba, un intento de asignar un valor al elemento 7 del array
tambin provocara el mensaje de error, ya que el ndice est basado en 0 (y
por ello un tamao de 7 crear nicamente los elementos 0, 1, 2, 3, 4, 5 y 6).
Solucin rpida
1. Reemplace la versin de VREDIR.VXD. La versin original (4.00.950) y la
versin 4.00.1116 no ocasionan el problema. VREDIR.VXD debera estar
66
Informacin adicional
1. Todos los usuarios pueden ser afectados si algn usuario tiene la versin
invlida de VREDIR.VXD (incluso aquellos que personalmente tienen una
versin correcta en sus mquinas).
2. A continuacin se muestra una tabla de los tipos de datos Paradox y sus
correspondientes clases descendientes de TField de Delphi:
Tipo de dato Paradox
Alpha
TStringField
Autoincrement
TAutoIncField
BCD
TBCDField
Binary
TBlobField
Byte
TBytesField
Date
TDateField
Formatted Memo
TBlobField
Graphic
TGraphicField
Logical
TBooleanField
Long Integer
TIntegerField
Memo
TMemoField
Money
TCurrencyField
Number
TFloatField
OLE
TBlobField
Short
TSmallIntField
Time
TTimeField
Timestamp
TDateTimeField
Mensajes de error
67
Solucin rpida
Solamente llame a Break o Continue dentro de un bucle For, While o Repeat.
Extienda el bucle For o While, si es necesario, aadiendo una seccin
Begin. . . End despus de la palabra reservada Do (los bucles Repeat ya consideran el bloque entero entre Repeat y Until como una sentencia compuesta, y por
lo tanto stas no necesitan estar encerradas en un bloque Begin. . . End.)
Informacin adicional
Lo siguiente producir el mensaje de error bajo discusin:
procedure SaturdayNightAtTheMovies;
begin
while WatchingMovie do
EatPopcorn;
if TheaterCatchesFire then
Break;
end;
68
Una llamada al procedimiento Break ocasiona que el flujo de control se interrumpa para un bucle For, While o Repeat y se prosiga con la prxima sentencia despus del bucle.
Por ejemplo, analice el siguiente ejemplo:
procedure ForAllTheTeaInChina(widgets: integer);
var
i: integer;
s: string;
begin
for i := 0 to widgets do
begin
if i >= 1000 then
Break; {el bucle es abandonado}
s := IntToStr(i); {si i >= 1000, esta lnea no ser ejecutada}
end;
Order('TsingTao', i * 2);
Order('HotPepperBeefStick', i);
end;
Mensajes de error
69
Por ejemplo, la llamada a Exit en el siguiente cdigo provoca que el procedimiento CheckItOut sea abandonado y se retorne a donde se hizo la llamada:
type
TGenre = (BaroqueChamber, Blues, CountryRock,
Disco, Opera, Rap, Reggae, Rock, Soul);
. . .
procedure CheckItOut(MusicStyle: TGenre);
begin
if MusicStyle in [Disco..Rap] then
Exit
else if MusicStyle in [BaroqueChamber..CountryRock] then
ListenToTheMusic
else if MusicStyle in [Reggae..Soul] then
DanceToTheMusic
else
ShowMessage('Qu msica es sta?');
end;
procedure DetermineCourseOfAction;
begin
CheckItOut(Soul);
CashItOut(Retirement);
end;
70
Solucin rpida
Quite el punto de ruptura. Asigne puntos de ruptura solamente sobre lneas
que generan cdigo, tales como lneas que contienen sentencias de asignacin.
Informacin adicional
El optimizador de Delphi puede haber eliminado la lnea en cuestin (obviamente, no ignorando las lneas que usted ha escrito, sino slo en lo que al compilador concierne), debido a que el cdigo nunca es llamado en la aplicacin.
Un ejemplo de dnde podra obtener el mensaje de error bajo discusin es si
intenta ejecutar la aplicacin hasta un lugar de la seccin Interface de una
unidad. Normalmente no debera intentar hacer esto; otros ejemplos (en la seccin Implementation) podran ser la primera lnea de un procedimiento, una
lnea de declaracin de variables, etc.
En el siguiente procedimiento, las lneas que producen este mensaje de error
(si coloca un punto de ruptura sobre ellas) se indican mediante comentarios
que indican aqu no!:
procedure SaturdayNightAtTheMovies; {aqu no!}
begin
while WatchingMovie do
begin {aqu no!}
EatPopcorn;
TheaterCatchesFire := OLearysCowIsHere;
if TheaterCatchesFire then
Break;
end; {aqu no!}
end;
Mensajes de error
71
Solucin rpida
Asegrese de que el archivo de proyecto (seleccione View | Project Source
Project | View Source en Delphi 4 y posteriores para examinar el cdigo
fuente del archivo de proyecto) contiene la siguiente sintaxis para cargar al
menos el formulario principal del programa (puede haber mltiples lneas
similares para crear diversos formularios):
Application.CreateForm(TForm1, Form1);
Informacin adicional
Todos los dems formularios de la aplicacin (exceptuando el formulario principal) pueden ser cargados dinmicamente cuando sean necesarios. Esto amortiza el coste de tener creados los formularios durante perodos de tiempo ms
largos de lo necesario, y de crear algunos formularios (como el cuadro de dilogo Acerca de..., si tiene alguno) que podran no ser necesarios en absoluto.
Para crear dinmicamente un formulario (y posteriormente destruirlo), siga
estos pasos:
1. Seleccione View | Project Manager.
2. Pulse el botn Options.
3. En el cuadro de lista Auto-Create Forms, seleccione el formulario que
desea crear dinmicamente.
4. Pulse el botn de flecha a la derecha para mover el formulario a la lista
Available Forms.
5. Pulse el botn OK.
6. Modifique el cdigo que utiliz para mostrar el formulario por el siguiente:
procedure TForm1.ShowAbout(Sender: TObject);
begin
About := TAbout.Create(nil);
try
About.ShowModal;
finally
About.Free;
end;
end;
Sin embargo, si intenta mostrar el formulario antes de que sea creado, as:
AboutBox.ShowModal:
AboutBox := TAboutBox.Create(Application);
AboutBox.Free;
72
Solucin rpida
Asegrese de que el End final est intacto y que no ha sido comentado. Verifique que todo Begin tiene un End correspondiente, y que todos los comentarios
que empiezan con una llave izquierda ({ ) estn emparejados con su correspondiente llave derecha ( }).
Informacin adicional
El procedimiento RegisterClass es diferente de RegisterComponents, que se
utiliza en las unidades de componentes para especificar el nombre del componente y la pgina en la que ser colocado (o, si la pgina no existe, la pgina
que ser creada para alojar el componente).
Solucin rpida
1, 2. Cambie el valor de la propiedad Active a False, haga los cambios, y luego
asigne nuevamente True a la propiedad Active.
Informacin adicional
El componente TClientSocket apareci en Delphi 4, como el resto de los componentes de la pgina Internet. Las versiones anteriores de Delphi tenan una
Mensajes de error
73
pgina Internet en la Paleta de Componentes, pero se utilizaba para los controles ActiveX; el nuevo conjunto de componentes lo componen controles nativos
de Delphi.
Solucin rpida
Fusione algunos de los componentes propios o de terceros dentro de uno o unos
pocos directorios comunes y edite la ruta de bsqueda consecuentemente.
Informacin adicional
Puede tambin ser til utilizar nombres de directorios tan cortos como sea
posible. Aparentemente, es el tamao conjunto de todas las rutas de archivos
lo que ocasiona el problema.
Solucin rpida
1. Si necesita modificar un registro maestro, no cambie los valores de los campos claves, ya que los registros hijos (de detalle) los utilizan para localizar
a su padre. Si necesita borrar un registro maestro, borre primero los
registros hijos asociados e l.
2. Actualcese a Access 97, Paradox, InterBase, o alguna otra base de datos.
Alternativamente, elimine la funcionalidad de integridad referencial de la
base de datos Access 95.
74
Informacin adicional
Consulte referential integrity en la ayuda de Delphi.
Solucin rpida
1. Asegrese de que su archivo de biblioteca de componentes reside en el
lugar apropiado en dependencia de su versin de Delphi. Si encuentra el
archivo en otro lugar, muvalo a la localizacin apropiada e intentar
recompilar la biblioteca (Delphi 1 y 2) o paquete o reinstalar el paquete
(Delphi 3-6). Si el archivo ya est en el lugar correcto pero sigue recibiendo
este mensaje error, siga estos pasos:
a. Haga un copia de resguardo del archivo (COMPLIB.DCL,
CMPLIB32.DCL, VCL30.DPL, VCL40.BPL, VCL50.BPL, VCL60.BPL)
y almacnela en un lugar seguro.
b. Borre la copia original del archivo que ha copiado.
c. Si anteriormente haba hecho cambios al archivo, Delphi habr creado
antes una copia de resguardo de la versin anterior, reemplazando la
primera letra de la extensin con una tilde (~) y truncando la ltima
letra de la extensin. En Delphi 1, este archivo se llamar
COMPLIB.~DC; en Delphi 2, CMPLIB32.~DC, etc. Si encuentra el
archivo apropiado para su versin de Delphi, renmbrelo en
correspondencia con su versin de Delphi y resturelo a su estado
inicial como biblioteca de componentes de Delphi. Si no ha hecho
cambios anteriormente al archivo, o la copia de resguardo no existe,
copie el archivo desde el CD de Delphi al lugar apropiado para su
versin de Delphi.
2. Reconstruya o reinstale la biblioteca de componentes.
3. Siga los pasos a-c de arriba para reinstalar la ltima copia buena de la
VCL.
Mensajes de error
75
4. Asegrese de distribuir todos los mdulos requeridos con cualquier componente o programa que distribuya.
Informacin adicional
En Delphi 1, el nombre de archivo de la biblioteca de componentes era
COMPLIB.DCL. Su tamao era de 1.036 KB. En Delphi 2, el archivo de la
biblioteca de componentes fue renombrado a CMPLIB32.DCL. Su tamao era
de 4.636 KB. En Delphi 3-6, no hay ningn archivo con extensin .DCL. En
lugar de una unidad conteniendo toda la VCL, se proporcionan muchos paquetes independientes que contienen grupos de componentes relacionados. El
paquete principal, que contiene los componentes ms comunes y las unidades
que necesitar para un proyecto de Delphi tpico, est contenido en un archivo
.DPL (Delphi package library). En Delphi 3, VCL30.DPL ocupa 1.257 KB. En
Delphi 4, VCL40.BPL ocupa 1.753 KB. En Delphi 5, VCL50.BPL ocupa 1.976
KB. En Delphi 6, el tamao de VCL60.BPL es de 2.386 KB. Una instalacin
completa de Delphi 3 incluye aproximadamente 25 archivos .DPL. Delphi 4
introduce los archivos .BPL, de los cuales hay 38 en la versin Cliente/Server.
La edicin Enterprise de Delphi 5 (equivalente a la antigua edicin Client/Server) contiene 40 archivos .BPL, y la misma edicin de Delphi 6 contiene aproximadamente 55 archivos .BPL.
Cant load package <>.<> One of the library files needed to run
this package cannot be found
Posible causa de error
1. Puede ser que el paquete al que se hace referencia en el mensaje de error
(o un paquete o .DLL del que ste depende) no est instalado, o no est instalado en el lugar adecuado.
2. Puede estar intentando cargar un paquete que depende de otro paquete o
.DLL que, aunque est instalado en el sistema (y en el lugar correcto), no
es de la versin adecuada.
Solucin rpida
1. Asegrese de que todos los paquetes y .DLLs requeridos estn situados en
el directorio actual o en el camino de bsqueda de Windows (preferentemente en el directorio \Windows\System).
2. Si hace cambios a un paquete del que otro paquete depende, recompile
ambos paquetes (el requerido primero y el dependiente despus).
Informacin adicional
Los paquetes de Delphi son DLLs especializadas (con extensin .DPL en Delphi 3 y extensin .BPL en Delphi 4 y superiores) que aparecieron por primera
76
Cant load package <>. The specified module could not be found.
Posible causa de error
Puede haber instalado un paquete en Delphi, y haberlo movido posteriormente
a una localizacin diferente.
Solucin rpida
Puede:
Mover el paquete de nuevo a su localizacin anterior.
-O-
Mensajes de error
77
Informacin adicional
Esto puede ocurrirle si instala un paquete desde una localizacin arbitraria,
como por ejemplo un directorio en el que descarga ficheros de Internet, y posteriormente decide mover el cdigo a un lugar ms centralizado y/o lgico. La
moreleja de este mensaje de error es: debe determinar de antemano dnde
quiere que residan sus paquetes de tiempo de diseo. Para ms informacin,
consulte Cant load package <>.<> One of the library files needed to
run this package cannot be found.
Solucin rpida
Pruebe sucesivamente con estas soluciones cada vez ms drsticas hasta que
una de ellas funcione:
1. Salga de Delphi; reinicie Delphi; intente compilar la aplicacin de nuevo.
2. Salga de Windows; reinicie Windows (inicio en caliente); reinicie Delphi;
intente compilar la aplicacin de nuevo.
3. Salga de Windows; apague el ordenador (inicio en fro); espere un par de
minutos; encienda el ordenador; reinicie Delphi; intente compilar la aplicacin de nuevo.
4. Si el espacio en disco duro est en bajo mnimos (menos del 10 por ciento
del tamao total de la unidad est libre), borre todos los archivos innecesarios. Una vez que haya liberado espacio del disco duro (que podr utilizarse
como memoria virtual), defragmente el disco duro y luego intente compilar
la aplicacin de nuevo.
5. Verifique que la memoria virtual est configurada correctamente en el sistema (Vea la informacin adicional).
6. Compre ms RAM.
Informacin adicional
Si le parece que tiene problemas con la configuracin de la memoria virtual,
puede hacer que Windows ajuste automticamente la memoria virtual
siguiendo estos pasos:
78
Cannot add a session to the form or data module while session <>
has AutoSessionName enabled
Posible causa de error
Puede que ya tenga un componente TSession sobre un formulario o mdulo de
datos con la propiedad AutoSessionName asignada a True.
Solucin rpida
Si va a aadir mltiples componentes TSession a un formulario o mdulo de
datos, asigne False a sus propiedades AutoSessionName.
Informacin adicional
En una aplicacin tpica, no necesitar colocar ni siquiera un componente
TSession sobre el formulario o mdulo de datos. Un componente TSession es
necesario para la conectividad con bases de datos, pero se crea automticamente para usted, de una forma similar a como el objeto Application es creado
automticamente para cada aplicacin Delphi.
Si est creando aplicaciones con mltiples hilos o si est accediendo a tablas
Paradox que residen en varios lugares de una red, sin embargo, puede colocar
componentes TSession adicionales sobre el formulario o mdulo de datos para
facilitar el trabajo en esas circunstancias especiales.
El propsito de la propiedad AutoSessionName es garantizar a los desarrolladores de aplicaciones con mltiples hilos que las sesiones generadas para
cada hilo son nicas en tiempo de ejecucin. Cuando se le asigna True a la propiedad AutoSessionName, automticamente se generar un nombre nico para
cada nueva sesin.
Para ms informacin, consulte AutoSessionName en la ayuda de Delphi.
Mensajes de error
79
Solucin rpida
Aada un especificador Write para la propiedad en cuestin, o abstngase de
asignarle valores si la propiedad debe permanecer como de slo lectura.
Informacin adicional
Una propiedad debe tener un especificador Read, un especificador Write, o
ambos. Es una prctica comn leer de un campo privado (cuyo nombre, por
convenio, empieza con la letra F), y escribir en l utilizando un procedimiento
cuyo nombre comience con la palabra Set. A continuacin se presenta un ejemplo de algunas de las posibles maneras de declarar propiedades:
private
FScottFitzgerald: String;
FLeeBailey: Boolean;
FAOSchwarz, FDR: Currency;
FPSantangelo: Extended;
procedure SetFee(i: Integer);
procedure SetPrice(c: Currency);
public
{Esta propiedad es de slo lectura}
property ScottFitzgerald: String; read FScottFitzgerald;
{Esta propiedad es de slo escritura}
property LeeBailey: Boolean; write SetFee;
{Esta propiedad es de lectura y escritura}
property AOSchwarz: Currency; read FAOSchwarz; write SetPrice;
Solucin rpida
Elimine la llamada que causa el problema de la parte Finally de la sentencia
Try. . . Finally.
80
Informacin adicional
El lenguaje garantiza que la parte Finally de una sentencia Try. . . Finally se
ejecutar siempre completamente. Por lo tanto, no se permite utilizar en ellos
procedimientos de control de flujo tales como Break, Continue o Exit, que
impediran potencialmente que se ejecute algn cdigo situado en la parte
Finally.
Solucin rpida
No intente cambiar el tamao de un archivo de icono (.ICO). Las propiedades
Height y Width de TIcon son de slo lectura y uniformes para todos los iconos
de Windows (32*32 pxeles para los iconos regulares, y 16*16 pxeles para los
iconos pequeos).
Informacin adicional
Puede crear iconos (entre otras cosas) con la utilidad ImageEditor de Delphi.
Para activarla, seleccione Tools | Image Editor y luego File | New | Icon.
Puede tambin crear archivos .DCR para los componentes personalizados que
usted cree. Estos deben ser cuadrados, con 24 pxeles de lado. Para hacerlo,
seleccione Tools | Image Editor, luego File | New | Bitmap, asigne 24 al
ancho y la altura, y seleccione VGA (16 colores), a menos que est seguro de
que todos los usuarios de su componente utilizan sistemas SuperVGA (256
colores). Las imgenes de 16 colores se muestran correctamente en sistemas
configurados para 256 colores, pero las imgenes de 256 colores pueden lucir
mal al mostrarse en sistemas configurados para 16 colores.
Mensajes de error
81
FormStyle := fsStayOnTop;
end;
2. Puede haber intentado asignar un valor a la propiedad Visible de un formulario dentro de los eventos OnActivate, OnShow u OnHide del
formulario. Por ejemplo, lo siguiente producir el mensaje de error bajo
discusin:
procedure TForm1.FormActivate(Sender: TObject);
begin
Visible := false;
end;
Solucin rpida
1. No cambie el valor de la propiedad FormStyle del formulario durante los
eventos OnActivate u OnShow.
2. No cambie el valor de la propiedad Visible del formulario durante los eventos OnActivate, OnShow u OnHide.
Informacin adicional
Si asigna True a la propiedad Visible de un formulario en tiempo de diseo,
ste aparecer inmediatamente en tiempo de ejecucin. Delphi mostrar automticamente el formulario principal de la aplicacin en el arranque, y los
dems formularios se mostrarn cuando sus mtodos Show o ShowModal sean
llamados. Si asigna True a la propiedad Visible de todos los formularios de su
aplicacin en tiempo de diseo, stos se mostrarn tan pronto como la aplicacin se inicie, lo cual podra provocar que la interfaz de usuario no sea intuitiva y provoque confusin al usuario.
Si quiere que un formulario aparezca en respuesta a un evento particular (por
ejemplo, una pulsacin sobre un botn) y permanezca en pantalla mientras se
trabaja con otros formularios, puede hacerlo as:
procedure TForm1.Button12Click(Sender: TObject);
begin
Form3.Show;
end;
82
Solucin rpida
Solucione cualquier error de sintaxis que exista (seleccione Alt+P, S para verificar la sintaxis), y luego intntelo de nuevo.
Informacin adicional
Consulte class completion en la ayuda de Delphi.
Mensajes de error
83
Solucin rpida
Introduzca un GUID vlido en la propiedad ServerGUID con este formato:
98ED7140-EE18-11D3-A238-80584EC12700
Informacin adicional
Si proporciona un valor tanto para ServerName como para ServerGUID, este
mensaje de error no aparecer, siempre y cuando uno de los dos valores sea
vlido.
Solucin rpida
Proporcione la contrasea cuando se presente el cuadro de dilogo Database
Login, y luego pulse el botn OK.
Informacin adicional
Puede evitar tener que introducir continuamente una contrasea mientras est
desarrollando su aplicacin, asignando la contrasea mediante cdigo o a travs de la seccin Parameter Overrides del editor del componente TDatabase.
84
Solucin rpida
Guarde el nuevo proyecto en un directorio diferente.
Informacin adicional
Un ejemplo de cmo podra ocurrir este error es si se ejecutan los siguientes
pasos:
1. Bajo el directorio Delphi X\Objrepos\Logoapp (en Delphi 3 o 4), crear un
directorio llamado Logjam.
2. Seleccionar File | New.
3. Seleccionar el icono Win 95 Logo Application de la pgina Projects.
4. Intentar guardar el nuevo proyecto (basado en el proyecto Logoapp del
Almacn) en el directorio creado anteriormente.
Mensajes de error
85
Solucin rpida
1. Si la sentencia SQL utilizada en el componente TQuery no devuelve un
conjunto de valores (no es una sentencia SELECT de SQL), utilice el
mtodo ExecSQL de TQuery en lugar de Open.
2. Asigne una sentencia SELECT de SQL vlida a la propiedad SQL.
Informacin adicional
Si est utilizando la propiedad SQL para insertar, actualizar o borrar valores
de una tabla, utilice el mtodo ExecSQL de TQuery. El mtodo Open es slo
para sentencias SELECT.
86
Solucin rpida
1. Asegrese de que el directorio en el que intenta grabar un archivo con el
mtodo SaveToFile ya ha sido creado. Puede primero crear el directorio y
luego grabar el archivo en l. Por ejemplo, en el ejemplo de arriba podra
hacer esto:
CreateDir('C:\dotbumps');
Image1.Picture.SaveToFile('C:\dotbumps\road.BMP');
Informacin adicional
Los mtodos SaveToFile y LoadFromFile de la clase TPicture pueden ser utilizados con archivos grficos. Los mtodos SaveToFile y LoadFromFile de la
clase abstracta TStrings pueden ser aplicados a cualquier variable o propiedad
de tipo TStrings, como por ejemplo la propiedad SQL del componente TQuery,
as como a objetos de clases descendientes de TStrings, tales como TStringList.
Por ejemplo, a continuacin se muestran algunas formas en las que el mtodo
SaveToFile puede ser utilizado:
procedure TForm1.Button3Click(Sender: TObject);
var
Liszt: TStrings;
begin
Liszt := TStringList.Create;
try
Liszt.Add('Franz, Hungary');
CreateDir('C:\Composers');
{Llamada a SaveToFile de TStringList}
Liszt.SaveToFile('C:\Composers\FLiszt.txt');
{Llamada a SaveToFile de la propiedad SQL de TQuery}
Query1.SQL.SaveToFile('st8ments.txt');
{Llamada a SaveToFile de TPicture para grabar un bitmap;
se asume que el directorio Pitchers ya ha sido creado}
Image1.Picture.SaveToFile('C:\Pitchers\vase.BMP');
finally
Mensajes de error
87
Liszt.Free;
end;
end;
Solucin rpida
1. Asegrese de que la propiedad FormStyle del formulario padre (el formulario cuya propiedad FormStyle tiene el valor fsMDIForm) sea creado antes
de la creacin de los formularios hijos.
2. Si algn formulario de la aplicacin ha sido configurado como formulario
hijo MDI (asignando fsMDIChild a su propiedad FormStyle), el valor
correspondiente del formulario principal del proyecto debe ser fsMDIForm.
Informacin adicional
1. Si crea formularios dinmicamente (en el cdigo, en tiempo de ejecucin),
el formulario padre debe ser creado en primer lugar.
MDI significa Interfaz de Mltiples Documentos. El estilo de aplicacin alternativo es SDI (Interfaz de Documento nico). Una aplicacin MDI contiene un
formulario cuya propiedad FormStyle tiene el valor fsMDIForm y uno o ms
formularios hijos, a cuya propiedad FormStyle se le debe asignar el valor
fsMDIChild. En una aplicacin MDI, los formularios hijos estn siempre contenidos en dentro de los lmites del formulario padre.
Un ejemplo de una aplicacin MDI es el Administrador de Archivos de
Windows 3.x. Se podan abrir muchas ventanas dentro del espacio de trabajo
del Administrador, y luego disponerlas en cascada (cascade) o en mosaico (tile),
o moverlas a cualquier posicin dentro de los lmites de la ventana del Administrador, pero no fuera de ella.
Un ejemplo de aplicacin SDI es Delphi. Delphi est compuesto de mltiples
formularios que flotan libremente (el Inspector de Objetos, la Paleta de Componentes, el Editor de Cdigo, etc.) y que no estn contenidos o restringidos por
ninguna otra ventana.
88
Solucin rpida
1. Reduzca si es posible el nmero de controles TEdit y TComboBox que est
utilizando. Si esto no es posible, crelos dinmicamente cuando sean necesarios, y librelos cuando ya no sean necesarios (como ocurre cuando estos
controles aparecen sobre diferentes pginas de un componente de cuaderno
con pestaas).
2. Reduzca si es posible el nmero de descendientes de TWinControl (controles visuales capaces de recibir el foco) que est utilizando. Si esto no es
posible, crelos dinmicamente cuando sean necesarios, y librelos cuando
ya no sean necesarios (como ocurre cuando estos controles aparecen sobre
diferentes pginas de un componente de cuaderno con pestaas).
3. Reinicie la mquina e intntelo de nuevo.
Informacin adicional
Consulte EOutOfResources en la ayuda de Delphi.
Solucin rpida
1. Siga estos pasos:
Mensajes de error
89
Informacin adicional
La creacin de ActiveForms y controles ActiveX se introdujo a partir de Delphi
3. Los formularios ActiveForm pueden ser distribuidos a travs de la World
Wide Web (WWW); los controles ActiveX tambin pueden ser utilizados en
aplicaciones web, pero no slo sirven para ese fin. Creando componentes Delphi
y luego convirtindolos en controles ActiveX, puede ponerlos a disposicin no
slo de los desarrolladores de Delphi, sino tambin de aquellos que utilicen
cualquier entorno de desarrollo que soporte los controles ActiveX, como C++
Builder, Visual C++, IntraBuilder, Internet Explorer, Visual Basic y
PowerBuilder.
Solucin rpida
Mantenga el valor False en la propiedad AutoSessionName si utiliza ms de
un componente TSession sobre un formulario o mdulo de datos.
Informacin adicional
Si utiliza ms de un componente TSession en una aplicacin, no debe asignar
True a la propiedad AutoSessionName de ninguno de ellos. Delphi puede asignar automticamente los nombres de sesin (y garantizar que las sesiones
90
Solucin rpida
Localice el archivo y colquelo en el camino de bsqueda de Delphi, o modifique el camino de bsqueda para incluir la localizacin actual del archivo.
Informacin adicional
Para localizar un archivo utilizando el Explorador de Windows, siga estos
pasos:
1. En el panel de directorios de la izquierda, seleccione el rea donde desea
buscar; para buscar sobre toda la mquina, seleccione el icono que representa al ordenador (denominado por defecto MiPc).
2. Seleccione Herramientas| Buscar | Archivos o Carpetas....
3. Introduzca el nombre del archivo en el cuadro de combinacin Nombre
(por ejemplo, Misplaced.PAS).
4. Pulse el botn Buscar ahora.
Para colocar el archivo en el camino de bsqueda de Delphi, primero podra
desear ver qu directorios constituyen el camino de bsqueda de Delphi. Para
ello, siga estos pasos:
1. Seleccione Tools | Environment Options.
2. Seleccione la pgina Library.
3. Consulte el contenido del cuadro de combinacin Library Path.
4. Mueva el archivo a uno de esos directorios, o aada el directorio en que
reside el archivo al camino de bsqueda.
Mensajes de error
91
Solucin rpida
Si est utilizando Delphi 1/Windows 3.x, asegrese de que la localizacin del
archivo IDAPI.CFG (por defecto C:\IDAPI) coincide con lo indicado en la seccin [IDAPI] de WIN.INI bajo la entrada CONFIGFILE01.
Si es necesario, mueva el archivo al lugar indicado por la configuracin en
WIN.INI, o modifique la entrada en WIN.INI para que est en concordancia
con la localizacin actual del archivo.
Si est utilizando Delphi de 32 bits y Windows 95, asegrese de que la localizacin del archivo IDAPI32.CFG (C:\Archivos de programa\Borland\Common
files\BDE por defecto) coincide con lo indicado en el Registro del sistema.
Si es necesario, mueva el archivo al lugar indicado en el Registro, o modifique
la entrada del Registro para que coincida con la localizacin actual del archivo.
Informacin adicional
Las cosas han cambiado con la aparicin del Registro en las versiones de Windows de 32 bits. Antes de Windows 95, el archivo de configuracin del BDE
(IDAPI.CFG) estaba situado por defecto en el directorio IDAPI de la unidad C:.
WIN.INI apuntaba a la localizacin de ese archivo; de esta manera, se poda
cambiar de sitio el archivo de configuracin siempre que se indicara la nueva
localizacin en WIN.INI, para que los programas que necesitaban referirse a l
pudieran encontrarlo.
En las versiones de Delphi de 32 bits, la localizacin del archivo de configuracin del BDE se indica en el Registro del sistema. Siga estos pasos:
1. Seleccione Inicio | Ejecutar.
2. Introduzca regedit en el cuadro de combinacin Abrir y pulse el botn
Aceptar.
3. Navegue hasta HKEY_LOCAL_MACHINE\Software\Borland\Database
Engine.
4. El valor de la clave CONFIGFILE01 indica el directorio donde el archivo
de configuracin debe estar situado.
92
Solucin rpida
Borre la referencia al mtodo manejador de eventos en la columna derecha de
la pgina de eventos del formulario, y borre la declaracin del mtodo de la
seccin Interface de la unidad.
Informacin adicional
Si borra tanto el cuerpo del mtodo de la seccin Implementation de la unidad
como la declaracin del mtodo de la seccin de Interface (dejando la referencia
al evento sobre la pgina de eventos del Inspector de Objetos), y luego intenta
volver a crear el gestor de eventos, no recibir un mensaje de error, pero Delphi no crear el esqueleto del gestor de eventos. Como en el caso de arriba,
debe eliminar la referencia al mtodo gestor de eventos en la columna derecha
de pgina de eventos del formulario antes de poder volver a codificar el
mtodo.
Solucin rpida
Verifique que la aplicacin servidora est escuchando por el puerto correcto, y
que la aplicacin cliente est intentando conectarse a ese mismo puerto.
Informacin adicional
Si est probando una aplicacin Site Express, puede utilizar el siguiente tipo
de URL: http://localhost:1024/Svrinfo.exe
Mensajes de error
93
2. Puede haber utilizado un componente TPageControl en Delphi 2 (este componente no estaba disponible en Delphi 1; esto no ocurre en Delphi 3 y
superiores) y asign a la propiedad ActiveControl un control que no estaba
visible la ltima vez que el proyecto fue cerrado.
Solucin rpida
1. Verifique que las propiedades Visible y Enabled del control tienen ambas el
valor True antes de intentar asignarle el foco.
2. Abra el formulario como texto y borre la lnea donde se asigna el valor a la
propiedad ActiveControl. Puede hacer esto de dos maneras:
Pulsando el botn derecho del ratn sobre el formulario y seleccionando la
opcin View as Text del men de contexto.
-OSeleccionando File | Open, asignando el filtro para mostrar los archivos
.DFM y abriendo el formulario en cuestin.
94
Informacin adicional
Este mensaje de error puede provocar confusin, debido a una posible diferencia de concepto entre lo que Ud. puede considerar normalmente como una ventana y de lo que Windows y Delphi consideran como una ventana. En este caso,
cuando se habla de ventana se quiere decir en realidad un control de ventana
(cualquier control al que se asigna un manejador de ventana y que es capaz de
recibir el foco y ser padre de otros controles). En este sentido, un botn es una
ventana, un cuadro de edicin es una ventana y en realidad todos los componentes que descienden de TWinControl son ventanas.
Solucin rpida
No asigne el valor caHide al parmetro Action del evento FormClose, ni llame
al mtodo Hide del formulario o asigne False a la propiedad Visible del formulario para un formulario hijo MDI. Si desea eliminar el formulario, llame a su
mtodo Close.
Esto cerrar el formulario:
procedure TMDIChild.Button1Click(Sender: TObject);
begin
Close;
end;
Mensajes de error
95
Informacin adicional
El mtodo Hide de TForm asigna False a la propiedad Visible.
Cuando se cierra un formulario hijo MDI, el valor que se asigna por defecto al
parmetro Action es caMinimize. Si no quiere que el formulario hijo sea minimizado, puede asignar el valor caFree al parmetro Action para liberar la
memoria reservada para el formulario.
procedure TMDIChild.FormClose(Sender: Tobject;
var Action: TCloseAction);
begin
Action := caFree;
end;
Solucin rpida
No asigne valores a las variables en la seccin Var de un procedimiento o
funcin.
96
Informacin adicional
Turbo Pascal y todas las versiones de Delphi soportan una especie de variables
inicializadas que se conocen como constantes con tipo (typed constants). Las
constantes con tipo son realmente un hbrido entre constantes y variables.
Como en el caso de las constantes puras, usted puede asignarles un valor en el
mismo momento en que las declara. Como en el caso de las variables, sus valores pueden cambiar en tiempo de ejecucin. Y tambin como las variables (y a
diferencia de las constantes), su tipo de datos se especifica en el momento que
son declaradas (por eso precisamente se les conoce como constantes con tipo).
A continuacin se muestran algunos ejemplos de cmo declarar variables,
constantes tpicas y constantes con tipo en la seccin Interface de una unidad,
mostrando sus semejanzas y diferencias:
unit Aryan;
interface
var
tf: TextFile;
ThisIsThis: Boolean = True;
{variable inicializada - legal en una seccin global}
const
crlf = #13#10; {constante pura}
Satz: String[50] = 'All we are is dust in the wind';
{constante con tipo}
implementation
. . .
Mensajes de error
97
Para inicializar a True a ambas constantes con tipo, debe hacerlo as:
interface
const
QueSeraSera: Boolean = True;
WhateverWillBeWillBe: Boolean = True;
. . .
Solucin rpida
Inicialice cada constante con tipo en su propia sentencia.
Informacin adicional
Se puede declarar mltiples variables en una misma sentencia, as:
var
i,j,k,l: integer;
o as:
var
aBeam: array[0..3] of integer;
Pero no es posible inicializarlas en una nica sentencia, en caso de que las convirtiramos en constantes con tipo.
98
Solucin rpida
Simplemente declare la variable, as:
threadvar
Threadbare: Byte;
Informacin adicional
Las variables locales de hilo se declaran como si fueran variables globales (es
decir, no puede declararlas en un mtodo de un objeto TThread), pero los objetos TThread pueden hacer referencia a ellas como si hubiesen sido declaradas
localmente. Alternativamente, puede declarar un campo o un par campo/propiedad en la declaracin de una clase derivada de TThread, as:
type
ThreadBear = class(TThread)
private
FTroop: WideString;
protected
procedure Execute; override;
property Troop: WideString read FTroop
write FTroop;
end;
Solucin rpida
1. Aada la entrada al Registro del sistema, siguiendo estos pasos:
a. Seleccione Inicio | Ejecutar... desde el escritorio de Windows.
Mensajes de error
2.
3.
4.
5.
6.
99
Informacin adicional
1. Delphi 4 y posteriores ofrecen soporte nativo para Access 97.
6. Si no puede determinar la causa de este mensaje, puede recurrir a la
medida drstica de reinstalar el BDE (seleccione Full Install) desde el CD
de Delphi y/o reinstalar cualquiera de los controladores de base de datos y
herramientas de cliente de la base de datos a la cual se est conectando.
Para ms informacin, consulte Class not registered.
100
Solucin rpida
1. Instale el BDE en todos los ordenadores que ejecutarn programas de base
de datos creados con Delphi (a menos que est utilizando una alternativa
de terceros para el BDE, en cuyo caso no debera obtener este mensaje de
error).
Consulte DEPLOY.TXT para la informacin especfica sobre cmo distribuir las aplicaciones para su versin particular de Delphi. Este archivo
est ubicado por defecto en el directorio \Delphi.
2. Asegrese de que el lugar indicado por el valor de la entrada ConfigFile01
en WIN.INI o en el Registro del sistema apunte a la localizacin de su
archivo de configuracin (IDAPI[32].CFG).
Aqu estn los detalles especficos:
Delphi 1
Localice el parmetro DLLPATH en la seccin [IDAPI] de
C:\Windows\WIN.INI y compruebe que su valor sea correcto. Por defecto, es:
[IDAPI]
DLLPATH = C:\IDAPI
Delphi de 32 bits
Localice la clave del Registro que indica la localizacin de las .DLLs del BDE:
HKEY_LOCAL_MACHINE\Software\Borland\Database Engine\DLLPath.
Si el camino configurado en el Registro del sistema corresponde al valor por
defecto C:\Archivos de programa\Borland\Common files\BDE, pero
Mensajes de error
101
Informacin adicional
Para editar el Registro del sistema, siga estos pasos:
1. Seleccione Ejecutar del men Inicio.
2. Introduzca regedit en el cuadro de edicin y pulse el botn Aceptar.
3. Navegue hasta HKEY_LOCAL_MACHINE\Software\Borland\Database
Engine\DLLPath.
4. Pulse el botn derecho sobre DLL Path en el panel de la derecha.
5. Seleccione Modificar del men de contexto.
6. Edite el camino en el cuadro de edicin que aparece.
Una instalacin parcial coloca una versin recortada del BDE en el directorio del programa que utiliza el BDE.
Solucin rpida
Para verificar la configuracin, siga estos pasos:
1. Seleccione Inicio | Ejecutar.
2. Introduzca regedit y pulse Aceptar.
3. Navegue hasta \HKEY_LOCAL_MACHINE\Software\Borland\Database
Engine\Settings\System\INIT\LANGDRIVER.
El valor de la entrada depende de su localizacin fsica (EE.UU., Europa,
Japn, etc.), o ms especficamente, de la localizacin para la que ha sido configurada el ordenador. Por ejemplo, si est usted en los Estados Unidos, el valor
de la entrada LANGDRIVER debera ser DBWINUS0.
Verifique que la entrada del Registro sea correcta. Si es necesario, modifquela.
Si la entrada es incorrecta, verifique que el controlador de lenguaje apropiado
exista en el sistema (en \Archivos de programa\Borland\Common files\BDE).
Por ejemplo, el archivo correspondiente a la entrada DBWINUS0 es USA.BLL.
102
Informacin adicional
Nota:
Solucin rpida
1. Si el paquete no contiene unidades adicionales que usted necesite, simplemente abstngase de cargar el paquete redundante.
2. Seleccione Aceptar para cerrar el cuadro de mensaje de error, y luego
pulse No cuando se le pregunte si desea guardar los cambios. Puede perder
el paquete en el cual instal el componente. En ese caso, simplemente
reinstale el paquete (esta vez sin el componente adicional).
Informacin adicional
1. Si ambos paquetes contienen componentes que usted necesita, puede crear
un nuevo paquete que incluya las partes que necesita de ambos paquetes.
Delphi 1
Puede ser que el archivo IDAPI01.DLL nunca haya sido instalado, haya sido
movido o borrado, o la seccin [IDAPI] de WIN.INI est ausente o sea
incorrecta.
Mensajes de error
103
Delphi de 32 bits
Puede ser que el archivo IDAPI32.DLL nunca haya sido instalado, haya sido
movido o borrado, la configuracin necesaria en el Registro est ausente o sea
incorrecta.
Solucin rpida
Asegrese de que el BDE est instalado y configurado correctamente. Si no
est instalado, instlelo. Consulte DEPLOY.TXT para obtener informacin
sobre la instalacin del BDE para su versin particular de Delphi. El archivo
DEPLOY.TXT est ubicado por defecto en el directorio \Delphi. Si el BDE est
instalado, puede no estar configurado correctamente. Consulte la parte relacionada con su versin de Delphi de la siguiente seccin.
Delphi 1
Verifique que la localizacin de IDAPI.DLL a la que apunta el archivo
WIN.INI est en concordancia con la localizacin actual de IDAPI01.DLL. Busque la seccin [IDAPI]. Las entradas CONFIGFILE01 y DLLPATH se refieren
a C:\IDAPI por defecto.
Delphi de 32 bits
Verifique que la ubicacin a la que apunta el Registro del sistema para
IDAPI.DLL est en concordancia con la localizacin actual de IDAPI32.DLL.
Para comprobarlo, ejecute Regedit y navegue hasta
HKEY_LOCAL_MACHINE\Software\Borland\Database Engine.
La ubicacin por defecto indicada por las entradas CONFIGFILE01 y
DLLPATH es C:\Archivos de programa\Borland\Common
files\BDE\IDAPI32.CFG.
Informacin adicional
Delphi 1
Para consultar y posiblemente editar el archivo WIN.INI, navegue hasta l en
el directorio de Windows, bralo y busque la seccin [IDAPI], que debera parecerse un poco a esto:
[IDAPI]
DLLPATH=C:\IDAPI
CONFIGFILE01=C:\IDAPI\IDAPI.CFG
104
Delphi de 32 bits
Para consultar y posiblemente editar el Registro del sistema, siga estos pasos:
1. Seleccione Ejecutar del men Inicio.
2. Introduzca regedit en el cuadro de edicin y pulse el botn Aceptar.
3. Navegue hasta HKEY_LOCAL_MACHINE\Software\Borland\Database
Engine\DLLpath.
4. Pulse el botn derecho sobre DLL Path en el panel de la derecha.
5. Seleccione Modificar en el men de contexto.
6. Edite el camino en el cuadro de edicin que aparece.
Mensajes de error
105
Solucin rpida
No llame al mtodo ShowModal de un formulario al menos que est crendolo
dinmicamente.
Informacin adicional
Cuando un formulario es creado automticamente por Delphi (como ocurre por
defecto con todos los formularios, y siempre con el formulario principal de la
aplicacin), Delphi cambia el valor de la propiedad Visible del formulario de
False a True.
La nica situacin en la que puede (y debe) llamar a uno de los mtodos Show
o ShowModal del formulario es cuando cree el formulario dinmicamente. Es
recomendable crear dinmicamente aquellos formularios que no estarn abiertos durante todo el tiempo de ejecucin de la aplicacin (como un cuadro de
dilogo Acerca de...).
Para crear un formulario dinmicamente, siga estos pasos:
1. Seleccione View | Project Manager.
2. Pulse el botn Options.
3. Seleccione el formulario que desea crear dinmicamente en el cuadro de
lista Auto-Create Forms.
4. Muvalo al cuadro de lista Available Forms pulsando el botn de flecha
derecha.
5. Pulse el botn OK.
6. Aada el siguiente cdigo al evento en el que desee mostrar el formulario
(sustituya AboutBox por el nombre de variable de la instancia del formulario y TAboutBox por el nombre de la clase del formulario):
procedure TForm1.AboutBoxClick(Sender: TObject);
begin
AboutBox := TAboutBox.Create(nil);
try
AboutBox.ShowModal;
finally
AboutBox.Free;
end;
end;
106
Solucin rpida
Asegrese de que la propiedad ReadOnly del objeto TTable tenga el valor False
antes de intentar editar la tabla.
Informacin adicional
No es posible cambiar la propiedad ReadOnly de un TTable mientras la tabla
est abierta (su propiedad Active tenga el valor True), por lo que deber primero cerrar la tabla, cambiar el valor de la propiedad ReadOnly, y luego hacer
la actualizacin, insercin o borrado.
with TableTennis do begin
Active := False;
ReadOnly := False;
Active := True;
Insert;
InsertRecord(['Gump', 'Forrest', 'PingPong', 1]);
end;
Solucin rpida
Abstngase de editar el nombre generado automticamente para un componente TSession, o asigne primero False a la propiedad AutoSessionName antes
de modificar la propiedad SessionName.
Informacin adicional
El componente TSession es similar a TApplication, ya que normalmente no es
necesario preocuparse por crear uno, ya que Delphi lo hace automticamente
cuando sea necesario. Pero si est desarrollando aplicaciones multi-hilo o si
desea acceder a tablas Paradox situadas en diferentes lugares de una red,
usted puede aadir componentes TSession adicionales al formulario o mdulo
Mensajes de error
107
de datos para facilitar las operaciones bajo esas circunstancias especiales. Para
ms informacin, Consulte AutoSessionName y managing multiple sessions
en la ayuda de Delphi.
Solucin rpida
Copie una versin de copia de seguridad de su biblioteca de componentes
(COMPLIB.DCL) a \Delphi\bin (Delphi 1).
Resuelva el problema con la .DLL antes de instalar el componente de nuevo.
Informacin adicional
Siempre que sea posible, utilice el enlace dinmico a .DLLs (mediante las funciones LoadLibrary y GetProcAddress) en lugar del enlace esttico. Para ms
informacin, consulte external reserved word | external declarations y
GetProcAddress function en la ayuda de Delphi.
Solucin rpida
1. Verifique que el archivo que est intentando abrir es realmente del tipo de
archivo que espera.
2. Asegrese de que el archivo est ubicado en el directorio que ha indicado, y
de que ha escrito correctamente el directorio y el nombre del archivo.
108
Informacin adicional
1. Puede ser que la extensin del archivo haya sido cambiada, de tal forma
que no se corresponde con el tipo de archivo. Por ejemplo, se puede haber
modificado la extensin del archivo ShapesOfThingsToCome.TXT de .TXT
a .BMP. Intentar cargar este archivo en la propiedad Picture de un componente TImage ocasionar este error. Un archivo de texto con cualquier otra
extensin sigue siendo un archivo de texto (y viceversa un archivo BLOb
con una extensin de archivo de texto sigue siendo un archivo BLOb).
2. El mtodo LoadFromFile puede ser aplicado a objetos TPicture y TStrings
y sus descendientes (como TStringList).
Si est utilizando un objeto TClientDataSet y archivos locales (el modelo de
una capa o de maletn), deber insertar en l al menos un registro antes de que
sea grabado y pueda ser posteriormente cargado.
Solucin rpida
Cambie la vista del archivo a la vista de formulario y compile de nuevo.
Informacin adicional
Para cambiar la vista de un formulario (archivo .DFM) que est mostrando su
representacin textual a su representacin visual (Form View), siga estos
pasos:
1. Pulse el botn derecho dentro de la ventana de cdigo del archivo .DFM.
2. Seleccione View As Form del men de contexto.
Mensajes de error
109
Solucin rpida
Libere espacio del disco duro, cierre algunos programas que no est utilizando,
y/o instale ms memoria RAM. Desactivar las optimizaciones puede ayudar.
Para desactivar las optimizaciones:
Delphi 1
Seleccione Options | Project | Linker | EXE and DLL Options. Desmarque la casilla Optimize for size and load time.
Delphi de 32 bits
Seleccione Project | Options | Compiler | Code Generation, y desmarque
la casilla Optimization.
Informacin adicional
Puede tambin recibir el mensaje Unable to rename <path>.<project>.$$$
to <path>.<projectname>.dpr. Podr necesitar cambiar la extensin del
archivo de proyecto (.DPR) en el Explorador de Windows de .$$$ a .DPR.
Solucin rpida
Elimine la directiva Override en la clase descendiente, o aada una directiva
Virtual o Dynamic en la clase ancestro.
Informacin adicional
Es posible redefinir (override) los mtodos de los objetos ancestros que han sido
declarados utilizando las directivas Virtual, Dynamic, o las directivas Virtual o
Dynamic y Abstract.
Por ejemplo, si la declaracin del objeto ancestro es la siguiente:
type
A = class
procedure
procedure
procedure
procedure
procedure
WorkHard; virtual;
PlayHard; dynamic;
StudyHard; virtual; abstract;
RunHard; dynamic; abstract;
Leotard;
110
Solucin rpida
Asigne True a la propiedad Active del componente TIBDatabase, o llame a su
mtodo Open antes de intentar activar el componente TIBTransaction o llamar
a cualquiera de sus mtodos.
Informacin adicional
TIBTransaction y TIBDatabase son componentes de InterBase Express.
Mensajes de error
111
Solucin rpida
Llame al mtodo Open del objeto TSQLConnection antes de abrir un conjunto
de datos que dependa de l.
Informacin adicional
Esto podra haberle ocurrido si tiene un conjunto de datos abierto en tiempo de
diseo en su formulario principal, y el componente TSQLConnection est
situado en otro formulario, como por ejemplo un mdulo de datos. El formulario principal se crea primero, y puesto que el objeto TSQLConnection no ha
sido creado todava, no est abierto. En este caso, ser necesario posponer la
apertura del conjunto de datos hasta el tiempo de ejecucin.
Los componentes DBExpress aparecieron con Delphi 6.
Solucin rpida
Asigne True a la propiedad Connected en tiempo de diseo o en el cdigo, o
llame al mtodo Open del componente TDatabase, antes de llamar a StartTransaction. Por ejemplo, para solucionar el problema mostrado arriba, puede
hacer esto:
with Database1 do begin
Connected := True;
StartTransaction;
try
try
Table1.FieldByName('Mister').Value := 'T';
. . .
finally
Commit;
end;
except
Rollback
end;
-O-
112
Informacin adicional
Si asign True a la propiedad Connected del componente TDatabase (en tiempo
de diseo o en tiempo de ejecucin, antes de hacer la referencia a la base de
datos) y tambin asign True a su propiedad KeepConnection, evitar recibir
este mensaje de error, ya que la conexin a la base de datos siempre estar
abierta.
-OTable1.Active := False;
Table1.Edit;
Mensajes de error
113
Solucin rpida
1,2. Abra todos los conjuntos de datos necesarios antes de ejecutar cualquiera
de las acciones indicadas arriba.
3. Asigne un TDataSetProvider al componente TClientDataSet.
4. Asigne la propiedad FileName del objeto TClientDataSet, o llame al
mtodo LoadFromFile antes de trabajar con los datos. En Delphi 6 y superiores, puede grabar los datos en dos posibles formatos: el binario o
clsico, con extensin .CDS, y el formato XML (maravilla!), con extensin
.XML. Por ejemplo, podra guardar y luego volver a abrir de esta manera:
with dm.cdsStudents do begin
MergeChangeLog;
SaveToFile('Students.cds'); //, dfBinary);
SaveToFile('Students.xml'); //, dfXML);
end;
with dm.cdsStudents do begin
if FileExists('Students.cds') then
LoadFromFile('Students.cds')
else
LoadFromFile('Students.xml');
Informacin adicional
TTable, TQuery, TStoredProc y TClientDataSet son todos descendientes de la
clase TDataSet, y por lo tanto son conjuntos de datos.
2. Si est utilizando un campo calculado en una tabla, ste puede estar
haciendo referencia en el evento OnCalcFields a otra tabla que no ha sido
creada todava. Todas las tablas deben existir antes de que puedan ser
referenciadas. El orden de creacin de los componentes no visuales est
determinado en primer lugar por el orden en que se colocan los componentes sobre el formulario. Si el objeto TTable al que se hace referencia fue
colocado sobre el formulario despus del TTable que hace la referencia,
puede alterar el orden de creacin seleccionando Edit | Creation Order,
y utilizando los botones de flechas mover el TTable al que se hace referencia para que quede encima del TTable que hace referencia a l.
3,4. En Delphi 6 y superiores, la tecnologa MIDAS y la clase TClientDataSet
estn por todos lados. Ya que la capa de acceso a datos DBExpress no permite la navegacin hacia atrs en un conjunto de resultados, es
recomendable utilizar un TDataSetProvider como intermediario entre
DBExpress y un TClientDataSet, especialmente si va a mostrar los datos
en una rejilla. Si no es incluido como parte integral de Delphi 6, busque el
componente TClientDataSetGrid, creado por John Kaster y Anders
Ohlsson, en Code Central de Borland (community.borland.com/codecentral).
Este ofrece una ordenacin de columnas estilo explorador, as como un
114
Solucin rpida
Asigne primero False a la propiedad Active antes de intentar cambiar la propiedad AutoSessionName del objeto TSession a True o modificar su propiedad
SessionName.
Informacin adicional
Para ms informacin sobre las sesiones, consulte los temas managing database sessions, managing multiple sessions, naming a session, working
with a session component, using the default session y using a session component in data modules en la ayuda de Delphi.
Solucin rpida
Antes de llamar al mtodo Delete, verifique que la tabla no est vaca. Por
ejemplo, podra hacer esto:
if Table1.IsEmpty then
Exit
else
Table1.Delete;
Mensajes de error
115
Informacin adicional
El mtodo Delete de TDataSet borra solamente el registro actual.
Para borrar todos los registros de una tabla, utilice el mtodo EmptyTable.
Para borrar no solamente todos los registros, sino tambin la tabla en s (la
informacin de estructura), utilice el mtodo DeleteTable. La tabla debe estar
cerrada antes de la llamada a DeleteTable (llame al mtodo Close de TTable o
asigne False a su propiedad Active).
Para borrar los registros que cumplan un cierto criterio, utilice un componente
TQuery y asigne a su propiedad SQL una cadena del tipo:
DELETE FROM BogusData
{para borrar todos los registros}
DELETE FROM Airwaves
WHERE ContentType = SoapOpera
{para borrar todos los registros con el valor
SoapOpera en el campo ContentType}
Solucin rpida
1-4.Asegrese de que el componente TTable o TDatabase no estn activos
antes de intentar tales operaciones. Puede hacer esto haciendo llamadas a
uno de los siguientes mtodos:
Table1.Close; {para un componente TTable}
Database1.Close; {para un componente TDataBase}
116
Informacin adicional
Si el valor de la propiedad Exclusive de un objeto TTable es True y se intenta
asignar a la propiedad Active el valor True, se generar el mensaje de error
Table is busy.
Solucin rpida
1. Cierre el TTable antes de modificar cualquiera de las propiedades mencionadas arriba.
2. Cierre el TQuery antes de llamar a Unprepare.
3. Asigne primero False a la propiedad Active del conjunto de datos, o llame a
su mtodo Close, y luego haga las modificaciones al texto de la consulta
antes de abrirla (activarla) de nuevo.
Informacin adicional
Puede cerrar un TDataSet (del que descienden tanto TTable como TQuery)
asignando False a la propiedad Active:
Table1.Active := False;
-OQuery1.Active := False;
-OQuery1.Close;
Mensajes de error
117
Solucin rpida
Cierre la tabla antes de borrarla.
Informacin adicional
Puede ejecutar muchas operaciones sobre bases de datos locales o de escritorio,
tales como Paradox, dBASE, MS Access, etc., utilizando la utilidad Database
Desktop. Consulte Database Desktop en la ayuda de Delphi.
Solucin rpida
Cierre la tabla, asignando False a la propiedad Active del TTable y a la propiedad Connected de los componentes TDatabase, y luego vuelva a intentar la
operacin.
Informacin adicional
La tabla puede estar abierta por una aplicacin en ejecucin o dentro del
entorno integrado de Delphi, si la propiedad Active del TTable o la propiedad
Connected de un componente TDatabase tienen asignado el valor True.
118
Solucin rpida
Solamente intente leer el valor de las propiedades que no son de slo escritura.
Del mismo modo, solamente intente modificar las propiedades en las que se
puede escribir, o sea, aquellas que no son de slo lectura. Por ejemplo, puede
leer el valor de la propiedad CanModify as:
if Table1.CanModify = True then
{Realizar el procesamiento condicional}
Informacin adicional
Si una propiedad es de slo lectura, es declarada as:
property Required: Boolean read FRequired;
Es comn para una propiedad acceder a un campo privado, desde el que se lee
un valor interno, y a un mtodo privado que escribe el valor. A continuacin se
presenta un ejemplo extrado de la unidad Dbtables.PAS, donde se declara el
componente TTable, y se muestra la propiedad DatabaseName y su campo y
procedimiento privados asociados:
TTable = class(TDBDataSet)
private
...
FDatabaseName: string;
...
procedure SetDatabaseName(const Value: string);
...
protected
...
public
...
published
property DatabaseName: string read FDatabaseName
write SetDatabaseName;
end;
Mensajes de error
119
begin
CheckInactive;
ValidateName(Value);
FDatabaseName := Value;
end;
end;
Solucin rpida
1. Abra el archivo fuente del proyecto (archivo .DPR) del cual es parte la unidad antes de intentar ejecutar la aplicacin.
2. Aunque las .DLLs son ejecutables, no pueden ser ejecutadas directamente.
Llame a la .DLL desde un .EXE para ejecutarla.
Informacin adicional
Puede ejecutar una aplicacin sin que todas las unidades que la constituyen
estn abiertas en el entorno integrado (siempre que el archivo .DPR est
abierto), pero no lo contrario. Dicho de otra manera, si abre un archivo de proyecto y lo ejecuta, ste cargar los archivos de unidad (.PAS) que componen el
proyecto. Lo opuesto no es cierto una unidad no carga el .DPR del cual es
parte constituyente. Una misma unidad puede pertenecer a mltiples proyectos, y por lo tanto podra no ser evidente qu proyecto cargar.
Si quiere compilar una unidad (crear un archivo .DCU a partir de un archivo
.PAS), puede hacerlo utilizando el compilador de lnea de comandos dcc32.EXE,
localizado en el directorio \bin de Delphi.
120
Solucin rpida
Verifique que todos los objetos TDataSet pasados a ApplyUpdates hagan referencia al mismo componente TDatabase.
Informacin adicional
Los descendientes de TDataSet incluyen a TTable, TQuery, TStoredProc y
TClientDataSet.
Solucin rpida
Utilice parntesis en lugar de corchetes:
Table1.AddIndex(<NombreIndice>, <NombreCampo>, [ixExpression]);
Informacin adicional
Asigne True a la propiedad Exclusive del TTable antes de aadir un ndice.
Mensajes de error
121
Solucin rpida
No utilice System o SysInit como nombres de unidad. En realidad, no utilice el
nombre de ninguna unidad que ya est en uso por su aplicacin.
Informacin adicional
Delphi aade implcitamente de forma automtica las unidades System y
SysInit a la clusula Uses de la interfaz de sus unidades.
Solucin rpida
Cierre la instancia del programa antes de intentar recompilarlo. Si es necesario, reinicie Windows para echar al ejecutable o la .DLL de la memoria.
Informacin adicional
Esto tambin puede ocurrir despus de una cada del programa al ser ejecutado desde el entorno integrado. Cierre Delphi y reincielo, y luego intente compilar el proyecto/programa de nuevo.
122
Solucin rpida
Delphi 1/Windows 3.x
Asegrese de que la localizacin real de IDAPI.CFG (C:\IDAPI por defecto)
coincide con el valor que aparece en la entrada CONFIGFILE01 de la seccin
[IDAPI] de WIN.INI.
Si es necesario, mueva el archivo al lugar indicado en WIN.INI, o modifique la
entrada en WIN.INI para que coincida con la ubicacin del archivo.
Informacin adicional
Este es el error $8453 del BDE.
Mensajes de error
123
Solucin rpida
1. Compruebe que la sintaxis de las sentencias SQL sean soportadas por la
base de datos que est utilizando. Para ms detalles, consulte la documentacin de la base de datos.
2. Si no necesita un conjunto de resultados actualizable, cambie el valor de la
propiedad RequestLive del componente TQuery a False.
Si necesita un conjunto de resultados actualizable, la consulta no puede
contener lo siguiente:
funciones agregadas (SUM, COUNT, AVG, MIN, MAX, etc.)
Operaciones JOIN, UNION, INTERSECT o MINUS
Una clusula ORDER BY
3. No intente modificar la propiedad StoredProcName mientras la propiedad
DatabaseName del componente TStoredProc hace referencia a una base de
datos local o de escritorio.
4. Incluya el nombre de la tabla en la sentencia SELECT, y encierre los nombres de columnas entre comillas. Por ejemplo:
SELECT Sees."Chocolate"
FROM Sees
WHERE Sees."Chocolate" = DarkRaspberry
Informacin adicional
1. Aunque SQL es la lingua franca tanto para las bases de datos cliente/servidor como para las de escritorio, los dialectos y vocabularios difieren entre
las distintas implementaciones. Por ejemplo, Oracle utiliza PL/SQL, MS
SQL Server utiliza Transact SQL, etc.
3. Si est utilizando una base de datos local o de escritorio (como Paradox,
dBASE, MS Access, etc.), no puede utilizar procedimientos almacenados.
Estos son nicamente una caracterstica de las bases de datos de servidores SQL (como InterBase, Oracle, MS SQL Server, Sybase, Informix,
etc.).
Si todo lo dems falla, intente utilizar una variable de cadena en la clusula WHERE. Por ejemplo,
var
WhereVar: String;
. . .
WhereVar:= 'Morgan Tell Mackenzie Shannon';
. . .
Query1.SQL.Add('SELECT * from "RUNTHE"');
Query1.SQL.ADD('WHERE Whatever = ' + WhereVar);
124
Solucin rpida
Utilice una variable del tipo SomeFootballTeams (en lugar de una del tipo
NFCCentralDivision), o extienda la declaracin de NFCCentralDivision para
que incluya todos los valores que quiera evaluar.
Informacin adicional
Las sentencias Case son ms rpidas que las sentencias If anidadas. Donde
sea posible, utilice sentencias Case. Por ejemplo:
case iNumberOfTickets of
0: ScalpTheScalper;
1: GoAlone;
Mensajes de error
125
2: TakeAFriend;
3: ThreesCompany;
else
;
end;
es preferible a esto:
if iNumberOfTickets = 0 then
ScalpTheScalper
else if iNumberOfTickets = 1 then
GoAlone
else if iNumberOfTickets = 2 then
TakeAFriend
else if iNumberOfTickers = 3 then
ThreesCompany;
este cdigo:
case QBRating of
Favre:
s :=
Culpepper: s :=
Batch:
s :=
King:
s :=
McNown:
s :=
end;
Lock him
Give him
Bake him
Give him
He might
Lock him
Give him
Give him
He might
Bake him
126
Solucin rpida
Asigne a la propiedad MasterSource una fuente de datos (de la lista desplegable que aparece en la propiedad MasterSource) que est asociada a otro componente TTable.
Informacin adicional
Delphi no muestra en la lista desplegable de posibles valores de la propiedad
MasterSource aquellos componentes TDataSource que hacen referencia al propio componente TTable. Se trata de una medida preventiva para evitar este
mensaje de error. No obstante, se puede teclear lo que se quiera, y si introduce
un TDataSource asociado a la propia tabla en la propiedad MasterSource del
TTable, generar este mensaje de error.
Para ms informacin sobre la utilizacin de tablas de bsqueda y la propiedad
MasterSource, consulte TTable.MasterSource en la ayuda de Delphi.
Solucin rpida
Mueva al menos una de las referencias de la clusula Uses de la interfaz de la
unidad a la clusula Uses de la seccin Implementation (directamente debajo
de la palabra reservada Implementation). Por ejemplo, si el mensaje de error
es ocasionado por la referencia mutua de Unit1 y Unit2 en cada una de las secciones Uses de sus interfaces, de tal forma que Unit1 actualmente aparece as:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, Unit2;
type
Mensajes de error
127
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
Informacin adicional
Puede tambin mover ambas referencias a la parte Implementation de las unidades (debe mover al menos una; o puede mover ambas).
Las nicas unidades que necesitan ser incluidas en la clusula Uses de la seccin Interface son aquellas clases a las que se hace referencia en la propia
interfaz. Todas las dems pueden (y deben) ser colocadas en la clusula Uses
de la seccin Implementation.
La clusula Uses de la seccin Interface es aadida automticamente por Delphi. Tendr que aadir manualmente la clusula Uses de la parte
Implementation.
128
Solucin rpida
1. Consulte el texto del archivo .DFM del formulario pulsando con el botn
derecho sobre el formulario y seleccionando View As Text en el men de
contexto. Verifique que las definiciones de objetos ah coincidan con lo que
est actualmente sobre el formulario.
2. Si todava quiere utilizar la clase perdida, tendr que reintroducirla en
Delphi ahora o ms adelante. Si quiere esperar hasta ms tarde (o si no
necesita la clase en absoluto), simplemente ignore el error. Para incorporar
de nuevo la clase a Delphi, siga el curso de accin apropiado en dependencia de lo que ocasion el problema:
Si ha movido el archivo que el proyecto necesita, devulvalo al
directorio que aparece en el camino de bsqueda de Delphi o aada el
directorio donde actualmente reside al camino de bsqueda de Delphi
(seleccione Tools | Environment Options. . . , luego la pgina
Library y el cuadro de combinacin Library Path).
Si la clase es un componente que ha desinstalado, reinstlelo.
Si el archivo ha sido borrado, vea si puede conseguir otra copia de
donde obtuvo el original (el CD de Delphi, un CD de un libro de
terceros, un sitio web, etc.).
Si ha eliminado del camino de bsqueda de Delphi el directorio que
contiene la unidad que necesita, aada de nuevo el directorio o mueva
la unidad a una ubicacin a la que se haga referencia en el camino de
bsqueda de Delphi.
3. Puede ignorar el error, y las partes del proyecto que no son especficas a la
versin posterior de Delphi se abrirn. Si el proyecto ha sido creado por
usted mismo, probablemente an tendr acceso a la versin ms nueva de
Mensajes de error
129
Informacin adicional
Si elige ignorar el error y continuar, Delphi eliminar la referencia a la clase
no encontrada del archivo .DFM. De todos modos, su declaracin an existir
en el archivo .PAS. Cuando intente compilar el proyecto, que ahora contiene
una discrepancia entre la descripcin proporcionada por el archivo .PAS y la
descripcin proporcionada por su correspondiente archivo .DFM, obtendr este
mensaje de error Field <> does not have a corresponding component.
Remove the declaration? Si selecciona Yes, la declaracin tambin ser eliminada del archivo .PAS.
1. Normalmente, editar el objeto en el archivo .DFM tambin ocasionar que
ste cambie sobre el formulario. Esto es lo que quieren decir cuando se
refieren a Delphi como una herramienta bi-direccional.
Despus de cambiar un componente de un tipo a otro en el archivo .DFM,
cuando intente compilar el proyecto puede obtener el mensaje Field <>
should be of type <> but is declared as <>. Correct the declaration?. Pulse Yes para permitir que Delphi reconcilie la diferencia.
3. Un ejemplo de este suceso sera si crea un proyecto en Delphi 3 4 que utilice un componente TChart, y luego intenta cargar el proyecto en Delphi 2
(o Delphi 1).
4. Para ms informacin, consulte el mensaje Field <> does not have a
corresponding component. Remove the declaration?.
Solucin rpida
Elimine una de las declaraciones de propiedad por defecto. Una clase puede
tener solamente una propiedad por defecto.
Informacin adicional
Cuando se declara una propiedad de tipo array, se la puede definir como la
propiedad por defecto de la clase, as:
130
type
TCircus = class
. . .
property Clowns[Index: Integer]: String read Fbozo
write SetBozo; default;
. . .
end;
var
Circus: TCircus;
La ventaja de hacer esto consiste en que luego se puede acceder o asignar valores a la propiedad de tipo array en el cdigo sin tener que especificar el nombre
de la propiedad. Por ejemplo, con la propiedad declarada arriba, se podra asignar un valor as:
Circus[i] := Bozo;
-OBeatlesParaphernalia := TCollection;
pero la clase TCollection no tiene una propiedad por defecto (aunque s tiene
una propiedad de tipo array llamada Items).
Mensajes de error
131
Solucin rpida
Especifique explcitamente todas las propiedades que no sean la propiedad por
defecto en cualquier sentencia que haga referencia a ellas.
Informacin adicional
Las propiedades por defecto son propiedades de tipo array cuyo nombre puede
ser omitido en la sentencias de asignacin. Para ms informacin, consulte la
entrada anterior Class already has a default property.
Solucin rpida
Declare los tipos de clase nicamente dentro de las secciones de declaracin de
tipos, por ejemplo as:
type
TForm1 = class(TForm)
Informacin adicional
Si intenta declarar un tipo de clase en una seccin Var, as:
var
TForm1 = class(TForm)
132
Solucin rpida
Borre la palabra class para hacer que el mtodo se convierta en un mtodo
corriente, en lugar de un mtodo de clase.
Informacin adicional
Los procedimientos de clase se utilizan a menudo para implementar constructores para formularios modales. Eliminando la variable que Delphi aade
automticamente a la seccin Interface de la unidad, usted puede forzar que
cualquier construccin del formulario se realice a travs del procedimiento de
clase. Por ejemplo:
type
TfrmTMSExpressMaterial = class(TForm)
StatusBar1: TStatusBar;
private
{ declaraciones privadas}
public
class procedure Cre8Thyself;
end;
//Observe que no hay variables de formulario como:
//var
// frmTMSExpressMaterial: TfrmTMSExpressMaterial;
implementation
{$R *.DFM}
class procedure TfrmTMSExpressMaterial.Cre8Thyself;
begin
Mensajes de error
133
with Self.Create(nil) do
try
ShowModal;
finally
Free;
end;
end;
Solucin rpida
1. Asegrese de que ha instalado y registrado todos los controles ActiveX
antes de hacer referencia a ellos.
2. Asegrese de que ha instalado y registrado todos los servidores antes de
hacer una referencia a ellos.
Informacin adicional
1. Aunque los controles ActiveX (.OCX) son un tipo de .DLL, no es suficiente
que se encuentren en el lugar adecuado, como ocurre en el caso de las
.DLLs. Los controles ActiveX se identifican mediante su GUID (identificador global nico), no por su nombre de archivo, y este GUID debe haber
sido registrado previamente ante Windows (en el Registro del sistema)
para que el control ActiveX pueda ser utilizado.
Para registrar manualmente un control ActiveX (una .DLL con extensin
.OCX), cpielo primero al directorio \Windows\System y luego siga estos
pasos:
a. Abra una ventana DOS.
b. Vaya al directorio \Windows\System.
c. Introduzca el siguiente comando y pulse la tecla Intro:
Regsvr32 <biblioteca>.
Por ejemplo, si la biblioteca de tipos a registrar es IDataBroker, deber teclear
lo siguiente (ya que est definida en STDVCL32.DLL): Regsvr32 STDVCL32.
134
Solucin rpida
Declare los tipos en una seccin Type, as:
type
TStudentCommand = (scAdd, scEdit, scActivate, scInactivate,
scRemove);
TMaterialCommand = (mcAdd, mcEdit, mcDelete, mcImport);
TScheduleCommand = (scSchedule, scPrint);
Informacin adicional
Los tipos de datos definidos por el usuario son una de las buenas caractersticas de Object Pascal. Al utilizarlos, podr escribir cdigo como el siguiente:
procedure TfrmTMSXpressMain.lstbxStudentsDblClick
(Sender: TObject);
var
StudentCommands: TStudentCommand;
begin
StudentCommands := TStudentCommand(lstbxStudents.ItemIndex);
with dm do begin
case StudentCommands of
scAdd:
AddStudents;
scEdit:
EditStudentsInfo;
scActivate:
ActivateStudents;
scInactivate:
InactivateStudents;
scRemove:
RemoveStudents;
Mensajes de error
135
else
MessageDlg(SErrorInStudentsDblClick,
mtInformation, [mbOK], 0);
end;
end;
end;
Solucin rpida
1. Cuando utilice la construccin Try. . . Except On. . . <ObjetoExcepcin> Do,
utilice una clase de excepcin predefinida. Esta puede ser una clase de
excepcin de Object Pascal o una definida por el usuario.
2. En la declaracin de una clase ActiveForm, debe utilizar un tipo de clase
seguido de un tipo de interfaz, as:
TActiveFormX = class(TActiveForm, IActiveFormX)
Informacin adicional
1. Este es un ejemplo de utilizacin de una excepcin predefinida de Object
Pascal (EDivByZero):
function DivideThePie(Pieces, Recipients: Integer): Integer;
begin
try
136
Para ms informacion sobre las excepciones, consulte exception declarations, predefined exceptions y exception en la ayuda de Delphi.
2. Consulte Interface type required.
Solucin rpida
No intente colocar iconos (archivos con extensin .ICO) en el portapapeles.
Informacin adicional
Puede colocar mapas de bits (archivos con extensin .BMP) y metaarchivos de
Windows (archivos con extensin .WMF) en el portapapeles.
En otras palabras, el mismo cdigo podra en un caso producir este mensaje de
error (si un icono est asignado a la propiedad Picture) y en otro funcionar
correctamente (si un mapa de bits o metaarchivo est asignado a la propiedad
Picture).
Mensajes de error
137
Solucin rpida
Verifique que tiene al menos 50 MB o el 10% del disco duro vaco. Si este no es
el caso, podr sufrir todo tipo de problemas indignantes (archivos daados, cadas aqu y all, etc.). Si tiene suficiente espacio libre en el disco duro, verifique
que ste no se ha daado.
Informacin adicional
Si no dispone de herramientas de terceros (como Norton Utilities), puede utilizar la herramienta de defragmentacin provista con Windows para verificar los
errores del disco duro. Para localizarla, vaya a Inicio | Programas | Accesorios | Herramientas del Sistema | Defragmentador de Disco. Algunas
versiones de Windows tambin ofrecen la utilidad Scandisk, que provee dos
niveles de prueba (examen de la superficie y completo).
Solucin rpida
Utilice las caractersticas Code Insight solamente en tiempo de diseo, sin que
el programa est ejecutndose.
Informacin adicional
Code Insight no est disponible en Delphi 1 y 2. Para ms informacin, consulte Code Insight en la ayuda de Delphi.
Solucin rpida
Mueva algo de cdigo a otra unidad, y aada directamente despus de la palabra reservada Implementation una seccin Uses que haga referencia a la
138
Informacin adicional
Este es generalmente un problema de Delphi 1, ya que el segmento de cdigo
en Windows 3.x est limitado a 64 KB.
Solucin rpida
Llame siempre a CoInitialize en todo hilo de una aplicacin COM.
Informacin adicional
Tambin deber llamar a CoUninitialize cuando la ejecucin de cada hilo
finalice.
Comma Expected
Posible causa de error
Puede no estar suministrando los parmetros suficientes a un procedimiento o
funcin.
Solucin rpida
Si el procedimiento o funcin donde se produce este mensaje de error es un
mtodo de Object Pascal, bsquelo en la ayuda de Delphi para determinar la
cantidad y tipos de los parmetros que el mtodo espera. Si la declaracin del
procedimiento o funcin est contenida en las unidades del proyecto (es un
Mensajes de error
139
Informacin adicional
En realidad, Delphi probablemente no slo est esperando una coma, sino tambin como mnimo el parmetro que sigue a la coma. Como la coma es lo primero que no aparece, se indica como el problema.
Solucin rpida
Para reducir el nmero de errores vivos, coloque entre comentarios un gran
bloque de cdigo y solucione los errores uno a uno, hasta que pueda quitar los
comentarios (y entonces corregir los errores contenidos all).
Informacin adicional
Puede estar tratando de hacer muchas cosas a la vez, o haber esperado mucho
tiempo antes de compilar. Cuando desarrolle programas, verifique peridicamente la validez del cdigo seleccionando Project | Syntax Check, y
resuelva los errores que vaya encontrando, en lugar de esperar hasta el final
para depurar.
Solucin rpida
Seleccione Revert en el cuadro de dilogo Install.
Informacin adicional
Si obtiene este mensaje de error, y posteriormente se queda sin VCL (la biblioteca podra no cargarse debido a que ha quedado daada), deber reinstalarla
desde del CD de Delphi.
140
Delphi 1
Reinstale COMPLIB.DCL en C:\Borland\Delphi\BIN.
Delphi 2
Reinstale CMPLIB32.DCL en C:\Archivos de programa\Borland\Delphi
2\BIN.
Delphi 3 y 4
Reinstale VCL30.DPL (Delphi 3) VCL40.DPL (Delphi 4) en \Windows\System y VCL30.DCP (Delphi 3) o VCL40.DCP (Delphi 4) en \Archivos
de programa\Borland\Delphi X\Lib.
Puede que sea necesario instalar Delphi. En ese caso, desinstale primero el
Delphi que tenga en el sistema.
Delphi 5 y 6
Reinstale VCL50.DCP (Delphi 5) o VCL60.DCP (Delphi 6) en \Archivos de programa\Borland\Delphi [5,6]\Lib.
Solucin rpida
Proporcione un componente TReport y un componente TTable o TQuery,
asignando el valor True a la propiedad Active de la tabla o consulta.
Informacin adicional
Debe tener el ReportSmith instalado y un componente TReport de Delphi para
incorporar informes ReportSmith en las aplicaciones de Delphi. ReportSmith
se suministraba con Delphi 1 y Delphi 2. El CD de Delphi 3 contiene Delphi 1,
as que puede instalar ReportSmith desde ah si lo desea (no confundir con el
componente TReport ReportSmith es una herramienta de generacin de
informes, mientras que TReport es la encapsulacin en Delphi de la interfaz de
esa herramienta). Aunque el componente TReport no viene instalado por
defecto con Delphi 3, est disponible. Siga estos pasos para instalarlo en la
Paleta de Componentes:
1. Seleccione Component | Configure Palette. . . .
2. Seleccione Data Access de la lista Pages.
Mensajes de error
141
Solucin rpida
1. Asegrese de que ha finalizado el procesamiento de la consulta anterior
antes de ejecutar una nueva consulta. Para ello, llame al mtodo Last de
TQuery. Luego puede llamar al mtodo First para moverse al inicio del
conjunto resultado si lo desea. Por ejemplo:
with Query1 do
begin
Open;
Last;
First;
end;
142
Informacin adicional
3. Llamando a TQuery.Unprepare se liberan los recursos que el componente
TQuery ha reservado. Delphi llama implcitamen a Prepare y Unprepare
si no son llamados explcitamente. Llame a Prepare cada vez que cambie la
parte Select de una sentencia SQL. Si la parte Select nunca cambia, llame
a Prepare una vez antes de que la consulta se ejecute por primera vez.
Cada llamada a Prepare debe tener una correspondiente llamada a
Unprepare.
Solucin rpida
Especifique el componente TConnection que utilizar, arrastrndolo hasta el
mdulo de datos (mtodo preferido) o formulario (otra posibilidad) y luego asignndolo mediante el editor de propiedades a la propiedad Connection del
SQLDataSet.
Mensajes de error
143
Informacin adicional
TConnection en DBExpress es anlogo a TDatabase en las aplicaciones basadas en el BDE, TIBDatabase en las aplicaciones InterBase Express, y
ADOConnection en las aplicaciones ADO Express.
DBExpress apareci con Delphi 6.
Solucin rpida
Para asignar la direccin de una variable a una constante de tipo puntero, la
variable debe ser global:
{ seccin Interface }
var
Form1: TForm1;
s: string = 'It''s Howdy Doody Time!';
. . .
procedure TForm1.Button1Click(Sender: TObject);
var
const ptr: Pointer = @s;
Informacin adicional
Para ms informacin, consulte pointers en la ayuda de Delphi.
144
string;
Bolger';
Deaton';
Konopka';
Krok';
Lischner';
Pierce';
Rogers';
[O-Hope, O-Light, O-Vac] West';
el error, pues no hay elemento 7}
2. Puede haber asignado a una variable un valor muy pequeo o muy grande
para su tipo de datos. Por ejemplo, puede estar asignando un nmero negativo a una variable de tipo Byte, que solamente acepta enteros de 0 a 255.
Solucin rpida
1. Asegrese de no intentar asignar valor a un elemento de un array que est
fuera de los lmites declarados para el array.
2. Asegrese de que los valores que asigne sean compatibles con el tipo de
datos de las variables a las que realiza las asignaciones.
Informacin adicional
Para ms informacin, consulte subrange types en la ayuda de Delphi.
Mensajes de error
145
Solucin rpida
1. Si quiere modificar el valor del parmetro, elimine la palabra reservada
Const de la declaracin del parmetro en el procedimiento en el que se
hace la llamada. Si no quiere que se modifique el valor, elimine la palabra
reservada Var de la declaracin del parmetro en el procedimiento
llamado.
2. Asigne el valor de la propiedad a una variable y pase la variable al procedimiento o funcin. Por ejemplo, para resolver el problema creado en el
cdigo de arriba, podra hacer esto:
procedure TForm1.HealAll(Sender: TObject);
var
s: String;
Sage: TTime;
begin
Sage := TTime.Create;
Wound := 'Bury My Heart at Wounded Knee';
146
Informacin adicional
1. Sea consistente en la forma de declarar los parmetros. Estos pueden ser
declarados como constantes (Const), variables (Var), o por valor (por
defecto), pero una vez son declarados de un tipo no pueden ser cambiados a
otro. Para ms informacin sobre los tipos de parmetros, vea passing
parameters en la ayuda de Delphi.
2. Busque el procedimiento o funcin en la ayuda de Delphi para averiguar
los tipos y el orden de los argumentos que espera. Si es un procedimiento o
funcin de algn tercero, consulte la documentacin o el cdigo fuente. Si
es un procedimiento o mtodo propio, consulte su cdigo fuente. Desde
luego, alternativamente podra decidir alterar la declaracin del procedimiento o funcin.
Solucin rpida
Asegrese de que los tipos que utilice para las variables sean tipos predefinidos de Object Pascal o tipos definidos por el usuario a los que el mdulo actual
tenga acceso, debido a que han sido declarados en la unidad actual o en una
unidad mencionada en la seccin Uses.
Informacin adicional
Lo siguiente produce el mensaje de error Undeclared Identifier: Tex:
f: Tex;
Como se ha indicado arriba, lo siguiente producir el mensaje de error Constant or Type Identifier Expected:
f: Text;
Mensajes de error
147
Solucin rpida
1,2. Asegrese de respetar los lmites de los tipos de Object Pascal y los tipos
subrango definidos por el usuario en todas las asignaciones que haga.
Informacin adicional
En lugar de tratar de resolver el problema despus de que se produzca (por
reaccin), puede tratarlo proactivamente preparando las condiciones para evitar que ocurra. He aqu una forma de cmo puede hacerlo:
const
Under, Over: Byte;
begin
if StrToInt(Edit1.Text) in [0..255] then
Under := StrToInt(Edit1.Text);
148
const
Under, Over: Byte;
begin
try
Under := StrToInt(Edit1.Text);
except
on Exception do {atrapar y manejar el error};
end;
end;
Solucin rpida
Coloque el array de valores entre corchetes:
Table1.InsertRecord(['Jenny Lind', 'Calaveras',
'California', 50, 1200]);
Informacin adicional
Adems del ejemplo mostrado anteriormente, el procedimiento personalizado
SendAryOfInts produce este mensaje de error:
procedure busywork(aoi: array of integer);
var
li: longint;
i: integer;
begin
for i := low(aoi) to high(aoi) do
ext := ext + aoi[i];
end;
procedure TForm1.SendAryOfInts(Sender: TObject);
begin
Busywork(12, 24, 36, 48); {aqu se produce el error}
end;
Mensajes de error
149
2. Puede estar intentando crear un objeto que hereda uno o ms mtodos virtuales abstractos que no estn redefinidos (override) en las clases
descendientes.
Solucin rpida
1. Es mejor evitar crear instancias de clases abstractas, ya que es muy fcil
llamar accidentalmente a algn mtodo abstracto (los cuales, por definicin, no tienen implementacin).
2. Si no va a redefinir el mtodo en las clases descendientes, haga el mtodo
solamente virtual (y no virtual y abstracto) en el ancestro. Si desea que el
mtodo sea virtual y abstracto, asegrese de implementarlo en todas las
clases descendientes.
Informacin adicional
1. Puede desear declarar una variable de tipo TStrings, pero instanciarla
como un descendiente concreto de TStrings (TStringList, por ejemplo), as:
var
CoffeeStrings: TStrings;
. . .
CoffeeStrings := TStringList.Create;
150
Solucin rpida
Elimine la directiva Pascal, Stdcall, Safecall o Cdecl.
Informacin adicional
Register es el convenio de llamada por defecto para los mtodos, y es el nico
permitido para los constructores y destructores. No es necesario aadir explcitamente la palabra reservada Register.
Para ms informacin sobre este tema, consulte calling conventions, constructors and destructors y method calling conventions en la ayuda de
Delphi.
Mensajes de error
151
Solucin rpida
Saque el constructor y/o destructor fuera de la seccin Automated.
Informacin adicional
Los constructores y destructores se declaran normalmente en la seccin Public.
La seccin Automated fue introducida en Delphi 2, dando a Delphi cinco especificadores de visibilidad: Private, Protected, Public, Published y Automated.
La seccin Automated se conserva en Delphi 3 y superiores para compatibilidad hacia atrs con Delphi 2.
Para ms informacin, consulte automated components en la ayuda de
Delphi.
Solucin rpida
1. Asegrese de que todas las unidades que aada sean vlidas. Para ser vlidas, deben existir, estar correctamente escritas, y estar en la ruta de
bsqueda de Delphi. Para verificar la ruta de bsqueda de Delphi, seleccione Tools | Environment Options. . . | Library | Library Path.
2. Borre cualquier extensin de nombre de archivo que pueda haber aadido
a los nombres de las unidades.
3. Asegrese de que la clusula Contains finaliza con un punto y coma.
152
Informacin adicional
La pgina Contains del Editor de Paquetes (Package Editor) muestra las unidades que aparecen en la clusula Contains en el archivo fuente del paquete
(.DPK). Un ejemplo de archivo .DPK se muestra a continuacin:
package W8snM;
{$R *.RES}
{$R 'W8snMsrs.DCR'}
{$ALIGN ON}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST ON}
{$MINENUMSIZE 1}
{$IMAGEBASE $00400000}
{$DESCRIPTION 'GeekO Weights & Measures Component Suite'}
{$DESIGNONLY}
{$IMPLICITBUILD ON}
requires
vcl30;
contains
AreaM,
CubicM,
DryM,
LinearM,
LiquidM,
W8snMsrs,
W8s;
end.
Mensajes de error
153
Solucin rpida
1. Asigne un padre al control antes de intentar mostrarlo o ejecutar cualquier
otra accin sobre l. Por ejemplo, asignar el formulario (el cual es referido
como Self, puesto que la asignacin tiene lugar en un mtodo del formulario) como el padre (parent) evita el error:
procedure TForm1.ChildBitBtn(Sender: TObject);
var
Junior: TBitBtn;
begin
Junior:= TBitBtn.Create(Self);
Junior.Parent := Self; {asignar Form1 como padre}
Junior.SetFocus; {esto funciona estupendamente}
end;
154
Informacin adicional
1. No confunda el parent (padre) y el owner (propietario) de un control. Es
posible (pero no imprescindible) que un control tenga al mismo control
como propietario y como padre.
Un propietario (owner) se encarga de la creacin y destruccin de los componentes de los que es propietario, y por lo tanto tiene que realizar la
asignacin y liberacin de memoria.
Un padre (parent), por otra parte, es un control de ventana que visualmente contiene otros controles. El padre, por lo tanto, tiene que ver con la
superficie sobre la cual el control hijo es mostrado.
Un control puede tener un mismo propietario y padre. Por ejemplo, un
TBitBtn podra tener un TPanel como padre, y tanto el TBitBtn como el
TPanel tendran un TForm como propietario.
Como ya se ha mencionado, el padre de un control puede tambin ser su
propietario. Esto no es imprescindible, sin embargo. El formulario podra
ser el propietario del TBitBtn, pero un TPanel podra ser su padre. He aqu
un ejemplo de esto:
procedure TForm1.ParentNotSameAsOwner(Sender: TObject);
var
Junior: TBitBtn;
begin
Junior:= TBitBtn.Create(Self);
Junior.Parent := Panel1; {se asigna a Panel1 como padre}
Junior.SetFocus; {esto funciona perfectamente}
end;
Solucin rpida
Solamente aada componentes no visuales a los mdulos de datos.
Informacin adicional
Aunque los mdulos de datos tienen como objetivo central contener componentes de acceso a datos, no tienen nicamente que contener stos. Es posible
situar cualquier componente no visual sobre ellos; por ejemplo, componentes
TTimer y componentes de dilogos (como TOpenDialog, TSaveDialog, etc.).
Mensajes de error
155
Solucin rpida
1-4.Elimine y luego vuelva a crear el archivo de ndice.
Informacin adicional
Si recibe este mensaje de error en el Database Desktop, puede estar precedido
por Unable to open table.
Si la tabla del problema es un tabla Paradox, el archivo de ndice que est
daado probablemente tiene una extensin .PX. A continuacin se muestra
una lista de los archivos auxiliares que pueden ser creados (indirectamente)
con Paradox y para qu se utilizan:
<NombreTabla>.PX
Este archivo contiene la informacin de clave primaria de la tabla, y es probablemente el que se ha daado. Si designa un campo o grupo de campos como la
clave primaria de la tabla, este archivo es creado.
<NombreTabla>.Xnn
Los archivos con la extensin .Xnn (donde nn es un nmero hexadecimal) contienen informacin de ndices secundarios.
<NombreTabla>.Ynn
Los archivos con la extensin .Ynn (donde nn es un nmero hexadecimal) contienen informacin de ndices secundarios.
<NombreTabla>.VAL
Los archivos con la extensin .VAL contienen informacin que se ha proporcionado a travs del Database Desktop con respecto a los chequeos de validacin,
como por ejemplo si una columna debe tener obligatoriamente un valor (no se
156
<NombreTabla>.MB
Los archivos con la extensin .MB contienen los datos de las columnas de tipos
Memo y Graphic (TMemoField y TGraphicField).
Solucin rpida
1. Asegrese de que existe el directorio en el que el archivo de salida supuestamente ser creado.
2. Quite el atributo de slo lectura del directorio. Para hacerlo utilizando el
Explorador de Windows, pulse con el botn derecho del ratn sobre el directorio, seleccione Propiedades del men de contexto, y desmarque la
casilla de verificacin Slo Lectura.
3. Si ha experimentado un Error de Proteccin General y no ha reiniciado,
hgalo.
4. Elimine el control ActiveForm de la Paleta de Componentes de Delphi, y
luego proceda.
Informacin adicional
4. Cuando un .OCX est siendo utilizado por Delphi, no puede ser sobrescrito.
Por defecto, Delphi almacenar los archivos de salida en el mismo directorio del archivo de proyecto (.DPR). Ejemplos de archivos de salida son los
Mensajes de error
157
Solucin rpida
Copie STDVCL[32,40].DLL desde el CD de Delphi a \Windows\System y
regstrelo utilizando TRegSvr (de Borland) o RegSvr32 (de Microsoft).
Para registrar la .DLL (despus de copiarla al directorio \Windows\System),
siga estos pasos:
1. Abra una ventana DOS.
2. Vaya al directorio \Windows\System.
3. Introduzca Regsvr32 <biblioteca> y luego pulse la tecla Intro.
Por ejemplo, si la biblioteca de tipos del problema es IDataBroker, podra introducir lo siguiente (ya que est definido en STDVCL32.DLL): Regsvr32
STDVCL32. En Delphi 4, el archivo correspondiente es STDVCL40.DLL; por lo
tanto, deber teclear Regsvr32 STDVCL40.
Informacin adicional
STDVCL[32,40].DLL tiene una biblioteca de tipos correspondiente,
STDVCL.TLB,que est ubicada por defecto en C:\Archivos de programa\Borland\Delphi X\BIN. Stdvcl32 es especfica de Delphi 3 y Stdvcl40 para Delphi
4.
TRegSvr.EXE est ubicado en \Delphi\bin en Delphi 4 y superiores. RegSvr32
est ubicado en \Windows\System.
158
Solucin rpida
Registre la biblioteca de tipos a la que se hace referencia en el mensaje de
error siguiendo estos pasos:
1. Abra un ventana DOS.
2. Vaya al directorio C:\Windows\System.
3. Introduzca Regsvr32 <biblioteca> y pulse la tecla Intro.
Por ejemplo, si la biblioteca de tipos del problema es IDataBroker, se debe
introducir lo siguiente (ya que est definida en STDVCL32.DLL): Regsvr32
STDVCL32. En Delphi 4, el archivo correspondiente es STDVCL40.DLL; por lo
tanto, deber teclear: Regsvr32 STDVCL40.)
Informacin adicional
La ubicacin por defecto de STDVCL[32,40].DLL es: C:\Archivos de programa\Borland\Delphi X\BIN.
STDVCL[32,40].DLL contiene las declaraciones de interfaz para la VCL estndar de Borland.
Solucin rpida
Registre STDVCL[32,40].DLL utilizando REGSVR32.EXE TREGSVR.
Informacin adicional
IDataBroker est definido en la biblioteca VCL estndar de Borland, ubicada
por defecto en C:\Archivos de programa\Borland\Delphi X\bin.
Mensajes de error
159
Solucin rpida
Delphi 1
Asegrese de que la ruta indicada en WIN.INI corresponde a la ubicacin
actual de los controladores de lenguaje que estn en el sistema. Una entrada
tpica es:
[Borland Language Drivers]
LDPATH=C:\IDAPI\LANGDRV
Delphi de 32 bits
Asegrese de que el Registro contiene la configuracin correspondiente. Ejecute RegEdit y navegue hasta la clave HKEY_LOCAL_MACHINE | Software
| Borland | Database Engine | Settings | Drivers.
Informacin adicional
Este es el cdigo de error $220B.
Could not find object. Cannot load an IDAPI service library. File:
ODBC32.DLL
Posible causa de error
Puede estar intentando cargar los parmetros por defecto en el editor del componente TDatabase, con un alias no reconocido introducido en el cuadro de
combinacin Alias Name.
Solucin rpida
Seleccione un alias en el cuadro de combinacin Alias Name. Si es necesario,
cree un nuevo alias del BDE antes de configurar los parmetros por defecto.
Informacin adicional
Para crear un alias del BDE, siga estos pasos:
1. Seleccione Database | Explore.
160
Solucin rpida
1,2. Compruebe que las .DLLs del BDE existen y estn en la localizacin especificada por el archivo WIN.INI (Delphi 1) o el Registro de Windows
(Delphi 32 bits). Si no estn en la ubicacin especificada pero estn en
cualquier otro lugar del sistema, muvalas al lugar esperado o edite
WIN.INI o el Registro y configure su ubicacin actual. Si no estn en el sistema, cpielas desde el CD Delphi.
Informacin adicional
Cada PC que utilice el BDE necesita las .DLLs del BDE y un archivo de configuracin. En Delphi 1, el archivo de configuracin IDAPI se llamaba
IDAPI.CFG. En Delphi de 32 bits, es IDAPI32.CFG. En Delphi 1, la ubicacin
de IDAPI.CFG se encuentra en la seccin [IDAPI] del archivo WIN.INI. Por
defecto, la configuracin es:
DLLPATH=C:\IDAPI
CONFIGFILE01=C:\IDAPI\IDAPI.CFG
Mensajes de error
161
Could not load <>. The OLE control may possibly require support
libraries that are not on the current search path or are not present
on your system
Consulte The OLE control may possibly require support libraries that
are not on the current search path or are not present on your system.
Solucin rpida
Localice RLINK32.DLL. Su ubicacin por defecto es C:\Archivos de programa\Borland\Delphi X\BIN.
Si no est en el lugar por defecto, pero est en algn otro lugar del sistema,
asegrese de que est en la ruta de bsqueda de Delphi. Seleccione Tools |
Environment Options, luego la pgina Library y el cuadro de combinacin
Library Path para verificar o modificar la ruta de bsqueda de Delphi.
Si no est en el sistema, cpielo desde el CD de Delphi.
Informacin adicional
Siempre que sea posible, es mejor mantener los archivos en los lugares por
defecto. No cambie de lugar arbitrariamente los archivos. No borre archivos si
no conoce su propsito el archivo puede ser vital para la operacin del sistema, para Delphi, y/o para su propio bienestar.
Consulte Error 0: RLINK32 Error opening file <>.tlb.
162
Solucin rpida
Localice el archivo y muvalo al directorio \Windows\System.
Si el archivo no est en su sistema, cpielo a \Windows\Syste desde el CD de
Delphi hasta \Windows\System.
Informacin adicional
Delphi 1 utiliza STDOLE.TLB. Delphi de 32 bits utiliza STDOLE2.TLB.
Solucin rpida
Si borra un archivo de biblioteca de tipos, pero no ha vaciado la Papelera de
Reciclaje de Windows, siga estos pasos:
1. Pulse con el botn derecho sobre la Papelera de Reciclaje.
2. Seleccione Abrir desde el men de contexto.
3. Pulse con el botn derecho sobre el archivo que quiera restaurar (un
archivo de biblioteca de tipos en este caso).
4. Seleccione Restaurar desde el men de contexto.
Si el archivo no se encuentra en el sistema (ni est en la Papelera de Reciclaje), trate de reinstalarlo desde la fuente original (El CD de Delphi, si es de
donde lo obtuvo).
Informacin adicional
El archivo ms importante de biblioteca de tipos que viene con Delphi 3 es
STDVCL32.TLB, el cual es una interfaz para los controles VCL estndar. El
correspondiente archivo en Delphi 4 es STDVCL40.DLL. No ha habido actualizaciones para Delphi 5 o 6; es decir, no hay un STDVCL50.DLL o
STDVCL60.DLL.
Could not load unit <> symbol information for <> Do you want to
try to find this file yourself?
Posible causa de error
Puede obtener este mensaje de error mientras trabaja con el Asistente para la
creacin de controles ActiveX (ActiveX Control Wizard), despus de seleccionar
Mensajes de error
163
un componente VCL del cual heredar. Puede ser que el archivo est en el lugar
correcto (a pesar del mensaje de error), pero hay un error en el archivo.
Solucin rpida
Si hay un error en el componente del que intenta derivar, solucione el error
antes de intentar derivar un control ActiveX de este componente.
Informacin adicional
Si el archivo no puede ser cargado debido a un error, puede que le haya hecho
cambios despus de haberlo instalado en la VCL. La ventana de mensajes del
compilador mostrar cualquier error que encuentre. Pulse el botn derecho del
ratn sobre el mensaje de error y seleccione Edit Source. Esto lo llevar directamente a la lnea de cdigo que ocasiona el error en el archivo. Solucione el
error, grabe y cierre el archivo .PAS, y luego intente de nuevo crear el control
ActiveX.
Couldnt perform the edit because another user changed the record
Posible causa de error
Adems de lo obvio (otro usuario accedi al registro y lo modific), puede ser
que tenga configurados disparadores (triggers) que estn generando automticamente los valores de ciertos campos.
Solucin rpida
Compruebe los disparadores para ver qu es lo que estn cambiando y cundo.
Informacin adicional
Si es realmente posible que otro usuario cambie el registro que est editando,
puede que desee utilizar cualquier mecanismo de bloqueo que soporte su base
de datos. Para ms informacin buscar locks, UpdateMode, y TransIsolation en la ayuda de Delphi.
164
Solucin rpida
Proporcione una contrasea vlida en el cuadro de edicin Password e intntelo de nuevo.
Informacin adicional
El Query Builder solamente est disponible en la versin Cliente/Servidor
(Enterprise) de Delphi.
Solucin rpida
1. Mueva algunas o todas las variables a la seccin Private de un objeto en su
unidad.
2. Si el problema se debe a utilizar muchas cadenas en Delphi 1 (en Delphi de
32 bits, simplemente utilice cadenas largas, que son en el fondo punteros
de 4 bytes), puede disminuir la cantidad de espacio que stas consumen
declarando explcitamente su tamao, como:
TRecording = record
Number: Integer;
Hits: Integer;
Title: String[24];
Artist: String[16];
end;
Mensajes de error
165
Para las variables de cadena, puede reducir el tamao de memoria asignada declarando el tamao mximo que se quiere permitir para una
variable de cadena particular. En otras palabras, si declara una cadena
que contendr el apellido de la persona, no es necesario reservar la cantidad por defecto de 256 bytes para ella. En ese caso podra hacer lo
siguiente:
var
Surname: String[20];
166
En lo adelante, puede acceder a la memoria apuntada por el puntero derreferencindolo. Por ejemplo, para almacenar un valor en el campo Artist,
podra hacerlo de esta forma:
ptrPlatter^.Artist := 'Hootie and the Blowfish';
Informacin adicional
Esto es principalmente un problema de Delphi 1; ms especficamente, un problema de Windows 3.x, donde el segmento de datos est limitado a 64 KB.
1. Trate de evitar utilizar variables globales en la medida de lo posible. Utilice variables locales siempre que sea posible. Si necesita compartir
variables globales entre mltiples unidades, utilice una unidad global especficamente para esto.
2. Puede incluir tantas tablas de cadenas de caracteres como quiera, y los
nmeros utilizados en ellas para designar las cadenas no tienen que ser
consecutivos.
3. Las constantes con tipo se aaden al segmento de datos del programa. Las
variables inicializadas, por otra parte, no. Si no va a reasignar el valor de
una constante con tipo, utilice una constante sin tipo, o una variable inicializada. Sustituya las constantes con tipo por variables inicializadas para
compatibilidad con versiones futuras de Delphi.
Mensajes de error
167
Solucin rpida
1. Limite la cantidad de cambios en una nica transaccin a no ms de 255.
2. Descargue la versin ms reciente del BDE desde el sitio
www.borland.com/devsupport/bde/bdeupdate.html
Informacin adicional
Los lmites de Paradox se indican ms abajo. Para informacin general relacionada con las limitaciones del BDE y dBASE, consulte en la Web de Borland
http://www.borland.com.
127
254
64
255
255
512
Archivos fsicos abiertos (DB, PX, MB, X??, Y??, VAL, TV)
1024
300
255
255
2.000
2.000
10.800
32.750
127
16
255
256
100
15
63
159
63
168
Solucin rpida
Debe disminuir el tamao del tipo. Por ejemplo, lo siguiente compilar:
TTexasSizedArray = array[0..100000000] of variant;
Informacin adicional
200.000.000 enteros y 100.000.000 de variantes deberan ser suficientes en la
mayora de los casos. Si es necesario, declare dos tipos separados, as:
TAlaska = array[0..200000000] of integer;
TAlaskaAnnex = array[0..200000000] of integer;
Solucin rpida
Asigne un valor a la propiedad DatabaseName del componente TDatabase
antes de intentar asignar el valor True a su propiedad Connected.
Mensajes de error
169
Informacin adicional
El componente TDatabase es similar al componente TSession, en el sentido de
que se crea implcitamente una instancia de ellos con sus propiedades asignadas a valores por defecto cuando es necesario.
En muchas ocasiones resulta ventajoso crear explcitamente un componente
TDatabase, especialmente cuando se desea conectar con servidores de bases de
datos SQL (como InterBase, Oracle, MS SQL Server, Informix, etc.).
Puede mejorar el rendimiento en tales casos asignando el valor True a la propiedad KeepConnected del componente TDatabase, evitando muchas inicializaciones de conexin que consumen tiempo durante la ejecucin del programa.
Un componente TDatabase permite tambin utilizar procesamiento de transacciones llamando al mtodo StartTransaction de TDatabase, seguido por una
llamada a Commit o Rollback, en dependencia del xito o fallo de la
transaccin.
He aqu un ejemplo de cmo utilizar las transacciones de bases de datos:
begin
with Database1 do
begin
StartTransaction;
try
Query1.Active := True;
Commit;
except
Rollback;
end; {bloque except}
end; {bloque with}
end;
170
Solucin rpida
Asigne una base de datos al componente de consulta antes de ejecutar la consulta, as:
. . .
Database := dm.IBDB;
. . .
Open;
Informacin adicional
En el cdigo de arriba, dm es un mdulo de datos en el que reside un objeto de
tipo TIBDatabase llamado IBDB. Los componentes IBX aparecen en la pgina
InterBase de la Paleta de Componentes para ser utilizados en las aplicaciones
que utilicen bases de datos InterBase (sin necesidad del BDE). A partir de la
versin 6 de Delphi, tambin se tiene la opcin de utilizar los componentes
DBExpress para acceder a InterBase sin el BDE.
Solucin rpida
Proporcione un componente TQuery como valor de la propiedad Dataset del
componente TProvider.
Informacin adicional
Nota: Los componentes MIDAS solamente son proporcionados con Delphi 3
Cliente/Servidor y versiones posteriores de Delphi.
TQueryClientDataSet apareci con Delphi 4 y desapareci en Delphi 5.
Mensajes de error
171
Solucin rpida
El parmetro NetDir debe apuntar a un directorio compartido de red al que
todos los usuarios que accedern a las tablas debern tener derechos de acceso
de lectura, escritura y creacin.
Informacin adicional
Dos propiedades de TSession, NetFileDir y PrivateDir, son especficas para
aplicaciones que trabajan con tablas Paradox. NetFileDir especifica el directorio que contiene el archivo de control de red de Paradox, PDOXUSRS.NET.
Este archivo gestiona la comparticin de las tablas Paradox sobre la red. Todas
las aplicaciones que necesiten compartir tablas Paradox deben especificar el
mismo directorio de archivo de control de red (normalmente un directorio sobre
el servidor de archivos de la red).
172
Solucin rpida
Coloque el conjunto de datos en modo de edicin o insercin antes de hacer
modificaciones o adiciones a l. Por ejemplo, si quiere editar el registro actual
del campo MonthlySpecial de la tabla Pizza, podra hacer lo siguiente:
with Pizza do
begin
Edit;
PizzaMonthlySpecial.AsString := 'Italian Garlic';
Post;
end;
Informacin adicional
Para que la sintaxis de arriba funcione (PizzaMonthlySpecial.AsString), el
campo debe haber sido creado en tiempo de diseo utilizando el editor de campos (Fields Editor). De otro modo, necesitar asignar un valor al campo utilizando las propiedades Fields, FieldValues o FieldByName de TDataset.
Los estados o modos posibles de un TDataset son: dsBrowse, dsCalcFields,
dsCurValue, dsEdit, dsFilter, dsInactive, dsInsert, dsNewValue, dsOldValue y
dsSetKey.
Solucin rpida
Instale y registre el archivo sobre la mquina cliente.
Informacin adicional
Para registrar el archivo (despus de copiarlo al directorio \Windows\System),
siga estos pasos:
1. Abra una ventana DOS.
2. Vaya al directorio \Windows\System.
3. Introduzca Regsvr32 <archivo> y luego pulse la tecla Enter.
Por ejemplo, si el archivo del problema es DBCLIENT.DLL, sera
Regsvr32 DBCLIENT.DLL.
Consulte Class not registered.
Mensajes de error
173
Solucin rpida
Aada un gestor de excepciones a su servidor de aplicaciones.
Informacin adicional
Atrapando los errores en el servidor de aplicaciones podr determinar la naturaleza especfica del problema que est experimentando.
Solucin rpida
Si es necesario, descargue e instale DCOM del sitio Web de Microsoft.
Informacin adicional
Windows NT 4, Windows 98, Internet Explorer 4, y sus versiones posteriores
incluyen DCOM.
174
Solucin rpida
1. Espere hasta que la ventana de visualizacin se haya actualizado antes de
continuar la traza de la ejecucin.
2. Despus de una excepcin en tiempo de ejecucin, seleccione Run | Program Reset.
Informacin adicional
2. Al seleccionar Run | Program Reset despus de experimentar excepciones, har que Delphi libere los recursos asignados por llamadas a la VCL e
inicialice las variables del programa.
Sin embargo, reiniciar un programa desde el entorno integrado de Delphi
de esta manera no necesariamente libera todos los recursos de Windows
asignados por el programa.
Si contina experimentando inestabilidad sin razn aparente, seleccione
File | Close All, luego File | Exit, y finalmente reinicie Delphi e intente
compilar el proyecto de nuevo.
Solucin rpida
Seleccione Cancel cuando reciba este mensaje de error y luego seleccione Run
| Program Reset.
Informacin adicional
Si est experimentando excepciones o mensajes de error inusuales, seleccione
File | Close All, luego File | Exit y reinicie Delphi. Si contina teniendo problemas, cierre todo y reinicie Windows.
Mensajes de error
175
Solucin rpida
1. Asegrese de que cualquier DLL requerida est accesible. Por convenio, los
archivos DLL (incluyendo los DPLs, o paquetes) se instalan en el directorio
\Windows\System. En el mundo de los ordenadores, normalmente es til
seguir un convenio, a menos que se tenga una excelente razn para no
hacerlo.
2. Verifique que cualquier procedimiento o funcin que est llamando en las
DLLs correspondan en nombre y argumentos. En Windows de 32 bits, los
nombres de los procedimientos exportados son sensibles a las diferencias
maysculas/minsculas.
3. Verifique que est pasando a los procedimientos o funciones que llama la
cantidad y tipos de parmetros adecuados, y en el orden correcto.
4. Permita que todos los valores de la ventana de visualizacin se actualicen
antes de continuar trazando el cdigo, o elimine algunas variables de la
lista.
5. Verifique que la ruta y el nombre del servidor remoto que est utilizando
sean vlidos.
Informacin adicional
Intente ejecutar el programa desde el Explorador de Windows. Puede que
obtenga un mensaje de error ms descriptivo, que indique qu archivo .DLL es
el que falta.
176
2. Puede haber borrado u omitido algo que es necesario. Por ejemplo, borrar
la seccin Begin End de una DLL producir este mensaje de error.
3. Puede haber aadido una seccin Finalization a una unidad sin haber proporcionado una seccin Initialization.
Solucin rpida
1. Utilice un nombre vlido de Object Pascal para la declaracin. Estas declaraciones estn bien:
stringy: string;
a1string: string;
_1string: string;
Informacin adicional
3. Si utiliza una seccin Finalization, debe tambin utilizar una seccin Initialization. Puede inicializar variables, asignar memoria, etc., en la seccin
Initialization. La seccin Finalization es un buen lugar para liberar memoria y otros recursos.
Mensajes de error
177
Solucin rpida
Cambie las signaturas en la clase o interfaz para que coincidan.
Informacin adicional
Cuando las clases implementan interfaces, deben implementar todos los mtodos que la interfaz declara. Todas las clases que implementen interfaces deben
implementar los tres mtodos de IUnknown (QueryInterface, AddRef y
Release); si deriva su clase de TInterfacedObject (como se muestra arriba), esto
se hace automticamente. Se hereda la implementacin predefinida de esos
mtodos heredando de TInterfacedObject.
178
Solucin rpida
1. Consulte la declaracin original del procedimiento o funcin y utilice la
misma signatura en su implementacin.
2. Cuando se redefine un mtodo virtual, se debe utilizar la misma lista de
parmetros (cantidad, tipos, nombres y orden de los parmetros).
3. Utilice el mismo convenio de llamada que se utiliza en el mtodo a
redefinir.
Informacin adicional
3. Para ms informacin, consulte calling conventions en la ayuda de
Delphi.
a:
TPanel1 = class(TForm)
Solucin rpida
1,2. Vuelva a la declaracin que ha generado automticamente Delphi, es decir:
TForm1 = class(TForm)
o cambie el nombre de la clase (formulario) a travs del Inspector de Objetos (Object Inspector).
Informacin adicional
Puede declarar un nuevo tipo sin especificar un ancestro, as:
TBill = class
Mensajes de error
179
Solucin rpida
La clusula Default no est permitida en las secciones Automated de OLE. Elimine la clusula.
Informacin adicional
Delphi 2 y posteriores ofrecen cinco especificadores de visibilidad: Private, Protected, Public, Published y Automated. Una propiedad de una clase puede
especificar caractersticas de almacenamiento mediante las palabras reservadas Stored, Default o Nodefault. Estos especificadores de almacenamiento, sin
embargo, no estn permitidos en las secciones Automated.
El especificador Index, que permite que mltiples propiedades compartan los
mismos mtodos de acceso, tampoco est permitido en la seccin Automated.
Solucin rpida
Debe elegir una de tres posibles soluciones:
1. Cambie el parmetro a un parmetro constante:
procedure ThatAintWorkin(const iYiYi: Integer = 86);
180
Informacin adicional
En Pascal, hay tres formas de pasar parmetros: por referencia (Var), constante (Const) o por valor (como es el mecanismo por defecto, no es necesario
especificar nada). La forma por defecto (por valor) es la forma ms segura,
pero es tambin la menos eficiente. Cuando un parmetro es pasado por valor,
una copia es creada y enviada (por lo que hay dos instancias del parmetro).
Cuando se pasa por referencia (Var), se enva un puntero al parmetro con
capacidad de escritura. Cuando se pasa una constante, se pasa un puntero de
slo lectura al parmetro. Por lo tanto, si va a cambiar el valor (y desea que el
cambio se refleje tambin en el contexto de la llamada), pselo por referencia
(anteponiendo Var al nombre del parmetro). Si el valor no va a cambiar,
pselo como una constante (anteponiendo Const al parmetro). Solamente utilice la forma por defecto (por valor) en caso de que el valor puede cambiar, y no
desea que esos cambios se reflejen en el contexto desde el que se hace la
llamada.
Solucin rpida
Borre la directiva Default de la declaracin de la propiedad. Solamente es posible designar una propiedad de tipo array como la propiedad por defecto de la
clase. Por ejemplo, lo siguiente es aceptable:
type
TComputer = class
. . .
property Clones[Index: Integer]: String
read FNetPC write SetNetPC; default;
Informacin adicional
La ventaja de especificar una propiedad de tipo array como propiedad por
defecto es que luego puede acceder a esa propiedad en el cdigo sin tener que
Mensajes de error
181
Solucin rpida
Si proporciona un valor por defecto para un parmetro, deber tambin
proporcionar valores por defecto para todos los parmetros que le siguen, as:
procedure BiDefault(i: Integer = 76; s: String = 'trombones');
Informacin adicional
Algunas funciones, como StrToIntDef, tambin permiten especificar un valor
de retorno por defecto. Puede, por supuesto, escribir sus propias funciones de
forma que sigan este patrn.
182
Solucin rpida
Elimine la directiva de almacenamiento Default y el correspondiente valor por
defecto. No declare valores por defecto para propiedades de tipo cadena
(string), de punto flotante o arrays.
Informacin adicional
Como indica el texto de este mensaje de error, los valores de las propiedades
por defecto deben ser ordinales, punteros, o tipos de conjunto pequeos. En trminos prcticos, esto significa tipos enteros, Boolean y enumerados. Como
ejemplo de lo que es aceptado y comnmente utilizado, he aqu un extracto de
la unidad Buttons de Delphi:
{Tipo enumerado utilizado despus como tipo de propiedad}
type
TButtonLayout = (blGlyphLeft, blGlyphRight, blGlyphTop,
blGlyphBottom);
. . .
TSpeedButton = class(TGraphicControl)
{Propiedad de tipo Boolean con directiva de
almacenamiento Default asociada}
property AllowAllUp: Boolean read FAllowAllUp
write SetAllowAllUp default False;
{Propiedad de tipo entero con directiva de
almacenamiento Default asociada}
property GroupIndex: Integer read FGroupIndex
write SetGroupIndex default 0;
. . .
{Propiedad de tipo enumerado con directiva de
almacenamiento Default asociada}
property Layout: TButtonLayout read FLayout
write SetLayout default blGlyphLeft;
Mensajes de error
183
. . .
property Cancel stored IsCustom;
property Caption stored IsCustomCaption;
. . .
function TBitBtn.IsCustom: Boolean;
begin
Result := Kind = bkCustom;
end;
. . .
function TBitBtn.IsCustomCaption: Boolean;
begin
Result := CompareStr(Caption,
LoadResString(BitBtnCaptions[FKind])) <> 0;
end;
Solucin rpida
Asegrese de que la tabla a la que hace referencia la propiedad Destination del
componente TBatchMove tiene un ndice correspondiente a otro de la tabla a la
que hace referencia la propiedad Source.
Informacin adicional
Para actualizar o borrar registros especficos de una tabla, Delphi deber ser
capaz de emparejar los registros en la tabla Destination con los registros en
la tabla Source. Si las tablas Destination y Source no tienen ndices correspondientes, esto es imposible y por ello obtendr este mensaje de error.
Para ejecutar la operacin de BatchMove en tiempo de diseo, siga estos pasos:
1. Asigne a la propiedad Source del componente TBatchMove un componente
TDataset.
2. Asigne a la propiedad Destination del componente TBatchMove un componente TTable.
184
Directory Is Busy
Posible causa de error
Mltiples aplicaciones (o mltiples instancias de una misma aplicacin) pueden estar intentando utilizar el mismo directorio como directorio privado.
Solucin rpida
Distribuya cada aplicacin de manera que se ejecute en su propio directorio
separado, o asigne la propiedad PrivateDir del componente TSession durante el
arranque de la aplicacin (antes de que se acceda a ninguna tabla). El directorio privado de cada usuario debe ser inaccesible a los dems usuarios; puede
estar situado en el disco duro local del usuario, o sobre la red si el espacio de
almacenamiento local es limitado. Por ejemplo, para hacer que el programa
cree un directorio en el disco duro local del usuario, podra hacer esto antes de
que las tablas sean accedidas:
var
Extension, ExecName, MineAllMine : String;
ExtensionPos: Integer;
. . .
ExecName := ExtractFileName(Application.ExeName);
Extension := ExtractFileExt(Application.ExeName);
ExtensionPos := Pos(Extension, ExecName);
Delete(ExecName, ExtensionPos, 4);
MineAllMine := 'C:\Temp\' + ExecName;
if not DirectoryExists(MineAllMine) then
CreateDir(MineAllMine);
if DirectoryExists(MineAllMine) then
Session.PrivateDir := MineAllMine
else
raise Exception.Create('Por alguna razn, el directorio privado'
+ MineAllMine + ' no fue creado.');
end;
Informacin adicional
Esto no es un problema si cada usuario est ejecutando su propia copia local
del ejecutable, ya que el Directorio Privado es implcitamente asignado al
directorio actual. A menos que lo haya cambiado, ste ser el directorio en el
que el ejecutable reside.
Mensajes de error
185
Si mltiples usuarios acceden al mismo programa sobre una red (todos ejecutan un mismo ejecutable situado en una unidad de red compartida), para cada
uno de ellos se deber asignar explcitamente un directorio privado distinto del
de los dems. De otra manera, todos los archivos temporales tratarn de utilizar el mismo directorio (el directorio en el que reside el ejecutable compartido),
y se producirn conflictos (especficamente, se obtendr este mensaje de error).
Solucin rpida
1. Configure cada mquina de usuario de manera que tengan el mismo valor
de configuracin del parmetro NetDir (que indica el directorio de la red en
el que reside el archivo PDOXUSRS.NET). Puede hacerlo siguiendo los
pasos adecuados para su versin de Delphi:
Delphi 1
Si cada usuario tiene su propia copia del BDE en su mquina, puede utilizar la
utilidad de configuracin del BDE para asignarles el directorio de red. Para
ello, siga estos pasos:
a. Abra la utilidad de configuracin del BDE (BDE Configuration).
b. Con la entrada Paradox seleccionada en el cuadro de lista Driver
Name, introduzca la ruta completa del directorio de red compartido
donde se almacena el archivo de control de red (PDOXUSRS.NET) en
el parmetro NetDir.
c. Seleccione File | Exit y grabe los cambios.
Si algn usuario no tiene una copia de la utilidad de configuracin del BDE,
asegrese de que la ubicacin actual de su archivo IDAPI.CFG (por defecto
C:\IDAPI) coincida con lo indicado en la entrada CONFIGFILE01 de la seccin
[IDAPI] del archivo WIN.INI.
186
Delphi 2
Si cada usuario tiene su propia copia del BDE, puede utilizar la utilidad de
configuracin del BDE para asignarles el directorio del archivo de control de
red de Paradox. Para ello, siga estos pasos:
a. Abra la utilidad de configuracin del BDE (BDECFG32.EXE)
seleccionando Inicio | Programas | Delphi | BDE Configuration.
b. Con la entrada Paradox seleccionada en el cuadro de lista Driver
Name, introduzca la ruta completa del directorio de red compartido
donde se almacena el archivo de control de red (PDOXUSRS.NET) en
el parmetro NetDir.
c. Seleccione File | Exit y grabe los cambios.
Vea Delphi de 32 bits ms adelante.
Delphi 3 y 4
Si cada usuario tiene su propia copia de BDE, puede utilizar la utilidad de
administracin del BDE para asignarles el directorio de red de Paradox. Para
ello, siga estos pasos:
a. Abra la utilidad BDE Administration (Inicio | Programas | Delphi
X | BDE Administrator).
b. Seleccione Object | Open Configuration. . . .
c. Abra IDAPI32.CFG.
d. Navegue hasta Configuration | Drivers | Native | Paradox | Net
Dir.
e. Introduzca la ruta completa del directorio en donde reside el archivo de
control de red. Seleccione un directorio de red compartido sobre el que
todos los usuarios de las tablas Paradox tengan derechos de lectura,
escritura y borrado.
f. Seleccione Object | Exit y luego Yes para grabar los cambios
realizados.
Delphi de 32 bits
Si algn usuario no tiene una copia de la utilidad BDE Configuration/Administration, puede consultar el Registro del sistema para asegurarse de que la ubicacin de IDAPI32.CFG (por defecto C:\Archivos de programa\Borland\
Common files\BDE) coincide con lo que se indica en el Registro del sistema. La
clave del Registro DLLPATH est ubicada en HKEY_LOCAL_MACHINE\
Software\Borland\Database Engine.
Mensajes de error
187
Si es necesario, mueva el archivo para que coincida con la entrada del Registro
o cambie la entrada en el Registro del sistema para que coincida con la ubicacin del archivo.
2. Haga que todos los usuarios de los programas que acceden a las tablas en
cuestin salgan de los programas. Busque y borre el archivo
PDOXUSRS.NET y los archivos *.LCK invlidos.
3. Asigne el valor True al parmetro Local Share mediante la utilidad de configuracin del BDE.
Informacin adicional
El directorio en el que reside el archivo de control de red (PDOXUSRS.NET)
debe ser un directorio de red compartido sobre el que todos los usuarios que
accedan a las tablas deben tener derechos de lectura, escritura y creacin.
Puede pensar en el archivo de control de red como en un polica de trfico. Los
conflictos potenciales pueden ser evitados si todos los usuarios/controladores
miran al mismo polica de trfico/archivo de control de red para orientarse. Si
los usuarios se guan por diferentes policas, el resultado no ser agradable.
Si mltiples usuarios compartieran la misma copia de un archivo .EXE (por
ejemplo, uno que resida en una unidad de red compartida) que accede a tablas
de Paradox, ellos debern asignar al parmetro PrivateDir de Paradox una
ubicacin a la que solamente ellos puedan acceder. Por ejemplo, pueden establecer como su directorio privado un directorio de su propio disco duro, asignndolo a la propiedad PrivateDir del componente TSession. Un ejemplo de
cmo se podra hacer esto es el siguiente:
var
Extension, ExecName, GomerPyle : String;
ExtensionPos: Integer;
. . .
ExecName := ExtractFileName(Application.ExeName);
Extension := ExtractFileExt(Application.ExeName);
ExtensionPos := Pos(Extension, ExecName);
Delete(ExecName,ExtensionPos,4);
GomerPyle := Format( 'C:\Temp\%s',[ExecName]);
if not DirectoryExists(GomerPyle) then
CreateDir(GomerPyle);
if DirectoryExists(GomerPyle) then
Session.PrivateDir := GomerPyle
else
raise Exception.CreateFmt(
El directorio privado %s no fue creado.',
[GomerPyle]);
end;
188
Disk Error
Posible causa de error
Puede haber realizado cambios a un archivo, y luego haber intentado grabarlo
a travs de un sistema de control de versiones, como PVCS, sin primero haber
marcado (check out) el archivo en modo de escritura.
Solucin rpida
Si quiere que los cambios realizados a un archivo se apliquen, debe primero
prepararlo para escritura.
Informacin adicional
PVCS no se incluye de serie en Delphi, pero Delphi Cliente/Servidor ofrece
soporte nativo para l. Para ms informacin, consulte PVCS en la ayuda de
Delphi.
Disk full
Posible causa de error
Puede estar intentando instalar un componente cuyo archivo de recursos asociado (.DCR) est daado.
Solucin rpida
Borre el archivo .DCR (tiene el mismo nombre del componente, pero su extensin es .DCR en lugar de .PAS o .DCU).
Informacin adicional
Los archivos .DCR contienen mapas de bits de paleta para el componente
correspondiente. Son una caracterstica til, que permite distinguir visualmente los componentes en la Paleta, as como en los formularios y mdulos. Si
no se proporciona un archivo .DCR, o si se ha proporcionado alguno pero no se
utiliza, el componente utilizar el mapa de bits de su ancestro.
An cuando dos componentes compartan el mismo mapa de bits, hay formas de
diferenciarlos. En la Paleta de Componentes, posicione el cursor sobre el mapa
de bits hasta que aparezca la indicacin (hint) que muestra el nombre del componente. Si el componente est situado sobre un formulario o mdulo de datos,
su tipo se mostrar sobre el Inspector de Objetos (Object Inspector). Por ejemplo, si crea un descendiente de TBatchMove y lo denomina TSoftBatchMove, el
cuadro de lista desplegable situado en la parte superior del Inspector de
Mensajes de error
189
Solucin rpida
Verifique que el bucle no intente leer ms all del tamao del archivo. En el
cdigo anterior, reemplace 232 por 50. O mejor todava, cree una constante y
utilcela as:
const
NUMBER_OF_STATES = 50;
. . .
while I < NUMBER_OF_STATES do . . .
Informacin adicional
Este es el error 100 de Entrada/Salida.
190
Solucin rpida
Mantenga siempre libre al menos el 10 por ciento del disco duro. Elimine los
archivos innecesarios. Haga copia de seguridad en medios removibles de los
archivos que se utilizan en contadas ocasiones o nunca y luego brrelos.
Informacin adicional
Este es el error nmero 101 de Entrada/Salida.
No tener espacio suficiente en disco duro puede indirectamente ocasionar
muchos errores no relacionados. Una de las causas es que el sistema utiliza ese
espacio para memoria virtual. Si hay ms espacio en disco libre, ms memoria
virtual habr disponible. Si comienza a recibir mensajes de error que no parezcan tener sentido, verifique el espacio disponible en disco.
Solucin rpida
Utilice un identificador (dispid) nico para cada mtodo. Por ejemplo, en el
cdigo mostrado arriba, simplemente reemplace una de las clusulas dispid 1
por un nmero distinto de 1, como dispid 2.
Informacin adicional
Las declaraciones de mtodos y propiedades en una seccin Automated pueden
opcionalmente ir acompaadas de una directiva Dispid. Si se utiliza una directiva Dispid, sta debe ir seguida por una constante entera. Si no se especifica
explcitamente una directiva Dispid con su correspondiente nmero, el compilador generar automticamente un identificador nico.
Para ms informacin, consulte automated components en la ayuda de
Delphi.
Mensajes de error
191
Solucin rpida
Aada la directiva Dispid nicamente a las propiedades y mtodos situados en
la seccin Automated de la clase.
Informacin adicional
Las directivas Dispid pueden ser utilizadas slo en secciones Automated. Para
ms informacin, consulte automated components en la ayuda de Delphi.
Solucin rpida
Elimine la llamada a Dispose.
Informacin adicional
Debido a que los arrays dinmicos mantienen un contador de referencias, se
liberan automticamente cuando no quedan referencias a ellos.
192
Division by zero
Posible causa de error
Puede haber intentado dividir un nmero por cero. Por ejemplo, si la variable
Divisor es igual a 0, lo siguiente generar este mensaje de error:
var
Dividend, Divisor, Quotient: integer;
begin
. . .
Dividend := StrToInt(Edit1.Text);
Divisor := StrToInt(Edit2.Text);
Quotient := Dividend div Divisor;
Solucin rpida
Asegrese de que el divisor no sea 0 antes de dividir, o encierre la operacin de
divisin en un bloque Try. . . Except. Por ejemplo, para prevenir que la operacin de divisin tenga lugar si el divisor es 0, puede hacer algo as:
. . .
Dividend := StrToInt(Edit1.Text);
if StrToInt(Edit2.Text) > 0 then
begin
Divisor := StrToInt(Edit2.Text);
Quotient := Dividend div Divisor;
end;
else
begin
ShowMessage('Enter a number greater than 0 '
+#13#10+ ' in the Divisor edit box);
Edit2.SetFocus;
end;
Para encerrar la operacin en un bloque Try. . . Except, puede hacer algo as:
. . .
Dividend := StrToInt(Edit1.Text);
Divisor := StrToInt(Edit2.Text);
try
Quotient := Dividend div Divisor;
except
on EDivByZero do
ShowMessage('Enter a number greater than 0 '
+#13#10+ ' in the Divisor edit box);
Edit2.SetFocus;
end;
end;
Mensajes de error
193
Informacin adicional
Si est dividiendo nmeros de punto flotante, debe utilizar el operador / en
lugar del operador div, que se utiliza slo para dividir enteros.
Solucin rpida
Asegrese de que haya solamente una ocurrencia de cada valor en una sentencia Case.
Informacin adicional
Especificar que ms de una accin tendr lugar para un valor particular no
puede ser entendido por el compilador, ya que es ambiguo. El siguiente ejemplo, donde el valor walton se encuentra dos veces, ocasiona este mensaje de
error:
function GetFirstName(shagger: outfielders): string;
var
FirstName: string;
begin
case shagger of
anderson: FirstName := 'Brady';
belle: FirstName := 'Joey'; //Albert
carter: FirstName := 'Joe';
davis: FirstName := 'Eric';
hammonds,walton: FirstName := 'Jeffrey';
kingsale: FirstName := 'Eugene';
matos: FirstName := 'Luis';
surhoff: FirstName := 'B.J.';
tarasco: FirstName := 'Tony';
walton: FirstName := 'Jerome';
end;
Result := FirstName;
end;
194
Solucin rpida
Asigne nombres nicos a todos los componentes TDatabase.
Informacin adicional
Para mayor claridad y facilidad de mantenimiento del cdigo, es una buena
prctica utilizar nombres descriptivos para los componentes y sus propiedades,
como por ejemplo la propiedad DatabaseName del componente TDatabase. Delphi no evita que proporcione el nombre DB o BigIron o q a la propiedad
DatabaseName, pero es mejor evitarlos en lo que respecta a la claridad y mantenimiento del cdigo.
Mensajes de error
195
Solucin rpida
Cambie las constantes numricas de los mensajes para que tengan valores
nicos:
const
GOTTA_GETTA_MESSAGE_TO_YOU = WM_User + 160;
MESSAGE_IN_A_BOTTLE = WM_User + 161;
Informacin adicional
La aplicaciones escritas en Delphi normalmente responden a eventos que son
disparados por los mensajes de Windows. Como se muestra arriba, usted puede
crear sus propias constantes y gestores de mensajes, y luego poner un mensaje
en la cola de mensajes de Windows para hacer que el gestor de mensaje correspondiente se dispare. Para ms informacin, consulte PostMessage y SendMessage en la ayuda del SDK de Windows, o busque el libro LosTomos de
Delphi: Ncleo del API Win32, editado en espaol por Danypress, para ms
informacin sobre cmo utilizar llamadas a la API de Windows. Este excelente
libro contiene multitud de ejemplos en Delphi de llamadas a la API de Windows. Para ms informacin, consulte message dispatching en la ayuda de
Delphi. Para informacin similar, consulte duplicate message method index.
196
Alternativamente, puede estar creando los campos varias veces. Por ejemplo, lo
siguiente funcionar bien la primera vez:
with Table1 do begin
. . .
with FieldDefs do begin
Clear;
Add('Baseball', ftBoolean, 0, True);
Add('Force', ftString, 30, False);
end;
Pero fallar en una ejecucin posterior, ya que los campos Baseball y Force ya
existen.
Solucin rpida
Sustituya el nombre de campo duplicado por otro nico. En el primer ejemplo
dado arriba, por ejemplo, podra renombrar el segundo campo como
SafeSliding.
Informacin adicional
Para ms informacin sobre creacin de tablas en tiempo de ejecucin, consulte
CreateTable en la ayuda de Delphi.
Solucin rpida
Elimine una de las propiedades de interfaz delegadas (o cambie el nombre de
una de las interfaces a otra interfaz disponible).
Mensajes de error
197
Informacin adicional
Para ms informacin sobre lo que no est permitido cuando se delegan propiedades para implementar interfaces, consulte Implements getter must be
register calling convention y Read or Write clause expected, but
identifier <> found.
Solucin rpida
Cambie el valor de una de las constantes de ndice de mensaje. En el caso de
arriba, debe cambiar indudablemente la segunda constante, WM_CHAR por
WM_KEYDOWN.
Informacin adicional
Para ms informacin, consulte la unidad de Messages de Delphi. Tambin
consulte Duplicate dynamic method index.
Duplicate resource
Posible causa de error
1. Puede tener una unidad o una clase en una unidad que tiene el mismo
nombre de una unidad o clase ya existente en el mbito visible del programa. Podra ser una unidad de Delphi o una unidad propia que tenga
duplicada.
2. Puede que est utilizando componentes que tengan los mismos nombres de
recursos en sus archivos .DCR.
198
Solucin rpida
1. Localice la unidad o nombre de clase duplicado y renmbrelo. Para hacer
esto en el caso de una unidad, siga estos pasos:
a. Con la unidad seleccionada, seleccione File | Save As. . . .
b. Proporcione un nombre nico a la unidad.
c. Modifique las referencias a la unidad para reflejar el nuevo nombre. Si
es un nombre de clase el culpable, simplemente edtelo directamente en
la ventana de cdigo.
2. Si los componentes son suyos o si dispone de su cdigo fuente, revise los
archivos .DCR para determinar qu elementos tienen el mismo nombre.
Renombre uno de los recursos e intntelo de nuevo. Para renombrar uno de
los recursos utilizando el Editor de Imgenes de Delphi (Image Editor),
siga estos pasos:
a. Seleccione Tools | Image Editor.
b. Seleccione File | Open.
c. Navegue hasta el archivo de recursos (.DCR) y bralo.
d. En la vista de rbol, navegue hasta el elemento que desea renombrar.
e.
Informacin adicional
1. Reduzca el tamao de las clusulas Uses, eliminando de ellas cualquier
unidad que no sea necesaria.
3. El archivo de recursos del proyecto, que es creado automticamente por
Delphi, no se debe modificar. Consulte EResNotFound.
Si todo lo anterior falla, intente borrar todos los archivos *.DSM, *.DOF y
*.DSK.
Consulte Error Creating Form: Duplicate resource [Type:,Name:].
Mensajes de error
199
Solucin rpida
Asigne un nombre de sesin nico a cada componente TSession. Delphi puede
encargarse de esto automticamente si asigna el valor True a la propiedad
AutoSessionName.
Informacin adicional
Normalmente no es necesario aadir un componente TSession a las aplicaciones de base de datos. Un componente TSession es creado automticamente por
defecto (de forma similar al componente TDatabase). Pero si crea aplicaciones
multi-hilo o si est utilizando tablas Paradox que residen en varios lugares de
una red, puede arrastrar componentes TSession adicionales sobre el formulario
o mdulo de datos para facilitar el trabajo en tales circunstancias.
Solucin rpida
Cambie la segunda aparicin de True por False.
Informacin adicional
No confunda los registros variantes con el tipo de datos Variant.
200
Solucin rpida
Sustituya el mtodo de acceso a la propiedad por un campo privado o un
mtodo corriente. No utilice mtodos de gestin de mensajes o mtodos dinmicos como mtodos de acceso para propiedades. Por ejemplo, podra reemplazar
el cdigo de arriba por algo as:
private
FDynamite: Integer;
procedure SetProper(NewProper: Integer);
. . .
published
property propwash: integer read FDynamite;
property proper: integer write SetProper;
Informacin adicional
Para ms informacin, consulte creating properties y dynamic methods en
la ayuda de Delphi.
Mensajes de error
201
Solucin rpida
No utilice mtodos dinmicos ni mtodos de gestin de mensajes en secciones
Automated.
Informacin adicional
Tratar de declarar un mtodo de gestin de mensajes como stos aparecen normalmente (con un parmetro de tipo TMessage, en lugar de Integer, como en el
ejemplo de arriba) provoca el mensaje de error Illegal type in OLE automation section: TMessage being generated.
EAccessViolation
Consulte Access Violation.
EBitsError
Consulte Bits Index out of Range.
EClassNotFound
Posible causa de error
Puede haber modificado directamente un archivo .DFM de formulario, y ahora
Delphi no puede hacer compatible el contenido del archivo .DFM con el
archivo .PAS.
202
Solucin rpida
Examine el archivo .DFM pulsando con el botn derecho del ratn sobre el formulario y seleccionando View As Text del men de contexto. Verifique que las
definiciones de objetos en la clase del formulario coinciden con lo que est
realmente en el formulario.
Informacin adicional
Muchos estudiantes novatos han experimentado errores de este tipo tratando
de encontrar el camino en el campus de la Universidad.
EComponentError
Posible causa de error
1. Puede haberle dado a un componente un nombre que no es nico.
2. Puede haberle dado a un componente un nombre que no es vlido.
3. Puede estar intentando llamar al mtodo RegisterComponents fuera del
procedimiento Register en una unidad de componente.
Solucin rpida
1. Siempre utilice nombres nicos dentro de un espacio de nombres. Si la unidad abc y la unidad xyz contienen ambas un componente llamado
AlphabetSoup, tendrn una convivencia muy difcil.
2. En Object Pascal, los identificadores (como los nombres de componentes)
deben empezar con una letra o un guin bajo y cada carcter subsiguiente
debe ser una letra, un guin bajo o un dgito.
3. Llame solamente a RegisterComponents dentro del procedimiento Register
de una unidad de componente.
Informacin adicional
3. El procedimiento Register y su llamada a RegisterComponents son creadas
automticamente cuando se utiliza el Asistente para la creacin de Componentes (Component Wizard).
EConvertError
Posible causa de error
Puede estar intentando convertir un valor de un tipo de datos a otro, pero la
conversin no es posible tal como se ha intentado.
Mensajes de error
203
Solucin rpida
Convierta solamente tipos cuando el valor en cuestin pueda ser traducido o
convertido al otro tipo. Esto requiere que los tipos que estn siendo convertidos
tengan una funcin de conversin correspondiente, y que el valor que va a ser
convertido pueda ser representado en el tipo de datos de destino. Por ejemplo,
intentar convertir un String a Boolean no resultara, ni tampoco el intento de
traducir un Float a un BLOb. Adems, algunas veces el tipo de conversin es
aceptable, pero el valor en s no lo es. Por ejemplo, intentar convertir el valor
de tipo String Parsley, Sage, Rosemary and Thyme a un valor de tipo TTime
no funcionar en ningn caso; en realidad, generar este mensaje de error. Sin
embargo, convertir el valor de tipo String 10:09 al tipo TTime utilizando la
funcin de conversin StrToTime funcionar bien.
Informacin adicional
Este es un tipo de error genrico, que es disparado cuando se produce un problema durante el intento de convertir de un tipo de datos a otro.
Puede utilizar la clase de excepcin EConvertError como herramienta de validacin de datos. Por ejemplo, para verificar que una fecha introducida por el
usuario es vlida antes de almacenarla, podra hacer algo as:
try
DayTripDay := StrToDate(Edit1.Text);
except
on EConvertError do
MessageDlg('El valor introducido no es una fecha vlida,
mtError, mbOK, 0);
end;
EDatabaseError
Posible causa de error
1. Puede haber intentado ejecutar una aplicacin que necesita el BDE sobre
una mquina que no tiene el BDE instalado.
2. Puede haber asignado el valor True a la propiedad Required de un campo
autoincremental.
Solucin rpida
1. Es necesario distribuir el BDE con las aplicaciones de Delphi que lo necesiten. Puede consultar los detalles en C:\Archivos de programa\
Borland\Delphi X\deploy.txt.
2. El valor de un campo Autoincrement es asignado por el motor de base de
datos durante la grabacin (post) del registro. A los campos obligatorios se
les debe asignar valor antes de intentar su grabacin.
204
Informacin adicional
Puede haber una segunda parte para este mensaje de error, como An error
occurred while attempting to initialize the Borland Database Engine.
En tales casos, busque el mensaje de error especfico en este libro.
EDivByZero
Consulte Division by zero.
EFCreateError
Posible causa de error
Puede haber dado a un archivo un nombre invlido.
Solucin rpida
Utilice nombres de Object Pascal vlidos para todos los identificadores. Los
nombres deben comenzar con una letra o un guin bajo, y a continuacin tener
slo letras, guiones bajos y dgitos.
Informacin adicional
Esta excepcin es descendiente de EStreamError, la clase base de todas las
excepciones relacionadas con flujos.
EFilerError
Posible causa de error
Puede haber intentado registrar una clase ante el sistema de flujos (streaming)
utilizando el procedimiento RegisterClass cuando ya haba una clase diferente
registrada con el mismo nombre.
Solucin rpida
Asegrese de que todas las clases que cree sean nicas, no solamente en funcionalidad, declaracin e implementacin, sino tambin en el nombre.
Informacin adicional
Intentar registrar la misma clase ms de una vez a travs de una llamada a
RegisterClass no ocasiona problemas; el segundo intento es simplemente ignorado. Diferentes clases con un mismo nombre, sin embargo, provocan error.
Mensajes de error
205
EGPFault
Consulte Access Violation.
EInOutError
Posible causa de error
Puede haber intentado aadir datos a un archivo que no existe.
Solucin rpida
Evite este error comprobando si el archivo existe, y crendolo en caso de que
no exista, as:
var
tF: TextFile; {o sT: System.Text}
begin
AssignFile(tF,'TrueFun.txt');
if FileExists('TrueFun.txt') then
Append(tF)
else
Rewrite(tF);
. . .
-Ovar
sT: System.Text; {o tF: TextFile}
begin
AssignFile(sT,'SoTrue.txt');
try
System.Append(sT)
except
on EInOutError do
Rewrite(sT);
end;
. . .
Puede tambin protegerse contra excepciones EInOutError al cerrar los archivos (que no se puedan grabar) as:
procedure TForm1.CloseButtonClick(Sender:
TObject);
begin
. . .
try
206
Informacin adicional
Para que EInOutError est disponible, debe tener activada la directiva de compilacin de verificacin de entrada/salida (I/O), ya sea en el entorno integrado
de Delphi o en el cdigo fuente. Para activarla desde el entorno integrado de
Delphi, siga estos pasos:
1. Seleccione Project | Options. . . .
2. Seleccione la pestaa Compiler.
3. Marque la casilla I/O checking en la seccin Runtime Errors.
4. Pulse el botn OK.
Para habilitar la verificacin de Entrada/Salida en el cdigo, aada la directiva
{$I+} o {$IOCHECKS ON} en la parte superior de la unidad en la que desea
activar la verificacin de Entrada/Salida. Esto no es necesario hacerlo a menos
que haya deshabilitado la opcin anteriormente, ya que por defecto est
habilitada.
EIntOverflow
Consulte Arithmetic Overflow Error.
EInvalidCast
Consulte Invalid typecast.
EInvalidGraphic
Posible causa de error
Puede haber intentado cargar un archivo que no es un .BMP, .ICO o .WMF en
un objeto que espera un grfico vlido de Delphi. Por ejemplo, las dos lneas
siguientes generaran este error, ya que .JPG y .GIF no son formatos grficos
nativos de Delphi:
Mensajes de error
207
Image1.Picture.LoadFromFile('Kangaroo.jpg');
Image1.Picture.LoadFromFile('ChoosyMothersChooseSkippyNot.gif');
Solucin rpida
Cargue nicamente mapas de bits (.BMP), iconos (.ICO) y metaarchivos (.EMF
y .WMF) en objetos TPicture.
Informacin adicional
Para ms informacin, consulte TImage, TPicture, TGraphic, TBitmap,
TIcon, y TMetafile en la ayuda de Delphi.
EInvalidGraphicOperation
Posible causa de error
Puede haber intentado ejecutar una operacin invlida sobre un objeto grfico.
Por ejemplo, intentar redimensionar un icono generara este error:
Image1.Picture.Icon.Height := 36;
Solucin rpida
No intente modificar el tamao por defecto de un icono, que es de 32 x 32
pxeles para iconos convencionales y 16 x 16 pxeles para iconos pequeos.
Informacin adicional
Para ms informacin, consulte el mensaje de error Cannot change the size
of an icon.
EInvalidOp
Consulte Invalid floating point operation.
208
EInvalidPointer
Consulte Invalid pointer operation.
Solucin rpida
Utilice la funcin Length y el procedimiento SetLength para llevar a cabo la
misma tarea en Delphi de 32 bits. Para almacenar la longitud de una variable
de cadena en una variable entera, haga esto:
procedure FindStringLength;
var
s : String;
StrLength : Integer;
begin
s := 'HowMuchIsThatPCInTheWindow';
StrLength := Length(s);
end;
Mensajes de error
209
Informacin adicional
El tipo de cadena nativo en Delphi de 32 bits no almacena la longitud de la
cadena en el elemento 0, como es el caso en Turbo Pascal y Delphi 1. Esta es la
razn por la cual intentar obtener o asignar la longitud de la cadena a travs
del elemento 0 no funciona y no est permitido.
S puede asignar cualquier elemento vlido de una cadena (con ndice distinto
de 0) a otra cadena, por ejemplo:
var
s,t: string;
begin
s := 'Are you just stringing me along?';
t := s[1];
end;
Solucin rpida
Elimine el elemento que causa el problema.
Informacin adicional
Podra usted preguntarse por qu el mensaje de Delphi no es ; expected but
<> found. Delante de la palabra reservada End, el punto y coma es innecesario (aunque inofensivo); por lo tanto, el compilador no lo espera.
210
Solucin rpida
Termine la declaracin de tipo con la palabra reservada End.
Informacin adicional
Una declaracin de tipo debe tener la siguiente estructura:
type
WhateverYouWant = class
FWhateverYouWant: Boolean;
procedure WhateverYouSay(widget: Integer);
end; {no olvide este End al final!}
Solucin rpida
1. Asegrese de que cada Begin tiene su End correspondiente.
2. Aada End a cada sentencia Case y bloque Try. . . Finally y Try. . . Except.
3. Si tiene una llave izquierda ({ ) sin pareja, elimnela si no desea comentar
nada, o aada una llave derecha ( }) al final de la seccin que desea
comentar.
Informacin adicional
Puede tambin comentar cdigo en Delphi de 32 bits con los dos barras al
estilo de C++. Por ejemplo:
//Este es un comentario. Explique el cdigo aqu.
Aconstmbrese a aadir un End tan pronto como codifique un Begin, una sentencia Case, un bloque Try. . . Finally o un bloque Try. . . Except. Luego vuelva
atrs y rellene el contenido de la sentencia. Tambin, indente el cdigo de tal
manera que los bloques Begin. . . End se puedan diferenciar visualmente y sea
fcil determinar qu Begin corresponde a un End determinado.
Mensajes de error
211
EOLEError
Consulte Class not registered.
EOLEException
Consulte OLE error 800A03EC.
EOleSysError
Consulte Error loading type library/dll.
212
EOleSysOperation Unavailable
Posible causa de error
Puede estar llamando a un mtodo de un servidor de automatizacin OLE que
no est ejecutndose. Por ejemplo, lo siguiente generar este error si Word no
est ejecutndose en el momento de la llamada:
procedure TForm1.StartThatHog(Sender: TObject);
var
Ovari: OleVariant;
begin
Ovari := GetActiveOleObject('Word.Basic');
Ovari.FileNew;
Ovari.Insert('OLE! Muere la tarde);
end;
Solucin rpida
Asegrese de que el servidor de automatizacin est ejecutndose antes de
intentar acceder a sus mtodos. Puede hacerlo mediante el mtodo
CreateOLEObject:
procedure TForm1.StartThatHog(Sender: TObject);
var
Ovari: OleVariant;
begin
Ovari := CreateOLEObject('Word.Basic');
Ovari.FileOpen('SunNumTu');
Ovari.Insert('Kelvin Caleb Mordecai Shannon');
end;
Informacin adicional
Si va a utilizar un servidor de automatizacin ms de una vez en la aplicacin,
puede evitar mltiples cargas y descargas del servidor declarando a nivel global una variable de tipo OleVariant e instancindola en el evento OnCreate del
formulario.
EOutOfMemory
Posible causa de error
Puede haber intentado reservar ms memoria de la que est disponible.
Mensajes de error
213
Solucin rpida
Si es posible, equipe su ordenador con al menos 32 MB de RAM. Mantenga
libre al menos el 10 por ciento del disco duro vaco, de manera que pueda ser
utilizado para memoria virtual.
Informacin adicional
Para ms informacin, consulte out of memory en la ayuda de Delphi.
EOutOfResources
Posible causa de error
1. Puede estar (directamente o indirectamente) intentando crear un manejador (handle) de ventana, pero la cantidad mxima de manejadores ya est
siendo utilizada.
2. Una funcin de la API de Windows que ha llamado directa o indirectamente puede haber fallado.
3. A pesar del mensaje, puede haber un error en el controlador de pantalla
que est utilizando, especficamente si est operando en modo avanzado
(32 KB 64 KB colores).
Solucin rpida
1. Mantenga el nmero de controles de ventana (clases descendientes de
TWinControl) en un mnimo. Utilice controles grficos donde sea posible
(ya que no requieren un manejador de Windows). Cree los formularios
dinmicamente siempre que sea posible.
2. Consulte la ayuda de la API Win32 (Win32.HLP) que viene con Delphi
para obtener ms informacin sobre la llamada particular. Si no le aclara
suficientemente, podra considerar comprar Los Tomos de Delphi: Ncleo
del API Win32 (editado por Danysoft Internacional,que puede encontrar en
www.danypress.com).
3. Cambie al controlador VGA estndar de Windows, o a un modo menos
potente de su controlador. Si no sabe cmo hacerlo, consulte la documentacin de Windows.
Informacin adicional
2. Un ejemplo de esto es una llamada a GetDeviceContext de TWinControl,
que a su vez llama a la funcin GetDC de la API de Windows.
214
ERangeError
Consulte Range check error.
EReadError
Posible causa de error
Los archivos .PAS y .DFM no estn sincronizados. Especficamente, el archivo
.DFM puede contener una referencia a algo que no existe en el archivo .PAS.
Solucin rpida
Borre las referencias a los mtodos o propiedades que haya borrado del archivo
de unidad (.PAS) que existan en el archivo de formulario (.DFM).
Informacin adicional
Si borra un gestor de eventos existente, Delphi le preguntar cuando compile
The <> method referenced by <>.<> does not exist. Remove the reference? Si selecciona No, obtendr este error. Al seleccionar Yes, el mtodo
Button1Click (o cualquier mtodo o propiedad que haya borrado) ser eliminado tambin del archivo de formulario (.DFM).
Consulte Invalid property value o Error reading <>.<>: <>
(dependiendo del mensaje de error especfico que acompae al mensaje de error
genrico EReadError).
ERegistryException
Posible causa de error
Puede haber llamado a ReadBinaryData y asignado un tamao muy pequeo
al argumento Buffer.
Mensajes de error
215
Solucin rpida
Incremente el tamao del argumento Buffer.
Informacin adicional
Encierre la operacin en una sentencia Try. . . Finally para liberar el objeto
TRegistry en caso de una excepcin.
Consulte Failed to get data for <>.
EResNotFound
Posible causa de error
1. Puede haber borrado o modificado la directiva de recursos {$R *.DFM} del
archivo del formulario.
2. Puede haber cambiado el nombre del formulario principal en el cdigo.
3. Puede estar intentando cargar recursos propios, pero ha olvidado aadir
{$R <NombreArchivo>.RES} en el archivo de proyecto.
Solucin rpida
1. Restaure la directiva {$R *.DFM} en el archivo de unidad del formulario
(.PAS). Si no tiene una clusula Uses en la seccin Implementation, debe
ubicar la directiva detrs de la palabra reservada Implementation, as:
implementation
{$R *.DFM}
2. Aunque puede hacerlo, es mejor evitar cambiar los nombres de los objetos
directamente en el cdigo.
3. Aada {$R <NombreArchivo>.RES} en el archivo de proyecto (.DPR).
Informacin adicional
La directiva {$R *.DFM} enlaza el archivo de formulario (.DFM) con el archivo
de unidad (.PAS). Es una parte necesaria en toda unidad de formulario. Una
unidad pura (creada con New | Unit en lugar de New | Form) no contiene
ninguna directiva {$R *.DFM}, y su contenido inicial es mnimo:
unit Unit2;
216
Solucin rpida
Instale el Internet Explorer desde el CD de Delphi, o copie las DLLs directamente desde \RunImage\Delphi X\Windows\System32.
Informacin adicional
Consulte Could not load RLINK32.DLL.
Mensajes de error
217
218
Mensajes de error
219
Solucin rpida
1. Si est utilizando un componente TQuery y la sentencia SQL no es una
sentencia SELECT, utilice el mtodo ExecSQL en lugar del mtodo Open.
Por ejemplo, si el componente TQuery se llama Query1, utilice:
Query1.ExecSQL;
en lugar de:
Query1.Open;
Informacin adicional
2. Los procedimientos almacenados son sentencias SQL compiladas que se
ejecutan en el servidor. Son mucho ms rpidas que una sentencia SQL
220
Solucin rpida
No cambie el nombre del formulario principal en tiempo de ejecucin. Si quiere
cambiar el nombre del formulario, hgalo en tiempo de diseo.
Informacin adicional
Cmo se sentira si un miembro de su familia fuera por ah cambindose el
nombre en ocasiones supuestamente aleatorias?
Solucin rpida
Aada los formularios ancestros al proyecto utilizando Project | Add to
Project.
Informacin adicional
Otra solucin consiste en abrir los formularios ancestros en el editor antes de
abrir los formularios descendientes.
Mensajes de error
221
Solucin rpida
Sustituya el TTabbedNotebook por un TPageControl.
Informacin adicional
Solamente obtendr este error en Delphi de 32 bits (Delphi 1 no soporta la
herencia visual de formularios). Delphi de 32 bits proporciona el componente
TPageControl, que puede ser utilizado en lugar del componente
TTabbedNotebook.
Solucin rpida
Asegrese de que todos los componentes tienen nombre. Delphi slo permite
tener un componente sin nombre hasta que se intente hacer referencia a l, ya
sea directa o indirectamente.
Informacin adicional
Delphi 2 introdujo la herencia visual de formularios. Incluso en Delphi 1, un
formulario poda heredarse de un ancestro, pero esto tena que hacerse
mediante cdigo. En Delphi de 32 bits, se puede heredar visualmente de
formularios.
Siga estos pasos para crear un formulario ancestro:
1. Cree un formulario que incorpore todos los elementos comunes que desee
incluir en los formularios descendientes.
222
2.
3.
4.
5.
6.
7.
8.
Mensajes de error
223
Solucin rpida
Localice el archivo .DFM especificado en el mensaje de error y muvalo al
directorio donde reside el resto del proyecto.
Si el archivo ya estaba en el mismo directorio que el resto del proyecto, abra el
archivo .DFM con un editor de texto (como el Bloc de Notas) y compruebe los
errores.
Informacin adicional
El archivo de formulario (.DFM) es una representacin textual del formulario.
Contiene las definiciones de los objetos que estn sobre el formulario, dnde
estn situados esos objetos (sobre el formulario) y los valores de sus
propiedades.
Esta informacin es almacenada para que el formulario puede ser recreado
cuando usted lo abra. Si el formulario contiene errores, se ha daado o ha sido
movido, Delphi no podr abrir el formulario para crearlo, ya que no sabr cmo
ensamblarlo. El proceso mediante el cual se realiza la grabacin y carga del
formulario se conoce como streaming.
Despus de mostrar este mensaje de error, el proyecto, junto con el archivo
.PAS correspondiente (el cdigo asociado al formulario), ser abierto. Sin
embargo, cualquier intento de ver la representacin visual del formulario
fallar, ya que para ello es necesaria la informacin contenida en el archivo
.DFM.
Solucin rpida
Pulse el botn OK, y luego Build All. Para construir todo en Delphi 1 y 2,
seleccione Compile | Build All. En Delphi 3, seleccione Project | Build All.
224
Informacin adicional
Los recursos de 16 bits y de 32 bits son como el agua y el aceite no se mezclan. Es decir, no puede utilizar recursos de 16 bits en Delphi de 32 bits, ni
puede utilizar recursos de 32 bits en Delphi de 16 bits (Delphi 1).
Consulte Duplicate resource.
Solucin rpida
Utilice la utilidad de conversin de Delphi para convertir los archivos de formulario (.DFM) en el proyecto desde texto a la versin .DFM esperada. Puede
hacerlo siguiendo estos pasos:
1. Abra el proyecto con la versin de Delphi con la que cre el proyecto. Si no
lo ha hecho antes, guarde los archivos de formulario en formato binario
(pulsando con el botn derecho sobre el formulario y desmarcando la opcin
Text DFM si est seleccionada).
2. Compile el proyecto.
3. Ejecute la versin de convert.exe de la versin anterior de Delphi a la
cual quiere portar haca atrs su aplicacin. Por ejemplo, si quiere compilar un proyecto creado en Delphi 5 en Delphi 3, ejecute la utilidad convert
que est por defecto instalada en C:\Archivos de programa\Borland\
Delphi3\bin.
4. Abra una ventana DOS y vaya al directorio que contiene la utilidad convert
de Delphi 3. Por ejemplo, para convertir los archivos .DFM que residen en
un directorio denominado ConvertMe a texto, introduzca el comando
convert C:\ConvertMe\*.dfm.
Ahora tendr versiones .TXT de esos archivos de formulario.
5. Abra los archivos de texto (con el Bloc de Notas, WordPad u otro editor
cualquiera) y haga los cambios necesarios. Por ejemplo, si el archivo de formulario contiene referencias a propiedades que no existen en la versin
anterior de Delphi, elimnelas.
Mensajes de error
225
6. Convierta los archivos .TXT a .DFM utilizando el mismo comando, reemplazando dfm por txt: convert C:\ConvertMe\*.txt.
Ahora tendr una versin binaria (*.DFM) de los archivos de formulario en
el formato esperado por la versin anterior de Delphi.
7. Copie los archivos de formulario a una ubicacin separada y aada sus
correspondientes archivos .PAS (y el .DPR). Ahora deber poder abrir el
proyecto y ejecutarlo en la versin anterior de Delphi.
Informacin adicional
Desde Delphi 5, los archivos de formularios pueden ser almacenados como
archivos de texto o binarios (antes de Delphi 5, eran binarios solamente).
Si un formulario ha sido guardado como archivo binario en Delphi 5 o superior,
el problema es bsicamente el mismo, pero el mensaje de error es Error reading <>. Property does not exist. Si el formulario ha sido grabado como
texto (como se ha mencionado, una opcin disponible desde Delphi 5), obtendr
este mensaje de error.
Consulte Error reading <>. Property does not exist.
Solucin rpida
En Windows NT, haga la referencia sin la extensin .DLL. Por ejemplo, la
siguiente es la sintaxis apropiada para Windows NT:
procedure HawaiianPunch; external pineappl';
Informacin adicional
Si sta no es la causa del problema, intente ejecutar el programa fuera del
entorno integrado de Delphi. Windows puede darle un mensaje ms detallado,
como el nombre de la .DLL que necesita.
226
Solucin rpida
Utilice el tipo de datos varOLEStr para crear un array variante de cadenas,
as:
procedure TForm1.Button1Click(Sender: TObject);
var
Roster: Variant;
begin
Roster := VarArrayCreate([0,3], varOLEStr);
. . .
Informacin adicional
Para ms informacin, consulte VarArrayCreate y VarArrrayOf en la ayuda
de Delphi.
Solucin rpida
No hay realmente una solucin rpida para esto. Elimine cualquier control
extrao que pueda tener. Vea en la seccin de Informacin Adicional ms abajo
algunos trucos para recuperar algunos de los manejadores de ventana que est
utilizando.
Informacin adicional
Este error es causado generalmente porque la aplicacin est utilizando todos
los manejadores de ventanas disponibles. Cada control de ventana (controles
Mensajes de error
227
Solucin rpida
Construya la aplicacin (utilizando Project | Build en lugar de Project |
Compile o Run | Run (F9)).
Si esto no ayuda, borre todos los archivos, exceptuando los de extensin .DPR,
.PAS, .DFM y .RES.
Informacin adicional
Despus de cadas particularmente graves, es muy til algunas veces cerrar
Delphi y luego reiniciarlo.
228
Solucin rpida
Utilice la sintaxis apropiada. En el ejemplo de arriba, sera:
with TADOQuery.Create(nil) do
try
Connection := ADOConnection1;
SQL.Add('CREATE INDEX ORD_SEQ ON SCRIPTURES(ORDER_SEQUENCE)');
ExecSQL;
finally
Free;
end;
Informacin adicional
Utilice la referencia del lenguaje SQL de la base de datos que est utilizando
para determinar la sintaxis correcta. La sintaxis es usualmente la misma para
las distintas bases de datos, pero hay variaciones. Si no tiene o no puede
encontrar la documentacin del SQL de la base de datos, puede intentar buscar
un ejemplo en su disco duro, o tambin podra encontrar un ejemplo buscando
en Internet (como www.tamaracka.com o www.google.com). Por ejemplo, en el
caso de arriba busque CREATE INDEX.
Mensajes de error
229
Solucin rpida
Instale el BDE. Consulte el fichero deploy.txt en C:\Archivos de programa\
Borland\Delphi X.
Informacin adicional
Cuando se instala Delphi, el BDE tambin se instala. Puede fcilmente crear
una aplicacin de base de datos con Delphi, y luego copiar el archivo .EXE e
incluso los archivos de base de datos a otra mquina, esperando que todo funcionar bien en la mquina donde la ha instalado. Sin embargo, como la Solucin Rpida indica, esto no es suficiente.
230
Solucin rpida
Verifique que STDVCL[32,40].DLL est en \Windows\System y haya sido
registrado.
Informacin adicional
Para registrar servidores en su sistema, puede utilizar la utilidad Turbo
Register Server (TRegSvr), que es un programa de demostracin de Delphi
ubicado por defecto en C:\Archivos de programa\Borland\Delphi X\
Demos\ActiveX\TRegSvr.
Para hacerlo, siga estos pasos:
1. Abra el archivo TRegSvr.DPR.
2. Construya el proyecto.
3. Active una sesin de DOS o abra una ventana de DOS.
4. Navegue hasta el directorio en el que est ubicado TRegSvr.
5. Introduzca el siguiente comando: TRegSvr STDVCL.DLL
(STDVCL40.DLL para Delphi 4, 5, 6 o superior).
6. Pulse la tecla Intro.
Turbo Register Server acepta tres opciones:
-u
-q
-t
Para registrar una biblioteca de tipos (esta es la accin por defecto; si
esto es lo que desea hacer, simplemente teclee el nombre del programa seguido
por el nombre del servidor, como se muestra en el ejemplo de arriba)
Solucin rpida
Desinstale el componente que causa el problema.
Si usted mismo ha creado el componente, reemplace las directivas External
(carga esttica de .DLLs) por llamadas a las funciones LoadLibrary y
GetProcAddress (carga dinmica de .DLLs).
Mensajes de error
231
Informacin adicional
Lo ms adecuado parece ser cargar las .DLLs dinmicamente, y no
estticamente.
Solucin rpida
1. Seleccione OK, y luego reinstale los componentes a los que el archivo de
formulario se refiere.
2. Seleccione OK. La referencia a la propiedad no existente ser eliminada
del archivo .DFM.
3. Seleccione OK, y luego siga estos pasos:
a. Pulse con el botn derecho del ratn sobre el formulario que contiene la
propiedad no existente y seleccione View As Text.
b. Edite el archivo .DFM que aparece para devolverlo a su estado original.
c. Pulse con el botn derecho del ratn sobre el arhivo de formulario
.DFM y seleccione View As Form.
d. Seleccione File | Close All, y guarde los cambios.
e. Vuelva a abrir el proyecto.
4. Asegrese de que la ubicacin de IDAPI32.CFG coincide con la indicada en
el Registro del sistema. Por defecto, la ubicacin de este archivo es
C:\Archivos de programa\Borland\Common files\BDE.
El Registro de Windows mantiene la informacin sobre dnde se encuentra
IDAPI32.CFG. Para ver en qu lugar ste se encuentra en su mquina,
siga estos pasos:
232
Navegue hasta
HKEY_LOCAL_MACHINE\Software\Borland\Database Engine.
El valor para CONFIGFILE01 mostrar el camino donde est situado el
archivo de configuracin. Si difiere de la ubicacin de su copia de
IDAPI32.CFG, mueva el archivo a la ubicacin apuntada por la clave anterior del Registro (recomendado), o cambie el valor de la clave para
adecuarlo a la ubicacin actual del archivo.
Informacin adicional
Consulte Stream Read Error.
Solucin rpida
1. Solamente cambie los componentes por componentes compatibles. Puede
cambiar, por ejemplo, un componente TEdit por un TDBEdit.
2. Abrir los proyectos de Delphi con versiones anteriores de Delphi no es recomendado. Sin embargo, puede seleccionar Yes para ignorar el error, y las
Mensajes de error
233
Informacin adicional
GExperts (disponible en www.gexperts.org) proporciona un Asistente llamado
ReplaceComponents que permite fcilmente sustituir componentes de un tipo
por otro. La sustitucin puede hacerse para todo un proyecto, para un formulario especfico o solamente para los controles que seleccione en el editor de formularios de Delphi.
Consulte Error Creating Form: Invalid Stream Format.
Solucin rpida
Asigne True a la propiedad HandleShared del componente TDatabase.
Informacin adicional
Para ms informacin, consulte HandleShared en la ayuda de Delphi.
Solucin rpida
Asigne True a la propiedad AutoSessionName del componente TSession.
234
Informacin adicional
Para ms informacin, consulte AutoSessionName en la ayuda de Delphi.
Solucin rpida
1. Pulse el botn OK para desechar el mensaje de error y luego seleccione
Project | Build <Proyecto>.
2. Pulse el botn OK para desechar el mensaje de error y luego seleccione
Project | Build <Proyecto>.
3. Borre los archivos .DSM y .DSK del proyecto, o simplemente ignore el mensaje (seleccione OK para desechar el mensaje).
4. Abra el archivo .DSK del proyecto y vaya a la seccin Symbols. Haga las
modificaciones necesarias para hacer referencia a los directorios correctos.
Informacin adicional
Para evitar que aparezca este mensaje de error, puede borrar el archivo .DSM
antes o despus de mover el proyecto.
Para cada proyecto de Delphi, se crearn algunos archivos que no deben ser
borrados, en particular los archivos .PAS, .DFM y .DPR. Otras archivos, sin
embargo, sern regenerados automticamente cada vez que compile, as que
pueden ser borrados sin ningn problema. Entre estos se encuentran, en
dependencia de la versin de Delphi, los archivos de extensin .OPT, .DSK,
.DSM, .RES y .DOF. Adicionalmente, la versin anterior a la ltima guardada
de los archivos de formulario (.DFM), de proyecto (.DPR), Pascal (.PAS), y, en
Delphi 3 y 4 (cuando sea apropiado), de bibliotecas de tipos (.TLB) se guardan
con una extensin que comienza con una tilde (~) seguida por las dos primeras
letras de la extensin normal. Por ejemplo, los archivos de resguardo de los
archivos .PAS tienen la extensin .~PA. De esta manera, siempre se puede volver a la versin anterior de uno de esos archivos, si es necesario, cambiando la
extensin de sta a su formato habitual.
Mensajes de error
235
Solucin rpida
Instale Internet Explorer desde el CD de Delphi (no est disponible en todas
las copias de Delphi) o copie directamente las .DLLs de OLE desde el directorio
\RunImage\DelphiX\Windows\System32.
Informacin adicional
Consulte Could not load RLINK32.DLL y Error 0: RLINK32 Error opening file <TypeLibrary>.tlb.
Solucin rpida
1. Seleccione OK, pulse Ctrl+F2 o Alt+R+E, y luego seleccione Project |
Build All.
2. Si tiene los archivos fuente correspondientes (.PAS), borre los archivos de
unidad compilados (.DCU) y reconstryalos. Las unidades compiladas
sern regeneradas automticamente a partir de los archivos fuentes.
Informacin adicional
Nunca borre un archivo de proyecto .DPR, .PAS (fuente Pascal) o .DFM (de formulario). La mayora de los dems archivos sern regenerados automticamente por Delphi sin intervencin o interaccin alguna del programador. Por
supuesto, si borra los archivos que contienen las opciones de compilacin que
ha especificado para la aplicacin, deber especificar esas opciones de nuevo.
Un ejemplo de este tipo de archivo es el archivo de recursos del proyecto, que
tiene el mismo nombre base que el proyecto y la extensin .RES. Este archivo
almacena el nombre que aparecer debajo del icono de la aplicacin, el propio
icono y el archivo de ayuda del proyecto. Borrar tales archivos es algunas veces
necesario (consulte Error reading symbol file) y solamente una molestia
(pero nunca un desastre) reconstruirlos.
236
Solucin rpida
Trate de obtener una .DLL de 32 bits que sustituya a la de 16 bits.
Informacin adicional
Cuando porte su aplicacin de 16 a 32 bits, deber tener en cuenta todos los
archivos complementarios y componentes que su aplicacin necesita.
EStackOverflow
Consulte Stack overflow.
EStringListError
Consulte List index out of bounds.
EThread
Posible causa de error
1. Puede tener un hilo principal que ha llamado al mtodo WaitFor, y
posteriormente otro hilo ha llamado al mtodo Synchronize.
2. Puede tener un hilo que ha llamado al mtodo Synchronize, y luego el hilo
principal ha llamado al mtodo WaitFor.
Solucin rpida
Elimine en el hilo principal la llamada a WaitFor y/o la llamada al mtodo
Synchronize del otro hilo.
Informacin adicional
No se puede desarrollar aplicaciones multi-hilo en Delphi 1. Para ms
informacin sobre una manera alternativa de ejecutar procesamiento en
segundo plano, consulte OnIdle en la ayuda de Delphi.
Mensajes de error
237
EVariantError
Posible causa de error
Puede haber intentado hacer una referencia a un valor Null de un conjunto
resultado. Por ejemplo, lo siguiente generar este mensaje de error si el valor
del campo ExpendableIncome para el registro actual es Null:
var
i: Integer;
begin
i := Query1['ExpendableIncome'];
Solucin rpida
Puede comprobar el resultado para ver si es Null, y solamente asignarlo a la
variable si no lo es, as:
if not VarIsNull(Query1['ExpendableIncome']) then
i := Query1['ExpendableIncome']
else
i := 0;
Informacin adicional
La propiedad FieldValue de TDataset retorna un valor de tipo Variant, como
se puede deducir del cdigo de arriba. Es menos conveniente pero ms rpido
hacer la referencia a los campos de un conjunto resultado en su formato nativo,
por ejemplo:
bs := Query1['ExpendableIncome'].AsString;
FieldValues es la propiedad por defecto de TDataset; por esa razn no es necesario hacer la referencia explcitamente. En otras palabras, las siguientes dos
asignaciones ejecutan la misma accin:
i := Query1['ExpendableIncome'];
i := Query1.FieldValues(['ExpendableIncome']);
238
Solucin rpida
1. Si utiliza la palabra reservada Try, deber utilizar la palabra reservada
Finally o la palabra reservada Except.
2. Elimine uno de los parntesis al final de la lnea, de tal manera que el
cdigo se lea:
sl[BillToNamePos] := PadL(sl[BillToNamePos],50);
Informacin adicional
Las sentencias Try. . . Finally se utilizan generalmente para asegurar que los
recursos asignados sean siempre liberados (porque la parte Finally siempre es
ejecutada). Esta es la razn por la que los bloques Try. . . Finally son conocidos
como bloques de proteccin de recursos. Un bloque Try. . . Finally tpico podra
ser :
var
Feed: TStrings;
begin
Feed := TStringList.Create;
try
Feed.Add('PurinaHyenaChow');
Feed.Add('PurinaPteradactylChow');
Feed.Add('PurinaChowChow');
Feed.Add('CiaoBaby');
finally
Feed.Free;
end;
end;
Mensajes de error
239
Solucin rpida
Como este es un mensaje de error muy genrico, tendr que ir estrechando el
cerco para determinar dnde se est produciendo la excepcin. Asegrese de
que tiene activada la opcin Break on Exceptions (vea la ayuda de Delphi
para detalles concretos, ya que es una opcin especfica a cada versin).
Informacin adicional
TApplication.HandleException llama a ShowException, que a su vez llama a
ExceptionErrorMessage, que muestra este mensaje.
Solucin rpida
Aada el parntesis faltante:
procedure CalculateDueDate(AAgencyID, AEmployerID: Integer;
APayrollDate: TDate);
Informacin adicional
Al parecer, hay infinitas formas de equivocarse en la sintaxis.
240
Solucin rpida
Sustituya la tabla que causa el problema por su ltima copia de seguridad.
Informacin adicional
Puede que sea necesario simultneamente reemplazar los archivos de Paradox
complementarios, como los archivos de ndice (.PX).
Solucin rpida
Mueva la clusula Exports a una seccin global. Por convenio, est situada
inmediatamente antes de la seccin Initialization de la unidad (si existe una);
en caso contrario, sitela antes del End final.
Informacin adicional
La clusula Exports es utilizada en las .DLLs, para que los procedimientos y
funciones estn disponibles a los mdulos externos. Entonces se podr acceder
a esos procedimientos y funciones utilizando LoadLibrary (o LoadLibraryEx) y
GetProcAddress.
2. Puede estar intentando asignar una fraccin a un nmero real/punto flotante (o una hora en una variable TDateTime), pero ha olvidado anteponer
Mensajes de error
241
un nmero al punto decimal. Debe incluir algn dgito (aunque sea el cero),
para que el compilador acepte esta asignacin. Por ejemplo, la siguiente
asignacin genera este mensaje de error:
MediocreBattingAvg := .246;
3. Puede haber intentado declarar una clase en una seccin Const, as:
const
TForm1 = class(TForm)
Solucin rpida
1. Proporcione una expresin en el lugar donde el compilador gener el mensaje de error. En este ejemplo, borre el signo ms (+) o aada otra
constante o variable. IntToStr(1) o IntToStr(1+2) estn bien.
2. Aada un dgito (como 0) antes del punto decimal de esta manera:
MediocreBattingAvg := 0.246;
Informacin adicional
3. Los tipos deben ser declarados en secciones Type, y las instancias de tipos
en secciones Var, como lo hace Delphi automticamente cuando crea un
formulario:
type
TForm1 = class(TForm)
. . .
var
Form1: TForm1;
Solucin rpida
Desinstale los componentes aadidos recientemente hasta que el problema
desaparezca. Para desinstalar un componente del entorno integrado de Delphi
en tiempo de diseo, siga estos pasos:
1. Seleccione Component | Install Packages.
2. Desmarque la casilla de verificacin correspondiente al paquete que desea
eliminar, o seleccinelo y pulse el botn Remove.
242
Informacin adicional
Siempre podr aadir de nuevo aquellos paquetes que haya eliminado invirtiendo el proceso:
1. Seleccione Component | Install Packages.
2. Pulse el botn Add.
3. Abra el archivo .BPL apropiado.
Solucin rpida
No estoy seguro de por qu, pero en una ocasin resolv este problema cambiando el valor de la propiedad OldCreateOrder de un formulario de False a
True.
Informacin adicional
Si obtiene Internal error, es ciertamente un fallo de Delphi.
Solucin rpida
Tiene muchas opciones para remediar este problema; utilice cualquiera de las
siguientes soluciones. La primera es la recomendada por el soporte de Oracle.
a. En Regedit, navegue hasta
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ OTRACE73 y
renombre esta entrada o elimnela.
b. Elimine Oracle Trace Collection Services 7.3.3.x.x utilizando el
Instalador de Oracle.
c.
Mensajes de error
243
Informacin adicional
NT 4 informa de todas las excepciones que se disparan durante la depuracin
(incluso las excepciones que normalmente se ignoraran).
F004
Posible causa de error
Puede estar intentando instalar Delphi/400 y est utilizando el protocolo SNA
y se cumple una de las siguientes condiciones:
El servidor SNA no est ejecutndose.
Ha sobrepasado la cantidad de licencias de puestos SNA.
Solucin rpida
Dependiendo de la causa del problema, arranque el servidor SNA, eche a un
usuario del sistema o aumente la cantidad de licencias de puestos de trabajo.
Informacin adicional
Delphi/400 es una versin especializada de Delphi para interactuar con servidores AS/400. Para ms informacin, visite www.danysoft.com.
244
Solucin rpida
Verifique que el valor que est leyendo del Registro es del mismo tipo que la
variable o propiedad en la cual lo almacenar o asignar. Puede encerrar la
asignacin en un bloque Try. . . Except para atrapar este error, as:
function GoSeeCal: string;
var
ReggiesTree: TRegistry;
begin
ReggiesTree := TRegistry.Create;
try
ReggiesTree.RootKey := HKEY_CURRENT_USER;
try
ReggiesTree.OpenKey('\drmtmale\Baltimore Orioles', False);
Result := ReggiesTree.ReadString('ThirdBase');
except
on ERegistryException do
Result := '';
{manejo de excepciones adicional, si lo desea}
end;
finally
ReggiesTree.Free;
end;
end;
Informacin adicional
Este mensaje de error es descendiente de ERegistryException.
El Registro del sistema es mucho ms flexible que los archivos .INI que se utilizaban antes de Windows de 32 bits (y an disponibles en Windows de 32
bits). Mientras que solamente se pueden almacenar tres tipos de datos en los
archivos .INI (Bool[ean], Integer y String), el Registro soporta nueve tipos:
Binary, Bool[ean], Currency, Date, DateTime, Float, Integer, String y Time.
Mensajes de error
245
Solucin rpida
1. Borre el contenido de Params, llamando a CDS.Params.Clear.
2. Asigne a la propiedad IndexName del conjunto de datos el ndice con el que
quiere trabajar.
Informacin adicional
Consulte IndexName en la ayuda de Delphi para ver ejemplos de cmo modificar esta propiedad en tiempo de ejecucin utilizando el componente
TClientDataSet.
Solucin rpida
1,2. Utilice solamente campos de datos estticos cuyos valores puedan ser cuantificados a travs de expresiones de filtro tipo SQL.
Informacin adicional
1. En la tabla Country de Paradox que viene con Delphi, lo siguiente es permitido en una expresin de filtro:
Name = 'Bolivia' OR 'Brazil' OR 'Paraguay'
246
a:
type
TForm3 = class(TForm)
abel1: TLabel; {borr la L de Label1}
Solucin rpida
1. Seleccione Yes para borrar la declaracin.
Mensajes de error
247
Informacin adicional
5. Es ms comn aadir tipos de clase en la seccin Type de una unidad de
componente que en una unidad de formulario. As es como se crean los
componentes compuestos.
Para ms informacin sobre otras situaciones y mensajes de error relacionados
consulte Class <> not found. Ignore the error and continue? y Error
reading <>.
248
Solucin rpida
Cuando acceda a tablas locales (Paradox o dBASE), asegrese de que los campos sobre los que va a realizar bsquedas estn indizados y que la propiedad
IndexName del componente TTable apunte a ese campo.
Si quiere buscar por una clave primaria (simple o compuesta), asigne el nombre del campo a la propiedad IndexFieldNames. Si es una clave primaria compuesta, separe los nombres de campos mediante punto y coma. Puede realizar
esta asignacin en el entorno integrado o en el cdigo, as:
IndexFieldNames := 'Apellidos;Nombre';
Informacin adicional
Si est utilizando una base de datos de servidor SQL (InterBase, Oracle, MS
SQL Server, etc.), puede establecer un rango o hacer una bsqueda sobre cualquier campo, est indizado o no. En tales casos, asigne el nombre del campo
sobre el que desea establecer el rango o buscar a la propiedad IndexFieldNames del objeto TTable.
Solucin rpida
Borre las definiciones obsoletas de los campos de la tabla y sustityalas por
otras actualizadas. Puede hacer esto siguiendo estos pasos:
1. Pulse el botn derecho del ratn sobre el componente TTable que contiene
el campo que ha sido borrado o modificado.
2. Pulse el botn derecho del ratn sobre la lista de campos y seleccione
Delete del men de contexto.
3. Pulse el botn derecho del ratn sobre la ventana ahora vaca y seleccione
Add Fields para crear las instancias para las nuevas definiciones.
Mensajes de error
249
Informacin adicional
Algunas veces podr tener referencias extraviadas a componentes o sus propiedades en el archivo de formulario (.DFM). Siempre puede comprobar el archivo
de formulario pulsando el botn derecho del ratn sobre el formulario y seleccionando View as Text del men de contexto. Busque cualquier componente o
propiedad que no pertenezca o cuya configuracin no corresponda con lo que
debera ser. Por ejemplo, un objeto correspondiente a un campo de base de
datos es representado as:
object Table1RptFileName: TStringField
FieldName = 'RptFileName'
Required = True
Size = 6
end
Si los valores de las propiedades no se corresponden con las propiedades actuales del campo, borre o modifique esta entrada si es necesario.
Solucin rpida
1. El parmetro no es reconocido por el editor SQL. Para propsitos de
prueba, sustituya el parmetro por un valor cualquiera. Por ejemplo:
select
SCRIPT_ID,
SCRIPT_DESC,
250
Informacin adicional
2. Microsoft Access desafa la convencin habitual de SQL y utiliza el signo
almohadilla (#) en lugar de las comillas para encerrar los valores de tipo
Date y TimeStamp (Qu? Microsoft establece sus propios estndares!
Inconcebible!). Esto provoca el problema.
Solucin rpida
Mantenga actualizado todo su software las herramientas de conectividad,
clientes de base de datos, DLLs, actualizaciones de componentes de terceros y
el propio Delphi.
Informacin adicional
Consulte el artculo de Dan Miser The Upgrade Game disponible en
http://www.delphizine.com/opinion/1998/04/di199804ft_o/di199804ft_o.asp, que
da argumentos firmes sobre las ventajas de mantenerse actualizado.
Mensajes de error
251
Solucin rpida
Proporcione valores para todos los campos obligatorios (o NOT NULL) antes de
intentar grabar el registro.
Informacin adicional
El campo mencionado en el mensaje de error fue diseado como un campo obligatorio cuando se cre la tabla local (Paradox, dBASE, etc.) utilizando el Database Desktop, o cuando la tabla fue creada mediante cdigo de Object Pascal.
Alternativamente, si est utilizando una base de datos de servidor (InterBase,
Oracle, MS SQL Server, etc.), el campo fue diseado como obligatorio al definirlo como NOT NULL.
Si quiere verificar y manejar este incidente usted mismo (en lugar de permitir
que Delphi lo maneje, proporcionndole el mensaje de error bajo discusin),
puede hacer una validacin a nivel de registro utilizando el evento BeforePost
del componente TTable, una validacin a nivel de campo utilizando el evento
OnValidate de TField, o una validacin a nivel de carcter utilizando la propiedad EditMask del TField. Si cualquiera de estas validaciones falla, puede
hacer que el cursor aparezca sobre el campo que provoca el problema. Para
ms informacin sobre cmo ejecutar estas verificaciones de validacin, consulte A value must be specified for <>.
Puede designar como obligatorio un campo TField que haya sido creado en
tiempo de diseo a travs de su propiedad Required. Puede tambin proporcionar un valor por defecto para los descendientes de TField a travs de la propiedad DefaultExpression. Si hace esto, el campo tendr un valor por defecto, de
tal forma que no tendr que preocuparse por este mensaje de error a menos
que el valor por defecto sea borrado.
Si crea una tabla mediante cdigo, puede indicar que un campo es obligatorio
asignando el valor True al cuarto parmetro del mtodo FieldDefs.Add. Los
parmetros son el nombre del campo (String), su tipo de datos (TFieldType), su
tamao (Word), y si es o no obligatorio (Boolean). Por ejemplo, podra aadir el
campo as:
FieldDefs.Add('MrsLeppard',ftString,20,True);
252
Solucin rpida
1. Asegrese que cualquier campo al que haga referencia est correctamente
escrito y sea parte del conjunto de datos en cuestin.
2. Borre el valor situado en la propiedad Filter o asigne un filtro apropiado a
la tabla actual.
3. Despus de crear los campos en tiempo de diseo a travs del Editor de
Campos, brrelos antes de cambiar la propiedad TableName del componente TTable.
4. Verifique que el campo sobre el cual est intentando crear un ndice exista
en la tabla. Puede que sea necesario corregir el nombre, cambiar la propiedad Table del componente TTable o modificar la tabla.
5. Borre las declaraciones de descendientes de TField en el archivo de formulario (.DFM). Obtendr el mensaje Field <> does not have a
corresponding component. Remove the declaration? Seleccione Yes
siempre.
Informacin adicional
1. No se puede hacer referencia a un campo calculado o de bsqueda en la
propiedad Filter de un TDataset. Por ejemplo, si KnightsOfTheRound es
una tabla que tiene un campo llamado Address que hace referencia a un
Mensajes de error
253
3. Para borrar los campos que haya creado utilizando el Editor de Campos
(Fields Editor), siga estos pasos:
a. Haga doble clic sobre el componente TTable para activar el Editor de
Campos.
b. Pulse con el botn derecho del ratn en el Editor de Campos y
seleccione Select All.
c. Con todos los campos resaltados, pulse con el botn derecho del ratn
en el Editor de Campos y seleccione Delete.
4. Para informacin sobre cmo crear campos mediante cdigo, consulte
AddFieldDefs en la ayuda de Delphi.
5. Para ver el archivo de formulario (.DFM), pulse con el botn derecho del
ratn sobre el formulario y seleccione View As Text del men de contexto.
La informacin de TField que encontrar ah ser parecida a:
object Table1CustNo: TFloatField
FieldName = 'CustNo'
end
object Table1Company: TStringField
FieldName = 'Company'
Size = 30
end
Field <> should be of type <> but is declared as <>. Correct the
declaration?
Posible causa de error
1. Puede haber cambiado manualmente un archivo de formulario (.DFM). Por
ejemplo, puede haber cambiado un TEdit a TDBEdit despus de pulsar con
el botn derecho del ratn sobre el formulario y seleccionar View As Text,
y luego haber obtenido el mensaje de error Error reading <ComponentName>.<PropertyName>: Property does not exist. Ignore the error
and continue? NOTE: ignoring the error may cause components to
be deleted or property values to be lost al seleccionar View As
Form. Posteriormente recibi este mensaje de error tratando de compilar.
2. Puede haber reemplazado la declaracin de un componente de forma tal
que el tipo de componente actualmente declarado es distinto. Por ejemplo,
si coloc un TEdit en un formulario, este habr sido declarado como:
254
Solucin rpida
1. Seleccione Yes para corregir la declaracin del componente en el archivo
.PAS, para que el archivo .PAS y .DFM estn coordinados.
2. No modifique el cdigo que Delphi genera automticamente.
Informacin adicional
1. En el contexto particular mencionado arriba, el mensaje de error literal
sera Error reading Edit1.Text: Property does not exist. Ignore the
error and continue? NOTE: ignoring the error may cause components to be deleted or property values to be lost. Por supuesto, Edit1
es solamente Edit1 si es el primer componente que ha sido arrastrado
sobre el formulario, y usted no ha cambiado su nombre posteriormente.
Normalmente, los cambios que haga en el archivo .PAS (por ejemplo,
borrar un componente situado en el formulario) afectan al .DFM. En este
caso, es el .DFM el que ha sido modificado, y luego debe ser sincronizado
con el .PAS.
Vea en este libro la entrada Error reading <ComponentName or
FormName>.<Propertyname>. Property does not exist. Ignore the
error and continue? NOTE: ignoring the error may cause components to be deleted or property values to be lost.
2. Consulte Class <> not found.
Mensajes de error
255
Solucin rpida
Elimine el campo de la declaracin de interfaz. Las interfaces no almacenan
valores, y por lo tanto no pueden contener campos.
Informacin adicional
En lo que a m respecta, IUnknown es un nombre un poco ridculo para la
interfaz base. Lo siguiente, extrado del archivo SYSTEM.PAS de Delphi, es
mucho ms significativo:
IInterface = IUnknown;
Solucin rpida
1. Las definiciones de campo deben ser situadas antes de las declaraciones de
mtodos y propiedades.
2. No utilice estas directivas en una seccin Automated.
Informacin adicional
Este es un ejemplo del orden correcto para declarar un campo y un mtodo:
private
FAppraisedValue: Currency;
. . . {Campos adicionales}
procedure ShowListing;
. . . {Mtodos adicionales}
256
Solucin rpida
Si utiliza una clusula GROUP BY en una sentencia SQL, incluya todos los
campos de la parte SELECT en la parte GROUP BY (excluyendo las columnas
calculadas, como las creadas con las funciones de agregacin COUNT, SUM,
MIN, MAX y AVG). Por ejemplo, la sentencia de arriba necesita ser modificada
de la siguiente forma:
SELECT Title, Protagonist, Rating, Count(*)
FROM Movies
WHERE Protagonist = 'DeNiro'
OR Protagonist = 'Sinise'
GROUP BY Title, Protagonist, Rating
Informacin adicional
La sintaxis de SQL exacta requerida o permitida depende del tipo de base de
datos al que est accediendo y la versin del BDE que est utilizando. Para
detalles ms especficos, consulte la documentacin del servidor (si utiliza una
base de datos de servidor SQL) o el archivo de ayuda del SQL Local que viene
con Delphi (si utiliza Paradox o dBASE).
Solucin rpida
Verifique que el campo por el que est intentando ordenar (utilizando la clusula ORDER BY) est en alguna de las tablas especificadas en la clusula
FROM de la sentencias SQL, que el campo est incluido en la clusula
Mensajes de error
257
Informacin adicional
Para ordenar por un campo particular, el campo debe de estar incluido en el
conjunto resultado que es producido por la sentencia SQL. Por ejemplo, las
siguientes sentencias SQL producirn este mensaje de error:
SELECT Peaches, Strawberries
FROM Fruitstand
ORDER BY Bananas
Para aadir implcitamente el campo Bananas (as como los dems campos de
la tabla) a la clusula SELECT de la sentencia SQL, haga esto:
SELECT *
FROM Fruitstand
ORDER BY Bananas
258
Solucin rpida
1. Recuerde que en la VCL los elementos indizados se basan normalmente en
cero. El ejemplo de arriba debe ser modificado, restando 1 a la propiedad
IndexFieldCount si la variable de control del bucle For empieza con 0:
with Table1 do
for i := 0 to IndexFieldCount-1 do
. . .
Informacin adicional
1. Recuerde que los ndices, como todas las propiedades de tipo array, se indizan a partir de cero.
3. Los campos calculados no se almacenan realmente en la base de datos, a
menos que se asigne fkInternalCalc a la propiedad FieldKind.
Solucin rpida
Cambie el nombre de uno de los campos duplicados. En el ejemplo de arriba,
cambie el nombre del segundo campo de Address a Address2 (o cambie el primero a Address1 y el segundo a Address2).
Mensajes de error
259
Informacin adicional
Los atributos Type, Size y Key de los campos no tienen que coincidir para que
se produzca este mensaje de error siempre que los dos nombres sean iguales, este mensaje de error se generar.
Solucin rpida
1. Verifique que el campo que especific existe en la tabla.
2. Aada la constante ixExpression de tipo TIndexOption en el tercer parmetro (Options) del mtodo AddIndex de TTable, as:
with Table1
AddIndex('CityState', 'city+state', [ixExpression]);
Informacin adicional
El primer parmetro que se pasa al mtodo Addindex de TTable es el nombre
del ndice, el segundo es el nombre de los campos que componen el ndice, y el
tercero es un conjunto de valores TIndexOptions. Los valores vlidos dependen
del tipo de tabla que est indizando. Para ms informacin, consulte
AddIndex en la ayuda de Delphi.
260
2. Puede haber declarado un mtodo de escritura o lectura para una propiedad sin haber declarado el mtodo. Por ejemplo, lo siguiente generar este
mensaje de error si no ha declarado GetStartDate:
property StartDate: String read GetStartDate;
Solucin rpida
1. Utilice un campo o mtodo que haya sido previamente declarado como
parte de la clase. Por ejemplo, esto funcionar:
...
private
FRates;
public
...
published
property Rates: string read FRates write FRates;
Informacin adicional
1. Por convenio, los campos utilizados en las propiedades empiezan con la
letra F, y los mtodos utilizados en las propiedades comienzan por Get
para los mtodos de lectura y Set para los de escritura.
Es comn utilizar un campo en el especificador de acceso de lectura y un
mtodo en el especificador de acceso de escritura. Sin embargo, puede especificar un campo o un mtodo en ambas partes de una declaracin de
propiedad. Por ejemplo, una propiedad tpica puede ser declarada as:
property RealEstate: Currency read FRealEstate
write SetRealEstate;
aunque es permitido utilizar el mismo campo para ambas clusulas de lectura y escritura, as:
property RealEstate: Currency read FRealEstate
write FRealEstate;
Mensajes de error
261
Solucin rpida
Para ordenar por un campo calculado, asigne fkInternalCalc a la propiedad
FieldKind del correspondiente TField.
Informacin adicional
Si asigna fkInternalCalc a la propiedad FieldKind del objeto TField, el valor
del campo es almacenado en la base de datos. Para detalles ms especficos
sobre los tipos de campos disponibles y sus posibilidades, consulte FieldKind
en la ayuda de Delphi. Vea el artculo Client Dataset: MIDAS on the Cheap
en la edicin de abril de 1998 de The Delphi Informant para ms informacin
sobre el uso de campos calculados en el componente TClientDataSet.
Solucin rpida
Para poder enlazar dos tablas con capacidad de bsqueda (lookup), debe seleccionar dos campos (uno de cada tabla) que sean idnticos en cuanto a tipo de
datos y tamao (si es aplicable).
Informacin adicional
Los nombres de los dos campos no importan, siempre que sean compatibles
desde la perspectiva del Database Desktop (el mismo tipo de datos, y el mismo
tamao, si ste es aplicable al tipo de datos). Por ejemplo, puede enlazar cualquier campo de tipo Number de la tabla A con cualquier campo de tipo Number
de la tabla B, no importa cules sean los nombres de los campos. Si quiere
262
Solucin rpida
Asegrese de asignar valores a todos los campos obligatorios.
Informacin adicional
Consulte en la descripcin del mensaje Field <> must have a value las tcnicas para asegurarse de que toda la informacin necesaria sea proporcionada.
Solucin rpida
Introduzca el nombre de un archivo que exista y sea apropiado para cualquier
tipo de accin que vaya a realizar con l o sobre l.
Informacin adicional
Un ejemplo de los muchos que podran provocar este mensaje de error es si
intenta instalar un componente, y luego introduce el nombre de una unidad no
existente en el cuadro de edicin Unit File Name.
Mensajes de error
263
Solucin rpida
1. Compruebe que est autorizado para acceder al archivo. Cambie el atributo
de slo lectura del archivo de True a False en el Explorador de Windows
siguiendo estos pasos:
a. Localice el archivo y luego pulse con el botn derecho del ratn sobre l.
b. Seleccione Propiedades del men de contexto.
c. Si la casilla Slo Lectura est seleccionada, desmrquela.
2. Cambie el valor de FileMode a 2 antes de acceder al archivo, si es necesario, as:
var tF: TextFile;
begin
FileMode := 2;
AssignFile(tF, 'AchtDrei.txt');
. . .
Informacin adicional
Para ms informacin, consulte FileMode en la ayuda de Delphi.
264
Solucin rpida
Seleccione solamente archivos del tipo apropiado para cada tipo de operacin.
Por ejemplo, seleccione nicamente archivos con extensin .DPK cuando cree
un nuevo paquete.
Informacin adicional
La extensin del archivo indica al mundo qu tipo de archivo es, y por tanto
qu se puede hacer con l. Por ejemplo, un archivo .DPK no puede producir
sonidos, y una extensin .WAV no puede ser utilizada para un archivo de
paquete.
Solucin rpida
Puede verificar el estado de la tabla antes de acceder a ella, as:
if not Table1.Exclusive then
. . .
Informacin adicional
Es necesario colocar una tabla en modo exclusivo antes de se que puedan ejecutar ciertas operaciones, como crear ndices. Asegrese siempre de quitar el
modo exclusivo cuando haya terminado, para no impedir innecesariamente que
otros usuarios puedan acceder a la tabla.
Si trata de abrir la tabla en modo exclusivo, y alguien tiene ya la tabla abierta,
recibir el mensaje de error Table is busy. Consulte dicha entrada para ms
informacin sobre cmo tratar ese incidente.
Para ms informacin, consulte exclusive lock en la ayuda de Delphi.
Mensajes de error
265
Solucin rpida
Tenga presente llamar siempre a AssignFile antes de intentar utilizar Rewrite,
Reset, Append, Rename o Erase sobre un archivo:
var tex: TextFile;
begin
AssignFile(tex, 'McMurtry.txt');
try
Rewrite(tex);
Writeln(tex, 'Lonesome Dove');
. . .
finally
CloseFile(tex);
end;
end;
Informacin adicional
Este es el error de Entrada/Salida nmero 102.
266
Solucin rpida
1. Verifique que ha escrito correctamente el nombre de la unidad, si lo
introdujo manualmente. Si no est utilizando la unidad, brrela de la lista
de la clusula Uses. De lo contrario, verifique que el directorio en el que
reside el archivo .DCU correspondiente a la unidad est en la ruta de bsqueda de Delphi (vea la Solucin rpida #2 ms abajo).
2. Aada el camino donde reside el archivo a la ruta de bsqueda de Delphi
(que puede ser consultada en Tools | Environment Options, seleccionando la pestaa Library), o mueva el archivo a un directorio de la ruta
de bsqueda.
3. En una instalacin por defecto de Delphi 2, el archivo Report.DCU queda
situado en las siguientes localizaciones:
C:\Archivos de programa\Borland\Delphi X\LIB\DELPHI2
C:\Archivos de programa\Borland\Delphi X\Slib
El componente TReport no se instala por defecto. Est incluido todava en
Delphi 3 (pero no en Delphi 4 y superiores), y puede instalarlo siguiendo
estos pasos:
a. Seleccione Component | Configure Palette. . . .
b.
c.
d.
e.
4.
5.
6.
7.
8.
Mensajes de error
267
Informacin adicional
1. En este caso, Delphi buscar un archivo con el nombre que aparece en la
seccin Uses con una extensin .DCU.
Si desea abrir un archivo para escritura utilizando el procedimiento
Append, es recomendable prepararse para la no existencia del archivo en el
momento de la llamada mediante programacin defensiva. Por ejemplo,
podra utilizar un cdigo similar al siguiente para evitar errores ocasionados por archivos inexistentes:
procedure TForm1.btnWriteToTextFileClick(Sender: TObject);
var
tF: TextFile;
begin
AssignFile(tF, 'sexyexe.txt');
if FileExists(ChangeFileExt(Paramstr(0),'.txt')) then
Append(tF)
else
Rewrite(tF);
WriteLn(tF, DateTimeToStr(Now));
CloseFile(tF);
end;
8. Los archivos de bibliotecas de tipos pueden tener las siguientes extensiones: OLB, TLB, OCX, DLL y EXE.
268
Por ejemplo, para seguir la pista a los eventos que se estn produciendo,
podramos hacer algo as:
Writeln(tf, Enviado mensaje KeyDown);
end;
Mensajes de error
269
Printer.Canvas.Font.Size := 16;
Printer.Canvas.Font.Style := [fsBold];
Writeln(PrintText,'Dont leave me, oh my darling');
Writeln; // Esto genera el error
Solucin rpida
1. Debe llamar a Rewrite, Reset o Append antes de poder escribir en el
archivo, de la siguiente forma:
var
Textilefile: TextFile;
begin
AssignFile(Textilefile, 'corduroy.txt');
try
if FileExists('corduroy.txt') then
Append(Textilefile)
else
Rewrite(Textilefile);
Writeln(Textilefile, 'The hippies of the sixties');
finally
CloseFile(Textilefile);
end;
end;
270
Informacin adicional
1. Utilice el procedimiento Append para aadir datos a un archivo. Utilice el
procedimiento Rewrite para sobrescribir y reemplazar un archivo existente.
Utilice Reset para abrir un archivo para lectura.
4. Cuando escriba en un archivo de texto que no haya sido asignado a la
impresora, no necesita aadir el parmetro; un simple Writeln ser suficiente para aadir una lnea en blanco.
Mensajes de error
271
Readln(s);
Solucin rpida
1. Antes de intentar leer desde un archivo, llame al procedimiento Reset.
Para arreglar el ejemplo de arriba, aada la llamada antes del bucle While,
as:
. . .
AssignFile(cookie,'history.txt');
try
Reset(cookie);
while not eof(cookie) do
. . .
Informacin adicional
1. Utilice el procedimiento Append para aadir datos a un archivo. Utilice el
procedimiento Rewrite para sobrescribir y reemplazar un archivo existente.
Utilice Reset para abrir un archivo para lectura.
2. Los programas de Windows requieren la variable de archivo, as como la
variable de cadena en la que se leer la lnea.
Solucin rpida
1. Aada WinCRT a la clusula Uses de la unidad.
2. Abra los archivos para escritura con Append o Rewrite, no con Reset. No se
puede abrir un archivo que no existe, por lo que debe utilizar la siguiente
lgica para escribir en un archivo la primera vez o para prepararse ante la
eventualidad de que el archivo no exista:
. . .
AssignFile(SingSing,'nail.txt');
if FileExists('nail.txt') then
Append(SingSing)
else
272
Informacin adicional
2. Utilice el procedimiento Append para aadir datos a un archivo. Utilice el
procedimiento Rewrite para sobrescribir y reemplazar un archivo existente.
Utilice Reset para abrir un archivo para lectura.
Este es el error de Entrada/Salida nmero 105.
Solucin rpida
Asegrese que la tabla especificada realmente existe en la ubicacin que ha
especificado. Puede ser un simple problema de ortografa, que puede ser solucionado en este caso con:
SELECT *
FROM ANIMALS
Informacin adicional
Si est trabajando con alias locales (estndar) y no ha especificado el tipo de
tabla a la que est intentando acceder, Delphi primero buscar una tabla Paradox, luego dBASE y por ltimo un archivo ASCII (texto).
Mensajes de error
273
Solucin rpida
1. No intente declarar variables de esos tipos.
2. No pase tipos de archivos como parmetros por valor. Hgalo as:
procedure LegoMania(VAR Technik: file);
Informacin adicional
Puede pasar un tipo de archivo como parmetro Var o Const. Para ms informacin, consulte parameters en la ayuda de Delphi. Por defecto, los parmetros son pasados por valor.
Solucin rpida
No asigne a la propiedad FixedCols un valor mayor o igual que la cantidad de
columnas que la rejilla contiene. Si permite que el usuario asigne el nmero de
columnas, asegrese que ste no sobrepase el mximo valor vlido. Por ejemplo, podra hacer algo as:
procedure TForm1.Button14Click(Sender: TObject);
const
crlf = #13#10; {o hgalo una constante global}
//
procedure Whatchemacolumn(ColNum: Integer);
begin
if ColNum < StringGrid1.ColCount then
StringGrid1.FixedCols := ColNum
else
MessageDlg('El nmero de columnas fijas debe ser menor +
crlf + que la cantidad total de columnas,
mtInformation, [mbOK], 0);
end;
begin
Whatchemacolumn(StrToInt(Edit1.Text));
end;
Informacin adicional
Debe tener al menos una columna que no sea fija.
274
Solucin rpida
No asigne a la propiedad FixedRows un valor mayor o igual que la cantidad de
de filas que contiene la rejilla. Si permite que el usuario asigne el nmero de
filas, asegrese de que ste no sobrepase el mximo valor vlido. Por ejemplo,
podra hacer algo as:
procedure TForm1.Button14Click(Sender: TObject);
const
crlf = #13#10; {o hgalo una constante global}
//
procedure PrettyMaidsAllInARow(RowNum: Integer);
begin
if RowNum < StringGrid1.RowCount then
StringGrid1.FixedRows := RowNum
else
MessageDlg('El nmero de filas fijas debe ser menor +
crlf + que la cantidad total de filas',
mtInformation, [mbOK], 0);
end;
begin
PrettyMaidsAllInARow(StrToInt(Edit1.Text));
end;
Informacin adicional
Debe tener al menos una fila que no sea fija.
Mensajes de error
275
var
Date: TDateRec;
begin
for Date.Year := 1984 to 2001 do
Orwellian(Superman);
Solucin rpida
Utilice una variable local simple para los bucles, como la apreciada i:
var
i: Integer;
begin
for i := 0 to Pred(AmountOfWoodThatAWoodchuckCanChuck) do
...
Informacin adicional
Es legal utilizar una variable global como variable de control de un bucle For
(por compatibilidad haca atrs), pero el uso de una variable local produce un
cdigo ms eficiente.
Solucin rpida
Utilice un tipo ordinal como variable de control de los bucles For. Es habitual
utilizar un entero declarado como i. Para ejecutar el bucle For intentado
arriba, podra hacer esto:
var
i: integer;
s: string;
begin
s:='';
for i := Ord('a') to Ord('z') do
s := s+Chr(i);
276
Informacin adicional
La funcin Chr realmente recibe un valor de tipo Byte en lugar de un Integer,
pero siempre que se le pase un valor positivo menor que 256, un valor Integer
funcionar. Para asegurar que no se asigna un valor errneo, puede primero
utilizar la funcin Ord, como se muestra arriba. Lo mismo podra llevarse a
cabo con:
for i := 97 to 122 do
Pero esto hace que el cdigo sea menos legible y la posibilidad de equivocacin
mayor. Para ms informacin, consulte Ord y Chr en la ayuda de Delphi.
Solucin rpida
Modifique el procedimiento llamado de tal forma que el parmetro no se pase
por referencia (parmetro Var):
procedure ColoredMarshmallows(LuckyStars: Integer);
Mensajes de error
277
Informacin adicional
Esto es realmente una advertencia, no un error. El compilador est intentando
decirle, no obstante, que ese tipo de construccin es peligrosa (lgicamente). La
variable de control del bucle For podra tericamente ser cambiada a cualquier
valor, incluyendo uno que est fuera de los lmites del bucle.
Form <> links to form <> which cannot be found in the current
project. Do you wish to remove/redirect the links to another form?
Posible causa de error
1. Puede haber aadido un formulario existente que depende de otro formulario que no est incluido en el proyecto. Si el primer formulario mencionado
en el mensaje de error (el que pertenece al proyecto) contiene controles
conectados a datos, el segundo formulario mencionado en el mensaje de
error (el que no forma parte del proyecto) puede ser un mdulo de datos
que contiene los componentes de datos no visibles correspondientes al primer formulario (TDatabase, TTable, TQuery, TStoredProc, TDataSource,
etc.).
2. Puede haber intentado guardar un formulario que est enlazado a un formulario que no est cargado.
Solucin rpida
1,2. Si no necesita mantener el enlace entre los dos formularios, seleccione Yes
y luego seleccione Remove Link. Si necesita mantener el enlace, cargue el
segundo formulario mencionado en el mensaje.
Informacin adicional
Consulte Form <> references another form and cannot be saved until
<> is loaded. Para ms informacion, consulte tambin data modules en la
ayuda de Delphi.
Form <> references another form and cannot be saved until <> is
loaded
Posible causa de error
Puede haber obtenido el mensaje de error Form <> links to form <> which
cannot be found in the current project. Do you wish to remove/redirect the links to another form? y respondi No o Cancel (no elimin ni
redirigi el enlace).
278
Solucin rpida
Cargue el segundo formulario mencionado en el mensaje de error dentro del
proyecto actual.
Informacin adicional
Consulte Form <> links to form <> which cannot be found in the
current project. Do you wish to remove/redirect the links to another
form?
Solucin rpida
Cambie el especificador de formato por uno apropiado para el argumento. En el
ejemplo de arriba, cambie la c por una s:
Add(Format('ThouSeparator = %s', [SysUtils.ThousandSeparator]));
Informacin adicional
Para ms informacin, consulte Format en la ayuda de Delphi.
Tambin esto:
function Calc(x,y: integer); integer;
Mensajes de error
279
Solucin rpida
Aada el tipo del resultado a la declaracin de la funcin. Por ejemplo, si la
funcin devuelve un resultado Boolean, declrela as:
function junction(s: string): boolean;
Informacin adicional
Los procedimientos ejecutan una accin (o acciones). Las funciones normalmente hacen lo mismo, pero ellas tambin devuelven un resultado. Si ensea a
su perro a hacer un giro y a traerle cosas, podra comparar la accin de girar
con un procedimiento y la accin de traerle cosas con una funcin (el perro le
trae sus zapatillas o el peridico).
Solucin rpida
Asigne un componente TSession a cada hilo que acceda a componentes de base
de datos.
Informacin adicional
Consulte Session name missing y Cannot enable AutoSessionName
property with more than one session on a form or data module.
Solucin rpida
Aada una coma despus de todos los campos excepto el ltimo en la lista.
280
Informacin adicional
Consulte <> expected but <> found.
Solucin rpida
Inserte un par de parntesis alrededor del grupo de valores, as:
SQL.Add('INSERT INTO ISO_CLASS');
SQL.Add('(QAP_ID,PROD_XREF,COVERAGE_REV,ISO_CLASS_XREF,');
SQL.Add('EFF_DATE, EXP_DATE,SCHEDULED_UNIT_SRLNUM)');
SQL.Add('VALUES');
. . .
Informacin adicional
Por supuesto, tambin obtendra este error si el grupo de valores no incluyera
el par de parntesis (que apareceran directamente despus de los fragmentos
de cdigo mostrados arriba).
Mensajes de error
281
Solucin rpida
Aada una llamada al mtodo Clear, de tal manera que el texto SQL no se
vaya acumulando:
SQL.Clear;
SQL.Add('Select * from FortKnox');
Informacin adicional
Para ver qu es lo que exactamente est siendo enviado como sentencia SQL,
seleccione Evaluate/Modify del men, introduzca <NombreQuery>.SQL.Text,
y pulse el botn Evaluate.
Solucin rpida
1. Inicie cada transaccin con una llamada a StartTransaction, y finalcela
con una llamada a Rollback (para retrocederla si hay algn problema) o
Commit (para confirmarla). Por ejemplo, podra hacerlo de esta manera:
282
Informacin adicional
2. MS SQL Server retrocede las transacciones que experimenten
interbloqueos.
Solucin rpida
Elimine la sentencia GoTo del bloque protegido o no salte dentro de un bloque
de cdigo protegido.
Informacin adicional
Las sentencias GoTo son consideradas una mala prctica de programacin. No
utilice sentencias GoTo, a menos que no pueda encontrar otro recurso.
Mensajes de error
283
2. Puede estar intentando acceder a una columna que no existe en una rejilla
de cadenas (TStringGrid). Por ejemplo, si est trabajando con una rejilla de
cadenas con tres columnas, lo siguiente generar este mensaje de error:
ColWidths[3] := 100;
Solucin rpida
1. Llame al mtodo DisableControls del objeto TDataset mientras est iterando a travs del conjunto de datos, as:
with RegretTable do
begin
DisableControls;
try
First;
while not EOF do
begin
. . .
Next;
end;
finally
EnableControls;
end;
2. Si est trabajando con una rejilla de cadenas con tres columnas, por ejemplo, haga referencia al tercer elemento as:
ColWidths[2] := 100;
Informacin adicional
1. Si llamar a DisableControls no funciona en su situacin, aada el siguiente
cdigo en el evento OnCreate del formulario, si la tabla est abierta en el
entorno integrado de Delphi, o inmediatamente despus de abrir la tabla
cuyo contenido est mostrando en el DBGrid:
DBGrid1.HandleNeeded;
284
Solucin rpida
Si utiliza una funcin de agregacin de SQL, como SUM, AVG, MIN, MAX o
COUNT, debe agrupar por todos los dems campos (no agregados). Por ejemplo, la sentencia SQL de arriba sera :
SELECT DIM, SUM(TSINGTAO)
FROM CHINESEFOOD
GROUP BY DIM
Informacin adicional
La sintaxis y caractersticas de SQL difieren de un sistema a otro. Consulte la
documentacin de su base de datos para obtener la informacin pertinente de
la base de datos que est utilizando. Si est utilizando tablas locales, consulte
LOCALSQL.HLP, que viene con Delphi (se instala por defecto en C:\Archivos
de programa\Borland\Common files\BDE).
Solucin rpida
Libere espacio del disco duro y/o incremente el tamao de la memoria virtual, o
reduzca el tamao del bloque de memoria que est tratando de reservar.
Informacin adicional
Este es el error 203.
Mensajes de error
285
s := 'esszet';
i := High(s);
Solucin rpida
No se puede aplicar la funcin High a cadenas largas. S se puede, sin
embargo, utilizarla con cadenas cortas, que estn todava disponibles en Delphi
de 32 bits. Puede crear una cadena corta en Delphi de 32 bits asignando una
longitud (hasta 255) en la declaracin de la cadena o utilizando el tipo
ShortString. El ejemplo de arriba funcionar simplemente aadiendo la longitud que se quiere utilizar en la declaracin de la cadena o declarando la cadena
como un tipo ShortString. En otras palabras, cualquiera de los dos ejemplos
siguientes funcionar:
s: string[24]; { o cualquier otro entero positivo hasta 255 }
s: shortString;
Alternativamente, si quiere dejar su cdigo como est, puede desactivar la utilizacin de cadenas largas como tipo de cadenas por defecto en Delphi de 32
bits seleccionando Project | Options | Compiler | Syntax Options, y desmarcando la casilla de verificacin Huge Strings. Otra manera de hacer lo
mismo es incluyendo la directiva de compilador {$H-} en la parte superior de la
unidad.
Informacin adicional
Para ms informacin, consulte open string parameters y High function en
la ayuda de Delphi.
3. Puede estar haciendo referencia a una tabla Paradox cuya ruta contiene
nombres de archivo largos.
286
Solucin rpida
1, 2Para las dos primeras posibles causas, una opcin es aadir el ndice en el
Database Desktop en lugar de hacerlo en el cdigo (cuando modifique la
estructura de la tabla, Database Desktop automticamente elevar el nivel
al nivel ms bajo necesario para satisfacer los requisitos). Si no desea reestructurar la tabla, asigne el nivel de la tabla por defecto al nivel ms alto
disponible en la utilidad de Configuracin o Administracin del BDE. Para
ello, siga estos pasos:
Delphi 1 o 2
a. Seleccione Tools | BDE Config.
b. Seleccione Paradox en el cuadro de lista Driver Name.
c. Cambie el valor del parmetro LEVEL al deseado (por ejemplo, de 4 5
hasta 7).
d. Seleccione File | Exit.
e. Seleccione Yes para grabar los cambios.
Delphi 3 y 4
a. Seleccione Inicio | Programas | Borland Delphi X | BDE
[Configuration, Administration].
b. Seleccione la pestaa Configuration en la seccin Drivers/System.
c. Expanda el nodo Drivers en vista de rbol.
d. Expanda el nodo Native en la vista de rbol.
e.
f.
Mensajes de error
287
Informacin adicional
Una manera rpida de elevar el nivel de una tabla Paradox al nivel 7 desde el
Database Desktop es aadir un ndice descendente. Ya que los ndices descendentes no estaban soportados en Paradox hasta la versin 7, al grabar la base
de datos despus de aadir el ndice descendente sta se guardar como una
base de datos de Paradox 7.
Sin embargo, a menos que el ndice necesite ser aadido en el cdigo (es decir,
no se sabe cul es el campo para el que se crear el ndice en tiempo de
diseo), no tiene sentido aadir un ndice que no ser necesario con Database
Desktop para luego poder crear uno que s se necesitar mediante cdigo.
Por consiguiente, hay dos escenarios en los que encontrar necesario aadir un
ndice a una tabla con el Database Desktop:
1. Quiere aadir un ndice, pero est utilizando una tabla Paradox 3.5, 4, 5
(no se puede aadir un ndice en el cdigo con estas tablas).
2. Necesita aadir un ndice en el cdigo, pero su tabla es de una versin
anterior a la 7 y por lo tanto necesitar promoverla al nivel 7 aadiendo un
ndice descendiente.
Para aadir un ndice en el Database Desktop, siga estos pasos:
a. Seleccione Tools | Database Desktop.
b. Seleccione File | Open | Table. . . .
c. Navegue hasta la tabla a la que quiere aadir el ndice y brala.
d. Seleccione Tools | Utilities | Restructure. . . (o pulse sobre el icono
correspondiente).
e. Seleccione Secondary Indexes del cuadro de combinacin Table
Properties.
f. Pulse el botn Define.
g. Seleccione el campo que quiere aadir al ndice en el cuadro de lista
Fields.
h. Pulse la flecha que apunta a la derecha entre las cajas de lista Fields e
Indexed Fields.
i. Marque las casillas de verificacin de la seccin Index Options que
desee aplicar al ndice. Estas opciones de ndice son Unique (Unico),
Case Sensitive (Distingue entre maysculas y minsculas), Descending
(Descendente) y Maintained (Mantenido automticamente). Maintained
est seleccionado por defecto (aqu es donde podra seleccionar
Descending para forzar que una tabla de Paradox 4 5 sea promovida
a una tabla de Paradox 7).
j. Pulse el botn OK.
k. Proporcione un nombre para el ndice en el cuadro de dilogo Save
Index As. A partir de ese momento podr asignarle ese ndice a la
propiedad IndexName de la tabla en el cdigo.
288
Por supuesto, si desea crear los ndices en el cdigo, puede esperar hasta el
tiempo de ejecucin para especificar el campo a indizar y posiblemente tambin
el nombre del ndice:
Table1.Exclusive := True;
Table1.AddIndex(Edit1.Text,Edit2.Text,[]);
Mensajes de error
289
Solucin rpida
Asigne el nombre de la base de datos a la que se desea conectar en la propiedad Params.Database de TSQLConnection.
Informacin adicional
DBExpress apareci por primera vez en Delphi 6.
Solucin rpida
1. Elimine la seccin vaca o aada una o ms declaraciones vlidas en ella.
2. No utilice palabras reservadas para ningn otro propsito que no sea aquel
para el que stas estn diseadas.
3. Elimine el operador de mbito de la sentencia.
Informacin adicional
Los identificadores son los nombres que se asignan a los tipos, variables, constantes, procedimientos, funciones, unidades, programas y campos de registros.
Consulte Identifier expected but array found e Identifier expected
but number found. Para ms informacin, consulte tambin identifiers en
la ayuda de Delphi.
290
Solucin rpida
Declare un tipo para el array que desea utilizar, y luego utilice el nuevo tipo de
array como tipo de retorno de la funcin. Por ejemplo, para resolver el problema de arriba, haga lo siguiente:
type
ThreeForOne = array[0..3] of char;
. . .
function Three41(i: integer): ThreeForOne;
Informacin adicional
Para ms informacin, consulte arrays en la ayuda de Delphi.
Solucin rpida
Evite iniciar una declaracin de un subrango con un parntesis. El compilador
pensar que usted intenta declarar un tipo enumerado. En lugar de ello,
hgalo de esta manera:
type
TSoberSubrange = 32..255;
Informacin adicional
Puede utilizar expresiones en la declaracin de tipos subrango, siempre que
evite iniciar la declaracin con un parntesis. Por ejemplo, lo siguiente es aceptable para el compilador:
Mensajes de error
291
type
TSeriousSubrange = 32..255;
type
TSuaveSubrange = 32..((32 * 8) -1);
Solucin rpida
1. Elimine o renombre el elemento declarado dos veces.
2. Elimine la referencia a System de la clusula Uses, ya que es sta es
importada implcitamente por todas las unidades.
Informacin adicional
1. No se puede tener dos variables globales con el mismo nombre. Tampoco se
puede tener dos variable locales (en un mismo mbito) con el mismo
nombre.
Puede tener una variable global y tantas locales como necesite (siempre
que cada una sea nica dentro de su mbito) con el mismo nombre. Por
ejemplo, podra tener una variable global nombrada ExpendableIncome y
simultneamente declarar una variable con el mismo nombre dentro de un
procedimiento o funcin (en cuyo caso, la variable global sera ocultada
dentro del procedimiento por la variable local).
292
Solucin rpida
1. Asigne a la variable, tipo, etc. un nombre vlido de Object Pascal (que
comience con un guin bajo o caracter alfabtico, y a continuacin contenga
solamente guiones bajos, caracteres alfabticos y dgitos).
2. Verifique que la sentencia {$R *.RES} del archivo fuente del proyecto no ha
sido alterada.
3. Elimine cualquier llave ( } ) que pueda tener al final de una lnea.
Informacin adicional
Este mensaje de error se encuentra principalmente en conexin con las constantes de cadena y los comentarios.
Solucin rpida
No utilice un nmero negativo (ni cero) como ndice de un mtodo de mensaje.
Si est capturando un mensaje de Windows, utilice su constante correspondiente, tal como est declarada en la unidad Messages.PAS. Por ejemplo, la
declaracin de arriba sera:
procedure WMChar(var Message: TWMChar); message WM_CHAR;
Informacin adicional
Puede tambin referirse al mensaje WM_CHAR por su valor hexadecimal:
procedure WMChar(var Message: TWMChar); message $0102;
Mensajes de error
293
Solucin rpida
Utilice solamente tipos vlidos para la seccin Automated. Consulte automatable types en la ayuda de Delphi para ms informacin.
Informacin adicional
En este ejemplo particular, el mensaje de error se produce porque el tipo
TMessage es ilegal.
La seccin Automated est obsoleta y se mantiene por compatibilidad.
Solucin rpida
Utilice solamente los tipos estndar de Pascal con Readln.
Informacin adicional
Si quiere leer una lista de cadenas de un archivo, puede hacer esto:
294
Solucin rpida
Writeln acepta solamente variables de los tipos estndar de Pascal.
Informacin adicional
Si quiere escribir el contenido de una lista de cadenas en un archivo, utilice el
mtodo SaveToFile.
Solucin rpida
Asegrese que la palabra reservada Implementation exista entre la seccin
Interface y la parte de implementacin de la unidad.
Mensajes de error
295
Informacin adicional
Para ms informacin, consulte implementation reserved word | positioning a
procedure or function in your code y implementation reserved word | the
structure of a unit en la ayuda de Delphi.
Solucin rpida
Verifique que hay una coma entre todas las unidades a las que se hace referencia en la clusula Uses y un punto y coma al final.
Informacin adicional
Puede tener una o dos clusulas Uses en una unidad. Tendr una en la seccin
Interface de la unidad, como aqu:
unit EdStates;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
. . .
296
Solucin rpida
Elimine la clusula Implements <tipo_errneo>, o sustituya el <tipo_errneo>
(en este caso, Integer) por un tipo de clase o interfaz, as:
type
TMyClass = class(TinterfacedObject, IOfTheStorm)
. . .
property TryToImplementAnInt: Integer read FInteger
implements IOfTheStorm;
end;
Informacin adicional
Para ms informacin, consulte implementing interfaces by delegation en la
ayuda de Delphi.
Solucin rpida
Aada la directiva de lectura a la declaracin de la propiedad, as:
TItalianStallion = class(TInterfacedObject, IOfTheTiger)
FRockyRead: IOfTheTiger;
property MyInterface: IOfTheTiger read FRockyRead
implements IOfTheTiger;
end;
Informacin adicional
Para ms informacin, consulte implementing interfaces by delegation en la
ayuda de Delphi.
Mensajes de error
297
Solucin rpida
Elimine la clusula Implements. Las clases pueden implementar interfaces.
Las interfaces no pueden implementar interfaces, ya que ellas no tienen implementacin. Son similares a las clases abstractas en Delphi (aunque las clases
abstractas frecuentemente implementan algunos de sus mtodos y solamente
dejan un subconjunto de sus mtodos abstractos, mientras que las interfaces
son completamente abstractas).
Informacin adicional
Para ms informacin, consulte implementing interfaces by delegation en la
ayuda de Delphi.
298
Solucin rpida
Elimine el convenio de llamada Stdcall (o el que fuera) que haya especificado
para el mtodo de acceso.
Informacin adicional
Para ms informacin, consulte implementing interfaces by delegation en la
ayuda de Delphi.
Solucin rpida
Cambie nuevamente el GUID a su estado original.
Informacin adicional
Un GUID debe tener el formato: 00000000-0000-0000-0000-000000000000. Los
ceros representan caracteres alfanumricos (pueden ser reemplazados por dgitos o caracteres).
Solucin rpida
Compruebe que el conjunto de datos fuente y la tabla de destino tengan estructuras compatibles.
Informacin adicional
Los conjuntos fuente y destino no tienen que coincidir exactamente. Por ejemplo, los nombres de las columnas pueden diferir, siempre que sean del mismo
tipo de datos y tamao.
Mensajes de error
299
Incompatible Types
Posible causa de error
Puede haber indicado un mtodo como sobrecargado, y luego haber llamado a
Inherited en su implementacin.
Solucin rpida
Cambie la directiva Overload por Override, o elimine la llamada a Inherited.
Informacin adicional
Los mtodos declarados como virtuales pueden ser redefinidos en las clases
descendientes. Esto se hace aadiendo la directiva Override a la declaracin
del mtodo. Normalmente, en la implementacin del mtodo redefinido se llamara a Inherited, as:
procedure DoPopup(Sender: TObject); override;
. . .
procedure TForTheTillermanPopupMenu.DoPopup(Sender:TObject);
begin
inherited;
. . .
Se puede sobrecargar un mtodo aadiendo la directiva Overload a la declaracin del mtodo, lo cual le permite tener mltiples mtodos con un mismo nombre (pero diferentes signaturas). Por ejemplo:
procedure GetAWife(Bait: Currency); overload;
procedure GetAWife(Bait: String); overload;
procedure GetAWife(Bait: TDateTime); overload;
300
3. Puede estar pasando a un procedimiento o funcin un valor que no es compatible con el parmetro declarado en el procedimiento o funcin. Por
ejemplo, lo siguiente generar este mensaje de error:
procedure TypeConfusion(i: integer);
. . .
procedure SendString;
var
s: string;
begin
TypeConfusion(s); {pase un entero, no un string!}
7. Puede ser tambin que una clusula Write o Read de una propiedad haga
referencia a un campo o mtodo cuyo tipo difiere del de la propiedad. Por
ejemplo, lo siguiente generar el mensaje de error Incompatible Types,
ya que para escribir el valor de una propiedad Boolean se ha intentado utilizar un procedimiento que recibe una cadena:
private
FEmUpJoe: boolean;
procedure SetEmUpJoe(s: string);
public
{ Declaraciones pblicas }
Mensajes de error
301
published
property EmUpJoe: Boolean read FEmUpJoe write SetEmUpJoe;
end;
10. Puede haber intentado asignar un valor de tipo enumerado a un tipo conjunto as:
type
TFrozenCustardFlavors = (fcfHeath, fcfPistachio, fcfAbsinthe);
TFrozenCustardFlavors = set of TFrozenCustardFlavor;
. . .
case radgrpFrozenCustard.ItemIndex of
0:
FrozenCustardObj.Flavors := fcfHeath;
Solucin rpida
1. Asigne el valor a una variable del mismo tipo de datos o convierta el valor
a ser almacenado antes de hacer la asignacin.
2. Hay dos maneras para asignar el valor de un descendiente de TField a una
variable. Puede aadir la propiedad Value al nombre del campo del que
est obteniendo el valor; alternativamente, puede convertir el valor al tipo
de datos adecuado utilizando una de las propiedades AsX. He aqu algunos
ejemplos de sentencias de asignacin vlidas:
{Esto funciona}
StringGrid1.Cells[1,1] := Table1Capital.Value;
{Esto tambin}
StringGrid1.Cells[0,0] := Table1Capital.AsString;
Algunas veces, la propiedad de conversin AsX no funciona, en dependencia de la variable a la que est asignando el valor y al descendiente de
302
3. Asegrese de que el tipo de datos de la variable que pasa a un procedimiento o funcin est acorde con la declaracin de ese procedimiento o
funcin.
4. Asegrese de que el resultado que devuelve la funcin coincida con el tipo
de resultado declarado por la funcin.
5. Utilice Div para producir un resultado entero, y / para producir un resultado real (de punto flotante).
6. No intente hacer control activo del formulario a un control grfico.
7. Asegrese de que los tipos de las propiedades y sus campos o mtodos de
escritura o lectura sean iguales. En el ejemplo mostrado arriba, cambie el
tipo del campo privado o propiedad de Boolean a String, o cambie el tipo
del parmetro del mtodo de escritura de String a Boolean.
8. Anteponga Canvas a la llamada a TextOut, as:
procedure TForm1.FormMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
Canvas.TextOut(X, Y, IntToStr(X)+' '+IntToStr(Y));
end;
Mensajes de error
303
Informacin adicional
1. Delphi/Object Pascal ofrece muchas funciones predefinidas que permiten la
conversin entre tipos de datos, como de Integer a String y viceversa, etc.
Por ejemplo, puede asignar una variable de cadena a una entera utilizando
la funcin de conversin StrToInt, as:
SomeIntegerVariable := StrToInt(Edit1.Text);
Alpha
TStringField
Autoincrement
TAutoIncField
BCD
TBCDField
Binary
TBlobField
Byte
TBytesField
Date
TDateField
Formatted Memo
TBlobField
Graphic
TGraphicField
Logical
TBooleanField
304
Long Integer
TIntegerField
Memo
TMemoField
Money
TCurrencyField
Number
TFloatField
OLE
TBlobField
Short
TSmallIntField
Time
TTimeField
Timestamp
TDateTimeField
Mensajes de error
305
procedure LowerCase;
Solucin rpida
1. Para asignar una funcin o procedimiento a un tipo funcin o procedimiento, sus signaturas (cantidad, tipos de datos y secuencia de los
parmetros) deben ser idnticas (aunque los nombres de los parmetros
pueden diferir). Por ejemplo, lo siguiente funcionara bien:
function Kool(a,b,c: integer): integer;
type
TAndTheMGs = function(x,y,z: integer): integer;
const
Stylistics: TAndTheMGs = Kool;
Informacin adicional
Para ms informacin, consulte procedural values en la ayuda de Delphi.
Solucin rpida
Generalmente, no es una buena idea modificar el cdigo que Delphi genera
automticamente.
306
Informacin adicional
Si modifica la declaracin de la clase, pero utiliza un identificador vlido,
obtendr el mensaje de error Field <> should be of type <> but is declared as <>. Correct the declaration? Consulte la entrada correspondiente a
este mensaje de error para ms informacin.
Solucin rpida
Las directivas de almacenamiento se utilizan para las propiedades declaradas
en la seccin Published de un componente. No utilice directivas de almacenamiento en mtodos o fuera de la seccin Published.
Informacin adicional
Si recibe este mensaje de error, y no hay razn aparente para ello, intente
reconstruirlo todo (seleccione Project | Build All).
Si el mensaje de error persiste, borre los archivos que Delphi genera automticamente, especialmente si ha movido el proyecto de una mquina a otra o de
una versin de Delphi a otra. Entre estos archivos estn, en dependiencia de
su versin de Delphi y de las opciones que haya seleccionado, <proyecto>.OPT,
<proyecto>.DSK, <proyecto>.DSM, <proyecto>.RES y <proyecto>.DOF.
Para ms informacin, consulte storage specifiers en la ayuda de Delphi.
Mensajes de error
307
where
SCRIPT_TYPE = :SCRIPT_TYPE
Solucin rpida
El parmetro no es reconocido por el SQL Explorer. Para propsitos de prueba,
sustityalo por un valor vlido. Por ejemplo:
select
SCRIPT_ID,
SCRIPT_DESC,
BUILD_NO,
SCRIPT_TYPE
from
SCRIPTMAIN
where
SCRIPT_TYPE = 2
Informacin adicional
Consulte la entrada Field <> is of an unknown type en este libro.
Solucin rpida
Compruebe que el ndice que desea crear no exista. Por ejemplo, podra proceder de esta manera:
if not Table1.FieldByName('City').IsIndexField then
Table1.AddIndex('sittee','City',[]);
Informacin adicional
Si intenta aadir un ndice del mismo nombre que uno ya existente en el Database Desktop, obtendr el mensaje: An index named named <> already
exists. Overwrite? Si intenta crear un ndice sobre un campo que ya tiene
un ndice, pero le da al ndice un nombre diferente, recibir el mensaje de error
An index of this type already exists. En ese caso, Database Desktop no le
permitir crear el ndice.
308
Solucin rpida
La clusula Index no es permitida en la seccin Automated. Elimine la
clusula.
Informacin adicional
Delphi 2 y superiores tienen cinco directivas de visibilidad : Private, Protected,
Public, Published y Automated. Una propiedad de una clase puede incluir una
directiva de almacenamiento Stored, Default o Nodefault. Estas directivas de
almacenamiento, sin embargo, no estn permitidas en la seccin Automated.
Solucin rpida
1. Cree el ndice antes de intentar activarlo. Puede llevar a cabo esto utilizando el Database Desktop o el Lenguaje de Definicin de Datos (DDL - un
subconjunto de SQL utilizado en las bases de datos SQL como InterBase,
Oracle y MS SQL Server) o en el cdigo.
2. Borre el valor de la propiedad IndexName o cmbielo a un valor apropiado
para la tabla actual.
Mensajes de error
309
Informacin adicional
El cdigo que ocasiona este error compilar, debido a que hasta donde el compilador puede saber, el ndice podra ser creado mediante cdigo antes de
intentar activarlo.
Para crear un ndice en el cdigo (lo contrario a hacerlo en tiempo de diseo),
utilice el procedimiento AddIndex. Para ms informacin, consulte AddIndex
en la ayuda de Delphi.
310
Solucin rpida
1. Elimine los archivos de ndice existentes, y luego vuelva a crearlos (en el
Database Desktop o en el cdigo). Para ms informacin sobre cmo crear
ndices por cdigo, consulte AddIndex en la ayuda de Delphi.
Siempre asegrese de que los archivos de ndice estn en el mismo directorio que la tabla cuando aada o edite la tabla.
2. Elimine los archivos de ndice existentes, y luego vuelva a crearlos (en el
Database Desktop o en el cdigo). Para ms informacin sobre cmo crear
ndices por cdigo, consulte AddIndex en la ayuda de Delphi.
Para reducir la probabilidad de que lo mismo suceda de nuevo, siga estos
pasos:
Delphi 1
a. Seleccione Tools | BDE Config.
b. Seleccione Paradox en el cuadro de lista Driver Name.
c. Asegrese de que el parmetro Strict Integrity tiene el valor True.
d. Seleccione File | Exit.
e. Seleccione Yes para grabar los cambios.
Delphi de 32 bits
a.
b.
c.
d.
e. Seleccione PARADOX.
f. Asigne True a Strict Integrity.
g. Seleccione Object | Exit.
h. Seleccione Yes para guardar los cambios.
3. Elimine los archivos de ndice existentes, y luego vuelva a crearlos (en el
Database Desktop o en el cdigo). Para ms informacin sobre cmo crear
ndices por cdigo, consulte AddIndex en la ayuda de Delphi.
4. Reemplace la versin daada de VREDIR.VXD. La versin original
(4.00.955) y la 4.00.1116 funcionan correctamente. VREDIR.VXD debera
estar ubicado en C:\Windows\System. Puede bajar una versin actualizada del archivo desde el sitio web de Microsoft.
5. Si va a editar o insertar registros en una tabla, no utilice ndices no mantenidos. Para configurar un ndice de una tabla Paradox como mantenido,
siga estos pasos:
a. Abra el Database Desktop.
b. Abra la tabla con la que quiere trabajar (File | Open | Table).
Mensajes de error
311
c.
Informacin adicional
Los archivos de ndice (.PX, .Xnn y .Ynn) deben estar presentes con la tabla
cuando se aadan registros, de forma que los archivos de ndice puedan ser
actualizados. Si no estn, la fecha/hora de ltima actualizacin de la tabla y de
los archivos de ndice no sern iguales, indicando que sus datos no estn
sincronizados.
Una descripcin de los archivos de ndice auxiliares que utiliza Paradox es la
siguiente:
<NombreTabla>.PX
El archivo .PX contiene la informacin de la clave primaria de la tabla. Si
designa un campo o grupo de campos como clave primaria, este archivo es
creado.
<NombreTabla>.Xnn
Los archivos con extensin .Xnn (donde nn es un nmero hexadecimal) contienen informacin de un ndice secundario.
<NombreTabla>.Ynn
312
Solucin rpida
Asigne True a MultiSelect.
Informacin adicional
An cuando MultiSelect tenga asignado True, puede que no vea la lnea aadida al cuadro de lista, a menos que llame a Application.ProcessMessages.
Solucin rpida
Configure los ndices como mantenidos si quiere editar o insertar registros en
una tabla. Para configurar un ndice de una tabla Paradox como mantenido,
siga estos pasos:
a. Abra el Database Desktop.
b. Abra la tabla con la que quiere trabajar (File | Open | Table).
c. Seleccione Tools | Utilities | Restructure (o pulse sobre el icono
Restructure).
d. Seleccione Secondary Indexes en la lista desplegable Properties de la
tabla.
Mensajes de error
e.
f.
313
Informacin adicional
Si nunca necesitar editar o aadir registros a una tabla (en otras palabras, se
trata de una tabla de slo lectura), puede mejorar el rendimiento haciendo los
ndices no-mantenidos.
Solucin rpida
Mueva el archivo de ndices de produccin (.MDX) al mismo directorio que la
tabla, o elimine la dependencia de la tabla de ese archivo. Para esto ltimo,
consulte el documento TI #2711 en el CD-ROM de Delphi o en el sitio web de
Borland.
Informacin adicional
TI es la abreviatura de Technical Information. Si no tiene acceso al CD-ROM,
puede encontrar este documento en el sitio web de Borland (www.borland.com).
Solucin rpida
Asigne valores a todos los campos de la clave primaria y a los campos indizados antes de grabar. Puede hacer esto, si lo desea, en el evento BeforePost del
conjunto de datos.
314
Informacin adicional
Todas las tablas deberan tener una clave primaria. Consulte la documentacin
de InterBase para ms informacin sobre el diseo de bases de datos.
Solucin rpida
Asegrese de proporcionar los mtodos de escritura y lectura para las
propiedades.
La sintaxis correcta cuando se declara una variable sin la directiva Index es:
property Zeitgeist: Longint read GetWithIt
write SetEmUpJoe;
Informacin adicional
Consulte index specifiers en la ayuda de Delphi para ms informacin sobre
cundo utilizar estos elementos.
Mensajes de error
315
Solucin rpida
No intentente editar (mediante Update) o asignar (mediante Insert) valores a
campos de tipo Autoincrement.
Informacin adicional
Los campos Autoincrement son de slo lectura, y por lo tanto no pueden ser
editados. Un campo Autoincrement, por su propia naturaleza, no debera ser
editado manualmente. Al ser incrementado automticamente, cada valor ser
nico. Si pudiera cambiarse manualmente el valor, al final podran obtenerse
varios valores idnticos, lo que resultara en una violacin de clave. Por esta
razn, los campos Autoincrement son de slo lectura.
Puede especificar el valor inicial para los campos Autoincrement utilizando la
propiedad Minimum en el Database Desktop. En caso contrario, el valor siempre comenzar a partir de 1 y se incrementar en 1 para cada registro. Los
campos Autoincrement son muy parecidos a los nmeros de los cheques que
usted recibe de su institucin financiera.
Solucin rpida
Contacte con el vendedor o el fabricante del ordenador para obtener un controlador actualizado de 32 bits del CD-ROM.
Informacin adicional
El controlador de 16 bits no reconoce nombres de archivo largos; por esa razn,
no puede encontrar algunos de los archivos necesarios para la instalacin.
316
Solucin rpida
1. Evite hacer referencia a variables de instancia en el mtodo de clase, o convierta el mtodo de clase en un mtodo normal.
2. Anteponga el nombre de la variable del formulario al nombre del componente, as:
if Mode = psSingle then begin
frmSingle.Caption := SEnterOrdNum;
frmSingle.GroupBox1.Caption := 0
end;
Informacin adicional
2. Puede tambin encerrar el bloque de cdigo entero en una sentencia With,
si necesita hacer referencia a componentes muchas veces, as:
with frmSingle do begin
editVendOrd.Text:=DefaultOrdNum;
if Mode = psSingle then begin
Caption := SEnterOrdNum;
GroupBox1.Caption := SprintSingleInvoice
end;
end;
Mensajes de error
317
Solucin rpida
1. Borre archivos y programas innecesarios para liberar especio en el disco
duro. Para borrar programas, siga estos pasos:
a. Pulse el botn Inicio en el escritorio de Windows.
b. Seleccione Configuracin | Panel de Control.
c. Seleccione Aadir/borrar Programas.
d. Seleccione el programa que quiere desinstalar.
e. Pulse el botn Aadir/Quitar.
2. Asigne True al parmetro Local Share del BDE. Para ello, siga estos pasos:
a. Abra la utilidad BDE Administrator.
b. Seleccione la pestaa Configuration en la seccin Drivers & System
(izquierda).
c. Seleccione System | Init.
d. Asigne el valor True a Local Share en la pestaa Definition (a la
derecha).
Informacin adicional
1. Es una buena idea siempre tener al menos varias docenas de megabytes
libres en el disco duro. En caso contrario, sufrir numerosos y variados
mensajes de error extraos, cadas del sistema y prdidas de trabajo.
Solucin rpida
Llame a Prepare antes de abrir una consulta, y a Unprepare al terminar de
trabajar con ella. Por ejemplo, podra hacer algo como esto:
with Query1 do
begin
SQL.Add('Select * from Bakery');
Prepare;
try
Open;
318
Informacin adicional
Si obtiene este mensaje de error durante las operaciones de base de datos,
podra ser ventajoso duplicar el valor del parmetro SHAREDMEMSIZE con la
utilidad BDE Configuration de su valor por defecto 2048 a 4096, o cuadriplicarlo, si es necesario, a 8192.
Considere la creacin de conjuntos de datos mediante programacin en tiempo
de ejecucin. Esperar hasta que los recursos se necesiten para crearlos (especialmente si ellos pueden no ser utilizados durante ciertos momentos en la
aplicacin), y luego liberarlos lo antes posible puede mejorar el uso de memoria
y el desempeo de la aplicacin.
Consulte BDE Initialization Error $2501.
Solucin rpida
Consulte al administrador del servidor SQL para obtener los derechos necesarios. Si es usted mismo el administrador, consulte la documentacin para el
servidor particular (InterBase, MS SQL Server, Oracle, etc.) que est
utilizando.
Informacin adicional
Si usted va a administrar la seguridad, considere crear inicialmente grupos,
asignar los derechos a esos grupos, y luego asignar los individuos (usuarios) a
los grupos. Podra tambin permitir a los usuarios nicamente acceder a las
vistas y los procedimientos almacenados (evitando completamente el acceso a
las tablas).
Mensajes de error
319
Solucin rpida
Proporcione la contrasea antes de intentar asignar el valor True a la propiedad Active.
Informacin adicional
Si necesita proteger por contrasea una tabla de Paradox para prevenir el
acceso no autorizado a ella, puede llevarlo a cabo utilizando el Database
Desktop, o puede hacerlo en el cdigo. Para proteger por contrasea una tabla
de Paradox en el Database Desktop, siga estos pasos:
1. Seleccione Tools | Utilities | Restructure (o pulse el icono Structure).
2. Seleccione Password Security de la lista desplegable Table Properties.
3. Pulse el botn Define.
4. Introduzca la contrasea dos veces.
5. Seleccione OK.
La tabla estar ahora encriptada. La tabla podr ser abierta, pero la informacin no ser legible. Por ejemplo, si antes de proteger con contrasea o encriptar una tabla, puede abrirla y ver la informacin que contiene en este formato:
DE
White
QB
Favre
320
Solucin rpida
1. Mantngase en el rango entre 2.147.483.648 y 2.147.483.647 (ambos
inclusive) en las asignaciones de enteros antes de Delphi 4. Lo siguiente
funciona bien:
procedure OnKeyPress(var Key: Smallint); dispid 2147483647;
Informacin adicional
Para ms informacin, consulte integers | integer types en la ayuda de
Delphi.
Mensajes de error
321
Solucin rpida
Necesita instalar InterBase 6, como el mensaje indica, o si lo ha hecho ya, debe
mover IBINSTALL.DLL a la ruta del sistema.
Informacin adicional
Para descargar InterBase, visite el sitio web de InterBase (www.interbase.com).
Solucin rpida
Borre la interfaz redundante (IWatched, en este caso) de la signatura de la
clase.
Informacin adicional
Puede implementar una misma interfaz de diferentes maneras en mltiples
clases. Por ejemplo, podra hacer esto:
TPostman = class(TInterfacedObject, IWalk)
. . .
THiker = class(TInterfacedObject, IWalk)
. . .
322
Solucin rpida
Aada un GUID a la declaracin de la interfaz, pulsando Ctrl+May+G.
Informacin adicional
Es legal declarar un tipo interfaz sin un GUID, pero es recomendable utilizar
un GUID; as evitar problemas como ste.
Solucin rpida
Sustituya la interfaz por alguna de las que aparece en la signatura de la clase,
o aada la interfaz en cuestin a la signatura de la clase, as:
TOopsadaisacal = class(TInterfacedObject, IMPei, IMCake)
. . .
Mensajes de error
323
Informacin adicional
Si no ha declarado la interfaz, obtendr el mensaje de error Undeclared
Identifier: <>. Puede implementar en una clase tantas interfaces como desee.
Solucin rpida
Cuando distribuya una aplicacin de base de datos de Delphi, incluya la versin de BDE con la cual la aplicacin fue desarrollada, ya que es posible que el
usuario no la tenga instalada.
En realidad, es una buena idea tener siempre la versin ms actual del BDE
en su sistema, ya que mantendr as la compatibilidad hacia atrs y tambin
incluir tanto las nuevas caractersticas y funcionalidades como los parches de
los errores anteriores que hayan sido solucionados.
Informacin adicional
Instalar la versin actualizada del BDE resolver el problema en el caso de los
programas creados con la versin ms actual de Delphi, as como con versiones
ms antiguas de Delphi de 32 bits*. Por ejemplo, la versin del BDE que viene
con Delphi 2 (3.5) no es compatible con los programas creados en Delphi 3. La
versin del BDE que viene con Delphi 3, sin embargo, es compatible con Delphi
2 y 3 (o sea, es compatible hacia atrs).
Si necesita instalar la versin ms reciente del BDE en las mquinas de los
usuarios, puede utilizar InstallShield Express, que viene con Delphi de 32 bits,
para crear disquetes de instalacin con este propsito.
* Las versiones 2-6 de Delphi son todas de 32 bits. Solamente Delphi (Delphi 1)
era de 16 bits. Posiblemente Delphi 7 ser de 64 bits.
324
Solucin rpida
Debe utilizar un tipo de clase seguido por un tipo de interfaz en la declaracin
de un tipo de clase ActiveForm, as:
TActiveFormX = class(TActiveForm, IActiveFormX)
Informacin adicional
Consulte Class type required para ver el mensaje opuesto a ste (este es
un ejemplo de cmo mantener ocupado a un programador).
Solucin rpida
1. Haga una construccin completa (Project | Build All) en vez de una simple compilacin (Project | Compile).
2. Haga una construccin completa, como se indic en el punto 1, o primero
borre todos los archivos de unidades compiladas del proyecto (.DCU) y los
archivos de paquete (.DCP) y luego recompile. Si esto no resuelve el problema, cierre Delphi y reincielo, para reajustarlo de tal forma que no
piense que est tratando con una versin modificada de la unidad System.
3. Actualcese a Delphi 3 o superiores (en donde este problema est
solucionado).
4. Haga un Build All.
Mensajes de error
325
Informacin adicional
La culpa no debera echrsele nicamente a Delphi en el caso de los errores
internos. Estos muchas veces pueden ser evitados siguiendo prcticas de codificacin estndar. Es usualmente el cdigo extrao el que provoca esos mensajes de error. Familiaricese con las prcticas de programacin estndar, y
ver pocos errores de este tipo. De otro modo (si el error no es parcialmente
debido a prcticas de codificacin inusuales), el error muchas veces puede ser
eliminado saliendo de Delphi y reinicindolo de nuevo.
2. Este error normalmente aparece cuando el compilador no puede determinar si un archivo de unidad compilada (.DCU) o de paquete (.DCP) necesita
ser recompilado. Si est utilizando paquetes (de tiempo de ejecucin o de
tiempo de diseo), puede encontrar conveniente crear expresamente un
directorio para los archivos de paquete (.DCP). Puede hacer esto seleccionando Tools | Environment y la pestaa Library, e introduciendo la
entrada apropiada en el cuadro de combinacin DCP Output Directory.
Esto ayudar a asegurar que el compilador siempre utilice el archivo de
paquete ms reciente (.DCP). Si est utilizando paquetes, podra encontrar
conveniente verificar que todos los paquetes tengan la opcin del compilador {$IMPLICITBUILD ON} habilitada.
Solucin rpida
Siga estos pasos para modificar la configuracin del Registro del sistema:
1. Seleccione Inicio | Ejecutar desde el escritorio de Windows.
2. Introduzca regedit en el cuadro de combinacin Abrir y pulse el botn
Aceptar.
3. Navegue hasta HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
NT\CurrentVersion\WinLogon\Shell.
4. Cambie el valor del parmetro Shell de Explorer.EXE userhook a Explorer.EXE.
5. Reinicie el equipo para que la configuracin tome efecto.
326
Informacin adicional
Esa mquina en cuestin hace una configuracin especial del Registro para
cargar una extensin del Explorer. No son tales alternativas un engorro? Son
simplemente otra oportunidad para confundir a Joe Sixpack (y ocasionar
incompatibilidades de software).
Solucin rpida
Registre la biblioteca de tipos Weblib.
Informacin adicional
Puede registrar WEB.TLB seleccionando el men Inicio de Windows y luego
introduciendo tregsvr WEBLIB.TLB.
Site Express apareci por primera vez en Delphi 6.
Solucin rpida
Introduzca una direccin vlida (entre 00000000 y FFFFFFFF).
Informacin adicional
Puede acceder al cuadro de dilogo Find Error seleccionando Search | Find
Error....
Mensajes de error
327
Solucin rpida
Verifique que los valores que estn siendo pasados a los parmetros Year,
Month y Day sean vlidos (tomados como un todo) antes de hacer la asignacin. Por ejemplo, puede validar la entrada del usuario intentando hacer una
conversin de tipos dentro de una sentencia Try. . . Except as:
procedure EncodeThisDate(YearValue, MonthValue, DayValue: Word);
var
CoddAndDate: TDateTime;
begin
try
CoddAndDate:= EncodeDate(YearValue,MonthValue,DayValue);
except
on EConvertError do
{Gestionar la excepcin}
end;
Informacin adicional
La funcin EncodeDate recibe tres parmetros: Year (ao), Month (mes) y Day
(da). El rango de valores vlidos para el parmetro Year es de 1 hasta 9999.
El rango de valores vlidos para el parmetro Month va de 1 a 12. El rango de
valores vlidos para el parmetro Day es de 1 hasta 28, 29, 30 31, en dependencia de los valores del mes y el ao.
328
Solucin rpida
Verifique que todos los valores que se pasan a travs de los parmetros Hour,
Min, Sec y MSec sean vlidos antes de una asignacin. Por ejemplo, valide la
entrada del usuario intentando hacer una conversin de tipos en una sentencia
Try. . . Except as:
procedure EncodeThisTime(HourVal, MinuteVal, SecondVal,
MillisecondVal: Word);
var
EncodedTime: TDateTime;
begin
try
EncodedTime := EncodeTime(HourVal,MinuteVal,SecondVal,
MillisecondVal);
except
on EConvertError do
{gestionar la excepcin}
end;
Informacin adicional
La funcin EncodeTime acepta cuatro parmetros: Hour (hora), Min (minuto),
Sec (segundos) y MSec (milisegundos). El rango de valores vlidos para el
parmetro Hour es de 0 hasta 23. El rango de valores vlidos para los parmetros Min y Sec va de 0 a 59. El rango de valores vlidos para el parmetro
MSec es de 0 hasta 999.
Solucin rpida
Seleccione diferentes tablas para las propiedades Destination y Source.
Informacin adicional
Para ms informacin, consulte TBatchMove en la ayuda de Delphi.
Mensajes de error
329
Solucin rpida
Incremente el parmetro BLOB SIZE con la utilidad BDE Configuration.
Para ello, abra la utilidad BDE Configuration/Administrator y navegue hasta
Configuration | Drivers | <Su base de datos>. Por ejemplo, si est utilizando
InterBase, navegue hasta Configuration | Drivers | Native | INTRBASE |
BLOB SIZE.
Puede que tambin sea conveniente aumentar el valor de SHAREDMEMSIZE
con el BDE Administrator. Para ello, abra la utilidad BDE Administrator y
siga estos pasos:
1. Seleccione la etiqueta Configuration en la seccin Drivers & System
(izquierda).
2. Seleccione System | Init.
3. Incremente el valor de SHAREDMEMSIZE.
Si est utilizando un objeto TQuery, sera conveniente reducir la cantidad de
registros en el conjunto resultado.
Informacin adicional
Nota: Si est utilizando conjuntos de resultados vivos, los parmetros BLOBS TO
CACHE y BLOB SIZE del BDE no tendrn efecto.
Este es el error del BDE nmero 10030.
330
Solucin rpida
Cree un ndice nico en cluster para la tabla.
Informacin adicional
Un ndice en cluster est almacenado fsicamente en el disco segn el orden del
ndice. Por esta razn, solamente se puede tener un ndice en cluster para una
tabla.
Solucin rpida
1. Utilice el formato:
{00000000-0000-0000-0000-000000000000}
Informacin adicional
1. Debe proporcionar las llaves al inicio y al final del GUID, como se muestra
arriba. Consulte GUIDs, ServerGUID y GUIDToString function en la
ayuda de Delphi para ms informacin.
2. La propiedad ServerName de TRemoteServer es opcional; el ServerGUID
no lo es.
Solucin rpida
Convierta la variable a un objeto de su mismo tipo o de un ancestro de aquel
tipo.
Mensajes de error
331
Informacin adicional
He aqu un ejemplo de cdigo que produce el mensaje de error bajo discusin:
procedure BrandoAsToughGuy;
var
b: TObject;
begin
b := TButton.Create(nil);
{funciona, ya que TButton desciende de TObject}
with B as TMemo do
{esto produce el mensaje de error,
ya que TMemo no es descendiente de TButton}
...
end;
Y tambin lo siguiente:
{$IFOPT IOCHECKSON}
//no se puede utilizar la forma larga de las opciones
//de compilacin con la directiva IFOPT
332
Solucin rpida
1. La forma correcta de utilizar las directivas de compilacin mostradas
arriba es:
uses
Windows, Messages, SysUtils, Classes,
Graphics, {$IFDEF WIN32} Registry,
{$ELSE} IniFiles, {$ENDIF} Controls;
Informacin adicional
Para ms informacin, consulte compiler directives en la ayuda de Delphi.
Invalid directory
Posible causa de error
Puede estar utilizando una versin antigua de Delphi y haber introducido algo
como C:\Archivos de programa\Borland\Database Desktop en la propiedad
DatabaseName de un objeto TTable.
Solucin rpida
Necesita introducir algo como: c:\progra~1\borland\databa~1 si la ruta contiene nombres de directorio de ms de ocho caracteres.
Informacin adicional
El mtodo preferido es crear un alias que haga referencia a la ubicacin de la
base de datos. Consulte Invalid file name en este libro.
Mensajes de error
333
2. Puede no haber especificado la sentencia SQL de la forma precisa (sintcticamente) en la que Delphi espera verla. Por ejemplo, la siguiente sentencia
puede generar este mensaje de error:
SELECT *
FROM Customers
WHERE State = 'ID'
Solucin rpida
1. Compruebe que solamente intenta acceder a campos que existen realmente
en la base de datos.
2. Puede necesitar poner el nombre de la tabla en maysculas y encerrar el
nombre del campo entre comillas dobles. Dada la sentencia SQL de arriba,
puede tener que modificarla as:
SELECT *
FROM CUSTOMERS
WHERE CUSTOMERS."State = 'ID'
Informacin adicional
Si est conectndose a una base de datos de servidor SQL, familiarcese con la
sintaxis SQL particular del servidor que est utilizando, as como con las
caractersticas que soporta (que cambian de un fabricante a otro).
Solucin rpida
Asigne siempre un tamao a los campos de tipo ftString, ftBCD, ftBytes,
ftVarBytes, ftBlob, ftMemo o ftGraphic.
Informacin adicional
No solamente el tamao no es aplicable a ciertos tipos de campos; an entre
aquellos a los que es aplicable, puede significar diferentes cosas. En el caso de
los campos de tipo cadena y Byte, Size se refiere a la cantidad de bytes que el
campo reservar para cada instancia. Cuando se aplica a un campo BCD, Size
es la cantidad de dgitos despus de la coma decimal. Para un campo BLOb,
334
Solucin rpida
Aunque es cierto que no se puede editar un campo Autoincrement, puede seleccionarlo incluso bajo las circunstancias anteriores actualizando la versin del
BDE a la 4.01 o superior.
Informacin adicional
Podra no ser bueno permitir que los campos autoincrementales sean actualizados, ya que son normalmente utilizados como claves primarias generadas
automticamente.
Mensajes de error
335
Solucin rpida
1. Si est utilizando la versin 3.5 del BDE (que viene con Delphi 2) y Windows 95B con la opcin de nombres de archivo largos habilitada (FAT32),
necesita instalar la versin 3.5f del BDE para poder acceder a las tablas
cuyas rutas incluyen nombres de archivo largos o espacios.
Una alternativa es colocar las tablas en una ruta que no incluya nombres
largos o espacios.
2. Consulte la documentacin de Novell para ver cul es la mxima longitud
de las rutas en su versin de Netware.
3. Renombre el directorio, eliminando el apstrofe.
4. Vuelva a mapear la unidad G: de su ordenador, de forma que pueda ver
el archivo que supuestamente est abriendo.
Informacin adicional
1. Descargue la versin ms reciente del BDE desde el sitio web de Borland.
Puede bajar la versin 3.5 del BDE desde el sitio web de Borland en
www.borland.com/techsupport/bde/utilities.html.
El nombre del parche es BDE v3.5 32-Bit core DLLs including FAT32
enhancement.
2. Si posteriormente obtiene un mensaje de error Path too long, actualice
las tablas de Paradox al nivel 7. Vea las instrucciones para hacer esto en
Higher table level required .
Puede comprobar qu versin de Windows utiliza pulsando con el botn
derecho del ratn sobre el icono Mi PC en el escritorio y seleccionando Propiedades en el men de contexto. El nmero de versin del sistema
operativo se muestra en la pgina General.
3. No es una buena prctica utilizar smbolos especiales (como apstrofes) en
los nombres de directorios o archivos.
336
Solucin rpida
1. Asegrese de que no asigna nmeros demasiado grandes, previnindolo
explcitamente en el cdigo o encerrando las asignaciones en un bloque
T r y . . . Except.
2. Encierre la llamada a Round o Trunc en un bloque Try. . . Except:
const
crlf = #13#10;
. . .
var
WhatGoesAroundComesA: Integer;
bent: double;
try
WhatGoesAroundComesA:= Round(bent);
except
on EInvalidOp do
MessageDlg('El nmero real es muy grande + crlf +
para caber en un tipo entero, mtError, [mbOK], 0);
end;
3. Actualcese a una mquina que tenga coprocesador matemtico (que ejecuta las operaciones de punto flotante por hardware) o aada la directiva
de compilador {$N-} en la parte superior de la unidad.
Informacin adicional
1. Para ms informacin, consulte real types en la ayuda de Delphi.
Mensajes de error
337
Solucin rpida
No utilice File como resultado devuelto por una funcin.
Informacin adicional
Para ms informacin, consulte function declarations y function calls en la
ayuda de Delphi.
Solucin rpida
No modifique los GUIDs. Son nmeros especiales que se generan
automticamente.
Informacin adicional
GUID significa Globally Unique Identifier (Identificador Global Unico). Para
ms informacin, consulte GUIDs en la ayuda de Delphi.
338
Solucin rpida
Utilice solamente tipos de ndices apropiados para la tabla con la que est
trabajando.
Informacin adicional
Para ms informacin, consulte AddIndex en la ayuda de Delphi.
Solucin rpida
Pase ixExpression en el parmetro IndexOptions del mtodo AddIndex:
Table1.AddIndex('ndxCityState','City+State', [ixExpression]);
Informacin adicional
Para ms informacin, consulte AddIndex en la ayuda de Delphi.
Mensajes de error
339
Solucin rpida
1. Compruebe que no asigna el mismo nombre de ndice ms de una vez.
Puede verificar si un ndice ya existe de esta manera:
if not Table1Stadt.IsIndexField then
AddIndex('ndxStadt', 'Stadt', []);
3. Asigne las opciones de ndice apropiadas para la tabla con la que est
trabajando.
4. No asigne ms de una clave primaria (ixPrimary) por tabla.
Informacin adicional
2. A los ndices compuestos de mltiples columnas se les puede dar nombres
distintos de las columnas sin proporcionar el parmetro de opcin de ndice
ixCaseInsensitive.
Si asigna a un ndice el mismo nombre del campo, no incluya el parmetro
de opcin de ndice ixCaseInsensitive. Por ejemplo, un ndice compuesto
sobre las columnas City y State podra ser definido as:
AddIndex('CityState','Stadt;Land',[]);
340
Solucin rpida
1. Elimine los parmetros adicionales de la declaracin.
2. Aada la palabra reservada Var a la declaracin.
Informacin adicional
Un procedimiento de gestin de mensajes de Windows acepta un nico parmetro. Debe ser un parmetro Var.
El mtodo de manejo de mensaje de arriba debera ser:
procedure WMChar(var Message: TWMChar); message WM_CHAR;
Solucin rpida
1. Seleccione un archivo con extensin .DPL (biblioteca de paquetes de Delphi) o una extensin .DPK (paquete de Delphi).
2. Vuelva a crear el archivo de paquete, si es necesario.
Mensajes de error
341
Informacin adicional
Puede obtener este error si instal un paquete y luego movi o borr algunos
de los archivos que lo componen. Seleccionar la casilla de verificacin para
intentar aadir de nuevo el paquete (y su pgina sobre la Paleta de Componentes) puede ocasionar este error. Elimine el paquete (pulsando el botn
Remove), coloque los archivos requeridos en uno de los directorios de la ruta
de bsqueda de Delphi, y luego aada de nuevo el paquete utilizando el botn
Add.
Invalid Parameter
Posible causa de error
Puede haber olvidado especificar el valor de TableName en el objeto TTable de
destino mientras ejecuta una operacin de movimiento en lote utilizando el
componente TBatchMove.
Solucin rpida
Debe especificar tanto las tablas fuente como de destino al utilizar el componente TBatchMove.
Informacin adicional
Para ms informacin, consulte TBatchMove en la ayuda de Delphi.
Solucin rpida
Utilice WideString como el tipo de la propiedad; String no es un tipo de automatizacin OLE.
Informacin adicional
Todos los tipos de automatizacin OLE deben ser compatibles con las variantes. Los siguientes tipos de Delphi pueden ser utilizados en proyectos de automatizacin: Byte, Currency, Double, IDispatch, Integer, IUnknown,
342
Invalid path
Consulte Invalid file name.
Solucin rpida
Asegrese de que no trata de liberar la memoria que ya ha sido liberada. Por
ejemplo, para garantizar que no se libere de nuevo la memoria que ya ha sido
liberada en el ejemplo de arriba, haga esto:
procedure FinallyFree;
var
Homework: Pointer;
begin
Mensajes de error
343
GetMem(Homework, 32);
try
try
{Acciones...}
except
FreeMem(Homework, 32);
end; //except
finally
{Lo siguiente funciona bien SIEMPRE}
if not Assigned(Homework) then
FreeMem(Homework, 32);
end; //finally
end;
Informacin adicional
Para ms informacin, consulte New, Dispose, FreeMem y GetMem en
la ayuda de Delphi.
Solucin rpida
Elimine el tratamiento de propiedades Published que est haciendo en el
mtodo DefineProperties (y otros mtodos relacionados, como ReadData y
WriteData).
Informacin adicional
Las propiedades que se definen como Published son serializadas automticamente por Delphi.
En ocasiones puede que necesite utilizar el mtodo DefineProperties, como
cuando quiera almacenar el estado de propiedades no publicadas.
344
Solucin rpida
1. Introduzca un valor que sea vlido para la propiedad en cuestin. Siempre
que se proporcione un cuadro de combinacin para escoger un valor de una
lista, utilcelo.
2. Elimine la lnea en el archivo .DFM o elimine la referencia al mtodo en la
pgina Events del Inspector de Objetos.
Informacin adicional
1. Todos los controles situados sobre el formulario se mostrarn en la lista
desplegable para la propiedad ActiveControl (como los objetos TButton,
TEdit, etc.), pero los componentes grficos (como TLabel, TImage), as como
los cuadros de dilogo, relojes del sistema (timers), etc., no se mostrarn,
ya que no son capaces de recibir el foco y por lo tanto no pueden ser el control activo.
2. Para recibir este mensaje, puede haber respondido al mensaje The <>
[method,property] referenced by <> does not exist. Remove the
reference? pulsando el botn No. Si selecciona Yes, la referencia ser
borrada del archivo de formulario (.DFM), y el mensaje de error bajo discusin no ser generado.
Solucin rpida
Visualice el archivo .DFM en el nmero de lnea indicado en el mensaje de
error para ver qu es lo que est causando el problema (Search | Go to Line
Number. . . ).
Informacin adicional
Los archivos .DFM son la representacin textual de los formularios. Ellos describen qu objetos estn sobre el formulario, dnde son mostrados sobre el formulario y su configuracin de propiedades.
Mensajes de error
345
Puede editar el archivo .DFM pulsando con el botn derecho del ratn sobre el
formulario y seleccionando View As Text del men de contexto. Los cambios
que haga en el .DFM se reflejarn sobre el propio formulario, de la misma
forma que los cambios que haga directamente sobre el formulario, como colocar
componentes sobre l y configurar sus propiedades, se reflejarn en el archivo
.DFM. Esto se conoce como edicin bidireccional (two-way editing).
En el siguiente fragmento de archivo .DFM aparece una coma incorrecta. Esto
generara el mensaje de error bajo discusin, indicando la lnea 5 como ubicacin del problema.
object Form1: Tform1
Left = 200
Top = 106
Width = 544
Height = ,375 {aqu est el problema}
Caption = 'Form1'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
PixelsPerInch = 96
TextHeight = 13
end
Solucin rpida
Cargue el recurso en un editor de recursos de 32 bits, como el Image Editor (en
Delphi de 32 bits), y luego gurdelo.
Informacin adicional
Abrir y luego guardar el recurso en un editor de 32 bits lo grabar como un
recurso de 32 bits.
346
Solucin rpida
1. Puede que tenga que copiar el cdigo del proyecto, iniciar un proyecto
nuevo, y pegar el cdigo del proyecto viejo al proyecto nuevo.
2. Para determinar cul es el paquete culpable, elimine los paquetes
siguiendo estos pasos:
a. Seleccione Components | Install Packages.
b. Localice un paquete de terceros fabricantes y desmarque su casilla de
verificacin.
c. Cierre y reinicie Delphi.
d. Repita el proceso hasta que Delphi deje de dar el mensaje de error, en
cuyo momento habr encontrado el paquete culpable.
e. Restaure cualquier paquete de terceros inocente que haya
deshabilitado y necesite utilizar.
Informacin adicional
Sea cauteloso al utilizar componentes de terceros provenientes de fuentes en
las que no tenga confianza plena. Vea los estudios de Delphi Informant para
obtener informacin sobre qu componentes de terceros tienen mejor calidad.
Contacte con el equipo Danysoft para conocer cuales son los que mejor se adaptarn a sus necesidades. Podra tambin ser beneficioso revisar el grupo de
noticias borland.public.delphi.thirdparty y el sistema e-commerce del Grupo
Danysoft: www.danyshop.com.
Invalid type
Posible causa de error
1. Puede estar intentando aadir un mtodo o propiedad miembro a una
interfaz en Delphi 6 o superior, y especific un tipo de datos no compatible
con COM. Por ejemplo, introducir
property Orwellian: String;
Mensajes de error
347
Solucin rpida
1. Utilice tipos que sean permitidos en COM, como WideString.
2. Consulte Unknown SQL Error.
Informacin adicional
El men Edit | Add to Interface apareci en Delphi 6.
Invalid typecast
Posible causa de error
1. Puede estar intentando hacer una conversin de tipos de un objeto o tipo a
un objeto o tipo con el que aqul no es compatible.
2. Puede estar intentando comparar tipos a travs de fronteras de mdulos
(.EXE a .DLL o .DLL a .DLL).
Solucin rpida
1. Haga conversiones de tipos solamente entre tipos compatibles. Puede
comprobar la compatibilidad utilizando los operadores Is y/o As. Por ejemplo, para ejecutar una operacin sobre un componente solamente si se trata
de un TTable, puede hacer algo como esto:
for i := 0 to ComponentCount-1 do
if Components[i] is TTable then
TTable(Components[i]).Close;
Informacin adicional
Estos son los tipos de conversin que son permitidos:
Un tipo ordinal o puntero a un tipo ordinal o puntero
Un carcter, cadena, array de char, o PChar a String
Un ordinal, real, cadena o variante a variante
Una variante a ordinal, real, string o variante
Una referencia a una variable a cualquier tipo con el mismo tamao
348
Y tambin esto:
SELECT *
WHERE Rebel = 'Without a clause'
7. Puede haber utilizado una sentencia SQL que hace referencia a un campo
que utiliza una palabra reservada de SQL, y no ha antepuesto al nombre
de campo el nombre de la tabla, ni encerrado el nombre de campo entre
comillas. Por ejemplo, lo siguiente generar este mensaje de error:
Mensajes de error
349
Solucin rpida
1. Inserte la clusula FROM junto con el nombre de la(s) tabla(s) de la(s) que
desea seleccionar registros. No puede utilizar parmetros (con la sintaxis
:<parmetro>) en la parte SELECT o FROM de una sentencia SQL. Vea
Informacin adicional ms abajo para ms informacin sobre cmo permitir
que el usuario seleccione las tablas y/o campos en tiempo de ejecucin utilizando la funcin Format.
2. Proporcione al menos un nombre de columna a continuacin de la palabra
reservada SELECT, y al menos un nombre de tabla despus de FROM.
3. Si utiliza una sentencia GROUP BY, proporcione al menos una funcin de
agregacin en la clusula SELECT, y agrupe por todas las columnas no
agregadas que especific en la clusula SELECT. Por ejemplo:
SELECT Fruit, Vegetable, Spice, Count(Dessert)
FROM Speisekarte
WHERE Calories > 1000
GROUP BY Fruit, Vegetable, Spice
350
Informacin adicional
Las sentencias SQL que devuelven un conjunto resultado requieren una clusula SELECT (que especifica las columnas que se retornarn en el conjunto
resultado; puede nombrarlas individualmente o utilizar * para indicar todas
las columnas). Adicionalmente, tales sentencias SQL necesitan una clusula
FROM (que especifica la tabla o tablas de las que se obtendrn las columnas).
La sentencia ORDER BY de SQL se utiliza para ordenar el conjunto resultado.
Por ejemplo, puede ordenar por el apellido ascendentemente (de la A a la Z).
Por ejemplo, si tuviera una tabla con varios valores en sus columnas City y
State, ordenarlas por el campo City y luego concatenarlas (City + ', ' + State)
podra producir algo as:
Anchorage, Alaska
Angels Camp, California
Arcata, California
Bethany, Oklahoma
Brookfield, Wisconsin
Brooklyn, New York
Coeur dAlene, Idaho
Eureka, California
Fort Bragg, California
Helena, Montana
Jenny Lind, California
Loleta, California
Mokelumne Hill, California
San Andreas, California
Zenia, California
La sentencia GROUP BY se utiliza para ejecutar operaciones de agregacin
(como SUM, COUNT, AVG, MIN, MAX) sobre grupos de registros con un valor
de columna en comn. Por ejemplo, si tuviramos una tabla con nombres de
jugadores de la NBA, el equipo en el que juegan y su salario, podramos
Mensajes de error
351
agruparlos por equipo y ejecutar una operacin SUM sobre la columna Salary,
lo que producira una tabla en la que habra un registro para cada equipo que
incluira el salario total de los jugadores del equipo.
6. Esto puede ocurrir si ha eliminado una seccin de una sentencia SQL que
no funciona bien durante la depuracin y luego olvid aadir el AND de
nuevo.
Solucin rpida
Cree una variable local para almacenar el valor de la propiedad, y luego psela
como parmetro. Por ejemplo:
var
s: String;
begin
s := Woman.EyeColor;
Insert(Source, s, 3);
Informacin adicional
Las propiedades no pueden ser pasadas como parmetros variables, debido a
que solamente se permite su modificacin a travs del mtodo de acceso de
escritura (y si no tienen un mtodo de escritura, se trata de propiedades de
slo lectura). Las propiedades son simplemente una interfaz de acceso a una
localizacin de memoria, normalmente un campo de la seccin Private de la
clase. Por lo tanto, al modificar una propiedad, se estara modificando el campo
privado, y solamente la propia clase puede hacer eso; por esta razn, las propiedades (un envoltorio alrededor de los campos) no pueden ser modificadas.
352
procedure DivideVariants;
var
v1,v2: variant;
begin
v1 := 100;
v2 := 'Ciao, baby';
v1 := v1 div v2; {error generado aqu}
end;
...
{Table1Area es de tipo TFloatField}
StringGrid1.Cells[1,1] := Table1Area.AsVariant + 'goo';
Solucin rpida
1. Utilice conversiones entre variantes solamente de una manera que sea
lgica y pueda ser entendida por el compilador. He aqu un ejemplo de una
conversin de tipos variantes que es permitida:
procedure DivideVariants;
var
v1,v2: variant;
begin
v1 := 100;
v2 := '3';
v1 := v1 div v2; //produce como resultado 33
end
2. Los ndices basados en una nica columna de la tabla implcita deben tener
el mismo nombre que la columna. Los ndices basados en mltiples columnas (ndices compuestos) pueden tener nombres descriptivos de los campos
que contienen. No asigne a un ndice el nombre Null.
Informacin adicional
Para ms informacin, consulte variants: assigning values en la ayuda de
Delphi.
Mensajes de error
353
Key Violation
Posible causa de error
1. Puede estar intentando aadir un registro con un valor de clave primaria
que ya existe en la tabla.
2. Puede haber intentado aadir registros de una tabla con una clave primaria a una tabla sin clave primaria utilizando el componente TBatchMove
en el modo batAppendUpdate.
Solucin rpida
1. Evite que se introduzcan valores primarios duplicados. Puede protegerse de
esta posibilidad encerrando el cdigo en un bloque Try. . . Except si quiere
presentar al usuario un mensaje personalizado, y quizs mover el cursor de
nuevo al control en el que se muestra la clave primaria. Por ejemplo, en el
cdigo que responde a la violacin de clave, podra hacer algo as:
const
crlf = #13#10;
. . .
try
Table1.Post;
except
on E: Exception do
if E.Message = 'Key violation' then
begin
MessageDlg('El valor ya existe en la tabla.' + crlf +
Por favor, intntelo de nuevo.', mtError, [mbOK], 0);
Edit1.Color := clRed;
Edit1.SetFocus;
end;
end;
. . .
Informacin adicional
Obtener una violacin de clave es mejor que la alternativa tener mltiples
registros con un mismo valor en una columna primaria. Esta es definitivamente una de las reas en donde los mensajes de error son sus amigos.
354
Solucin rpida
Si utiliza etiquetas y sentencias GoTo, stas deben aparecer en el mismo
procedimiento.
Informacin adicional
Borland Object Pascal no permite que las sentencias GoTo atraviesen las fronteras de procedimiento, aunque Pascal estndar si. Las etiquetas y sus correspondientes sentencias GoTo son normalmente utilizadas para el manejo de
errores, y Delphi proporciona un mecanismo mucho mejor para esto: la gestin
de excepciones. Para ms informacin, consulte exceptions en la ayuda de
Delphi.
En cualquier caso, los verdaderos programadores nunca utilizan sentencias
GoTo ;-)
Solucin rpida
Defina las etiquetas una y solamente una vez.
Informacin adicional
Las etiquetas y sus correspondientes sentencias GoTo son normalmente utilizadas para el manejo de errores, y Delphi proporciona un mecanismo mucho
Mensajes de error
355
Solucin rpida
No declare etiquetas en la parte Interface de una unidad (antes de la palabra
reservada Implementation).
Informacin adicional
Las etiquetas y sus correspondientes sentencias GoTo son normalmente utilizadas para el manejo de errores, y Delphi proporciona un mecanismo mucho
mejor para esto: la gestin de excepciones. Para ms informacin, consulte
exceptions en la ayuda de Delphi.
En cualquier caso, los verdaderos programadores nunca utilizan sentencias
GoTo ;-)
356
Solucin rpida
Debe definir el lugar de la etiqueta:
procedure Alamo;
label SpursThatJingleJangleJingle;
begin
if { condicion } then
goto SpursThatJingleJangleJingle;
. . .
SpursThatJingleJangleJingle:
. . .
end;
Informacin adicional
Las etiquetas y sus correspondientes sentencias GoTo son normalmente utilizadas para el manejo de errores, y Delphi proporciona un mecanismo mucho
mejor para esto: la gestin de excepciones. Para ms informacin, consulte
exceptions en la ayuda de Delphi.
En cualquier caso, los verdaderos programadores nunca utilizan sentencias
GoTo ;-)
Label expected
Posible causa de error
Puede haber hecho referencia a una etiqueta en una sentencia GoTo e incluso
haberla definido, pero no la ha declarado. Por ejemplo, lo siguiente generar
este mensaje de error:
function Junction: variant;
begin
if TankIsEmpty then
goto Shell;
{ ... }
Shell:
{ ... }
end;
Solucin rpida
Declare y defina la etiqueta antes de hacer referencia a ella:
function Junction: variant;
label Shell;
begin
if TankIsEmpty then
goto Shell;
{ ... }
Mensajes de error
357
Shell:
{ ... }
end;
Informacin adicional
Las etiquetas y sus correspondientes sentencias GoTo son normalmente utilizadas para el manejo de errores, y Delphi proporciona un mecanismo mucho
mejor para esto: la gestin de excepciones. Para ms informacin, consulte
exceptions en la ayuda de Delphi.
En cualquier caso, los verdaderos programadores nunca utilizan sentencias
GoTo ;-)
358
5. Puede haber intentado asignar un valor a un puntero utilizando una sintaxis incorrecta (tipo puntero a puntero). Por ejemplo, lo siguiente generar
este mensaje de error:
procedure DysfunctionalPoynter;
type
iptr = ^Integer;
var
i:integer;
q:iptr;
begin
^q := @i;
end;
6. Puede haber intentado ejecutar la funcin Inc sobre una propiedad de una
clase. Por ejemplo, lo siguiente generar este mensaje de error:
inc(ZipObj.CurrentDisketteNumber);
Solucin rpida
1. No haga asignaciones a constantes. Borre la sentencia de asignacin o cambie la constante por una variable inicializada.
2. No haga asignaciones a parmetros constantes. Borre la sentencia de asignacin o cambie el parmetro constante por un parmetro pasado por valor
o por referencia.
3. No haga asignaciones al resultado de una funcin fuera de la propia
funcin.
4. Incremente o decremente solamente variables ordinales:
inc(i); { donde i es un variable Integer }
dec(n);
// q apunta a la variable i
// asigna 5 a i a travs de q
Mensajes de error
359
Informacin adicional
4. Inc y Dec tienen un segundo parmetro opcional, que especifica en cunto
incrementar o decrementar la variable que est siendo manipulada. Para
ms informacin, consulte assignment statements en la ayuda de Delphi.
6. Para ms informacin, consulte Invalid variable reference.
Solucin rpida
Introduzca un nmero que no sea mayor que la cantidad total de lneas que la
unidad actual contiene.
Informacin adicional
Puede ir directamente a un nmero de lnea en la unidad activa seleccionando
Search | Go To Line Number.. y luego introduciendo un nmero en el cuadro de dilogo Go To Line Number y pulsando OK.
360
Solucin rpida
Asigne a la propiedad Capacity un valor menor o igual que 16.380 en Delphi 1
134.217.727 en Delphi de 32 bits.
Informacin adicional
Para ms informacin, consulte Capacity en la ayuda de Delphi.
1. (B) Una de las mucha maneras de provocar este mensaje de error es llamar
al mtodo Move de TString, proporcionando un parmetro invlido para
uno o los dos argumentos:
var
NoneAttached: TStrings;
begin
NoneAttached := TStringList.Create;
NoneAttached.Move(0, 1);
2. Puede tambin obtener este error al eliminar los elementos de una lista
dentro de un bucle For. . . To que utiliza la cantidad de elementos de la lista
como valor final, ya que sta ir disminuyendo dinmicamente (pero el
bucle For intentar continuar hasta el valor Count-1). Por ejemplo, lo
siguiente ocasionar este error:
var
i: integer;
begin
with ListBox1 do
begin
Items := ListBox2.Items;
Mensajes de error
361
for i := 0 to Items.Count-1 do
if Items[i]='' then Items.Delete(i);
end;
end;
Solucin rpida
1. (A) Asegrese de hacer una asignacin al elemento de la lista que quiere
acceder antes de hacer referencia a l. Utilizando el ejemplo de arriba,
podra hacer referencia al elemento 0:
. . .
362
1. (B) Asigne valores a los elementos que desea intercambiar antes de llamar
al mtodo Move:
var
NoneAttached: TStrings;
begin
NoneAttached := TStringList.Create;
try
NoneAttached.Add('move me');
NoneAttached.Add('me too');
NoneAttached.Move(0, 1);
. . .
2. Intercambie los valores inicial y final de la variable de control del bucle For
y utilice una construccin For. . . Downto:
var
i: integer;
begin
with ListBox1 do
begin
Items:=ListBox2.Items;
for i := Items.Count-1 downto 0 do
if Items[i]='' then Items.Delete(i);
end;
end;
Informacin adicional
El nmero entre parntesis (en el mensaje de error) indica el ndice que no
existe y al que se intent acceder.
6. Utilice Open con las sentencias SQL que devuelven un conjunto de resultados (como las sentencias SELECT). Utilice ExecSQL con las sentencias
INSERT, DELETE y UPDATE.
Mensajes de error
363
Solucin rpida
Declare todos los tipos de clases como globales, y no locales (dentro de una funcin o procedimiento).
Informacin adicional
Para ms informacin, consulte class types en la ayuda de Delphi.
Solucin rpida
1,2. No asigne procedimientos o funciones locales a variables de tipo procedimiento ni los pase como parmetros.
Informacin adicional
La razn para que esto no sea permitido es que la funcin o procedimiento
local podra ser llamado cuando el procedimiento o funcin al que pertenece no
est activo, causando potencialmente violaciones de acceso.
364
Solucin rpida
1. Configure el Directorio Privado para que apunte a un directorio sobre el
disco duro de cada usuario (como C:\Temp\{ Nombre_ejecutable }). Podra
hacerlo de esta manera:
var
Extension, ExecName, PrivDir : String;
ExtensionPos: Integer;
. . .
ExecName := ExtractFileName(Application.ExeName);
Extension := ExtractFileExt(Application.ExeName);
ExtensionPos := Pos(Extension, ExecName);
Delete(ExecName,ExtensionPos,4);
PrivDir := 'C:\Temp\' + ExecName;
if not DirectoryExists(PrivDir) then
CreateDir(PrivDir);
if DirectoryExists(PrivDir) then
Session.PrivateDir := PrivDir
else
raise Exception.Create('El directorio privado no fue creado!');
end;
Mensajes de error
365
Informacin adicional
2,4. Si deja en blanco la configuracin de PrivateDir, el directorio privado ser
por defecto el directorio actual (muy probablemente el directorio en el que
la aplicacin reside). TSession contiene una propiedad PrivateDir a la que
se puede asignar un valor. Una sesin se crea automticamente de forma
oculta para cada aplicacin de BDE. Para ms informacin, consulte
TSession.PrivateDir.
5. ApplyUpdates enva la actualizacin a la base de datos. CommitUpdates
limpia la cach local.
Es preferible utilizar un componente TDatabase y llamar a su mtodo
ApplyUpdates (en lugar de llamar al mtodo ApplyUpdates de un TDataset).
El mtodo ApplyUpdates de TDatabase acepta como parmetro un array de
objetos TDataset (el mtodo ApplyUpdates de TDatasets no tiene parmetros).
El mtodo ApplyUpdates de TDatabase llama a CommitUpdates para cada uno
de los conjuntos de datos que se le proporciona.
Si el ejecutable y las tablas comparten el mismo directorio, el archivo de bloqueos (.LCK) aumentar de tamao cada vez que una consulta sea ejecutada.
Tambin debe asignar True a Local Share en caso de que las tablas tambin
estn siendo accedidas por motores de base de datos distintos del BDE, como
JET u ODBC.
Si Local Share tiene asignado False, ningn archivo de bloqueo (.LCK) ser
creado.
366
Solucin rpida
Cierre las aplicaciones que estn enfrentadas y borre todos los archivos .LCK.
Informacin adicional
Si no ha codificado especficamente lgica de bloqueos en la aplicacin (si permite que el BDE maneje estas situaciones), este mensaje de error puede haber
sido ocasionado por un problema de red (o sea, esto no es necesariamente un
problema de Delphi/BDE).
Lock Violation
Posible causa de error
1. Puede estar ejecutando un programa de base de datos creado en Delphi 1
sobre una mquina ejecutando Windows 95 que tambin contiene las
tablas de base de datos.
2. Puede estar utilizando el BDE de 16 bits en una red mixta (en la que se
combinan mquinas con Windows 3.x y Windows 95/98/NT).
Solucin rpida
1. En este caso hay dos maneras de resolver el problema:
Recompilar la aplicacin en una versin de 32 bits de Delphi (versin 2 o
superior).
-OMover las tablas a un mquina que est ejecutando Windows 3.x.
2. Siga estos pasos sobre cada mquina de Windows 95:
a. Seleccione Inicio | Configuracin | Panel de Control.
b. Haga doble clic sobre el icono Sistema.
c. Seleccione la pgina Rendimiento.
d. Pulse el botn Sistema de Archivos.
e. Seleccione la pgina Solucin de problemas.
f. Seleccione Deshabilitar la nueva semntica de bloqueos y uso
compartido de archivos.
g. Reinicie el sistema.
Mensajes de error
367
Informacin adicional
1. Si quiere mantener la configuracin tal como est, puede ser til intentar
uno o ambas de estas secuencias:
Solucin rpida
No borre componentes o elementos de los cuales dependan otros miembros de
su formulario o proyecto.
Informacin adicional
Los campos calculados y de bsqueda puede ser tiles para mostrar informacin que puede ser deducida de otras columnas. Esto ahorra espacio en las
tablas y es una manera flexible de mostrar los datos pertinentes. Un ejemplo
comn es crear un campo calculado que multiplica la cantidad vendida por el
precio de cada tem.
368
-oPuede haber declarado un rango de valores en una sentencia Case donde el elemento mayor aparece primero. Por ejemplo, lo siguiente generar este mensaje
de error:
case Vehicles of
0: ShowMessage('Hoofin'' it');
2..1: ShowMessage('Motorin''); {debe ser 1..2}
. . .
Solucin rpida
Declare los tipos subrango y los rangos de etiquetas Case linealmente (del
valor ms pequeo al ms grande).
Informacin adicional
Para ms informacin, consulte subrange types y case statements en la
ayuda de Delphi.
Solucin rpida
Si quiere borrar un registro maestro que tenga asociados registros hijos en una
tabla de detalle, primero deber borrar los registros hijos de la tabla Detalle.
Puede hacer esto mediante programacin, utilizando una sentencia DELETE
de SQL en el evento BeforeDelete de la tabla maestra. Por ejemplo, si quiere
borrar todas las referencias a un atleta especfico de una base de datos, podra
borrar primero los registros de detalle as:
Mensajes de error
369
Informacin adicional
Los registros de detalle son aquellos relacionados con el maestro a travs de un
campo de clave fornea (que es normalmente la clave primaria de la tabla
maestra).
Al utilizar tablas Paradox, puede asignar la regla de actualizacin a Cascade
(en cascada) o Prohibit (prohibir) cuando configure la integridad referencial.
(La integridad referencial es la causante del mensaje de error evita que se
borren registros que dejaran registros hurfanos en la tabla de detalle). La
configuracin Cascade cambiar el valor relacionado en la tabla de detalle
cuando cambie el valor de la clave primaria en la tabla maestra. La configuracin Prohibit impide que se modifiquen o borren los valores primarios en la
tabla maestra si existen hijos en la tabla de detalle.
370
Solucin rpida
Borre primero los registros hijos en la tabla de detalle, y luego borre todo el
contenido de la tabla maestra.
Informacin adicional
Consulte Master has detail records. Cannot delete or modify.
Solucin rpida
Si est introduciendo registros en la tabla de detalle (y no en la tabla maestra),
debe asegurarse de seleccionar un valor que exista en la clave primaria de la
tabla maestra utilizando un control TDBLookupComboBox conectado al campo
de clave primaria de la tabla maestra.
Si est introduciendo simultneamente registros tanto en la tabla maestra
como en la de detalle, asegrese de que est grabando primero el registro
maestro utilizando el evento BeforeInsert del componente TTable que representa a la tabla de detalle, as:
procedure TOrderForm.TblDetailBeforeInsert(DataSet: TDataset);
begin
if TblMaster.State = dsInsert then
begin
TblMaster.Post;
TblMaster.Edit;
end;
end;
Informacin adicional
Para ms informacin, consulte master tables en la ayuda de Delphi.
Mensajes de error
371
Solucin rpida
Incremente el valor de MaxValue en el Database Desktop o asigne un valor
menor o igual que el parmetro configurado al campo. Alternativamente, puede
asignar un valor a la propiedad MaxValue del objeto TField dentro del entorno
integrado de Delphi.
Informacin adicional
Configurar la propiedad MaxValue dentro del entorno integrado de Delphi ocasionar un mensaje ms informativo si posteriormente asigna un valor demasiado grande: <> is not a valid value for field <>. The allowed range is
<> to <>.
Para ms informacin, consulte MaxValue en la ayuda de Delphi.
Solucin rpida
Descargue el ltimo parche/actualizacin para MS SQL Server.
Informacin adicional
Una solucin que ha sido sugerida es asignar 1 al parmetro Drivers Flag en
la utilidad BDE Configuration (Drivers | MS SQL | Drivers Flag).
372
Solucin rpida
Asegrese que cualquier archivo que intente cargar en la propiedad Picture de
un componente TImage sea un archivo grfico vlido.
Informacin adicional
Delphi proporciona soporte para cuatro formatos grficos, denominados .BMP
(mapas de bits), .ICO (iconos), .WMF (Windows Metafile), y .EMF (Enhanced
Metafile).
Puede ser que la extensin del archivo fuera cambiada de tal forma que parece
un metaarchivo por su extensin (pero no lo es realmente).
Consulte Unknown picture file extension: <>.
Y la clase descendiente:
type
TGuitar = class
procedure WalkAndRock; virtual;
end;
Solucin rpida
1,2. Aada la directiva Override a un mtodo virtual redefinido una clase
descendiente, as:
type
. . .
Mensajes de error
373
public
constructor Create(AOwner: TComponent); override;
Despus, utilice la palabra reservada Inherited para implementar la funcionalidad de la clase ancestro antes de aadir la nueva funcionalidad.
constructor TForTwo.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FGuest := 'Tillerman';
. . .
Informacin adicional
Puede promover un mtodo o propiedad heredado redeclarndolo en la seccin
en la que quiere que aparezca en la clase descendiente. Cuando promueva una
propiedad heredada de una clase ancestro, no necesita especificar el tipo de
propiedad o los mtodos de escritura y lectura simplemente proporcione el
nombre de la propiedad en la seccin Public o Published, as:
published
property OfAlcatraz;
Solucin rpida
Asegrese de que cualquier mtodo que intente redefinir exista en la clase
ancestro. Si no existe, elimine la directiva Override.
Informacin adicional
Para ms informacin, consulte virtual methods en la ayuda de Delphi.
374
Solucin rpida
Asegrese de que cualquier mtodo al que llame est realmente implementado
por el objeto OLE que usted ha instanciado. Puede importar la biblioteca de
tipos (lo que en el caso de Excel producir el archivo Excel_TLB.PAS) y ver qu
mtodos contiene. Para importar la biblioteca de tipos, siga estos pasos:
1. Localice el archivo .OLB (Object LiBrary) (o el archivo *.TLB, *.OCX,
*.DLL, o *.EXE) que desea importar.
2. Seleccione Project | Import Type Library.
3. Pulse el botn Add, navegue hasta el directorio apropiado, y seleccione el
archivo.
4. Seleccione Install para instalarlo dentro de un paquete o Create Unit
para crear una unidad y aadirla al proyecto actual.
Informacin adicional
Si utiliza enlace temprano (early binding), el compilador puede capturar estos
tipos de errores. Si utiliza enlace tardo (late binding), no notar el problema
hasta que el cdigo sea llamado en tiempo de ejecucin. Si importa la biblioteca
de tipos del objeto OLE, puede utilizar el archivo .PAS creado (enlace temprano). Delphi 5 y superiores proporcionan muchos servidores OLE en la
pgina Servers de la Paleta de Componentes. Puede tambin evaluar la suite
de componentes para Microsoft Office OfficePartner, distribuida por Danysoft.
Solucin rpida
Asegrese de que cualquier mtodo que intente sobrecargar difiera en cuanto a
signatura de los dems mtodos a los que tambin ha asociado la directiva
Overload. Por ejemplo, en el caso de arriba puede hacer algo as:
Mensajes de error
375
Informacin adicional
Note que no es vlido aadir la directiva Override a ms de uno de los mtodos
sobrecargados, ya que el mtodo redefinido puede solamente compartir una
lista de parmetros idnticos con slo uno de los mtodos sobrecargados que se
declaren. Si se hubiera aadido la directiva Override a ambos mtodos, se
obtendra el mensaje de error Declaration of <> differs from previous
declaration.
376
Solucin rpida
1. Borre la T del nombre del tipo. Por ejemplo, esto compilara bien (asumiendo que la variable de formulario es Form1):
procedure loopdeloop;
begin
Form1.Label1.Caption := IntToStr(SizeOf(Byte));
end;
Informacin adicional
Para ms informacin, consulte object-oriented programming | programming
with Delphi objects en la ayuda de Delphi.
Mensajes de error
377
type
IDelawareIgnoresSourPatch = dispinterface
['{00000000-0000-0000-0000-000000000000}']
procedure RoverDover; register;
end;
Solucin rpida
Elimine la directiva.
Informacin adicional
Este elemento de men est disponible solamente en Delphi 4. Est deshabilitado, a menos que haya aadido un Mdulo de Datos MTS a su proyecto. Presumiblemente, usted no seleccionar el elemento de men Run | Install MTS
Objects. . . a menos que haya instalado MTS. En otras palabras, probablemente slo obtendr este mensaje de error si est haciendo experimentos.
Solucin rpida
Disminuya el valor del parmetro MinValue en el Database Desktop, o asigne
un valor mayor o igual que el parmetro MinValue al campo. Alternativamente, puede asignar un valor a la propiedad MinValue de un objeto TField en
el entorno integrado de Delphi.
Informacin adicional
Configurar la propiedad MinValue en el entorno integrado de Delphi producir
un mensaje de error ms informativo si posteriormente se asigna un valor
menor que el mnimo: <> is not a valid value for field <>. The allowed
range is <> to <>.
Para ms informacin, consulte MinValue en la ayuda de Delphi.
378
Mismatch in datapacket
Posible causa de error
Puede estar intentando leer de un flujo (stream) sin haberse posicionado al inicio antes de leer. Por ejemplo, lo siguiente generar este mensaje de error:
var
Consciousness: TMemoryStream;
begin
Consciousness := TMemoryStream.Create;
try
ClientDataSet1.SaveToStream(Consciousness);
ClientDataSet1.LoadFromStream(Consciousness);
finally
Consciousness.Free;
end;
end;
Solucin rpida
Asigne 0 a la posicin actual del flujo antes de intentar leer de l:
var
Consciousness: TMemoryStream;
begin
Consciousness:= TMemoryStream.Create;
try
ClientDataSet1.SaveToStream(Consciousness);
Consciousness.Position := 0; { aada esta lnea }
ClientDataSet1.LoadFromStream(Consciousness);
finally
Consciousness.Free;
end;
end;
Informacin adicional
Consulte TClientDataset en la ayuda de Delphi para informacin relacionada
sobre el almacenamiento de datos en memoria.
Missing comma
Posible causa de error
Puede estar utilizando Delphi 1 y haber proporcionado varios parmetros a la
propiedad SQL de un TQuery.
Mensajes de error
379
Solucin rpida
Obtenga el parche 1.02 de Delphi 1 del sitio Web de Borland.
Informacin adicional
Aplique siempre la ltima versin de los parches de Delphi y del BDE (as
como de la base de datos de servidor SQL, si puede) para un mejor
funcionamiento.
Para ms informacin, consulte queries en la ayuda de Delphi.
Solucin rpida
1,2. Conecte el componente TADOQuery o TADODataset a un componente
TADOConnection a travs de su propiedad Connection, as:
Connection := ADOConnection1;
Informacin adicional
Alternativamente, puede especificar una cadena de conexin para el componente TADOQuery o TADODataSet. Si lo hace, pulse sobre el botn a la
derecha de la propiedad ConnectionString para desplegar su editor de propiedades. Es preferible utilizar un componente TADOConnection para toda la
380
Solucin rpida
1. Proporcione un componente TProvider en la propiedad ProviderName del
componente TClientDataSet.
2. Proporcione cdigo que valide y responda a la posibilidad de no obtener
datos del servidor de aplicacin. Por ejemplo, podra intentar algo como lo
siguiente:
if ClientDataSet1.RecordCount = 0 then
{ ... }
if ClientDataSet1.IsEmpty then
{ ... }
if (cds.BOF) and (cds.BOF) then
{ ... }
3. Asigne un archivo .CDS (binario) o .XML a la propiedad FileName del componente ClientDataSet.
4. No se puede utilizar SQL sobre conjuntos locales (de una capa), que son
almacenados en disco en lugar de una base de datos. O sea, la propiedad
CommandText no est disponible en este contexto. Para insertar, actualizar y borrar datos, puede utilizar los mtodos InsertRecord y Delete de
Mensajes de error
381
TClientDataSet. Por ejemplo, para borrar un registro, puede primero localizar el registro, y luego llamar al mtodo Delete, as:
CdsDinnerGuests.Locate(FName;LName,
VarArrayOf(['Jeffrey', 'Dahmer']), [loPartialKey]);
cdsStudents.Delete;
Informacin adicional
2. Para ms informacin, consulte RecordCount, BOF, EOF y IsEmpty
en la ayuda de Delphi.
3. Vea los mtodos SaveToFile y SaveToStream de TClientDataSet, los cuales
(a partir de Delphi 6) tienen un segundo parmetro, que puede ser dfBinary, dfXML o dfXMLUTF8.
Solucin rpida
Asegrese de que cada sentencia {$IFDEF} tenga un sentencia {$ENDIF}
correspondiente.
Informacin adicional
Consulte Invalid compiler directive: <>.
382
Solucin rpida
1. Siempre aada un punto y coma al final de cada lnea, a menos que est
partiendo una sentencia If en muchas lneas.
2. Aada el operador o palabra reservada que falta (Do en este caso):
with Table1 do
begin
3. Si tiene una cadena dividida a lo largo de varias lneas, concatnelas utilizando el operador de concatenacin (+).
4. Borre la comilla simple sobrante.
5. Cualifique la llamada, anteponiendo el nombre de la unidad en la que el
procedimiento que quiere utilizar est declarado. Por ejemplo, para resolver la situacin antes descrita, utilice System.Delete. Alternativamente,
mueva la unidad que contiene el identificador al que quiere acceder para
que quede detrs de la unidad que contiene un identificador con el mismo
nombre en la clusula Uses. Por ejemplo, si est intentando utilizar el procedimiento DeleteFile de la unidad SysUtils, site esa unidad detrs de la
unidad Windows en la clusula Uses, ya que la unidad Windows en Delphi
de 32 bits tambin contiene un procedimiento DeleteFile.
Informacin adicional
1. Note que es necesario aadir un punto y coma al final de cada sentencia.
Normalmente, es lo mismo que aadir un punto y coma al final de cada
lnea; sin embargo, esto no es siempre cierto. Una sentencia If, por ejemplo,
puede extenderse a lo largo de varias lneas. Debe esperar hasta el final de
la sentencia para aadir un punto y coma.
3. Esta es la forma de concatenar una cadena en varias lneas (no aadir el
operador de concatenacin (+) genera el mensaje de error bajo discusin):
s := 'What would you rather eat: the fat from '
+ 'Behind a caribous eyeball or a frosted '
+ 'portart. (McFee)';
Mensajes de error
383
5. Consulte Constant or type identifier expected y Undeclared Identifier: <>. Si identificadores idnticos aparecen en mltiples unidades, la
declaracin situada en la unidad que aparece en ltimo lugar en la clusula Uses es la que recordar el compilador.
Solucin rpida
Debe especificar qu smbolo est verificando, definiendo o indefiniendo, as:
uses
Windows, Messages, SysUtils, Classes,
Graphics, {$IFDEF WIN32} Registry, {$ELSE}
IniFiles, {$ENDIF}
Informacin adicional
Para ms informacin, consulte conditional directives en la ayuda de Delphi.
384
Solucin rpida
Debe especificar el tipo de datos cuando declare procedimientos o funciones que
acepten parmetros por valor. Por ejemplo, para solucionar la declaracin de
arriba, podra hacer esto:
procedure fudgsicle(a: byte);
Informacin adicional
Puede declarar procedimientos y funciones que acepten parmetros variables
(Var) o constantes (Const) sin especificar los tipos de datos. Las siguientes dos
declaraciones son legales:
procedure fudgsicle2(var a);
procedure fudgsicle3(const a);
Solucin rpida
Borre el apstrofe solitario o adale su pareja.
Informacin adicional
Consulte QuotedStr en la ayuda de Delphi.
Mensajes de error
385
Solucin rpida
1. Seleccione uno de los alias del BDE que han sido creados en su sistema de
la lista desplegable de la propiedad DatabaseName.
Alternativamente, proporcione la ruta completa del directorio en el que las
tablas residen. Por ejemplo, en una instalacin por defecto de Delphi,
podra asignar el alias DBDEMOS, seleccionndolo de la lista desplegable,
o introducir directamente una ruta como: C:\Archivos de programa\Borland\Delphi X\Demos\Data.
2,3. Seleccione una tabla del cuadro de combinacin que ofrece la propiedad
TableName del componente TTable y luego reintente la operacin. Si no
aparece ninguna tabla en la lista, primero tendr que asignar la propiedad
DatabaseName. Para hacer esto, seleccione un alias del cuadro de combinacin de la propiedad DatabaseName o introduzca la ruta (si utiliza tablas
locales en lugar de tablas SQL). Ahora tendr una lista de las tablas que
pertenecen al alias (o estn situadas en el directorio indicado). Seleccione
una de ellas.
Informacin adicional
Puede configurar la propiedad DatabaseName para que busque en las tablas
situadas en el mismo directorio donde reside el ejecutable introduciendo /.
(una barra seguida de un punto) como valor de la propiedad DatabaseName.
Esto es un compromiso entre utilizar un alias y una ruta indicada explcitamente. No es tan rgido como una ruta fija, ni tan flexible como un alias.
Solucin rpida
1. Cierre todas las instancias innecesarias de Delphi.
2. Si era su intencin hacerlo (grabar una versin diferente del archivo), pulse
el botn Yes para desechar el dilogo y reemplazar el archivo existente por
el que se ha marcado.
386
Informacin adicional
Podra ver este mensaje de error si selecciona varios archivos de Delphi en el
Explorador y luego accidentalmente pulsa dos veces sucesivamente sobre uno
de ellos. Esto ejecuta una accin de doble clic sobre todos los archivos seleccionados, y una instancia de Delphi es iniciada para cada archivo individual. Si
esto ocurre, puede obtener este mensaje de error One or more lines were
too long and have been truncated.
Solucin rpida
1. Cambie el nombre del archivo de nuevo a su nombre original, o cmbielo en
el entorno integrado al nombre que le asign fuera.
2. Reincorpore la clusula Uses e incluya al menos una unidad en ella.
3. Borre los archivos .DSK y/o .DOF, ya que pueden hacer referencia a archivos en el directorio anterior.
Informacin adicional
1. Si cambia un nombre de unidad fuera de Delphi, este cambio no es automticamente transmitido al resto del proyecto, que lo conoce por el nombre
anterior. Por lo tanto, no haga esto.
2. Puede incluir una unidad pequea para satisfacer la necesidad de utilizar
al menos una unidad. Podra crear una unidad falsa que simplemente contenga lo mnimo indispensable para ser sintcticamente correcta, pero que
no proporcione ninguna funcionalidad. Por ejemplo, si simplemente aade
una unidad a su proyecto, ste se ver as:
unit Unit2;
interface
implementation
end.
Mensajes de error
387
Solucin rpida
1. Configure cada mquina de usuario de tal manera que todas utilicen el
mismo archivo de control de red (PDOXUSRS.NET). Puede hacer esto
siguiendo los pasos apropiados segn la versin de Delphi que tenga:
Delphi 1
Si cada usuario tiene su propia copia de BDE en su mquina, puede utilizar la
utilidad BDE Configuration para asignar el directorio del archivo de control de
red. Para hacer esto, siga estos pasos:
a. Abra la utilidad de configuracin de BDE.
b. Con la entrada Paradox seleccionada en el cuadro de lista Driver
Name, introduzca la ruta completa del directorio de red compartido en
donde se almacena el archivo de control de red (PDOXUSRS.NET) en
el parmetro NET DIR.
c. Seleccione File | Exit para grabar los cambios.
Si algn usuario no tiene una copia de la utilidad BDE Configuration, asegrese de que la ubicacin actual del archivo IDAPI.CFG (C:\IDAPI por defecto)
coincide con la que est almacenada para la entrada CONFIGFILE01 en la
seccin [IDAPI] de WIN.INI.
Si es necesario, mueva el archivo para que cumpla con lo indicado en la
entrada de WIN.INI, o modifique la entrada en WIN.INI para que apunte a la
ubicacin actual del archivo.
Delphi 2
Si cada usuario tiene su propia copia del BDE, puede utilizar la utilidad BDE
Configuration para asignar el directorio del archivo de control de red de Paradox. Para hacer esto, siga estos pasos:
388
Delphi 3 y 4
Si cada usuario tiene su propia copia del BDE, puede utilizar la utilidad BDE
Administrator para asignar el directorio del archivo de control de red de Paradox. Para hacer esto, siga estos pasos:
a. Abra la utilidad de configuracin del BDE (Inicio | Programas |
Borland Delphi X | BDE [Configuration, Administration]).
b. Seleccione Object | Open Configuration. . . .
c. Abra IDAPI32.CFG.
d. Navegue hasta Configuration\Drivers\Native\Paradox en la vista de
rbol en la parte Configuration, en el panel izquierdo del BDE
Administrator.
e. Introduzca la ruta completa del directorio en donde quiere que resida el
archivo de control de red. Seleccione un directorio de red compartido
para el que todos los usuarios de las tablas Paradox tengan derechos de
lectura, escritura y borrado.
f. Seleccione Object | Exit y luego Yes para grabar los cambios
realizados.
Delphi de 32 bits
Si algn usuario no tiene una copia de la utilidad BDE Configuration/Administration, puede consultar su configuracin del Registro de Windows para asegurarse de que la ubicacin fsica real de IDAPI32.CFG (por defecto C:\Archivos
de programa\Borland\Common files\BDE) coincide con la que se indica en el
Registro.
Si es necesario, mueva el archivo para que su localizacin sea igual a la indicada en la entrada del Registro, o modifique la entrada en el Registro para que
coincida con la ubicacin del archivo.
2. Asegrese que ningn usuario est conectado a las tablas del directorio en
el que el archivo .LCK est ubicado, y brrelo.
3. Verifique que no haya usuarios del BDE sobre la red utilizando las tablas y
luego borre los archivos PDOXUSRS.NET y/o PDOXUSRS.LCK daados.
Los archivos sern regenerados automticamente cuando se necesiten.
Mensajes de error
389
Informacin adicional
1. Esto puede suceder cuando se pone una base de datos a disposicin de mltiples usuarios que antes solamente accedan a tablas de BDE locales (en
su disco duro). En este caso, el parmetro NET DIR de cada usuario podra
estar apuntando a su propio directorio raz (C:\). Esto resultara en lo
siguiente:
a. El primer usuario accedi a las tablas, y proporcion su propia unidad
de disco duro como directorio NetDir. Ningn problema.
b. El segundo usuario intenta acceder a las tablas, y tambin proporciona
su propia unidad de disco duro como directorio NetDir. Hay dos
archivos diferentes PDOXUSRS.NET intentando controlar el acceso a
las tablas, y el mensaje de error bajo discusin es generado.
3. Los archivos PDOXUSR.NET y PDOXUSRS.LCK pueden daarse si un
programa que utiliza el BDE termina anormalmente (como en el caso de
una cada del sistema).
El BDE puede detectar si las tablas estn en una unidad de red, pero no puede
detectar si las tablas estn en una mquina que sirve como servidor dedicado o
si la mquina es un cliente a la vez que un servidor (en otras palabras, es un
punto de una red punto-a-punto).
Los servidores dedicados notifican a las aplicaciones cliente cuando un archivo
es bloqueado o ha sido modificado. Las redes punto-a-punto no ofrecen normalmente esta funcionalidad (incluso una mquina servidora en una red
punto-a-punto no es un servidor dedicado verdadero). Para lograr este tipo de
funcionalidad en una red de punto-a-punto, asigne el valor True a Local Share
con la utilidad BDE Configuration (pgina/nodo System) en todas las mquinas
clientes que acceden a las tablas.
Para ms informacin, consulte Directory is controlled by other .NET
file.
390
Solucin rpida
Si las actualizaciones estn pendientes, no hay nada que refrescar. Llame a
ApplyUpdates y luego, si es necesario, a Refresh.
Informacin adicional
Consulte TClientDataSets UpdateStatus property y SavePoint methods en
la ayuda de Delphi.
Name conflicting
Posible causa de error
Puede estar conectndose a un servidor DCOM de mltiples instancias y utilizando un componente TDatabase cuya propiedad HandleShared tiene el valor
False.
Solucin rpida
Asigne True a la propiedad HandleShared del componente TDatabase.
Informacin adicional
Para ms informacin, consulte COM en la ayuda de Delphi.
Solucin rpida
Asigne True a la propiedad HandleShared del componente TDatabase.
Informacin adicional
HandleShared es una propiedad de tipo Boolean que indica si un componente
TDatabase puede compartir su manejador (handle) de BDE en una sesin.
Configurando HandleShared a True, evita conflictos de espacios de nombres.
Hay dos situaciones donde esto es potencialmente un problema:
El componente TDatabase est situado en un mdulo de datos remoto.
El componente TDatabase est situado en un mdulo de datos que ha
heredado del Almacn de Objetos.
Mensajes de error
391
Solucin rpida
Aada el argumento que indica el tamao a SetLength, as:
procedure ShortestProcedureNameKnownToWesternCivilization;
var
ABunchOfIntegers: array of integer;
begin
SetLength(ABunchOfIntegers, 52);
end.
Informacin adicional
Para ms informacin, consulte SetLength en la ayuda de Delphi.
Solucin rpida
Recompile manualmente el paquete al que se hace referencia en el mensaje.
392
Informacin adicional
Para ms informacin, consulte packages en la ayuda de Delphi.
Solucin rpida
Cambie la directiva de no construir en el paquete que requiere o la directiva de
construir siempre en el paquete requerido.
Informacin adicional
Ya que la interfaz de un paquete construir siempre puede cambiar en cualquier momento, y puesto que la bandera de no construir indica al compilador
que asuma que el paquete est totalmente actualizado, cada paquete de tipo
no construir puede solamente requerir otro paquete que tambin est marcado como no construir. Para ms informacin, consulte weak packaging y
implicit build en la ayuda de Delphi.
Solucin rpida
Utilice SetLength en lugar de New:
procedure Newby;
var
ArrayOfScores: array of integer;
begin
SetLength(ArrayOfScores, StrToInt(edtNumberOfGames));
Mensajes de error
393
end.
Informacin adicional
Para ms informacin, consulte SetLength en la ayuda de Delphi.
No address specified
Posible causa de error
Puede haber intentado asignar True a la propiedad Connected de un objeto
TSocketConnection sin haber proporcionado un valor para la propiedad
Address.
Solucin rpida
Especifique la direccin apropiada en la notacin de punto estndar de Internet (cuatro valores de un byte). Puede proporcionar el valor en el Inspector de
Objetos o en el cdigo; por ejemplo, proporcione la direccin en el cdigo:
SocketConnection1.Address := 131.228.6.1;
Informacin adicional
La propiedad Address de TSocketConnection se refiere a la direccin IP del
servidor en el que el objeto DCOM reside. Si no sabe la direccin, puede proporcionar el nombre del servidor en la propiedad Host. Esto, sin embargo, es
ms lento que configurar directamente la propiedad Address, ya que la direccin del servidor deber ser buscada.
Solucin rpida
Proporcione un argumento para cada especificador de formato que utilice. Por
ejemplo, para solucionar el ejemplo de arriba, hgalo de esta manera:
394
Informacin adicional
Para ms informacin, consulte Format function, format specifier, y format
strings en la ayuda de Delphi.
pero ste nunca es llamado por otro procedimiento o funcin, no ser enlazado al ejecutable, y ningn cdigo ser generado para l.
3. Puede estar situado sobre una lnea que de hecho genera cdigo, pero la
unidad no es parte del proyecto actual. Puede ser que la unidad en cuestin
no se encuentre en la clusula Uses de ninguna de las unidades que son
parte del proyecto.
4. Puede ser que tenga una copia de una unidad que est almacenada en una
ubicacin diferente que la copia de la unidad que es parte del proyecto. Por
ejemplo, puede tener una unidad nombrada Usee que est almacenada en
el directorio del proyecto (por ejemplo, C:\User), pero ha abierto una copia
de la unidad Usee que est almacenada en un directorio diferente (por
ejemplo, C:\UserBkup).
Solucin rpida
1,2. Borre el punto de ruptura (breakpoint). Si lo desea, coloque el cursor sobre
una lnea de cdigo en el proyecto actual que genere cdigo, como una sentencia de asignacin dentro de un procedimiento o funcin que sea llamada
en el proyecto.
3. Aada la unidad a la clusula Uses de al menos una de las unidades que
son parte del proyecto. Para aadir una unidad que exista en otra ubicacin/directorio al proyecto, seleccione Project | Add to Project. . . ,
navegue hasta la unidad, seleccinela y pulse el botn Open.
Mensajes de error
395
Informacin adicional
2. El enlazador inteligente de Delphi elimina los procedimientos que no son
utilizados por el programa (a menos que sean mtodos virtuales de un
objeto que es enlazado).
3,4. Para ms informacin, consulte Project Manager en la ayuda de Delphi.
Solucin rpida
Asigne una base de datos por defecto al componente TIBTransaction antes de
llamar a cualquiera de sus mtodos, as:
IBTrans.DefaultDatabase := dm.IBDB;
IBTrans.StartTransaction;
Informacin adicional
En el cdigo de arriba, IBTrans es un componente IBTransaction al que se le
ha asignado en su propiedad DefaultDatabase un componente TIBDatabase
denominado IBDB que reside sobre un mdulo de datos llamado dm.
TIBTransaction y TIBDatabase son componentes IBX que aparecen en la
pgina Interbase de la Paleta de Componentes y son utilizados en las aplicaciones que acceden a la informacin almacenada en bases de datos InterBase (sin
necesidad del BDE). A partir de Delphi 6, tambin se tiene la opcin de utilizar
los componentes DBExpress para acceder a InterBase sin necesidad del BDE.
396
Solucin rpida
Borre la definicin de la funcin o la directiva Abstract de la declaracin del
mtodo.
Informacin adicional
No se puede definir un mtodo abstracto en la misma clase donde ha sido definido. Abstracto significa que debe ser redefinido. Ya que debe ser redefinido,
no puede haber una implementacin en la clase base de un mtodo abstracto
para que un descendiente la herede.
Solucin rpida
Especifique qu campos quiere que el conjunto de datos contenga antes de
intentar crearlo. Por ejemplo, puede seguir el patrn mostrado en el fragmento
de cdigo de abajo para definir los campos y luego crear el conjunto de datos a
partir de esos campos. Un conjunto de datos vaco ser entonces creado
exitosamente.
with ClientDataSet1 do
begin
with FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size := 58;
Name := 'CaptainHumboldtEpisode';
end;
with FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'CaptPabstBarrels';
Mensajes de error
397
end;
with IndexDefs.AddIndexDef do
begin
Fields := 'CaptainHumboldtEpisode';
Name := 'CaptainHumboldtEpisodeIndex';
end;
CreateDataSet;
end;
Informacin adicional
Como se puede ver en el ejemplo de arriba, puede tambin aadir definiciones
de ndices al conjunto de datos.
Anteriormente el descendiente TDataset olvidado, TClientDataSet es indudablemente (a partir de Delphi 6) el ms importante de todos.
No frames in project
Posible causa de error
Puede haber intentado colocar un componente TFrame sobre un formulario
antes de crear un marco para el proyecto.
Solucin rpida
Seleccione File | New Frame, y aada los componentes que quiere utilizar.
Despus podr soltar un componente TFrame sobre el formulario.
Informacin adicional
Cuando coloque un componente TFrame sobre un formulario (asumiendo que el
proyecto tena al menos un marco creado), el dilogo Select Frame to Insert
aparecer, mostrando una lista de los marcos disponibles.
Solucin rpida
Asigne un valor apropiado a la propiedad IndexName o IndexFieldNames del
conjunto.
398
Informacin adicional
Si est creando un conjunto de datos mediante programacin, utilice el mtodo
AddIndexDef.
Solucin rpida
1. Asigne a la propiedad FormStyle del formulario principal el valor
fsMDIForm.
2. Permita que Delphi cree automticamente el formulario principal. Este
debe ser creado antes que los formularios hijos.
Informacin adicional
Los programas de Interfaz de Mltiples Documentos (MDI) son considerados
pasados de moda en Windows de 32 bits. Por supuesto, no hay ninguna ley en
contra de lo pasado de moda.
Mensajes de error
399
Solucin rpida
Verifique que los tipos de datos utilizados cuando se hace una llamada a un
mtodo sobrecargado correspondan a alguna de las signaturas del mtodo.
Informacin adicional
Puede declarar cualquier nmero de mtodos sobrecargados, siempre que todos
tengan signaturas nicas. Por supuesto, pueden tener cantidades diferentes de
parmetros, as:
function BTOSong(AName: String): Integer; overload;
function BTOSong (ALengthInSeconds: Integer): String; overload;
function BTOSong(AName: String; ALength: Integer): Boolean;
overload;
function BTOSong (AName: String; ALength: Double): Boolean;
overload;
No Provider Available
Posible causa de error
Puede haber asignado la propiedad Data de una propiedad Provider de un
TDataSet a la propiedad Data de un TClientDataSet sin aadir BDEProv a la
seccin Uses. Por ejemplo, lo siguiente generar este mensaje de error (si
BDEProv no est en la seccin Uses):
procedure TForm1.FormCreate(Sender: TObject);
begin
ClientDataSet1.Data := Table1.Provider.Data;
end;
Solucin rpida
Aada BDEProv a la seccin Uses.
Informacin adicional
Los proveedores son asociados generalmente con MIDAS y aparecieron con
Delphi 3. Si est utilizando Delphi 3, asegrese que tenga la ltima actualizacin y/o parche para una funcionalidad plena y un mejor rendimiento. En particular y entre otras cosas, el archivo DBClient.DLL fue actualizado y
mejorado a partir de su versin 3.0.
400
Solucin rpida
1. Borre la llamada a Prepare o asigne una sentencia SQL al componente
TQuery en tiempo de diseo o en el cdigo antes de llamar a Prepare.
2. Asigne una sentencia SQL vlida a la propiedad SQL del componente
TQuery antes de intentar crear los campos en tiempo de diseo.
3. Asegrese que solamente llama al mtodo ExecSQL de TQuery cuando la
propiedad SQL no est vaca. Por ejemplo, podra verificar esta condicin
con el siguiente cdigo:
procedure TForm1.ExecuteAndClearClick(Sender: TObject);
begin
with Query1 do begin
if SQL.Count <> 0 then begin
ExecSQL;
SQL.Clear;
end;
end;
end;
Informacin adicional
1. Para aadir una sentencia SQL a un componente TQuery en el cdigo, siga
este ejemplo:
Mensajes de error
401
with Query1 do
begin
SQL.Add('Select * from RoundTablePizza');
SQL.Add('Where Kind = 'ItalianGarlic'');
Prepare; {opcional}
Open;
end;
Puede partir la sentencia SQL en tantas lneas como desee. Es recomendable separar la sentencia en las partes lgicas que la constituyen.
2. Las ventajas de crear instancias de los campos para un componente
TQuery son (a) que tiene acceso a las propiedades de los campos (incluyendo los gestores de eventos, como OnValidate) en tiempo de diseo, y (b)
que puede crear campos calculados utilizando el Editor de Campos. Para
ms informacin sobre la creacin de campos calculados, consulte New
Field dialog box en la ayuda de Delphi.
Solucin rpida
Llame a StartTransaction antes de intentar confirmar las operaciones hechas
durante la transaccin.
Informacin adicional
Con la utilizacin de un componente TDatabase, puede agrupar un conjunto de
operaciones sobre una base de datos en una transaccin, y luego confirmarlas o
rechazarlas como un todo. Inicie una transaccin mediante StartTransaction y
luego llame a Commit o Rollback en dependencia de si quiere conservar o descartar los cambios o adiciones que realiz durante la transaccin.
He aqu un ejemplo sencillo de la utilizacin de transacciones en bases de
datos:
begin
with Database1 do begin
StartTransaction;
try
{ Hacer algo aqu }
if { condicin } then
Commit;
else
402
Solucin rpida
Instale un navegador de Intenet. No lo mueva o borre del directorio en el que
est instalado.
Informacin adicional
En algunas versiones de Delphi, Microsoft Internet Explorer es proporcionado
en el CD de Delphi. Si no tiene un navegador y quiere uno, esta es una opcin.
El navegador de Netscape es otra opcin atractiva. Adicionalmente, estn disponibles otros navegadores, tanto comerciales como freeware. Adems, usted
podra crear su propio navegador utilizando Delphi.
Solucin rpida
La clusula Nodefault no es permitida en una seccin Automated. Elimnela.
Informacin adicional
Delphi 2 y posteriores tienen cinco directivas de visibilidad: Private, Protected,
Public, Published y Automated (la directiva Automated no estaba disponible en
Delphi 1). A las propiedades de una clase se pueden asociar las clusulas
Mensajes de error
403
Stored, Default o Nodefault como directivas de almacenamiento. Estas directivas de almacenamiento no estn permitidas en la seccin Automated.
Solucin rpida
1. Proporcione los parmetros que faltan. Por ejemplo, para solucionar el problema de arriba, aada el parmetro final, as:
{Debe proporcionar el parmetro,
aunque no haya un tema de ayuda}
MessageDlg('Eat at Joe''s, mtCustom, [mbOK], 0);
{Si hay un ID de contexto de ayuda, por ejemplo #11,
podra hacer esto:}
404
Informacin adicional
1. Seleccione el nombre de la funcin en el cdigo y pulse <F1> para ver la
ayuda (en la que podr averiguar la cantidad, tipos y orden de los parmetros esperados).
2. El constructor de TObject no tiene parmetros. Sin embargo, el constructor
de TComponent s tiene un parmetro. Vea la declaracin de TObject en la
unidad System y la declaracin de TComponent en la unidad Classes para
los detalles ms especficos.
Solucin rpida
Incremente el parmetro Files en el archivo CONFIG.SYS. Incremntelo a un
nmero entre su valor actual y 255.
Incrementar el parmetro MaxFileHandles en el nodo/pgina System de la utilidad BDE Configuration a un nmero un poco menor del que asign en Files
en el archivo CONFIG.SYS .
Mensajes de error
405
Informacin adicional
Las tablas Paradox constan de varios archivos relacionados, como .DB, .MB,
.PX, .Xnn, .Ynn, etc. Varios de estos archivos puede estar abiertos simultneamente, y cada uno necesita su propio manejador.
Solucin rpida
Reconstruya la tabla utilizando TUtility.
Informacin adicional
Si no tiene la utilidad TUtility, puede obtenerla en:
http://www.borland.com/devsupport/bde/files/tutil32d.zip
Solucin rpida
Asigne True a la propiedad CachedUpdates del conjunto de datos antes de
intentar acceder a la propiedad OldValue de un registro.
Informacin adicional
Puede asegurarse mediante programacin de que CachedUpdates tiene el valor
True de esta manera:
if Table1.CachedUpdates = True then
ClassicVal := OldValue;
406
Solucin rpida
1. Asigne al parmetro NetDir en la seccin Drivers | Paradox de la utilidad
BDE Configuration un directorio de red compartido sobre el que todos los
usuarios que accedern a las tablas tengan derechos de lectura, escritura y
creacin.
2. Siga las instrucciones especficas para su versin de Delphi:
Delphi 1
Compruebe que la lnea CONFIGFILE01= de la seccin [IDAPI] del archivo
WIN.INI apunte a la ubicacin correcta. Por ejemplo, si el archivo de configuracin del BDE IDAPI.CFG est ubicado en C:\IDAPI (el valor por defecto), la
seccin se leera:
[IDAPI]
ConfigFile01=C:\IDAPI
Si es necesario, mueva el archivo para que su ubicacin coincida con lo indicado por la entrada en WIN.INI, o modifique la entrada de WIN.INI para que
apunte a la ubicacin actual del archivo.
Delphi de 32 bits
Verifique que la ubicacin de IDAPI32.CFG (por defecto C:\Archivos de programa\Borland\Common files\BDE) coincida con la que se indica en el Registro del sistema.
Si es necesario, mueva el archivo para que su ubicacin coincida con lo indicado por la entrada del Registro, o modifique la entrada del Registro para que
apunte a la ubicacin actual del archivo.
Informacin adicional
El directorio de red contiene el archivo PDOXUSRS.NET, que controla el
acceso a las tablas y administra los bloqueos.
Mensajes de error
407
Para asignar un valor a NET DIR con la utilidad BDE Configuration/Administration, siga estos pasos:
1. Cree un directorio sobre una unidad de red compartida al que todos los
usuarios que accedern a las tablas de bases de datos tengan derechos de
lectura, escritura y creacin.
2. Asigne el directorio creado en el paso 1 como valor del parmetro NetDir
en cada archivo de configuracin del BDE de los usuarios, mediante la utilidad BDE Configuration o directamente en el Registro del sistema).
o, en Delphi de 32 bits, puede utilizar el convenio de nombres UNC (Universal Naming Convention), que tiene este formato:
\\Servidor\Recurso\Directorio
408
Solucin rpida
1. Solamente puede tener un ndice primario por tabla. Puede aadir ndices
secundarios en el cdigo a las tablas dBASE y Paradox 7, pero no a las
tablas Paradox 3.5, 4 5.
2. Utilice como ndice primario solamente el primer campo de la tabla. En el
caso de un ndice/clave primaria compuesta, los campos deben ser los primeros de la tabla (consecutivos, empezando por el primer campo).
Informacin adicional
Este es un error de tipo EDatabaseEngine. Si una tabla ya tiene una clave primaria (requerida para una tabla Paradox), lo siguiente producir este mensaje
de error:
Table1.AddIndex('P2','RedGreenBlue',[ixPrimary]);
Si est utilizando una tabla de Paradox 7, puede, sin embargo, crear ndices
nicos adicionales, as:
Table1.AddIndex('U2','IrishRockers',[ixUnique]);
Mensajes de error
409
const
LeadingLeadingMen: array[0..4] of string =
('Brando','Bogart','DeNiro','Duvall');
{ Demasiados elementos proporcionados }
const
LeadingLeadingMen: array[0..4] of string =
('Brando', 'Bogart', 'DeNiro', 'Duvall', 'Peck', 'Sinise');
Solucin rpida
Cambie el tamao del array que est declarando, o aada o elimine la cantidad
necesaria de elementos.
Informacin adicional
Para ms informacin, consulte arrays en la ayuda de Delphi.
Solucin rpida
Registre la biblioteca de tipos de Webbrokerscript. Detenga y reinicie
SRVINFO.EXE.
Informacin adicional
Puede registrar WEBBROKERSCRIPT.TLB seleccionando la opcin Inicio |
Ejecutar de Windows y luego introduciendo el comado tregsvr
WEBBROKERSCRIPT.TLB.
Site Express apareci por primera vez con Delphi 6.
410
Solucin rpida
Sustituya el tipo problemtico por un objeto o tipo de clase.
Informacin adicional
Para ms informacin, consulte objects, classes, y types en la ayuda de
Delphi.
Solucin rpida
Aada el cuaderno (workbook) antes de intentar aadir valores a las celdas:
. . .
begin
xl.Workbooks.Add;
SetColumnTitles;
xl.Visible := True;
end;
Mensajes de error
411
Informacin adicional
Delphi 5 y superiores hacen ms fcil el uso de los servidores COM como Word,
Excel, Access, PowerPoint y Outlook a travs de los componentes de la pgina
Servers. Los objetos de Automatizacin no sern visibles por defecto, por lo
tanto deber asignar True a la propiedad Visible si quiere que aparezcan en
pantalla.
One or more lines were too long and have been truncated
Posible causa de error
1. Puede haber iniciado, quizs inadvertidamente, varias instancias de
Delphi.
2. Puede haber intentado abrir un archivo que no es de Delphi en el entorno
integrado. Por ejemplo, puede haber seleccionado File | Open..., luego
haber seleccionado Any File (*.*) en el cuadro de combinacin de tipos de
fichero, y luego haber intentado abrir un archivo .DOC (Microsoft Word).
Solucin rpida
1. Cierre todas las instancias innecesarias de Delphi.
2. Abra el archivo que no es de Delphi con el programa apropiado o desde el
Explorador de Windows.
Informacin adicional
Podra ver este mensaje de error si selecciona muchos archivos de Delphi en el
Explorador y luego accidentalmente pulsa dos veces en rpida sucesin sobre
uno de los archivos. Esto, en efecto, ejecuta la accin de doble clic sobre todos
los archivos resaltados, y una instancia de Delphi individual es iniciada para
cada archivo.
Puede tambin obtener el mensaje de error Module <>s time/date changed.
Reload? conjuntamente con el mensaje de error bajo discusin.
412
Solucin rpida
Mueva uno a ambos mtodos sobrecargados a un alcance de visibilidad menor
(Public, Protected o Private).
Informacin adicional
La directiva Overload permite crear mltiples mtodos con un mismo nombre y
cantidad o tipos de parmetros diferentes. Estos pueden ser especialmente
tiles cuando uno o ms de los parmetros es innecesario en situaciones particulares: puede crear una versin completa del mtodo, y una o ms que
puedan ser llamadas con un nmero de parmetros menor. Un ejemplo de esto
sera:
function GetScripture(ABook, AChapter, Averse: String): String;
overload;
function GetScripture(ABook, Averse: String): String; overload;
Solucin rpida
Utilice a lo sumo un componente TIDAntiFreeze por aplicacin. No coloque uno
sobre un formulario que pueda ser creado varias veces.
Informacin adicional
Un buen lugar para un componente TIDAntiFreeze es un mdulo de datos.
An si la aplicacin no es una aplicacin de base de datos, los mdulos de datos
son tiles como almacenes de componentes no visibles compartidos. Podra
encontrar conveniente pensar en los mdulos de datos, por lo tanto, como
mdulos de componentes no visuales.
TIDAntiFreeze es parte del juego de componentes Internet Direct (Indy), conocido como Winshoes en una versin anterior. Internet Direct se ha convertido
en parte tanto de Delphi 6 como de Kylix.
La caracterstica principal en la que Internet Direct difiere de AsyncPro (distribuido por Danysoft) es que, como su nombre implica, AsyncPro trabaja
asncroncamente (sin bloqueo), mientras Internet Direct es sncrono (con bloqueo). El modelo de sincronismo o de bloqueo tiene potencialmente un aspecto
negativo, ya que normalmente una operacin acapara todo el tiempo de CPU
hasta que termina, haciendo que la interfaz de usuario no responda. El
Mensajes de error
413
Solucin rpida
No especifique un convenio de llamada diferente de Register (el convenio por
defecto) en una seccin Automated.
Informacin adicional
La seccin Automated apareci por primera vez con Delphi 2 y perdi apoyo en
las versiones posteriores de Delphi. Se mantiene principalmente por
compatibilidad.
Solucin rpida
1. Conecte el DBGrid a un ClientDataSet conectado a un DataSetProvider
que a su vez est conectado al conjunto de datos de DBExpress.
2. Asigne False a la propiedad Unidirectional.
414
Informacin adicional
1. Si se conecta al conjunto de datos DBExpress indirectamente (a travs del
ClientDataSet), podr desplazarse por el conjunto resultado en cualquier
direccin. La tecnologa MIDAS est por doquier en DBExpress.
DBExpress fue introducido en Delphi 6.
2. Si est rellenando una rejilla de base de datos, puede que desee asignar
False a la propiedad Unidirectional del conjunto de datos. De otra manera,
si es posible, es una optimizacin asignar el valor True a Unidirectional.
Mensajes de error
415
Solucin rpida
1. Solamente utilice expresiones de filtros lgicas (como es razonable). En el
ejemplo de arriba, un valor de cadena es comparado con un grfico. Esto es
ilgico (no tiene sentido).
2. Asigne False a la propiedad Sorted antes de intentar esta operacin:
TStringList(slTemp).Sorted := False;
Informacin adicional
Si la lista ordenada de cadenas realmente necesita una operacin, llvela al
Hospital General de Bitbucket ;-)
4. Puede haber construido una aplicacin CGI que utiliza el BDE y hay demasiados usuarios concurrentes.
5. Puede haber asignado una cadena nula a un parmetro de consulta. Por
ejemplo, si la variable HungryFor en el cdigo siguiente contiene una
cadena vaca, podra obtener este error en la lnea Open:
Params.ParamByName('Food').AsString := HungryFor;
Open;
Solucin rpida
1. Actualcese a la ltima versin disponible del BDE para su versin de
Delphi.
2. Llame a Query.Last antes de acceder a la propiedad RecordCount. Por
ejemplo:
. . .
var
Retrieved: Integer;
begin
416
Informacin adicional
Las aplicaciones cliente multicapa (ligeras) requieren que DBClient.DLL sea
distribuido a todas las mquinas que estn ejecutando la aplicacin cliente. A
lo que antes se llamaba DBClient.DLL se le cambi el nombre a MIDAS.DLL a
a partir de Delphi 5.
4. Delphi 6 tiene una tercera opcin disponible las aplicaciones Web de
Apache.
Mensajes de error
417
Solucin rpida
1. Examine la sentencia SQL detenidamente. Consulte la documentacin de
la base de datos que est utilizando. La sintaxis difiere entre las distintas
implementaciones.
2. Recuerde encerrar los ndices de arrays entre corchetes, as:
i := Synergy[0];
3. Pulse con el botn derecho sobre el alias y seleccione Apply; luego intente
expandir el alias de nuevo.
Informacin adicional
1. Los errores comunes de sintaxis SQL son:
Utilizar apstrofes donde se necesitan comillas dobles (y viceversa).
Olvidar colocar los nombres de las tablas en maysculas (donde esto
es requerido por el tipo particular del SQL que est utilizando).
2. Puede haber realizado al revs la comprobacin de pertenencia de un elemento a un conjunto. Por ejemplo, obtendr este mensaje de error si
codifica lo siguiente:
if [dsEdit, dsInsert] in State then
. . .
3. Puede haber inadvertidamente utilizado dos signos ms (+) para concatenar cadenas. Por ejemplo, lo siguiente generar este mensaje de error:
var
s:string;
. . .
s := 's'++'t';
418
-Otype
TParty = (Boston, DelFuegos, JGeils);
var
JustAnotherBand: TParty;
BradleyDelp: pointer;
begin
JustAnotherBand := Boston;
BradleyDelp^ := JustAnotherBand;
6. Puede haber intentado utilizar los operadores Is o As sobre uno o ms operandos de tipo Variant. Por ejemplo, si GoodEnough y WellAndGood son
variables de tipo Variant, cualquiera de los siguientes fragmentos de cdigo
generar este mensaje de error:
if GoodEnough is WellAndGood then . . .
if GoodEnough is Integer then...
with GoodEnough as WellAndGood do...
with WellAndGood as Boolean do...
Solucin rpida
1. No utilice Div sobre valores de tipo float; utilice / en su lugar:
. . .
Table1Percentage.Value :=
Table1MySalary.Value / Table1AllTheMoneyInTheWorld.Value;
. . .
Mensajes de error
419
type
iptr = ^Integer;
var
i,j: integer;
p: pointer;
q: iptr;
begin
p := @i;
q := p;
q^ := j;
i := q^;
end;
-Otype
TParty = (Boston, DelFuegos, JGeils);
var
JustAnotherBand: TParty;
TomScholz: ^TParty;
begin
JustAnotherBand:=Boston;
TomScholz^ := JustAnotherBand;
Informacin adicional
3. Dos signos ms consecutivos (++) son utilizados en el lenguaje de programacin C como operador de incremento. Quizs C++ debera ser ledo como
C incrementado (en lugar de C ms ms).
6. Es tambin ilegal utilizar el operador ^ sobre operandos Variant.
Para ms informacin, consulte operators en la ayuda de Delphi.
420
Solucin rpida
En el editor de parmetros, asgnele al REF CURSOR un valor por defecto de
0.
Informacin adicional
Si el nico parmetro del procedimiento almacenado es un REF CURSOR, este
error no es generado.
Solucin rpida
Inicialice los valores en el mismo orden en que aparecen en la declaracin Type
(registro):
var
TresHombres : TTresHombres
= (Z: 'Dusty'; Zee: 'Billy'; Top: 'Frank');
Informacin adicional
Como se sobreentiende, las constantes con tipo son realmente variables inicializadas, aunque sean declaradas en secciones Const.
Mensajes de error
421
Solucin rpida
Utilice nicamente tipos ordinales en las situaciones de arriba. Por ejemplo,
todo lo siguiente es legal:
{ a }
type
TGilligansIsland = (Ginger, MaryAnne, Professor, Gilligan,
Skip, MrHowell, MrsHowell);
{ b }
var
i,j: Integer;
begin
for i := 0 to ColCount-1 do
strgrd.Cells[i,j];
{ c }
Type
TChoppers = set of byte;
{ d }
procedure GetLabel(WineChoice: TDryRedWine);
422
Informacin adicional
Hay cuatro tipos ordinales predefinidos en Object Pascal: Integer, Char,
WideChar y Boolean. Object Pascal tambin permite al usuario (programador)
declarar y crear tipos enumerados definidos por el usuario, que son otro tipo
ordinal.
Out of memory
Posible causa de error
1. Puede haberse quedado sin memoria.
2. Puede haber proporcionado a la funcin Format demasiados argumentos
para que gestione.
3. Puede estar utilizando una combinacin de Delphi 3 4, ciertos controladores de vdeo (como Diamond Fire GL 1000 Pro o STB Velocity 4400) y
puede tener una gran cantidad de componentes adicionales en su Paleta de
Componentes.
Solucin rpida
1. Verifique que tiene suficiente memoria RAM, que el archivo de intercambio
de Windows tenga el tamao suficiente, y que tenga al menos el 10 por
ciento de espacio libre en el disco duro.
2. Parta la cadena que quiere formatear en varias cadenas, y luego concatene
el resultado al finalizar.
3. Quizs la manera ms fcil de solucionar esto es reducir el nmero de
paquetes/componentes instalados o actualizarse a Delphi 5 o superior (preferido). Otras posibles opciones son:
Obtener la ltima versin del controlador (www.s3.com, www.stb.com, o
su fabricante).
Iniciar Delphi con la opcin -ns.
Debajo de la seccin [display] del archivo SYSTEM.INI aadir la
siguiente lnea:
BusThrottle=1 (reiniciar despus)
Mensajes de error
423
Informacin adicional
Para ms informacin, consulte memory y format strings en la ayuda de
Delphi.
3. El entorno integrado de Delphi utiliza una lista de imgenes para los iconos que se muestran en la Paleta de Componentes. Cuando Delphi es
cargado, esta lista de imgenes crece en tamao. Si el tamao de la lista de
imgenes es superior a la capacidad soportada por la memoria de la tarjeta
de vdeo, se utiliza memoria principal para almacenar el resto de la lista de
imgenes. Durante esta operacin, el controlador de vdeo algunas veces
falla.
Solucin rpida
Siempre que sea posible, cree dinmicamente los formularios para minimizar
la cantidad de recursos utilizados en un momento dado. Por ejemplo, cree un
cuadro de dilogo Acerca de... solamente cuando sea necesario, aadiendo
cdigo similar a ste al evento que se utiliza para crear el cuadro:
Form1 := TForm1.Create(Self);
try
Form1.ShowModal;
finally
Form1.Free;
end;
Informacin adicional
Recuerde que todos los controles de Windows que tienen asociado un manejador (handle) son considerados ventanas por Windows. Podra obtener este mensaje de error por tener un montn de botones, etc. activos al mismo tiempo.
424
Solucin rpida
Siga estos pasos para determinar qu archivo .DCU est daado y luego
reconstruirlo:
1. Haga copias de sus archivos .DCU.
2. Borre un .DCU del directorio del proyecto.
3. Recompile el proyecto.
4. Repita los pasos 2 y 3 (borrando un .DCU diferente cada vez) hasta que no
obtenga el mensaje de error.
Informacin adicional
El archivo .DCU que borr inmediatamente antes de que el proyecto compilara
sin errores es el causante del problema.
Solucin rpida
Aada la directiva Overload a ambos mtodos, as:
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; i:integer); overload;
Informacin adicional
Para ms informacin, consulte overload en la ayuda de Delphi.
Mensajes de error
425
Solucin rpida
Utilice el disp-id asignado originalmente al procedimiento en todos los
descendientes.
Informacin adicional
Para ms informacin, consulte automated components en la ayuda de
Delphi.
Solucin rpida
Elimine la unidad mencionada en el mensaje de error de uno de los paquetes, o
elimine el paquete mencionado en el mensaje de error de la clusula Requires
del paquete que est intentando compilar.
Informacin adicional
Dos paquetes que se utilizan entre s no pueden contener la misma unidad.
426
Solucin rpida
1. Evite instalar el mismo paquete varias veces.
2. Para instalar un componente dentro de un paquete existente, seleccione la
pgina Into Existing Package en el cuadro de dilogo Install Component.
Informacin adicional
Para ms informacin, consulte packages | about packages en la ayuda de
Delphi.
Solucin rpida
Localice el paquete de tiempo de diseo correspondiente e instlelo.
Informacin adicional
Puede fcilmente determinar si un paquete es de tiempo de diseo o de tiempo
de ejecucin abrindolo, seleccionando el botn Options, y comprobando el
valor en las opciones Description | Usage.
Los paquetes de tiempo de ejecucin contienen el cdigo necesario para que las
aplicaciones puede ser construidas con paquetes, y los paquetes se distribuyan una sola vez (de modo que mltiples aplicaciones compartan un
paquete). Los paquetes de tiempo de ejecucin (.DPL en Delphi 3, .BPL en las
versiones posteriores) deberan residir en \Windows\System (Windows 9X) o
\Winnt\System32 (Windows NT, 2000 y XP). Los paquetes de tiempo de
diseo contienen cdigo especfico para tiempo de diseo para su utilizacin
dentro del entorno integrado de Delphi, como iconos de componentes, editores
de propiedades y editores de componentes.
Es una buena prctica que los desarrolladores de componentes establezcan un
convenio de nombres que haga que los paquetes de tiempo de diseo y de
tiempo de ejecucin sean fcilmente distinguibles. Una manera estndar de
Mensajes de error
427
Solucin rpida
No tiene sentido, y adems es ilegal, que un paquete se requiera a s mismo.
Elimine el nombre del paquete de su propia clusula Requires.
Informacin adicional
Normalmente, los paquetes de tiempo de ejecucin contienen las unidades que
implementan la funcionalidad principal del paquete, y requieren la VCL de la
base de cdigo actual de Delphi (por ejemplo, VCL60.DCP para los paquetes de
Delphi 6). Los paquetes de tiempo de diseo contienen posiblemente una unidad de registro, los recursos de iconos de componentes, y requieren el paquete
de tiempo de ejecucin.
Solucin rpida
Los paquetes pueden contener y utilizar unidades, pero no otros paquetes
(colecciones de unidades).
Informacin adicional
Puede ser que haya una unidad y un paquete con el mismo nombre, y el compilador encontr el paquete antes que la unidad. Si es as, mueva el paquete con
el mismo nombre que la unidad que quiere utilizar o contener fuera de la ruta
de bsqueda de Delphi.
428
Solucin rpida
Evite utilizar uno de los paquetes, o cambie el nombre a una de las unidades
que tienen el mismo nombre.
Informacin adicional
Tener dos paquetes en el mismo proyecto que contienen ambos una unidad con
el mismo nombre ocasiona ambigedad al compilador. Es una buen prctica
utilizar un convenio de nombres personalizado para sus componentes y unidades, para evitar que este error se produzca.
Solucin rpida
Utilice solamente la palabra reservada Packed sobre los tipos antes
mencionados.
Informacin adicional
Para ms informacin, consulte packed keyword en la ayuda de Delphi.
Mensajes de error
429
Solucin rpida
Busque un formulario abierto del tipo que desee para crearlo mediante cdigo
de la siguiente manera:
var
i, Chihuahua: Integer;
begin
Chihuahua := -1;
for i := 0 to Screen.FormCount-1 do
if Screen.Forms[i] is TForm1 then
Chihuahua := I;
if Chihuahua >= 0 then
Screen.Forms[Chihuahua].Show
else
begin
Form1 := TForm1.Create(Self);
Form1.Show;
end;
end;
Informacin adicional
Consulte Access Violation.
Solucin rpida
Introduzca un nombre en el cuadro de combinacin Palette Page, o seleccione
uno de la lista desplegable.
430
Informacin adicional
Palette Page es la pgina de la Paleta de Componentes en la que el nuevo componente ser instalado.
Solucin rpida
Elimine (o comente) la referencia al parmetro.
Informacin adicional
Alternativamente, puede mantener el parmetro pero suministrarle un valor
Null. Dado el ejemplo de arriba, podra hacerlo de esta manera:
INSERT INTO ABC.Alphabet
(SQU_ID, LetterCode, ReportedOn, EffectiveDate)
VALUES (:squid, :ltrcode, NULL, :effDate')
Mensajes de error
431
Solucin rpida
Coloque la segunda variable (k, en el caso de arriba) en su propia seccin delimitada, as:
procedure PTBoat(i: Integer; j: Integer = 0; k: Integer = 0);
Informacin adicional
Los parmetros por defecto aparecieron por primera vez en Delphi 4.
Solucin rpida
Configure la propiedad SQLConnection del objeto TSQLQuery, asignndole un
componente TSQLConnection apropiado.
Informacin adicional
DBExpress apareci por primera vez en Delphi 6.
Solucin rpida
Elimine los valores por defecto.
432
Informacin adicional
Para ms informacin, consulte default property values en la ayuda de
Delphi.
Solucin rpida
Descargue e instale el parche de Delphi 3.02, e importe la biblioteca de tipos
utilizando Tlibimp.EXE.
Informacin adicional
Vea el artculo de Dan Miser The Upgrade Game en la edicin de Abril de
1998 de The Delphi Informant o en la direccin http://www.delphizine.com/opinion/1998/04/di199804ft_o/di199804ft_o.asp, o visite http://www.danyshop.com
para conocer las razones por las que es conveniente actualizarse.
Solucin rpida
Asigne el valor SHARED AUTOCOMMIT (Drivers | Access | SHARED
AUTOCOMMIT) al parmetro SQLPASSTHRU MODE para el controlador de
Access utilizando la utilidad BDE Configuration.
Informacin adicional
Para ms informacin, consulte using Passthru SQL en la ayuda de Delphi.
Mensajes de error
433
Solucin rpida
Mueva la tabla a la ubicacin especificada en el mensaje de error (es decir, a
donde Delphi est buscndola).
Alternativamente, si la tabla est ubicada en el lugar que usted desea que
est, pero el alias est apuntando a algn otro lugar (como indica el mensaje
de error y la ruta indicada), modifique la configuracin del alias con la herramienta BDE Configuration/Administration, para que apunte a la ruta correcta.
Informacin adicional
Para ms informacin, consulte TTable en la ayuda de Delphi.
Solucin rpida
Aumente el nivel de la tabla a 7 utilizando la utilidad BDE Configuration.
Consulte Higher table level required para ver las instrucciones concretas
de cmo hacer esto.
Informacin adicional
Consulte Higher table level required e Invalid file name.
434
Solucin rpida
Utilice nicamente el operador de derreferenciacin (^) con punteros. He aqu
un ejemplo correcto de la utilizacin del operador:
procedure ThanksForThe;
type
iptr = ^Integer;
var
i, j: Integer;
p: Pointer;
q: iptr;
begin
p := @i;
q := p;
q^ := j;
i := q^;
end;
Informacin adicional
Consulte pointer types en la ayuda de Delphi para ms informacin sobre los
punteros.
Mensajes de error
435
Solucin rpida
Encierre el valor de DefaultExpression entre apstrofes. Por ejemplo, para
hacer que True sea el valor por defecto de un campo Boolean, introduzca
True.
Informacin adicional
Consulte TField en la ayuda de Delphi para los detalles ms especficos sobre
las propiedades, mtodos y eventos de esta importante clase de objetos.
Solucin rpida
1. Aada la directiva Overload a la declaracin del mtodo en la seccin
Interface.
2. Corrija la definicin o declaracin para que ambas sean iguales.
Informacin adicional
Este mensaje de error es nico para Delphi 4 y superiores, ya que la directiva
Overload fue introducida en Delphi 4.
Printing in Progress
Posible causa de error
Puede estar intentando imprimir un archivo de texto, pero ha olvidado cerrar
el archivo. Por ejemplo, puede estar haciendo algo as:
procedure TfmRSXL.btnPrintClick(Sender: TObject);
436
Solucin rpida
Cierre el archivo de texto cuando haya terminado de trabajar con l, as:
procedure TfmRSXL.btnPrintClick(Sender: TObject);
var
Palindrome: System.Text;
begin
AssignPrn(Palindrome);
try
Rewrite(Palindrome);
Writeln(Palindrome,'SIT ON A POTATO PAN OTIS');
. . .
finally
CloseFile(Palindrome);
end;
end;
Informacin adicional
Adems del procedimiento estndar Writeln, puede tambin utilizar el mtodo
TextOut de Printer.Canvas de la unidad TPrinters para imprimir texto. Para
ms informacin, consulte TextOut method y Printers unit en la ayuda de
Delphi.
Solucin rpida
Reemplace la palabra reservada Procedure por la palabra reservada Function,
o borre el tipo de resultado.
Informacin adicional
Si necesita o prefiere utilizar un procedimiento, pero tambin desea que el procedimiento devuelva un valor, puede pasar un parmetro Var al procedimiento:
Mensajes de error
437
Solucin rpida
Llame a Fail solamente desde un constructor.
Informacin adicional
Incluso dentro de un constructor, no es buena costumbre llamar a Fail.
Solucin rpida
Especifique el tipo del elemento si est aadiendo un procedimiento, funcin o
propiedad. Por ejemplo, podra introducir property Condemned: WideString.
Informacin adicional
La posibilidad de aadir mtodos y propiedades a las interfaces a travs de
Edit | Add to Interface apareci por primera vez en Delphi 6.
Si va a aadir un procedimiento a la interfaz, todo lo que necesita aadir es:
procedure <nombre>. Si aade una funcin, tambin deber especificar un tipo
438
Solucin rpida
Aada Procedure o Function a la palabra reservada Class, as:
class procedure a;
Informacin adicional
Los procedimiento de clase actan sobre la propia clase, y no sobre una instancia concreta de la clase. Un uso comn para un procedimiento de clase es
implementar un formulario modal, as:
type
TfrmTMSExpressMaterial = class(TForm)
StatusBar1: TStatusBar;
private
{ Private declarations }
public
class procedure Cre8Thyself;
end;
// OJO! No hay una variable disponible, como:
//var
// frmTMSExpressMaterial: TfrmTMSExpressMaterial;
implementation
{$R *.DFM}
class procedure TfrmTMSExpressMaterial.Cre8Thyself;
begin
with Self.Create(nil) do
try
ShowModal;
finally
Free;
end;
end;
Mensajes de error
439
Solucin rpida
Solamente los procedimientos y funciones de la unidad actual pueden ser
exportados. Por ejemplo, si DutyFree es el nombre de un procedimiento o funcin en la .DLL, lo siguiente es un uso vlido de la palabra reservada Exports:
exports
DutyFree;
Informacin adicional
Para ms informacin, consulte DLLs en la ayuda de Delphi.
Solucin rpida
Elimine la referencia a s misma de la clusula Uses.
Informacin adicional
Consulte Circular Unit Reference [to <>].
440
Project <> raised exception class <> with message <>. Process
stopped. Use Step or Run to continue.
Posible causa de error
Este mensaje de error es bastante genrico. Simplemente dice el nombre del
proyecto que estaba activo cuando se produjo el mensaje de error (que debera
ser obvio en cualquier caso), la clase de excepcin involucrada (que ser bastante general, como ERangeError, EInvalidCast, EInvalidPointer, EStringListError) y el mensaje exacto que la clase de excepcin proporciona para este
error especfico.
Solucin rpida
El mensaje de error debera darle una buena pista sobre cul es el problema
real. Por ejemplo, el texto completo del mensaje de error puede ser algo como
Project Manhattan raised exception class ERangeError with message
Range Check Error. Process stopped. Use Step or Run to continue.
Asimismo, podr ver exactamente cul es la sentencia en la que se ha producido el error, puesto que el depurador integrado normalmente se detiene en la
lnea siguiente a la que ocasion el error (si tiene habilitada la opcin Break
on Exceptions).
Informacin adicional
Para continuar trazando la ejecucin o ejecutando, como el mensaje invita a
hacer, pulse F8 para trazar o F9 para ejecutar. Cualquiera de estas acciones
pasar por la lnea en la que ocurri el error y mostrar el error que el usuario
final vera en esta situacin en un cuadro de mensaje (el error bajo discusin
no es visto por el usuario final, sino solamente por el desarrollador; de hecho,
el propio desarrollador no lo vera si la opcin Break On Exceptions no estuviera activada)*.
Para volver al entorno de tiempo de diseo para trabajar con el problema:
Pulse Ctrl+F2.
-OPulse Alt+R, E.
-OSeleccione Run | Program Reset.
* Para activar la opcin Break on Exceptions, siga estos pasos:
1. Seleccione Tools | Environment Options.
2. Seleccione la pgina Preferences.
Mensajes de error
441
Solucin rpida
Si la propiedad es nueva para la clase, debe aadir el tipo de datos de la propiedad, as como los campos o mtodos de lectura (read) y escritura (write). Por
ejemplo, la declaracin de arriba debera ser algo as:
published
property ValuesKeepSkyrocketing: Integer
read FOrbes write SetSkyrocketingValues;
Informacin adicional
Para promover una propiedad definida en la clase ancestro a una seccin de
mayor visibilidad (de Private o Protected a Public o Published, o de Public a
Published), todo lo que hay que hacer es introducir su nombre en la seccin a
la que se quiere promoverla no es necesario aadir la declaracin completa
(esta es la razn de por qu el compilador est esperando encontrar esta propiedad en la clase base cuando no se ha proporcionado una declaracin
completa).
Declarar una propiedad por su nombre solamente (omitiendo el tipo de datos y
los mtodos de lectura y escritura) es la manera correcta de redeclarar una
propiedad de una clase ancestro. Esta es la razn de por qu el mensaje de
error indica que el compilador trata de localizar la propiedad en la clase base
(ancestro). Haga esto cuando quiera promover la propiedad para que sea ms
visible (por ejemplo, de Private a Public). Por ejemplo, si en un descendiente de
TNotebook quiere aumentar la visibilidad de la propiedad Brush heredada de
Public a Published, podra hacer esto:
published
Brush;
Si est declarando una nueva propiedad, sin embargo, debe especificar su tipo
de datos y las clasulas de acceso de lectura y escritura como se muestra a continuacin, donde se est utilizando acceso directo a un campo para obtener y
asignar el valor de la propiedad:
442
Si est utilizando acceso directo para leer el valor, pero utiliza un mtodo para
asignar el valor de la propiedad (lo ms adecuado en la mayora de los casos),
utilice la siguiente metodologa:
private
FRealEstate: Currency;
procedure SetRealEstate(Value: Currency);
protected
{ }
public
{ }
published
property RealEstate: Currency read FRealEstate
write SetRealEstate;
Solucin rpida
No haga referencia a los miembros de una clase dentro de un mtodo de clase.
Los mtodos de clase actan sobre la propia clase, no sobre instancias concretas de la clase.
Informacin adicional
Consulte Instance variable <> inaccessible here en este libro.
Mensajes de error
443
Solucin rpida
Abra el proyecto con la versin ms nueva de Delphi, pulse con el botn derecho del ratn sobre el formulario del proyecto, seleccione View as Text, y
luego borre la lnea en la que se declara la propiedad OldCreateOrder del
archivo .DFM. No seleccione View as Form! Cierre el proyecto. Podr abrir el
proyecto en una versin anterior de Delphi.
Informacin adicional
La propiedad OldCreateOrder fue introducida en Delphi 4.
Solucin rpida
Borre la directiva Overload de todos los mtodos de acceso y elimine una versin de cada uno de los mtodos sobrecargados.
Informacin adicional
Lamento parecer pretensioso, pero getters y setters suena un poco infantil
para mis odos. Prefiero mtodo de acceso (accessor) y mtodo de modificacin (mutator). Tampoco me gusta nada la tendencia a nombrarlo todo con el
prefijo Mi: Mi esto y Mi aquello, que se ve mucho en los ejemplos de
programacin.
444
Solucin rpida
Borre o renombre la propiedad en la interfaz derivada.
Informacin adicional
Si simplemente quiere que la propiedad est disponible en la interfaz derivada,
no necesita hacer nada la herencia de interfaz hace que la propiedad est
automticamente disponible.
Solucin rpida
Seleccione Project |Build All.
Informacin adicional
Para ms informacin, consulte multi-tiered aplications en la ayuda de
Delphi.
Mensajes de error
445
Solucin rpida
1. Declare solamente propiedades en la seccin Published. Por ejemplo, lo
siguiente compilar, ya que la clase tiene un miembro Integer (Feye):
type
TScantyClass = class
public
Feye: Integer;
published
property eye: Integer read Feye;
Informacin adicional
Para ms informacin, consulte class types y class type compatibility rules
en la ayuda de Delphi.
446
Solucin rpida
Declare nicamente propiedades con los siguientes tipos: ordinales, Single,
Double, Extended, Comp, String, Set (hasta 16 elementos en Delphi 1; hasta
32 elementos en Delphi de 32 bits), o punteros a mtodos.
Informacin adicional
Entre los tipos ms populares que no se permiten para las propiedades estn
los arrays y Real.
Para ms informacin, consulte class types y class type compatibility rules
en la ayuda de Delphi.
Solucin rpida
Cambie la declaracin de Real a Single, Double o Extended. Por ejemplo, cambiar lo anterior a:
. . .
private
FElCamino: Single;
public
{ Public declarations }
Mensajes de error
447
published
property ElCamino: Single read FElCamino
write SetElCamino;
Informacin adicional
Para ms informacin, consulte class types y class type compatibility rules
en la ayuda de Delphi.
Solucin rpida
Asigne una cadena antes de intentar asignar un objeto correspondiente. Puede
utilizar una cadena vaca, si quiere.
Informacin adicional
Si no necesita una cadena correspondiente, utilice la clase TList en lugar de
TStringList para almacenar los objetos.
Solucin rpida
Cambiar la propiedad UpdateMode del TQuery a UpWhereKeyOnly o
UpWhereChanged.
Informacin adicional
UpdateMode localiza el registro que usted ha modificado para verificar que no
ha sido cambiado desde la primera vez que usted lo ley hasta que intent grabar la nueva versin. Se puede localizar el registro en base a la verificacin de
los siguientes campos:
El campo(s) clave solamente (si UpdateMode es igual a UpWhereKeyOnly).
El campo(s) clave ms lo que se ha modificado (si UpdateMode es igual a
UpWhereChanged).
448
Solucin rpida
Especifique los parmetros o valores literales en la sentencia INSERT de SQL.
Por ejemplo, para utilizar los parmetros, hgalo de esta manera:
with qryUpTheMiddle do
begin
if Active then
Close;
SQL.Clear;
SQL.Add('INSERT INTO TEAM VALUES(:Catcher,:Pitcher,
+ :Shortstop,:Centerfield)');
ParamByName('Catcher').AsString := edtCatcher.Text;
ParamByName('Pitcher').AsString := edtPitcher.Text;
ParamByName('Shortstop').AsString := edtShortstop.Text;
ParamByName('Centerfield').AsString := edtCenterfield.Text;
ExecSQL;
end;
Informacin adicional
Consulte la documentacin de su base de datos para conocer los detalles especficos de SQL y su sintaxis.
Mensajes de error
449
Solucin rpida
Intente reducir la sentencia SQL para que incluya slo los registros de inters,
como:
SELECT * FROM TEXAS
WHERE FAVORITE_EXPRESSION = 'Go Packers! Beat the Cowboys!'
Informacin adicional
Las consultas funcionan mejor cuando se restringen no slo los registros a
devolver, sino tambin las columnas, como en:
SELECT EMAILADDRESS, PHONE_NO FROM TEXAS
WHERE FAVORITE_EXPRESSION = 'Go Bucks! Beat the Spurs!'
2. Puede haber intentado asignar a una variable un valor muy grande para el
tipo de datos de la variable. Por ejemplo, un intento de asignar un nmero
negativo o un nmero positivo mayor que 255 a una variable Byte generara este mensaje de error.
450
Solucin rpida
1. Cuando haga referencia a un elemento de un array, verifique que el ndice
del elemento del array al que est intentando acceder est dentro de las
dimensiones declaradas del array.
2. Declare las variables con tipos de datos que incluyan todo el rango de valores que la variable puede necesitar manejar.
Informacin adicional
Para ms informacin, consulte range checking en la ayuda de Delphi.
Solucin rpida
Borre el archivo .VAL correspondiente de la tabla. Por ejemplo, si la tabla se
llama AGNES, el archivo que debe borrar y volver a crear se llamara
AGNES.VAL.
Informacin adicional
Los archivos .VAL son creados cuando se especifican valores mnimos,
mximos y por defecto para los campos de una tabla Paradox utilizando Database Desktop.
En lugar de especificar estos parmetros en el Database Desktop, puede
hacerlo directamente en Delphi, creando los campos persistentes en tiempo de
diseo utilizando el Editor de Campos (Fields Editor), y luego configurando las
propiedades DefaultValue, MaxValue y MinValue de stos. Consulte Fields
Editor en la ayuda de Delphi para detalles ms especficos.
Mensajes de error
451
Solucin rpida
Aada un especificador Read junto con el campo o funcin correspondiente a
la declaracin, as:
FSomeInterface: ISomeInterface;
property SomeInterface: ISomeInterface read FSomeInterface
implements ISomeInterface;
Informacin adicional
Consulte Implements getter must be register calling convention en
este libro, e Implementing Interfaces by delegation en la ayuda de Delphi (4 o
superior) para ms informacin.
Solucin rpida
1. Borre uno u otro o ambos archivos.
2. Asigne False a la propiedad Active del conjunto de datos en tiempo de
diseo, o ejecute la aplicacin fuera del entorno integrado de Delphi (cierre
Delphi primero).
Informacin adicional
1. Usted, el testeador, y usted, el programador, pueden estar pelendose por
un mismo registro del conjunto de datos (una instancia abierta en el
entorno integrado/tiempo de diseo, y una instancia en ejecucin).
452
Solucin rpida
Cambie el tipo de datos a ShortDateTime o trunque el ltimo dgito en la parte
de los milisegundos antes de que el registro sea grabado.
Informacin adicional
Entre el momento en que se reciben los datos para que sean traducidos y luego
actualizados por el BDE, el valor DateTime puede cambiar.
Solucin rpida
Utilice una versin anterior del controlador ODBC, o utilice los componentes
ADO Express para acceder a las tablas de Access.
Informacin adicional
Microsoft cambi el tamao de los campos en uno de sus controladores, pero
Delphi todava est esperando el tamao de campo publicado anteriormente.
Record/Key Deleted
Posible causa de error
1. Puede haber asignado una marca (bookmark), haber cambiado de ndice, y
luego haber intentado volver a la posicin especificada por la marca.
2. Puede haber colocado un filtro sobre un conjunto resultado y luego haber
alterado la definicin del filtro aadiendo o borrando un campo o campos
del filtro.
Solucin rpida
1. No cambie de ndices mientras una marca est activa.
2. Deshabilite el filtro, realice la edicin, y luego vuelva a habilitar el filtro.
Informacin adicional
Para ms informacin, consulte bookmarks, indexes y filters en la ayuda
de Delphi.
Mensajes de error
453
Solucin rpida
Intente editar de nuevo el registro, verificando primero si el cambio que est
intentando hacer no fue hecho ya por otro usuario.
Informacin adicional
Solamente un usuario puede colocar un bloqueo de escritura sobre un registro.
Muchos usuarios pueden simultneamente ver el mismo registro (cada uno de
ellos colocando un bloqueo de lectura en el proceso), pero solamente uno puede
editarlo (para lo que debe obtener un bloqueo de escritura).
Solucin rpida
Especifique la variable explcitamente, as:
if JAndJWentUpTheVerticallyChallengedMountain = True then
JAndJWentUpTheVerticallyChallengedMountain := False;
Informacin adicional
Utilice la palabra reservada With solamente en combinacin con los tipos mencionados en el mensaje de error, como componentes TQuery, etc.
454
Solucin rpida
Borre la directiva de compilacin que hace referencia a s misma en el archivo
incluido.
Informacin adicional
Puede incluir en un archivo el contenido de un archivo diferente a travs de
una referencia a un archivo incluido. El compilador trata el archivo incluido
como si su contenido estuviera situado directamente en la unidad. Por ejemplo,
si aadi:
{$I Murder.inc}
Mensajes de error
455
Solucin rpida
1. Si quiere heredar la funcionalidad del mtodo original, utilice la palabra
reservada Override cuando lo declare. Si quiere declarar un mtodo nuevo,
asgnele un nombre diferente de los que ya se utilizan en la clase base.
2. Renombre la propiedad o mtodo en la clase descendiente.
Informacin adicional
1. Si quiere ocultar un mtodo de una clase base, puede hacerlo declarando
deliberadamente un mtodo con el mismo nombre. Consulte Method <>
hides virtual method of base class <>.
Solucin rpida
Quite la propiedad de la seccin Automated. Promuvala a otra seccin (como
Public o Published), si lo desea.
Informacin adicional
El especificador de visibilidad Automated apareci por primera vez en Delphi
2. Se mantiene en Delphi 3 y posteriores principalmente por razones de
compatibilidad.
Solucin rpida
Asegrese de que ha escrito correctamente el nombre del archivo de paquete
requerido, y que cualquier unidad a la que se hace referencia reside en un
directorio que est en la ruta de bsqueda de Delphi.
456
Informacin adicional
Para verificar y/o modificar la ruta de bsqueda de Delphi, seleccione Tools |
Environment Options, luego la pestaa Library y el cuadro de combinacin
Library Path. Generalmente, los paquetes deben estar instalados en el directorio \Windows\System.
Solucin rpida
Asegrese de que los archivos de paquete listados no contengan extensiones de
archivos y que la lista est terminada con un punto y coma.
Informacin adicional
Cualquiera de las siguientes declaraciones producir este mensaje de error:
requires
Vcl30 { falta el punto y coma final }
requires
Vcl30, { coma incorrecta; falta punto y coma }
requires
vcl30.dpk; { extensin no permitida }
Asegrese de que la clusula Requires sea parecida a sta (aunque puede que
se listen mltiples paquetes):
requires
Vcl30;
Mensajes de error
457
Solucin rpida
1. Solamente relance las excepciones dentro de un bloque de excepcin.
2. Sustituya la palabra reservada Raise por una llamada al mtodo
ShowException del objeto Application, pasndole el objeto E de tipo Exception, as:
if ReportObj.ProgramMode = pmBatch then begin
ReportObj.WriteToLogFile(
SReportName, SDelphiErrorMessage+E.Message,
SWindowsErrorCode+IntToStr(GetLastError),
DateToStr(Now), TimeToStr(Now));
Abort;
end else
Application.ShowException(E);
Informacin adicional
El gestor OnException sustituto debe tener la siguiente signatura:
procedure FilterExceptions(Sender: TObject; E: Exception);
Los bloques Try. . . Except tienden a ser sobreutilizados por muchos desarrolladores. Una regla general emprica es que los bloques Try. . . Finally deberan
exceder en nmero a los bloques Try. . . Except en una razn de 10:1. Delphi
manejar las excepciones que no maneje usted especficamente a travs de su
propio mecanismo de deteccin y gestin de errores. Si no se hace un manejo
anterior, el gestor de excepciones por defecto de Delphi gestionar las excepciones que lleguen a ese punto. Sin embargo, no liberar los recursos por s
mismo eso es responsabilidad del desarrollador.
458
Solucin rpida
Verifique la ortografa, o mueva el archivo .RES al mismo directorio que el
.DPR que lo necesita.
Informacin adicional
No coloque recursos personalizados dentro del archivo .RES que tiene el mismo
nombre del proyecto (es decir, si el proyecto se llama Project1.DPR, habr un
archivo .RES llamado Project1.RES). Permita que Delphi tenga total control
sobre este archivo.
Solucin rpida
Si realmente necesita especificar una direccin, utilice una direccin de memoria plana, como $0040.
Informacin adicional
Las direcciones absolutas no deberan ser utilizadas en programas de modo
protegido de 32 bits. La palabra reservada Absolute es normalmente utilizada
en la programacin a bajo nivel, por ejemplo cuando se escriben controladores
de dispositivos.
Mensajes de error
459
Solucin rpida
No intente eliminar cualquier componente que haya sido heredado del
ancestro.
Informacin adicional
Este mensaje de error apunta a la necesidad de evitar heredar de clases que
contengan ms de lo que quiera que tenga el descendiente. Al mismo tiempo, si
est creando una clase ancestro de la que va a heredar posteriormente, como
puede ser un formulario que podra ser heredado utilizando la herencia visual
de formularios (disponible en Delphi de 32 bits), mantngala tan genrica como
sea posible para permitir que sea utilizada en su totalidad por los formularios
descendientes.
Cuando hereda de una clase o componente, puede solamente aadir, pero no
quitar nada del ancestro. Una mirada al cdigo fuente que subyace a un formulario ancestro simple y su descendiente (creado utilizando herencia visual),
muestra cmo esto funciona en segundo plano.
Este es el cdigo fuente para un formulario ancestro simple:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
Button1: TButton;
private
{ Declaraciones Private }
public
{ Declaraciones Public }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
460
Solucin rpida
Proporcione en la propiedad ServerName o ServerGUID un valor correspondiente a un servidor que haya sido registrado en su mquina.
Informacin adicional
Los componentes MIDAS slo se proporcionan con la versin Cliente/Servidor
de Delphi 3 o superiores.
Mensajes de error
461
Solucin rpida
Proporcione un valor para la propiedad SessionName del componente TSession
o asigne True a su propiedad AutoSessionName.
Informacin adicional
No confunda las propiedades Name y SessionName del componente TSession.
La propiedad Name, que tienen todos los componentes, se refiere al nombre del
objeto en s. La propiedad SessionName de un componente TSession es el nombre de la sesin a la que los componentes TDatabase y TDataset (TTable,
TQuery y TStoredProc en todas las versiones de Delphi; TClientDataSet en la
versin de Delphi Cliente/Servidor 3, 4 y superiores; TNestedTable en Delphi 4
y superiores) se refieren a travs de su propiedad SessionName para indicar a
qu sesin estn conectados (til en aplicaciones multihilo, que pueden contener muchas sesiones).
Por lo tanto, el componente TSession proporciona un nombre de sesin bien
directamente (cuando introduce el nombre en tiempo de diseo o se proporciona uno en el cdigo) o indirectamente (cuando se asigna True a la propiedad
AutoSessionName), y los componentes TDatabase y TDataset seleccionan uno
de los nombres de sesin disponibles de un cuadro de combinacin.
Solucin rpida
El tipo de datos base del conjunto no debe contener ms de 255 elementos. Las
siguientes declaraciones funcionan bien:
type
sob = set of Byte;
soc = set of Char;
Informacin adicional
El tipo base no puede tener ms de 256 posibles valores, y sus ordinales deben
estar entre 0 y 255. Debido a estas limitaciones, los tipos conjunto normalmente se definen sobre subrangos, as:
462
type
TAWholeMessOfIntegers = 2..243;
TIntegerSet = set of TAWholeMessOfIntegers;
var
SetTopBox, Settee: TIntegerSet;
begin
SetTopBox := [1, 3, 5, 7, 9];
Solucin rpida
Aada DEVICE=*vshare a la seccin [386Enh] del archivo SYSTEM.INI, o
aada SHARE.EXE al archivo AUTOEXEC.BAT, y luego reinicie.
Informacin adicional
Para editar el archivo SYSTEM.INI desde el Explorador de Windows, siga estos pasos:
1. Localice SYSTEM.INI. Debera estar situado en el directorio de Windows.
Pulse dos veces sobre l para abrirlo.
2. Localice la seccin [386Enh].
3. Aada DEVICE=*vshare si no est ya en la seccin [386Enh].
4. Cierre SYSTEM.INI y guarde los cambios.
5. Reinicie.
Para editar el archivo AUTOEXEC.BAT desde el Explorador de Windows, siga
estos pasos:
1. Localice y pulse con el botn derecho sobre AUTOEXEC.BAT. Debera estar situado en el directorio raz (C:\).
2. Seleccione Edit del men de contexto.
3. Al final del archivo, introduzca SET SHARE=C:\dos\share /F:4096
/L:40.
4. Reinicie.
Mensajes de error
463
Solucin rpida
Reduzca el tamao del conjunto a una cantidad menor o igual que 32 elementos. Por ejemplo, en el conjunto de arriba, podra eliminar TWaterboy (o podra
borrar TQuarterback, pero).
Informacin adicional
Los conjuntos se utilizan frecuentemente para incluir mltiples elementos de
un tipo enumerado. Un ejemplo es el tipo TFontStyle:
464
Solucin rpida
Slice puede ser utilizado nicamente para enviar un subconjunto de un array
abierto a un procedimiento o un array que espera un argumento de array
abierto. He aqu un ejemplo de cmo puede ser utilizado Slice:
var
Form1: TForm1;
pare: array[0..11] of integer;
. . .
function Dice(EightWillSuffice: array of integer): integer;
var
i,sum: Integer;
begin
sum := 0;
for i := low(EightWillSuffice) to High(EightWillSuffice) do
sum := sum + EightWillSuffice[i];
Result := sum;
end;
procedure Peel;
begin
Dice(Slice(pare,3));
end;
Mensajes de error
465
Informacin adicional
Para ms informacin, consulte Slice en la ayuda de Delphi.
Solucin rpida
1. Inicie el servidor antes de intentar conectarse a l.
2. Compruebe que la propiedad Host de TIdTCPClient especifica una
mquina que es accesible, y la propiedad Port se refiere a un servicio que
est disponible en la mquina Host.
Informacin adicional
Un socket es una combinacin de un servidor (host) y un puerto. El servidor es
una mquina, y el puerto es un servicio que esa mquina ejecuta. Consulte los
archivos Hosts y Services en su ordenador para ver ejemplos de mquinas y
servicios disponibles.
Los componentes TIdTCPClient y TIdTCPServer son parte del conjunto de
componentes Indy, incluidos en Delphi por primera vez en la versin 6.
Solucin rpida
Compruebe que el valor que introduzca en la propiedad Host de TIdTCPClient
represente un mquina que sea accesible desde el ordenador cliente.
466
Informacin adicional
Un socket es una combinacin de un servidor (host) y un puerto. El servidor es
una mquina, y el puerto es un servicio que esa mquina ejecuta. Consulte los
archivos Hosts y Services en su ordenador para ver ejemplos de mquinas y
servicios disponibles.
Los componentes TIdTCPClient y TIdTCPServer son parte del conjunto de
componentes Indy, incluidos en Delphi por primera vez en la versin 6.
Solucin rpida
Conctese a Internet o la red necesaria para localizar la mquina en cuestin.
Informacin adicional
Los errores de sockets provienen de los componentes Indy, incluidos en Delphi
por primera vez en la versin 6.
Solucin rpida
1. Llvele un donuts al administrador de su red y comntele el problema.
2. Vea si puede reducir la cantidad de filas y/o columnas que est obteniendo
del servidor. Si est utilizando componentes TTable para acceder a grandes
cantidades de datos, considere el uso de un TQuery o TStoredProc.
3. Si est utilizando el BDE, ejecute la utilidad BDE Configuration y estudie
los valores de los parmetros del controlador para su sistema de base de
Mensajes de error
467
datos. Si no es tan obvio, trate de preguntar en los grupos de noticias relaconados con su base de datos.
Informacin adicional
MS SQL Server y Sybase (su madre) tienen una propiedad del controlador
MAXQUERYTIME que puede ser configurada a travs de BDE Configuratoion.
Solucin rpida
Mantenga el valor de la propiedad SQLDialect en 1, o actualcese a InterBase
6.
Informacin adicional
InterBase 6 aade algunas mejoras fundamentales sobre las versiones anteriores. Para hacer uso de ellas, sin embargo, debe asignar 3 a SQLDialect. El
valor 1 de SQLDialect se ha creado para las versiones de InterBase anteriores
a la 6. El valor 2 de SQLDialect se utiliza para probar la compatibilidad de las
aplicaciones antiguas creadas con InterBase. Para ms informacin, consulte
la documentacin de InterBase (www.interbase.com).
Solucin rpida
Utilice UpWhereChanged o UpWhereKeyOnly como valor para UpdateMode en
lugar de UpWhereAll.
Informacin adicional
El valor UpWhereAll del parmetro UpdateMode puede (internamente) crear
una sentencia SQL muy compleja. Aunque de por s no est mal utilizar el
468
Stack overflow
Posible causa de error
1. Puede haber declarado muchas variables (o unas pocas variables muy
grandes, como arrays) en un procedimiento o funcin situado en una unidad compilada con la directiva de compilador {$S+} (verificacin de pila
activada).
2. Puede haber declarado muchas variables globales (o unas pocas variables
globales muy grandes).
3. Puede estar utilizando recursin profunda (intencional) o tener una recursin infinita (no intencional) en el programa.
4. Puede estar pasando un registro muy grande como parmetro.
5. Puede estar utilizando muchos procedimientos o funciones muy grandes
que se llaman mutuamente.
6. Puede estar pasando parmetros muy grandes por valor.
Solucin rpida
1. Reduzca el nmero de variables que est utilizando o aumente el tamao
de la pila. Puede incrementar el tamao de la pila utilizando la directiva
de compilacin {$M}. La sintaxis para utilizarla es:
{$M minstacksize, maxstacksize}
Los valores por defecto son 16.384 y 1.048.576. El primero es el tamao inicial confirmado de la pila; el segundo es el tamao total reservado para la
pila. Para duplicar el tamao inicial confirmado, as como el tamao total
reservado, aada lo siguiente en el archivo .DPR del programa:
{$M 32768, 209752}
Mensajes de error
469
Informacin adicional
Este es el error de tiempo de ejecucin 202.
3. Obtener este error cuando se utiliza deliberadamente la recursin es ms
un problema de Delphi 1 que de Delphi de 32 bits, aunque la recursin infinita (como la descrita antes en relacin con el evento OnChange) ser un
problema tambin en Delphi/Windows de 32 bits.
5. Si un procedimiento o funcin ocupa ms de una pantalla de texto, sera
conveniente dividirlo en varios procedimientos ms pequeos.
6. Los parmetros pasados como Var o Const ocupan cuatro bytes cada uno,
ya que son punteros.
Para ms informacin, consulte stack overflow en la ayuda de Delphi.
Solucin rpida
Cualifique la llamada a Abort anteponindole el nombre de la unidad:
SysUtils.Abort;
Informacin adicional
Ambas unidades, SysUtils y DbiProcs (Delphi 1) o BDE (Delphi de 32 bits) contienen un procedimiento llamado Abort. En este tipo de situaciones, sea explcito sobre cul desea utilizar, anteponiendo el nombre de la unidad en la que
reside el procedimiento o funcin, al nombre del procedimiento o funcin que
desea utilizar.
470
Solucin rpida
Mueva el cuerpo del procedimiento a la parte Implementation de la unidad.
Informacin adicional
La parte Interface de una unidad puede solamente contener declaraciones, no
sentencias. Mueva los cuerpos de procedimientos a la parte Implementation.
Solucin rpida
Elimine la clusula Stored de la seccin Automated.
Informacin adicional
Delphi 2 y superiores ofrecen cinco directivas de visibilidad: Private, Protected,
Public, Published y Automated (Delphi 1 no tiene la directiva Automated). Las
propiedades de una clase pueden utilizar una de las directiva de almacenamiento Stored, Default o Nodefault. No obstante, estas directivas de almacenamiento no estn permitidas en la seccin Automated.
Solucin rpida
Si es factible, actualcese a una versin de Delphi de 32 bits, preferiblemente
la versin ms reciente. Si persiste en utilizar en Delphi 1 el formulario creado
con Delphi de 32 bits, borre todas las caractersticas especficas de Delphi de
32 bits del archivo de formulario (.DFM). Cargue el archivo en un editor de
texto corriente, como el Bloc de Notas, para hacer eso.
Mensajes de error
471
Informacin adicional
Algunas de las cosas que hacen que los archivos de formulario (.DFM) de Delphi de 32 bits no puedan ser utilizados en Delphi 1 son las cadenas largas, el
tipo TCollection, y la herencia de formularios.
Solucin rpida
Modifique el tamao de la cadena, o asigne una cadena que quepa en la variable. Por ejemplo, cualquier de las siguientes soluciones funcionar:
var
s: String[6];
begin
s := string;
-Ovar
s: String[3];
begin
s := str;
Informacin adicional
Para ms informacin, consulte strings en la ayuda de Delphi.
472
Solucin rpida
1. Asegrese de que el tamao que declara cuando utiliza un ShortString es
menor que 256.
2. No asigne una cadena de ms de 255 caracteres a una variable de tipo
ShortString.
3. Divida la cadena en varias lneas, y utilice el operador de concatenacin
(+).
4. Reduzca el tamao de la constante de cadena o declare varias constantes y
concatnelas, as:
const
SomewhatLong = {Cadena de hasta 255};
KindOfLong
= {Cadena de hasta 255};
SortOfLong
= {Cadena de hasta 255};
WorkAroundVeryLongString =
SomewhatLong + KindOfLong + SortOfLong;
Informacin adicional
Para ms infomacin, consulte string types en la ayuda de Delphi.
Mensajes de error
473
ExecSQL;
finally
Free;
end;
end;
debido a que esa no es la sintaxis apropiada para aadir un ndice a una tabla.
ADO cree que usted est intentando crear una nueva columna para la tabla,
pero esa tampoco es la sintaxis adecuada para ello.
Solucin rpida
Utilice la sintaxis apropiada. En el caso de arriba, sera:
with TADOQuery.Create(nil) do begin
try
Connection := ADOConnection1;
SQL.Add(CREATE INDEX ORD_SEQ ON SCRIPTURES(ORDER_SEQUENCE));
ExecSQL;
finally
Free;
end;
end;
Informacin adicional
Utilice la referencia de SQL de la base de datos que est utilizando para determinar la sintaxis correcta. La sintaxis es generalmente la misma entre las
diferentes bases de datos, pero hay ligeras variaciones. Si no tiene o no puede
encontrar la documentacin de SQL de la base de datos, puede encontrar un
ejemplo buscando en el disco duro, y seguramente podr encontrar un ejemplo
buscando en sitios de Internet como www.tamaracka.com o www.dejanews.com.
Por ejemplo, en el caso de arriba busque CREATE INDEX.
474
Solucin rpida
Encierre el nombre de la tabla entre corchetes, as:
SELECT *
FROM [ROUND TABLE]
Informacin adicional
Consulte el archivo LOCALSQL.HLP de Delphi, as como la documentacin del
SQL de la base de datos que est utilizando, para conocer la sintaxis de SQL
especfica del fabricante.
Solucin rpida
Aada un nmero al factor de escala (E):
var
Mint: Double;
begin
Mint := 123.E7;
Informacin adicional
E significa diez elevado a.
Mensajes de error
475
Solucin rpida
Compruebe que la ruta de bsqueda de bibliotecas no apunte a una versin
errnea de SYSTEM.DCU, por ejemplo a una unidad de terceros llamada
System. Seleccione Tools | Environment Options | Library | Library
Path. Una manera rpida de buscar unidades renegadas es utilizar la bsqueda de archivos y carpetas del Explorador de Windows. Si no encuentra ninguna anomala de esta naturaleza, reinstale SYSTEM.DCU del CD.
Informacin adicional
Nunca d a una unidad suya el mismo nombre que una unidad de Delphi. No
asuma que conoce los nombres de todas las unidades de Delphi. Ya no estamos
en el terreno de Delphi 1 (al menos la mayora de nosotros). A menos que haya
prestado atencin a los nombres de las unidades y tenga una memoria fotogrfica, lo ms probable es que las olvide. El mtodo preferido es utilizar un convenio de nombres para sus propias unidades, del mismo modo que deben
hacerlo los desarollladores de componentes. Puede anteponer sus iniciales, o
las iniciales de su compaa, y podr estar bastante seguro que no tratar con
nombres de unidades duplicados. Por ejemplo, si trabaja para una compaa
denominada Drywall Roofing & Insulation Supply, podra asignar a sus unidades nombres como DRISStrUtils, DRISConsts, DRISGlobal, etc.
Solucin rpida
Cierre primero la tabla llamando al mtodo Close de TTable, o asigne False a
su propiedad Active. Luego puede llevar a cabo la accin, despus de la cual
podr llamar al mtodo Open de TTable o asignar True a la propiedad Active.
Informacin adicional
Open es un mtodo de TTable, que puede llamarse as:
Table1.Open;
476
Solucin rpida
Asignar True al parmetro Local Share (en la pgina System de la utilidad
BDE Configuration) en todos los clientes y deshabilite los bloqueos
oportunistas.
Informacin adicional
Para deshabilitar los bloqueos oportunistas, debe editar (o crear, si es necesario) dos valores en el Registro del sistema siguiendo estos pasos:
1. Seleccione Inicio | Ejecutar en el escritorio de Windows.
2. Introduzca regedit en el cuadro de combinacin Abrir y pulse el botn
Aceptar.
3. Navegue hasta HKEY_LOCAL_MACHINE\System\CurrentControlSet\
Services\LanmanServer\Parameters.
4. Edite o cree la clave EnableOplock y asgnele el valor 0.
5. Edite o cree la clave UseOpportunisticLocking y asgnele el valor 0.
6. Reinicie para que la configuracin tenga efecto.
Mensajes de error
477
6. Puede estar intentando acceder a una tabla que est activa en otro hilo o
conexin.
Solucin rpida
1. Si falta el nombre de la tabla, modifique la sentencia SQL.
2. Proporcione el nombre de un alias vlido en la propiedad DatabaseName
del objeto TTable.
3. Compruebe que el conjunto de datos que ha especificado como fuente
(TQuery, TStoredProc o TTable) exista y que el TTable que ha especificado
como destino exista.
4. Escriba en maysculas los nombres de las tablas cuando acceda a Oracle.
5. Anteponga dbo. al nombre de la tabla. Por ejemplo:
SELECT * FROM dbo.Cooper
Informacin adicional
5. dbo significa database owner (propietario de la base de datos).
478
Solucin rpida
1. Si est llamando a RecordCount para determinar si la cantidad de registros es 0, podra verificar en su lugar si la tabla est simultneamente al
comienzo y al final del archivo, as:
if (tblHollow.bof) and (tblHollow.eof) then
Si quiere saber cuntos registros tiene la tabla, puede utilizar una sentencia SQL como:
SELECT COUNT(*) FROM MONTECRISTO
Informacin adicional
Consulte la documentacin especfica de su base de datos para conocer las particularidades del SQL que soporta.
Table is busy
Posible causa de error
1. Puede haber intentado aadir un ndice en el cdigo (utilizando el mtodo
AddIndex de TTable) sin tener acceso exclusivo a la tabla.
2. Puede haber intentado copiar registros de una tabla a otra utilizando el
componente TBatchMove en modo batCopy mientras la tabla de destino
estaba abierta.
3. Puede haber intentado abrir una tabla en modo Exclusive cuando otro
usuario tena la tabla abierta.
4. Puede tener una tabla abierta en el entorno integrado (o en el Database
Desktop), y est intentando posteriormente abrirla en tiempo de ejecucin
en su proyecto.
5. Puede estar llamando al mtodo EmptyTable de TTable y la tabla est
activa o abierta.
Mensajes de error
479
Solucin rpida
1. Cierre primero el TTable y asigne True a la propiedad Exclusive.
2. Cierre la tabla de destino antes de copiar los registros a ella. Puede hacer
esto llamando al mtodo Close de TTable o asignndole False a la propiedad Active del componente.
3. Encierre la sentencia que asigna True a la propiedad Exclusive en un bloque Try. . . Except, para proporcionarle al usuario un mensaje informativo
del problema si es imposible utilizar la tabla en modo exclusivo debido a
que otro usuario la tiene abierta.
4. Asigne False a la propiedad Active del TTable en el entorno integrado.
5. Llame al mtodo Close de TTable o asigne False a su propiedad Active
antes de intentar llamar a EmptyTable.
Informacin adicional
Varios usuarios pueden ver la misma informacin simultneamente, pero no
pueden editar la misma informacin al mismo tiempo.
5. Debe tener uso exclusivo de la tabla antes de llamar a EmptyTable.
Intentar asignar True a la propiedad Exclusive de la tabla mientras la propiedad Active tiene el valor True produce el mensaje de error Cannot
perform this operation on an open dataset. Consulte esa entrada
para ms informacin.
Si otro usuario tiene una tabla abierta en modo exclusivo y usted la intenta
abrir, recibir el mensaje de error File is Locked. Table: <> User: <>.
Consulte esa entrada para informacin ms especifica.
Table is full
Posible causa de error
Puede estar excediendo la capacidad mxima de una tabla Paradox.
Solucin rpida
Tendr que incrementar el tamao del bloque con la utilidad BDE Configuration/Administration, o evaluar el paso a una base de datos de servidor SQL
como InterBase (u Oracle, MS SQL Server, etc.).
Para incrementar el tamao de bloque en la utilidad BDE Configuration, modifique el valor del parmetro Block Size en la pgina/nodo Drivers | Paradox
de la utilidad BDE Configuration. Todas la tablas de Paradox que cree a partir
de ese momento reflejarn la nueva configuracin. Para aplicar la configuracin a una tabla ya existente, cree una nueva tabla utilizando la estructura de
la tabla existente, y luego copie los datos de la tabla original a la nueva tabla.
480
Informacin adicional
Las tablas Paradox pueden disponer de un mximo de 65.536 (64 K) bloques.
El tamao por defecto del bloque es de 2.048 bytes (2 KB), y por lo tanto el
tamao mximo por defecto de una tabla Paradox es de 128 MB. Incrementar
el tamao del bloque a 32.768 (32 KB) le permitir crear tablas de hasta 2 GB.
La siguiente tabla muestra el tamao mximo de una tabla en base a la configuracin del parmetro Block Size en la configuracin del BDE:
Tamao bloque
2 KB
128 MB
4 KB
256 MB
8 KB
512 MB
16 KB
1.024 MB
32 KB
2.048 MB
Solucin rpida
Cree un ndice primario para la tabla antes de crear un ndice secundario.
Puede hacer esto utilizando el Database Desktop o en el cdigo. Para crear el
ndice primario utilizando el Database Desktop, marque la columna Key (o
pulse la barra espaciadora) de las n primeras columnas de la tabla.
Para crear un ndice primario mediante cdigo, siga el siguiente ejemplo:
AddIndex('Stadt', 'Stadt', [ixPrimary]);
Informacin adicional
Si la clave primaria consta de solamente una columna, sta debe ser la primera columna de la tabla. Si es una clave compuesta, debe comenzar con la
primera columna y luego incluir todas las columnas consecutivas siguientes,
hasta la ltima columna que quiera utilizar (por ejemplo, si quiere utilizar la
primera y tercera columnas en la clave compuesta, deber utilizar tambin la
segunda). Si est aadiendo el ndice mediante cdigo, separe los nombres de
las columnas que componen la clave primaria compuesta con puntos y comas,
as:
Mensajes de error
481
AddIndex('DogfaceIndex', 'Name;Rank;SerialNumber',
[ixPrimary]);
Solucin rpida
1. Asigne primero False a la propiedad ReadOnly, y luego llame al mtodo
Edit o Delete. Asegrese de que la propiedad Active del objeto TTable
tenga asignado False antes de intentar asignar valor a la propiedad
ReadOnly.
2. Utilice actualizaciones en cach (cached updates) para editar el conjunto
resultado de una consulta sobre varias tablas.
3. Asigne True a RequestLive.
Informacin adicional
El mtodo Delete de TTable borra el registro actual nicamente. Para borrar
todos los registros de una tabla, utilice el mtodo EmptyTable. Para borrar no
slo todos los registros, sino tambin la propia tabla (la estructura), utilice el
mtodo DeleteTable. La tabla debe estar cerrada antes de la llamada a
DeleteTable.
Para borrar selectivamente registros que cumplan cierto criterio, utilice un
componente TQuery y asigne su propiedad SQL segn los siguientes patrones:
DELETE FROM Expendable {para borrar todos los registros}
DELETE FROM OutstandingDebts WHERE Amount > 10
{para borrar todos los registros que tengan
un valor mayor que 10 en el campo Amount}
482
Solucin rpida
1. Si tiene derechos para asignar derechos, asgneselos para que pueda ver la
tabla o vista. Si no tiene derechos para asignar derechos, consulte al administrador de la base de datos.
2. Si asigna True a la propiedad RequestLive de un componente TQuery, utilice letras maysculas para especificar el nombre de la tabla. Por ejemplo:
SELECT * FROM ROUND
Informacin adicional
Consulte la documentacin especfica de la base de datos que est utilizando en
relacin con las particularidades de la versin de SQL que sta soporta. Por
ejemplo, Oracle utiliza PL/SQL, Microsoft MS SQL Server utiliza Transact
SQL, etc.
Solucin rpida
Edite el archivo de formulario (.DFM) pulsando con el botn derecho del ratn
sobre el formulario y seleccionando View As Text del men de contexto.
Encuentre la lnea:
object ActiveFormX: TActiveFormX
Mensajes de error
483
Luego pulse el botn derecho del ratn sobre el archivo .DFM y seleccione
View As Form del men de contexto.
Informacin adicional
Para ms informacin, consulte ActiveX applications en la ayuda de Delphi.
Solucin rpida
Borre las lneas que sobran.
Informacin adicional
Este error muchas veces contina an despus de borrar el texto que est despus del End final, pero no impide la compilacin. En este caso, la frase ignored by compiler se aade al mensaje de error.
Solucin rpida
Actualice el ejecutable si actualiza uno o ms de los paquetes que ste utiliza.
Alternativamente, renombre el paquete cuando lo actualice para asegurarse de
que la versin antigua del ejecutable todava puede ser ejecutada (utilizando la
versin antigua del paquete).
Informacin adicional
Si renombra los paquetes que actualiza, la versin antigua del ejecutable buscar la versin antigua del paquete. El nuevo paquete solamente ser encontrado por una nueva versin del ejecutable.
Puede tambin recibir el mensaje de error A device attached to the system
is not functioning despus de este mensaje de error.
484
The <> method referenced by <>.<> does not exist. Remove the
reference?
Posible causa de error
Puede haber borrado un mtodo del cdigo, pero el formulario mantiene una
referencia a l en la pgina de eventos.
Alternativamente, puede estar intentando asignar un gestor de eventos a un
evento que puede que exista (a pesar del mensaje de error), pero el gestor de
eventos no est declarado en la parte Published de la declaracin del tipo.
Solucin rpida
Seleccione Yes para borrar la referencia al cdigo que no existe.
Informacin adicional
Si selecciona Yes, la referencia al mtodo ser borrada de la pgina de eventos
del formulario (ste no quedar asociado a ningn evento en particular).
Si borra un mtodo de la parte Implementation sin borrar su declaracin en la
parte Interface, obtendr un mensaje de error de referencia no resuelta. Si
borra la declaracin de la parte Interface sin borrar el mtodo de la parte
Implementation, obtendr un mensaje de error de identificador no declarado.
Si borra los dos (pero ha asociado el mtodo a un evento en el Inspector de
Objetos), el mensaje bajo discusin se mostrar cuando intente compilar.
En un formulario normal o archivo de unidad .PAS, no hay ninguna declaracin Published explcita. Todos los mtodos que usted aade son automticamente colocados en la seccin inicial de la declaracin del formulario, que es
Published aunque no se designe explcitamente como tal. Cualquier miembro
que no se designe explcitamente de otra manera (por ejemplo, Private o
Public) es Published. Los mtodos que utilice como gestores de eventos deben
ser declarados en la seccin Published para que produzcan RTTI (Run-Time
Type Information - informacin de tipos en tiempo de ejecucin) y por lo tanto
estn disponibles como mtodos apropiados para ser asociados a un evento. El
esqueleto de este tipo de archivo que es producido por Delphi cuando aade su
primer formulario a un proyecto es similar a esto:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
{sta es la seccin Published}
private
{ Declaraciones Private }
Mensajes de error
485
public
{ Declaraciones Public }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
486
Solucin rpida
Modifique la lista de parmetros del mtodo en la parte Interface para que se
corresponda con la definicin en la parte Implementation.
Informacin adicional
Si selecciona Yes, la referencia al mtodo ser borrada de la pgina de eventos
del formulario (ste no quedar asociado a ningn evento en particular).
Solucin rpida
Seleccione Run | Parameters, introduzca <Proyecto> /regserver, y pulse
F9 (ejecutar).
Mensajes de error
487
Informacin adicional
Si escribe <Proyecto> /regserver en la lnea de comandos, Windows le avisar que debe especificar una extensin. Puede tambin utilizar la utilidad
TRegSvr de Borland. Consulte el proyecto de demostracin \Demos\ActiveX\
TRegSvr.
The changes you requested to the table were not successful because
they would create duplicate values in the index, primary key, or
relationship. Change the data in the field or fields that contain
duplicate data, remove the index, or redefine the index to permit
duplicate entries and try again.
Posible causa de error
Puede estar intentando grabar a travs de ADO un registro que ocasionara
una violacin de clave.
Solucin rpida
El mensaje de error dice todo lo que necesita usted saber: Modifique el valor
del campo o campos que contienen datos duplicados, borre el ndice o redefnalo
para permitir entradas duplicadas e intntelo de nuevo.
Informacin adicional
Este mensaje de error es inusual, en el sentido de que es muy explcito sobre lo
que puede ser la causa del error y explica cmo rectificar la situacin. Tambin
es, indudablemente, el mensaje de error ms largo en este libro.
Solucin rpida
Marque el archivo como apto para escritura, y luego haga los cambios.
488
Informacin adicional
Puede estar indirectamente intentando editar el archivo. Por ejemplo, puede
haber intentado colocar un componente sobre un formulario, lo cual produce
modificaciones tanto en la unidad (.PAS) como en el archivo de formulario
(.DFM) correspondiente.
Solucin rpida
Seleccione un componente TDataSource como la propiedad MasterSource del
objeto TTable, y luego asigne la propiedad MasterFields.
Informacin adicional
Para ms informacin, consulte Master/Detail forms en la ayuda de Delphi.
The OLE control may possibly require support libraries that are not
on the current search path or are not present on your system
Posible causa de error
Puede estar intentando instalar un VBX de 16 bits (control de Visual Basic) en
Delphi de 32 bits.
Solucin rpida
Instale los controles VBX de 16 bits en Delphi 1 solamente (no en Delphi de 32
bits).
Informacin adicional
Para Delphi de 32 bits (y Windows en general), necesitar OCXs de 32 bits (en
lugar de VBXs).
Mensajes de error
489
Solucin rpida
Compruebe si la unidad que est tratando de instalar ya existe en el paquete
(es contraposicin a un componente con una funcionalidad distinta pero con el
mismo nombre).
Si la unidad es realmente la misma, simplemente desista de tratar de instalarla otra vez. Si es diferente en funcionalidad pero no en el nombre, renombre
la unidad que est intentando instalar e intntelo de nuevo.
Informacin adicional
Como la mayora de las cosas, los paquetes tienen ventajas y desventajas. Primero las malas noticias: los paquetes aaden complejidad al proceso de desarrollo y distribucin e introducen ms problemas potenciales. Una de las
principales ventajas de Delphi 1 (sobre Visual Basic, en particular) era que
permita crear una solucin de un archivo: todo lo que se necesita distribuir es
un simple .EXE (por supuesto, esto no tiene en cuenta las aplicaciones de bases
de datos, donde otros archivos necesitan ser distribuidos). El uso de paquetes
obliga a distribuir varios archivos al usuario.
Las buenas noticias en relacin con los paquetes es que pueden ahorrar espacio
de RAM y disco duro si la mquina de destino tiene instaladas varias aplicaciones escritas en Delphi. En lugar de tener el ncleo de la funcionalidad de Delphi embebida cada ejecutable, los paquetes permiten distribuir un ejecutable
reducido que llama a los paquetes (.DLLs especficas de Delphi) cuando necesita cierta funcionalidad.
Solucin rpida
Seleccione OK. El paquete no es aadido por segunda vez.
490
Informacin adicional
Para ms informacin, consulte packages en la ayuda de Delphi.
Solucin rpida
Compruebe que la aplicacin servidora est configurada para escuchar por el
puerto correcto, y que la aplicacin cliente est intentando conectarse al mismo
puerto.
Informacin adicional
Si est probando una aplicacin Site Express, puede utilizar el siguiente tipo
de URL: http://localhost:1024/Svrinfo.exe
Localhost es su mquina (IP # 127.0.0.1); est intentando conectarse al puerto
1024 y ejecutar la aplicacin Svrinfo.
Site Express apareci por primera vez en Delphi 6.
Solucin rpida
Introduzca directamente o navegue hasta (utilizando el botn Browse) una
ruta vlida en donde guardar la aplicacin.
Informacin adicional
La ruta no solamente debe ser una unidad y un nombre vlido, sino que debe
existir Delphi no crear el directorio si no existe.
Mensajes de error
491
The procedure entry point <> cannot be found in the dynamic link
library <>.DLL
Posible causa de error
1. Puede haber escrito mal o no haber utilizado la combinacin adecuada de
maysculas/minsculas en el nombre de un procedimiento o funcin en la
aplicacin que hace la llamada.
2. Puede haber olvidado colocar el procedimiento o funcin en la seccin
Exports de la .DLL.
Solucin rpida
1. Compruebe que el nombre del procedimiento o funcin est escrito
correctamente.
2. Coloque el procedimiento o funcin en la seccin Exports de la .DLL .
Informacin adicional
Aunque .DLL significa Librera de Enlace Dinmico (Dynamic Link Library),
puede ser realmente enlazada estticamente (en cuyo caso el programa no se
podr ejecutar si hay un problema con la .DLL) o dinmicamente, utilizando
las funciones LoadLibrary y GetProcAddress.
Solucin rpida
Especifique un nombre nico para el formulario o unidad.
Informacin adicional
El nombre que asigne a un formulario en el Inspector de Objetos ser el nombre de la clase (Form1 por defecto). La clase se convierte en un objeto en
tiempo de ejecucin, cuando se crea su instancia.
492
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs;
type
TForm1 = class(TForm) {nombre por defecto de la clase
del primer formulario del proyecto}
private
{ Declaraciones Private }
public
{ Declaraciones Public }
end;
var
Form1: TForm1; {variable de objeto por defecto y nombre de
clase del primer formulario del proyecto}
implementation
uses
{seccin Uses auxiliar opcional; til para evitar
errores de referencia circular entre unidades}
Unit2; {se hace referencia a otros formularios del proyecto
por sus nombres de archivos (y no por sus nombres
de componentes)}
{$R *.DFM}
end.
Solucin rpida
Abra un proyecto antes de ejecutar el Asistente para crear .DLLs de recursos.
Informacin adicional
Las .DLLs de recursos son utilizadas por los proyectos los proyectos utilizan
los recursos almacenados en las .DLLs. El uso ms comn de esta caractersticas est probablemente relacionado con el Entorno de Traduccin Integrado de
Mensajes de error
493
Delphi, que hace posible crear varias .DLLs de recursos para cada uno de los
idiomas que desea soportar.
Solucin rpida
Introduzca la cadena a buscar.
Informacin adicional
Para que el texto situado bajo el cursor sea introducido automticamente en el
cuadro de combinacin Text to Find del cuadro de dilogo Find Text una vez
se active el dilogo, siga estos pasos:
1. Seleccione Tools | Environment Options.
2. Seleccione la pgina Editor.
3. Marque la casilla de verificacin Find Text at Cursor.
El dilogo Find Text permite configurar muchas caractersticas. Pulse el botn
Help para aprender ms sobre stas.
Solucin rpida
Seleccione un mapa de bits que sea como mximo un cuadrado de 24 pxeles
como mapa de bits del icono de la paleta para representar la plantilla de
componente.
Informacin adicional
El icono por defecto para una plantilla de componente es a) el del primer componente seleccionado, si seleccion los componentes utilizando el ratn y la
494
Solucin rpida
Registre la biblioteca de tipos Webbrokerscript. Pare y reinicie SRVINFO.EXE.
Informacin adicional
Puede registrar WEBBROKERSCRIPT.TLB seleccionando la opcin Ejecutar
del men de Inicio de Windows e introduciendo el comando tregsvr
WEBBROKERSCRIPT.TLB.
Site Express apareci por primera vez en Delphi 6.
The transaction isolation level must be dirty read for local databases
Posible causa de error
Puede haber asignado uno de los valores tiReadCommitted o tiRepeatableRead
a la propiedad TransIsolation de un componente TDatabase mientras utiliza
una base de datos local o de escritorio, como Paradox o dBASE.
Mensajes de error
495
Solucin rpida
Cambie el valor de TransIsolation a tiDirtyRead si el objeto TDatabase hace
referencia a tablas locales (como Paradox y dBASE).
Informacin adicional
tiDirtyRead (lectura sucia) hace que se muestren todos los cambios que se
producen sobre la base de datos (an si se trata de cambios realizados por otro
usuario que luego no lleguen a ser confirmados). La mayora de las bases de
datos de servidor SQL, como InterBase, Oracle, MS SQL Server, etc., no soportan el modo tiDirtyRead. Si asigna tiDirtyRead a la propiedad TransIsolation
cuando utiliza estas bases de datos, ellas promovern esta configuracin a la
prxima disponible (la menos restrictiva disponible para la plataforma
particular).
tiRepeatableRead (lectura repetible) garantiza que la vista que tiene un
usuario de un registro no cambie mientras lo est consultando. An si otro
usuario edita el registro (e incluso confirma los cambios), la instantnea del
registro continuar siendo visible a este usuario.
tiReadCommitted (lectura confirmada) slo muestras los cambios hechos a los
registros despus de que la transaccin que los modifica haya sido confirmada.
Para ms informacin, consulte TransIsolation en la ayuda de Delphi.
Solucin rpida
Apoyndose en el mensaje de error ms especifico que se muestra en la barra
de estado en la parte inferior del Editor de Bibliotecas de Tipos, corrija el error
de sintaxis.
Informacin adicional
Un error que puede aparecer en la barra de estado del Editor de Bibliotecas de
Tipos despus del mensaje de error bajo discusin (que aparece en un cuadro
de mensaje) es A CoClass must implement at least one interface. Consulte la discusin sobre este mensaje de error para detalles ms especficos.
496
Solucin rpida
Abra primero una aplicacin del Panel de Control, seleccionando File | New |
Control Panel Application.
Solucin rpida
Establezca una impresora por defecto para NT.
Informacin adicional
Citrix Winframe es una tecnologa que enva las pulsaciones de teclas y ratn
de la mquina cliente al servidor, y la pantalla se actualiza desde el servidor al
cliente.
Mensajes de error
497
Solucin rpida
1. Utilice la funcin de conversin correcta:
HollywoodSquare :=
FloatToStr(Sqr(StrToInt(edtNum2Square.Text)));
Informacin adicional
1. Como el parmetro de la funcin Sqr debe ser un nmero real (Extended),
la conversin debe ser FloatToStr, y no IntToStr, an en el caso de que el
argumento que enve y el valor que espere recibir sean enteros. La funcin
StrToInt funcionar siempre que se introduzca realmente un entero en el
cuadro de edicin. Para mayor seguridad, (practique la programacin
defensiva!) cambie tambin la llamada a StrToInt por StrToFloat, as:
HollywoodSquare := FloatToStr(
Sqr(StrToFloat(edtNum2Square.Text)));
498
Solucin rpida
1. Cuando sea necesario, asegrese de que utiliza una instancia, o variable,
del tipo, en lugar del propio tipo.
2. Compruebe que est anteponiendo el tipo de la clase al nombre del mtodo.
Por ejemplo, si ha declarado un mtodo ToMyMadness como parte de una
declaracin de tipo de un formulario, la siguiente definicin en la parte
Implementation producir el mensaje de error bajo discusin:
procedure ToMyMadness(var Dogweight: Byte);
begin
if dogweight < 100 then Kick(hard) else Run;
end;
La solucin puede ser tan simple como borrar la T inicial del nombre del
tipo de clase. Por ejemplo, si intenta esto (crear dinmicamente un cuadro
de dilogo Acerca de):
TAboutBox := TAboutBox.Create(nil);
try
TAboutBox.ShowModal;
finally
TAboutBox.Free;
end;
Informacin adicional
3. Para redefinir un mtodo abstracto, debe crear una clase que descienda de
la clase en la que el mtodo abstracto est declarado y luego utilizar la
directiva Override. Por ejemplo, si la declaracin de tipo de la clase base se
parece a sta:
type
TBassist = class
procedure Walk; virtual; abstract;
Mensajes de error
499
Solucin rpida
Anteponga el nombre del tipo al nombre del mtodo:
procedure TascY2KComboBox.KeyPress(var Key: Char);
var
TextLength, i: Integer;
begin
inherited KeyPress; //TWinControl
Informacin adicional
Para poder heredar algo, se debe estar en una clase descendiente. El cdigo de
cada mtodo es visto por el compilador como si estuviera incluido dentro de un
bloque un With Self Do invisible. Por esta razn, en el segundo caso la llamada
Inherited KeyPress se interpreta como Inherited TascY3KComboBox.KeyPress,
y esta clase s hereda un evento KeyPress de TWinControl.
500
Solucin rpida
Si la unidad de hecho es la misma unidad, simplemente evite instalarla por
segunda vez. Si se trata de unidades diferentes pero con el mismo nombre,
renombre la segunda unidad y luego aada el componente.
Informacin adicional
A partir de Delphi 3, cuando se instala un componente, ste es colocado dentro
de un paquete. Puede colocar un componente en un paquete existente o en uno
nuevo. Lo normal es colocar cualquier componente que se aada dentro del
archivo DCLUSR[30,40,50,60].DPK (Componentes de Usuario de Delphi).
Solucin rpida
Sustituya el tipo invlido por uno permitido, como:
argyle: array[0..1] of string = ('zig','zag');
Informacin adicional
Para ms informacin, consulte initialized variables en la ayuda de Delphi.
Mensajes de error
501
Solucin rpida
Borre la palabra reservada Absolute. El compilador debe poder asignar la
direccin que sea necesaria a la variable local de hilo.
Informacin adicional
Ah, los hilos! Hablando de ellos, si quiere ver un ejemplo elegante de la utilizacin de hilos, estudie ConnectThread.pas en \Indy\Demos\Newsreader. Jon
Shemitz describe una aproximacin similar en un artculo que puede ser
encontrado en www.midnightbeach.com.
Solucin rpida
Mueva la declaracin Threadvar a una seccin global.
Informacin adicional
Las variables locales de hilo son globales al hilo (pueden ser accedidas desde
cualquier lugar del cdigo del hilo), pero son locales a cualquier instancia del
hilo. Esto quiere decir que si dos instancias del hilo estn en ejecucin, cada
una tendr su propia copia de la variable. Si la primera instancia cambia el
valor de la variable local del hilo, y luego la segunda instancia del hilo cambia
el valor de la variable del hilo para hacer algo, la primera instancia no ver el
cambio que la segunda instancia ha hecho (y viceversa).
502
Solucin rpida
Introduzca el elemento necesario que falta. En el caso de arriba, se trata de la
parte SELECT <ListaCampos>.
Informacin adicional
Una sentencia SELECT bsica de SQL tiene el formato:
SELECT *
{
FROM
Customer {
WHERE
{
AmountOwed
lista de campos }
lista de tablas }
clusula where opcional}
> 0
Solucin rpida
Encierre el nombre del propietario (dbo) y el nombre de la tabla entre comillas
dobles:
SELECT *
FROM dbo.COOPER
Informacin adicional
Para ms informacin, consulte RequestLive en la ayuda de Delphi.
Mensajes de error
503
Solucin rpida
1. Consulte la declaracin del procedimiento o funcin para ver la cantidad,
tipo y orden de los argumentos que espera.
2. No pase ms de 255 argumentos a un procedimiento o funcin de automatizacin OLE.
3. Anteponga el nombre de la unidad en donde est definido el procedimiento
o funcin que intenta llamar al nombre de procedimiento o funcin.
Informacin adicional
3. Un par de casos frecuentes donde esto ocurre es con los procedimientos
Append y Abort. El procedimiento Append est declarado en la unidad
System; el mtodo Append de TDataSet est en la unidad DB (dbiProcs en
Delphi 1). La clase TStrings tambin tiene un mtodo Append, en la
unidad Classes. Abort est definido como un procedimiento en SysUtils y
es adems un mtodo de la clase TPrinter, definida en la unidad Printers.
Para ms informacin, consulte open-array parameters en la ayuda de
Delphi.
Solucin rpida
Utilice un componente TDatabase. Asigne a la propiedad Alias del componente
TDatabase el alias del BDE (o nombre de ruta). Asigne el valor de la propiedad
504
Informacin adicional
Al utilizar un componente TDatabase, se reduce el nmero de conexiones que
la aplicacin utiliza a una sola (todos los objetos comparten la conexin que se
establece en el componente TDatabase). Los componentes TTable, TQuery y
TStoredProc utilizan un alias local para hacer referencia al componente
TDatabase en su propiedad DatabaseName.
Puede
Puede
Puede
Puede
Solucin rpida
1. CD-ROM significa Compact Disc-Read Only Memory (Memoria de slo lectura en disco compacto); ya que de hecho es un dispositivo de slo lectura,
no se puede escribir en un CD-ROM.
2. Asegrese siempre de llamar a CloseFile cuando termine de utilizar un
archivo. Por ejemplo:
var
texan: TextFile;
begin
AssignFile(texans, 'LoneDove.txt');
Rewrite(texans);
Writeln(texans,
'L. McMurtry wrote about the cattle drive to Montana);
CloseFile(texan);
end;
Informacin adicional
2. Olvidarse de llamar a CloseFile para un archivo puede ocasionar la prdida
de algunos o todos los datos escritos en el archivo.
Mensajes de error
505
Solucin rpida
Limite la cantidad de ediciones realizadas dentro de una misma transaccin.
Informacin adicional
Si utiliza un componente TDatabase, puede utilizar su mtodo
StartTransaction (terminado por un Commit o Rollback) para tratar un grupo
de operaciones como una transaccin todas ellas fracasarn como grupo
(Rollback) o sern confirmadas como grupo (Commit).
Cada registro que es modificado consume un bloqueo. El mximo nmero de
bloqueos por tabla es de 255, as que esa es la cantidad mxima de registros
que se pueden modificar en una transaccin.
Solucin rpida
Cierre las tablas cuando termine de utilizarlas. Si utiliza una cantidad relativamente pequea de tablas (hasta varias docenas), probablemente podr esperar hasta que se cierre el programa para cerrar las tablas. Si utiliza ms de
cien tablas, deber cerrar las tablas tan pronto como termine de utilizarlas.
Informacin adicional
No es posible incrementar la cantidad de cursores disponibles al BDE. El
nmero de tablas que se puede tener abiertas a la vez es de 127. Si recibe este
error mientras tiene menos de 127 tablas abiertas, puede haber encontrado
una limitacin de su base de datos particular, y no del BDE. Por ejemplo, en
Oracle el nmero mximo de cursores abiertos simultneamente puede ser
506
Solucin rpida
1. Configure la lnea Files= en CONFIG.SYS a un valor ms alto que el
actual, por ejemplo a 100 o an a 255, si es necesario.
2. Incremente el valor del parmetro MAXFILEHANDLES en la pgina
System de la utilidad BDE Configuration/Administration o en el nodo
System | Init.
Informacin adicional
Consulte Too many files open.
Mensajes de error
507
. . .
var
Gitfiddle: TGramps;
begin
Gitfiddle:= TYoungWhipperSnapper.Create;
Gitfiddle.NoteOrTriad(1, 2, 3)
Solucin rpida
1. Consulte la definicin del procedimiento o mtodo que est llamando para
determinar la signatura (nmero, tipo, y secuencia de parmetros) que
necesita.
2. Para llamar al mtodo NoteOrTriad de TYoungWhipperSnapper, declare
Gitfiddle como TYoungWhipperSnapper, o declare NoteOrTriad como
virtual en TGramps y redefnalo en TYoungWhipperSnapper.
Informacin adicional
Consulte Not enough actual parameters.
Transaction Is Active
Posible causa de error
Puede haber llamado a StartTransaction sobre un componente IBTransaction
que ya estaba activo. Por ejemplo, lo siguiente generara este mensaje de error:
. . .
IBTrans.Active := True;
try
with IBQry do begin
Unidirectional := True;
Database := dm.IBDB;
Transaction := IBTrans;
SQL.Add('INSERT INTO LIABILITY (');
SQL.Add('AGENCY_ID,EMPLOYER_ID,PAYROLL_DATE,
+ LIABILITY_AMOUNT,DUE_DATE)');
SQL.Add('VALUES (');
SQL.Add(':AgencyID,:EmployerID,:PayrollDate,
+ :LiabilityAmount,:DueDate)');
Params.ParamByName('AgencyID').AsString := AAgencyID;
Params.ParamByName('EmployerID').AsString :=
AEmployerID;
Params.ParamByName('PayrollDate').AsDate :=
APayrollDate;
Params.ParamByName('LiabilityAmount').AsCurrency :=
ALiabilityAmount;
Params.ParamByName('DueDate').AsDate := dDueDate;
IBTrans.DefaultDatabase := dm.IBDB;
508
Solucin rpida
Active la transaccin solamente una vez. Para el ejemplo mostrado arriba,
simplemente borre la lnea:
IBTrans.Active := True;
Informacin adicional
Si en un punto particular del programa la transaccin puede o no puede estar
activa, puede comprobarlo del siguiente modo:
if not IBTrans.Active then
IBTrans.StartTransaction;
Solucin rpida
Cierre explcitamente todos los conjuntos de datos antes de que la aplicacin
termine. Por ejemplo:
procedure TViewEditTables.FormDestroy(Sender: TObject);
begin
IBtbl.Active := False;
end;
Informacin adicional
Esto realmente no debera ser absolutamente necesario, aunque es una buena
prctica cerrar todos los conjuntos de datos antes de terminar.
Mensajes de error
509
2. Puede estar copiando datos de un tipo de base de datos a otro, y los formatos de fechas no son iguales.
3. Puede estar trabajando con una tabla dBASE y estar utilizando un controlador de lenguaje distinto al utilizado originalmente (con el que se cre la
tabla y/o se aadieron datos posteriormente).
Solucin rpida
1. Utilice el mismo formato de fecha en ambas mquinas.
2. Convierta el formato de fecha al de la mquina destino antes o durante la
copia.
3. Con la utilidad BDE Configuration (Drivers | dBASE | LangDriver),
cambie el parmetro Language Driver al que originalmente utiliz.
Informacin adicional
Las fechas nulas o vacas en Delphi de 32 bits no estn realmente en blanco,
sino que contienen el valor Diciembre 31 de 1899. En Delphi 1, la fecha de
inicio era 01/01/01. Este valor inicial fue cambiado para garantizar la compatibilidad con la automatizacin OLE.
Solucin rpida
Marque un bloque para buscar, o cambie la opcin de bsqueda a global, marcando la casilla de verificacin Global en la seccin Scope del dilogo Find.
Informacin adicional
Estudie las dems opciones de bsqueda que estn disponibles en el dilogo
Find.
510
Solucin rpida
Puede utilizar TypeInfo solamente para los tipos que pueden ser utilizados en
propiedades Published, como Integer, Extended, String, TMethod y Variant.
Informacin adicional
Para ms informacin, consulte TypeInfo en la ayuda de Delphi.
Solucin rpida
Cambie la clase de la que desea heredar (la clase ancestro) por una vlida. Por
ejemplo, en el caso de arriba, lo siguiente evitara que el error ocurriera de
nuevo:
type
TForm3 = class(TForm)
Informacin adicional
Para ms informacin, consulte forms en la ayuda de Delphi.
Mensajes de error
511
type
TStendahl = Object
RedAndBlack: TMemo;
published
Languages: Integer;
Solucin rpida
Cambie el tipo a una clase o borre la seccin Published.
type
TStendahl = class { hereda de TObject si no se especifica }
. . .
Informacin adicional
Para ms informacin, consulte class declarations en la ayuda de Delphi.
Solucin rpida
Cambie el tipo a una clase o borre la seccin Automated.
type
TModel = class { hereda de TObject si no se especifica }
. . .
Informacin adicional
Para ms informacion, consulte Automation en la ayuda de Delphi.
512
Solucin rpida
Elimine la cadena del registro o declrela como una cadena corta
explcitamente (declarndola como de tipo ShortString) o implcitamente
(proporcionndole una longitud, como String[20]). Por ejemplo, para solucionar
el problema de arriba, utilice esto:
type
TDateRec = File of record
FlowSnakes, Snirt: Integer;
Bouldershades: string[20];
end;
Informacin adicional
No se permite utilizar cadenas largas en un fichero de registros, debido a que
las propias cadenas (y no punteros a ellas) se debern almacenar en los registros, y en este caso el tamao del registro no podra ser determinado por
adelantado.
Solucin rpida
Utilice identificadores de tipo vlidos. A continuacin se muestran ejemplos de
declaraciones de un tipo de clase, un tipo enumerado y un tipo subrango:
{clase}
type
Mensajes de error
513
TForm1 = class(TForm)
. . .
{enumerado}
type
Cartwrights = (Dunn, Nelson, Owen, ShannonC, ShannonJ, StSure, Szajki);
{subrango}
type
Ratings = 1..4;
Informacin adicional
Este mensaje de error es normalmente el resultado de un error tipogrfico u
omisin.
Para evitar el error, debe teclear el segundo punto entre los lmites inferior y
superior del array (0 y 143 en el ejemplo):
type
gross = array[0..143] of integer;
Solucin rpida
Proporcione el segundo punto en la declaracin del tipo array, entre los lmites
inferior y superior del array.
Informacin adicional
As es como se declara y utiliza un array:
type
gross = array[0..143] of integer;
...
var
grody: gross;
...
grody[0] := StrToInt(Edit1.Text);
grody[1] := StrToInt(Edit2.Text);
...
514
Solucin rpida
Utilice el mismo tipo de datos para almacenamiento en disco y procesamiento
en memoria. Por ejemplo, si graba datos utilizando AsString, cree un tipo de
campo correspondiente de tipo String en el ClientDataSet.
Informacin adicional
TClientDataSet puede leer y escribir datos tanto en formato binario (.CDS)
como en XML.
Solucin rpida
Ejecute operaciones matemticas slo sobre campos numricos, por ejemplo:
SELECT AVG(Salary) FROM NFLQBacks
Mensajes de error
515
Informacin adicional
Para ms informacin, consulte types en la ayuda de Delphi.
Solucin rpida
Utilice nicamente tipos de automatizacin cuando haga llamadas de automatizacin OLE.
Informacin adicional
Todos los tipos de automatizacin OLE deben ser compatibles con Variant. Los
siguientes tipos de Delphi pueden ser utilizados en la automatizacin: Byte,
Currency, Double, IDispatch, Integer, IUnknown, OLEVariant, SmallInt,
Single, TDateTime, WideString, WordBool, SCode, TColor y TSafeArray.
516
Solucin rpida
1. Asegrese de utilizar condiciones Boolean donde el compilador espera un
valor que se evale a True/False. Por ejemplo, esto compilar:
if Form1.Name = 'Sake' then
Informacin adicional
Algunos lenguajes y entornos se refieren al tipo Boolean como Logical
(incluyendo Paradox).
Y tambin lo siguiente:
Huckleberry: String[3.14];
Solucin rpida
Si va a declarar implcitamente una cadena corta, proporcinele un valor
entero entre 1 y 255 (si quiere una cadena de longitud 1, no obstante, puede
utilizar en vez de String el tipo Char).
Informacin adicional
Para ms informacin, consulte integers en la ayuda de Delphi.
Mensajes de error
517
BirdDog := TypeInfo('yowza-bop');
Solucin rpida
Proporcione a la funcin TypeInfo solamente tipos que puedan ser utilizados en
las propiedades Published, como Integer, Extended, String, TMethod y
Variant.
Informacin adicional
Para ms informacin, consulte TypeInfo en la ayuda de Delphi.
Solucin rpida
Haga virtual como mnimo un mtodo de la clase. Por ejemplo, podra aadir la
directiva Virtual a un mtodo existente, o aadir un mtodo virtual sin sentido
para que una VMT sea creada y TypeOf est disponible.
Informacin adicional
VMT significa virtual method table. Para ms informacin, consulte virtual
method table y dynamic methods en la ayuda de Delphi.
518
Solucin rpida
1. Compruebe que todos los parmetros que pasa son del mismo tipo de datos
que el parmetro formal correspondiente del procedimiento o funcin.
2. Sustituya Integer por DWord:
function WinExecAndWait32(FileName: String;
Visibility : Integer; DoWait : Boolean): DWord;
Informacin adicional
1. Si el parmetro formal no es un parmetro Var, el mensaje de error es
Incompatible Types: <> and <>. En el caso de arriba, el mensaje
exacto sera: Incompatible Types: Variant and TQuery.
Mensajes de error
519
Solucin rpida
Asigne una sentencia SQL a la propiedad SQL, bien en tiempo de diseo en el
Inspector de Objetos, o en tiempo de ejecucin, antes de activar el componente
TSQLQuery.
Informacin adicional
Los componentes DBExpress aparecieron por primera vez en Delphi 6.
Solucin rpida
Sustituya los archivos que faltan.
Informacin adicional
Delphi almacena los proyectos del Almacn de Objetos en el directorio
\DelphiX\Objrepos.
520
Solucin rpida
Aada los elementos necesarios a la lista de cadenas antes de intentar acceder
al correspondiente ndice. Por ejemplo:
ListBox1.Items.Add('AWopBopALooBopALopBamBoom');
ListBox1.Items.Insert('SuperCalifragilisticexpealidocious');
ListBox1.Items.Add('Antidisestablishmentarianism');
ListBox1.Items.Insert('deoxyribonucleic acid');
Informacin adicional
Las listas de cadenas son utilizadas internamente por muchas clases y
controles de Delphi.
Solucin rpida
Si no instal InterBase cuando instal Delphi, instale la versin local de InterBase que viene con Delphi desde el CD-ROM.
Informacin adicional
Para ms informacin, consulte la documentacin de InterBase que recibi con
Delphi.
Solucin rpida
Abra DELPHI.INI (situado por defecto en el directorio de Windows) y aada o
modifique la entrada ReportSmith para que refleje la ubicacin actual de
ReportSmith. Por defecto, la entrada ser:
[ReportSmith]
ExePath=C:\RPTSMITH
Mensajes de error
521
Informacin adicional
Delphi 1 contiene ReportSmith. Delphi 2 contiene ReportSmith y Quick
Reports (aunque ReportSmith estaba en cierto modo escondido). Delphi 3 y
superiores incluyen solamente QuickReports. Por supuesto, usted no est limitado a utilizar una de esas dos herramientas de generacin de informes. Puede
utilizar otras herramientas, como ReportBuilder, Crystal Reports, o incluso
crear sus informes personalizados sin utilizar un motor de informes.
522
11. Puede haber intentado asignar un valor a una variable Result en un procedimiento. Esta variable est implcitamente disponible slo en las
funciones.
12. Puede estar haciendo una referencia a un miembro de un tipo Set o
enumerado en el cdigo, como por ejemplo:
Mensajes de error
523
if IncludeArchiveFiles then
frmZipster.lstbxROFiles.FileType :=
frmZipster.lstbxROFiles.FileType + [ftArchive] // problema
else
. . .
Solucin rpida
1. Compruebe que cualquier variable a la que est haciendo una asignacin
est declarada y en mbito. Si se trata de una variable global, declrela en
la parte Interface de la unidad o en una unidad Globals destinada expresamente a las variables a las que quiera hacer referencia desde varias
unidades. Si se supone que la variable es local, compruebe que la ha
declarado. Si el identificador es un procedimiento o funcin, verifique que
la unidad que lo contiene est incluida en la seccin Uses (de la parte
Interface o Implementation).
2. Asigne a las variables o propiedades valores que sean del tipo apropiado.
3. Borre el nombre de la clase del mtodo en la seccin Interface. Ya es asignado implcitamente.
4. Verifique que ha escrito bien el identificador en su declaracin y definicin,
as como en cualquier asignacin relacionada con l.
5. Aada la unidad necesaria a la seccin Uses. Para determinar qu unidad
necesita aadir cuando llama un procedimiento o funcin de Object Pascal,
busque el procedimiento o funcin en la ayuda de Delphi y vea en qu
unidad est definido (y luego adala a la seccin Uses).
6. Revierta la declaracin del tipo a su estado anterior.
7. No intente llamar a un mtodo declarado en la seccin Private de otra
clase. No intente acceder directamente a un campo declarado en la seccin
Private de otra clase. Acceda al valor, si es posible, a travs de la
propiedad Public o Published asociada al campo privado. Por ejemplo, la
clase TSpeedButton, declarada en BUTTONS.PAS, contiene lo siguiente:
private
. . .
FFlat: Boolean;
published
. . .
property Flat: Boolean read Fflat
write SetFlat default False;
Puede acceder indirectamente al campo privado FFlat asignndolo o leyndolo desde la propiedad Flat, pero no puede leer o escribir directamente en
el campo FFlat. Dependiendo de su punto de vista, puede considerar esto
mejor o peor.
8. No llame a Free para instancias de interfaces.
524
Informacin adicional
5. En Delphi 6, los procedimientos y funciones que dan soporte al tipo
Variant, incluyendo los procedimientos y funciones que manipulan arrays
variantes, como VarArrayCreate y VarArrayOf, han sido movidos de
SYSTEM.PAS a VARIANTS.PAS. Si porta una aplicacin que utiliza
variantes de una versin anterior de Delphi a Delphi 6 o superior,
necesitar aadir Variants a la clusula Uses. Consulte VARUTILS.PAS,
que utiliza Variants, para ver la implementacin especfica (en dependencia de la plataforma bajo la cual est desarrollando).
En Delphi 6, TModalResult ha sido movido de FORMS.PAS a
CONTROLS.PAS. Cuando porte una aplicacin de una versin anterior de
Delphi a Delphi 6 o superior, puede que necesite aadir Controls a la clusula Uses (preferiblemente a la clusula Uses de la seccin
Implementation) si recibe este mensaje de error debido a que no se ha
encontrado TModalResult.
Mensajes de error
7.
8.
9.
12.
525
Solucin rpida
Aada Variants a la clusula Uses de la parte Implementation, o si es
necesario, a la clusula Uses de la parte Interface.
526
Informacin adicional
Puede obtener este mensaje de error cuando recompile en Delphi 6 una aplicacin que compila correctamente en versiones anteriores de Delphi. La declaracin de EmptyParam ha sido movida a la unidad Variants (Variants ha
experimentado extraordinarias mejoras, no solamente relacionadas con COM).
Solucin rpida
Rehabilite la sintaxis extendida (est habilitada por defecto) marcando la casilla Compiler | Syntax Options | Extended Syntax o introduciendo la
directiva {$X+} o {$EXTENDEDSYNTAX ON}.
Informacin adicional
Para ms informacin, consulte Extended Syntax y Result variable en la
ayuda de Delphi.
Mensajes de error
527
Solucin rpida
Proporcione el elemento que falta en la sentencia, por ejemplo, el nombre de la
columna primaria:
ALTER TABLE Placemats
ADD CONSTRAINT pkSlogan PRIMARY KEY (Slogan)
Informacin adicional
No imponga una restriccin de clave primaria sobre una columna que pueda
ser nula. Una clave primaria debe contener valores nicos, y por lo tanto podr
contener a lo sumo un valor nulo.
Solucin rpida
1. Renombre la unidad.
2. Escoja una de las siguientes soluciones:
a. Si es posible, localice la primera unidad mencionada en el mensaje de
error, muvala al mismo directorio en el que reside el archivo de
unidad compilada correspondiente (.DCU) y recompile.
b. Utilice una versin anterior de la segunda unidad mencionada en el
mensaje de error (una que sea anterior a la modificacin).
Informacin adicional
1. Adopte un convenio de nombres que haga difcil que se produzcan colisiones de nombres. Por ejemplo, si su nombre es Rupert Pupkin, puede aadir
rp a los nombres de sus unidades, como rpMain, rpGlobal, etc.
2. Es altamente recomendable que no cambie el contenido de la seccin
Interface del cdigo fuente de Delphi. Es altamente recomendable que
tampoco cambie la seccin Implementation del cdigo fuente de Delphi. Si
sabe lo que est haciendo (es decir, si cree que sabe ms que el equipo de
desarrollo de Delphi, y no puede esperar a un parche), hgalo a su propio
528
Solucin rpida
Borre los archivos .DCU y recompile.
Informacin adicional
El mensaje de error puede mostrar una lnea del archivo de proyecto (.DPR).
Solucin rpida
Cambie los nombres de las unidades seleccionando File | Save (si se llama
actualmente Unit1) o File | Save As.
Informacin adicional
Al cambiar indirectamente el nombre de la unidad (cambindolo a travs de
File | Save [As] en lugar modificar el antiguo nombre en el cdigo), Delphi
tambin cambiar el nombre del archivo, manteniendo la sincronizacin.
Por supuesto, si cambia el nombre de la unidad a travs de File | Save [As]
despus de haber aadido la unidad a la clusula Uses de otras unidades, tendr que actualizar stas.
Mensajes de error
529
Solucin rpida
1. Utilice nombres nicos para sus unidades; trate de establecer un convenio
de nombres que garantice la unicidad, como anteponer o aadir sus
iniciales, las iniciales de la compaa, etc.
2. No modifique el cdigo fuente de la VCL a menos que tenga una muy
buena razn para hacerlo, y est dispuesto a proporcionar su propio soporte
tcnico a partir de ese momento.
Informacin adicional
1. El compilador no le impedir que nombre a su unidad de la misma forma
que una ya existente, por ejemplo, Buttons.
2. El cdigo fuente de la VCL est destinado principalmente para referencia;
no es recomendable modificarlo.
Unknown Column
Consulte Unknown SQL Error.
Unknown database
Posible causa de error
1. Puede haber especificado un alias de base de datos o una ruta para la
propiedad DatabaseName de un componente TDatabase o de un TDataset
(TTable, TQuery, o TStoredProc en todas las versiones de Delphi;
TClientDataset en las versiones 3 y superiores de Delphi Cliente/Servidor;
TNestedTable en Delphi 4 y superiores) que no ha sido reconocido.
2. Puede haber intentado asignar el valor True a la propiedad Connected de
un componente TDatabase sin proporcionar un valor para la propiedad
AliasName.
3. El archivo de configuracin del BDE (IDAPI32.CFG en Delphi de 32 bits,
IDAPI.CFG en Delphi 1) puede haber sido movido o borrado.
Solucin rpida
1. Si proporciona una ruta para esta propiedad, la ruta debera ser
plenamente cualificada* y la base de datos utilizada debe ser Paradox o
dBASE. Si la propiedad DatabaseName corresponde a un alias, asegrese
de que el alias haya sido configurado apropiadamente.
530
Informacin adicional
1. * Plenamente cualificada significa que el nombre de ruta es explcito o
absoluto (a diferencia de un nombre de ruta relativo). Borland\Delphi 3 es
un ejemplo de un nombre de ruta relativa. C:\No\Evel\Hear\No\Knevel
es un ejemplo de ruta absoluta.
Para crear un alias del BDE, siga estos pasos:
a. Seleccione Database | Explore.
b. En SQL Explorer/Database Explorer, seleccione Object | New.
c. Seleccione el tipo de controlador deseado en el cuadro de combinacin
(seleccione Standard si est trabajando con tablas Paradox o dBASE)
y pulse el botn OK.
d. El nuevo alias se mostrar en el panel izquierdo de la pgina Database
con un nombre por defecto, como Standard1.
e. Pulse con el botn derecho sobre el nuevo alias, seleccione Rename del
men de contexto, e introduzca el nombre que desee darle al alias.
f. En la pgina Definition del panel derecho, seleccione el controlador
apropiado en el cuadro de combinacin Default Driver.
g. Introduzca la ruta a la base de datos en el cuadro de edicin Path.
h. Seleccione Object | Exit, y luego Yes para grabar los cambios que
haya hecho.
3. La ubicacin por defecto para el archivo de configuracin del motor
(IDAPI32.CFG) es:
C:\Archivos de programa\Borland\Common files\BDE
Para verificar el valor que indica el Registro del sistema para la ubicacin
de IDAPI32.CFG, siga estos pasos:
a. Seleccione Inicio | Ejecutar.
b. Introduzca regedit en el cuadro de combinacin Abrir y pulse el botn
OK (o presione la tecla Enter).
c. Navegue hasta
HKEY_LOCAL_MACHINE\Software\Borland\Database Engine.
El dato CONFIGFILE01 mostrar la ruta donde est ubicado el archivo de
configuracin. Si difiere de la ubicacin de su copia de IDAPI32.CFG, mueva el
archivo a la localizacin apuntada por la configuracin del Registro (lo ms
recomendable), o modifique la configuracin del Registro para que apunte a la
localizacin actual del archivo.
Mensajes de error
531
Solucin rpida
1. Asegrese de que la sintaxis que est utilizando es correcta y que lo que
est tratando de hacer es aceptable para el compilador de Delphi.
2. Declare todos los mtodos Virtual, Dynamic, Abstract u Overload dentro de
la declaracin de un tipo de clase.
532
Informacin adicional
2. Para que sean de utilidad, los mtodos virtuales, dinmicos o abstractos
deben ser miembros de una clase, de modo que otra clase puede heredar de
sta y redefinir los mtodos. Los mtodos virtuales incluyen la directiva
Virtual; los mtodos dinmicos - la directiva Dynamic; y los mtodos
abstractos - la directiva Virtual o Dynamic seguida de la directiva
Abstract. Los mtodos sobrecargados aaden la palabra reservada
Overload a su declaracin.
3. Puede utilizar los mensajes de Windows como una herramienta de
depuracin o de educacin. Por ejemplo, para determinar con qu
frecuencia y cundo su programa recibe el mensaje WM_ACTIVATE de
Windows, declare este procedimiento:
procedure wmactivate(var Message: TMessage); message WM_ACTIVATE;
Mensajes de error
533
Por supuesto, puede hacer esto para tantos mensajes de Windows como
desee (busque WM_ en la ayuda de Delphi para ver una lista de mensajes
de Windows), y es an ms fcil crear un registro de mensajes parecido
para los gestores de eventos de su aplicacin. Simplemente pulse dos veces
sobre el evento de su inters en la pgina Events para cualquiera de los
formularios o componentes e introduzca una sentencia Writeln similar a la
mostrada arriba. Por ejemplo, se podra rastrear el evento OnPaint de un
formulario as:
procedure TForm1.FormPaint(Sender: TObject);
begin
Writeln(tf,'Se ha disparado el evento Paint');
end;
Solucin rpida
Coloque la directiva Override solamente en la seccin Interface.
Informacin adicional
Para que sea posible redefinir un mtodo, el mtodo debe haber sido declarado
como virtual en la clase base.
Unknown Identifier
Posible causa de error
Puede estar haciendo referencia a algo que est declarado en una unidad que
no ha sido aadida a la clusula Uses de su unidad.
Solucin rpida
Determine la unidad que falta basndose en el identificador con el que el compilador est tropezando. Si es un identificador de Delphi, puede hacer esto
colocando el cursor sobre el identificador y pulsando la tecla F1. La pantalla de
ayuda relativa al identificador mostrar la unidad en la que ste est declarado. Si el identificador no es un identificador de Delphi, es de un tercero o
suyo propio. En cualquier caso, una vez determine la unidad en la que el identificador est declarado, aada esta unidad a su clusula Uses.
534
Informacin adicional
Puede utilizar otra unidad aadindola a la clusula Uses en la parte Interface
(creada automticamente por Delphi e inicialmente poblada con muchas
unidades estndar), o aadiendo su propia clusula Uses directamente bajo la
palabra reservada Implementation.
Solucin rpida
1. Solamente cargue archivos de los tipos apropiados dentro de la propiedad
Picture de TImage.
2. Incluya explcitamente siempre la extensin del archivo grfico (.BMP,
.ICO, .WMF o .EMF).
Informacin adicional
Debe especificar archivos de imgenes en alguno de los formatos grficos
reconocidos por Delphi. Por ejemplo, cualquiera de los siguientes son vlidos:
Image1.Picture.LoadFromFile('C:\VG\WheatFieldWithCrows.BMP');
Image2.Picture.LoadFromFile('C:\VG\TheStarryNight.ICO');
Image3.Picture.LoadFromFile('C:\VG\SelfPortraitWithHat.WMF');
Image4.Picture.LoadFromFile('C:\VG\ThePotatoEaters.EMF');
Mensajes de error
535
Solucin rpida
Asigne False a ENABLE SCHEMA CACHE con la utilidad BDE Configuration
antes de hacer cualquier cambio en la estructura de las tablas de la base de
datos.
Pulse el botn Help en la utilidad BDE Configuration para informacin especfica sobre estos parmetros para el controlador que est utilizando.
Informacin adicional
Si el esquema est en cach (ENABLE SCHEMA CACHE tiene asignado
True), los cambios hechos al esquema de base de datos durante el tiempo de
ejecucin no sern reconocidos por el BDE. El esquema de la base de datos
debe permanecer esttico si desea tener la cach de esquemas en True. Adems de la opcin ENABLE SCHEMA CACHE, para las bases de datos de servidor SQL (como InterBase, MS SQL Server, Sybase, Oracle, etc.) tambin
existen los parmetros SCHEMA CACHE DIR, SCHEMA CACHE SIZE y
SCHEMA CACHE TIME en la pgina/nodo Driver de la utilidad BDE
Configuration.
Solucin rpida
Proporcione la contrasea correcta en el cuadro de dilogo Database Login y
pulse el botn OK.
Informacin adicional
Puede evitar tener que introducir continuamente una contrasea mientras est
desarrollando su aplicacin configurando la contrasea en el cdigo o a travs
de la seccin Parameter Overrides del componente TDatabase.
Para asignar la contrasea en el cdigo, aada una lnea como la siguiente en
algn punto del cdigo antes de intentar acceder a la base de datos (por
ejemplo, en el evento OnCreate del formulario):
536
Solucin rpida
Elimine el argumento con nombre:
procedure BackwardsCoding;
var
v: Variant;
begin
v.Tail('Cartwrights', 'Beech');
Mensajes de error
537
var
v: Variant;
begin
v.Tail('Beech', Bonanza := 'Cartwrights');
Informacin adicional
Para ms informacin, consulte named parameters en la ayuda de Delphi.
Solucin rpida
Verifique que los parmetros que haya introducido estn exactamente como
son requeridos. En el ejemplo de arriba, es necesario que sea aadido un guin
bajo al parmetro user_name:
user_name=SYSDBA
password=masterkey
Informacin adicional
Durante el desarrollo, es conveniente asignar False a la propiedad Login de
IBDatabase, y proporcionar la informacin necesaria (nombre de usuario y
contrasea) en la propiedad Params. Antes de distribuir, sin embargo, puede
encontrar conveniente forzar al usuario a introducir sus datos para acceder a
la base de datos (dependiendo, por supuesto, del tipo de aplicacin/datos que
est manejando). En ese caso, es recomendable cambiar el nombre de usuario y
la contrasea a otros que no sean sus valores por defecto SYSDBA y
masterkey.
538
Solucin rpida
1. Defina el procedimiento o funcin declarado en la parte Interface de la
unidad en la parte Implementation de la unidad.
2. Aadir la palabra reservada External.
Informacin adicional
Declarar un mtodo en la seccin Interface equivale a prometer que se proporcionar el resto de la informacin ms adelante (en la seccin Implementation
que sigue). Debe cumplir su promesa hacindolo.
Solucin rpida
Cargue el archivo .DCR en el Image Editor de cualquier versin de 32 bits de
Delphi y gurdelo (ser grabado en formato de 32 bits). Intente de nuevo instalar el componente.
Informacin adicional
Puede necesitar editar el archivo .DCR en el Image Editor para que el cambio
a 32 bits tenga efecto. Por ejemplo, puede cambiar un pxel, deshacer el cambio
(pulsando Ctrl+Z), y luego guardarlo.
Mensajes de error
539
Unterminated string
Posible causa de error
1. Puede haber olvidado el apstrofe (comilla simple) de cierre al final de una
cadena.
2. Puede haber partido una cadena en varias lneas en el editor de cdigo de
Delphi, pero olvid terminar cada lnea con un apstrofe.
Solucin rpida
1. Incluya un apstrofe al final de cada cadena.
2. Incluya un apstrofe al final de cada lnea en una cadena multilnea.
Informacin adicional
Para partir una cadena en varias lneas, utilice el operador + para concatenar
las lneas. He aqu un ejemplo:
s := 'Das fesche Umherstolzieren des Hahns '
+ 'ist ein bekannter Anblick.'
+ 'Was fehlt dir, mein Junge?';
Solucin rpida
Verifique que haya una coma entre todas las unidades que aparecen
referenciadas en la clusula Uses y un punto y coma al final.
Informacin adicional
En Delphi 1, puede tambin obtener este mensaje de error si no tiene una clusula Uses en un archivo de biblioteca (.DLL).
540
Solucin rpida
Asegrese de que la columna siempre tenga un valor, o elimine la restriccin
NOT NULL para esa columna. Si opta por lo primero, puede seguir este
patrn:
SQL.Add('INSERT INTO LIABILITY (');
SQL.Add('AGENCY_ID,EMPLOYER_ID,TAX_CODE,PAYROLL_DATE,
+ LIABILITY_AMOUNT,DUE_DATE)');
SQL.Add('VALUES (');
SQL.Add(':AgencyID,:EmployerID,:TaxCode,:PayrollDate,
+ :LiabilityAmount,:DueDate)');
Params.ParamByName('AgencyID').AsString := AAgencyID;
Params.ParamByName('EmployerID').AsString := AEmployerID;
Params.ParamByName('TaxCode').AsString := ATaxCode;
Params.ParamByName('PayrollDate').Adate := APayrollDate;
Params.ParamByName('LiabilityAmount').AsCurrency :=
ALiabilityAmount;
Params.ParamByName('DueDate').Adate := dDueDate;
. . .
Informacin adicional
Esto puede pasar fcilmente cuando modifica las estructuras de las tablas
despus que el cdigo ha sido escrito. Hasta donde sea posible, evite cambiar
las estructuras de las tablas, realizando un anlisis y diseo exhaustivos antes
de iniciar la codificacin.
Mensajes de error
541
Solucin rpida
Desactive la opcin de optimizacin del compilador, aadiendo una de las
siguientes directivas:
{$O-}
{$OPTIMIZATION OFF}
Informacin adicional
Para ms informacin, consulte optimization en la ayuda de Delphi.
Solucin rpida
Borre la directiva Absolute.
Informacin adicional
Delphi para Linux (conocido como Kylix) ha hecho que este cambio sea
necesario, ya que no se pueden declarar variables con direcciones absolutas en
Linux, porque esto no es soportado por el formato PIC (Position-Independent
Code). C++ Builder tambin tiene sus efectos sobre Delphi. Por ejemplo, la
palabra reservada Register es la nica sensible a maysculas/minsculas en
Delphi. Esto fue hecho para permitir la utilizacin de los componentes VCL de
Delphi en C++ Builder. C++ distingue entre maysculas y minsculas, y
register (el convenio de llamada) no es lo mismo que Register (el nombre del
mtodo utilizado para la instalacin de componentes en la Paleta de
Componentes).
542
Variable required
Posible causa de error
Puede estar intentando pasar un array a un procedimiento o funcin, pero ha
olvidado encerrar el array entre corchetes. Por ejemplo, lo siguiente generar
este mensaje de error:
procedure MeinVaterWarEinWandersmann(Sender: TObject);
procedure LiliMarlene(fournums: array of integer);
begin
. . .
end;
begin
LiliMarlene(StrToInt(Edit1.Text),
StrToInt(Edit2.Text),
StrToInt(Edit3.Text));
end;
Solucin rpida
Encierre el array entre corchetes:
. . .
LiliMarlene([StrToInt(Edit1.Text),
StrToInt(Edit2.Text),
StrToInt(Edit3.Text)]);
Informacin adicional
Delphi 4 introdujo los arrays dinmicos.
Mensajes de error
543
begin
xl.Workbooks.Add;
SetColumnTitles;
xl.Visible := True;
end;
Solucin rpida
Aada la llamada a CreateOLEObject, asignando el objeto de automatizacin a
la variable OLEVariant antes de llamar a sus mtodos:
procedure TForm1.Button1Click(Sender: TObject);
var
xl: OleVariant;
procedure SetColumnTitles;
begin
xl.Cells[1,1].Value := 'ORDER NUM';
xl.Cells[1,2].Value := 'VENDOR';
end;
begin
xl := CreateOLEObject('Excel.Application'); // Necesario!
xl.Workbooks.Add;
SetColumnTitles;
xl.Visible := True;
end;
Informacin adicional
Consulte Variant does not reference an OLE object en este libro.
Solucin rpida
Registre el objeto OLE en todas las mquinas en las que se haga referencia a
l. Consulte Class not registered para informacin ms especfica.
Informacin adicional
Consulte Variant does not reference an automation object en este libro
y Variant types en la ayuda de Delphi para ms informacin.
544
Variant error
Posible causa de error
Debe estar llamando al mtodo ExecSQL de un objeto TQuery en lugar de su
mtodo Open, cuando un conjunto resultado debera estar a disposicin.
Solucin rpida
Llame siempre a Open en el caso de sentencias SELECT (que, al menos en
teora, devuelven un conjunto resultado). Llame a ExecSQL en el caso de las
sentencias que manipulan los datos (INSERT, UPDATE y DELETE).
Informacin adicional
Si est trabajando con bases de datos SQL (a diferencia de las bases de datos
de escritorio como Paradox o Access), estudie el componente TStoredProc.
Solucin rpida
No intente acceder a travs de un ndice a un Variant al que se haya asignado
un valor de cadena.
Informacin adicional
Para ms informacin, consulte VarArrayCreate y VarIsArray en la ayuda
de Delphi.
Mensajes de error
545
Solucin rpida
Determine qu versin de ORA*.DLL est instalada en la mquina. Utilizando
la utilidad de Administracin/Configuracin del BDE, introduzca el nombre de
este archivo en el parmetro Vendor Init. Este archivo debera estar situado en
el subdirectorio \BIN del directorio de Oracle, por ejemplo
C:\ORAWIN95\BIN.
Informacin adicional
Consulte la documentacin de Oracle para ms informacin sobre las .DLLs
requeridas para su versin de Oracle.
Solucin rpida
1. Actualcese a Delphi 5 o una versin superior, o al menos aplique el
Update Pack 3 de Delphi 4. Si no puede hacerlo, o por alguna razn no lo
desea, utilice la solucin alternativa del problema que se describe en el
documento http://www.pbe.com/kudzu/Delphi/FAQ/402SConnect.html.
2. Verifique la direccin IP correcta de la mquina del servidor, e introduzca
ese valor en la propiedad Address del objeto TClientSocket.
Informacin adicional
2. La propiedad Address especifica la direccin IP del servidor con el que se
est intentando conectar.
546
Solucin rpida
Ejecute el programa Scktsrvr (SCKTSRVR.EXE) en la mquina del servidor de
aplicacin. Este programa se encuentra por defecto en C:\Archivos de
programa\Borland\Delphi X\Bin.
Informacin adicional
Consulte MIDAS en la ayuda de Delphi para ms informacin.
Solucin rpida
Borre los archivos innecesarios de la unidad e intntelo de nuevo. Por ejemplo,
los documentos grandes y archivos grficos que no se necesiten pueden ser
copiados a un dispositivo independiente y luego borrados.
Informacin adicional
Utilice peridicamente la utilidad de defragmentacin de Windows para
reorganizar el disco duro. Esto mejorar el rendimiento, ya que los archivos
utilizarn menos reas separadas (o preferiblemente un rea contigua) en vez
de estar esparcidos por todo el disco duro.
Mensajes de error
547
Solucin rpida
Pulse OK para cerrar el proyecto actual, abra un nuevo proyecto ActiveX
Library, y aada el elemento que haba seleccionado.
Informacin adicional
Consulte ActiveX applications en la ayuda de Delphi para ms informacin.
Solucin rpida
Borre primero el valor de la columna Size, y luego cambie el tipo de datos en la
columna Type.
Informacin adicional
Algunos tipos de datos requieren un valor de tamao, otros permiten un valor
de tamao que no es obligatorio, y otros no permiten un valor de tamao.
Consulte Paradox field types and sizes en la ayuda en lnea del Database
Desktop para ms informacin.
You must open a project before you can add an Automation Object
Posible causa de error
Puede haber intentado crear un objeto de automatizacin sin tener un proyecto
abierto. Por ejemplo, puede haber seleccionado File| New..., y luego haber
seleccionado Remote Data Module en la pgina New.
Solucin rpida
Abra un proyecto existente o cree un nuevo proyecto antes de intentar aadir
un objeto de automatizacin.
548
Informacin Adicional
Una vez que el proyecto est abierto, se puede crear un nuevo objeto de automatizacin seleccionando File | New. . . , pulsando la pestaa ActiveX, y
entonces pulsando dos veces sobre el icono Automation object.
Solucin rpida
Seleccione un nombre de componente en el cuadro de combinacin VCL Class
Name o teclee uno.
Informacin adicional
Para crear un control ActiveX utilizando el Asistente de Controles ActiveX, se
debe partir de un componente de Delphi y entonces convertirlo en un control
ActiveX.
De esta manera se podrn utilizar los componentes de Delphi en otros entornos
que soporten controles ActiveX, como C++ Builder, Visual Basic, PowerBuilder,
etc.
Solucin rpida
1. Actualcese a la versin Cliente/Servidor o utilice tablas Paradox, dBASE u
ODBC.
2. Actualcese a Delphi Profesional o utilice tablas Paradox o dBASE.
Mensajes de error
549
Informacin adicional
Consulte Application is not licensed to use this feature.
Your username and password are not defined. Ask your database
administrator to set up an InterBase login
Posible causa de error
Puede haber intentado activar un componente IBDatabase cuando la propiedad
Login tena el valor False, pero la propiedad Params no contena el nombre de
usuario y la contrasea necesarias.
Solucin rpida
Aada el nombre de usuario y la contrasea a la propiedad Params, o cambie
el valor de la propiedad Login a True en tiempo de ejecucin, y entonces suministre los valores adecuados.
Informacin adicional
Durante el desarrollo, es conveniente asignar el valor False a la propiedad
Login del componente IBDatabase, y suministrar la informacin necesaria
(nombre de usuario y contrasea) en la propiedad Params. Sin embargo, despus de la implantacin puede ser conveniente forzar al usuario a introducir su
nombre y contrasea para acceder a la base de datos (dependiendo, por
supuesto, del tipo de aplicacin o datos de que se trate). En este caso, es
recomendable cambiar los valores de usuario y contrasea por defecto,
SYSDBA y masterkey.
550
Indice
Si est buscando un mensaje de error especfico, consulte la Tabla de Contenido. All se
listan los mensajes de error alfabticamente, y por esa razn no son reproducidos aqu.
Readln, 293
$2108, 51
$2109, 51
$220B, 159
$2501, 62
$2B05, 229
$2C08, 51
$2C09, 51
$3E06, 102
$DENYPACKAGEUNIT, 2
$DESIGNONLY, 2
$ENDIF, 381
$IFDEF, 381
$IFNDEF, 381
$IFOPT, 381
$L, 60
$LINK, 60
$R *.DFM, 215
$RUNONLY, 2
$WEAKPACKAGEUNIT, 4
.BMP, 63
.BPL, 38 ,74
.DCR, 80 ,188
.DCU, 61 ,235 ,266 ,424
.DFM, 11 ,34 ,108 ,128 ,201 ,214 ,215 ,223 ,225
,231 ,234 ,344 ,443 ,470
.DLL, 33 ,37 ,75 ,89 ,119 ,225 ,439 ,491 ,492 ,538
,539 ,545
.DOF, 386
.DPK, 264
.DPL, 74
.DPR, 26 ,109 ,457
.DSK, 234 ,386
.DSM, 234
.EMF, 64
.ICO, 64
.INI, 244
.LCK, 365
.mb, 405
.MB, 156
.MDX, 313
.OBJ, 27 ,60
.OPT, 387
.PAS, 25 ,34 ,119 ,201 ,214 ,234 ,254
.PX, 155 ,309 ,311 ,405
.RES, 198 ,215 ,227 ,458
.VAL , 155 ,450
.WMF, 534
10014, 545
10022, 545
10049, 545
25, 175
800A03EC, 410
Abort, 469
Absolute, 458 ,501
abstractas, clases, 149
abstractos, mtodos, 44 ,149 ,498
Access, (Microsoft Access), 250
Active, 106 ,110
ActiveControl, 93
ActiveForms, 89 ,216 ,235
ActiveX
Asistente, 13 ,37 ,548
biblioteca, 88 ,134 ,547
controles, 29 ,37 ,89 ,133 ,162 ,216 ,235 ,548
Add, 41
AddIndex, 9 ,252
AddIndexDef, 398
address, 393
ADO, 473
ADO Express, 143
Alias, 104
alias del BDE, 159 ,503 ,530
Apache, 416
API, xxxiv
Append, 264 ,503
ApplyUpdates, 120 ,364
arrays, 392 ,446 ,524
Assert, 55
AssignFile, 264
AsyncPro, 412
AUTOEXEC.BAT, 462
Autoincrement, campos, 314 ,315
automatizacin, 341
AutoSessionName, 78 ,89 ,90 ,106 ,114 ,199 ,233
,279 ,391 ,461
Available Forms, 48
BDE, 1
BDE Administracin/configuracin, 186
BDEProv, 399
BLOB SIZE, 329
Boolean, 9 ,516
Break, 67
Break on Exceptions, 239 ,440
ii
CLX, 541
CoClass, 28 ,482
Code Insight, 137
CoInitialize, 138
COM, xxxiv ,29 ,138
CommandText, 142
Commit, 401
CommitUpdates, 364
compilacin condicional, 381
Componentes
eliminacin, 36 ,51 ,231
instalacin, 28 ,231
CONFIG.SYS, 404
ConfigFile01, 100
CONFIGFILE01, 91 ,161
connect, 83
Connect, 460
Connected, 111 ,112 ,133 ,168 ,173 ,393
Connection, 379
ConnectionString, 22 ,379
ConnectType, 173
Const, 241
ConstraintErrorMessage, 42
constructores, 150
Contains, 151
Continue, 67
contrasea, 83 ,164 ,167 ,319 ,535
conversiones, 347
convert (utilidad), 224
CoUninitialize, 138
CREATE INDEX, 227
CreateDataSet, 396
CreateOLEObject, 212 ,543
CustomConstraint, 42
EditMask, 40
EmptyTable, 115
ENABLE SCHEMA CACHE, 535
EncodeDate, 327
EncodeTime, 327
End, 209 ,483
Entrada/Salida, error 100, 189
Entrada/Salida, error 101, 190
Entrada/Salida, error 102, 265
Entrada/Salida, error 105, 272
Erase, 264
error, 205 ,272
Error, 204
Error de Proteccin General, 45
Excel, 374 ,410
excepciones, 457
Except, 210
Exclusive, 264
ExecSQL, 85 ,219 ,362 ,544
Exit, 68
Exports, 240 ,439
Fail, 437
FetchAll, 141
ficheros
conversin, 224
localizacin, 85
nombrado, 60
FieldDefs, 396
FieldKind, 258 ,261
Fields Editor, 172 ,379
File of Record, 512
FillChar, 49
filtros, 415 ,452
Finalization, 176
Finally, 237
FindKey, 258 ,361 ,397
FindNearest, 258
FixedCols, 273
FixedRows, 274
For , 56
format, 58 ,60 ,393
formularios
creacin, 45 ,71 ,78 ,105
herencia, 220
visualizacin, 221
Halt, 67
HandleShared, 233 ,390
High, 284
Host, 393
ibinstall.dll, 321
IBX, 170 ,395
icono, 493
iconos, 80
IDAPI.CFG, 91 ,121 ,160
IDAPI.DLL, 100
iii
IDAPI01.DLL, 102
IDAPI32.CFG, 91 ,121 ,160 ,186
IDAPI32.DLL, 2 ,51 ,101 ,103
IDataBroker, 157 ,158
identificadores, 289
IDPROV32.DLL, 98
Image Editor, 494
Implementation, 294
Implements, 295
ImportedConstraint, 42
Inc , 358
Index, 227 ,257 ,282 ,307
IndexField, 247
IndexFieldNames, 9 ,155 ,247 ,397
IndexName, 9 ,155 ,245 ,248 ,308 ,309 ,397
ndices, 475
crear por cdigo, 310
mantenidos, 310 ,312
primarios, 408
secundarios, 408
Indy, 412 ,465
Initialization, 11 ,15 ,62 ,176 ,523
InstallShield Express, 1 ,38 ,100 ,323
InterBase, 73 ,104 ,169 ,170 ,321 ,520
InterBase 6, 73 ,321 ,467
InterBase Express, 110 ,143 ,380 ,508
Interface, 7 ,235 ,321
interfaces, 7
Internet Direct -Indy, 412
Is, 347
IsValidDateMonthWeek, 26
IUnknown, 177
KeepConnection, 112
KeyPress, 19 ,21 ,499
Kylix, 412 ,541
L1086, 324
L1317, 324
L721, 324
Label, 354
Last, 141
Length, 208
Library Path, 60 ,151 ,456
LoadFromFile, 86
LoadLibrary, 230 ,240
Local Share, 317 ,364
Locate, 397
iv
MasterFields, 488
MasterSource, 126 ,488
MAXQUERYTIME, 467
MaxValue, 23 ,371
MDI, 87
formularios, 398
hijos, 398
memoria, 77
liberacin, 342
limitaciones, 422
metaarchivos, 136 ,207 ,371
mtodos abstractos, 44 ,149 ,498
Microsoft Access, 250
Microsoft Excel, 374 ,410
MIDAS, 113 ,170 ,173 ,399 ,414 ,460
MIDAS.DLL, 416
MinValue, 23 ,377
Miser, Dan, 250 ,432
MTS, 377
multi-hilos, 106 ,199 ,236 ,391 ,461 ,477
MultiSelect, 312
Name , 460
NetDir, 171
configuracin, 185
New, 392
Nodefault, 255 ,402
NOT NULL, 540
Null, 237
Object Pascal
directivas, 11
palabras reservadas, 11
tipos ordinales, 421
ODBC, 361 ,365 ,452 ,548
OldCreateOrder, 232 ,242 ,443
OldValue, 58 ,405
OLEVariant, 543
OnActivate, 80
OnHide, 81
OnShow, 81
OnValidate, 42
open, 107
optimizacin, 109 ,541
Oracle .DLL, 545
ORDER BY, 123 ,256 ,350
ordinal, 275
Packed, 428
PageIndex, 13
paquetes, 7 ,75 ,422 ,425 ,456 ,483
borrado, 341
recompilacin, 61
Paradox, 240 ,479
comparticin, 171
integridad referencial, 369
limitaciones, 167
Tipos de datos, 65 ,66 ,303
parmetros, 171 ,420 ,486
Params, 245 ,289 ,537
PDOXUSRS.LCK, 387
PDOXUSRS.NET, 387
Prepare, 142 ,317
propiedades, 343
declaracin, 434
tipos, 437
Published, 509
puertos, 57 ,465
punteros, 45 ,143 ,164 ,165 ,180 ,301 ,342 ,347
,358 ,434 ,446 ,509 ,512
R938, 324
Raise, 135 ,456
Read, 11 ,79 ,450
ReadBinaryData, 214
Readln, 270
ReadOnly, 106 ,116
Real, 446
recursin, 439 ,468
recursos
conservacin, 214
DLLs, 492
renombrar, 197
REF CURSOR, 420
Referencial, integridad, 10
Refresh, 389
Register, 202 ,413
RegisterClass, 72 ,204
RegisterComponents, 28 ,72 ,202 ,486
Rename, 258
ReportSmith, 140 ,265 ,520
RequestLive, 249 ,317 ,477 ,481 ,502
Required, 203 ,244 ,262
Requires, 425 ,455
Reset, 264 ,265
resourcestring, 11
Resourcestring, 165 ,522
Rewrite, 264 ,265
RLINK32.DLL, 161
Round, 336
RTTI, 484
Run-time error 202, 469
Runtime Error 215, 54
SaveToFile, 85
SDI, 87
SELECT, 256 ,257 ,348
ServerGUID, 83 ,330 ,460
ServerName, 460
SessionName, 90 ,106 ,116 ,199 ,233 ,460
SetDatabaseName, 118
SetFocus, 93
SetLength, 208 ,391 ,393
SHAREDMEMSIZE, 62 ,318 ,329
ShortDateTime, 452
ShowModal, 105
Site Express, 32 ,92 ,326 ,490 ,494
Slice, 464
sockets, 466
SortFieldNames, 142
SQL, 115 ,219
SQLDialect, 467
SQLPASSTHRU MODE, 432
StartTransaction, 38 ,110 ,169 ,281 ,395 ,401
,505 ,507
STDOLE.TLB, 161
STDOLE2.TLB, 161
Stored, 255 ,470
StoredProcName, 219
Synchronize, 236
SYSTEM.DCU, 474
SYSTEM.INI, 422
TBits, 64
TClientDataSet, 514
TClientDataSetGrid, 113
TClientSocket, 57 ,72 ,545
TDatabase, 168
TDataSet, 112
TDateTime, 16 ,22
TDateTimePicker, 17
Terminate, 67
TextOut, 301
TField, descendientes para los tipos de Paradox,
66 ,299
TFileAttr, 525
TFrame, 397
Threadvar, 97 ,501
TIBDatabase, 110
TIBInstall, 321
TIBTransaction, 110 ,395
TIBUninstall, 321
TIDAntiFreeze, 412
tiDirtyRead, 495
TModalResult, 524
TObject, 179
TObjectList, 411
TPageControl, 221
TQuery, 400 ,447
TQueryClientDataSet, 170
TransIsolation, 494
TRegSvr, 157 ,158 ,230 ,326 ,409 ,487 ,494
TReport, 140 ,265
Trunc, 336
Try, 237
Try...Except, 237 ,457
Try...Finally, 237 ,457
TSession, 78 ,90 ,106 ,114 ,199 ,460
TSQLConnection, 110
TTabbedNotebook, 221
TTable, 467
TThread, 98
TThreadList, 411
TUtility, 405
type, 131 ,229
TypeInfo, 510 ,516
unidirectional, 413
Unprepare, 116 ,141 ,317
UpdateMode, 447 ,467
UseBroker, 173
Uses, 521
vi
validacin, 40 ,251
Var, 131
parmetros, 497
variables
declaracin, 146
inicializacin, 95
variantes, 515 ,524
VARIANTS.PAS, 524
VBX, 488
VCL, 30 ,139
virtual, 372
VMT, 517
WaitFor, 236
Webbrokerscript, 409 ,494
Weblib, 326
WideString, 7 ,98 ,177 ,341 ,347 ,515
WIN.INI, 91
WinCRT, 271
Windows, 1 ,47 ,62 ,65 ,76 ,87 ,91 ,121 ,138 ,225
,309 ,325 ,334 ,366 ,371 ,407 ,426 ,476 ,496
With , 453
Write, 77 ,450
Writeln, 269 ,294