Está en la página 1de 590

Los Tomos de Delphi :

Delphi sin problemas

Clay Shannon

2002 Danypress
[www.danypress.com]

Los Tomos de Delphi: Delphi sin problemas

Por Clay Shannon


Copyright versin en castellano 2002 Danysoft Internacional
Avda. de Espaa 17 - 28100 Alcobendas - Madrid
www.danypress.com
ISBN: 84-923926-81
Depsito Legal: M.
Traducido de: The Tomes of Delphi: Developers Guide to Troubleshooting
Wordware Publishing - ISBN 1-55622-816-3
DERECHOS RESERVADOS.
El contenido de esta publicacin tiene todos los derechos reservados, por lo que no se puede
reproducir, transcribir, transmitir, almacenar en un sistema de recuperacin o traducir a
otro idioma de ninguna forma o por ningn medio mecnico, manual, electrnico, magntico,
qumico, ptico, o de otro modo. La persecucin de una reproduccin no autorizada tiene como
consecuencia la crcel y/o multas.
LIMITACIN DE LA RESPONSABILIDAD.
Tanto los autores como el equipo de Danysoft hemos revisado el texto para evitar cualquier
tipo de error, pero no podemos prometerle que el libro estar siempre libre de errores. Por
ello, y para que esto no sea una molestia para usted, hemos habilitado en
http://www.danypress.com un apartado especial para que cada libro que publiquemos
permanezca "vivo". Asimismo, podr enviarnos por e-mail a editorial@danysoft.com sus
comentarios sobre el libro.
DESCUENTOS ESPECIALES.
Recuerde que Danypress ofrece descuentos especiales a centros de formacin y en compras
por volumen. Para ms detalles, consulte con editorial@danysoft.com en Espaa o con
america@danysoft.com en Latinoamrica.
Todos los productos y marcas se mencionan nicamente con fines de identificacin y estn
registrados por sus respectivas compaas.
Delphi es una marca registrada de Borland Software Corporation. Otros nombres de
productos mencionados son utilizados nicamente para propsitos de identificacin y pueden
ser marcas comerciales registradas de sus respectivas compaas.

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:

Los Tomos de Delphi: Delphi sin problemas


de Clay Shannon
Una referencia que he encontrado particularmente til ha sido Delphi sin
problemas, de Clay Shannon, que es esencialmente una enciclopedia de
mensajes de error de Delphi. Si ha programado durante aos en Delphi (o
Turbo Pascal), encontrar algunos viejos conocidos aqu. Al principio me
preguntaba si habra algo nuevo para m en este libro. No tuve que esperar
mucho tiempo. A los pocos das de recibir esta valiosa referencia, una explicacin sobre un error me ahorr horas de esfuerzo a la hora de conseguir que
una llamada a la API de Windows funcionara.
Alan C. Moore
Columnista de File | New, Delphi Informant
Es muy til cuando tienes que dar solucin a problemas.
Bill Artemik
Droste Consultants, Inc.
He estado utilizando el libro durante el mes pasado y fue muy til cuando
estaba tratando de resolver el mensaje de error inexplicable de turno. No
utilizar este libro todos los das, pero cuando ocurra un error misterioso
estar muy feliz de tenerlo a su alcance. En l no solamente se identifica la
causa que est provocando el mensaje de error, sino que adems se ofrecen
soluciones y ejemplos que permiten resolver el problema muy rpidamente.
Si su tiempo es valioso y desea minimizar su tiempo muerto, le recomendara adquirir este libro.
Barry McClure
President
Grebar Systems, Inc.
Otro libro que yo recomendara es Delphi sin problemas, de Clay
S h a n n o n . . . Este libro es una referencia completa de los mensajes de error
de Delphi y sus causas comunes.
David R. Robinson
Director of Development
Carpe Diem Electronic Time Sheet
Sage U.S. Holdings, Inc.

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

<> is not a valid identifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19


<> is not a valid integer value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
<> is not a valid integer value for field <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
<> 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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
<> is not a valid time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
<> is not a valid value for field <>. The allowed range is <> to <>. . . . . . . . . . . . . . . . . . . . . . . . 23
<> must be saved before adding to Repository. Save now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
<> or <> expected but <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
<> property out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
{$R *.RES} missing or incorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
(<>, <>, <>, <>) is not a valid DateMonthWeek quad . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
(<>, <>, <>) is not a valid DateWeek triplet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
16-Bit segment encountered in object file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
A class named <> is already installed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
A CoClass must have at least one default interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
A CoClass must implement at least one interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
A component class named <> already exists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
A component named <> already exists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
A component named <> already exists in a descendent form . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
A connection with the server could not be established . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
A device attached to the system is not functioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
A dispinterface type cannot have an ancestor interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
A dispinterface type requires an interface identification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
A field or method named <> already exists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
A module called <> is already installed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
A page must be empty before it can be deleted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
A reference to <> already exists in the Type Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
A required .DLL file, <>, was not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
A transaction is already active . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
A user transaction is already in progress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
A value must be specified for <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
A Win32 API function failed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Abstract method error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Abstract methods must be virtual or dynamic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Access violation (General Protection Fault) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Access violation at address <>.<> of address <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Ambiguous overloaded call to <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Ancestor component not found. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
An error occurred while attempting to initialize the Borland Database Engine (error <>) . . . . . . . . . . . . . 51
Another file named <> is already on the search path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Another file with the same base name (<>) is already on the search path . . . . . . . . . . . . . . . . . . . . . 51
Application is not licensed to use this feature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Arithmetic Overflow Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

vi

Array type required. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55


Assertion failed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Assignment to FOR-Loop variable <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Asynchronous socket error <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
At end of table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Bad argument type in variable type array constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Bad global symbol definition: <> in object file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Bad packaged unit format: <>.<> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Bad unit format: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
BDE Initialization Error $2501 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Before you can deploy, you must complete the Web Deployment page of the Project|Web Deploy Options dialog. . 63
Bitmap image is not valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Bits index out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
BLOb has been modified . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Break or Continue outside of loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Breakpoint is set on line that may have been removed by the optimizer or contains no debug information. Run anyway?
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Call to Application.CreateForm is missing or incorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Call to RegisterClass is missing or incorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Cant change value while socket is active . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Cant compile Complib. Too many files in project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Cant delete or change record. Since related record exists in table =xxx, referential in tegrity rules would be violated
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Cant load [complib.dcl, cmplib32.dcl, vcl30.dpl, vcl40.bpl, vcl50.bpl, vcl.bpl] . . . . . . . . . . . . . . . . . . . . 74
Cant load package <>.<> One of the library files needed to run this package cannot be found . . . . . . . . . . 75
Cant load package <>. The specified module could not be found. . . . . . . . . . . . . . . . . . . . . . . . . . 76
Cant write .EXE file. Disk full?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Cannot add a session to the form or data module while session <> has AutoSessionName enabled . . . . . . . . 78
Cannot assign to a read-only property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Cannot break, continue, or exit out of a finally clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Cannot change the size of an icon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Cannot change Visible in OnShow or OnHide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Cannot complete a class with incomplete methods implementations . . . . . . . . . . . . . . . . . . . . . . . . 82
Cannot connect, <> must contain a valid ServerName or ServerGUID . . . . . . . . . . . . . . . . . . . . . . . 83
Cannot connect to database <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Cannot copy a Repository Project to a directory underneath itself . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Cannot create cursor handle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Cannot create file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Cannot create form. No MDI forms are currently active . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Cannot create Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Cannot debug project unless a host application is defined. Use the Run|Parameters. . . dialog box . . . . . . . . . . 88
Cannot enable AutoSessionName property with more than one session on a form or data module . . . . . . . . . . 89
Cannot find <> on the search path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Cannot find Engine configuration file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

vii

Cannot find implementation of method <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92


Cannot find server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Cannot focus a disabled or invisible window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Cannot hide an MDI Child Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Cannot inherit from form <>. It contains a component with a blank name property . . . . . . . . . . . . . . . . 95
Cannot initialize local variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Cannot initialize multiple variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Cannot initialize thread local variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Cannot Load IDAPI Service Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Cannot load IDAPI[32].DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Cannot load language driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Cannot load package <>. It contains unit <> which is also contained in package <> . . . . . . . . . . . . . . 102
Cannot locate IDAPI[01,32].DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Cannot make a visible window modal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Cannot modify a read-only dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Cannot modify SessionName while AutoSessionName is enabled . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Cannot open component library <Path>\Complib.dcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Cannot open file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Cannot open module because it is a dependent of <>, which is open as text . . . . . . . . . . . . . . . . . . . 108
Cannot optimize. Not an .exe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Cannot override a static method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Cannot perform operation - DB is not open. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Cannot perform this operation on a closed connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Cannot perform this operation on a closed database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Cannot perform this operation on a closed dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Cannot perform this operation on an active session. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Cannot perform this operation on an empty dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Cannot perform this operation on an open database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Cannot perform this operation on an open dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Cannot perform this operation with table open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Cannot perform utility while table is in use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Cannot read a write-only property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Cannot Run a Unit or DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Cannot update, <> is not owned by <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Cannot use array of Field values with Expression Indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Cannot use reserved unit name <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Cannot write EXE or DLL to disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Cannot Write to Engine Configura tion File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Capability Not Supported . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Case label outside of range of case expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Circular datalinks are not allowed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Circular Unit Reference [to <>] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Class <> not found. [Ignore the error and continue?] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Class already has a default property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

viii

Class does not have a default property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130


Class, interface and object types only allowed in type section . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Class methods not allowed as property getters and setters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Class not registered. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Class or object types only allowed in type section. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Class type required . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Clipboard does not support Icons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Close error on <Filename> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Code Insight features are disabled while debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Code Segment Too Large . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
COINITIALIZE has not been called . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Column not a BLOb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Comma Expected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Compilation terminated; too many errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Component already installed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Connection errorno server available . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Connection in use by another statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Connection name missing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Constant expression expected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Constant expression violates subrange bounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Constant object cannot be passed as var parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Constant or type identifier expected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Constant out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Constants cannot be used as open array arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Constructing Instance of <> containing abstract methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Constructors and Destructors must have register calling convention . . . . . . . . . . . . . . . . . . . . . . . . 150
Constructors and Destructors not allowed in OLE automation section . . . . . . . . . . . . . . . . . . . . . . . 151
CONTAINS clause is incorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Control <> has no parent window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Controls cannot be added to a data module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Corrupt table/index header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Could not create out put file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Could not find IDataBroker in type library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Could not find interface <> in type library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Could not find interface IDataBroker in type library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Could not find language driver ($220B) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Could not find object. Cannot load an IDAPI service library. File: ODBC32.DLL . . . . . . . . . . . . . . . . . . . 159
Could not initialize IDAPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Could not load RLINK32.DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Could not load StdOle version 1.0 type library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Could not load Type Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Could not load unit <> symbol information for <> Do you want to try to find this file yourself? . . . . . . . . . 162

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

Duplicate session name <> . . . . . . . . . . . . . . . . . . . . . . . . . .


Duplicate Tag Value. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dynamic method or message handler not allowed here . . . . . . . . . . . . .
Dynamic method or message handlers not allowed in OLE automation sections
EAccessViolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EBitsError. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EClassNotFound . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EComponentError. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EConvertError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EDatabaseError. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EDivByZero. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EFCreateError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EFilerError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EGPFault . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EInOutError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EIntOverflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EInvalidCast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EInvalidGraphic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EInvalidGraphicOperation . . . . . . . . . . . . . . . . . . . . . . . . . . .
EInvalidOp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EInvalidOperation: Cannot create form. No MDI forms are currently active . .
EInvalidOperation: Cannot make a visible window modal . . . . . . . . . . . .
EInvalidPointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Element 0 Inaccessibleuse Length or SetLength . . . . . . . . . . . . . . .
END expected but <> found . . . . . . . . . . . . . . . . . . . . . . . . .
END expected but implementation found . . . . . . . . . . . . . . . . . . .
END. missing at end of module . . . . . . . . . . . . . . . . . . . . . . . . .
EOLEError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EOLEException . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EOleSysClass not Registered . . . . . . . . . . . . . . . . . . . . . . . . . .
EOleSysError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EOleSysOperation Unavailable . . . . . . . . . . . . . . . . . . . . . . . . .
EOutOfMemory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EOutOfResources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ERangeError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EReadError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ERegistryException . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EResNotFound . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Error 0: RLINK32 Error opening file <TypeLibrary>.tlb . . . . . . . . . . . .
Error 2File not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Error 4Too many open files . . . . . . . . . . . . . . . . . . . . . . . . . .
Error 68Circular Unit Reference . . . . . . . . . . . . . . . . . . . . . . .
Error 76Constant out of range . . . . . . . . . . . . . . . . . . . . . . . .
Error 94. Expected. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

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

Error 101Disk write error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217


Error 102File not assigned . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Error 103File not open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Error 104File not open for input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Error 105File not open for output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Error 200Division by zero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Error 201Range check error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Error 202Stack overflow error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Error 203Heap overflow error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Error 204Invalid pointer operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Error 207Invalid floating point operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Error 210Abstract Method Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Error 215Arithmetic overflow error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Error 216Access Violation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Error 219Invalid Typecast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Error 220Invalid Variant Typecast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Error 227Assertion failed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Error Creating Cursor Handle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Error creating form: access violation at. . . vcl[30,40,50,60] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Error creating form: Ancestor for <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Error Creating Form: Cannot inherit from form <>. Contains a component <> that does not support inheritance 221
Error Creating Form: Cannot inherit from form <>. It contains a component with a blank name property . . . . 221
Error creating form: Cannot open file <>.DFM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Error Creating Form: Duplicate resource [Type:,Name:] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Error Creating Form: Invalid Stream Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Error creating Process. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Error Creating Variant Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Error Creating Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Error debug setting hook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Error in CREATE INDEX statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Error in mod ule <>: Call to Application.CreateForm is missing or incorrect . . . . . . . . . . . . . . . . . . . . 228
Error in mod ule <>: CONTAINS clause is incorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Error in mod ule <>: Declaration of class <> is missing or incorrect . . . . . . . . . . . . . . . . . . . . . . . 228
Error in mod ule <>: END. missing at end of module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Error in mod ule <>: Implementation part USES clause incorrect . . . . . . . . . . . . . . . . . . . . . . . . . 229
Error in mod ule <>: Incorrect field decla ration: class <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Error in mod ule <>: REQUIRES clause is incorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Error in mod ule <>: USES clause is missing or incorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Error initializing BDE ($2B05) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Error loading type library/dll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Error Opening Component Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Error reading <>.<>: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
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. . . . . . . . . 232

xii

Error reading <Database>.SessionName. Duplicate database name <> . . . . . . . . .


Error reading <Session>.SessionName. Duplicate session name <> . . . . . . . . . . .
Error reading symbol file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Error saving I(Interface): The parameter is incorrect . . . . . . . . . . . . . . . . . . . .
Error setting debug exception hook . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Error starting Program. The <>.DLL file appears to be corrupt. Reinstall the file, and then
EStackOverflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EStringListError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EThread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EVariantError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Except or Finally expected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exception <> in module <> at <>.<>. . . . . . . . . . . . . . . . . . . . . . . . .
Expected an identifier but function found . . . . . . . . . . . . . . . . . . . . . . . . . .
Expecting a column separator in table [header] . . . . . . . . . . . . . . . . . . . . . .
Exports allowed only at global scope . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Expression expected but <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . .
External error C0000006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
External error C0000012 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
External exception C0000008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
F004 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Failed to get data for <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Failed to load stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fatal Error: <>: Required Package <> not found . . . . . . . . . . . . . . . . . . . . .
Field <> cannot be modified. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field <> cannot be used in a filter expression . . . . . . . . . . . . . . . . . . . . . . .
Field <>.<> does not have a corresponding component. Remove the declaration? . . . .
Field <> is not indexed and cannot be modified . . . . . . . . . . . . . . . . . . . . . .
Field <> is not of the expected type . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field <> is of an unknown type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field <> is of an unsupported type . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field <> must have a value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field <> should be of type <> but is declared as <>. Correct the declaration? . . . . .
Field declarations not allowed in interface type . . . . . . . . . . . . . . . . . . . . . . .
Field definition not allowed after methods or properties . . . . . . . . . . . . . . . . . .
Field in group by must be in result set . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field in order by must be in result set . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field index out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field name already exists. Rename one of the fields . . . . . . . . . . . . . . . . . . . .
Field not found in table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field or method identifier expected . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field types do not match . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field value required . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
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

File <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262


File access denied . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
File extension <> is not valid. Expecting <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
File is Locked. Table: <> User: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
File not assigned . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
File not found <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
File not open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
File not open for input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
File not open for output. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
File or directory does not exist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
File type not allowed here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Fixed column count must be less than column count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Fixed row count must be less than row count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
For Loop control variable must be simple local variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
For Loop control variable must have ordinal type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
For-Loop variable <> cannot be passed as var pa rameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Form <> links to form <> which cannot be found in the current project. Do you wish to remove/re direct the links to
another form?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Form <> references another form and cannot be saved until <> is loaded . . . . . . . . . . . . . . . . . . . . 277
Format <> invalid or incompatible with argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Function needs result type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
General SQL Errorconnection does not exist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
General SQL ErrorFROM keyword not found where expected . . . . . . . . . . . . . . . . . . . . . . . . . . 279
General SQL Error: Missing Left Pa renthesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
General SQL Error: SQL Command not properly ended . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
General SQL Error: SQL is too complex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
General SQL error. The [Commit,Rollback] Transaction request has no corresponding begin transaction . . . . . . 281
GOTO <> leads into or out of TRY statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Grid Index Out of Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
GROUP BY is required when both aggregate and non-aggregate fields are used in result set . . . . . . . . . . . . 283
Heap Overflow Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
High cannot be applied to a long string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Higher table level required . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
I/O Error 102 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
I/O Error 103 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
I/O Error 104 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
I/O Error 105 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
I/O error found for file <Current directory>\Database.GDB. Error while trying to open file. The system cannot find
the file specified. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Identifier expected but <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Identifier expected but array found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Identifier expected but number found. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Identifier redeclared: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Illegal character in input file: <> (<>) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291

xiv

Illegal message method index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Illegal type in OLE automation section: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Illegal type in Read/Readln statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Illegal type in Write/Writeln statement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IMPLEMENTATION part is missing or incorrect. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Implementation part USES clause incorrect. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Implements clause only allowed for properties of class or interface type . . . . . . . . . . . . . . . .
Implements clause only allowed for readable property . . . . . . . . . . . . . . . . . . . . . . . . .
Implements clause only allowed within class types . . . . . . . . . . . . . . . . . . . . . . . . . . .
Implements getter must be register calling convention . . . . . . . . . . . . . . . . . . . . . . . . .
Improper GUID syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Incompatible Record Structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Incompatible Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Incompatible types: <> and <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Incompatible types: Parameter lists differ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Incorrect field declaration: class <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Incorrect method declaration in class <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Incorrect syntax near ':' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Index already exists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
INDEX clause not allowed in OLE automation section . . . . . . . . . . . . . . . . . . . . . . . . .
Index does not exist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Index is out of date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Index is out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Index is read only . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Index not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Index or Primary Key cannot contain a Null value . . . . . . . . . . . . . . . . . . . . . . . . . . . .
INDEX, READ, OR WRITE clause expected but ; found . . . . . . . . . . . . . . . . . . . . . . . .
INSERT and UPDATE operations are not supported on autoincrement field type . . . . . . . . . . . .
Installation error 113 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instance variable <> inaccessible here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Insufficient disk space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Insufficient memory for this operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Insufficient SQL rights for operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Insufficient table rights for operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Integer constant too large . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
InterBase install DLL ibinstall.dll not found in path. Please install InterBase 6 to use this fun ctionality.
Interface <> already implemented by <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interface <> has no interface identification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interface <> not mentioned in interface list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interface mismatch. Engine version different . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interface type required . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Internal error: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Internal Error; Near: query shellmgr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Internal Error 500. Interface not supported . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

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

Internal Server Error 500 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Invalid address value. Must be a hexadecimal value in the range 00000000-FFFFFFFF .
Invalid argument to date encode . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid argument to time encode . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid Batch Move Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid Bind Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid BLOb handle [in record buffer] . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid BLOb Size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid class string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid class typecast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid compiler directive: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid directory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid field name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid field size. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid field type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid file name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid floating point operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid function result type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid GUID format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid index descriptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid index expression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid index/tag name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid message parameter list . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid package file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid parameter type: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid pointer operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid property path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid property value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid property value on line <> . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid resource format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid Stream Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid Type Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid typecast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid use of keyword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid variable reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invalid variant type conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Key Violation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Label <> is not declared in current procedure . . . . . . . . . . . . . . . . . . . . .
Label already defined: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Label declaration not allowed in interface part . . . . . . . . . . . . . . . . . . . . .
Label declared and referenced, but not set . . . . . . . . . . . . . . . . . . . . . . .

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

Need to specify at least one dimension for SetLength of dynamic array .


Never-build package <> must be recompiled . . . . . . . . . . . . .
Never-build package <> requires always-build package <> . . . . .
New not supported for dynamic arraysuse SetLength . . . . . . . .
No address specified . . . . . . . . . . . . . . . . . . . . . . . . . .
No argument for format <> . . . . . . . . . . . . . . . . . . . . . .
No code was generated for the current line . . . . . . . . . . . . . . .
No Databases Are Listed In Transaction Component . . . . . . . . . .
No definition for abstract method <> allowed . . . . . . . . . . . . .
No fields definedcannot create dataset . . . . . . . . . . . . . . .
No frames in project . . . . . . . . . . . . . . . . . . . . . . . . . .
No index currently active . . . . . . . . . . . . . . . . . . . . . . . .
No MDI forms are currently active . . . . . . . . . . . . . . . . . . .
No MDI Parent Active . . . . . . . . . . . . . . . . . . . . . . . . .
No overloaded method of <> with this parameter list exists . . . . .
No Provider Available . . . . . . . . . . . . . . . . . . . . . . . . . .
No SQL statement available . . . . . . . . . . . . . . . . . . . . . .
No user transaction is currently in progress. . . . . . . . . . . . . . .
No Web browser could be located . . . . . . . . . . . . . . . . . . .
NODEFAULT clause not allowed in OLE automation section . . . . . .
Not enough actual parameters . . . . . . . . . . . . . . . . . . . . .
Not enough file handles. . . . . . . . . . . . . . . . . . . . . . . . .
Not exact read/write in <>.mb and <>.mb . . . . . . . . . . . . .
Not in cached update mode . . . . . . . . . . . . . . . . . . . . . .
Not initialized for accessing network files. . . . . . . . . . . . . . . .
Number is out of range . . . . . . . . . . . . . . . . . . . . . . . . .
Number of elements differs from declaration . . . . . . . . . . . . . .
Object Factory for TwebResponse Missing . . . . . . . . . . . . . . .
Object or class type required . . . . . . . . . . . . . . . . . . . . . .
OLE error 800A03EC . . . . . . . . . . . . . . . . . . . . . . . . . .
One or more lines were too long and have been truncated . . . . . . .
Only one of a set of overloaded methods can be published . . . . . . .
Only one TIDAntiFreeze can exist per application . . . . . . . . . . .
Only register calling convention allowed in OLE automation section . .
Operation not allowed on a unidirectional dataset . . . . . . . . . . .
Operation not allowed on sorted string list . . . . . . . . . . . . . . .
Operation not applicable . . . . . . . . . . . . . . . . . . . . . . . .
Operation not supported . . . . . . . . . . . . . . . . . . . . . . . .
Operator not applicable to this operand type . . . . . . . . . . . . . .
ORA-1001 invalid cursor . . . . . . . . . . . . . . . . . . . . . . . .
Order of fields in record constant differs from declaration . . . . . . .
Ordinal type required . . . . . . . . . . . . . . . . . . . . . . . . . .
Out of memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Out of system resources . . . . . . . . . . . . . . . . . . . . . . . .

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

Overflow in conversion or arithmetic operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Overloaded procedure <> must be marked with the overload directive . . . . . . . . . . . . . . . . . . .
Overriding automated virtual method <> cannot specify a dispid . . . . . . . . . . . . . . . . . . . . . .
Package <> already contains unit <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Package <> cant be installed because another package with the same base name is already load ed (<>)
Package <> cant be installed because it is not a design time package . . . . . . . . . . . . . . . . . . .
Package <> is recursively required. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Package unit <> cannot appear in contains or uses clauses . . . . . . . . . . . . . . . . . . . . . . . . .
Packages <> and <> both contain unit <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PACKED not allowed here. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Page Fault in module <> at <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Page name cannot be blank. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Param <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameter <> not allowed here due to default value . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameter <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameters of this type cannot have default values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parent Interface must be Dispatchable for dual interface . . . . . . . . . . . . . . . . . . . . . . . . . . .
Passthrough SQL connection must be shared . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Path not found. File <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Path too long . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pointer type required . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Preparation of default expression failed with error Type mismatch in expression . . . . . . . . . . . . . .
Previous declaration of <> was not marked with the overload directive . . . . . . . . . . . . . . . . . .
Printing in Progress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Procedure cannot have a result type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Procedure FAIL only allowed in constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Procedure, function or property expected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Procedure or Function expected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Procedure or Function name expected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Program or unit <> recursively uses itself . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Project <> raised exception class <> with message <>. Process stopped. Use Step or Run to continue. .
Property <> does not exist in base class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Property <> inaccessible here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Property does not exist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Property getters and setters cannot be overloaded . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Property overrides not allowed in interface type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Provider name was not recognized by the server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Published field <> not a class nor interface type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Published property <> cannot be of type <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Published real[48] property <> must be Single, Double, or Extended . . . . . . . . . . . . . . . . . . . .
PutObject to undefined item . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Query Is Too Complex. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Query makes no sense . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Query may take a long time to process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

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

Range check error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Read failure. File: <>.val . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Read or Write clause expected but identifier <> found . . . . . . . . . . . . . . . . .
Record already locked by this session . . . . . . . . . . . . . . . . . . . . . . . . . . .
Record changed by another user . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Record Key deleted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Record/Key Deleted. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Record Locked by another User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Record, object or class type required . . . . . . . . . . . . . . . . . . . . . . . . . . .
Recursive include file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Redeclaration of <> hides a member in the base class . . . . . . . . . . . . . . . . .
Redeclaration of property not allowed in OLE automation section . . . . . . . . . . . .
Required package <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
REQUIRES clause is incorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Re-raising an exception only allowed in exception handler . . . . . . . . . . . . . . . .
Resource <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Segment/Offset pairs not supported in Borland 32-bit Pascal . . . . . . . . . . . . . . .
Selection contains a component introduced in an ancestor form which cannot be deleted
Server Execution Failed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Session name missing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sets may have at most 256 elements . . . . . . . . . . . . . . . . . . . . . . . . . . .
Share not loaded. It is required to share local files . . . . . . . . . . . . . . . . . . . .
Size mismatch error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Size of published set <> is greater than [4 bytes, 32 bits] . . . . . . . . . . . . . . .
Slice standard function is only allowed as open array argument . . . . . . . . . . . . . .
Socket Error # 10061 Connection Refused . . . . . . . . . . . . . . . . . . . . . . .
Socket Error # 10065 No route to host . . . . . . . . . . . . . . . . . . . . . . . .
Socket Error # 11001 Host not found . . . . . . . . . . . . . . . . . . . . . . . . .
SQL Connection timed out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SQL Dialect Invalid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SQL is too complex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Stack overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Statement expected, but expression of type <> found. . . . . . . . . . . . . . . . . .
Statements not allowed in interface part . . . . . . . . . . . . . . . . . . . . . . . . .
STORED clause not allowed in OLE automation section . . . . . . . . . . . . . . . . .
Stream Read Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
String constant truncated to fit STRING[ ] . . . . . . . . . . . . . . . . . . . . . . . .
String [literal]s may have at most 255 elements . . . . . . . . . . . . . . . . . . . . .
Syntax Error in Field Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Syntax error in query. Incomplete query clause . . . . . . . . . . . . . . . . . . . . . .
Syntax error in real number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
System unit out of date or corrupted . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table cannot be opened for exclusive use . . . . . . . . . . . . . . . . . . . . . . . . .
Table corruptother than header . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Table does not exist. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476


Table does not support this operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
Table is busy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Table is full . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
Table is not indexed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Table is read only . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Table or View does not exist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
TActiveFormX declaration missing or incorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Text after final END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
The <>.EXE file is linked to missing export <>.DPL:<> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
The <> method referenced by <>.<> does not exist. Remove the reference? . . . . . . . . . . . . . . . . . . 484
The <> method referenced by <>.<> has an incompatible parameter list. Remove the reference? . . . . . . . 486
The application or DLL <> is not a valid Windows image. Please check this against your instal lation diskette. . . 486
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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
The Edit Buffer of <> is marked read-only . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
The Master Source property of <> must be linked to a DataSource . . . . . . . . . . . . . . . . . . . . . . . . 488
The OLE control may possibly require support libraries that are not on the current search path or are not present on
your system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
The package already contains unit named <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
The package already requires a package named <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
The page cannot be displayed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
The path entered does not exist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
The procedure entry point <> cannot be found in the dynamic link library <>.DLL . . . . . . . . . . . . . . . 491
The project already contains a form or module named <>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
The Resource DLL Wizard requires a project to be open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
The search string cannot be blank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
The selected bitmap is larger than 24x24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
The server returned an invalid response. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
The transaction isolation level must be dirty read for local databases . . . . . . . . . . . . . . . . . . . . . . . 494
The type library has syntax errors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
There is currently no active project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
There is no default printer currently selected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
There is no overloaded version of <> that can be called with these arguments . . . . . . . . . . . . . . . . . . 496
This form of method call only allowed for class methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
This form of method call only allowed in methods of derived types . . . . . . . . . . . . . . . . . . . . . . . . . 499
This package already contains unit named <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
This type cannot be initialized . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Thread local variables cannot be ABSOLUTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Thread local variables cannot be local to a function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Token not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Token not found. Token :dbo. line number:1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Too many actual parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503

xxi

Too many connections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Too many files open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Too many locks on table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Too many open cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Too many open files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Too many parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transaction Is Active . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transaction not Assigned . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Translate error, value out of bounds. . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tried to search marked block but it is invalid . . . . . . . . . . . . . . . . . . . . . . .
Type <> has no type info . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Type <> is not yet completely defined . . . . . . . . . . . . . . . . . . . . . . . . . .
Type <> must be a class to have a PUBLISHED section . . . . . . . . . . . . . . . . .
Type <> must be a class to have OLE automation . . . . . . . . . . . . . . . . . . . .
Type <> needs finalizationnot allowed in file type . . . . . . . . . . . . . . . . . .
Type expected but <> found. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Type expected but real constant found . . . . . . . . . . . . . . . . . . . . . . . . . .
Type mismatch for field <FieldName>, expecting: <Field type>, actual: <Field type>
Type mismatch [in expression] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Type not allowed in OLE Automation call . . . . . . . . . . . . . . . . . . . . . . . . .
Type of expression must be BOOLEAN . . . . . . . . . . . . . . . . . . . . . . . . . .
Type of expression must be INTEGER . . . . . . . . . . . . . . . . . . . . . . . . . . .
TYPEINFO standard function expects a type identifier . . . . . . . . . . . . . . . . . .
TYPEOF can only be applied to object types with a VMT . . . . . . . . . . . . . . . . .
Types of actual and formal var parameters must be identical . . . . . . . . . . . . . . .
Unable to Execute a Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unable to find both a form and a source file . . . . . . . . . . . . . . . . . . . . . . .
Unable to insert a line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unable to load GDS[32].DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unable to load RPTSMITH.EXE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Undeclared Identifier: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Undeclared Identifier: 'EmptyParam' . . . . . . . . . . . . . . . . . . . . . . . . . . .
Undeclared Identifier: 'Result'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Undeclared Identifier: 'Unassigned' . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Undeclared Identifier: 'VarToStr' . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unexpected end of command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unit <> was compiled with a different version of <> . . . . . . . . . . . . . . . . . .
Unit File Format Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unit name mismatch: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unit version mismatch: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unknown Column. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unknown database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unknown directive: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unknown directive (already exists) . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Unknown Identifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533


Unknown picture file extension: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Unknown SQL Error. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Unknown user name or password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Unnamed arguments must precede named arguments in OLE Automation call . . . . . . . . . . . . . . . . . . . 536
Unrecognized database parameter block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
Unsatisfied forward or external declaration: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
Unsupported 16bit resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Unterminated string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
USES clause is missing or incorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Validation error for column <Column Name>, value <***Null***> . . . . . . . . . . . . . . . . . . . . . . . 539
Variable <> inaccessible here due to optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Variable name expected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Variable required . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
Variant does not reference an automation object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
Variant does not reference an OLE object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Variant error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Variant is not an array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Vendor initialization failure: ORA[NT]7[1,2,3].DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Windows socket error: <> on API <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Windows Socket Error: (10060), on API connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Write error on <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
You cannot add a <> to the current project because it is not an ActiveX library. Click OK to start a new ActiveX library project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
You cannot specify a size for a field of this type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
You must open a project before you can add an Automation Object . . . . . . . . . . . . . . . . . . . . . . . . 547
You must select a VCL class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Your application is not enabled for use with this driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Your username and password are not defined. Ask your database administrator to set up an InterBase login . . . . 549

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

usuario se rasca la cabeza y comienza a investigar el problema, muchas


veces yendo 180 grados en la direccin equivocada. Personalmente he perdido das enteros por culpa de errores de ese tipo.
Esto es lo que hace que este libro sea nico y valioso. El autor ha creado
un mapa del campo de minas para nosotros. Incluso nos indica cundo un
mensaje de error es realmente un falso seuelo que puede dejar al desarrollador perdido durante das. Hay muchos libros disponibles sobre Delphi, pero muy pocos tienen el enfoque tan definido de ste. Est dedicado
ntegramente a un nico tema, pero es claramente el libro que Ud. buscar cuando necesite ayuda durante la solucin de problemas.
Hacer un libro que no sigue las frmulas usuales exige mucho valor. Mi
alabanza a Mr. Shannon por preparar tan indispensable referencia
Robert Vivrette, Editor Tcnico
The Delphi Informant Magazine

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.

Los mensajes de error son sus amigos


Mientras trabaja con Delphi, podr encontrar mensajes de error en tres
etapas distintas del desarrollo: tiempo de diseo, tiempo de compilacin y
tiempo de ejecucin. Los errores de tiempo de diseo y tiempo de compilacin los ve el desarrollador solamente. Los errores de tiempo de ejecucin
pueden ser vistos tanto por el desarrollador como por el usuario final. Los
errores de tiempo de ejecucin no son necesariamente culpa del desarrollador aunque el desarrollador debera contar con la posibilidad de que
ocurran, y codificar defensivamente para anticipar tal posibilidad.
Una categora de error de la cual este libro no trata son los errores lgicos. Los errores lgicos no generan directamente mensajes de error. De
hecho, puede que ni siquiera provoquen mensajes de error indirectamente
(aunque los resultados no sean los esperados). Los errores lgicos pueden
subsistir indefinidamente sin ser detectados, y si son descubiertos despus de la implantacin del software, lo son generalmente por los usuarios finales.
Este libro le ayudar a determinar la causa y la solucin para los errores
de tiempo de diseo, tiempo de compilacin y tiempo de ejecucin.

xxix

Introduccin

Cuando obtenga un error de tiempo de diseo (un cuadro de mensaje que


le dice, a veces de forma misteriosa, que ha hecho algo mal), consulte este
libro para ms informacin.
La primera accin a realizar cuando reciba un mensaje de error de tiempo
de compilacin debe ser pulsar la tecla F1 para obtener la ayuda sensible
al contexto de Delphi. Muchas veces esto le proporcionar informacin
suficiente para resolver rpidamente el problema que ha producido el
mensaje de error. En los casos en que la informacin no sea suficientemente clara y especfica, consulte este libro. Delphi le ayudar a determinar la causa del error colocando el cursor sobre la lnea de cdigo en que
se ha producido el error o la situada inmediatamente despus.
Si est experimentando un error de tiempo de ejecucin, consulte este
libro para obtener una explicacin. Adicionalmente, las teclas F4, F7 y F8
resultan tiles de cara a la depuracin. Si tiene activada la opcin Break
on Exception (seleccione Tools | Environment Options, y compruebe
que la casilla de verificacin Break on Exception en la seccin Debugging de la pgina Preferences est marcada), Delphi deber mostrarle
el lugar del cdigo donde se ha producido el error. Coloque el cursor un
poco antes de este sitio, y pulse la tecla F4 para ejecutar hasta la posicin
del cursor. El programa se ejecutar hasta que alcance ese sitio, y har
una parada. Entonces usted podr saltar a travs del cdigo de lnea en
lnea utilizando las teclas F7 (Trace Into) F8 (Step), evaluando el estado
del programa y los valores de las variables a lo largo de la ejecucin. Para
ms informacin, consulte debugger en la ayuda de Delphi.

Cmo encontrar mensajes de error especficos en este libro


Por lo general, localizar informacin en este libro es muy simple, ya que
los mensajes de error se presentan en orden alfabtico. Por ejemplo, para
encontrar la discusin relacionada con el mensaje de error A CoClass
must have at least one default interface, simplemente bsquelo en
la tabla de contenido, situada al inicio del libro (entre A class named <>
is already installed y A CoClass must implement at least one
interface, para ser ms exactos).

Mensajes de error que contienen variables


Algunos mensajes de error son dinmicos o estn parametrizados, ya que
su redaccin exacta ser diferente de acuerdo con la situacin especfica
con la que est tratando. Por ejemplo, el mensaje listado en este libro
como Package <> already contains unit <> contiene dos variables,
que dependen del paquete al que se est intentando aadir una unidad y
el nombre de la unidad que ya existe en ese paquete. Si el paquete al que
xxx

Introduccin

est intentando aadir una unidad es dclusr40.dpk, y la unidad que est


intentando aadir es XProcs.PAS, pero de hecho esa unidad ya ha sido
aadida al paquete, el mensaje de error ser Package dclusr40.dpk
already contains unit XProcs.PAS.
Esto no debera ser un problema a la hora de localizar un mensaje,
excepto quizs en el caso en que una variable se encuentre al inicio de un
mensaje de error. An as, esto no es un gran obstculo si toma conciencia
del hecho de que el inicio del mensaje de error podra ser una variable.
Por ejemplo, si recibe el mensaje de error ; expected but END found,
podra ser un poco confuso saber exactamente dnde encontrar la discusin sobre ese mensaje de error en este libro. An cuando sepa dnde est
situado el punto y coma en el orden alfabtico, no encontrar el mensaje
de error en ese lugar, ya que el mensaje de error contiene variables. Si se
da cuenta, sin embargo, de que este mensaje de error puede desplegarse
bajo diversas circunstancias, sabr que debe buscarlo bajo <> expected
but <> found.
La moraleja de todo lo dicho anteriormente es la siguiente: si no est
seguro de qu parte de un mensaje de error puede ser variable, busque
primero el mensaje de error exacto por orden alfabtico; si no puede localizarlo utilizando ese mtodo, bsquelo a lo largo de la seccin de la tabla
de contenido donde se ubican los mensajes de error que comienzan con
una variable (<>).

Mensajes de error encapsulados


Algunas veces Delphi le dar un mensaje de error muy largo que encapsula un mensaje de error ms especfico en su interior. Por ejemplo, podr
obtener un error como: Project <> raised exception class EClassNotFound with message Class <> not found. Process stopped. En
casos como ste, busque el mensaje de error ms interno (en este caso
Class <> not found).
De la misma forma, si el mensaje de error comienza con Fatal Error,
Run-time Error, I/O Error, Error in Module <> u otra categora
de error genrica, busque el mensaje de error ms especfico que sigue a
la clasificacin general. Por ejemplo, si obtiene el mensaje Fatal Error
<>: Required Package <> not found, bsquelo bajo Required Package <> not found.

Cuando hay muchas causas potenciales para el mismo error


Algunos mensajes de error pueden ser provocados por ms de una accin
claramente definida. En muchos de esos casos, las diferentes causas
potenciales del mensaje de error son enumeradas y discutidas
xxxi

Introduccin

separadamente en las tres secciones que componen cada entrada (Posible


causa de error, Solucin rpida e Informacin adicional).
En tales casos, haga corresponder el nmero en la seccin Posible causa
de error con su correspondiente discusin en la seccin Solucin rpida
(en ocasiones, ciertas causas de error especficas se discuten tambin individualmente en la seccin Informacin adicional).

Cuando necesite ms informacin


Habr ocasiones en las que desear informacin ms detallada que la contenida en este libro. Afortunadamente, existen numerosos recursos a disposicin de los programadores de Delphi, tales como publicaciones
peridicas, grupos de usuarios, grupos de noticias de Internet, sitios web,
y por supuesto, otros libros que puede encontrar en www.danypress.com.
Aqu estn algunos de los mejores recursos disponibles en cada categora:

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

Sitios web dedicados a Delphi


Existe una gran cantidad de sitios web excelentes dedicados a Delphi.
Aqu se listan algunos de ellos, desde los cuales podr conectarse a otros:
xxxii

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.

Grupos de noticias de Internet


He aqu algunos grupos de noticias de Internet relacionados con Delphi:
alt.lang.delphi
comp.lang.pascal.delphi.databases
comp.lang.pascal.delphi.misc
comp.lang.pascal.delphi.components.misc
comp.lang.pascal.delphi.components.usage
comp.lang.pascal.delphi.components.writing
Y stos son algunos de los grupos de noticias sobre Delphi de Borland:
borland.public.delphi.objectpascal
borland.public.delphi.database.desktop
borland.public.delphi.database.sqlservers
borland.public.delphi.ide
borland.public.delphi.components.using
xxxiii

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

Grupo de noticias/sitio web


En una categora especial debemos incluir el sitio web de Tamarack Associates (www.tamaracka.com). Este sitio mantiene un archivo actualizado
de todos los mensajes enviados a los grupos de noticias de Borland, y permite hacer sobre ellos bsquedas de palabras especficas, frases, fragmentos de cdigo, signaturas de mtodos, etc.

Grupos de Usuarios de Delphi


Visite http://www.borland.com/programs/usergroups/uglist.html#Delphi,
donde podr encontrar el Grupo de Usuarios de Delphi ms cercano a Ud.

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.

$2109 Cannot initialize the BDE


Posible causa de error
Puede haber distribuido utilizando InstallShield Express una aplicacin que
necesita el BDE, pero la entrada requerida no ha sido aadida al Registro de
Windows.

Los Tomos de Delphi: Delphi sin problemas

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.

$DENYPACKAGEUNIT <> cannot be put into a package


Posible causa de error
Puede estar intentando colocar una unidad compilada con la directiva
$DENYPACKAGEUNIT dentro de un paquete.

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.

$DESIGNONLY and $RUNONLY both specified


Posible causa de error
Puede haber utilizado las directivas de compilador $DESIGNONLY y
$RUNONLY al mismo tiempo. Estas directivas proveen una funcionalidad
opuesta, por lo que no pueden ser especificadas simultneamente.

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}

El valor por defecto para ambas directivas de compilador es desactivado (off).


En realidad, ambas directivas de compilador pueden ser especificadas simultneamente, pero si es as, al menos una de ellas debe estar desactivada (que es
de todas formas su estado por defecto).
La directiva de compilador {$DESIGNONLY ON} ocasiona que el archivo de
paquete (archivo .DPK) en el que sta aparece sea compilado para su instalacin dentro del entorno integrado de Delphi.
La directiva de compilador {$RUNONLY ON} ocasiona que el paquete (archivo
.DPK) sea compilado como un paquete de tiempo de ejecucin solamente.
Utilice ambas directivas de compilador $DESIGNONLY y $RUNONLY solamente en archivos .DPK.

$DESIGNONLY and $RUNONLY only allowed in package unit


Posible causa de error
Puede haber incluido la directiva de compilador $DESIGNONLY o
$RUNONLY (o ambas) en un archivo fuente que no es un archivo de paquete
(.DPK).

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).

Los Tomos de Delphi: Delphi sin problemas

$WEAKPACKAGEUNIT & $DENYPACKAGEUNIT both specified


Posible causa de error
Puede haber especificado ambas directivas de compilador
$WEAKPACKAGEUNIT y $DENYPACKAGEUNIT en el mismo archivo
fuente.

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.

$WEAKPACKAGEUNIT <> cannot have initialization or finalization


code
Posible causa de error
Puede haber utilizado la directiva de compilador $WEAKPACKAGEUNIT en
una unidad que tambin contiene una seccin Initialization o secciones
Initialization y 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}

$WEAKPACKAGEUNIT <> contains global data


Posible causa de error
Puede haber utilizado la directiva de compilador $WEAKPACKAGEUNIT en
una unidad que tambin contiene datos globales.

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.

; not allowed before Else


Posible causa de error
Puede haber colocado un punto y coma justo antes de la palabra reservada
Else en una sentencia If.

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:

Los Tomos de Delphi: Delphi sin problemas

if SunIsShining then
PlayBaseball; {causa el error}
else
PlayBasketballIndoors;

La forma correcta de hacer esto es:


if SunIsShining then
PlayBaseball {sin punto y coma, no hay error}
else
PlayBasketballIndoors;

<> already exists


Posible causa de error
Est intentando aadir como miembro de un objeto de automatizacin o biblioteca de tipos un procedimiento, funcin o propiedad que ya est declarada.

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.

<> clause not allowed in interface type


Posible causa de error
Puede estar utilizando en una declaracin de interfaz una clusula que no es
vlida para las interfaces. Por ejemplo, lo siguiente generar este mensaje de
error, debido a que la clusula Stored se utiliza para almacenar (o no) el valor
de un campo en un archivo .DFM de formulario, y no puede estar presente en
una propiedad de interfaz:
type
IXMLDOMDelouiseImplementation = interface(IDispatch)
['{2933BF8F-8B36-11D2-B20E-00C04F983E60}']
function hasFeature(const feature: WideString;
const version: WideString): WordBool; safecall;
function JR: Integer;
procedure OrvilleAndWilbur(iChihuahua: Integer);
property ValuesKeepSkyrocketing: Integer read JR
write OrvilleAndWilbur stored False;
end;

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.

<> directive not allowed in interface type


Posible causa de error
Puede estar utilizando en una declaracin de interfaz una directiva que no es
vlida para interfaces. Por ejemplo, lo siguiente generar este mensaje de error

Los Tomos de Delphi: Delphi sin problemas


debido a que Private se utiliza en las clases de Delphi como especificador de
visibilidad, y no es aplicable a tipos de interfaz:
type
IXMLDOMinicSardinaImplementation = interface(IDispatch)
['{2933BF8F-9B36-11D2-B20E-00C04F983E60}']
private
function Troiano(const feature: WideString;
const version: WideString): WordBool; safecall;
function GermanNovel: Integer;
procedure Richard(iChicago: Integer);
property ValuesKeepSkyrocketing: Integer read GermanNovel
write Richard;
end;

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.

<> expected but <> found


Posible causa de error
1. Basado en el cdigo anterior, el compilador estaba esperando encontrar
una cosa, pero se le ha proporcionado algo inesperado. Por ejemplo, puede
haber tratado de hacer una asignacin utilizando el signo igual (=), como
en BASIC, en lugar de dos puntos igual (:=), escribiendo algo parecido a:
ActiveControl = btnClose;

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

de asignacin, tendr que cambiar su manera de pensar. En Object Pascal,


= se utiliza slo para la comparacin y debe producir un resultado de tipo
Boolean (True o False). Por ejemplo, las dos siguientes sentencias que utilizan el operador = son vlidas, ya que ambas producen resultados Boolean.
if ActiveControl = btnClose then
BattenTheHatches := (ActiveControl = btnClose);

<> has no index for fields <>


Posible causa de error
1. Puede estar intentando cambiar el ndice de una tabla a un ndice que no
existe a travs de la propiedad IndexFieldNames, ya sea directamente en
tiempo de diseo o en el cdigo en tiempo de ejecucin. Por ejemplo, la
siguiente lnea:
Table1.IndexFieldNames := PeanutGallery;

provocar este error si la tabla no tiene un ndice sobre el campo


PeanutGallery.
2. Puede haber cambiado la propiedad TableName de un componente TTable,
y el valor de la propiedad IndexFieldNames estaba asignado para la tabla
anterior.

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

Los Tomos de Delphi: Delphi sin problemas

<> 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.

<> is a read-only file


Posible causa de error
1. Est intentando modificar un archivo que es de slo lectura.
2. Puede estar intentando grabar un archivo .PAS mientras trabaja con un
sistema de control de versiones (como PVCS) sin haber marcado (check out)
el archivo.

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.

<> is a reserved word


Posible causa de error
Puede estar intentando utilizar una palabra reservada de Object Pascal para
nombrar a un identificador.

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:

Palabras reservadas de Object Pascal


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.
Aunque Delphi no impide hacerlo, es aconsejable no nombrar los identificadores mediante alguna de las siguientes directivas de Object Pascal:

Directivas de Object Pascal


absolute, abstract, assembler, automated, cdecl, contains, default, dispid, dynamic, export, external, far, forward, implements, index, message, name, near,
nodefault, overload, override, package, pascal, private, protected, public,
published, read, readonly, register, reintroduce, requires, resident, safecall,
stdcall, stored, virtual, write, writeonly.

12

Los Tomos de Delphi: Delphi sin problemas


El lenguaje no hace distincin entre maysculas y minsculas en los identificadores y directivas.

<> is already in the Repository. Replace it?


Posible causa de error
Puede estar intentando aadir al Almacn de Objetos un objeto que ya existe.

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.

<> is already in use by <>


Posible causa de error
1. Puede estar intentando ver o editar la estructura de una tabla de base de
datos en el Database Desktop o ejecutar alguna otra operacin (o utilidad,
como las denomina el Database Desktop) mientras la tabla est abierta
todava.
2. Puede ser que uno o ms componentes TTable o TDatabase estn abiertos
en el entorno de desarrollo 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.

<> is an invalid filename


Posible causa de error
Puede haber asignado para un nombre de archivo una extensin que no es adecuada para el tipo de archivo con el cual est trabajando.

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).

<> is an invalid PageIndex value. PageIndex must be between 0 and


<>
Posible causa de error
Puede haber tratado de asignar a la propiedad PageIndex de un componente
TTabSheet un valor de ndice de pgina que no existe. Por ejemplo, puede
haber escrito un cdigo similar a este:
TabSheet1.PageIndex := 3;

cuando hay solamente tres pginas (con ndices 0, 1, y 2, pero no 3).

14

Los Tomos de Delphi: Delphi sin problemas

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.

<> is not a type identifier


Posible causa de error
Puede haber utilizado un tipo de datos que no existe en un procedimiento o
funcin. En todo caso, se esperaba un identificador de tipo en el lugar donde
ocurri el error, pero un nombre de tipo reconocido no fue encontrado all.

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;

{se debe declarar string, no str}


{se debe declarar integer, no int}
{sin embargo, esto est bien ...}
{...al igual que la forma larga}

<> is not a unique name


Posible causa de error
Puede haber intentado asignar un nombre que ya existe a una base de datos
mediante el Database Explorer o SQL Explorer (en la edicin Enterprise de
Delphi).

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.

<> is not a valid component name


Posible causa de error
Puede haber asignado a un componente un nombre que no es permitido en el
lenguaje Object Pascal.

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

Los Tomos de Delphi: Delphi sin problemas


Aunque es posible hacerlo sin recibir un mensaje de error, es aconsejable no
utilizar las siguientes directivas estndar de Object Pascal:
absolute, abstract, assembler, automated, cdecl, contains, default, dispid, dynamic, export, external, far, forward, implements, index, message, name, near,
nodefault, overload, override, package, pascal, private, protected, public,
published, read, readonly, register, reintroduce, requires, resident, safecall,
stdcall, stored, virtual, write, writeonly.
De forma similar, evite utilizar identificadores ya definidos en el lenguaje
Object Pascal (tales como Writeln, Exit, String, Word, etc.) para nombrar los
componentes.
No cambie los nombres de los componentes en tiempo de ejecucin. En otras
palabras, no cambie los nombres en el cdigo. Asigne nombres a componentes
solamente desde el entorno de desarrollo en tiempo de diseo (en el Inspector
de Objetos).

<> is not a valid date


Posible causa de error
Puede haber intentado almacenar una fecha invlida en un campo de una
tabla de base de datos, o convertir una fecha invlida de un formato de cadena
a un formato de fecha.

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

Si est utilizando Delphi 3 o superior, considere la utilizacin del componente


TDateTimePicker para obtener del usuario valores de tipo fecha. El componente TDateTimePicker no permite que el usuario seleccione fechas invlidas,
y de esta manera proporciona una solucin sin necesidad de escribir cdigo
alguno.
Si est utilizando Delphi 4 o superior, tenga en cuenta adems el componente
TMonthCalendar.

<> is not a valid date and time


Posible causa de error
Puede haber intentado convertir una fecha invlida desde una cadena de
caracteres al tipo TDateTime, o de alguna otra manera almacenar un valor
invlido en una variable de tipo TDateTime.

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}

Si convierte desde una cadena, utilice este formato:


var
TheDay: TDateTime;
begin
TheDay := StrToDateTime('18/11/2001 2:11 am');

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

Los Tomos de Delphi: Delphi sin problemas


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 := StrToDateTime(Edit1.Text);
except
on EConvertError do ...

<> is not a valid floating point value


Posible causa de error
Puede estar intentando convertir a un valor de punto flotante una cadena de
caracteres que no es reconocida como valor de punto flotante por el compilador.
Por ejemplo, si el cdigo es similar a ste:
var
Trouble: Double;
begin
Trouble := StrToFloat(Edit1.Text);

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

<> is not a valid floating point value for field <>


Posible causa de error
Puede estar intentando asignar algo que no es un valor de punto flotante a un
campo de punto flotante de una base de datos. Por ejemplo, el siguiente cdigo
generar este error si el usuario introduce la cadena Insuficiente en el control TDBEdit (dbedtSalary) y pulsa el botn (btnSalary):
procedure TfrmGetNosy.btnSalaryClick(Sender: TObject);
begin
tblPersonalInfo.FieldByName('Salary').AsFloat :=
dbedtSalary.Text;
end;

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).

<> is not a valid identifier


Posible causa de error
1. Puede haber pulsado un botn OK sin suministrar la informacin
necesaria.
2. Puede estar intentando grabar un archivo de unidad con una extensin distinta a .PAS o un archivo de proyecto con una extensin distinta a .DPR.

20

Los Tomos de Delphi: Delphi sin problemas

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.

<> is not a valid integer value


Posible causa de error
1. Puede estar intentando convertir una cadena de caracteres que no es reconocida como un valor entero a un tipo entero. Por ejemplo, si su cdigo es
similar a ste:
var
CountOfMonteCarlo: Integer;
begin
CountOfMonteCarlo := StrToInt(Edit1.Text);

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 ...

2. Pulse OK para continuar.

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.

<> is not a valid integer value for field <>


Posible causa de error
Puede estar intentando asignar algo que no puede ser interpretado como un
valor entero a un campo entero de una base de datos. Por ejemplo, el siguiente
cdigo generar este error si el usuario introduce Fig! en el control TDBEdit
(dbedtWaynesWorld) y pulsa el botn btnLoungeLizard:
procedure TfrmLilBigCity.btnLoungeLizardClick(Sender: TObject);
begin
tblAlteredCities.FieldByName(
'TimesIveBeenToRenoButDidNotSeeWayneNewton').AsInteger :=
dbedtWaynesWorld.Text;
end;

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

Los Tomos de Delphi: Delphi sin problemas

<> 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).

<> is not a valid time


Posible causa de error
Puede estar intentando convertir un valor invlido desde una cadena de caracteres a una variable TDateTime, o de algn otro modo intentando almacenar
un valor invlido en una variable TDateTime.

Solucin rpida
Asegrese de que el valor a convertir sea vlido.

Mensajes de error

23

S est almacenando directamente un valor en una variable TDateTime, utilice


este formato:
var
TheTimeOfOurLives: TDateTime;
begin
TheTimeOfOurLives := 0.8125;

S convierte desde una cadena, utilice este formato:


var
TheTimeOfOurLives: TDateTime;
begin
TheTimeOfOurLives := StrToTime('7:30 pm');

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

Los Tomos de Delphi: Delphi sin problemas

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.

<> must be saved before adding to Repository. Save now?


Posible causa de error
Puede estar intentando aadir al Almacn de Objetos un formulario que an
no ha sido guardado.

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.

<> or <> expected but <> found


Posible causa de error
1. Puede haber utilizado un parntesis donde debera haber un corchete, o
viceversa.
2. Puede haber utilizado un punto y coma donde debera haber un punto, o
viceversa.

Mensajes de error

25

3. Puede haber proporcionado una cantidad de argumentos errnea en una


llamada a procedimiento o funcin (en cuyo caso el compilador estar esperando una coma, en lugar de un parntesis derecho/de cierre).
4. Puede haber omitido el punto y coma de la lnea anterior.
5. Puede haber insertado algn cdigo entre las partes Unit e Interface de
una unidad. Por ejemplo, puede haber insertado ah una seccin Var y/o
Const.
6. Puede estar utilizando un archivo .PAS en el cual se ha omitido una palabra reservada necesaria, por ejemplo, Unit.
7. Puede haber intentado declarar un tipo en una seccin Var, de la siguiente
manera:
var
TForm1 = class(TForm)

En este caso, el mensaje de error especfico ser , or : expected but =


found.
8. Puede haber antepuesto el nombre de la unidad en lugar del nombre de la
clase a un mtodo (por ejemplo, escribiendo la signatura de un mtodo en
la parte Implementation como Unit1.ProcedureName, en lugar de
TForm1.ProcedureName).

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.

<> property out of range


Posible causa de error
Puede haber asignado un valor invlido a una propiedad de un control
TrackBar, ProgressBar, TabControl o PageControl. Por ejemplo, si asigna un
valor negativo a las propiedades TabHeight o TabWidth de un TabControl o
PageControl, obtendr este mensaje de error.

26

Los Tomos de Delphi: Delphi sin problemas

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.

{$R *.RES} missing or incorrect


Posible causa de error
Puede haber borrado o modificado la directiva de compilador $R del archivo de
proyecto (.DPR).

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.

(<>, <>, <>, <>) is not a valid DateMonthWeek quad


Posible causa de error
Puede haber llamado a la funcin IsValidDateMonthWeek (que apareci con
Delphi 6, en la unidad DateUtils), ya sea directa o indirectamente, y haberle
proporcionado un ao, mes, semana del mes, o da de la semana invlido.

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.

(<>, <>, <>) is not a valid DateWeek triplet


Posible causa de error
Puede haber llamado a IsValidDateMonthWeek (que apareci con Delphi 6, en
la unidad DateUtils), ya sea directa o indirectamente, y haberle proporcionado
un ao, semana del ao, o da de la semana invlido.

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.

16-Bit segment encountered in object file <>


Posible causa de error
Un segmento de 16 bits ha sido encontrado en el archivo objeto (.OBJ) enlazado al programa a travs de la directiva de compilador $L .

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

Los Tomos de Delphi: Delphi sin problemas

A class named <> is already installed


Posible causa de error
Puede haber intentado instalar un nuevo componente, pero un mensaje de
error (referente al cdigo de la unidad del componente, por ejemplo) se lo ha
impedido. Algunas veces parece que el componente est instalado a medias:
se ha instalado lo suficiente como para que Delphi piense que el componente
est instalado, pero no lo suficiente para que est disponible en la Paleta de
Componentes.
Por ejemplo, puede haber intentado instalar el control de calendario de Microsoft y habrsele informado que A class named TCalendar already exists.

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]);

3. Seleccione el componente en el cuadro de lista Components.


4. Pulse el botn Delete.
5. Solucione el problema del componente e intente instalarlo de nuevo (este
proceso se debe repetir tantas veces como sea necesario).

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.

A CoClass must have at least one default interface


Posible causa de error
Puede haber desmarcado la casilla que indica que una interfaz miembro de un
objeto CoClass es la interfaz por defecto del objeto.

Solucin rpida
Siga estos pasos:

Mensajes de error

29

1. Decida cul de las interfaces de la CoClass (si hay ms de una) quiere


designar como la interfaz por defecto.
2. Teniendo la CoClass afectada seleccionada en el panel izquierdo del Editor
de Bibliotecas de Tipos, seleccione la pgina Members en el panel derecho.
3. Si las interfaces no estn en la lista, pulse el botn derecho en la pgina
Members y seleccione Insert Interface.
4. Seleccione de la lista tantas interfaces como desee (utilice la combinacin
May./botn para seleccionar ms de una interfaz) y pulse el botn OK.
5. Seleccione la interfaz que quiera designar como interfaz por defecto para el
objeto CoClass.
6. Pulse con el botn derecho sobre la interfaz y active el elemento de men
Default.
Ahora puede guardar la biblioteca de tipos.

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.

A CoClass must implement at least one interface


Posible causa de error
Puede haber intentado guardar una biblioteca de tipos que contiene un objeto
CoClass sin ninguna interfaz asociada.

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

Los Tomos de Delphi: Delphi sin problemas


2. Pulse la pgina Members para activarla.
3. Pulse con el botn derecho en la pgina Members y seleccione la opcin
Insert Interface del men de contexto.
4. Seleccione la interfaz que desea aadir en el cuadro de dilogo Insert
Interface y pulse el botn OK.
Ahora puede guardar la biblioteca de tipos.

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.

A component class named <> already exists


Posible causa de error
Al crear un nuevo componente mediante el Asistente para Nuevos Componentes (File | New | Component o Component | New Component), puede
haber introducido en el cuadro de edicin Class Name el nombre de un componente que ya existe en su VCL. Por ejemplo, puede haber intentado utilizar el
nombre TBatchMove (que ya existe).

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.

A component named <> already exists


Posible causa de error
Puede haber intentado asignarle a un componente un nombre que ya existe.

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.

A component named <> already exists in a descendent form


Posible causa de error
Puede haber utilizado la caracterstica de herencia visual de formularios, disponible en Delphi a partir de la versin 2, y luego haber renombrado el formulario del cual ha heredado (o un componente de ese formulario) utilizando un
nombre de componente que ya est siendo utilizado en un formulario
descendiente.

32

Los Tomos de Delphi: Delphi sin problemas

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.

A connection with the server could not be established


Posible causa de error
Puede haber especificado el puerto equivocado en el URL, o ningn puerto en
absoluto, o est escuchando por el puerto equivocado en una aplicacin Site
Express.

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.

A device attached to the system is not functioning


Posible causa de error
1. Puede estar intentando instalar un paquete que requiere un archivo .DLL
que no est en el camino de bsqueda de Delphi. La DLL no encontrada
puede ser tambin una unidad de paquete.
2. El paquete puede haber sido compilado con una versin de Delphi diferente
de la que est utilizando.

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.

A dispinterface type cannot have an ancestor interface


Posible causa de error
Puede haber especificado una disp-interfaz (interfaz de automatizacin) como
ancestro para un tipo disp-interfaz.

34

Los Tomos de Delphi: Delphi sin problemas

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.

A dispinterface type requires an interface identification


Posible causa de error
Puede haber dejado de especificar un GUID en un tipo disp-interfaz.

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).

A field or method named <> already exists


Posible causa de error
Su archivo .PAS puede contener una referencia al objeto o mtodo que est
intentando aadir al formulario, pero no se encuentra la referencia correspondiente en el archivo .DFM de formulario. Por ejemplo, puede haber aadido el
botn Button1 a un formulario, luego haber borrado manualmente la referencia a Button1 del archivo de formulario (.DFM), y luego aadido otro botn al
formulario. Los archivos .DFM y .PAS no estn sincronizados, ya que el
archivo .PAS cree que hay dos controles TButton, mientras que el archivo
.DFM solamente conoce la existencia de uno.

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.

A module called <> is already installed


Posible causa de error
Puede estar intentando instalar un componente que anteriormente trat de
instalar sin xito.

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

Los Tomos de Delphi: Delphi sin problemas

A page must be empty before it can be deleted


Posible causa de error
Puede estar intentando eliminar una pgina de la Paleta de Componentes que
contiene todava componentes.

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.

A reference to <> already exists in the Type Library


Posible causa de error
Puede estar intentando crear un control ActiveX basado en un componente
VCL, y el nombre dado al control ActiveX ya ha sido utilizado.

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.

A required .DLL file, <>, was not found


Posible causa de error
Puede estar tratando de ejecutar un programa que ha sido compilado para utilizar paquetes de tiempo de ejecucin, y uno (o ms) de esos paquetes, por

38

Los Tomos de Delphi: Delphi sin problemas


ejemplo VCL30.DPL, no est instalado en la mquina o no est situado en el
directorio adecuado.

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.

A transaction is already active


Posible causa de error
Puede haber iniciado una transaccin en DBExpress mientras otra transaccin
ya estaba en curso. Por ejemplo, puede haber hecho una segunda llamada al
mtodo StartTransaction sin antes confirmar o deshacer la primera
transaccin.

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

Cuando se encierra un conjunto de operaciones sobre una base de datos en una


transaccin, se deben confirmar los cambios o deshacerlos al final de la ejecucin de las operaciones. Por ejemplo:
SQLConnection1.StartTransaction(1);
try
{Aqu las operaciones sobre la base de datos}
SQLConnection1.Commit(1);
except
SQLConnection1.Rollback(1);
end;

A user transaction is already in progress


Posible causa de error
Puede estar intentando iniciar una transaccin de base de datos mientras una
transaccin anterior est todava en curso. Por ejemplo, el siguiente cdigo ocasionar el mensaje de error bajo discusin:
begin
with Database1 do
begin
Connected := True;
StartTransaction;
try
Query1.Active := True;
StartTransaction; {borre esta lnea para evitar el error}
Commit;
except
Rollback;
end;
end;
end;

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

Los Tomos de Delphi: Delphi sin problemas

A value must be specified for <>


Posible causa de error
No se ha asignado valor a un campo de una tabla de base de datos que fue
especificado como obligatorio (en el momento en que la tabla fue diseada o
posteriormente mediante cdigo).

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

Si crea la tabla mediante cdigo, puede utilizar el mtodo FieldDefs.Add de


TTable y asignar el valor True al parmetro Required. Por ejemplo, si desea
crear cuatro definiciones de campo, estableciendo los dos primeros como obligatorios y los dos siguientes como opcionales, podra hacerlo de esta manera:
Table1.FieldDefs.Add('OfDreams', ftString, 20, True);
Table1.FieldDefs.Add('WC', ftBlob, 256, True);
Table1.FieldDefs.Add('DepthOf', ftInteger, 0, False);
Table1.FieldDefs.Add('Mrs', ftBytes, 32, False);

Los parmetros del mtodo Add son:


1. El nombre que se asigna al campo.
2. El tipo de datos que se asigna al campo.
3. El tamao del campo (0 en caso de que la eleccin del tamao no sea posible para el tipo de datos, como en el caso de un campo Integer)
4. El parmetro booleano Required, para indicar si el campo es obligatorio o
no.
Consulte TDataSet.FieldDefs en la ayuda de Delphi para ms informacin.
La validacin a nivel de tabla solamente, sin embargo, no evita que el usuario
introduzca un valor incorrecto del tipo de datos correcto. Por ejemplo, la introduccin de 15/10/1879 como fecha de nacimiento o de K6%l3^b6&n como el
apellido de un empleado ser aceptado como una entrada vlida (a menos que
se haya implementado algn cdigo defensivo para prevenir estos tipos de
errores).
La validacin a nivel de registro tambin se proporciona durante el diseo de
la tabla, cuando es posible designar un campo como clave primaria (Delphi
garantizar que no se introduzca el mismo valor para ese campo en dos registros diferentes), designar un campo como obligatorio (Delphi no permitir que
sea dejado en blanco), o asignar los valores mnimos o mximos que pueden ser
aceptados por el campo, etc.
La validacin a nivel de tabla y de registro es realizada por Delphi siempre que
usted intente moverse del registro que est insertando o modificando a otro
registro diferente. Si los valores de cualquiera de los campos violan las reglas
de validacin incorporadas a la base de datos, recibir los mensajes de error
apropiados en ese momento.
Si prefiere proporcionar la validacin a nivel de registro mediante cdigo, utilice el evento BeforePost de TDataSet (TTable, TQuery y TStoredProc son
todos descendientes de TDataSet que estn disponibles en todas las versiones
de Delphi; TClientDataset est disponible a partir de Delphi 3 y 4 edicin
Cliente/Servidor; TNestedTable apareci por primera vez en Delphi 4). Para
ms informacin, consulte TDataSet.BeforePost en la ayuda de Delphi.
Si lo desea, puede tambin proporcionar validacin a nivel de campo, que se
ejecuta inmediatamente despus de que se introduzca un valor para un campo

42

Los Tomos de Delphi: Delphi sin problemas


(al contrario de esperar hasta que los valores de todos los campos del registro
sean introducidos).
Para implementar la validacin a nivel de campo, puede utilizar el evento
OnValidate de la clase TField. Utilizando este evento, podr detectar un error
en la introduccin de datos inmediatamente, y no varios campos ms adelante.
Por ejemplo, he aqu un gestor de eventos que puede ser asignado a un evento
OnValidate de TField para impedir que un valor inapropiado sea introducido:
const
crlf = #13#10; {retorno/cambio de lnea}
...
procedure TForm1.Table1QuantityValidate(Sender: TField);
begin
if Table1Quantity.Value < 1 then begin
raise Exception.Create( Cada tem solicitado requiere' + crlf +
una cantidad de al menos 1.' + crlf +
De lo contrario, iremos a la quiebra' + crlf +
' y se quedar sin trabajo.');
Edit3.Color := clRed;
Edit3.SetFocus;
end;
end;

La excepcin que es creada al vuelo mediante la llamada a Exception.Create


evita que el valor sea introducido en el campo. Las dos siguientes lneas de
cdigo mueven el cursor al control en el que el usuario introdujo el valor y lo
resaltan en rojo, para que el usuario vuelva a introducir un valor adecuado.
Hay todava otra forma de implementar la validacin a nivel de campo: utilizando las propiedades CustomConstraint y ConstraintErrorMessage de TField.
CustomConstraint es una sentencia SQL que debe evaluarse a True para que
la entrada sea considerada vlida. ConstraintErrorMessage es el mensaje que
el usuario ver cuando la restriccin falle (la entrada no sea vlida).
Para utilizar estas dos propiedades para implementar la validacin mostrada
en el procedimiento Table1QuantityValidate, asigne a CustomConstraint el
valor x > 0 y a ConstraintErrorMessage el valor Cada tem requiere una cantidad de al menos 1. De lo contrario, iremos a la quiebra y se quedar sin
trabajo.
Existe tambin una propiedad de slo lectura llamada ImportedConstraint,
que muestra las restricciones creadas del lado del servidor (si est conectndose a un servidor SQL). No puede alterar esta propiedad, pero s puede aadir
nuevas restricciones a las importadas asignndole un valor a la propiedad CustomConstraint. Consulte en la ayuda de Delphi TField.CustomConstraint y
TField.ConstraintErrorMessage para ms informacin.
Si quiere una retroalimentacin an ms inmediata para los usuarios cuando
stos introduzcan datos, especialmente en el caso de datos que demanden un
formato muy preciso, puede utilizar la propiedad EditMask de TField. Esto se

Mensajes de error

43

conoce como validacin a nivel de caracteres. Mientras el evento OnValidate de


TField valida una asignacin de valor a un campo como un todo, la propiedad
EditMask de TField permite la validacin de los datos carcter a carcter en el
momento en que son introducidos por el usuario.
La propiedad EditMask proporciona muchas mscaras predefinidas para validar nmeros de telfono, cdigos postales, fechas y horas. Usted puede tambin
crear sus propias mscaras para los tipos especficos de entradas requeridas
por su aplicacin. Si asigna valor a un campo mediante programacin, la validacin establecida por EditMask no es realizada; en este caso, utilice el evento
OnValidate de TField para validar la entrada antes de que sea enviada a la
tabla. Para ms informacin, consulte TField.EditMask en la ayuda de
Delphi.
Si todas las posibles entradas vlidas para un campo son conocidas de antemano o estn contenidas en una tabla, otra manera efectiva de asegurar que
todas las entradas de usuario sean vlidas es utilizar los componentes
TDBLookupListBox y/o TDBLookupComboBox. De esta manera, se puede limitar a los usuarios a seleccionar uno de los posibles valores del campo. Para ms
informacin, consulte TDBLookupListBox y TDBLookupComboBox en la
ayuda de Delphi.

A Win32 API function failed


Consulte EOutOfResources.

Abstract method error


Posible causa de error
1. Puede estar intentando ejecutar un mtodo virtual abstracto. Por ejemplo,
puede haber creado un descendiente de TCustomGrid sin redefinir el
mtodo virtual abstracto DrawCell de TCustomGrid, y haber intentado llamar a ese mtodo.
2. De modo similar al punto anterior, puede estar intentando llamar a los
mtodos Delete o Insert de TStringGrid.

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

Los Tomos de Delphi: Delphi sin problemas


Y luego implemntelo, de esta forma:
procedure TGridIron.DrawCell(ACol, ARow: Longint;
ARect: TRect; AState: TGridDrawState);
begin
{Hgalo a su manera}
end;

2. No llame a los mtodos Delete o Insert de una rejilla de cadenas, ya que


estos mtodos virtuales abstractos no son redefinidos en la clase descendiente de TStrings (TStringGridStrings) que las propiedades Rows y
Columns utilizan.

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.

Abstract methods must be virtual or dynamic


Posible causa de error
Puede estar intentando declarar un mtodo abstracto, pero haber omitido la
directiva Virtual o Dynamic.

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}

Sin embargo, declarar un mtodo abstracto como el siguiente producir el error


bajo discusin:
procedure Extrapolate(Interpolate: Extended); abstract;

Mensajes de error

45

Para evitar el error, declare el mtodo de una de las siguientes formas:


procedure Extrapolate(Interpolate: Extended); virtual; abstract;
procedure Extrapolate(Interpolate: Extended); dynamic; abstract;

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.

Access violation (General Protection Fault)


Posible causa de error
Algunas veces parece ser que hay ms maneras de obtener una violacin de
acceso que partculas subatmicas en el universo. Este es un mensaje de error
bastante genrico, comn y serio.
1. Puede estar intentando hacer referencia a un objeto que no existe todava o
que ha dejado de existir. Por ejemplo, puede estar intentando abrir un
TTable en el evento OnCreate del formulario principal cuando el TTable
est localizado en un formulario o mdulo de datos que no ha sido creado
todava (preferentemente un mdulo de datos).
2. Puede haber creado un componente que hace referencia a otro componente
a travs de una de sus propiedades, pero ha olvidado redefinir el mtodo
Notification. Por esta razn, su componente puede seguir haciendo referencia a un componente ya inexistente si se elimina el componente al que la
propiedad de su componente hace referencia.
3. Puede haber colocado en el formulario un componente que no hace la llamada a Inherited en su constructor.
4. Puede haber publicado una propiedad del tipo de dato Real en un componente en Delphi 1, 2, o 3 (el tipo Real es admitido en los componentes en
Delphi 4 y posteriores, donde se implementan de una manera distinta a las
versiones anteriores de Delphi). Por ejemplo, el siguiente cdigo generar
el mensaje de error bajo discusin (anterior a Delphi 4):
unit NoRealityAllowed;
interface
uses WinTypes, WinProcs, Classes, Controls, Forms;
type
TDontGetReal = class(TWinControl)
private
FEstate: Real;
published
Estate: Real read FEstate write FEstate;
end;

5. Puede estar pasando un parmetro invlido a una llamada a la API de


Windows. Por ejemplo, puede estar pasando un puntero invlido como
parmetro de buffer.

46

Los Tomos de Delphi: Delphi sin problemas


6. Puede estar utilizando punteros y haber olvidado reservar la memoria
antes de acceder a ella travs de un puntero, o estar intentando hacer referencia a una zona de memoria que ya ha sido liberada.
7. Puede tener una configuracin del parmetro del BDE
SHAREDMEMLOCATION que es contradictoria con otros procesos.

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;

3. Si tiene acceso al archivo fuente del componente (*.PAS), asegrese de que


ste redefine el constructor de su ancestro de la siguiente forma:
public
. . .
constructor Create(AOwner: TComponent); override;
. . .
constructor TControl.Create(AOwner: TComponent);
begin
{Esto hace accesible a los mtodos y propiedades heredados
y reserva memoria para ellos}
inherited Create(AOwner);
. . .
end;

Mensajes de error

47

4. Si necesita utilizar un nmero de punto flotante en la seccin Published


del componente (en Delphi 1, 2, o 3), no utilice el tipo de datos Real; en
lugar de ello, utilice Single, Double, Extended o Comp.
5. Consulte la ayuda de la API de Windows para obtener informacin sobre la
funcin de la API y los parmetros y tipos de parmetros que espera. Si
necesita ms informacin de la que el archivo de ayuda ofrece (es un producto de Microsoft, no de Borland!), consulte Los Tomos de Delphi: Ncleo
del API Win32, de John Ayres y otros, editada en castellano por Danypress (http://www.danypress.com), que ofrece un enfoque orientado a Delphi
de las funciones de la API de Windows, con ejemplos especficos de cmo
utilizarlas desde Delphi.
6. Siempre reserve memoria antes de hacer referencia a ella a travs de un
puntero, y libere la memoria cuando termine de trabajar con ella. Por ejemplo, podra reservar cierta memoria en la seccin Initialization de la
unidad, y liberar la memoria en su seccin Finalization, de esta manera:
initialization
New(ptrOne);
New(ptrTwo);
. . .
finalization
Dispose(ptrOne);
Dispose(ptrTwo);
. . .
end;

Si est trabajando con Delphi 1, no dispondr de una seccin Finalization.


Tendr que liberar la memoria en cualquier otro lugar, o crear un procedimiento de salida, de esta manera:
procedure GarbageCollection; far;
begin
Dispose(ptrOne);
Dispose(ptrTwo);
. . .
end;
initialization
New(ptrOne);
New(ptrTwo);
. . .
AddExitProc(GarbageCollection);
end.

7. Si est ejecutando Windows 95/98, asigne a SHAREDMEMLOCATION un


valor entre $9000 y $FFFF; si es Windows NT/2000, entre $1000 y $7F00.

Informacin adicional
Para crear dinmicamente un formulario (y posteriormente destruirlo), siga
estos pasos:
a. Seleccione View | Project Manager.

48

Los Tomos de Delphi: Delphi sin problemas


b. Pulse el botn Options.
c. En el cuadro de lista Auto-Create Forms, seleccione el formulario que
desea crear dinmicamente.
d. Pulse el botn de flecha a la derecha, para mover el formulario a la
lista Available Forms.
e. Pulse el botn OK.
f. Modifique el cdigo que utiliz para mostrar el formulario de la
siguiente manera:
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 About antes de crearlo,


como en este caso:
AboutBox.ShowModal:
AboutBox := TAboutBox.Create(Application);
AboutBox.Free;

o si omite completamente la llamada a Create, provocar el mensaje de


error bajo discusin.
Es una buena idea crear dinmicamente los formularios en el cdigo,
especialmente cuando stos no son utilizados durante todo el tiempo
que el programa est en ejecucin. Si no crea los formularios
dinmicamente, stos sern automticamente creados por Delphi
durante el arranque de la aplicacin. Casi siempre querr que Delphi
cree automticamente el formulario principal, pero debera considerar
posponer la creacin de los dems formularios hasta tanto se necesiten.
7. Consulte BDE Initialization Error $2501.

Access violation at address <>.<> of address <>


Posible causa de error
Puede haber sobrescrito la pila manipulando directamente un puntero en lugar
del rea de memoria a la que l apunta. En otras palabras, puede haber olvidado derreferenciar un puntero. Por ejemplo, el siguiente cdigo provocar este
mensaje de error ( Read of address 00000000):
var
ptrBuf: Pointer; //o cualquier otro tipo puntero, como PChar
begin

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).

Ambiguous overloaded call to <>


Posible causa de error
Puede haber utilizado una combinacin de sobrecarga de mtodos y parmetros
por defecto (ambas caractersticas fueron introducidas en Delphi 4), y luego
haber hecho una llamada a procedimiento o funcin que podra corresponder a
varios de esos mtodos sobrecargados. Por ejemplo, si declara los siguientes
mtodos sobrecargados:
procedure PTBoat(I: Integer; J: Integer = 0); overload;
procedure PTBoat(Size: Integer); overload;
. . .

Y luego intenta llamar a uno de ellos de esta manera:


procedure TForm1.Button1Click(Sender: TObject);
begin
PTBoat(109);
end;

Obtendr este mensaje de error, ya que es imposible para el compilador determinar a cul de los dos procedimientos est llamando.

50

Los Tomos de Delphi: Delphi sin problemas

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.

Ancestor component not found


Posible causa de error
Puede haber cambiado un formulario que heredaba de otro tipo de formulario
(herencia visual) para hacerlo descendiente de un TForm genrico, y luego
haber seleccionado View As Text seguido de View As Form desde el men de
contexto del formulario. Por ejemplo, puede haber cambiado una declaracin de
tipo de un formulario de:
TFormMaintenanceScript = class(Tss_BaseStatusForm)

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

An error occurred while attempting to initialize the Borland


Database Engine (error <>)
Posible causa de error
Puede haber dejado de llamar a Sessions.OpenSession antes de llamar a una
funcin del BDE.

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 named <> is already on the search path


Consulte el mensaje Another file with the same base name (<>) is
already on the search path.

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

Los Tomos de Delphi: Delphi sin problemas


Si el archivo no es una nueva versin de un archivo existente, pero tiene el
mismo nombre de otro archivo ya existente (y desea conservar el archivo original en su biblioteca de componentes), simplemente cambie el nombre del nuevo
componente e intente instalarlo de nuevo.

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.

Application is not licensed to use this feature


Posible causa de error
Puede estar intentando ejecutar un programa de demostracin incluido en Delphi Cliente/Server (Enterprise) con la edicin Standard o Professional.

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

Los Tomos de Delphi: Delphi sin problemas


1. Seleccione Inicio | Configuracin | Panel de control | Agregar/Quitar Programas.
2. En la pgina Instalar/Desinstalar, seleccione la versin de Delphi que
tenga sobre su sistema.
3. Pulse el botn Aceptar y siga las indicaciones.
4. Reinstale Delphi Enterprise.

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.

Arithmetic Overflow Error


Posible causa de error
Puede estar intentando asignar a una variable entera un valor que supera la
capacidad de representacin del tipo entero. Por ejemplo, obtendr este error si
intenta asignar el valor 256 a un variable de tipo Byte.

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.

Array type required


Posible causa de error
Puede estar intentando aplicar un ndice a un identificador que no es un tipo
de array.

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

Los Tomos de Delphi: Delphi sin problemas

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;

El parmetro de cadena opcional es el mensaje de error que se despliega en


caso de que la asercin falle.

Assignment to FOR-Loop variable <>


Posible causa de error
Puede estar intentando asignar un valor a la variable de control de un bucle
For en cualquier versin de Delphi de 32 bits.

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

Lo siguiente, sin embargo, no es aceptable y producir el mensaje de error bajo


discusin:
procedure BadLoop(TimesToLoop: integer);
var
i: integer;
begin
for i := 0 to TimesToLoop do
i := i + IntToStr(i);
{No se permite asignar a la variable de control del bucle}
end;

Si quiere abandonar condicionalmente un bucle For en dependencia del valor


de la variable de control del bucle, compruebe el valor y llame al procedimiento
Exit o Break si desea abandonar el bucle. Puede hacer esto de la siguiente
manera:
procedure SimpleLoop(TimesToLoop: integer);
var
i: integer;
s: string[10];
begin
s := '';
for i := 0 to TimesToLoop do
begin
if i > 10 then
Break;
s := s + IntToStr(i);
end;
end;

Asynchronous socket error <>


Posible causa de error
Puede estar intentando establecer una comunicacin entre un componente
TClientSocket y un componente TServerSocket, pero ha olvidado asignar a sus
propiedades Port el mismo valor.

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

Los Tomos de Delphi: Delphi sin problemas

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;

Alternativamente, puede encerrar la lectura de OldValue en un bloque


Try. . . Except, as:
try
GeezerVal := OldValue;
except
MessageBox('No hay un valor anterior disponible);
Abort;
end;

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).

Bad argument type in variable type array constructor


Posible causa de error
1. Puede haber utilizado un procedimiento (que no devuelve ningn valor, y
por lo tanto no puede proporcionar el valor necesario) como argumento de
la funcin Format. Por ejemplo, el siguiente cdigo generar este mensaje
de error, ya que RaiseLastWin32Error es un procedimiento que potencialmente produce un mensaje de error (en lugar de devolver una cadena):

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)]);

2. Mueva la sentencia fuera de la seccin de argumentos. Por ejemplo, para


reparar el cdigo de arriba, haga esto:
StateAmountTypeCode := '';
. . .
if length(Trim(NYStateTaxWithheld)) > 0 then
StateAmountTypeCode := STATE_AMOUNT_TYPE_CODE;
VariableFormat := Format('%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s\',
[ SEGMENT_IDENTIFIER,
{3}
TaxPayerIdentification,
{4}
TAX_TYPE_CODE,
{5}
PayrollDate,
{6}
StateAmountTypeCode,
{7}
. . .

Informacin adicional
En todo jardn se cuelan algunos insectos.

60

Los Tomos de Delphi: Delphi sin problemas

Bad global symbol definition: <> in object file <>


Posible causa de error
Puede haber enlazado a su aplicacin un archivo objeto (.OBJ) que contiene
una definicin de un smbolo que no fue declarado en Pascal como un procedimiento externo. El smbolo puede haber sido declarado como variable.

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>

Por ejemplo, si quiere enlazar el archivo CBUILDER.OBJ (situado en el


camino de bsqueda de Delphi), podra introducir cualquiera de las dos directivas siguientes:
$L CBUILDER
$LINK CBUILDER

Si no incluye un camino en el nombre del archivo, Delphi buscar en el mismo


directorio del mdulo actual, seguido por los caminos especificados en Tools |
Environment Options | Library | Library Path.

Bad packaged unit format: <>.<>


Posible causa de error
El archivo nombrado en el mensaje de error puede estar corrupto. Podra ser el
resultado de una terminacin anormal del compilador durante la escritura del
archivo de paquete, tal vez como resultado de la prdida de energa en ese
momento.

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.

Bad unit format: <>


Posible causa de error
Un archivo de unidad compilada (.DCU) probablemente se ha daado.

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

Los Tomos de Delphi: Delphi sin problemas


2. Seleccione la pestaa apropiada en el cuadro de dilogo Install Component
(Into Existing Package o Into New Package), en dependencia de dnde
desea instalar el componente.
3. Pulse el botn Browse.
4. En el cuadro de dilogo Unit File Name, navegue y seleccione el archivo
.PAS.
5. Pulse el botn Open.
6. Pulse el botn OK en el cuadro de dilogo Install Component.
Si el archivo .DCU es un archivo de unidad compilada tradicional (no un
archivo de componente), siga estos pasos para recompilar el archivo fuente
(.PAS) y producir una nuevo archivo de unidad compilada (.DCU):
1. Borre el archivo .DCU (o muvalo a un lugar distinto del sitio donde reside
el proyecto al que pertenece).
2. Cargue el proyecto del cual es parte la unidad .PAS correspondiente.
3. Recompile el proyecto (F9).
Si recompilar el archivo fuente no resuelve el problema, puede que desinstalar
y volver a instalar Delphi s lo haga.

BDE Initialization Error $2501


Posible causa de error
Puede estar utilizando un componente TDatabase o TSession en una aplicacin
de mltiples capas, y necesita modificar los parmetros
SHAREDMEMLOCATION y/o SHAREDMEMSIZE.

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.

Bitmap image is not valid


Posible causa de error
1. Puede haber intentado cargar en la propiedad Picture de un componente
TImage un archivo que, aunque tiene una extensin .BMP, no es realmente
una imagen en formato BMP, o el archivo .BMP puede estar corrupto.
2. Puede que exista una falta de coordinacin entre el mapa de bits y la propiedad PixelFormat de Picture.Bitmap.
3. Puede estar intentando cargar un grfico BLOb de MS Access, MS SQL
Server o MS Fox Pro en un componente TDBImage.

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

Los Tomos de Delphi: Delphi sin problemas


procedure TWhatever.<DatasetName>AfterScroll(Dataset: TDataset);
const
LENGTH_OF_HEADER_INFO = 78;
var
bm: TBitmap;
bs: TBLObStream;
begin
bx := TBLObStream.Create(<TFieldName>, bmRead);
try
bs.Seek(LENGTH_OF_HEADER_INFO, soFromBeginning);
bm := Tbitmap.Create;
try
bm.LoadFromStream(bs);
DBImage.Picture.Graphic := bm;
finally
bm.Free;
end;
finally
bs.Free;
end;
end;

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.

Bits index out of range


Posible causa de error
Puede haber intentado hacer referencia a un elemento de un array de valores
de tipo Boolean mediante un ndice que es mayor que el tamao del objeto
TBits o menor que 0. Por ejemplo, ambas asignaciones a la variable little en el
siguiente fragmento de cdigo provocan este mensaje de error, ya que en la primera se intenta acceder a un elemento con un ndice que supera el tamao del
objeto TBits, y en la segunda se utiliza un ndice menor que 0:

Mensajes de error

65

procedure TForm1.BitsUnderOverExample(Sender: TObject);


var
kibbles: TBits;
little: Boolean;
begin
kibbles := TBits.Create;
try
kibbles.Size := 7;
little := kibbles.Bits[8];
little := kibbles.Bits[-1];
finally
Kibbles.Free;
end;
end;

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).

BLOb has been modified


Posible causa de error
1. Mltiples aplicaciones pueden estar accediendo a una tabla desde una
mquina que ejecuta Windows 95 con la versin 4.00.1111 o la versin
4.00.1113 del Redirector de Redes Virtuales de Microsoft (VREDIR.VXD).
2. Puede estar intentando mostrar el contenido de un campo BLOb (como por
ejemplo un campo memo con formato de Paradox) en un control
TDBRichEdit.

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

Los Tomos de Delphi: Delphi sin problemas


localizado en C:\Windows\System. Tambin puede descargar un archivo
actualizado del sitio web de Microsoft.
2. Utilice un campo Memo de Paradox (TMemo en Delphi) en lugar de un
campo Formatted Memo si desea mostrar el contenido del campo en un
control TDBRichEdit. Entonces podr mediante programacin formatear el
contenido del control TRichEdit.

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

Descendiente TField de Delphi

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

Break or Continue outside of loop


Posible causa de error
Puede estar llamando al procedimiento Break o Continue fuera de un bucle
For, While o Repeat.

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;

Para evitar el mensaje de error, encierre la llamada al procedimiento Break o


Continue dentro de un bloque Begin. . . End, as:
procedure SaturdayNightAtTheMovies;
begin
while WatchingMovie do
begin
EatPopcorn;
if TheaterCatchesFire then
Break; {ahora esto es parte del bucle}
end;
end;

Lo mismo, por supuesto, es aplicable al procedimiento Continue. Para ms


informacin sobre las sentencias For, While y Repeat, consulte writing loops
en la ayuda de Delphi.
Hay cuatro procedimientos de control del flujo que pueden ser utilizados en
diversas circunstancias: Continue, Break, Exit y Halt. Adicionalmente, la clase
TApplication ofrece un procedimiento Terminate.
Para explicar estos procedimientos en pocas palabras, diremos que Continue
provoca un salto a la prxima iteracin del bucle; Break transfiere el control
fuera del bucle; Exit transfiere el control fuera del procedimiento o funcin; y
Halt implica la terminacin del programa entero (como Application.Terminate).

68

Los Tomos de Delphi: Delphi sin problemas


Examinemos estos procedimientos con ms detalle:
Una llamada al procedimiento Continue devuelve el flujo de control al inicio de
la sentencia For, While o Repeat. En otras palabras, la prxima iteracin del
bucle se inicia inmediatamente cuando el procedimiento Continue es llamado.
Por ejemplo, observe el cdigo a continuacin:
function OneForTheThumb: Boolean;
var
i: integer;
begin
i := 0;
Result := False;
repeat
Play(RegularSeasonGames);
if not WinTheDivision then
Continue;
Play(Playoffs);
if not WinThePlayoffs then
Continue;
Play(ChampionshipGame);
if not WinTheChampionshipGame then
Continue;
i := i + 1;
until i = 5;
Result := True;
end;

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;

Una llamada al procedimiento Exit transfiere el control inmediatamente de


vuelta al procedimiento que llam al procedimiento actual, donde el programa
continuar a partir de la lnea siguiente a la llamada del procedimiento dentro
del que se llam a Exit.

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;

Una llamada al procedimiento Terminate de TApplication provoca un cierre


ordenado de la aplicacin, aunque sta no necesariamente se detendr inmediatamente. He aqu un ejemplo de cmo utilizar este procedimiento:
procedure StopInTheNameOfTheLaw;
begin
if YouNeedToShutDownTheApp then
Application.Terminate;
end;

Para ms informacin, consulte Application.Terminate en la ayuda de


Delphi.
Una llamada al procedimiento Halt ocasiona una terminacin anormal del programa y el retorno al sistema operativo. He aqu un ejemplo de cmo se usa
este procedimiento:
procedure StopInTheNameOfTheLaw;
begin
if YouNeedToQuitNowAndIMeanNow then
Halt; {Esto provocar la terminacin inmediata de su programa}
end;

La terminacin normal de un programa tiene lugar automticamente cuando


se cierra su formulario principal (no es necesaria ninguna llamada).

70

Los Tomos de Delphi: Delphi sin problemas

Breakpoint is set on line that may have been removed by the


optimizer or contains no debug information. Run anyway?
Posible causa de error
Puede estar intentando establecer un punto de ruptura sobre una lnea del
cdigo fuente para la cual el compilador no genera cdigo; por lo tanto, no
puede hacer una parada ah.

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;

Call to Application.CreateForm is missing or incorrect


Posible causa de error
Puede haber modificado la lnea del archivo de proyecto (.DPR) que contiene la
llamada a Application.CreateForm.

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;

o si ha obviado completamente la llamada a Create, provocar el mensaje


de error bajo discusin.
Es una buena idea crear dinmicamente los formularios mediante cdigo, especialmente si no son necesarios durante todo el tiempo de ejecucin de la
aplicacin. Si no crea dinmicamente sus formularios, todos sern creados

72

Los Tomos de Delphi: Delphi sin problemas


automticamente por Delphi cuando la aplicacin arranque. Siempre querr
que Delphi cree automticamente el formulario principal, pero podra posponer
la creacin de los dems formularios hasta el momento en que se necesiten.

Call to RegisterClass is missing or incorrect


Posible causa de error
Independientemente del texto del mensaje de error, la causa real del problema
puede ser que ha comentado o borrado el End final (el nico que debera terminar con un punto, en lugar de un punto y coma) en una unidad.

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).

Cant change value while socket is active


Posible causa de error
1. Puede estar intentando cambiar el valor de las propiedades Address, Host,
Port o Service de un componente TClientSocket mientras su propiedad
Active tiene asignado el valor True.
2. Puede estar intentando cambiar el valor de la propiedad Port o Service del
componente TServerSocket mientras su propiedad Active tiene asignado el
valor True.

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.

Cant compile Complib. Too many files in project


Posible causa de error
Puede tener demasiados archivos en el proyecto, o tenerlos situados en demasiadas localizaciones diferentes (directorios).

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.

Cant delete or change record. Since related record exists in table


=xxx, referential integrity rules would be violated
Posible causa de error
1. Puede estar intentando borrar o modificar un registro maestro que tiene
registros dependientes en otra tabla. En otras palabras, puede estar intentando modificar un valor de clave o borrar un registro del que otros
registros dependen.
2. Puede estar utilizando Access 95 e intentando hacer uso de la integridad
referencial. Lo ltimo es una buena idea, pero no cuando utilice Access 95.

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

Los Tomos de Delphi: Delphi sin problemas

Informacin adicional
Consulte referential integrity en la ayuda de Delphi.

Cant load [complib.dcl, cmplib32.dcl, vcl30.dpl, vcl40.bpl, vcl50.bpl,


vcl.bpl]
Posible causa de error
1. Puede haber movido o borrado el archivo mencionado en el mensaje de
error.
2. La VCL de Delphi puede haberse daado debido a cambios realizados en el
cdigo fuente de la VCL.
3. Puede haber intentado sin xito instalar un componente en su VCL.
4. Puede haber intentado instalar un componente que hace referencia a otro
componente o una DLL que no est disponible o no est en el camino de
bsqueda del ordenador.

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

Los Tomos de Delphi: Delphi sin problemas


vez en Delphi 3. Cuando se compilan los paquetes de tiempo de ejecucin, los
archivos .DPL/.BPL y .DCP son creados en diferentes lugares en dependencia
de la versin de Delphi que est utilizando. En Delphi 3, los archivos son grabados en el mismo directorio que el archivo de paquete (.DPK); en Delphi 4, el
.BPL se almacena en el mismo directorio que el paquete, y el .DCP en \Delphi4\Lib; en Delphi 5 y 6, ambos archivos son grabados en \Delphi
X\Projects\BPL. Copie el archivo .BPL desde all hacia el lugar apropiado
para el sistema operativo que est utilizando (\Windows\System en Windows
95/98, \WinNt\System32 en Windows NT/2000). Para ms informacin, consulte about packages en la ayuda de Delphi.
La mayora de los paquetes vienen en parejas para tiempo de ejecucin y
tiempo de diseo. Los paquetes runtime (de tiempo de ejecucin) contienen la
sustancia del cdigo, y permiten la compilacin de aplicaciones que utilicen
paquetes de tiempo de ejecucin. Los paquetes de tiempo de diseo contienen
los elementos especficos necesarios durante el diseo, tales como el icono del
componente, las unidades de registro, los editores de propiedades y los editores
de componentes. Los paquetes de tiempo de diseo contienen estas unidades
especficas, y necesitan el archivo .DCP del paquete de tiempo de ejecucin. En
otras palabras, un paquete de tiempo de ejecucin contiene el cdigo de tiempo
de ejecucin (!) y para su compilacin requieren de VCLX0.DCP (VCL50.DCP
para los paquetes de Delphi 5, VCL60.DCP para los paquetes de Delphi 6, etc).
Los paquetes de tiempo de diseo contienen el cdigo especfico de tiempo de
diseo (*REG.PAS, *REG.DCR, etc.) y requieren el archivo .DCP creado
cuando el paquete de tiempo de ejecucin es compilado.
Nota: No instale un paquete de tiempo de ejecucin pulsando el botn Install
despus de compilar. El botn Install en el editor de paquetes es slo para paquetes
de tiempo de diseo. Una vez que haya registrado un componente en Delphi al
instalarlo, no podr instalar otro componente con ese nombre en otro paquete. En
otras palabras, instalar el paquete de tiempo de ejecucin le impedir instalar el
paquete de tiempo de diseo (que es lo que realmente quiere hacer).

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

Eliminar el paquete de la lista de paquetes de tiempo de diseo (Component


| Install packages, seleccione el paquete correspondiente, pulse el botn
Remove, y responda Yes al mensaje de confirmacin), y luego volverlo a aadir desde su nueva localizacin.

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.

Cant write .EXE file. Disk full?


Posible causa de error
Puede no tener suficiente RAM o memoria virtual disponible.

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

Los Tomos de Delphi: Delphi sin problemas


1.
2.
3.
4.
5.

Seleccione Inicio | Configuracin | Panel de Control.


Haga doble clic sobre el icono Sistema.
Seleccione la pgina Rendimiento.
Pulse el botn Memoria Virtual.
Marque el botn de radio Permitir que Windows administre la configuracin de memoria virtual.

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.

Cannot assign to a read-only property


Posible causa de error
Puede estar intentando asignar un valor a una propiedad de slo lectura.

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;

Si declara una propiedad como ScottFitzgerald (que es una propiedad de slo


lectura, ya que no incluye un especificador Write en su declaracin), y luego
intenta escribir en ella, de la siguiente forma:
ScottFitzgerald := 'Los millonarios son diferentes a usted y a m';

obtendr el mensaje de error bajo discusin.

Cannot break, continue, or exit out of a finally clause


Posible causa de error
Puede haber colocado una llamada a Break, Continue o Exit en la parte
Finally de una sentencia Try. . . Finally.

Solucin rpida
Elimine la llamada que causa el problema de la parte Finally de la sentencia
Try. . . Finally.

80

Los Tomos de Delphi: Delphi sin problemas

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.

Cannot change the size of an icon


Posible causa de error
Puede estar intentando cambiar el tamao de un icono. Por ejemplo, el
siguiente cdigo generara este error:
Image1.Picture.Icon.Width := 23;

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.

Cannot change Visible in OnShow or OnHide


Posible causa de error
1. Puede haber intentado cambiar el valor de la propiedad FormStyle de un
formulario en sus eventos OnActivate u OnShow. Por ejemplo, lo siguiente
generar el mensaje de error bajo discusin:
procedure TForm1.FormShow(Sender: TObject);
begin

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;

Si quiere que el formulario aparezca en pantalla y obligue al usuario a emitir


una respuesta en l antes de que pueda continuar trabajando con los dems
formularios, puede hacerlo as:
procedure TForm1.Button12Click(Sender: TObject);
begin
Form3.ShowModal;
end;

ShowModal mostrar el formulario modalmente, de forma similar a un cuadro


de dilogo, y exigir que el usuario le d respuesta y lo cierre antes de poder
continuar trabajando con otros formularios. Un ejemplo de este tipo de

82

Los Tomos de Delphi: Delphi sin problemas


formularios o cuadros de dilogo son los componentes de Delphi que encapsulan los cuadros de dilogo comunes de Windows, que estn situados en la
pgina Dialogs de la Paleta de Componentes (TOpenDialog, TSaveDialog, etc.).
Puede tambin crear formularios dinmicamente, en el momento en que sean
necesarios. Esto ayuda a conservar los recursos del sistema y es especialmente
til cuando se tienen formularios que podran no ser utilizados en una ejecucin dada de la aplicacin, como por ejemplo un cuadro Acerca de.
Para crear un formulario dinmicamente, 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 haya utilizado para mostrar el formulario a lo
siguiente:
procedure TForm1.Button12Click(Sender: TObject);
begin
Form3 := TForm3.Create(nil);
try
Form3.ShowModal;
finally
Form3.Free;
end;
end;

Cannot complete a class with incomplete methods implementations


Posible causa de error
Puede haber intentado invocar la caracterstica de completamiento de cdigo
(Code completion) cuando la unidad tena un error de sintaxis.

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

Cannot connect, <> must contain a valid ServerName or


ServerGUID
Posible causa de error
Puede haber intentado asignar True a la propiedad Connect de un componente
TDCOMConnection, TMIDASConnection o TRemoteServer sin haber especificado un valor vlido para la propiedad ServerName o ServerGUID.

Solucin rpida
Introduzca un GUID vlido en la propiedad ServerGUID con este formato:
98ED7140-EE18-11D3-A238-80584EC12700

o introduzca el nombre de un servidor registrado en la propiedad ServerName.

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.

Cannot connect to database <>


Posible causa de error
Puede haber intentado conectarse a una base de datos por uno de los siguientes mtodos:
a. Ha intentado asignar True a la propiedad Connected de un componente
TDatabase, en tiempo de diseo o en tiempo de ejecucin (por cdigo).
b. Ha llamado al mtodo Open de un componente TDatabase o TTable.
c.

Ha intentado asignar True a la propiedad Active de un TTable, en


tiempo de diseo o en tiempo de ejecucin (por cdigo), y luego ha
pulsado el botn Cancel en respuesta al cuadro de dilogo Database
Login (Conexin a Base de Datos).

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

Los Tomos de Delphi: Delphi sin problemas


Para asignar la contrasea mediante cdigo, aada una lnea como la siguiente
antes de acceder a la base de datos (por ejemplo, en el evento OnCreate del formulario o mdulo de datos):
Session.AddPassword('Kennwort');

Para asignar la contrasea utilizando la seccin Parameter Overrides del


editor del componente TDatabase, siga estos pasos:
1. Haga doble clic sobre el componente TDatabase.
2. Verifique que se muestran el Alias de la base de datos y el nombre de
usuario (Name) correcto.
3. Desmarque la casilla de verificacin Login Prompt.
4. Pulse el botn Defaults.
5. Aada la contrasea en la lnea Password= en el cuadro de lista Parameter Overrides.
Alternativamente, puede proporcionar un manejador para el evento OnLogin
del componente TDatabase. Para ms informacin, consulte OnLogin en la
ayuda de Delphi.

Cannot copy a Repository Project to a directory underneath itself


Posible causa de error
Puede haber intentado copiar un proyecto que ha seleccionado del Almacn de
Objetos (Repository) a un directorio que est bajo el directorio en que el proyecto del Almacn reside.

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

Cannot create cursor handle


Posible causa de error
1. Puede haber intentado llamar al mtodo Open de un componente TQuery
cuando la sentencia SQL no devuelve un conjunto de valores. Por ejemplo,
lo siguiente producira este mensaje de error:
with Query1.SQL do
begin
Add('INSERT (LastName) VALUES');
Add('(Murray)');
Add('INTO RBIHRKINGS');
Open; {Reemplace esto por ExecSQL para que funcione}
end;

2. La propiedad SQL del componente TQuery puede estar vaca.

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.

Cannot create file <>


Posible causa de error
1. Puede haber intentado grabar un archivo en una localizacin que no existe
utilizando el mtodo SaveToFile. Por ejemplo, puede haber intentado hacer
esto:
Image1.Picture.SaveToFile('C:\dotbumps\road.BMP');

sin que exista un directorio llamado dotbumps en la unidad C.


2. Puede haber intentado modificar y luego guardar un archivo de slo lectura
utilizando el mtodo SaveToFile. Por ejemplo, si el archivo
SNAPSHOT.TXT es de slo lectura, lo siguiente generara el mensaje de
error bajo discusin:
var
Annotate: TStrings;
. . .

86

Los Tomos de Delphi: Delphi sin problemas


Annotate := TStringList.Create;
try
Annotate.LoadFromFile('C:\standing\snapshot.txt');
Annotate.Add('Siendo las ' + DateTimeToStr(Now) +
', los resultados son los siguientes...');
. . .
Annotate.SaveToFile('C:\standing\snapshot.txt');
finally
Annotate.Free;
end;
. . .

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');

2. Asegrese de que el archivo en el que intenta escribir no est protegido


contra escritura (slo lectura).

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;

Cannot create form. No MDI forms are currently active


Posible causa de error
1. Puede haber intentado crear un formulario hijo MDI (un formulario que
tiene la propiedad FormStyle asignada a fsMDIChild) antes de que el formulario principal (su padre, con el valor fsMDIForm en la propiedad
FormStyle) haya sido creado.
2. Puede haber designado un formulario como hijo MDI configurando su propiedad FormStyle a fsMDIChild mientras la propiedad FormStyle del
formulario principal no ha sido configurada a fsMDIForm.

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

Los Tomos de Delphi: Delphi sin problemas

Cannot create Window


Posible causa de error
1. Puede estar utilizando una cantidad excesiva de controles TEdit y
TComboBox, y se est quedando sin espacio en el heap local. Estos controles utilizan el heap local para almacenar su contenido.
2. Puede tener una cantidad excesiva de descendientes de TWinControl en la
aplicacin, y estarse quedando sin manejadores de ventana (handles)
disponibles.
3. Puede haber experimentado anteriormente un fallo del sistema, y la memoria no fue liberada, por lo que la cantidad de memoria disponible para
crear nuevas ventanas est limitada.

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.

Cannot debug project unless a host application is defined. Use the


Run|Parameters. . . dialog box
Posible causa de error
1. Puede haber creado un ActiveForm o biblioteca ActiveX e intentado ejecutarla sin especificar la aplicacin desde la que se accede a la biblioteca.
2. Puede haber intentado ejecutar directamente una .DLL seleccionando la
opcin Run | Run o pulsando la tecla F9.

Solucin rpida
1. Siga estos pasos:

Mensajes de error

89

a. Seleccione Run | Parameters.


b. En el cuadro de combinacin Host Application, puede:
Seleccionar la aplicacin principal (host application) de la lista.
-OIntroducir el camino de la aplicacin principal.
-ONavegar hasta la aplicacin principal utilizando el botn Browse.
2. En Delphi 4 y superiores, puede aadir una .DLL a un proyecto seleccionando Project | Add to Project. . . , y luego ejecutar indirectamente la
.DLL ejecutando el .EXE que la llama. Para ms informacin, consulte
Project Manager, remote debugging y Resource .DLLs en la ayuda de
Delphi.

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.

Cannot enable AutoSessionName property with more than one


session on a form or data module
Posible causa de error
Puede haber intentado asignar True a la propiedad AutoSessionName de un
componente TSession cuando hay uno o ms componentes TSession adicionales
en el formulario o mdulo de datos.

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

Los Tomos de Delphi: Delphi sin problemas


generadas en tiempo de ejecucin tengan nombres nicos) slo cuando se utiliza un nico componente TSession.
Cuando la propiedad AutoSessionName tiene el valor False (como debe ser en
caso de que haya ms de un componente TSession sobre un formulario), usted
es el responsable de asignar un nombre de sesin a travs de la propiedad
SessionName, ya sea en tiempo de diseo o en tiempo de ejecucin (en el
cdigo).
Para ms informacin sobre las restricciones a tener en cuenta cuando se trabaja con componentes TSession, consulte Cannot modify SessionName
while AutoSessionName is enabled.

Cannot find <> on the search path


Posible causa de error
Puede haber intentado ver el cdigo fuente de una unidad en el Package Editor
(Editor de Paquetes), pero esta no est en el camino de bsqueda de Delphi.

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

Cannot find Engine configuration file


Posible causa de error
Puede que IDAPI.CFG (Windows 3.x) o IDAPI32.CFG (Windows/Delphi de 32
bits) no pueda ser encontrado donde debera estar.

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

Los Tomos de Delphi: Delphi sin problemas

Cannot find implementation of method <>


Posible causa de error
Puede haber borrado (o comentado) un mtodo de la seccin Implementation
sin borrar la declaracin del mtodo en la seccin Interface, dejando una referencia a l en la pgina de eventos del Inspector de Objetos. Luego intent volver a crear el gestor de eventos pulsando dos veces sobre la columna derecha
de la pgina de eventos (Events) del Inspector de Objetos (o sobre un objeto
para crear un gestor para su evento por defecto).

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.

Cannot find server


Posible causa de error
Puede haber especificado incorrectamente el nmero de puerto en un URL, o
ningn puerto en absoluto, o est escuchando por un puerto incorrecto en su
aplicacin Site Express.

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

Localhost es su mquina (IP #127.0.0.1); est intentando conectarse al puerto


1024 y ejecutar la aplicacin Svrinfo.
Site Express hizo su aparicin en Delphi 6.

Cannot focus a disabled or invisible window


Posible causa de error
1. Puede haber intentando llamar al mtodo SetFocus para un control cuya
propiedad Visible o Enabled tienen el valor False. Por ejemplo, si no hay
ningn texto seleccionado en el componente RichEdit1, lo siguiente generar este mensaje de error:
procedure DisableAndFocus(Sender: TObject);
begin
Button1.Enabled := RichEdit1.SelLength > 0;
... {Otro procesamiento}
Button1.SetFocus;
end;

Lo mismo sucedera si la propiedad Visible estuviera siendo comprobada de


una manera similar y su valor fuera False. Por ejemplo, en caso de que no
hayan datos de texto en el portapapeles, el siguiente cdigo generara el
mensaje de error bajo discusin:
procedure HideAndFocus(Sender: TObject);
begin
Button1.Visible := Clipboard.HasFormat(CF_TEXT);
... {Otro procesamiento}
Button1.SetFocus;
end;

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

Los Tomos de Delphi: Delphi sin problemas

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.

Cannot hide an MDI Child Form


Posible causa de error
Puede estar intentando esconder un formulario hijo MDI de cualquiera de las
siguientes maneras:
procedure TMDIChild.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caHide; { el valor por defecto es caMinimize }
end;
procedure TMDIChild.Button1Click(Sender: TObject);
begin
Hide; {puede mostrarlo, pero no puede esconderlo}
end;
procedure TMDIChild.Button1Click(Sender: TObject);
begin
Visible := False; {esto hace lo mismo}
end;

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;

Cannot inherit from form <>. It contains a component with a blank


name property
Consulte Error Creating Form: Cannot inherit from form <>. It contains a component with a blank name property.

Cannot initialize local variables


Posible causa de error
Puede haber intentado asignar un valor a una variable local en el momento de
su declaracin. Por ejemplo, lo siguiente generar el mensaje de error bajo
discusin:
procedure TForm2.Button1Click(Sender: TObject);
var
ThisIsThis: Boolean = True;
. . .

Lo siguiente tambin generar el mensaje de error bajo discusin (a pesar del


texto del mensaje de error, que hace parecer que ste solamente se produce en
una seccin Var):
procedure TForm2.Button1Click(Sender: TObject);
const
ThisIsThis: Boolean = True;
. . .

Solucin rpida
No asigne valores a las variables en la seccin Var de un procedimiento o
funcin.

96

Los Tomos de Delphi: Delphi sin problemas


No asigne un tipo de datos a una constante en la seccin Const de un procedimiento o funcin.
Para inicializar la variable ThisIsThis con el valor True (como se intenta en el
procedimiento de arriba), proceda de la siguiente forma:
procedure TForm2.Button1Click(Sender: TObject);
var
ThisIsThis: Boolean;
begin
ThisIsThis := True;
. . .

O de esta forma, si es que el valor nunca cambiar:


procedure TForm2.Button1Click(Sender: TObject);
const
ThisIsThis = True;
. . .

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

Cannot initialize multiple variables


Posible causa de error
Puede estar intentando declarar ms de una variable inicializada (o constante
con tipo) utilizando una asignacin. Por ejemplo, lo siguiente generar el mensaje de error bajo discusin:
interface
const
QueSeraSera, WhateverWillBeWillBe: Boolean = True;
. . .

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.

Cannot initialize thread local variables


Posible causa de error
Puede estar intentando asignar un valor inicial a una variable local de hilo
(declarada mediante la palabra reservada Threadvar). Por ejemplo, lo siguiente
generar este mensaje de error:
threadvar
Threadbare: Byte = 7;

98

Los Tomos de Delphi: Delphi sin problemas

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;

Cannot Load IDAPI Service Library


Posible causa de error
1. Si est utilizando el controlador del BDE para MS Access, y Access 95 o
Microsoft Office 95 no fueron utilizados para instalar el motor DAO, es
posible que falte una entrada necesaria en el Registro.
2. Puede que IDPROV32.DLL no est situado en la localizacin esperada.
3. Si obtiene este mensaje de error en una aplicacin de mltiples capas, es
posible que STDVCL[32,40].DLL y/o DBCLIENT.DLL no estn registradas
en el servidor.
4. El Registro del sistema puede estar configurado como de slo lectura.
5. Puede estar intentando acceder a tablas de Access, pero el motor DAO de
Microsoft no est instalado en el sistema (o est instalada una versin
antigua de l).
6. Una DLL requerida por el BDE puede estar ausente o daada.

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

b. Introduzca regedit en el cuadro de combinacin Abrir y pulse el botn


Aceptar.
c. Navegue hasta
HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\DAO.
d. Pulse con el botn derecho sobre la entrada Path, seleccione Modificar
en el men de contexto, y luego asigne en el cuadro de edicin que
aparece la localizacin de DAO3032.DLL.
Localice el archivo IDPROV32.DLL, y muvalo al directorio del BDE en el
servidor. La localizacin por defecto es: C:\Archivos de programa\Borland\Common files\BDE.
Verifique que IDPROV32.DLL est situada en el directorio de DLLs del
BDE (como est especificado en WIN.INI o el Registro del sistema, segn el
sistema operativo de que se trate). Adicionalmente, DBCLIENT.DLL y
STDVCL[32,40].DLL deben estar instalados en el directorio de sistema de
Windows y registrados.
Modifique el estado general del Registro del sistema a lectura/escritura, o
al menos la entrada correspondiente para la .DLL en cuestin.
Instale el motor DAO, y luego aada la entrada para el controlador de
Access incluido en su versin de DAO, utilizando la utilidad de Configuracin del BDE (Configuration | Drivers | Native | MSAccess |
DLL32), por ejemplo, IDDA3532.DLL.
Si no est utilizando la ltima versin del BDE, descrguela del sitio
www.borland.com. Ejecute la utilidad de Configuracin del BDE y modifique la entrada correspondiente al controlador de Access de IDDAO32.DLL
a IDDA3532.DLL (o cualquiera que sea la versin ms reciente del controlador de Access).
Verifique que ha realizado una instalacin completa del BDE y de todo el
software cliente que sea necesario para conectarse a la base de datos que
est utilizando.

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

Los Tomos de Delphi: Delphi sin problemas

Cannot load IDAPI[32].DLL


Posible causa de error
1. Pueden faltar uno o ms archivos del BDE. O puede que el BDE no haya
sido instalado en absoluto.
2. El BDE puede no estar correctamente configurado. Uno de los posibles problemas es que haya una entrada incorrecta en WIN.INI (Delphi 1) o en el
Registro del sistema (Delphi de 32 bits) para la clave CONFIGFILE01.
3. Puede haber realizado slo una instalacin parcial del BDE.
4. Puede haber utilizado InstallShield Express para instalar una aplicacin
que utiliza el BDE, y no haber aadido la entrada correspondiente al
camino de las .DLLs del BDE en el Registro del sistema.

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

Si el camino de la DLL en WIN.INI corresponde al valor C:\IDAPI, pero


IDAPI.DLL est situada en otro sitio, mueva IDAPI.DLL al lugar asignado en
WIN.INI, o modifique la configuracin en WIN.INI para que apunte al camino
donde reside IDAPI.DLL.

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

IDAPI32.DLL est en otro sitio, mueva IDAPI32.DLL al lugar configurado en


el Registro o cambie la configuracin del Registro para que indique el camino
donde reside IDAPI32.DLL.
3. Reinstale el BDE, seleccionando Full install.
4. Edite el Registro del sistema, como se indica en Informacin adicional.
Introduzca el camino de acceso a IDAPI32.DLL en el parmetro DLLPATH
(por defecto C:\Archivos de programa\Borland\Common files\BDE).

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.

Cannot load language driver


Posible causa de error
Su controlador de lenguaje podra estar ausente, o la entrada del Registro
podra ser incorrecta.

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

Los Tomos de Delphi: Delphi sin problemas


Si el controlador de lenguaje apropiado (.BLL) est ausente, cpielo desde el
CD-ROM de Delphi al lugar indicado arriba.

Informacin adicional
Nota:

Este es el error de inicializacin del BDE $3E06.

Cannot load package <>. It contains unit <> which is also


contained in package <>
Posible causa de error
1. Puede estar intentando cargar un paquete que contiene una unidad que ya
est presente en su biblioteca.
2. Puede estar intentando recompilar un paquete existente despus de instalar en l un componente que ya est contenido en la VCL.

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.

Cannot locate IDAPI[01,32].DLL


Posible causa de error
Puede haber optado por una instalacin parcial cuando instal Delphi.

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

Si no hay una entrada [IDAPI], o estn ausentes los valores de configuracin


para DLLPATH y/o CONFIGFILE01, adalos para que apunten a las ubicaciones de las DLLs de IDAPI (IDAPI01.DLL, etc.) y al archivo IDAPI.CFG,
respectivamente.

104

Los Tomos de Delphi: Delphi sin problemas


Si parece que las entradas son correctas, mueva los archivos a la localizacin
indicada por las entradas, o modifique las entradas en concordancia con la ubicacin de los archivos.

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.

Como crear un Alias utilizando la herramienta de configuracin de BDE


En Delphi 1, la herramienta de configuracin del BDE es BDECFG.EXE. En
Delphi 2, es BDECFG32.EXE. A partir de Delphi 3 es BDEADMIN.EXE. En
cualquier versin, debe estar disponible seleccionando Inicio | Programas |
Borland Delphi X | BDE [Configuration, Administrator]. Alternativamente, usted puede aadirlo al men Tools de Delphi para acceder rpidamente a l mientras trabaja en Delphi (Tools | Configure Tools | Add).
Para crear un alias con la herramienta de Configuracin del BDE, siga estos
pasos:
1. Seleccione Inicio | Programas | Borland Delphi X | BDE [Configuration, Administrator].
2. Teniendo activa la etiqueta Databases y el elemento Databases seleccionado en la vista jerrquica, seleccione Object | New. . . .
3. Compruebe que el parmetro Type corresponda al tipo de la base de datos
que haya creado o crear (Standard para Paradox, dBASE, y ASCII;
Access para MS Access, etc.).
4. Si seleccion el controlador Standard (para crear una base de datos Paradox, por ejemplo), asigne la ubicacin de la base de datos al parmetro
Path (ServerName para InterBase y Oracle; Database Name para MS SQL
Server, MS Access, Sybase, e Informix; DB2 DS2 para DB2). Si utiliza
Path, puede introducir un camino DOS, como:
K:\HallOfFame\Baseball

o, en Delphi de 32 bits, puede utilizar el formato UNC (Convenio Universal


de Nombres), con el formato:
\\ServerName\ShareName\ShareDir

Mensajes de error

105

Cannot make a visible window modal


Posible causa de error
Puede haber llamado al mtodo ShowModal de un formulario que ya estaba
desplegado.

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

Los Tomos de Delphi: Delphi sin problemas

Cannot modify a read-only dataset


Posible causa de error
Puede estar intentando editar un componente TTable cuya propiedad
ReadOnly tiene el valor True.

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;

Cannot modify SessionName while AutoSessionName is enabled


Posible causa de error
Puede estar intentando asignar un nuevo valor a la propiedad SessionName de
un componente TSession cuando su propiedad AutoSessionName tiene el valor
True.

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.

Cannot open component library <Path>\Complib.dcl


Posible causa de error
Puede haber instalado un componente que se enlaza estticamente a una .DLL
que no puede ser encontrada.

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.

Cannot open file <>


Posible causa de error
1. Puede estar intentando abrir un archivo cuyo contenido no est en el formato adecuado. Por ejemplo, si intenta cargar un archivo que se espera que
contenga un grfico, y en realidad es un archivo de texto, obtendr este
mensaje de error.
2. Puede estar intentando abrir un archivo que no existe, utilizando el mtodo
LoadFromFile (o al menos, el fichero no existe en la ubicacin que ha
especificado).

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

Los Tomos de Delphi: Delphi sin problemas

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.

Cannot open module because it is a dependent of <>, which is open


as text
Posible causa de error
Mientras est intentando compilar un proyecto, puede tener un archivo de formulario abierto (.DFM) como texto.

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.

Cannot optimize. Not an .exe


Posible causa de error
Puede estar escaso de espacio de disco o memoria RAM.

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.

Cannot override a static method


Posible causa de error
Puede haber aadido la directiva Override a un mtodo que no ha sido declarado como Virtual en la clase ancestro.

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

Los Tomos de Delphi: Delphi sin problemas


end;

Se puede redefinir los mtodos WorkHard, PlayHard, StudyHard y RunHard,


pero no el mtodo Leotard, ya que es un mtodo esttico (por defecto). Podr
crear un mtodo con ese mismo nombre en la clase descendiente, pero tendr
que abstenerse de asociarle la directiva Override, y el nuevo mtodo no heredar la funcionalidad del mtodo de igual nombre en la clase ancestro.
De esta manera, lo siguiente es permitido en la clase descendiente:
type
AA = class(A)
procedure WorkHard; override;
procedure PlayHard; override;
procedure StudyHard; override;
procedure RunHard; override;
procedure Leotard;
{Sin ninguna relacin con el mtodo de la clase A}
end;

Cannot perform operation - DB is not open


Posible causa de error
Puede haber intentado asignar True a la propiedad Active de un componente
TIBTransaction (o haber llamado a su mtodo StartTransaction) mientras el
componente TIBDatabase al cual est conectada la transaccin no est activo.

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.

Cannot perform this operation on a closed connection


Posible causa de error
Puede haber intentado activar un conjunto de datos de DBExpress antes de
que su objeto TSQLConnection asociado est abierto.

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.

Cannot perform this operation on a closed database


Posible causa de error
Puede haber intentado llamar al mtodo StartTransaction de un componente
TDataBase sin primero asignar True a la propiedad Connected o llamar a su
mtodo Open. Por ejemplo, puede haber hecho algo as:
with Database1 do begin
StartTransaction;
Table1.FieldByName('Mister').Value := 'Magoo';

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

Los Tomos de Delphi: Delphi sin problemas

with Database1 do begin


Open;
StartTransaction;
try
try
Table1.FieldByName('Mister').Value := 'Coffee(Joe DiMaggio)';
. . .
finally
Commit;
end;
except
Rollback
end;

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.

Cannot perform this operation on a closed dataset


Posible causa de error
1. Puede haber intentado refrescar, editar, vaciar, borrar o buscar en un componente TDataSet que no estaba abierto o activo.
Por ejemplo, se producir este mensaje de error si trata de hacer lo
siguiente:
Table1.Close;
Table1.Refresh;

-OTable1.Active := False;
Table1.Edit;

2. Un conjunto de datos auxiliar que es requerido por otro conjunto de datos


puede estar inactivo o cerrado. Por ejemplo, puede haber una tabla de bsqueda que deber estar abierta para que sus valores puedan ser accedidos.
3. Puede haber llamado a Open o asignado True a la propiedad Active de un
TClientDataSet que es utilizado en una aplicacin multi-capa, y no ha asignado un componente TDataSetProvider vlido a la propiedad Provider del
TClientDataSet.
4. Puede haber llamado a Open o asignado True a la propiedad Active de un
TClientDataSet que es utilizado en una aplicacin de una sola capa, y no
ha abierto todava el archivo que contiene los datos.

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');

(donde dm es un mdulo de datos, y cdsStudents es un componente


TClientDataSet).

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

Los Tomos de Delphi: Delphi sin problemas


indicador visual que indica que los datos estn ordenados por una columna
y en qu direccin.

Cannot perform this operation on an active session


Posible causa de error
Puede estar intentando asignar True a la propiedad AutoSessionName de un
componente TSession, o modificando su propiedad SessionName mientras su
propiedad Active tiene el valor True.

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.

Cannot perform this operation on an empty dataset


Posible causa de error
Puede haber intentado llamar al mtodo Delete de un objeto TTable cuando la
tabla no contena registros.

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;

-Oif not Table2.IsEmpty then


Table2.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}

Cannot perform this operation on an open database


Posible causa de error
1. Puede haber intentado asignar el valor True a la propiedad Exclusive de
un objeto TTable mientras su propiedad Active tena el valor True.
2. Puede haber intentado asignar un valor a la propiedad TableName de un
TTable mientras su propiedad Active tena el valor True.
3. Puede haber intentado asignar un valor a una de las propiedades Alias o
DatabaseName de un TDatabase mientras su propiedad Connected tena el
valor True.
4. Puede haber intentado asignar un valor a una de las propiedades Active o
AutoSessionName de un componente TSession mientras la propiedad
Connected de un componente TDatabase asociado tena el valor True.

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}

o mediante asignaciones a propiedades:


Table1.Active := False; {para un componente TTable}
Database1.Connected := False; {para un componente TDataBase}

116

Los Tomos de Delphi: Delphi sin problemas

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.

Cannot perform this operation on an open dataset


Posible causa de error
1. Puede haber intentado modificar una de las propiedades Exclusive,
ReadOnly, DatabaseName, TableName, TableType o SessionName de un
objeto TTable mientras la tabla estaba abierta.
2. Puede haber llamado al mtodo Unprepare para un objeto TQuery mientras la consulta estaba activa.
3. Puede haber modificado la propiedad SQL de un objeto TQuery mientras la
consulta estaba activa.

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;

o llamando a su mtodo Close:


Table1.Close;

-OQuery1.Close;

Es necesario asignar True a la propiedad Exclusive de un objeto TTable antes


de ejecutar ciertas tareas, tales como aadir ndices con el mtodo AddIndex.
Por lo tanto, debe primero cerrar el TTable, aadir los ndices, y luego abrir la
tabla de nuevo.

Mensajes de error

117

Cannot perform this operation with table open


Posible causa de error
Puede haber intentado borrar una tabla en el Database Desktop mientras la
tabla estaba abierta.

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.

Cannot perform utility while table is in use


Posible causa de error
Puede estar intentando ejecutar cierta accin, como por ejemplo editar o modificar la estructura de una tabla en el Database Desktop, mientras la tabla est
abierta.

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.

Cannot read a write-only property


Posible causa de error
Puede estar intentando acceder al valor de una propiedad que es de slo
escritura.

118

Los Tomos de Delphi: Delphi sin problemas

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}

Pero no puede asignarle un valor, porque es de slo lectura.

Informacin adicional
Si una propiedad es de slo lectura, es declarada as:
property Required: Boolean read FRequired;

y es declarada normalmente en la seccin Public o Published de una clase.


Si una propiedad es tanto de lectura como escritura, se declara as:
property NetFileDir: string read GetNetFileDir
write SetNetFileDir;

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;

Esta es la definicin del mtodo SetDatabaseName:


procedure TDatabase.SetDatabaseName(const Value: string);
begin
if csReading in ComponentState then
FDatabaseName := Value
else if FDatabaseName <> Value then

Mensajes de error

119

begin
CheckInactive;
ValidateName(Value);
FDatabaseName := Value;
end;
end;

Como puede verse, cuando un usuario accede a la propiedad DatabaseName, el


valor es ledo del campo privado interno FDatabaseName. Cuando un usuario
asigna un valor a la propiedad DatabaseName, al mtodo SetDatabaseName se
le pasa el valor que el usuario est intentando asignar a DatabaseName.

Cannot Run a Unit or DLL


Posible causa de error
1. Puede estar intentando ejecutar una aplicacin desde el entorno integrado
de Delphi sin tener el proyecto (.DPR) abierto. Por ejemplo, puede haber
abierto una o ms unidades que son parte de un proyecto, pero no abri el
proyecto en s.
2. Puede haber intentado ejecutar una .DLL.

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

Los Tomos de Delphi: Delphi sin problemas

Cannot update, <> is not owned by <>


Posible causa de error
Puede haber llamado a ApplyUpdates y haber suministrado el nombre de un
componente TDataSet que no hace referencia al componente TDatabase cuyo
mtodo ApplyUpdates usted ha llamado. Por ejemplo, si llam a ApplyUpdates
as:
Database1.ApplyUpdates([Backgammon, Pool]);

y Pool haca referencia a Database2 en lugar de Database1 en su propiedad


DatabaseName, obtendr este mensaje de error.

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.

Cannot use array of Field values with Expression Indices


Posible causa de error
Puede haber intentado aadir un ndice a una tabla dBASE utilizando corchetes en lugar de parntesis, as:
Table1.AddIndex([<NombreIndice>],[<NombreCampo>],[ixExpression]);

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

Cannot use reserved unit name <>


Posible causa de error
Puede haber utilizado un nombre de unidad que el compilador de Delphi tiene
reservado. Por ejemplo, puede haber nombrado una unidad como System o
SysInit.

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.

Cannot write EXE or DLL to disk


Posible causa de error
Puede haber ejecutado el mdulo (.EXE o .DLL) y luego intent compilar el
proyecto mientras el mdulo estaba todava residente en memoria.

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.

Cannot Write to Engine Configuration File


Posible causa de error
IDAPI.CFG (Windows 3.x) o IDAPI32.CFG (Windows/Delphi de 32 bits) puede
no estar situado donde debera.

122

Los Tomos de Delphi: Delphi sin problemas

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.

Delphi de 32 bits /Windows 95


Asegrese de que la localizacin real de IDAPI32.CFG (C:\Archivos de programa\Borland\Common files\BDE por defecto) coincide con el valor indicado
en el Registro del sistema.
Si es necesario, mueva el archivo al lugar indicado por el Registro, o modifique
la entrada del Registro para que refleje la localizacin real del archivo.

Informacin adicional
Este es el error $8453 del BDE.

Capability Not Supported


Posible causa de error
1. Puede tener un error de sintaxis en una sentencia SQL. Puede estar intentando realizar sobre una base de datos local o de escritorio una accin que
slo puede llevarse a cabo sobre una base de datos cliente/servidor. Por
ejemplo, puede estar intentando utilizar una sentencia SELECT anidada
sobre tablas Paradox.
2. Puede estar utilizando una sintaxis SELECT de SQL que no permite producir un conjunto de resultados actualizable (vivo) mientras la propiedad
RequestLive del componente TQuery tiene asignado el valor True.
3. Puede haber intentado modificar la propiedad StoredProcName de un componente TStoredProc mientras la propiedad DatabaseName haca
referencia a una base de datos local o de escritorio.
4. Puede haber omitido el nombre de la tabla en una sentencia SELECT (proporcionando solamente el nombre de la columna). Por ejemplo, puede tener
una sentencia SELECT similar a:
SELECT Candy FROM Sees
WHERE Chocolate = DarkRaspberry

5. Puede haber intentando utilizar las actualizaciones en cach sobre una


tabla que contiene campos BLOb.

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

5. Abstngase de utilizar actualizaciones en cach en combinacin con campos


BLOb.

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

Los Tomos de Delphi: Delphi sin problemas


5. Si est utilizando la versin Cliente/Servidor (Enterprise) de Delphi 3
superior, consulte en la ayuda de Delphi TClientDataSet para una alternativa a las actualizaciones en cach.

Case label outside of range of case expression


Posible causa de error
Puede estar intentando evaluar en una sentencia Case una etiqueta que no
est en el rango de la variable de control de la sentencia Case. Por ejemplo, lo
siguiente generar este mensaje de error, debido a que DallasCowboys no es
parte de NFCCentralDivision:
type
SomeFootballTeams = (GreenBayPackers, MinnesotaVikings,
ChicagoBears, DetroitLions, TampaBayBuccaneers,
TennesseeTitans, StLouisRams, DallasCowboys);
NFCCentralDivision = GreenBayPackers..TampaBayBuccaneers;
var
BlackAndBlueDivision : NFCCentralDivision;
. . .
begin
case BlackAndBlueDivision of
MinnesotaVikings:
Writeln('A rolling moss gathers no stone);
DallasCowboys:
Writeln('Achy Breaky Aikman');
TampaBayBucanneers:
Writeln('A statue of the coach would be a dungy idol');
else
; // Lo que haga falta
end;
end.

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;

Tambin es una optimizacin evaluar las etiquetas en orden ascendente. Por


ejemplo, dadas estas declaraciones:
const
Favre = 1;
Culpepper = 2;
Batch = 3;
King = 4;
McNown = 5;
var
QBRating: Integer;

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

up (to a long-term contract);


a raise;
some cookies;
a crown;
get better;

es preferible a este cdigo:


case QBRating of
Favre:
s :=
Culpepper: s :=
King:
s :=
McNown:
s :=
Batch:
s :=
end;

Lock him
Give him
Give him
He might
Bake him

up (to a long-term contract);


a raise;
a crown;
get better;
some cookies;

126

Los Tomos de Delphi: Delphi sin problemas

Circular datalinks are not allowed


Posible causa de error
Puede estar intentando utilizar un componente TTable como su propia tabla de
bsqueda, configurando la propiedad MasterSource del componente TTable
para que apunte a un componente TDataSource que hace referencia al propio
componente TTable.

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.

Circular Unit Reference [to <>]


Posible causa de error
Puede haber colocado referencias mutuas en las clusulas Uses de la seccin
Interface de dos unidades.

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

Modifquela de forma que quede as:


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs; {eliminada Unit2}
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2; {aadida la referencia a Unit2 aqu}

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

Los Tomos de Delphi: Delphi sin problemas

Class <> not found. [Ignore the error and continue?]


Posible causa de error
1. Puede haber modificado el archivo .DFM de un formulario y cambiado el
tipo de un objeto por otro (por ejemplo, un TButton a TBitBtn), y Delphi no
puede reconciliar las diferencias.
2. Puede haber utilizado en el proyecto una unidad o componente que
posteriormente ha sacado del camino de bsqueda de Delphi, desinstalado
o borrado.
3. Puede estar cargando un proyecto en una versin de Delphi anterior a la
versin utilizada la ltima vez que lo compil.
4. Puede haber modificado directamente la declaracin de un campo de un
componente en un archivo .PAS (es decir, no a travs del Inspector de
Objetos, cambiando el valor de la propiedad Name del componente), y luego
haber respondido Yes al mensaje Field <> does not have a corresponding component. Remove the declaration?

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

Delphi. Si este es el caso, cargue el proyecto en la versin ms nueva para


mantener el uso de la clase a la que se refiere el mensaje de error.
4. Pulse el botn OK. En modo de diseo, elimine el componente que no fue
encontrado, y luego adalo de nuevo.

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?.

Class already has a default property


Posible causa de error
Puede haber intentado asignar una propiedad por defecto a una clase que ya
tiene una propiedad por defecto definida.

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

Los Tomos de Delphi: Delphi sin problemas

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;

En otras palabras, ya que es la propiedad por defecto, no es necesario escribir


el nombre de la propiedad cuando se le asigna algo, as:
Circus.Clowns[i] := Bozo;

Sin embargo, si trata de hacer lo siguiente, obtendra este mensaje de error:


type
TCircus = class
. . .
property Clowns[Index: integer]: String read Fbozo
write SetBozo; default;
property Animals[Index: integer]: String read FAnimals
write SetAnimals; default;
{No se puede aadir una segunda propiedad por defecto}
. . .
end;

Class does not have a default property


Posible causa de error
Puede haber intentado asignar un valor a una variable de clase utilizando una
expresin de array, cuando el tipo de la clase no tiene una propiedad por
defecto. Por ejemplo, puede haber escrito algo como esto:
TCollection[i] := BostonHarbor;

-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.

Class, interface and object types only allowed in type section


Posible causa de error
Puede haber intentado declarar una variable de un tipo de clase fuera de la
seccin Type. Por ejemplo, puede haber intentado algo as:
var
ts: class(TFont);

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)

Obtendr el mensaje de error , or : expected but = found.


Si intentar declarar un tipo de clase en una seccin Const, as:
const
TForm1 = class(TForm)

Obtendr el mensaje de error Expression expected but CLASS found.


Si intenta declarar un tipo de clase en un procedimiento o mtodo local, as:
procedure TryToDeclareALocalFormClass;
type
TForm1 = class(TForm)

132

Los Tomos de Delphi: Delphi sin problemas


Obtendr el mensaje de error Local class, interface, or object types not
allowed.

Class methods not allowed as property getters and setters


Posible causa de error
Puede haber especificado un mtodo de clase como getter (mtodo de acceso
de lectura) o setter (mtodo de acceso de escritura o transformacin). Por
ejemplo, lo siguiente generar este mensaje de error:
Type
No = class
private
Ffffft: String;
class procedure AskTheCat(AResponse: String);
public
property fffft :String read Ffffft write AskTheCat; end;

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;

Class not registered


Posible causa de error
1. Puede que est intentando ejecutar una aplicacin que contiene un control
ActiveX (.OCX) que no ha sido instalado o registrado en el sistema.
2. Puede haber intentado asignar el valor True a la propiedad Connected de
un componente TOLEEnterpriseConnection, TRemoteServerConnection o
TDCOMConnection cuyo servidor (que se indica mediante la propiedad
ServerName o ServerGUID) no ha sido registrado en el sistema.

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

Los Tomos de Delphi: Delphi sin problemas


(En Delphi 4, el archivo correspondiente es STDVCL40.DLL, y por ello el
comando necesario sera Regsvr32 STDVCL40.)
En Delphi 3-6 es posible registrar y borrar del Registro controles ActiveX a travs de elementos del men, especficamente Run | Register ActiveX Server
y Run | Unregister ActiveX Server. Estos tems estn disponibles cuando
un proyecto de control de ActiveX o Biblioteca ActiveX est abierto en el
entorno integrado.
Consulte DAX Error: Class not registered.

Class or object types only allowed in type section


Posible causa de error
Puede haber intentado declarar un tipo de clase en una seccin Var, as:
var
TStudentCommand = (scAdd, scEdit, scActivate, scInactivate,
scRemove);
TMaterialCommand = (mcAdd, mcEdit, mcDelete, mcImport);
TScheduleCommand = (scSchedule, scPrint);

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;

Class type required


Posible causa de error
1. Puede haber hecho una referencia a un tipo que no es una clase como el
argumento de una sentencia Raise de un bloque de excepcin. Por ejemplo,
puede haber hecho algo as:
var
b : Byte;
aRuckus: String;
begin
try
b := StrToInt(Edit1.Text);
except
on Cain do
raise aRuckus('Vaca sagrada!');
end;
end;

2. Puede haber utilizado dos tipos de interfaces en la declaracin de un tipo


de clase ActiveForm, as:
type
TActiveFormX = class(IActiveFormX, IActiveFormX)

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

Los Tomos de Delphi: Delphi sin problemas


Result := Pieces div Recipients;
except
on EDivByZero do
Result := 0;
end;
end;

Este es un ejemplo de declaracin y utilizacin de un objeto de excepcin


definido por el usuario (ESoMuchTrouble):
type
ESoMuchTrouble = class(Exception);
. . .
if Problems > BreakingPoint then
raise ESoMuchTrouble.Create('La gota que colm el vaso');

Para ms informacion sobre las excepciones, consulte exception declarations, predefined exceptions y exception en la ayuda de Delphi.
2. Consulte Interface type required.

Clipboard does not support Icons


Posible causa de error
Puede haber intentado colocar un icono en el portapapeles. Por ejemplo, puede
haber tratado de hacerlo cuando un control de imagen se refera a un archivo
.ICO:
Clipboard.Assign(Image1.Picture);

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).

Close error on <Filename>


Posible causa de error
Puede tener el disco lleno o daado.

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).

Code Insight features are disabled while debugging


Posible causa de error
Est intentando utilizar caractersticas de Code Insight mientras el programa
est ejecutndose dentro del entorno integrado de Delphi. Por ejemplo, puede
haber intentado hacer uso de las caractersticas de completamiento de cdigo,
pulsando Ctrl+espacio mientras depura el cdigo lnea a lnea.

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.

Code Segment Too Large


Posible causa de error
Puede haber colocado demasiado cdigo en una misma unidad del proyecto.

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

Los Tomos de Delphi: Delphi sin problemas


segunda unidad. Por ejemplo, si el nombre de la segunda unidad es SecondCU,
deber hacer referencia a ella desde la unidad original as:
implementation
uses SecondCU;
{$R *.DFM}

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.

COINITIALIZE has not been called


Posible causa de error
Puede estar utilizando mltiples hilos en una aplicacin COM, pero no ha llamado a CoInitialize para cada hilo.

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.

Column not a BLOb


Consulte Unknown SQL Error.

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

procedimiento o funcin propio), revise su declaracin para determinar esa


informacin.

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.

Compilation terminated; too many errors


Posible causa de error
Hay muchos errores en el proyecto actual.

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.

Component already installed


Posible causa de error
El componente que est intentando instalar ya es parte de su VCL.

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

Los Tomos de Delphi: Delphi sin problemas

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.

Connection errorno server available


Posible causa de error
Puede estar intentando utilizar Delphi Connection de ReportSmith sin proporcionar un componente TReport y un componente TTable o TQuery (con el valor
True asignado a su propiedad Active).

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

3. Desplcese a la parte inferior y localice el componente TReport.


4. Seleccione el componente TReport.
5. Pulse el botn Add. El componente TReport ser aadido a la pgina Data
Access de la Paleta de Componentes.

Connection in use by another statement


Posible causa de error
1. Puede estar intentando abrir o ejecutar una consulta mientras el conjunto
resultado de una consulta anterior est todava pendiente. En otras palabras, todo el conjunto resultado no ha sido devuelto todava.
2. Puede estar intentando ejecutar un procedimiento almacenado despus de
que anteriormente haya fallado otro procedimiento almacenado.
3. Puede haber llamado al mtodo Unprepare de un objeto TQuery antes de
que todo el conjunto resultado haya sido devuelto.

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;

Alternativamente, puede llamar al mtodo FetchAll:


with Query1 do
begin
Open;
FetchAll;
end;

2. Llame al mtodo Unprepare de TStoredProc justo despus de la ejecucin


del primer procedimiento almacenado y antes de la ejecucin del segundo,
as:
with StoredProc1 do begin
Prepare;
try
ExecProc;
finally
Close;
Unprepare;

142

Los Tomos de Delphi: Delphi sin problemas


end;
end;
with StoredProc1 do begin
StoredProcName := 'SafewayMosaic';
Prepare;
try
ExecProc;
finally
Close;
Unprepare;
end;
end;

3. Aada una llamada a Last antes de llamar a Unprepare:


with Query1 do
begin
Last;
Close;
Unprepare;
end;

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.

Connection name missing


Posible causa de error
Puede haber tratado de asignar valor a una de las propiedades CommandText
o SortFieldNames de un componente SQLDataSet (DBExpress) sin especificar
primero el correspondiente componente TConnection.

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.

Constant expression expected


Posible causa de error
Puede haber intentado asignar la direccin de una variable local (de pila) o
dinmica (en el heap) a una constante de tipo puntero. Por ejemplo, lo
siguiente generar este mensaje de error:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
const ptr: Pointer = @i;

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.

Constant expression violates subrange bounds


Posible causa de error
1. Puede estar intentando hacer una asignacin a un elemento de un array
que no existe. Por ejemplo, lo siguiente producir este mensaje de error, ya
que se est intentando acceder a un elemento que est fuera de los lmites
declarados para el array:

144

Los Tomos de Delphi: Delphi sin problemas


type
Rays = array[0..6] of
end;
...
procedure Radiation;
var
FamousRays: Rays;
begin
FamousRays[0] := 'Ray
FamousRays[1] := 'Ray
FamousRays[2] := 'Ray
FamousRays[3] := 'Ray
FamousRays[4] := 'Ray
FamousRays[5] := 'Ray
FamousRays[6] := 'Ray
FamousRays[7] := 'Ray
{Esta lnea provoca
end;

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.

Constant object cannot be passed as var parameter


Posible causa de error
1. Puede haber intentado pasar un parmetro constante a un procedimiento o
funcin que espera un parmetro variable. Por ejemplo, lo siguiente generar este mensaje de error:
procedure GiveMeAPointer(var malleable: string);
var
owwhoooWerewolvesOfLondon: Integer;
begin
owwhoooWerewolvesOfLondon := Form1.InstanceSize;
malleable := malleable + ' ' +
IntToStr(owwhoooWerewolvesOfLondon);
end;

Mensajes de error

145

procedure BigShovel(const Immutable: string);


begin
GiveMeAPointer(Immutable);
end;
procedure RoyalMountainKingMineOrangeMonster;
begin
BigShovel('Hitachi');
end;

debido a que el parmetro Immutable es un parmetro constante, pero el


parmetro Malleable es un parmetro variable.
2. Puede haber intentado pasar una propiedad de una clase a un procedimiento o funcin que espera una variable. Por ejemplo, puede haber
intentado hacer algo como lo siguiente:
type
TTime = class
private
FWound: string;
public
. . .
published
property Wound: string read FWound write SetWound;
end;
. . .
procedure TForm1.HealAll(Sender: TObject);
var
Sage: TTime;
begin
Sage := TTime.Create;
Wound := 'Bury My Heart at Wounded Knee';
Delete(Sage.Wound, 1, Length(Sage.Wound));

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

Los Tomos de Delphi: Delphi sin problemas


s := Sage.Wound;
delete(s, 1, Length(s));
Sage.Wound := s;

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.

Constant or type identifier expected


Posible causa de error
Puede haber declarado una variable local de un tipo desconocido para el compilador. En otras palabras, el compilador conoce el smbolo que se ha utilizado
como tipo, pero no es aplicable en este contexto (no es un tipo vlido). Por
ejemplo, lo siguiente generar este mensaje de error:
var f: Text;

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;

Puede tambin utilizar el tipo Text anteponindole System as:


f: System.Text;

Mensajes de error

147

Por ltimo, tambin puede utilizar:


f: Textfile;

Constant out of range


Posible causa de error
1. Puede haber asignado a una variable de un tipo subrango un valor ms
grande o ms pequeo que sus lmites. Para ser ms especfico, puede
haber declarado una variable de tipo subrango y luego haber intentado una
asignacin, as:
var
OctoberRoster: 1..25;
begin
OctoberRoster := 0;

2. Puede haber asignado a un tipo de Object Pascal un valor ms grande o


ms pequeo de lo que puede almacenar. Por ejemplo, el tipo de datos Byte
puede almacenar valores entre 0 y 255. Obtendr este mensaje de error si
trata de almacenar algo menor que 0 o mayor que 255 en una variable
Byte, as:
const
Under, Over: Byte;
begin
Under: -1;
Over := 256;

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);

Alternativamente, en lugar de verificar explcitamente el problema, puede


codificar de manera defensiva y reaccionar (lo contrario de proactivo) manejando el error cuando se produzca, as:

148

Los Tomos de Delphi: Delphi sin problemas

const
Under, Over: Byte;
begin
try
Under := StrToInt(Edit1.Text);
except
on Exception do {atrapar y manejar el error};
end;
end;

Constants cannot be used as open array arguments


Posible causa de error
Puede tener un error de sintaxis en una llamada a un mtodo, como podra ser
el mtodo InsertRecord de TDataSet. Por ejemplo, lo siguiente generar este
mensaje de error:
Table1.InsertRecord('Jenny Lind', 'Calaveras',
'California', 50, 1200);

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;

De nuevo, simplemente aada corchetes a la llamada del procedimiento:


Busywork([12,24,36,48]);

Mensajes de error

149

Constructing Instance of <> containing abstract methods


Posible causa de error
1. Puede estar intentando crear una instancia de una clase que contiene
mtodos abstractos. Un ejemplo de cundo podra ocurrir esto es si crea
una variable TStrings as:
var
CoffeeStrings: TStrings;
. . .
CoffeeStrings := TStrings.Create;

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;

2. Los mtodos virtuales no tienen que ser redefinidos en los descendientes.


Si los redeclara y utiliza la directiva Override, puede acceder a la funcionalidad en el ancestro llamando a:
inherited <mtodo>;

en el cuerpo de la definicin del mtodo en la clase descendiente. Puede


luego extender (aadir funcionalidad) el mtodo con cdigo especfico para
la clase descendiente.
Si redeclara el nombre del mtodo sin la directiva Override, estar sustituyendo u ocultando el mtodo del ancestro (consulte Method <> hides
virtual method of base class <>).
Si declara un mtodo como virtual, debe tambin definirlo en la misma unidad, aunque puede definir un cuerpo de mtodo vaco, as:

150

Los Tomos de Delphi: Delphi sin problemas


public
procedure OverrideMe; virtual;
. . .
implementation
. . .
procedure TForm1.OverrideMe;
begin
end;

Si declara un mtodo virtual y abstracto, las clases descendientes deben


redefinirlo e implementarlo (en caso contrario, obtendrn este mensaje de
advertencia).
No defina un mtodo declarado como virtual y abstracto en la unidad en la
que es introducido (esto deber hacerse en las clases descendientes).

Constructors and Destructors must have register calling convention


Posible causa de error
Puede haber aadido una palabra reservada de convenio de llamada diferente
de Register en la declaracin de un constructor o destructor. Por ejemplo, cualquiera de los siguientes ejemplos producir este mensaje de error:
constructor Create(AOwner: TComponent); override; pascal;
destructor Destroy; override; stdcall;
constructor Create(AOwner: TComponent); override; safecall;
destructor Destroy; override; cdecl;

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

Constructors and Destructors not allowed in OLE automation


section
Posible causa de error
Puede haber declarado un constructor o destructor en la seccin Automated de
la declaracin de una clase.

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.

CONTAINS clause is incorrect


Posible causa de error
La clusula Contains en el Package Editor puede tener un error de sintaxis. Lo
siguiente no es permitido y podra ocasionar este mensaje de error:
1. Aadir unidades invlidas a la clusula Contains.
2. Incluir extensiones de nombres de archivos (por ejemplo, .PAS) en la clusula Contains.
3. Omitir el punto y coma detrs del ltimo archivo listado en la clusula
Contains.

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

Los Tomos de Delphi: Delphi sin problemas

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

Control <> has no parent window


Posible causa de error
1. Puede estar intentando mostrar o realizar alguna otra accin sobre un
componente que no tiene asignado un padre (parent). Por ejemplo, lo
siguiente producir este mensaje de error, ya que ningn control padre ha
sido asignado a la variable TBitBtn:
procedure TForm1.OrphanBitBtn(Sender: TObject);
var
Oliver: TBitBtn;
begin
Oliver := TBitBtn.Create(Self);
Oliver.SetFocus;
{No se puede asignar el foco a un control sin padre}
end;

2. Puede estar intentando acceder a un control cuya ventana padre no tiene


an asignado un menjador (handle). Por ejemplo, el formulario sobre el que
reside el control puede no haber sido creado todava.

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;

2. Asegrese de que un control tiene su manejador de ventana asignado antes


de hacer una referencia a l. Puede que sea necesario redefinir el mtodo
CreateWnd para ejecutar operaciones sobre un control que requiere un
manejador de ventana vlido (que puede no haber sido completamente
creado en el constructor del objeto). Puede mover la sentencia que causa el
error a este mtodo redefinido CreateWnd de esta forma:
procedure TWhatever.CreateWnd;
begin
inherited;
{Aqu se aade el cdigo que no es adecuado
para el constructor del objeto}
end;

154

Los Tomos de Delphi: Delphi sin problemas

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;

2. Para ms informacin, consulte creation order en la ayuda de Delphi.

Controls cannot be added to a data module


Posible causa de error
Puede estar intentado aadir un componente visual (un control) a un mdulo
de datos.

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

Corrupt table/index header


Posible causa de error
1. Puede estar intentando asignar una valor a la propiedad IndexName o
IndexFieldNames de un componente TTable que tiene un ndice daado.
2. Puede estar intentando instanciar los campos de una tabla en tiempo de
diseo (utilizando el editor de campos - Fields Editor), pero la tabla tiene
un ndice daado.
3. Puede estar intentando asignar True a la propiedad Active de un TTable,
pero la tabla tiene un ndice daado.
4. Puede estar intentando abrir en el Database Desktop una tabla que tiene
un ndice daado.

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

Los Tomos de Delphi: Delphi sin problemas


permite que sea nula), los valores mximos y mnimos permitidos para una
columna, los valores por defecto para una columna y los patrones de
validacin.
Seleccione Validity Checks en el cuadro de combinacin de propiedades de la
tabla en el Database Desktop para acceder a estas caractersticas.

<NombreTabla>.MB
Los archivos con la extensin .MB contienen los datos de las columnas de tipos
Memo y Graphic (TMemoField y TGraphicField).

Could not create output file <>


Posible causa de error
1. Puede haber especificado un directorio que no existe para almacenar archivos de salida.
2. Puede haber especificado un directorio que est protegido contra escritura
para almacenar archivos de salida.
3. Puede estar tratando de ejecutar un archivo que est todava en ejecucin o
que ya est ejecutndose en otra instancia de Delphi.
4. Si la extensin del archivo de salida mencionado en el mensaje de error es
.OCX, puede estar intentando modificar un ActiveForm que ya est instalado en Delphi.

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

ejecutables (.EXE), las unidades compiladas (.DCU), y los archivos de


mapas de carga (.MAP).
Si desea almacenar los archivos de salida en algn lugar distinto del directorio
del proyecto para un proyecto en particular, siga estos pasos:
1. Cree, si es necesario, el directorio que almacenar los archivos de salida.
2. Asegrese de que el directorio no est protegido contra escritura.
3. Seleccione Project | Options.
4. Seleccione la pgina Directories/Conditionals.
5. Introduzca la ruta completa del directorio en el cuadro de combinacin
Output Directory, por ejemplo, I:\Separate\Output.
6. Pulse el botn OK para cerrar el cuadro de dilogo Project Options.

Could not find IDataBroker in type library


Posible causa de error
Puede haber borrado un archivo necesario, ms concretamente
STDVCL[32,40].DLL, que debera estar en el directorio \Windows\System.

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

Los Tomos de Delphi: Delphi sin problemas


Para instrucciones especficas sobre cmo utilizar TRegSvr, consulte Cannot
Load IDAPI Service Library, solucin nmero 3.

Could not find interface <> in type library


Posible causa de error
La biblioteca de tipos a la que se hace referencia por su nombre en este mensaje de error no ha sido registrada.

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.

Could not find interface IDataBroker in type library


Posible causa de error
Puede que la biblioteca de tipos que define IDataBroker no haya sido correctamente registrada durante la instalacin de Delphi.

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

Could not find language driver ($220B)


Posible causa de error
Puede haber seleccionado un controlador de lenguaje utilizando la utilidad
BDE Configuration (o editando directamente WIN.INI o el Registro de Windows) cuyo archivo correspondiente est ausente o no est en el lugar esperado, o est ausente la lnea que hace referencia a l en WIN.INI.

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

Los Tomos de Delphi: Delphi sin problemas


2. En SQL Explorer/Database Explorer, seleccione Object | New. . . .
3. Seleccione el tipo de controlador adecuado en el cuadro de combinacin
(seleccione Standard si est trabajando con tablas Paradox o dBASE) y
pulse el botn OK.
El nuevo alias se mostrar en la pgina Database del panel izquierdo con
el nombre por defecto Standard1.
4. Pulse con el botn derecho sobre el nuevo alias, seleccione Rename del
men de contexto, e introduzca el nombre que quiera darle al alias.
5. En la pgina Definition del panel derecho, seleccione el controlador apropiado en el cuadro de combinacin Default Driver.
6. Introduzca la ruta de la base de datos en el cuadro de edicin Path.
7. Seleccione Object | Exit, y luego Yes para grabar los cambios realizados.

Could not initialize IDAPI


Posible causa de error
1. Las .DLLs del BDE pueden haber sido movidas o borradas.
2. El archivo WIN.INI o el Registro del sistema pueden haber sido
modificados.

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

En Delphi de 32 bits, la ubicacin de las .DLLs y el archivo de configuracin es


mantenido en el Registro del sistema. La configuracin del Registro puede ser
encontrada ejecutando Regedit y navegando hasta
HKEY_LOCAL_MACHINE\Software\Borland\Database Engine.

Mensajes de error

161

Las entradas por defecto son C:\Archivos de programa\Borland\Common


files\BDE\IDAPI32.CFG como camino de las DLL, y C:\Archivos de programa\Borland\Common files\BDE\IDAPI32.CFG para CONFIGFILE01 (el
archivo de configuracin).

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.

Could not load RLINK32.DLL


Posible causa de error
El archivo RLINK32.DLL puede no estar ubicado en la ruta de bsqueda de
Delphi.

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.

Could not load StdOle version 1.0 type library


Posible causa de error
STDOLE.TLB o STDOLE2.TLB pueden haber sido movidos o borrados.

162

Los Tomos de Delphi: Delphi sin problemas

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.

Could not load Type Library


Posible causa de error
Puede haber borrado un archivo de biblioteca de tipos (Type Library).

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.

Data Base Error: Database access resulted in error


Posible causa de error
Puede haber intentado acceder al constructor de consultas SQL (Query Builder) de Delphi pulsando el botn derecho del ratn sobre un componente
TQuery y seleccionando Query Builder. . . del men de contexto, pero despus
de proporcionar el nombre del alias no proporcion una contrasea vlida y
puls el botn OK.

164

Los Tomos de Delphi: Delphi sin problemas

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.

Data Segment Too Large


Posible causa de error
1. Puede haber declarado demasiadas variables globales (es decir, variables
globales a la unidad). Estas se almacenan en el segmento de datos.
2. Puede estar utilizando estructuras de datos que consumen gran cantidad
del espacio en el segmento de datos, por ejemplo, cadenas en Delphi 1 (las
cadenas consumen 256 bytes en Delphi 1, a menos que se declaren explcitamente ms pequeas), arrays grandes, o registros que contienen
numerosos campos o campos grandes (como cadenas). Por ejemplo, puede
estar declarando un registro como:
TRecording = record
Number: Integer;
Hits: Integer;
Title: String;
Artist: String;
end;
var
Platter, Album, Disc, CD, Music, Tunes, Toons: TRecording;

3. Puede haber declarado demasiadas constantes con tipo.

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

-OPuede utilizar recursos de cadenas de caracteres para las constantes que el


programa utilizar. Esto es particularmente fcil a partir de Delphi 3, que
introdujo la palabra reservada Resourcestring. Las constantes de cadena
son almacenadas automticamente en un archivo de recursos y cargadas
dinmicamente cuando se hace referencia a ellas. Podra utilizar algo as:
resourcestring
KnockKnock = '%s who?';
Excuse = 'The reason %s doesn''t %s is %s';
WeatherDialog = '%s enough for ya?';
ElvinBishop = 'There ain''t no %s like %s %s';

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];

Esto reserva 21 bytes en lugar de 256, un ahorro significativo de memoria.


Si el problema se debe a que tiene demasiadas estructuras de datos grandes (que no son cadenas), puede convertirlas en punteros, que solamente
consumen cuatro bytes cada uno, as:
TptrRecording = ^TRecording;
TRecording = record
Number: Integer;
Hits: Integer;
Title: String;
Artist: String;
end;
. . .
var
ptrPlatter, ptrAlbum, ptrDisc, ptrCD,
ptrMusic, ptrTunes, ptrToons: TptrRecording;

Si utiliza punteros, deber reservar y liberar explcitamente la memoria


que utilizar. En Delphi 1, puede utilizar para ello una seccin Initialization y un procedimiento de salida. En Delphi de 32 bits, puede utilizar las
secciones Initialization y Finalization. A continuacin se muestra un ejemplo para Delphi 1 (utilizando un procedimiento de salida):
procedure SanitaryEngineer; far;
begin
Dispose(ptrPlatter);
Dispose(ptrAlbum);
. . .
end;

166

Los Tomos de Delphi: Delphi sin problemas


initialization
New(ptrPlatter);
New(ptrAlbum);
. . .
AddExitProc(SanitaryEngineer);
end.

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';

3. Utilice variables inicializadas en lugar de constantes con tipo. Por ejemplo,


en lugar de las siguientes constantes con tipo:
const
StringCheeseString: String = 'Wisconsin Wonder';
TypedTypeTypTip: Integer = 17;

Utilice las siguientes variables inicializadas:


const
StringCheeseString = 'Wisconsin Wonder';
TypedTypeTypTip = 17;

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.

Data Structure Corruption


Posible causa de error
1. Puede estar intentando realizar ms de 255 cambios en una sola transaccin de base de datos.
2. Puede estar utilizando la versin 3.00 o 3.10 del BDE.

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

Tablas abiertas por el sistema

254

Tablas abiertas por el sistema (BDE 4.01 y posteriores)

64

Bloqueos de registros en una tabla (16 bits) por sesin

255

Bloqueos de registros en una tabla (32 bits) por sesin

255

Registros en transaccin sobre una tabla (32 bits)

512

Archivos fsicos abiertos (DB, PX, MB, X??, Y??, VAL, TV)

1024

Archivos fsicos abiertos (BDE 4.01 y posteriores)

300

Usuarios en un archivo de red PDOXUSRS.NET

255

Nmero de campos por tabla

255

Tamao de los campos de caracteres

2.000

Millones de registros en una tabla

2.000

Millones de bytes en un archivo .DB (tabla)

10.800

Bytes por registro para tablas indizadas

32.750

Bytes por registro para tablas no indizadas

127

Nmero de ndices secundarios por tabla

16

Nmero de campos en un ndice

255

Usuarios concurrentes por tabla

256

Megabytes de datos por campo BLOb

100

Contraseas por sesin

15

Longitud mxima de contrasea

63

Contraseas por tabla

159

Campos con chequeos de validacin (32 bits)

63

Campos con chequeos de validacin (16 bits)

168

Los Tomos de Delphi: Delphi sin problemas

Data Type too large: exceeds 2 GB


Posible causa de error
Puede haber intentado declarar un tipo de datos definido por el usuario que es
excesivamente grande. Por ejemplo, la siguiente declaracin de tipo produce
este mensaje de error:
TDeviantVariants = array[0..135000000] of variant;

como tambin lo hace sta:


TSoMuchTrouble = array[0..1333333333] of integer;

Solucin rpida
Debe disminuir el tamao del tipo. Por ejemplo, lo siguiente compilar:
TTexasSizedArray = array[0..100000000] of variant;

Como tambin esto:


TAlaskaSizedArray = array[0..200000000] of integer;

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;

(Declarar un array con el tamao combinado de los dos anteriores ocasiona


este mensaje de error).

Database name missing


Posible causa de error
Puede haber intentado asignar True a la propiedad Connected de un componente TDatabase sin haber asignado primero un valor a la propiedad
DatabaseName.

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;

Para ms informacin sobre las transacciones de base de datos, consulte


handling transactions en la ayuda de Delphi.

Database not Assigned


Posible causa de error
Puede haber ejecutado una sentencia SQL sin asignar una base de datos al
componente de consulta. Por ejemplo, lo siguiente generar este mensaje de
error:
IBQry := TIBQuery.Create(nil);
try
with IBQry do begin
SQL.Add('SELECT COUNT(DelphiConverts) FROM Redmond');
SQL.Add('WHERE Job_Status = FormerMSEmployees');
Open;

170

Los Tomos de Delphi: Delphi sin problemas


Result := Fields[0].AsString;
end;
finally
IBQry.Free;
end;

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.

Dataset is not a query


Posible causa de error
Puede haber intentado asignar el valor True a la propiedad Active de un componente TQueryClientDataSet, pero el conjunto de datos al que hace referencia
el componente TProvider (indicado mediante la propiedad Provider del objeto
TQueryClientDataset) no es un objeto TQuery. Por ejemplo, puede que se trate
de un componente TTable o TStoredProc.

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

Dataset not configured for network access


Posible causa de error
Puede haber asignado el parmetro NetDir del BDE a una unidad local.

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).

Dataset [is] not in edit or insert mode


Posible causa de error
Puede estar intentando editar un valor en una tabla o intentando insertar un
nuevo registro mientras el conjunto de datos est en un modo distinto a dsEdit
o dsInsert. Por ejemplo, puede haber intentado hacer algo as:
with qryUpdateMaterial do begin
SQL.Add('UPDATE Material');
SQL.Add('SET Student = :Student');
SQL.Add('WHERE WeekBegin = :WeekBegin');
SQL.Add('AND TalkIndicator = :TalkIndicator');
if Householder then
Params.ParamByName('Student').AsString :=
Format(%s HH: %s',[Existing,AstudentToSchedule])
else
Params.ParamByName('Student').AsString := AStudentToSchedule;
Params.ParamByName('WeekBegin').AsDateTime :=
dtpWeekToSchedule.Date;
Params.ParamByName('TalkIndicator').AsString := ATalkIndicator;
ExecSQL;
Post;
end;

172

Los Tomos de Delphi: Delphi sin problemas

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;

En el ejemplo de arriba, borre la llamada a Post, ya que ExecSQL ya la hace.

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.

DAX Error: Class not registered


Posible causa de error
Puede no tener un archivo necesario, por ejemplo DBCLIENT.DLL, instalado y
registrado en la mquina cliente.

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

DAX Error: Name not unique in this context


Consulte Name not unique in this context.

DAX Error: Unexpected failure


Posible causa de error
El servidor de aplicaciones ha disparado una excepcin durante la
inicializacin.

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.

DCOM not installed


Posible causa de error
Puede haber intentado asignar el valor True a la propiedad Connected de un
componente TMIDASConnection mientras su propiedad ConnectType estaba
asignada a ctDCOM y su propiedad UseBroker era False sin instalar primero
DCOM.

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.

Debug process is already running


Posible causa de error
1. Puede tener una ventana de visualizacin de variables abierta y estar trazando la ejecucin del cdigo ms rpidamente de lo que la ventana es
capaz de actualizarse.

174

Los Tomos de Delphi: Delphi sin problemas


2. Puede haber intentado compilar o ejecutar dentro del entorno integrado de
Delphi sin haber terminado la ejecucin de un programa que gener una
excepcin mediante Run | Program Reset.

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.

Debug session in progress. Terminate?


Posible causa de error
Puede haber seleccionado Project | Build All, Project | Compile, o Project
| Syntax Check mientras su proyecto estaba en ejecucin o suspendido.

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

Debugger kernel error. Error code: <>


Posible causa de error
1. Su programa puede estar intentando cargar una DLL (puede ser una DLL
regular o un paquete, que no es ms que una DLL especfica de Delphi con
extensin .DPL) que no puede encontrar. Puede que no exista en el sistema
o no est en el directorio actual de la ruta de bsqueda.
2. Puede ser que un procedimiento o funcin de una DLL a la que est intentando acceder no est disponible debido a una mala escritura del nombre.
3. Puede ser que un procedimiento o funcin de una DLL a la que est intentando acceder no est disponible debido a la utilizacin de una signatura
incorrecta (un error en la cantidad de parmetros, sus tipos u orden).
4. Puede estar trazando la ejecucin del cdigo demasiado rpidamente mientras muchas variables complejas se estn monitorizando en la ventana de
visualizacin.
5. Si el cdigo de error es 25, puede haber intentado depurar remotamente en
Delphi 4 o superiores y haber especificado un camino remoto o nombre de
equipo invlido.

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

Los Tomos de Delphi: Delphi sin problemas


Recuerde adems que no es posible mezclar y combinar DLLs de 16 bits y de
32 bits.
5. Consulte remote debugging en la ayuda de Delphi para detalles
especficos.

Declaration expected but <> found


Posible causa de error
1. Puede haber introducido algo distinto a una declaracin de Object Pascal
vlida en una posicin donde el compilador espera encontrar una
declaracin.
Para ser ms especficos, puede obtener este mensaje de error si utiliza
una palabra reservada de Object Pascal o inicia una declaracin con algo
distinto a un guin bajo o un caracter alfabtico (a..z, A..Z). Los dgitos se
permiten despus del primer caracter; otros caracteres no son permitidos.
Por ejemplo, estas declaraciones no son permitidas:
string: string; {palabra reservada de Object Pascal}
1string: string; {empieza con un dgito}
+1string: string {el caracter + no puede ser utilizado}

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;

2. Aada de nuevo la declaracin necesaria.


3. Aada una seccin Initialization antes de la seccin Finalization.

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

Declaration of <> differs from declaration in interface <>


Posible causa de error
Puede haber declarado una clase que implementa una interfaz, y la signatura
de uno (o ms) de los mtodos que est implementando difiere de la signatura
de la implementacin. Por ejemplo, lo siguiente generar este mensaje de
error:
type
ITomJonesTheSingerNotTheProtagonistOfTheClassicBook = interface
procedure RaveUp(var ItsNotUnusual: WideString);
end;
type
TTomJonesImplementor = class(TInterfacedObject,
ITomJonesTheSingerNotTheProtagonistOfTheClassicBook)
procedure RaveUp(var WhatsNewPussycat: Integer);
end;

Debido a que las signaturas de los dos mtodos RaveUp no concuerdan.

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.

Declaration of <> differs from previous declaration


Posible causa de error
1. Una declaracin de un procedimiento o funcin en la parte Implementation
difiere de la declaracin anterior.
2. Un mtodo que est intentando redefinir puede tener una signatura diferente (en cuanto a nmero, tipo u orden de los parmetros) del original.
3. Puede estar intentando redefinir un mtodo virtual, pero est utilizando
un convenio de llamada distinto del utilizado por el mtodo redefinido.

178

Los Tomos de Delphi: Delphi sin problemas

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.

Declaration of class <> is missing or incorrect


Posible causa de error
1. Puede haber modificado o borrado el nombre de la clase (descendiente) de
la seccin Interface de una unidad. Por ejemplo, modificando una declaracin de tipo del formulario de:
TForm1 = class(TForm)

a:
TPanel1 = class(TForm)

provocar este mensaje de error.


2. Puede haber eliminado la referencia al ancestro del tipo de la declaracin
Type, as:
TForm1 = class { (TForm) se ha borrado }

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

Si lo hace, su ancestro ser el ancestro ltimo de todas las clases, TObject. No


puede, sin embargo, como se muestra arriba, cambiar implcitamente el ancestro de un formulario de, por ejemplo, TForm a TObject.

DEFAULT clause not allowed in OLE automation section


Posible causa de error
Puede haber utilizado la clusula Default en una seccin Automated de OLE.

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.

Default parameter <> must be by-value or const


Posible causa de error
Puede haber creado un mtodo que asocia un valor por defecto a un parmetro
que es un parmetro Var (que se pasa por referencia). Por ejemplo, lo siguiente
generar este mensaje de error:
procedure ThatAintWorkin(var iYiYi: Integer = 86);

Solucin rpida
Debe elegir una de tres posibles soluciones:
1. Cambie el parmetro a un parmetro constante:
procedure ThatAintWorkin(const iYiYi: Integer = 86);

2. Cambie el parmetro a un parmetro pasado por valor:


procedure ThatAintWorkin(iYiYi: Integer = 86);

3. Elimine el valor por defecto:


procedure ThatAintWorkin(var iYiYi: Integer);

180

Los Tomos de Delphi: Delphi sin problemas

Por supuesto, puede tambin hacer esto:


procedure ThatAintWorkin(const iYiYi: Integer);

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.

Default property must be an array property


Posible causa de error
Puede haber declarado una propiedad que no es de tipo array como la propiedad por defecto de la clase. Por ejemplo, la siguiente declaracin de propiedad
generar este mensaje de error:
property Twiggy: String read FTwiggy write FTwiggy; default;

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

especificar el nombre de la propiedad. Por ejemplo, a la propiedad declarada


arriba se le podra asignar un valor as:
var
PC: TComputer;
. . .
PC[i] := Compaq;

En otras palabras, como es la propiedad por defecto, no es necesario escribir el


nombre de la propiedad cuando se hace una asignacin, as:
PC.Clones[i] := PackardBell;

Default value required for <>


Posible causa de error
Puede haber proporcionado un parmetro con un valor por defecto, pero luego
aadi otro parmetro que no tiene un valor por defecto. Por ejemplo, lo
siguiente provocar este mensaje de error:
procedure BiDefault(i: Integer = 76; s: String);

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');

o colocar el parmetro con valor por defecto en ltimo lugar, as:


procedure BiDefault(s: String; i: Integer = 76);

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.

Default values must be of ordinal, pointer, or small set type


Posible causa de error
Puede haber declarado una propiedad que contenga una directiva de almacenamiento por defecto cuyo tipo de datos es incompatible con los aceptables como
valores por defecto. Por ejemplo, lo siguiente produce este mensaje de error, ya
que el tipo de datos String no puede tener un valor por defecto asociado:
property Nanook: string read FZappa write FZappa
default 'great oogly moogly';

182

Los Tomos de Delphi: Delphi sin problemas

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;

Delphi ofrece tres directivas de almacenamiento. Adems de Default, tambin


estn Nodefault y Stored. Normalmente, todos los valores de propiedades se
almacenan, y no hay valores por defecto para una propiedad dada. La nica
manera de especificar un valor por defecto es utilizando la directiva de almacenamiento Default. La nica manera de evitar que un valor sea almacenado es
utilizar la directiva de almacenamiento Stored, seguida por una funcin booleana cuyo valor devuelto determina si la propiedad es almacenada o no. He
aqu otro fragmento de la unidad Buttons de Delphi que muestra la directiva
Stored en uso:
TBitBtn = class(TButton)
. . .
private
function IsCustom: Boolean;
function IsCustomCaption: Boolean;
. . .
published

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;

Para ms informacin, consulte storage specifiers en la ayuda de Delphi.

Destination must be indexed


Posible causa de error
Puede estar intentando aadir, actualizar o borrar registros de un tabla indizada desde una tabla no indizada mediante el componente TBatchMove. Por
ejemplo, si la tabla Source contiene una clave primaria, y la tabla Destination
no, y llama al mtodo Execute del componente TBatchMove (en tiempo de ejecucin o en tiempo de diseo desde el entorno integrado de Delphi; vea la seccin de Informacin Adicional) mientras la propiedad Mode del componente
TBatchMove tiene asignado el valor batAppendUpdate, batDelete o batUpdate,
obtendr este mensaje de error.

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

Los Tomos de Delphi: Delphi sin problemas


3. Asigne a la propiedad Mode del componente TBatchMove la operacin
deseada (batAppend, batAppendUpdate, batCopy, batDelete o batUpdate).
4. Pulse el botn derecho del ratn sobre el componente TBatchMove.
5. Seleccione Execute desde el men de contexto.
Para ms informacin, consulte TBatchMove en la ayuda de Delphi.

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).

Directory is controlled by other .NET file


Posible causa de error
1. Puede estar intentando acceder a una tabla que est siendo actualmente
utilizada por alguien cuya configuracin del parmetro NetDir de Paradox
difiere del suyo. Todos los usuarios deben compartir el mismo archivo de
control de red (PDOXUSRS.NET) para habilitar el acceso concurrente a la
tabla.
2. Pueden haber archivos de control de red (PDOXUSRS.NET) o archivos de
bloqueos (*.LCK) invlidos en su sistema. Estos archivos se quedan algunas veces despus de una terminacin anormal del programa (una cada
del sistema).
3. Puede no tener configurado a True el parmetro Local Share mientras
accede a un directorio en una red local punto a punto.

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

Los Tomos de Delphi: Delphi sin problemas


Si es necesario, mueva el archivo al directorio indicado en WIN.INI, o modifique la entrada de WIN.INI para que coincida con la ubicacin del archivo.

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

Los Tomos de Delphi: Delphi sin problemas

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

Objetos mostrar SoftBatchMove1: TSoftBatchMove cuando el componente descendiente tenga el foco.

Disk read error


Posible causa de error
Puede haber intentado leer ms all del final de un archivo. Por ejemplo, si
est leyendo un archivo de 50 lneas, lo siguiente generar este mensaje de
error:
var
s: String;
I: Integer;
begin
AssignFile(states,'50states.txt');
Reset(states);
i := 0;
while i < 232 do
begin
readln(states, s);
inc(i);
end;
. . .

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.

Disk write error


Posible causa de error
Puede haber llamado a uno de los siguientes procedimientos cuando el disco en
el que est intentando escribir est lleno o ha quedado lleno como resultado de
la operacin:
CloseFile

190

Los Tomos de Delphi: Delphi sin problemas


Flush
Write
Writeln

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.

Dispid <> already used by <>


Posible causa de error
Puede estar intentando utilizar un identificador dispid que ya ha sido asignado
a otro procedimiento de la clase. Por ejemplo, lo siguiente producira este mensaje de error:
automated
procedure OnClick; dispid 1;
procedure OnKeyPress(var Key: Smallint); dispid 1;

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

Dispid clause only allowed in OLE automation section


Posible causa de error
Una directiva Dispid ha sido aadida a una propiedad que no est situada en
la seccin Automated de la clase. Por ejemplo, lo siguiente generar este mensaje de error:
Public
. . .
property rillest8: integer read getF14 dispid 3;

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.

Dispose not supported (nor necessary) for dynamic arrays


Posible causa de error
Puede haber intentado aplicar el procedimiento Dispose a un array dinmico.
Por ejemplo, lo siguiente generar este mensaje de error:
procedure BusyWork;
var argh : array of integer;
begin
SetLength(argh, 12); . . .
Dispose(argh); . . .

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

Los Tomos de Delphi: Delphi sin problemas

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.

Duplicate case label


Posible causa de error
Este mensaje de error se produce cuando hay ms de una etiqueta de opcin
con el mismo valor en una sentencia Case.

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;

Puede especificar mltiples constantes en una lnea, pero ninguna de ellas


puede ser utilizada ms de una vez en la misma sentencia Case. Por ejemplo,
las dos siguientes sentencias son vlidas:
function GetFirstInitial(shagger: outfielders): string;
var
FirstInitial: char;

194

Los Tomos de Delphi: Delphi sin problemas


begin
case shagger of
anderson,surhoff: FirstInitial := 'B';
davis: FirstInitial := 'E';
carter,hammonds,walton: FirstInitial := 'J';
tarasco: FirstInitial := 'T';
end;
Result := FirstInitial;
end;
....
function StartersEvaluation(innings: integer): string;
var
outing: string;
begin
case InningsPitched of
1..3: outing := 'Bombed';
4 : outing := 'Poor';
5,6 : outing := 'Decent';
7,8 : outing := 'Good';
9 : outing := 'Excellent';
end;
Result := outing;
end;

Duplicate database name <>


Posible causa de error
Puede haber asignado a la propiedad DatabaseName de un componente TDatabase un nombre ya asignado a otro componente TDatabase existente en el
formulario.

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

Duplicate dynamic method index


Posible causa de error
Puede haber asignado el mismo cdigo de mensaje a dos procedimientos que
responden a un mensaje de ventana especfico. Por ejemplo, lo siguiente generar este mensaje de error:
const
GOTTA_GETTA_MESSAGE_TO_YOU = WM_User + 160;
MESSAGE_IN_A_BOTTLE = WM_User + 160;
type
TTooMuchMonkeyBusiness = class(TComponent)
procedure HereComesTheNewBoss(var Msg: TMessage);
message GOTTA_GETTA_MESSAGE_TO_YOU;
procedure SameAsTheOldBoss(var Msg: TMessage);
message MESSAGE_IN_A_BOTTLE;
end;

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.

Duplicate field name <>


Posible causa de error
Puede estar intentando utilizar el mismo nombre para varios campos de base
de datos. Por ejemplo, puede estar creando campos as:

196

Los Tomos de Delphi: Delphi sin problemas


with Table1 do begin
. . .
with FieldDefs do begin
Clear;
Add('Outstanding', ftBoolean, 0, True);
Add('Outstanding', ftString, 30, False);
end;

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.

Duplicate implements clause for interface <>


Posible causa de error
Puede haber declarado dos propiedades delegadas para la misma interfaz. Por
ejemplo, lo siguiente generar este mensaje de error:
property SomeInterface: ISomeInterface
read ReadItAndWeep implements ISomeInterface;
property SomeOtherInterface: ISomeInterface
read ReadItAndRejoice implements ISomeInterface;

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.

Duplicate message method index


Posible causa de error
Puede haber utilizado el mismo ndice de mensaje para ms de un mtodo de
gestin de mensaje. Por ejemplo, lo siguiente ocasionar este mensaje de error,
ya que intenta asignar el procesamiento del mensaje WM_CHAR a dos
mtodos:
type
TForm1 = class(TForm)
private
{ Private declarations }
public
procedure WMChar(var Message: TWMChar); message WM_CHAR;
procedure WMKeyDown(var Message: TWMChar); message WM_CHAR;
end;

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

Los Tomos de Delphi: Delphi sin problemas


3. Puede haber intentado aadir manualmente un recurso al archivo .RES del
proyecto.

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.

Con el elemento seleccionado, pulse con el botn derecho del ratn


sobre l y seleccione la opcin Rename del men de contexto.
f. Introduzca un nuevo nombre.
g. Seleccione File | Exit, y luego Yes para grabar los cambios realizados.
3. Si quiere aadir recursos adicionales, utilice un archivo de recursos
separado, dndole un nombre que no entre en conflicto con el nombre del
proyecto o cualquiera de los nombres de unidades. Aada su archivo de
recursos personalizado a Delphi. Por ejemplo, para aadir un archivo de
recursos que haya creado con el nombre Whatever.RES, introduzca una
lnea como:
{$R Whatever.Res}

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

Duplicate session name <>


Posible causa de error
Puede haber asignado el mismo valor a la propiedad SessionName de dos componentes TSession.

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.

Duplicate Tag Value


Posible causa de error
Puede haber declarado un registro variante que se refiere al mismo valor en la
seccin Case ms de una vez. Por ejemplo, lo siguiente generar este mensaje
de error, ya que True ha sido especificado dos veces:
Type
TProgrammer = record
FirstName, LastName: string[40];
DateOfFirstHelloWorldProgram: TDateTime;
case BorlandTools: Boolean of
True: (BorlandConferencesAttended: Integer);
True: (FrontalLobotomiesUndergone: Integer);
end;

Solucin rpida
Cambie la segunda aparicin de True por False.

Informacin adicional
No confunda los registros variantes con el tipo de datos Variant.

200

Los Tomos de Delphi: Delphi sin problemas

Dynamic method or message handler not allowed here


Posible causa de error
Puede haber especificado un mtodo de gestin de mensaje o un mtodo dinmico como mtodo de acceso de lectura o escritura de una propiedad. Por ejemplo, cualquiera de las declaraciones siguientes generar este mensaje de error:
private
function Dynamo: Integer; dynamic;
procedure wmuserchanged(var Message: TMessage);
message WM_USERCHANGED;
. . .
published
property propwash: integer read dynamo;
property improper: integer write wmuserchanged;
type
IMPei = interface
function Accessor: IMPei; dynamic;
property IMPei: IMPei read Accessor
implements IWhatFlavor;
end;

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;

-OElimine la directiva Dynamic o Message.

Informacin adicional
Para ms informacin, consulte creating properties y dynamic methods en
la ayuda de Delphi.

Mensajes de error

201

Dynamic method or message handlers not allowed in OLE


automation sections
Posible causa de error
Puede haber declarado un mtodo dinmico o de gestin de mensaje en una
seccin Automated de una clase. Por ejemplo, cualquiera de las siguientes
declaraciones generar este mensaje de error:
automated
procedure dynamo; dynamic;
procedure wmvscrollclipboard(var Message: integer);
message WM_VSCROLLCLIPBOARD;

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

Los Tomos de Delphi: Delphi sin problemas

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

Los Tomos de Delphi: Delphi sin problemas

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

Este error es la clase base de los siguientes descendientes: EClassNotFound,


EInvalidImage, EMethodNotFound y EReadError.

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

Los Tomos de Delphi: Delphi sin problemas


CloseFile(globalLog);
except
on EInOutError do
if MessageDlg(
'Problema al grabar el archivo. Salir de todas formas?',
mtError, [mbYes,mbNo], 0) = mrNo then
Exit; {sale del procedimiento, no del programa}
end;
end;
. . .

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.

EInvalidOperation: Cannot create form. No MDI forms are currently


active
Consulte Cannot create form. No MDI forms are currently active.

EInvalidOperation: Cannot make a visible window modal


Consulte Cannot make a visible window modal.

208

Los Tomos de Delphi: Delphi sin problemas

EInvalidPointer
Consulte Invalid pointer operation.

Element 0 Inaccessibleuse Length or SetLength


Posible causa de error
Puede estar intentando acceder al elemento 0 de una variable de tipo String en
Delphi de 32 bits. Por ejemplo, el siguiente intento de almacenar el elemento
de ndice 0 en la variable de tipo Byte LengthByteContents generar este mensaje de error:
procedure Bight;
var
s : String;
LengthByteContents : Byte;
begin
s := 'Cheese';
LengthByteContents := s[0];
end;

El siguiente intento de asignar un valor al elemento 0 tambin generar este


mensaje de error:
program Produce;
var
s: String;
LengthByteSize: Integer;
begin
LengthByteSize := 25;
s[0] := LengthByteSize;
end;

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;

Para asignar la longitud de la cadena, haga esto:

Mensajes de error

209

procedure SetStringLength(s: String; ANumber: Integer);


begin
SetLength(s, ANumber);
end;

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;

END expected but <> found


Posible causa de error
Puede haber aadido algo sobrante a una sentencia, como un parntesis derecho donde no es necesario.

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.

END expected but implementation found


Posible causa de error
Puede haber omitido el End que era necesario para terminar una declaracin
de tipo en la parte Interface de una unidad.

210

Los Tomos de Delphi: Delphi sin problemas

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!}

END. missing at end of module


Posible causa de error
1. Puede que no haya concordancia entre los pares Begin y End.
2. Puede haber olvidado aadir la palabra reservada End al final de una sentencia Case, un bloque Try. . . Finally o un bloque Try. . . Except.
3. Puede haber en realidad un End final, pero el compilador no puede verlo
por alguna razn. Por ejemplo, puede haber dejado una llave abierta ({ ) en
el cdigo en algn lugar, que est causando que todo lo que est despus de
l sea considerado como un comentario, ya que no existe una llave derecha
( }) correspondiente para cerrar la seccin de comentario.

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

A partir de Delphi 3 estn disponibles las plantillas de cdigo (code templates).


Consulte code templates en la ayuda de Delphi para ms detalles, o seleccione Tools | Environment Options, y la pgina Code Insight. La seccin
Code Templates muestra una lista de plantillas predefinidas y una ventana
que las despliega. Por ejemplo, la plantilla de cdigo predefinida tryf es la
siguiente:
try
|
finally
end;

La barra vertical muestra dnde se ubicar el cursor despus de utilizar esta


plantilla de cdigo exactamente en donde debe empezar a codificar el bloque
Try. . . Finally.
Para utilizar una plantilla de cdigo, siga estos pasos:
1. En la ventana de cdigo, pulse Ctrl + J.
2. Seleccione de la lista la plantilla de cdigo que desee.
3. Pulse la tecla Intro.

EOLEError
Consulte Class not registered.

EOLEException
Consulte OLE error 800A03EC.

EOleSysClass not Registered


Consulte Class not registered.

EOleSysError
Consulte Error loading type library/dll.

212

Los Tomos de Delphi: Delphi sin problemas

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

Los Tomos de Delphi: Delphi sin problemas


Nota: Para conservar los recursos:
Mueva tantos formularios como sea posible de la lista Auto-Create a la lista
Available.
Siempre que sea posible, utilice componentes grficos en lugar de componentes de
ventana. Los componentes grficos no necesitan un controlador de ventana. Por
ejemplo, si desea mostrar una cadena de texto de slo lectura, utilice un TLabel en
lugar de un control TEdit.

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}

Si tiene una clusula Uses en la seccin Implementation, la directiva {$R}


debe aparecer despus de la clusula Uses, as:
implementation
Uses
ItsNoggin, TimeWisely, HardlyAnyOil;
{$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

Los Tomos de Delphi: Delphi sin problemas


interface
{Una unidad pura:
1) No contiene ninguna seccin Uses con muchas unidades aadidas
automticamente, como en el caso de una unidad de formulario.
2) No contiene ninguna declaracin de tipo aadida
automticamente, como en el caso de una unidad de formulario.
3) No contiene ninguna instancia de variable aadida
automticamente, como en el caso de una unidad de formulario}
implementation
{4) No contiene ninguna directiva {$R *.DFM} aadida
automticamente, como en el caso de una unidad de formulario}
end.

Si todo lo anterior falla, compare el archivo de formulario (.DFM) con el


archivo de unidad (.PAS) y asegrese de que todos los componentes, propiedades y mtodos declarados estn presentes en ambos. Para ver el archivo de formulario .DFM como un texto, pulse con el botn derecho del ratn sobre el
formulario en tiempo de diseo y seleccione la opcin View as Text del men
de contexto. Cuando haya finalizado de ver el archivo .DFM, realice el proceso
inverso (pulse con el botn derecho del ratn sobre la ventana de cdigo y
seleccione View as Form del men de contexto).

Error 0: RLINK32 Error opening file <TypeLibrary>.tlb


Posible causa de error
Puede estar intentando crear un servidor de automatizacin, ActiveForm o control ActiveX y sus DLLs de OLE son antiguas.

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.

Error 2File not found


Consulte File <> not found.

Error 4Too many open files


Consulte Too many open files.

Mensajes de error

Error 68Circular Unit Reference


Consulte Circular Unit Reference.

Error 76Constant out of range


Consulte Constant out of range.

Error 94. Expected


Consulte . Expected.

Error 101Disk write error


Consulte Disk write error.

Error 102File not assigned


Consulte File not assigned.

Error 103File not open


Consulte File not open.

Error 104File not open for input


Consulte File not open for input.

Error 105File not open for output


Consulte File not open for output.

Error 200Division by zero


Consulte Division by zero.

217

218

Los Tomos de Delphi: Delphi sin problemas

Error 201Range check error


Consulte Range check error.

Error 202Stack overflow error


Consulte Stack overflow.

Error 203Heap overflow error


Consulte EOutOfMemory.

Error 204Invalid pointer operation


Consulte Invalid pointer operation.

Error 207Invalid floating point operation


Consulte Invalid floating point operation.

Error 210Abstract Method Error


Consulte Abstract Method Error.

Error 215Arithmetic overflow error


Consulte Arithmetic Overflow Error.

Error 216Access Violation


Consulte Access Violation.

Error 219Invalid Typecast


Consulte Invalid typecast.

Mensajes de error

219

Error 220Invalid Variant Typecast


Consulte Invalid variant type conversion.

Error 227Assertion failed


Consulte Assertion failed.

Error Creating Cursor Handle


Posible causa de error
Este error normalmente ocurre cuando Delphi no recibe un conjunto resultado
cuando lo est esperando.
1. Puede haber intentado asignar el valor True a la propiedad Active de un
componente TQuery o llamar a su mtodo Open mientras la propiedad SQL
del TQuery contena una sentencia SQL que no devuelve un conjunto resultado (en otras palabras, no una sentencia SELECT, sino una sentencia
INSERT, UPDATE o DELETE).
2. Puede haber intentado asignar el valor True a la propiedad Active de un
componente TStoredProc o llamar a su mtodo Open mientras no tena un
valor asignado a la propiedad StoredProcName.

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;

2. Asigne un valor a la propiedad StoredProcName antes de intentar asignar


True a la propiedad Active o llamar a su mtodo Open. La propiedad DataBaseName debe estar asignada a un alias que describa una base de datos
de servidor SQL, como InterBase, Oracle, MS SQL Server, Sybase, Informix, etc. Los procedimientos almacenados no son una caracterstica de las
bases de datos de escritorio como Paradox, dBASE, MS Access, etc.

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

Los Tomos de Delphi: Delphi sin problemas


local, y son una de las ventajas principales de las bases de datos SQL sobre
las bases de datos locales (de escritorio).

Error creating form: access violation at. . . vcl[30,40,50,60]


Posible causa de error
Puede haber cambiado el nombre del formulario en el cdigo, as:
procedure ChChChChChanges;
begin
Form1.Name := 'whatever';
end;

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?

Error creating form: Ancestor for <> not found


Posible causa de error
Puede estar utilizando herencia visual de formularios y no haber incluido todos
los formularios ancestros en su proyecto.

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

Error Creating Form: Cannot inherit from form <>. Contains a


component <> that does not support inheritance
Posible causa de error
Utilizando la herencia visual de formularios en Delphi de 32 bits, puede haber
intentado heredar de un formulario que contiene un componente
TTabbedNotebook.

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.

Error Creating Form: Cannot inherit from form <>. It contains a


component with a blank name property
Posible causa de error
Puede haber intentado heredar de un formulario del proyecto actual que contiene un componente con la propiedad Name en blanco.

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

Los Tomos de Delphi: Delphi sin problemas

2.
3.
4.
5.

6.
7.
8.

Si slo quiere que el formulario est disponible para el proyecto actual, no


necesita hacer nada ms. El formulario ancestro est disponible automticamente para ser heredado.
Si quiere que el formulario est disponible para otros proyectos (y no solamente para el proyecto actual), siga estos pasos adicionales:
Pulse el botn derecho del ratn sobre el formulario y seleccione Add To
Repository.
Proporcione un ttulo para el formulario en el cuadro de edicin Title.
Opcionalmente, proporcione una descripcin en el cuadro de edicin.
Seleccione o introduzca la pgina del Almacn de Objetos (Object Repository) en la que quiere que aparezca el formulario en el cuadro de
combinacin Page.
Opcionalmente, introduzca su nombre en el cuadro de edicin Author.
Opcionalmente, seleccione un icono para representar el formulario.
Pulse el botn OK.

Para heredar de un formulario, siga estos pasos:


1. Seleccione File | New.
2. Seleccione el formulario del que desea heredar en la pgina del Almacn
donde se encuentre.
Si hereda de un formulario que tiene un botn llamado Button1, el botn en el
formulario heredado ser exactamente el mismo botn ancestro (el nico que
est en el formulario del que est heredando). Todas las propiedades, incluyendo los gestores de eventos, sern heredados. Por ejemplo, si el formulario
ancestro tiene un botn con la propiedad Caption asignada a Belly, la propiedad Tag asignada a 7, y el siguente gestor del evento OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;

El botn del formulario heredado tambin tendr la propiedad Caption igual a


Belly, la propiedad Tag igual a 7, y su gestor del evento OnClick heredar del
gestor del ancestro:
procedure TForm2.Button1Click(Sender: TObject);
begin
inherited;
end;

Mensajes de error

223

Error creating form: Cannot open file <>.DFM


Posible causa de error
Puede estar intentando abrir un archivo .PAS, y su correspondiente archivo de
formulario (.DFM) contiene errores, se ha daado o no est en el mismo lugar
que el archivo .PAS que est intentando abrir.

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.

Error Creating Form: Duplicate resource [Type:,Name:]


Posible causa de error
Puede estar cargando un proyecto en una versin de Delphi anterior a la que
se utiliz para compilarlo. Por ejemplo, puede estar abriendo un proyecto
creado con Delphi 2 en Delphi 1.

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

Los Tomos de Delphi: Delphi sin problemas


En Delphi 4 o superior, Project | Build <Proyecto>. Todas las unidades
sern recompiladas para la versin actual de Delphi que est ejecutando.
Alternativamente, puede borrar el archivo .RES del proyecto (el archivo con el
nombre del proyecto y extensin .RES). La prxima vez que compile, el archivo
.RES apropiado ser recreado para la versin de Delphi que est utilizando.

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.

Error Creating Form: Invalid Stream Format


Posible causa de error
Puede estar intentando portar una aplicacin a una versin de Delphi anterior
a la utilizada cuando se compil la aplicacin por ltima vez.

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.

Error creating Process


Posible causa de error
Puede estar haciendo referencia a DLLs en Windows NT especificando la
extensin (.DLL). Por ejemplo, lo siguiente generar este mensaje de error en
NT:
procedure HawaiianPunch; external pineappl.DLL';

Aunque es la forma apropiada de hacerlo en otras versiones de Windows.

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

Los Tomos de Delphi: Delphi sin problemas

Error Creating Variant Array


Posible causa de error
Puede haber intentado crear un array variante de cadenas utilizando el tipo de
datos varString. Por ejemplo, lo siguiente generar este mensaje de error:
procedure TForm1.Button1Click(Sender: TObject);
var
Roster: Variant;
begin
Roster := VarArrayCreate([0,40], varString);
. . .

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.

Error Creating Window


Posible causa de error
Puede tener simultneamente demasiados manejadores de ventanas.

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

que reciben el foco de entrada en otras palabras, clases descendientes de


TWinControl) es un ventana y requiere un manejador de ventana.
Utilice controles grficos (descendientes de TGraphicControl) siempre que sea
posible. Por ejemplo, utilice componentes TLabel para mostrar texto en lugar
de TEdit, y componentes TBevel en lugar de TPanel si todo lo que necesita es
proveer una separacin visual entre diferentes reas del formulario.
Exceptuando al formulario principal, cree tantos formularios como sea posible
dinmicamente; particularmente aquellos que no necesariamente estarn
abiertos durante toda la ejecucin de la aplicacin por ejemplo, un cuadro de
dilogo Acerca de.

Error debug setting hook


Posible causa de error
Puede haber terminado la ejecucin de su aplicacin de un modo anormal, por
ejemplo pulsando Ctrl+F2.

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.

Error in CREATE INDEX statement


Posible causa de error
Probablemente tiene un error de sintaxis en una sentencia CREATE INDEX
de SQL. Por ejemplo, lo siguiente generar este mensaje de error:
with TADOQuery.Create(nil) do
try
Connection := ADOConnection1;
SQL.Add('CREATE INDEX ORD_SEQ (ORDER_SEQUENCE) ON SCRIPTURES');
ExecSQL;
finally
Free;
end;

228

Los Tomos de Delphi: Delphi sin problemas

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;

En otras palabras, la sintaxis correcta en este caso es:


CREATE INDEX <NombreIndice> ON <NombreTabla> (<NombreCampo>)

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.

Error in module <>: Call to Application.CreateForm is missing or


incorrect
Consulte Call to Application.CreateForm is missing or incorrect.

Error in module <>: CONTAINS clause is incorrect


Consulte CONTAINS clause is incorrect.

Error in module <>: Declaration of class <> is missing or incorrect


Consulte Declaration of class <> is missing or incorrect.

Error in module <>: END. missing at end of module


Consulte END. missing at end of module.

Mensajes de error

229

Error in module <>: Implementation part USES clause incorrect


Consulte Implementation part USES clause incorrect.

Error in module <>: Incorrect field declaration: class <>


Consulte Incorrect field declaration: class <>.

Error in module <>: REQUIRES clause is incorrect


Consulte REQUIRES clause is incorrect.

Error in module <>: USES clause is missing or incorrect


Consulte USES clause is missing or incorrect.

Error initializing BDE ($2B05)


Posible causa de error
Puede estar intentando ejecutar una aplicacin que necesita el BDE en una
mquina que no tiene el BDE instalado.

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.

Error loading type library/dll


Posible causa de error
El archivo STDVCL[32,40].DLL no se encuentra, est en el lugar equivocado o
no est registrado.

230

Los Tomos de Delphi: Delphi sin problemas

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

Para eliminar del Registro un servidor o biblioteca de tipos.

-q

Para operar en modo silencioso.

-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)

Error Opening Component Library


Posible causa de error
Puede haber instalado un componente que se enlaza estticamente (es decir, a
travs de sentencias External) a una .DLL que no puede ser encontrada.

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.

Error reading <>.<>: <>


Posible causa de error
1. Puede ser que los componentes a los que se hace referencia en el archivo de
formulario (.DFM) no estn disponibles. Puede haber desinstalado esos
componentes despus de utilizarlos en un proyecto. Esto ocurre ms frecuentemente con componentes de terceros.
2. Puede haber abierto un proyecto en una versin de Delphi anterior a la que
utiliz para compilar el proyecto. En este caso, podrn aparecer uno o ms
mensajes que indiquen que cierta propiedad no existe.
3. Puede manualmente haber editado el archivo de formulario (.DFM) independientemente del archivo .PAS, tal vez cambiando un tipo de objeto por
otro. Si es as, habr propiedades que un objeto tiene y el otro no, ocasionando este problema.
4. Puede ser que Delphi no pueda encontrar un archivo de configuracin necesario, como IDAPI32.CFG.

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

Los Tomos de Delphi: Delphi sin problemas


a. Seleccione Inicio | Ejecutar.
b. Introduzca regedit en el cuadro de combinacin Abrir... y pulse el
botn OK (o presione la tecla Intro).
c.

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.

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.
Posible causa de error
1. Puede haber intentado cambiar un componente por otro que no es compatible editando el archivo .DFM. Por ejemplo, puede haber cambiado
TDateTimePicker por TEdit, en cuyo caso la parte <PropertyName> del
mensaje sera <CalAlignment> (el primer mensaje de error de este tipo que
se obtendra en esta ocasin).
2. Puede haber abierto un proyecto en una versin de Delphi anterior a la utilizada para crear el proyecto. Por ejemplo, ha creado el proyecto con Delphi
4, y luego intentado abrirlo en Delphi 3. En ese caso, el mensaje puede contener <NombreFormulario>.OldCreateOrder.
3. Puede haber eliminado un paquete de su sistema y luego intentado abrir
un proyecto que utiliza componentes contenidos en dicho paquete.
4. Puede haber eliminado algunos paquetes que pens que nunca utilizara
(como FastNet o QuickReports) y luego haber abierto un proyecto de
demostracin que utiliza uno de esos paquetes.

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

propiedades ya no estarn en ocasiones posteriores en que abra el proyecto.


Lo contrario (es decir, abrir un proyecto creado en Delphi 3 con Delphi 4)
normalmente funciona bien.
3, 4Cargue el paquete que contiene el componente al que se hace referencia en
el mensaje de error (Component | Install Packages) para resolver los
posibles errores mencionados en el punto 3 y 4.

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.

Error reading <Database>.SessionName. Duplicate database name


<>
Posible causa de error
Puede tener asignada a False la propiedad HandleShared de un componente
TDatabase.

Solucin rpida
Asigne True a la propiedad HandleShared del componente TDatabase.

Informacin adicional
Para ms informacin, consulte HandleShared en la ayuda de Delphi.

Error reading <Session>.SessionName. Duplicate session name <>


Posible causa de error
Puede tener asignada a False la propiedad AutoSessionName del componente
TSession.

Solucin rpida
Asigne True a la propiedad AutoSessionName del componente TSession.

234

Los Tomos de Delphi: Delphi sin problemas

Informacin adicional
Para ms informacin, consulte AutoSessionName en la ayuda de Delphi.

Error reading symbol file


Posible causa de error
1. El archivo de smbolos del proyecto (.DSM) puede estar daado o no sincronizado con el proyecto.
2. Puede estar abriendo en Delphi de 32 bits un proyecto que ha compilado
con Delphi 1, y el proyecto contiene un archivo de smbolos (.DSM) de 16
bits.
3. Puede haber movido un proyecto a un directorio o mquina diferente.
4. Puede estar ejecutando un programa creado en otra mquina que hace
referencia en el archivo .DSK a un directorio que no es vlido.

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

Error saving I(Interface): The parameter is incorrect


Posible causa de error
Puede estar intentando crear un servidor de automatizacin, ActiveForm o control ActiveX y las .DLLs de OLE no estn actualizadas.

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.

Error setting debug exception hook


Posible causa de error
1. Puede estar experimentando un fallo menor en Delphi.
2. Uno o ms archivos de unidades compiladas (.DCU) pueden estar daados.

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

Los Tomos de Delphi: Delphi sin problemas

Error starting Program. The <>.DLL file appears to be corrupt.


Reinstall the file, and then try again.
Posible causa de error
Puede haber intentado ejecutar en Delphi de 32 bits un programa que utiliza
una .DLL de 16 bits.

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']);

Para ms informacin, consulte TDataset.FieldValues en la ayuda de Delphi.

Except or Finally expected


Posible causa de error
1. Ha omitido la palabra reservada Finally o Except despus de utilizar la
palabra reservada Try. Por ejemplo, lo siguiente generar este mensaje de
error:
procedure TForm1.SiskoAndEbertClick(Sender: TObject);
var

238

Los Tomos de Delphi: Delphi sin problemas


TwoThumbsUp: String;
begin
try
TwoThumbsUp := 'Waylon and Willie meet Godzilla';
end; {con o sin este 'end' el mensaje de error es el mismo}
end;

2. Puede tener un parntesis invlido en el cdigo. Por ejemplo, lo siguiente


generar este mensaje de error:
sl[BillToNamePos] := PadL(sl[BillToNamePos],50));

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;

Los bloques Try. . . Except se utilizan generalmente para proveer respuestas a


errores especficos. Un ejemplo de utilizacin del bloque Try. . . Except es:
try
Dividend := StrToInt(Edit1.Text);
Divisor := StrToInt(Edit2.Text);
Quotient := Dividend div Divisor;
except
on EDivByZero do
ShowMessage('Introduzca un valor ms grande que 0 '

Mensajes de error

239

+#13#10+ ' en el cuadro de edicin Divisor);


Edit2.SetFocus;
end;
end;

Exception <> in module <> at <>.<>


Posible causa de error
Este es el mensaje de error por defecto que se obtiene si una excepcin hace
todo el recorrido hacia arriba (la excepcin no ha sido atrapada por su cdigo
o el cdigo de la VCL).

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.

Expected an identifier but function found


Posible causa de error
Puede haber olvidado aadir el parntesis final a la signatura de un procedimiento o funcin. Por ejemplo, lo siguiente generar este mensaje de error:
procedure CalculateDueDate(AAgencyID, AEmployerID: Integer;
APayrollDate: TDate;

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

Los Tomos de Delphi: Delphi sin problemas

Expecting a column separator in table [header]


Posible causa de error
La tabla indicada en el mensaje de error es probablemente una tabla Paradox
que se ha daado de algn modo.

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).

Exports allowed only at global scope


Posible causa de error
Puede haber aadido la clusula Exports a un procedimiento o funcin local.

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.

Expression expected but <> found


Posible causa de error
1. Puede haber omitido algo. Por ejemplo, la siguiente sentencia (en la que
falta el segundo operando, que debera aparecer despus del signo ms)
genera este mensaje de error:
LblIntegerAddition.Caption := IntToStr(1+);

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)

En este caso, el mensaje de error especfico sera Expression expected


but CLASS found.

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;

3. No declare tipos en secciones Const.

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;

External error C0000006


Posible causa de error
Puede haber instalado un componente inestable de un tercero.

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

Los Tomos de Delphi: Delphi sin problemas

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.

External error C0000012


Posible causa de error
Ya que es un error externo, no es un fallo de Delphi. Puede ser una excepcin
no manejada en una .DLL o cualquier otra cosa.

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.

External exception C0000008


Posible causa de error
Puede estar utilizando el cliente de SQL Net versin 2.3.3.

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.

En Delphi, seleccione Tools | Options | Preferences | Debugging,


y desmarque la casilla Integrated Debugging.
d. Utilice una versin del cliente Oracle SQL Net anterior a la 2.3.3.

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.

Failed to get data for <>


Posible causa de error
Puede haber intentado obtener datos del Registro del sistema a una variable
de un tipo de datos que difiere del tipo de datos del valor obtenido. Por ejemplo, lo siguiente generar este mensaje de error si el valor ThirdBase almacenado en el Registro es un entero (o de hecho cualquier otra cosa distinta a un
String):
function GoSeeCal: String;
var
ReggiesTree: TRegistry;
begin
ReggiesTree := TRegistry.Create;
try
ReggiesTree.RootKey := HKEY_CURRENT_USER;
ReggiesTree.OpenKey('\drmtmale\Baltimore Orioles', False);
Result := ReggiesTree.ReadString('ThirdBase');
finally
ReggiesTree.Free;
end;
end;

244

Los Tomos de Delphi: Delphi sin problemas

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.

Failed to load stream


Consulte BLOb has been modified, nmero 2.

Fatal Error: <>: Required Package <> not found


Consulte Required package <> not found.

Mensajes de error

245

Field <> cannot be modified


Posible causa de error
1. Puede estar intentando modificar la propiedad Params de un objeto
TClientDataSet despus que ha sido asignada, sin primero borrar el contenido original de Params.
2. Puede estar intentando hacer una bsqueda utilizando un ndice distinto al
ndice actual.

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.

Field <> cannot be used in a filter expression


Posible causa de error
1. Puede estar intentando filtrar por un campo calculado.
2. Puede estar intentando filtrar por un campo cuyo tipo de datos no permite
utilizarlo en filtros (como un grfico).

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'

debido a que Name es uno de los campos de datos de la tabla.


Sin embargo, si crea un campo calculado (por ejemplo, Density, basado en
los campos Population y Area), las siguientes expresiones de filtro no sern
permitidas en la propiedad Filter del TDataSet, y generarn este mensaje
de error:

246

Los Tomos de Delphi: Delphi sin problemas


Density > 6

2. Un filtro que compare cadenas o valores numricos no trabajar con ciertos


tipos de datos (como TGraphicField y TMemoField), y por lo tanto los campos de estos tipos de datos provocarn este mensaje de error si los utiliza
en una expresin de filtro. Un ejemplo podra ser el siguiente filtro aplicado a la tabla Biolife de Paradox que viene con Delphi:
Graphic > 8

Field <>.<> does not have a corresponding component. Remove


the declaration?
Posible causa de error
1. Tiene una referencia en el archivo .PAS que no tiene una referencia correspondiente en el archivo .DFM.
2. Puede obtener este mensaje de error si despus de recibir el mensaje de
error Class <> not found. Ignore the error and continue? contina
con la carga del proyecto (despus de ignorar el mensaje de error anterior).
3. Puede haber borrado manualmente la referencia al campo en el archivo
.DFM.
4. Puede haber modificado la declaracin del campo en el archivo .PAS. Por
ejemplo, puede haber cambiado:
type
TForm3 = class(TForm)
Label1: TLabel;

a:
type
TForm3 = class(TForm)
abel1: TLabel; {borr la L de Label1}

5. Puede haber intentado aadir manualmente un tipo de clase en la parte


Published del archivo de unidad, as:
type
TForm1 = class(TForm)
Image1: TImage;
Chloro: Form; {esta lnea ocasiona el error}
private
{ Declaraciones Private }
public
{ Declaraciones Public }
end;

Solucin rpida
1. Seleccione Yes para borrar la declaracin.

Mensajes de error

247

2. Si quiere luego volver a insertar la referencia en el archivo .DFM, es ms


fcil aadir el componente de nuevo al formulario, lo que automticamente
reinsertar la referencia en el archivo .DFM.
3. Vuelva a insertar la referencia que haya borrado en el archivo .DFM.
4. Restaure la declaracin del campo para que est acorde con el nombre del
componente en el Inspector de Objetos.
5. Cuando aada campos de tipos de clase, no los aada a la parte Published
de un archivo de unidad de formulario (.PAS). Lo siguiente es aceptable:
type
TForm1 = class(TForm)
Image1: Timage;
private
Concrete: Form;
public
{ Public declarations }
end;

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 <>.

Field <> is not indexed and cannot be modified


Posible causa de error
Puede estar intentando buscar por un campo de una tabla local (Paradox o
dBASE) que (a) no est indizado o (b) est indizado, pero la propiedad
IndexFieldNames del objeto TTable no tiene asignada una clave primaria (simple o compuesta), o la propiedad IndexField no tiene asignada una clave secundaria. Por ejemplo, lo siguiente generar este mensaje de error si se da alguna
de esas posibilidades:
with Table1 do
begin
SetRangeStart;
FieldByName('Ballyard').AsString := 'Camden';
SetRangeEnd;
FieldByName('Ballyard').AsString := 'Wrigley';
ApplyRange;
end;

248

Los Tomos de Delphi: Delphi sin problemas

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';

Si quiere buscar por una clave secundaria, utilice la propiedad IndexField.


Puede hacerlo en el entorno integrado o desde cdigo, as:
IndexName := 'SecondaryIndx';

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.

Field <> is not of the expected type


Posible causa de error
Despus de crear instancias de los campos en tiempo de diseo, puede haber
modificado la estructura de la tabla borrando un campo (o campos) o modificando el nombre de un campo, su tipo de datos o tamao.

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.

Field <> is of an unknown type


Posible causa de error
1. Puede haber intentando ejecutar una consulta parametrizada en el editor
SQL de Delphi. Por ejemplo, puede tener una consulta de estructura similar a sta:
select
SCRIPT_ID,
SCRIPT_DESC,
BUILD_NO,
SCRIPT_TYPE
from
SCRIPTMAIN
where
SCRIPT_TYPE = :SCRIPT_TYPE

2. Puede estar consultando tablas de Access que contienen valores Date y


TimeStamp y tiene asignado el valor True a la propiedad RequestLive del
TQuery.
3. Puede estar utilizando un componente TUpdateSQL con una tabla que contiene un nombre de campo al que se le ha aadido el prefijo OLD_.

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

Los Tomos de Delphi: Delphi sin problemas


BUILD_NO,
SCRIPT_TYPE
from
SCRIPTMAIN
where
SCRIPT_TYPE = 2

2. Asigne False a la propiedad RequestLive.


3. No anteponga el prefijo OLD_ a los nombres de campo. Delphi lo hace
internamente con los registros que estn siendo actualizados, de forma
que pueda comparar el valor antiguo con el valor nuevo. Si tiene un campo
llamado OLD_GEEZER, Delphi pensar que se trata del antiguo valor de
un campo llamado GEEZER. Si no existe un campo llamado GEEZER, se
producir un error.

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.

Field <> is of an unsupported type


Posible causa de error
Puede estar utilizando una versin antigua de algn software de capa intermedia, por ejemplo un versin vieja del BDE.

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

Field <> must have a value


Posible causa de error
Puede haber intentado grabar un registro a la base de datos, pero la tabla
tiene un campo obligatorio (o NOT NULL si es una base de datos de servidor
SQL) al que no se ha asignado un valor.

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);

Para ms informacin sobre la validacin de datos (a nivel de tabla, registro,


campo y carcter) consulte A value must be specified for <>.

252

Los Tomos de Delphi: Delphi sin problemas

Field <> not found


Posible causa de error
1. Puede haber hecho referencia, posiblemente en la propiedad Filter de un
TDataset, a un campo que no existe en el conjunto de datos (un campo calculado, por ejemplo).
2. Puede haber cambiado la propiedad TableName de un componente TTable,
y la propiedad Filter an hace referencia a un campo de la tabla anterior.
3. Despus de crear los campos persistentes utilizando el editor de campos
(Fields Editor), puede haber cambiado la propiedad TableName de un componente TTable.
4. Puede haber especificado en una llamada a AddIndex el nombre de un
campo que no existe en el conjunto de datos subyacente. Por ejemplo, lo
siguiente generar este mensaje de error si no hay un campo llamado City
en Table1:
Table1.AddIndex('City', 'City', []);

5. Puede haber borrado algunos campos de un TTable que anteriormente


haba aadido explcitamente utilizando el editor de campos (Fields
Editor).

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

campo llamado CurrentAddress en una tabla de bsqueda, sera errneo


intentar asignar lo siguiente a la propiedad Filter de KnightsOfTheRound:
CurrentAddress = Tower of London

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

Para volver a la vista normal despus de editar el archivo de formulario,


pulse con el botn derecho del ratn en el editor y seleccione View As
Form del men de contexto.

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

Los Tomos de Delphi: Delphi sin problemas


type
TForm1 = class(TForm)
Edit1: TEdit;

Si cambi luego el TEdit a algo distinto de TEdit, como lo siguiente:


type
TForm1 = class(TForm)
Edit1: CoffeeEdit;

Habr obtenido este mensaje de error.

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.

Field declarations not allowed in interface type


Posible causa de error
Puede haber declarado un campo en un tipo de interfaz. Por ejemplo, lo
siguiente generar este mensaje de error:
IYamWhatIYam = interface(IInterface)
['{360C6A60-6EE0-11D4-A238-705350C10000}']
FSpinachBrand: String; //esto no tiene sentido; provoca el error
function SmoochOliveOil(const unkOuter: Iunknown;
const iid: TIID; out obj): HResult; stdcall;

Mensajes de error

255

function BashBrutus(fLock: BOOL): HResult; stdcall;


end;

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;

Pero no obstante, es simplemente un nombre, despus de todo.

Field definition not allowed after methods or properties


Posible causa de error
1. Puede estar intentando aadir un campo (o campos) a una declaracin de
clase despus de declarar un mtodo o propiedad.
2. Puede haber aadido las directivas Index, Stored, Default o Nodefault despus de una funcin en una seccin Automated. Por ejemplo:
automated
function yowza: string; index;

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

Los Tomos de Delphi: Delphi sin problemas

Field in group by must be in result set


Posible causa de error
Puede tener una sentencia SQL que hace referencia en una clusula GROUP
BY a un campo que no est incluido en la clusula SELECT. Por ejemplo,
puede tener algo as:
SELECT Title, Protagonist, Rating, Count(*)
FROM Movies
WHERE Protagonist = 'Bogart'
OR Protagonist = 'Brando'
GROUP BY Rating

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).

Field in order by must be in result set


Posible causa de error
Puede estar intentado ordenar por un campo que no existe o no ha sido especificado en la clusula SELECT de la sentencia SQL.

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

SELECT de la sentencia SQL, y que el nombre del campo est correctamente


escrito.

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

El campo por el que esta sentencia intenta ordenar no aparece en la clusula


SELECT. Puede rectificar esto aadiendo explcita o implcitamente el campo
Bananas a la clusula SELECT de la sentencia SQL.
Para aadir explcitamente el campo Bananas a la clusula SELECT de la sentencia SQL, haga esto:
SELECT Peaches, Strawberries, Bananas
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

No tiene que limitar su criterio de seleccin a una nica tabla, siempre y


cuando las tablas que seleccione estn relacionadas unas con otras por un
campo comn. Por ejemplo, si quiere encontrar en qu ao los equipos de una
misma ciudad ganaron el campeonato de rugby (SuperBowl) y de bisbol
(World Series), podra hacer esto:
SELECT B.ThatChampionshipSeason
FROM Baseball B, Football F
WHERE B.City = F.City
AND B.ThatChampionshipSeason = F.ThatChampionshipSeason
ORDER BY B.ThatChampionshipSeason

Field index out of range


Posible causa de error
1. Puede estar intentando acceder al ndice de una tabla utilizando un valor
de ndice mayor que el ndice ms alto definido en la tabla. Por ejemplo, lo
siguiente generar este mensaje de error:

258

Los Tomos de Delphi: Delphi sin problemas


with Table1 do
for i := 1 to IndexFieldCount do
. . .

2. Puede estar utilizando los mtodos FindKey o FindNearest de TTable con


tablas dBASE e ndices de expresin.
3. Puede estar intentando indizar una tabla por un campo calculado cuya propiedad FieldKind tiene el valor fkCalculated.
4. Puede estar intentando establecer una relacin Maestro/Detalle entre dos
tablas sin haber asignado a la propiedad IndexName de la tabla de detalle
un ndice que sea compatible con la tabla maestra.

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
. . .

2. Utilice el mtodo GoToNearest del componente TTable si est tratando con


tablas dBASE e ndices de expresiones.
3. Si quiere ordenar por un campo calculado, cambie el valor de la propiedad
FieldKind del campo de fkCalculated a fkInternalCalc.
4. Asigne a la propiedad IndexName de la tabla de detalle la clave fornea
que concuerda con la clave primaria de la tabla maestra.

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.

Field name already exists. Rename one of the fields


Posible causa de error
Puede haber asignado el mismo nombre a dos campos en el Database Desktop.
Por ejemplo, puede tener dos campos con el nombre Address.

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.

Field not found in table


Posible causa de error
1. Puede estar intentando aadir un ndice a una tabla, pero ha especificado
un campo que no existe en el mtodo AddIndex de TTable. Por ejemplo, lo
siguiente generar este mensaje de error si ha escrito mal el campo Geeko
como Gecko:
with Table1
AddIndex('Chipheads', 'Gecko', []);

2. Puede estar intentando aadir un ndice de expresin a una tabla dBASE,


pero no ha especificado ixExpression en el parmetro Options de AddIndex.
Por ejemplo, lo siguiente generar este mensaje de error:
with Table1
AddIndex('CityState',' city+state', []);

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.

Field or method identifier expected


Posible causa de error
1. Puede haber especificado un identificador que no es un campo o mtodo
como identificador de acceso de escritura o lectura de una propiedad. Por

260

Los Tomos de Delphi: Delphi sin problemas


ejemplo, lo siguiente generar este mensaje de error (a menos que
fajdlskdfajlsk sea un campo o nombre de mtodo):
property Rates: string read fajdlskdfajlsk write FRates;

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;

2. Declare el mtodo en la clase antes de hacer una referencia a l a travs de


la propiedad:
private
function GetStartDate: TDateTime;
. . .
public
property StartDate: TDateTime read GetStartDate;
. . .

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;

o utilizar mtodos (diferentes) para el acceso de lectura y el de escritura,


as:

Mensajes de error

261

property RealEstate: Currency read GetRealEstate


write SetRealEstate;

2. Recuerde que tambin hay que definir el mtodo en la seccin


Implementation.

Field out of range


Posible causa de error
Puede estar intentando ordenar por un campo calculado que no es del tipo
fkInternalCalc.

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.

Field types do not match


Posible causa de error
Puede haber seleccionado Table Lookup (Bsqueda en Tabla) en el Database
Desktop y haber intentado enlazar dos campos que no son del mismo tamao.

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

Los Tomos de Delphi: Delphi sin problemas


enlazar dos tablas mediante campos Alpha, no obstante, los campos no solamente deben ser campos Alpha sino que deben tener asignado el mismo
tamao. Por ejemplo, dos campos Alpha con una longitud de 12 caracteres pueden ser utilizados para enlazar dos tablas para la bsqueda. Sin embargo,
intentar utilizar para este propsito dos campos Alpha, uno de longitud 12 y
otro con una longitud de 15, producira este mensaje de error.

Field value required


Posible causa de error
Puede haber fallado la asignacin de un valor a un campo obligatorio. Por
ejemplo, si el primer campo en una tabla es obligatorio, lo siguiente generar
este mensaje de error:
Table1.InsertRecord([Null, Now, 'Filet Mignon', 'Medium',
'Italian', 'Zinfandel', 'Cheesecake', 'Kenya AA']);

No proporcionar valores obligatorios cuando se introducen datos manualmente


en tiempo de ejecucin produce tambin este error.

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.

File <> not found


Posible causa de error
Puede haber introducido el nombre de un archivo no existente en un cuadro de
dilogo que pregunta por el nombre de un archivo.

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

Puede ser conveniente utilizar botones de bsqueda, cuando estn disponibles,


para hacer posible navegar hasta el archivo que se quiera utilizar. De esta
manera solamente se seleccionarn archivos vlidos, eliminando la necesidad
de adivinacin, los nombres mal escritos, etc.

File access denied


Posible causa de error
1. El archivo al que est intentando acceder puede haber sido configurado
como de slo lectura a travs del Explorador de Windows u otro programa.
2. Puede estar intentando abrir para escritura un archivo cuya propiedad
FileMode es igual a 0 (slo lectura).

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.

File extension <> is not valid. Expecting <>


Posible causa de error
Est intentando utilizar un archivo para algo para lo que (se supone) no est
destinado (o la extensin del archivo ha sido modificada inadvertidamente de
forma tal que el archivo parece inadecuado para la accin actual).

264

Los Tomos de Delphi: Delphi sin problemas

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.

File is Locked. Table: <> User: <>


Posible causa de error
Puede estar intentando abrir una tabla que otro usuario ha abierto en modo
exclusivo.

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.

File not assigned


Posible causa de error
Puede haber olvidado llamar a AssignFile antes de llamar a Rewrite, Reset,
Append, Rename o Erase. Por ejemplo, lo siguiente generar este mensaje de
error:

Mensajes de error

265

var tex: TextFile;


begin
Rewrite(tex);
Writeln(tex, 'I think I forgot something');
CloseFile(tex);
end;

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.

File not found <>


Posible causa de error
1. Puede tener una unidad en la seccin Uses cuyo nombre no coincide con el
de la verdadera unidad, la unidad no existe en su sistema o no puede ser
encontrada debido a que no est ubicada en la ruta de bsqueda de Delphi
(o a su vez hace referencia a una unidad que cumple lo anterior).
2. Puede estar intentando instalar un componente dentro de un paquete, y
una unidad a la que se hace referencia en la unidad del componente no se
encuentra en la ruta. Esto puede pasar con una unidad de registro (una
unidad que contiene el procedimiento Register para varios componentes
que se listan en la clusula Uses) cuando una de las unidades a la que
hace referencia no est en la ruta de bsqueda de Delphi.
3. En Delphi 3, puede estar intentando utilizar un componente TReport
(ReportSmith), pero no ha aadido todava el camino de Report.DCU en la
ruta de bsqueda de Delphi.
4. Un archivo de recursos puede estar ausente.
5. Puede estar intentando abrir un archivo de texto que no existe, utilizando
el procedimiento Append o Reset.

266

Los Tomos de Delphi: Delphi sin problemas


6. Puede estar intentando instalar un componente utilizando el archivo .DCU
en lugar del archivo .PAS.
7. Puede haber incluido un archivo .DPK en la seccin Contains de otro
archivo .DPK (archivo de paquete).
8. Puede estar intentando utilizar el enlace temprano de controles ActiveX
sin importar primero el archivo apropiado en Delphi.

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.

Seleccione Data Access de la lista Pages.


Navegue hasta localizar el componente TReport.
Seleccione el componente TReport.
Pulse el botn Add. El componente TReport ser aadido a la pgina
Data Access de la Paleta de Componentes.
Localice los recursos y muvalos al directorio del proyecto.
No utilice el procedimiento Reset sobre archivos que no existan en el
momento de la llamada.
La utilizacin de un archivo .DCU para instalar un componente normalmente funciona bien, pero si el archivo .DCU fue compilado utilizando una
versin anterior de Delphi, usted necesitar instalarlo utilizando el archivo
.PAS.
Si ha incluido el nombre de una unidad de paquete (.DPK) en la seccin
Contains de otro archivo de paquete, elimnelo.
Importe el archivo en Delphi seleccionando Project | Import Type
Library.

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.

File not open


Posible causa de error
1. Puede estar intentando ejecutar alguna operacin de lectura o de escritura
sobre un archivo que no est abierto. Por ejemplo, el siguiente cdigo ocasionar este mensaje de error:
var
Textilefile: TextFile;
begin
AssignFile(Textilefile, 'bellbottoms.txt');
Writeln(Textilefile, 'The hippies in the sixties);
CloseFile(Textilefile);
end;

2. Puede estar intentando escribir en un archivo que no existe o que existe


pero es de slo lectura. Por ejemplo, utilizar el procedimiento Append para
escribir en un archivo que no existe, o intentar escribir en un archivo de
texto abierto con el procedimiento Reset generar este mensaje de error. A
modo de ejemplo, el siguiente cdigo generar este error cuando intente
escribir en un archivo de slo lectura (debido a que ha sido abierto con el
procedimiento Reset):

268

Los Tomos de Delphi: Delphi sin problemas


var
JSBach: TextFile;
begin
AssignFile(JSBach,'Meisterstuecke.txt');
try
Reset(JSBach);
Writeln(JSBach, 'Wachet auf, ruft uns die Stimme');
Writeln(JSBach, 'Jesu, Joy of Man''s Desiring');
. . .
finally
CloseFile(JSBach);
end;
end;

3. Si ha creado algn procedimiento que directamente intercepta mensajes de


Windows (mtodos de manejo de mensajes), puede que est intentando
acceder a un archivo de texto dentro de un mensaje de Windows que es
despachado antes de que el archivo de texto pueda ser creado (por ejemplo
WM_CREATE) o despus que el archivo de texto haya sido cerrado (por
ejemplo WM_DESTROY). Para ilustrar esto, podramos redefinir el gestor
del mensaje de Windows WM_KEYDOWN declarando un procedimiento
utilizando esta sintaxis:
procedure wmkeydown(var Message: TMessage); message WM_KEYDOWN;

Luego debemos definir el procedimiento en la parte Implementation de la


unidad as:
procedure TForm1.wmkeydown(var Message: TMessage);
begin
inherited; { para ejecutar la funcionalidad predefinida }
{Cualquier cosa que queramos hacer cuando el mensaje
WM_KEYDOWN sea despachado}
end;

Por ejemplo, para seguir la pista a los eventos que se estn produciendo,
podramos hacer algo as:
Writeln(tf, Enviado mensaje KeyDown);
end;

Intentar escribir en un archivo de texto durante ciertos eventos (como


WM_CREATE y WM_DESTROY, entre otros) producira este mensaje de
error.
4. Puede haber intentado escribir una lnea en blanco en un archivo de texto
del sistema que ha sido asignado a la impresora. Por ejemplo, lo siguiente
generar este error:
procedure TBadIdea.SetTheStage;
begin
Screen.Cursor := crHourglass;
AssignPrn(PrintText);
Rewrite(PrintText);
Printer.Canvas.Font.Name := 'Arial';

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;

2. Verifique que el archivo existe antes de intentar escribir en l, y utilice


Append o Rewrite en lugar de Reset, de sta forma:
var
JSBach: Textfile;
begin
AssignFile(JSBach,'Meisterstueck.txt');
try
if FileExists('Meisterstueck.txt') then
Append(JSBach)
else
Rewrite(JSBach);
Writeln(JSBach, 'Air on a G string');
Writeln(JSBach, 'Jesu, Joy of Man''s Desiring');
finally
CloseFile(JSBach);
end;
end;

3. No intente escribir en un archivo dentro de un evento que ocurra antes de


que el archivo de texto haya sido creado. Si desea tener un archivo de texto
disponible (digamos, por ejemplo, como un archivo de registro o errores
durante la depuracin), debe asignarlo y abrirlo en el evento OnCreate del
formulario principal, y cerrarlo en el evento OnDestroy del formulario
principal.
4. Aada el nombre del archivo de texto del sistema como parmetro de la
sentencia Writeln, as:

270

Los Tomos de Delphi: Delphi sin problemas


procedure TGoodIdea.SetTheStage;
begin
Screen.Cursor := crHourglass;
AssignPrn(PrintText);
Rewrite(PrintText);
Printer.Canvas.Font.Name := 'Arial';
Printer.Canvas.Font.Size := 16;
Printer.Canvas.Font.Style := [fsBold];
Writeln(PrintText,'For I know I must be brave);
Writeln(PrintText);

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.

File not open for input


Posible causa de error
1. Puede estar intentando leer de un archivo de texto que no ha sido abierto
para lectura. Por ejemplo, el siguiente cdigo generar este error, ya que el
procedimiento Reset no ha sido llamado:
var
cookie: TextFile;
s : String;
i : Integer;
begin
i:=0;
AssignFile(cookie,'history.txt');
try
while not eof(cookie) do
begin
readln(cookie, s);
cbxSitesVisited.items[i]:= s;
inc(i);
end;
finally
CloseFile(cookie);
end;
end;

2. Puede haber utilizado una sentencia Read o Readln sin proporcionar el


nombre de la variable del archivo de texto para leer. Por ejemplo, lo
siguiente generar este mensaje de error:

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
. . .

2. Aada el nombre de la variable del archivo de texto, as:


Readln(SomeTextFile, s);

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.

File not open for output


Posible causa de error
1. Puede estar utilizando Delphi 1 y el procedimiento Writeln sin haber aadido la unidad WinCRT a la clusula Uses.
2. Puede estar intentando escribir en un archivo de texto que ha sido abierto
con el procedimiento Reset.

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

Los Tomos de Delphi: Delphi sin problemas


Rewrite(SingSing);

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.

File or directory does not exist


Posible causa de error
Puede haber especificado una tabla que no existe en una sentencia SQL. Por
ejemplo, con la propiedad DatabaseName de un TQuery asignada a
DBDEMOS, la siguiente sentencia SQL generar este mensaje de error:
SELECT *
FROM ANIMULES

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).

File type not allowed here


Posible causa de error
1. Puede haber intentado declarar una variable de tipo File of File, File of
Text, o File of TextFile.
2. Puede haber intentado pasar un tipo de archivo como parmetro por valor.
Por ejemplo, lo siguiente generar este error:
procedure LegoMania(Technik: file);

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.

Fixed column count must be less than column count


Posible causa de error
Puede haber asignado a la propiedad FixedCols de un control TStringGrid o
TDrawGrid un nmero mayor que la cantidad de columnas de la rejilla.

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

Los Tomos de Delphi: Delphi sin problemas

Fixed row count must be less than row count


Posible causa de error
Puede haber asignado a la propiedad FixedRows de un control TStringGrid o
TDrawGrid un nmero mayor que la cantidad de filas de la rejilla.

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.

For Loop control variable must be simple local variable


Posible causa de error
Puede haber utilizado un campo de un registro o de una clase como variable de
control en un bucle For. Por ejemplo, lo siguiente generar este mensaje de
error:
type
TDateRec = record
Year: Integer;
Month: 1..12;
Day: 1..31;
end;

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.

For Loop control variable must have ordinal type


Posible causa de error
Puede haber intentado utilizar como variable de control de un bucle For una
variable de un tipo de datos que no es un tipo ordinal (Boolean, Char,
WideChar, Integer, enumeracin, subrango). Por ejemplo, lo siguiente generar
este mensaje de error:
var
flcv, WinnieThePooh: String;
begin
WinnieThePooh := '';
for flcv := 'a' to 'z' do WinnieThePooh := WinnieThePooh+flcv;

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

Los Tomos de Delphi: Delphi sin problemas

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.

For-Loop variable <> cannot be passed as var parameter


Posible causa de error
Puede haber intentado pasar una variable de control de un bucle For a un procedimiento o funcin como parmetro Var (por referencia). Por ejemplo, lo
siguiente generar este mensaje de error:
procedure FruitLoops;
const
CaliforniaCounties = 58;
var
i : Integer;
//
procedure ColoredMarshmallows(var LuckyStars: Integer);
begin
. . .
end;
begin
for i := 1 to CaliforniaCounties do
ColoredMarshmallows(i);
end;

Solucin rpida
Modifique el procedimiento llamado de tal forma que el parmetro no se pase
por referencia (parmetro Var):
procedure ColoredMarshmallows(LuckyStars: Integer);

o utilice un bucle While en lugar de un bucle For:


while i <= CaliforniaCounties do
ColoredMarshmallows (i);

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

Los Tomos de Delphi: Delphi sin problemas

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?

Format <> invalid or incompatible with argument


Posible causa de error
Puede haber utilizado una opcin de formato que no est en correspondencia
con su argumento correspondiente. Por ejemplo, lo siguiente generar este
mensaje de error:
Add(Format('ThouSeparator = %c', [SysUtils.ThousandSeparator]));

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.

Function needs result type


Posible causa de error
Puede haber omitido el tipo del resultado (o los dos puntos entre el nombre de
la funcin y el tipo del resultado) en una declaracin de funcin. Por ejemplo,
lo siguiente generar este mensaje de error:
function junction(s: string);

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).

General SQL Errorconnection does not exist


Posible causa de error
Puede estar intentando ejecutar un operacin de base de datos en un hilo al
que no ha asignado un componente TSession.

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.

General SQL ErrorFROM keyword not found where expected


Posible causa de error
Puede haber olvidado aadir una o ms comas como separadores entre los
nombres de campos en una lista SELECT. Por ejemplo, lo siguiente generar
este mensaje de error:
SELECT First, Second, Third Fourth
FROM ORDINALS

Solucin rpida
Aada una coma despus de todos los campos excepto el ltimo en la lista.

280

Los Tomos de Delphi: Delphi sin problemas

Informacin adicional
Consulte <> expected but <> found.

General SQL Error: Missing Left Parenthesis


Posible causa de error
Puede haber olvidado incluir entre parntesis los campos a los que se asignarn los valores o el grupo de valores que sern insertados. Por ejemplo, lo
siguiente generar este mensaje de error:
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');
. . .

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).

General SQL Error: SQL Command not properly ended


Posible causa de error
Puede haber olvidado borrar el contenido de la propiedad SQL antes de aadirle una sentencia SQL, y como consecuencia se han mezclado varias sentencias, resultando en algo que no puede ser interpretado correctamente en la
prxima ejecucin de la sentencia SQL. Por ejemplo, la siguiente sentencia
SQL:
SQL.Add('Select * from FortKnox');

funcionar bien la primera vez, pero la segunda vez ser doble:


'Select * from FortKnoxSelect * from FortKnox'

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.

General SQL Error: SQL is too complex


Consulte SQL is too complex.

General SQL error. The [Commit,Rollback] Transaction request has


no corresponding begin transaction
Posible causa de error
1. Puede estar llamando a Commit o Rollback, pero no ha iniciado explcitamente una transaccin mediante una llamada a StartTransaction. Por
ejemplo, podra estar haciendo esto:
begin
with Database1 do
begin
Connected := True;
try
Query1.Active := True;
Commit;
except
Rollback;
end;
end;
end;

2. Puede estar trabajando con MS SQL Server y estar experimentando un


interbloqueo (deadlock).

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

Los Tomos de Delphi: Delphi sin problemas


begin
with Database1 do
begin
Connected := True;
StartTransaction;
try
Query1.Active := True;
Commit;
except
Rollback;
end;
end;
end;

2. Despus de desechar el mensaje de error, intntelo de nuevo y grabe sus


cambios.

Informacin adicional
2. MS SQL Server retrocede las transacciones que experimenten
interbloqueos.

GOTO <> leads into or out of TRY statement


Posible causa de error
Puede tener una sentencia GoTo que est contenida o salta dentro de un bloque de cdigo protegido (un bloque Try. . . Finally o Try. . . Except).

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.

Grid Index Out of Range


Posible causa de error
1. Puede estar iterando a travs de un conjunto de datos y est alcanzando el
final del archivo (EOF) mientras est mostrando el conjunto de datos en un
control TDBGrid.

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;

2. Las rejillas de cadenas utilizan ndices basados en cero. La primera


columna es el elemento 0, y as sucesivamente.

GROUP BY is required when both aggregate and non-aggregate


fields are used in result set
Posible causa de error
Puede estar intentando utilizar una o ms funciones de agregacin en una sentencia SQL, pero ha olvidado aadir una seccin GROUP BY. Por ejemplo, lo
siguiente generar este mensaje de error:
SELECT DIM, SUM(TSINGTAO)

284

Los Tomos de Delphi: Delphi sin problemas


FROM CHINESEFOOD

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).

Heap Overflow Error


Posible causa de error
Este error es informado por New o GetMem cuando no hay suficiente espacio
disponible en el heap para reservar un bloque del tamao requerido.

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.

High cannot be applied to a long string


Posible causa de error
Puede estar portando de Delphi 1 a Delphi de 32 bits una aplicacin que utiliza la funcin High sobre una cadena. Por ejemplo, lo siguiente generar este
mensaje de error en Delphi de 32 bits:
var
i: integer;
s: string;
begin

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.

Higher table level required


Posible causa de error
Est intentando aadir o utilizar alguna funcionalidad disponible solamente
con tablas Paradox de nivel superior. Una o ms de las siguientes posibilidades
siguientes puede cumplirse:
1. Puede haber intentado aadir un ndice nico en el cdigo a una tabla
Paradox de nivel inferior a 7. Por ejemplo, la siguiente lnea produce este
mensaje de error con una tabla Paradox de nivel 4 5:
Table1.AddIndex('NewIndex','Name_Last',[ixUnique]);

2. Puede haber intentado aadir un ndice descendiente en el cdigo a una


tabla Paradox de nivel inferior a 7. Por ejemplo, la siguiente lnea produce
este mensaje de error con una tabla Paradox de nivel 4 5:
Table1.AddIndex('Wf','Waterfall',[ixDescending]);

3. Puede estar haciendo referencia a una tabla Paradox cuya ruta contiene
nombres de archivo largos.

286

Los Tomos de Delphi: Delphi sin problemas


4. Puede estar intentando aadir un campo Long Integer, BCD, Time,
Timestamp, Logical, Autoincrement o Bytes a una tabla Paradox de nivel
inferior a 7. Estos tipos de datos son nuevos para Paradox 7. Por ejemplo,
si es una tabla anterior al nivel 7, lo siguiente generar este mensaje de
error:
FieldDefs.Add('OttoInque', ftAutoInc, 0, True);

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.

Seleccione Paradox o dBASE, segn sea apropiado.


Seleccione el nivel ms alto de la lista desplegable LEVEL en la seccin
Definition.
g. Seleccione Object | Exit.
h. Seleccione Yes para grabar los cambios.
Todas las tablas siguientes sern creadas con el nivel que haya escogido.
3. Vuelva atrs al convenio 8.3 para los nombres de archivos y los nombres de
directorios cortos sin espacios, o incremente el nivel de la tabla Paradox a
7. Siga los pasos de arriba para incrementar el nivel de la tabla.
4. Deber asignar el nivel de la tabla Paradox a 7. Para llevar a cabo esto,
siga los pasos descritos arriba.

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

Los Tomos de Delphi: Delphi sin problemas


l. Pulse el botn Save en la ventana Restructure.
m. Seleccione File | Close.
Ahora podr activar el ndice que agreg en el cdigo:
Table1.Exclusive := True;
Table1.IndexName := 'Sub7Index';

Tambin podr crear nuevos ndices en el cdigo a la tabla de Paradox 7:


Table1.Exclusive := True;
Table1.AddIndex('Paradox7Index', 'City', [ixUnique]);

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,[]);

Los ndices que asigne en cdigo de esta manera son persistentes.

I/O Error 102


Consulte File not assigned.

I/O Error 103


Consulte File not open.

I/O Error 104


Consulte File not open for input.

I/O Error 105


Consulte File not open for output.

Mensajes de error

289

I/O error found for file <Current directory>\Database.GDB.


Error while trying to open file. The system cannot find the file
specified.
Posible causa de error
Puede haber intentado seleccionar un valor para la propiedad TableName de
un componente TSQLTable de DBExpress sin primero asignar un valor vlido
a la propiedad Params del componente TSQLConnection relacionado.

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.

Identifier expected but <> found


Posible causa de error
1. Puede haber codificado una seccin Type, Var o Const sin declarar nada en
ella.
2. Puede haber intentado utilizar una palabra reservada como identificador.
3. Puede haber antepuesto el operador de mbito punto (.) al nombre de una
propiedad de tipo array (antes de los corchetes). Por ejemplo:
Label1.Caption := ListBox1.Items.[0];

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

Los Tomos de Delphi: Delphi sin problemas

Identifier expected but array found


Posible causa de error
Puede haber declarado un array como valor de retorno de una funcin. Por
ejemplo, lo siguiente generar este mensaje de error:
function Three41(i: integer): array[0..3] of char;

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.

Identifier expected but number found


Posible causa de error
Puede haber utilizado un parntesis mientras intentaba declarar un tipo subrango. Por ejemplo, lo siguiente generar este mensaje de error:
type
TSillySubrange = (4 * 8)..255;

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);

Identifier redeclared: <>


Posible causa de error
1. Puede estar intentando utilizar un nombre que ya est siendo utilizado en
el mismo mbito. Puede ser una variable, constante, tipo, campo (miembro
de una clase), mtodo, o una unidad redundante en una seccin Uses. Por
ejemplo, lo siguiente generar este mensaje de error, debido a que la variable Thirty est declarada dos veces:
function BrickHouse(Thirty, Ten, Thirty: integer): integer;

2. Puede haber aadido la unidad System dentro de la seccin Uses de una


unidad. En este caso, el mensaje de error ser Identifier redeclared:
System.

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).

Illegal character in input file: <> (<>)


Posible causa de error
1. Puede haber iniciado una declaracin con uno de los smbolos &, /, \, tilde,
etc. Por ejemplo, lo siguiente generar este mensaje de error:
type
Proto = &

292

Los Tomos de Delphi: Delphi sin problemas


2. Puede haber aadido algo a la seccin {$R *.RES} en el archivo fuente del
proyecto (.DPR).
3. Puede haberse dejado una llave ( } ) al final de una lnea.

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.

Illegal message method index


Posible causa de error
Puede haber declarado un mtodo de mensaje con un valor menor que 1. Por
ejemplo, lo siguiente generar este mensaje de error:
procedure WMChar(var Message: TWMChar); message -34;

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;

o por su valor decimal:


procedure WMChar(var Message: TWMChar); message 34;

Para ms informacin, consulte message handlers en la ayuda de Delphi y la


unidad MESSAGES.PAS.

Mensajes de error

293

Illegal type in OLE automation section: <>


Posible causa de error
Puede haber aadido algo a la seccin Automated de una clase que contiene un
tipo que no est permitido en una seccin Automated. Por ejemplo, el siguiente
cdigo genera este mensaje de error:
automated
procedure WMVScrollClipboard(var Message: TMessage);
message WM_VSCROLLCLIPBOARD;

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.

Illegal type in Read/Readln statement


Posible causa de error
Este error ocurre cuando se intenta escribir una variable de un tipo que no es
vlido en una llamada a Read o Readln. Por ejemplo, lo siguiente generar este
mensaje de error:
var
f: TextFile;
sl: TStrings;
begin
sl := TStringList.Create;
try
AssignFile(f, 'gonzo');
Reset(f);
Readln(f, sl);

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

Los Tomos de Delphi: Delphi sin problemas


for i := 0 to Pred(sl.Count) do begin
s := sl[i];
Readln(f,s);
end;

Illegal type in Write/Writeln statement


Posible causa de error
Este error ocurre cuando trata imprimir una variable de un tipo que no es
vlido en una llamada a Write o Writeln. Por ejemplo, este cdigo generar
este mensaje de error:
var
f: TextFile;
sl: TStrings;
begin
sl := TStringList.Create;
try
AssignFile(f, 'FisherLGattling');
Reset(f);
Writeln(f, sl);

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.

IMPLEMENTATION part is missing or incorrect


Posible causa de error
Puede haber alterado, borrado o puesto entre comentarios la palabra reservada
Implementation de la unidad.

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.

Implementation part USES clause incorrect


Posible causa de error
Puede tener un error de sintaxis en la clusula Uses de la parte
Implementation.

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)
. . .

Puede tambin tener una clusula Uses en la seccin Implementation de la


unidad:
. . .
implementation
uses EdArabEm;
{$R *.DFM}
. . .

Implements clause only allowed for properties of class or interface


type
Posible causa de error
Puede haber utilizado un tipo que no es una clase o una interfaz en la clusula
Implements. Por ejemplo, lo siguiente generar este mensaje de error:

296

Los Tomos de Delphi: Delphi sin problemas


type
TMyClass = class(TInterfacedObject)
. . .
property TryToImplementAnInt: Integer read FInteger
implements Integer;
end;

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.

Implements clause only allowed for readable property


Posible causa de error
Puede haber utilizado una propiedad que es de slo escritura en una clusula
Implements. Por ejemplo, lo siguiente generar este mensaje de error:
TItalianStallion = class(TInterfacedObject, IOfTheTiger)
FRockyRead: IOfTheTiger;
property MyInterface: IOfTheTiger
implements IOfTheTiger;
end;

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

Implements clause only allowed within class types


Posible causa de error
Puede haber utilizado la clusula Implements en una declaracin de interfaz.
Por ejemplo, lo siguiente generar este mensaje de error:
type
IMPei = interface
function Accessor: IMPei;
property IMPei: IMPei read Accessor
implements IWhatFlavor;
end;

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.

Implements getter must be register calling convention


Posible causa de error
Puede haber especificado un convenio de llamada distinto del convenio por
defecto Register para el mtodo de acceso (getter) de una propiedad de interfaz
delegada. Por ejemplo, lo siguiente generar este mensaje de error:
type
ISomeInterface = interface
procedure RollOver;
function FetchMySlippers: Boolean;
end;
TSomeClass = class(TObject, ISomeInterface)
FSomeInterface: ISomeInterface;
function ReadItAndWeep: ISomeInterface; stdcall;
property SomeInterface: ISomeInterface read ReadItAndWeep
implements ISomeInterface;
end;

298

Los Tomos de Delphi: Delphi sin problemas

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.

Improper GUID syntax


Posible causa de error
Puede haber modificado el formato de un GUID aadindole o borrndole
caracteres o reorganizando sus grupos.

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).

Incompatible Record Structures


Posible causa de error
Puede haber utilizado un componente TBatchMove para mover los registros de
un conjunto de datos a una tabla, pero los campos del conjunto de datos fuente
no coinciden con los campos de la tabla de destino, o puede incluso que las
tablas sean de tipos diferentes (por ejemplo, una tabla es de dBASE y la otra
de Paradox).

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;

Incompatible types: <> and <>


Posible causa de error
1. Puede estar intentando asignar a una propiedad o variable de un tipo un
valor de un tipo incompatible. Por ejemplo, podra estar intentando asignar
una cadena a una variable entera o un mapa de bits a una variable de tipo
Boolean.
2. Puede estar intentando asignar un descendiente de TField (como TStringField, TFloatField, etc., que Delphi crea cuando se crean los campos
persistentes de un conjunto de datos) a una variable de un tipo de datos
diferente. No se puede (directamente) asignar un TStringField a una variable de tipo String. A modo de ilustracin, ninguna de las siguientes
asignaciones es permitida (aqu Capital es un TStringField y Area es un

300

Los Tomos de Delphi: Delphi sin problemas


TFloatField. Ambos pertenecen a la tabla Country de Paradox que viene
con Delphi):
{Esto generar "Incompatible types: String and TStringField"}
StringGrid1.Cells[0,0] := Table1Capital;
{Esto generar "Incompatible types: Extended and TFloatField"}
StringGrid1.Cells[0,0] := FloatToStr(Table1Area);

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!}

4. Puede haber declarado que una funcin devuelve un tipo de resultado y


estar intentando devolver un resultado de un tipo de datos diferente. Por
ejemplo, lo siguiente generar este mensaje de error:
function mpd(var i: integer): boolean;
begin
i := i+1;
Result := IntToStr(i); {El resultado debe ser boolean!}
end;

5. Puede haber utilizado un operador que produce un resultado de un tipo de


datos que no es adecuado en un contexto dado. Por ejemplo, lo siguiente
generar este mensaje de error, ya que el operador / produce un nmero
real (punto flotante), no un entero:
i := 3 / 2;

6. Puede haber intentado asignar un control grfico (un descendiente de


TGraphicControl) a una propiedad que requiere un control de ventana (un
control que tiene un manejador de ventana y puede recibir el foco; un descendiente de TWinControl). Por ejemplo, lo siguiente producir este error
(Incompatible types: TWinControl and TLabel):
ActiveControl := Label1;

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;

8. Puede haber utilizado el procedimiento TextOut sin anteponer Canvas a l.


Por ejemplo, esto generar el mensaje de error bajo discusin:
procedure TForm1.FormMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
TextOut(X, Y, IntToStr(X)+' '+IntToStr(Y));
end;

9. Puede estar intentando asignar un procedimiento o funcin regular (uno


que no es miembro de una clase, sino un procedimiento o funcin global o
local) a un puntero a mtodo. Por ejemplo, lo siguiente generar este mensaje de error:
procedure TForm1.Button2Click(Sender: TObject);
procedure RegularGuy(Sender: TObject);
begin
Label1.Caption := Ha pulsado el botn 1!';
end;
begin
Button1.OnClick := RegularGuy;
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

Los Tomos de Delphi: Delphi sin problemas


TField cuyo valor est tratando de obtener. Por ejemplo, la siguiente asignacin produce el mensaje de error bajo discusin:
{"Incompatible types: String and Double"}
StringGrid1.Cells[1,1] := Table1Area.AsFloat;

En cualquier caso, utilizar la propiedad de conversin AsVariant (sobre


cualquier descendiente de TField) funcionar adecuadamente:
StringGrid1.Cells[1,1] := Table1Capital.AsVariant;

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;

9. Solamente asigne mtodos (un procedimiento o funcin que es miembro de


una clase) a punteros a mtodos. Podra llevar a cabo esto reorganizando el
cdigo de esta manera:
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
. . .
public
procedure HandCodedMethod(Sender: TObject);
end;
. . .
procedure TForm1.HandCodedMethod(Sender: TObject);
begin
Label1.Caption := 'Ha pulsado el botn 1!';
end;

Mensajes de error

303

procedure TForm1.Button2Click(Sender: TObject);


begin
Button1.OnClick := HandCodedMethod;
end;

10. Asigne el valor de tipo enumerado al conjunto dentro de corchetes, as:


case radgrpSalesReps.ItemIndex of
0:
FrozenCustardObj.Flavors := [fcfHeath];

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);

Pero el intento de asignar la cadena contenida en un cuadro de edicin


directamente a una variable entera, as:
SomeIntegerVariable := Edit1.Text;

causara el mensaje de error de arriba. Para ms informacin sobre otras


conversiones, consulte conversions en la ayuda de Delphi.
2. Cuando la tabla de Paradox Country incluida en Delphi fue creada, al
campo Capital le fue asignado el tipo de datos Alpha, y al campo Area le
fue asignado el tipo de datos Number. Si en Delphi se instancian esos campos utilizando el Editor de Campos (consulte Fields Editor en la ayuda de
Delphi), estos campos sern convertidos de sus tipos de datos nativos de
Paradox a los tipos de datos TStringField y TFloatField de Object Pascal,
respectivamente.
A continuacin se ofrece una tabla de los tipos de datos Paradox y sus
correspondiente descendientes de TField de Delphi:
Tipo de datos Paradox

Descendiente TField de Delphi

Alpha

TStringField

Autoincrement

TAutoIncField

BCD

TBCDField

Binary

TBlobField

Byte

TBytesField

Date

TDateField

Formatted Memo

TBlobField

Graphic

TGraphicField

Logical

TBooleanField

304

Los Tomos de Delphi: Delphi sin problemas

Long Integer

TIntegerField

Memo

TMemoField

Money

TCurrencyField

Number

TFloatField

OLE

TBlobField

Short

TSmallIntField

Time

TTimeField

Timestamp

TDateTimeField

9. El mensaje de error especfico en este caso ser Incompatible types:


method pointer and regular procedure.
10. Otra manera de llevar a cabo esto sera:
TFrozenCustardFlavors = (fcfHeath, fcfSnickers, fcfCaramel);

Si opta por hacerlo de esta manera, no obtendra este mensaje de error. En


otra palabras, est asignacin compilara:
case radgrpFrozenCustard.ItemIndex of
0:
FrozenCustardObj.Flavors := fcfHeath;
1:
FrozenCustardObj.Flavors := fcfSnickers;
2:
FrozenCustardObj.Flavors := fcfCaramel;
else
; //Aada aqu cdigo de proteccin contra errores
end;

Incompatible types: Parameter lists differ


Posible causa de error
1. Puede haber asignado una funcin a un tipo funcin (o un procedimiento a
un tipo procedimiento) y sus signaturas no son iguales. Por ejemplo, lo
siguiente generar este mensaje de error:
procedure Cream(Clapton, Bruce, Baker: integer);
type
TYearsAfter = procedure(Lee, Alvin: integer);
const
DesertRoseBand: TYearsAfter = Cream;

2. Puede haber asignado a un gestor de eventos de un componente un mtodo


personalizado que no tiene una signatura idntica. Por ejemplo, podra
haber hecho algo as:
TCombobox(Components[I]).OnKeyPress := LowerCase;

donde el mtodo personalizado LowerCase est declarado as:

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;

2. Modifique el mtodo personalizado para que tenga la misma signatura que


el gestor de eventos que est implementando. Utilizando el ejemplo de
arriba, la declaracin de LowerCase debera ser:
procedure LowerCase(Sender: TObject; var Key: Char);

que est en correspondencia con la declaracin del gestor de eventos


OnKeyPress.

Informacin adicional
Para ms informacin, consulte procedural values en la ayuda de Delphi.

Incorrect field declaration: class <>


Posible causa de error
Puede haber modificado la declaracin de la clase de un campo por un identificador de Pascal invlido. Por ejemplo, en una unidad que originalmente
contena:
type
TForm1 = class(TForm)
Button1: TButton;

puede haber modificado la declaracin de la clase (la parte correspondiente a


TButton) de tal forma que ha quedado algo como:
type
TForm1 = class(TForm)
Button1: TZip^per;

Solucin rpida
Generalmente, no es una buena idea modificar el cdigo que Delphi genera
automticamente.

306

Los Tomos de Delphi: Delphi sin problemas

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.

Incorrect method declaration in class <>


Posible causa de error
Puede haber aadido una directiva de almacenamiento a un mtodo. Por ejemplo, lo siguiente generar este mensaje de error:
procedure Button607Click(Sender: TObject); stored;

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.

Incorrect syntax near ':'


Posible causa de error
Puede haber intentado ejecutar una consulta parametrizada en SQL Explorer.
Por ejemplo, puede tener una consulta de estructura similar a esta:
select
SCRIPT_ID,
SCRIPT_DESC,
BUILD_NO,
SCRIPT_TYPE
from
SCRIPTMAIN

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.

Index already exists


Posible causa de error
Puede estar intentando aadir en el cdigo un ndice a una tabla que ya tiene
un ndice con ese nombre.

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

Los Tomos de Delphi: Delphi sin problemas

INDEX clause not allowed in OLE automation section


Posible causa de error
Puede haber utilizado la clusula Index en una seccin Automated.

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.

Index does not exist


Posible causa de error
1. Puede haber intentado activar un ndice (en tiempo de diseo, editando la
propiedad IndexName de un objeto TTable, o en tiempo de ejecucin
mediante cdigo) que no ha sido creado para la tabla. Por ejemplo, el
siguiente cdigo:
Table1.IndexName := 'CustomerCredit';

provocar este mensaje de error si no se ha definido un ndice de nombre


CustomerCredit para la tabla.
2. Puede haber cambiado la propiedad TableName de un componente TTable,
y la propiedad IndexName todava se refiere a un ndice de la tabla
anterior.
3. Puede estar utilizando una tabla de Oracle y se ha olvidado de anteponer
el nombre de la tabla a la propiedad IndexName del componente TQuery.
Por ejemplo, podra haber proporcionado el valor siguiente:
Molehill

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

3. Puede necesitar especificar un nombre completamente cualificado para el


ndice en la propiedad IndexName del componente TQuery. Por ejemplo, si
tiene una tabla denominada Mountain y un ndice llamado Molehill, asigne
a la propiedad el valor:
Mountain.Molehill

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.

Index is out of date


Posible causa de error
Probablemente tendr una inconsistencia entre una tabla de Paradox (.DB) y
uno de sus archivos de ndice. Uno o ms archivos de ndice estn daado o
fuera de sincronizacin con su correspondiente tabla. Un usuario puede haber
cerrado la aplicacin inapropiamente o haber experimentado una cada del sistema con el programa activo.
El archivo de ndice primario de una tabla Paradox tiene el nombre del archivo
y una extensin .PX . Los archivos de ndice secundarios tienen el mismo nombre de la tabla, seguido por la extensin .Xnn y .Ynn (donde nn es un nmero
hexadecimal).
Esto puede haber ocurrido debido a una de las siguientes razones:
1. Modific la tabla (aadi o edit registros) mientra la tabla en s (*.DB)
estaba situada en un directorio diferente que los archivos de ndice.
2. Modific el contenido de la tabla utilizando otra aplicacin.
3. Su sistema se cay mientras estaba aadiendo o editando un registro.
4. Puede haber accedido a tablas de Paradox sobre una red desde una
mquina cliente que ejecuta Windows 95 y tiene una versin del archivo
VREDIR.VXD (Virtual Network Redirector) de Microsoft entre 4.00.1111 y
4.00.1114.
5. Puede haber intentado editar o insertar un registro en una tabla cuyo
ndice no es mantenido automticamente.
6. Puede estar experimentando problemas de red.
7. Puede estar utilizando Windows NT y bloqueos oportunistas.

310

Los Tomos de Delphi: Delphi sin problemas

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.

Seleccione Tools | BDE Administrator.


Seleccione la pestaa Configuration.
Expanda el nodo Drivers en la vista de rbol.
Expanda el nodo Native en la vista de rbol.

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.

Seleccione Tools | Utilities | Restructure (o pulse sobre el icono


Restructure).
d. Seleccione Secondary Indexes en la lista desplegable Properties de la
tabla.
e. Pulse el botn Define. Aparecer el cuadro de dilogo Define
Secondary Index.
f. Seleccione el ndice que se desea convertir en mantenido.
g. Marque la casilla de verificacin Maintained en la seccin Index
Options del dilogo.
h. Seleccione OK para grabar las modificaciones.
6. Consulte a su administrador de red.
7. Necesita editar (o crear, si es necesario) dos entradas del Registro del sistema siguiendo estos pasos:
a. Seleccione Inicio | Ejecutar en el escritorio.
b. Introduzca regedit en el cuadro de combinacin Abrir y pulse el botn
Aceptar.
c.

Navegue hasta HKEY_LOCAL_MACHINE\System\


CurrentControlSet\Services\LanmanServer\Parameters.
d. Edite o aada la clave EnableOplock y asgnele el valor 0.
e. Edite o aada la clave UseOpportunisticLocking y asgnele el valor 0.
f. Reinicie el sistema para que la configuracin surta efecto.

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

Los Tomos de Delphi: Delphi sin problemas


Los archivos con extensin .Ynn (donde nn es un nmero hexadecimal) contienen informacin de un ndice secundario.
5. Los ndices no-mantenidos estn obsoletos son una reminescencia de
Paradox 1.0 para DOS.
Para ms informacin, consulte http://www.borland.com/devsupport/bde/ti_list/
TI3342.html.

Index is out of range


Posible causa de error
Puede haber utilizado un elemento de un TListBox cuya propiedad MultiSelect
tiene el valor False. Por ejemplo, lo siguiente generar este mensaje de error:
ListBox1.Items.Add('Peter, Bugs, and Roger');
ListBox1.Selected[0] := True;

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.

Index is read only


Posible causa de error
Puede estar intentando editar una tabla que tiene uno o mas ndices secundarios, pero esos ndices secundarios son no-mantenidos.

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

Pulse el botn Define. Aparecer el cuadro de dilogo Define


Secondary Index.
Seleccione el ndice que se desea convertir en mantenido.

g. Marque la casilla de verificacin Maintained en la seccin Index


Options del dilogo.
h. Seleccione OK para grabar las modificaciones.

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.

Index not found


Posible causa de error
Puede estar intentando abrir una tabla dBASE, y su archivo de ndices de produccin (.MDX) no est presente.

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).

Index or Primary Key cannot contain a Null value


Posible causa de error
Puede estar grabando un registro en una tabla, pero ha olvidado proporcionar
un valor para la clave primaria, una columna indizada, o una de las columnas
de una clave primaria compuesta.

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

Los Tomos de Delphi: Delphi sin problemas

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.

INDEX, READ, OR WRITE clause expected but ; found


Posible causa de error
Puede estar intentando declarar una propiedad, pero ha omitido los mtodos de
escritura y lectura (o la palabra reservada opcional Index).

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;

La sintaxis correcta cuando se utiliza la directiva Index es:


property Zeitgeist: Longint index 0
read GetWithIt write SetEmUpJoe;

Informacin adicional
Consulte index specifiers en la ayuda de Delphi para ms informacin sobre
cundo utilizar estos elementos.

INSERT and UPDATE operations are not supported on


autoincrement field type
Posible causa de error
Puede estar intentando asignar un valor a un campo de tipo Autoincrement
utilizando las operaciones Insert o Update de SQL. Por ejemplo, puede haber
tratado de hacer algo as:
update "MACABRE.DB"
set
OttoIncrease = :SomeNum,
DrOctopus = :Villain,
EightHead = :DistinguishingFeature
where
Name = :OLD_Name

Mensajes de error

315

-Oinsert into "MACABRE.DB"


(OttoIncrease, DrOctopus, EightHead)
values
(:SomeNum, :Villain, :DistinguishingFeature)

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.

Installation error 113


Posible causa de error
Puede estar intentando instalar Delphi sobre un ordenador que tiene instalado
un controlador de CD-ROM de 16 bits.

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

Los Tomos de Delphi: Delphi sin problemas

Instance variable <> inaccessible here


Posible causa de error
1. Puede estar intentando hacer referencia a una variable de instancia desde
un procedimiento de clase.
2. Puede haber intentado hacer referencia a una clase miembro de un formulario (por ejemplo, un componente) en un mtodo de clase sin anteponer el
nombre de la variable del formulario al componente. Por ejemplo, lo
siguiente generara este mensaje de error:
if Mode = psSingle then begin
frmSingle.Caption := SEnterOrdNum;
GroupBox1.Caption := SPrintSingleInvoice //aqu!
end;

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;

Consulte Property <> inaccessible here en este libro.

Insufficient disk space


Posible causa de error
1. Puede no tener suficiente espacio en el disco duro para que Delphi cree
archivos.

Mensajes de error

317

2. Puede estar utilizando el BDE en una red punto-a-punto sin asignar el


valor True al parmetro Local Share del BDE.

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.

Insufficient memory for this operation


Posible causa de error
Puede haber ejecutado varias operaciones de consulta, especialmente con la
propiedad RequestLive asignada a True, pero puede haber olvidado liberar la
memoria que stas requieren llamando al mtodo Unprepare.

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

Los Tomos de Delphi: Delphi sin problemas


{Lo que haya que hacer}
finally
Unprepare;
end;
end;

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.

Insufficient SQL rights for operation


Posible causa de error
Puede estar intentando ejecutar una accin sobre una tabla que reside en un
servidor SQL para la cual no han sido otorgados los correspondientes derechos.
Por ejemplo, puede estar intentando editar un registro de una tabla para la
que solamente tiene permiso de lectura (no de escritura).

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

Insufficient table rights for operation


Posible causa de error
Puede estar intentando asignar True a la propiedad Active de una tabla con
proteccin de contrasea, sin primero haber proporcionado la contrasea.

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

despus de encriptarla, la misma informacin aparecer de esta manera:


__(c_.jy*+8f_VG|_L::5!Ya_R2M_9=,]x_&k*-_$A__S<cT@`c~

Para evitar que el cuadro de dilogo de solicitud de contrasea aparezca en


tiempo de ejecucin, puede proporcionar la contrasea mediante cdigo (por
supuesto, alguien con acceso a su cdigo fuente podr ver la contrasea, pero
puede hacer esto durante el desarrollo para ahorrar tiempo, y luego borrar el
cdigo antes de distribuir). Puede proporcionar la contrasea mediante cdigo
as:
Session.AddPassword('Kennwort58');
Table1.Active := True;

320

Los Tomos de Delphi: Delphi sin problemas

Integer constant too large


Posible causa de error
1. Puede haber especificado una constante entera que requiere ms de 32 bits
para ser representada (en otras palabras, un nmero mayor que
2.147.483.647) en Delphi 1, 2 3. Por ejemplo, lo siguiente generar este
error:
procedure OnKeyPress(var Key: Smallint); dispid 2147483648;

De manera similar, lo siguiente tambin ocasionar este error en una .DLL


(unidad de biblioteca):
procedure JerryJeffWalker;
begin
{ Whatever }
end;
exports
JerryJeffWalker index 2800000000;

2. Puede haber asignado un valor entero a un tipo de datos real o de punto


flotante (Double, Extended, Comp, etc.) Por ejemplo, lo siguiente generar
este error:
var
r: double;
. . .
r := 2222222222;

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;

2. Esto compilar tambin:


var
r: double;
. . .
r := 2222222222.22;

Informacin adicional
Para ms informacin, consulte integers | integer types en la ayuda de
Delphi.

Mensajes de error

321

InterBase install DLL ibinstall.dll not found in path. Please install


InterBase 6 to use this functionality.
Posible causa de error
Puede haber intentado soltar sobre un formulario un componente TIBInstall o
TIBUninstall, de la etiqueta InterBase Admin de la Paleta de Componentes, y
no tiene InterBase 6 instalado o necesita mover IBINSTALL.DLL a un lugar
donde Delphi puede encontrarlo.

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).

Interface <> already implemented by <>


Posible causa de error
Puede haber intentado implementar la misma interfaz ms de una vez. Por
ejemplo, lo siguiente generar este mensaje de error:
TPassiveClass = class(TInterfacedObject, IWatched, IWaited,
IPined, IWatched)
. . .

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)
. . .

Y luego implementar las funciones y procedimientos miembros de la interfaz


IWalk de manera diferente en cada clase.

322

Los Tomos de Delphi: Delphi sin problemas

Interface <> has no interface identification


Posible causa de error
Ha intentado asignar una interfaz a un tipo GUID, pero la interfaz no fue definida con un GUID. Por ejemplo, lo siguiente generar este mensaje de error:
IPotato = interface(IUnknown)
function IdahoSpud(Chips: BOOL): HResult; stdcall;
function WisconsinWhite(Chips: BOOL): HResult; stdcall;
function MaineRusset(Chips: BOOL): HResult; stdcall;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
sguid: TGUID;
begin
sguid := IPotato;

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.

Interface <> not mentioned in interface list


Posible causa de error
Puede haber intentado implementar una interfaz en una clase que no tiene
especificado a travs de su signatura que implementar la interfaz en cuestin.
Por ejemplo, lo siguiente generar este mensaje de error:
TOopsadaisacal = class(TInterfacedObject, IMPei)
function Accessor: IMPei;
property Oopsy: IMPei read Accessor implements IMCake;
end;

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.

Interface mismatch. Engine version different


Posible causa de error
Puede estar intentando ejecutar un programa de base de datos creado con una
versin de Delphi (y por lo tanto, del BDE) ms reciente que la versin instalada en el sistema en el que se est produciendo este mensaje de error.

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.

Interface type required


Posible causa de error
Puede haber utilizado dos tipos de clase en la declaracin de un tipo de clase
ActiveForm, as:
TActiveFormX = class(TActiveForm, TActiveForm)

324

Los Tomos de Delphi: Delphi sin problemas

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).

Internal error: <>


Posible causa de error
Estos tipos de errores son extremadamente raros en Delphi. Son normalmente
ocasionados por errores en la programacin del compilador mismo.
1. Si el cdigo de error es L1317, es especfico de Delphi 3. Este error puede
estar relacionado con las caractersticas de Code Insight de Delphi 3.
2. Si el cdigo de error es URW337 con Delphi 2 o L1086 con Delphi 3, puede
obtenerlo mientras compila. Si intenta compilar de nuevo, podr recibir el
mensaje Fatal Error: Unit SysUtils was compiled with a different
version of System.
3. Si el cdigo de error es C3254, es aparentemente especfico de Delphi 2.
Puede haber hecho una asignacin a una variable Result implcita en el
cdigo Asm.
4. Si el cdigo de error es L721, esto es aparentemente especfico de Delphi 5.
5. Si el cdigo de error es R938, puede estar generando archivos .MAP
detallados.
6. Puede haber cambiado el cdigo de un paquete, y luego haber ejecutado un
programa que utiliza el paquete sin primero recompilarlo.

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

5. Elimine la opcin de obtener archivos .MAP detallados, desmarcando la


casilla Project | Options | Linker | Map File | Detailed. La opcin de
lnea de comandos correspondiente es -GD.
6. Recompile el paquete, despus de hacer los cambios a cualquier unidad que
contenga.

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.

Internal Error; Near: query shellmgr


Posible causa de error
Puede estar utilizando el servidor Local de InterBase, y tiene un equipo Dell
Pentium Pro con Windows NT 4 preinstalado.

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

Los Tomos de Delphi: Delphi sin problemas

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).

Internal Error 500. Interface not supported


Posible causa de error
Puede estar haciendo referencia a un mtodo de la interfaz Weblib, pero la
biblioteca de tipos de esta interfaz no ha sido registrada.

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.

Internal Server Error 500


Consulte COINITIALIZE has not been called.

Invalid address value. Must be a hexadecimal value in the range


00000000-FFFFFFFF
Posible causa de error
Puede haber introducido en el cuadro de dilogo Find Error un valor de direccin que no est dentro de los lmites aceptados.

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

Invalid argument to date encode


Posible causa de error
Puede haber proporcionado a la funcin EncodeDate un conjunto de valores
que no conforman una fecha vlida. Por ejemplo, lo siguiente generar este
mensaje de error, ya que Febrero 29 de 2100 no es una fecha vlida (2100 no es
un ao bisiesto):
var
MyDate: TDateTime;
begin
MyDate := EncodeDate(2100, 2, 29);
Label1.Caption := DateToStr(MyDate);

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.

Invalid argument to time encode


Posible causa de error
Puede haber pasado a la funcin EncodeTime un conjunto de valores que tiene
fuera del rango de valores vlidos al menos uno de sus cuatro parmetros.

328

Los Tomos de Delphi: Delphi sin problemas

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.

Invalid Batch Move Parameters


Posible causa de error
Puede haber utilizado la misma tabla en las propiedades Source y Destination
de un componente TBatchMove, y luego haber intentado ejecutar el mtodo
Execute en tiempo de diseo (pulsando con el botn derecho sobre el componente TBatchMove y seleccionando Execute del men de contexto) o en el
cdigo. Por ejemplo, asumiendo que el componente BatchMove se denomina
BatchMove1, el siguiente cdigo generara este mensaje de error:
BatchMove1.Execute;

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

Invalid Bind Type


Consulte Unknown SQL Error.

Invalid BLOb handle [in record buffer]


Posible causa de error
Puede estar accediendo a una gran cantidad de campos BLOb, y el valor del
parmetro BLOB SIZE del BDE es muy pequeo.

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.

Invalid BLOb Size


Posible causa de error
A pesar de lo que dice el mensaje de error, el problema puede ser que la tabla
no tenga un ndice nico en cluster.

330

Los Tomos de Delphi: Delphi sin problemas

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.

Invalid class string


Posible causa de error
1. Puede haber introducido en la propiedad ServerGUID de un componente
TDCOMConnection, TMIDASConnection, TOLEEnterpriseConnection o
TRemoteServer un valor que no se ajusta al formato esperado.
2. Puede haber introducido un valor para la propiedad ServerName de un
componente TRemoteServer, pero olvid especificar el ServerGUID.

Solucin rpida
1. Utilice el formato:
{00000000-0000-0000-0000-000000000000}

2. Proporcione un ServerGUID vlido (vea el punto anterior).

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.

Invalid class typecast


Posible causa de error
Puede estar intentando convertir una variable a un tipo de objeto con el cual
no es compatible.

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;

Invalid compiler directive: <>


Posible causa de error
1. Puede tener una directiva de compilacin $ELSE o $ENDIF que no est
precedida por una directiva $IFDEF, $IFNDEF o $IFOPT. Por ejemplo, lo
siguiente generar este mensaje de error:
uses
Windows, Messages, SysUtils, Classes,
Graphics, Registry, {$ELSE} IniFiles,
{$ENDIF} Controls;

Lo siguiente tambin ocasionar el mismo error, ya que hay un espacio


entre la llave ( { ) y el signo de dlar ( $ ), lo que convierte el texto en un
comentario en lugar de una directiva de compilacin:
uses
Windows, Messages, SysUtils, Classes,
Graphics, { $IFDEF WIN32} Registry,
{$ELSE} IniFiles, {$ENDIF} Controls;

2. Puede haber especificado una directiva de compilador $IFOPT sin una


opcin de compilacin posterior; o sin un signo mas (+) o menos () posterior para indicar si se est comprobando si la opcin del compilador est
activa o inactiva; o ha utilizado la forma larga de la directiva de compilacin. Por ejemplo, lo siguiente generar este mensaje de error:
{$IFOPT} //falta la opcin del compilador
{$IFOPT I} //falta el + o

Y tambin lo siguiente:
{$IFOPT IOCHECKSON}
//no se puede utilizar la forma larga de las opciones
//de compilacin con la directiva IFOPT

332

Los Tomos de Delphi: Delphi sin problemas

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;

2. La forma correcta de utilizar las directivas de compilacin mostradas


arriba es:
{$IFOPT I+}
. . .
{$ENDIF}

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.

Invalid field name


Posible causa de error
1. Puede haber especificado en la propiedad SQL de un TQuery un nombre de
campo que no existe en la tabla. Por ejemplo, lo siguiente generar este
error si no existe un campo Films en la tabla Documentaries:
SELECT Films
FROM Documentaries

Mensajes de error

333

WHERE Director = 'Sayles' OR 'Morris'

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).

Invalid field size


Posible causa de error
Puede haber intentado crear un campo de cadena de caracteres en el cdigo,
pero olvid asignarle un tamao. Por ejemplo, lo siguiente generar este mensaje de error:
Add('DIVISIONNAME', ftString, 0, False);

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

Los Tomos de Delphi: Delphi sin problemas


Memo o Graphic, el parmetro Size determina la cantidad de bytes que son
realmente almacenados en la propia tabla de base de datos (los dems son
almacenados en un archivo .MB).

Invalid field type


Posible causa de error
Puede estar intentando seleccionar un campo Autoincrement de una tabla utilizando la propiedad SQL de un componente TQuery mientras est utilizando
actualizaciones en cach.

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.

Invalid file name


Posible causa de error
1. Puede estar utilizando la versin 3.5 del BDE y Windows 95B (4.00.950b,
tambin conocida como Win95 OSR2) mientras accede a tablas cuya ruta
contiene nombres de archivos largos y/o espacios en los nombres de directorio o de archivo.
2. Puede estar excediendo la mxima longitud de una ruta, si su sistema operativo de red es Novell.
3. Puede tener un apstrofe en un nombre de directorio al que ha asignado un
alias. Por ejemplo, si crea un directorio denominado WhatsUpDoc, y luego
crea un alias como BugsBunny que apunta a l, obtendr este mensaje de
error.
4. Puede estar intentando acceder a un archivo al que no tiene acceso. Por
ejemplo, puede estar intentando abrir un archivo de esta forma:
AssignFile(NoRouteFile, SpoolPath+FileName);
Rewrite(NoRouteFile);

Mensajes de error

335

y el archivo es inaccesible debido a que Spoolpath = 'G:\data\spool\' y la


mquina en la que el programa est ejecutndose no tiene mapeada la unidad G.

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.

Invalid floating point operation


Posible causa de error
1. Puede haber intentado asignar un nmero demasiado grande a un tipo de
datos de punto flotante. Por ejemplo, lo siguiente generar este error:
var
Gates, Turner, McCartney: Currency;
begin

336

Los Tomos de Delphi: Delphi sin problemas


Turner := 922337203685477.5807;
McCartney := 922337203685477.5807;
Gates := Turner + McCartney; {el error ocurre aqu}

2. Puede haber tratado de convertir un nmero real a un entero utilizando las


funciones Round o Trunc, y el nmero era demasiado grande para ser
almacenado en un entero. Cualquiera de los siguientes ejemplos genera
este error:
var
RolyPoly: Integer;
hyper: Extended;
begin
hyper := 2222222222.22;
RolyPoly := Round(hyper);
var
Line: Integer;
Workmans: Comp;
begin
Workmans := 2222222222.22;
Line := Trunc(Workmans);

3. Puede que la mquina no disponga de coprocesador matemtico.

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

2. En los ejemplos dados arriba, el mensaje de error especfico que acompaa


a EInvalidOp es Invalid floating point operation.
Consulte Integer constant too large.

Invalid function result type


Posible causa de error
Puede haber declarado una funcin con un resultado de tipo File. Por ejemplo,
lo siguiente generar este mensaje de error:
function GetFromCabinet: file;

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.

Invalid GUID format


Posible causa de error
Puede haber modificado manualmente un GUID. Por ejemplo, puede haber
eliminado uno de los dgitos de un GUID en una biblioteca de tipos.

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.

Invalid index descriptor


Posible causa de error
Puede haber intentado crear un ndice en una tabla dBASE utilizando el
mtodo AddIndex e indic una opcin de ndice invlida. Por ejemplo, la opcin

338

Los Tomos de Delphi: Delphi sin problemas


ixCaseInsensitive no es vlida para tablas dBASE, por eso el siguiente cdigo
genera este mensaje de error:
Table1.AddIndex('Area','Area',[ixCaseInSensitive]);

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.

Invalid index expression


Posible causa de error
Puede estar intentando crear un ndice compuesto sobre una tabla dBASE,
pero no ha pasado la constante de opcin de ndice ixExpression al mtodo
AddIndex. Por ejemplo, lo siguiente generar este mensaje de error:
Table1.AddIndex('ndxCityState','City+State', []);

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.

Invalid index/tag name


Posible causa de error
1. Puede estar intentando aadir un nombre de ndice que ya est siendo utilizado. Por ejemplo, lo siguiente generar este mensaje de error, ya que el
mismo nombre est siendo utilizado por los dos ndices:
AddIndex('Verzeichnis', 'Stadt', []);
AddIndex('Verzeichnis', 'Land', []);

2. Puede estar intentando asignar a un ndice compuesto por un nico campo


un nombre distinto del campo al que hace referencia y no ha proporcionado
la opcin de ndice ixCaseInsensitive. Por ejemplo, lo siguiente generar

Mensajes de error

339

este mensaje de error, ya que el nombre proporcionado para el ndice no


coincide con el nombre del campo:
AddIndex('ndxStadt', 'Stadt', []);

3. Puede estar intentando pasar en el parmetro TIndexOptions del mtodo


AddIndex un valor que no es apropiado para el tipo de la tabla. Por ejemplo, puede estar proporcionando para una tabla Paradox el valor
ixExpression, que slo puede ser utilizado con tablas dBASE.
4. Puede estar intentando crear ms de un ndice primario (clave primaria).
Por ejemplo, si ya tiene un ndice primario sobre un campo, lo siguiente
generar este mensaje de error:
AddIndex('Stadt', 'Stadt', [ixPrimary]);

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', []);

2. Asigne el mismo nombre del campo al nombre del ndice, as:


AddIndex('Stadt', 'Stadt', []);

o aada la opcin de ndice ixCaseInsensitive, as:


AddIndex('ndxStadt', 'Stadt', [ixCaseInsensitive]);

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',[]);

3. Para ms informacin, consulte TTable.AddIndex en la ayuda de Delphi.


4. Si tiene un ndice primario sobre la tabla (recomendable) que consiste de
una nica columna, sta debe ser la primera columna de la tabla. Si tiene
un ndice primario compuesto, debe empezar por la primera columna y
estar compuesto de ah en adelante por las columnas consecutivas. En
otras palabras, un ndice primario compuesto puede ser establecido sobre
las columnas 1, 2 y 3, pero no sobre las columnas 1 y 3 ( 1, 2 y 4, etc.).

340

Los Tomos de Delphi: Delphi sin problemas

Invalid message parameter list


Posible causa de error
1. Puede haber declarado un mtodo de gestin de mensajes y proporcion
ms de un parmetro. Por ejemplo, lo siguiente generar este mensaje de
error:
procedure WMChar(var Message: TWMChar; n: Word); message WM_CHAR;

2. Puede haber eliminado, o le falt aadir, la palabra reservada Var en la


declaracin del manejador de mensaje:
procedure WMChar(Message: TWMChar); message WM_CHAR;

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;

Para ms informacin, consulte message handlers en la ayuda de Delphi.

Invalid package file <>


Posible causa de error
1. Probablemente intenta cargar un archivo que tiene una extensin distinta
de .DPL o .DPC en la pgina Packages del cuadro de dilogo Project
Options, despus de haber seleccionado Install Packages del men Component, haber pulsado el botn Add, y luego seleccionar un archivo en el
cuadro de dilogo Add Design Package.
2. Si el archivo tiene una de las extensiones apropiadas, no es realmente un
archivo de paquete o se ha daado.

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.

Invalid parameter type: <>


Posible causa de error
Puede haber introducido un tipo no permitido en una biblioteca de tipos, como
cuando se aade un miembro a una interfaz. Por ejemplo, aadir la siguiente
propiedad generar este mensaje de error:
property FFroggy: String;

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

Los Tomos de Delphi: Delphi sin problemas


OLEVariant, SmallInt, Single, TDateTime, WideString, WordBool, SCode,
TColor y TSafeArray.

Invalid path
Consulte Invalid file name.

Invalid pointer operation


Posible causa de error
Puede estar intentando liberar memoria que ya ha sido liberada. Por ejemplo,
pasar a Dispose o FreeMem un puntero con valor Nil genera este mensaje de
error. El siguiente cdigo potencialmente produce el mensaje de error bajo discusin. La razn es que la memoria siempre es liberada en la parte Finally,
pero en el caso de una excepcin, es liberada primero en la parte Except. Esto
ocasiona que la ejecucin posterior de la parte Finally (que siempre se ejecuta,
con o sin excepcin) intente liberar la memoria de nuevo, produciendo el error:
procedure FinallyFree;
var
Homework: Pointer;
begin
GetMem(Homework, 32);
try
try
{Acciones...}
except
FreeMem(Homework, 32);
end; //except
finally
{Lo siguiente funciona bien, a menos que haya ocurrido
una excepcin, en cuyo caso se intentar liberar la memoria
por segunda vez}
FreeMem(Homework, 32);
end; //finally
end;

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.

Invalid property path


Posible causa de error
Puede estar escribiendo un componente e intentando almacenar sus propiedades Published manualmente utilizando el mtodo DefineProperties (y posiblemente otros mtodos relacionados, como ReadData y WriteData).

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.

Invalid property value


Posible causa de error
1. Puede haber asignado un valor que no es vlido a una propiedad. Por ejemplo, introducir el nombre de un componente no existente en la propiedad
ActiveControl de un formulario, o Maybe dentro de la propiedad Enabled

344

Los Tomos de Delphi: Delphi sin problemas


(una propiedad de tipo Boolean, que acepta solamente los valores True o
False) de un componente generar este mensaje.
2. Un archivo de formulario (.DFM) puede contener una referencia a un
mtodo para el que no hay asignado actualmente ningn manejador de
eventos.

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.

Invalid property value on line <>


Posible causa de error
Puede tener un error de sintaxis en un archivo .DFM.

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

Invalid resource format


Posible causa de error
Puede estar intentando cargar un recurso de 16 bits en Delphi de 32 bits.

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.

Invalid Stream Format


Posible causa de error
Un archivo que Delphi est tratando de cargar, quizs un archivo de formulario o paquete, puede estar daado.

346

Los Tomos de Delphi: Delphi sin problemas


1. Si Delphi est inicindose con un proyecto cargado (ha optado por guardar
la configuracin del escritorio, y dej el proyecto abierto en el entorno integrado la ltima vez que cerr Delphi), un archivo del proyecto puede ser el
causante.
2. Si Delphi est inicindose sin un proyecto cargado, un paquete es el principal sospechoso.

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;

Generar este mensaje de error, ya que String no es un tipo de datos vlido


para interfaces.
2. Consulte Unknown SQL Error.

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 Type Conversion


Consulte Unknown SQL Error.

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;

2. Evite hacer conversiones de tipos entre fronteras de mdulos. En tales


casos, utilice funciones de respuesta (callback), de forma que todas las verificaciones/conversiones ocurran en el mismo mdulo.

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

Los Tomos de Delphi: Delphi sin problemas


Lo siguiente (ordinal a ordinal) funciona:
Chicago := Boolean(0);

Pero esto (cadena a ordinal) no:


Memphis := Boolean('False');

Invalid use of keyword


Posible causa de error
1. Puede haber un error de sintaxis en la sentencia SQL asociada a un componente TQuery. Por ejemplo, puede estar intentando utilizar un
parmetro en la clusula FROM, o puede haber obviado la clusula FROM
completamente. Por ejemplo, esto generar el mensaje de error bajo
discusin:
SELECT *
FROM :Rebel

Y tambin esto:
SELECT *
WHERE Rebel = 'Without a clause'

2. Puede que no tenga ningn nombre de columna en la clusula SELECT y/o


ningn nombre de tabla en la clusula FROM.
3. Puede haber utilizado la palabra reservada GROUP BY sin haber utilizado
alguna funcin de agregacin en la clusula SELECT (como COUNT, SUM,
MIN, MAX, AVG, etc.).
4. Puede estar utilizando Oracle y no haber utilizado maysculas en la sentencia SQL.
5. Puede tener un nombre de campo con espacios en la parte SELECT de su
sentencia SQL y no haberle antepuesto el nombre de la tabla o el alias al
campo.
6. Puede haber olvidado aadir un AND en una sentencia SQL. Por ejemplo, lo siguiente generar este mensaje de error:
SQL.Add('SELECT Material.WeekBegin, Material.TalkIndicator');
SQL.Add('FROM Material, Week WHERE');
SQL.Add('Material.WeekBegin >= :FirstDate');
SQL.Add('AND Material.WeekBegin <= :LastDate');
SQL.Add('AND Material.WeekBegin = Week.WeekBegin');
SQL.Add('Week.WeekType = "Reg"');

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

with qryActiveStudents do begin


SQL.Clear;
SQL.Add('SELECT *');
SQL.Add('FROM Students');
SQL.Add('WHERE Active = True'); // Aqu el error
SQL.Add('ORDER BY DateOfLastTalk');
Open;
First;
end;

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

4. Escriba todo en maysculas en el SQL de Oracle. Por ejemplo:


SELECT
SOMEFIELD
FROM
'SOMEALIAS.SOMETABLE'
WHERE
SOMEFIELD < 0

5. Si hace referencia a un nombre de campo que contiene espacios, debe no


solamente encerrarlo entre comillas ( ), sino tambin anteponer el nombre de tabla o alias. Por ejemplo, si el nombre de campo es:
One Flew Over The Coders Desk

debe hacer referencia a l as:


SELECT
TABLENAME."One Flew Over The Coders Desk"
. . .

6. Aada el AND olvidado:


SQL.Add('SELECT Material.WeekBegin, Material.TalkIndicator');
SQL.Add('FROM Material, Week WHERE');
SQL.Add('Material.WeekBegin >= :FirstDate');

350

Los Tomos de Delphi: Delphi sin problemas


SQL.Add('AND Material.WeekBegin <= :LastDate');
SQL.Add('AND Material.WeekBegin = Week.WeekBegin');
SQL.Add('AND Week.WeekType = "Reg" '); //aqu

7. Anteponga el nombre de la tabla al nombre de campo problemtico, y


encierre el nombre de campo entre comillas, as:
with qryActiveStudents do begin
SQL.Clear;
SQL.Add('SELECT *');
SQL.Add('FROM Students');
SQL.Add('WHERE Students."Active" = True'); //todo OK
SQL.Add('ORDER BY DateOfLastTalk');
Open;
First;
end;

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.

Invalid variable reference


Posible causa de error
Puede estar pasando una propiedad a un procedimiento o funcin que espera
recibir un parmetro variable. Por ejemplo, lo siguiente generar el mensaje de
error bajo discusin (EyeColor es una propiedad de tipo String de la clase
Woman):
Insert(Source, Woman.EyeColor, 3);

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.

Invalid variant type conversion


Posible causa de error
1. Puede haber intentado convertir de un tipo de datos a otro en una operacin que no parece lgica (al menos para el compilador). Por ejemplo, los
dos siguientes fragmentos de cdigo generarn este mensaje de error:

352

Los Tomos de Delphi: Delphi sin problemas

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';

2. Puede haber intentado asignar el nombre Null a un ndice utilizando el


mtodo AddIndex. Por ejemplo, lo siguiente generar este mensaje de
error:
begin
with Table1 do begin
Close;
Exclusive := True;
AddIndex(null, 'ModemAdapter', []);

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;
. . .

2. Intntelo de nuevo despus de crear la misma clave primaria en la tabla


Destination, o utilice el modo batAppend de TBatchMove para mover los
registros.

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

Los Tomos de Delphi: Delphi sin problemas

Label <> is not declared in current procedure


Posible causa de error
Puede estar intentando utilizar la sentencia GoTo para saltar a una etiqueta
que no est declarada en el mismo procedimiento que sentencia GoTo.

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 ;-)

Label already defined: <>


Posible causa de error
Puede haber definido una etiqueta ms de una vez. Por ejemplo, lo siguiente
generar este mensaje de error:
procedure Etikett;
label 1;
begin
1:
if (Jordache or Nike) then goto 1;
1:
end;

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

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 declaration not allowed in interface part


Posible causa de error
Puede haber intentado declarar una etiqueta en la parte Interface de una unidad. Por ejemplo, lo siguiente generar este mensaje de error:
var
Form1: Tform1;
label GypsiesTrampsAndThieves;
implementation

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 ;-)

Label declared and referenced, but not set


Posible causa de error
Puede haber declarado y hecho referencia a una etiqueta (en una sentencia
GoTo), pero la etiqueta no est definida. Por ejemplo, lo siguiente generar
este mensaje de error:
procedure Alamo;
label SpursThatJingleJangleJingle;
begin
goto SpursThatJingleJangleJingle;
end;

356

Los Tomos de Delphi: Delphi sin problemas

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 ;-)

Left side cannot be assigned to


Posible causa de error
1. Puede estar intentando asignar una valor a una constante. Por ejemplo, el
siguiente cdigo produce el mensaje de error bajo discusin:
const
crlf = #13#10;
. . .
crlf := #8#8#8#8#8#8#8#8;

2. Puede estar intentando asignar un valor a un parmetro constante (un


parmetro formal que est antecedido por la palabra reservada Const). Por
ejemplo, lo siguiente produce el mensaje de error bajo discusin:
procedure Popeye(const IYamWhatIYam: string);
var
s: string;
begin
s := IYamWhatIYam; {ningn problema aqu}
IYamWhatIYam := 'et 2, Brutus?'; {no permitido}
end;

ya que est intentando asignar un valor al parmetro constante


IYamWhatIYam.
3. Puede estar intentando asignar un valor al valor de retorno de una funcin
fuera de la funcin. Por ejemplo, lo siguiente produce el mensaje de error
bajo discusin:
function GiveMeAnH: char;
begin
Result := 'H'
{ Asignar a 'Result' es lo mismo que asignar a GiveMeAnH }
end;
begin
GiveMeAnH := 'H'; { esto no }
end.

358

Los Tomos de Delphi: Delphi sin problemas


4. Puede estar intentando incrementar o disminuir un valor no ordinal utilizando la funcin Inc o Dec. Por ejemplo, lo siguiente generar este mensaje
de error:
inc('orporated');
dec('10.0');

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);

7. Puede haber olvidado aadir una conversin de tipos a un campo. Por


ejemplo, lo siguiente generar este mensaje de error:
with nvcmod.cds do begin
FieldByName('ID') := edtAddFName.Text;

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);

5. La manera correcta de trabajar con el puntero es:


q := @i;
q^:= 5;

// q apunta a la variable i
// asigna 5 a i a travs de q

6. Puede lograr lo mismo de esta manera:


ZipObj.CurrentDisketteNumber :=
ZipObj.CurrentDisketteNumber + 1;

Mensajes de error

359

7. Aada la funcin de conversin AsX al nombre de campo:


with nvcmod.cds do begin
FieldByName('ID').AsString := edtAddFName.Text;

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.

Line number must be between 1 and <>


Posible causa de error
En el editor de Delphi est intentando ir a una lnea que no existe en la unidad actual.

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.

Line too long [more than 255 characters]


Consulte String [literal]s may have at most 255 elements.

List capacity out of bounds (<>)


Posible causa de error
Puede haber asignado a la propiedad Capacity de una lista un valor mayor que
MaxListSize. En Delphi 1, MaxListSize es 16.380. En Delphi de 32 bits, es
134.217.727. Por ejemplo, lo siguiente generar este mensaje de error (Liszt es
una variable TList):
Liszt.Capacity := 2222222222;

360

Los Tomos de Delphi: Delphi sin problemas

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.

List index out of bounds (<>)


Posible causa de error
1. (A) Puede haber intentado hacer referencia a un elemento de una lista que
no existe. Por ejemplo, lo siguiente producir este mensaje de error, ya que
el elemento 1 no ha sido asignado (ya que los ndices de una lista comienzan en cero):
procedure
var
sl: TStringList;
s: String;
begin
sl := TStringList.Create;
sl.Add('Samuel Langhorne Clemens');
s := sl.Strings[1];
{no se puede acceder a algo situado ms all
de Strings[0], ya que no existe}
end;

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;

3. Puede haber borrado uno o ms campos de un ndice de una tabla de base


de datos y no ha actualizado todava las llamadas a FindKey que hacen
referencia a su antiguo formato (donde el ndice estaba compuesto de ms
campos). Por ejemplo, si modifica los campos de un ndice llamado Dude de
FirstName;Nickname;LastName a simplemente FirstName;LastName, y
luego llama a FindKey de la siguiente manera mientras el ndice est
activo, obtendr este mensaje de error:
FindKey('Clarence','Gatemouth','Brown');

4. Puede estar conectndose a una base de datos utilizando una conexin


ODBC, y una o ms .DLLs de ODBC no se encuentran.
5. Puede estar intentando acceder a un elemento de una lista antes de que el
elemento haya sido insertado.
6. Puede estar llamando a ExecSQL en lugar de Open en una sentencia
SELECT de SQL y est intentando acceder a un elemento en el array de
campos del conjunto resultado. Por ejemplo, lo siguiente generar este
mensaje de error:
function TAndCrumpets.MaxSrlNum: Byte;
var
aQuery: TQuery;
begin
aQuery := TQuery.Create(nil);
try
with aQuery do
begin
DatabaseName := SomeDB.DatabaseName;
SQL.Add('SELECT MAX(EXCEPTION_LOG_SRLNUM)
SQL.Add('FROM EXCEPTION_LOG');
SQL.Add('WHERE BAKED_ID = :baked_id');
ParamByName('baked_id').AsFloat := CrumpetNum;
ExecSQL;
Result := Fields[0].Value;
end;
finally
aQuery.Free;
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

Los Tomos de Delphi: Delphi sin problemas


s := sl.Strings[0];
. . .

o aadir el elemento 1 a la lista antes de intentar acceder a l:


sl.Add('Samuel Langhorne Clemens'); {elemento 0}
sl.Add('John Griffith London'); {elemento 1}
s := sl.Strings[1]; {s = 'John Griffith London'}

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;

3. Compruebe que el ndice actual (en el momento de la llamada a FindKey)


no contiene menos campos de los que est pasando a FindKey. En el ejemplo de arriba, tendra que alterar la sentencia FindKey para que fuera:
FindKey('Clarence','Brown');

4. Asegrese que todos los archivos de ODBC necesarios estn presentes.


5. Espere hasta que el elemento haya sido almacenado antes de acceder a su
valor.
6. Sustituya la llamada a ExecSQL por una llamada a Open.

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

Local class, interface or object types not allowed


Posible causa de error
Puede haber intentado declarar una clase local. Por ejemplo, lo siguiente generar este mensaje de error:
procedure TForm1.Button8Click(Sender: TObject);
type
ELOCALError = class(Exception);
. . .

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.

Local class or object types not allowed


Consulte ms arriba Local class, interface or object types not allowed.

Local procedure/function <> assigned to procedure variable


Posible causa de error
1. Puede haber intentado asignar un procedimiento o funcin local a una
variable de tipo procedimiento.
2. Puede haber intentado pasar como parmetro un procedimiento o funcin
local.

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

Los Tomos de Delphi: Delphi sin problemas

Lock file [has grown] too large


Posible causa de error
Puede estar utilizando tablas de Paradox y presentarse una de las siguientes
situaciones:
1. Mltiples usuarios estn accediendo al mismo directorio privado.
2. El ejecutable y las tablas estn en el mismo directorio.
3. El valor del parmetro Local Share del BDE es True.
4. Est ejecutando mltiples operaciones de consulta simultneas contra un
mismo TTable.
5. Puede estar utilizando actualizaciones en cach y llamando al mtodo
ApplyUpdates de un objeto TDataset, pero se ha olvidado de llamar despus a CommitUpdates. Si este es el caso, puede que no se haya dado
cuenta de que est utilizando tablas Paradox realmente puede estar utilizando Oracle o MS SQL Server o alguna otra gran base de datos SQL (al
utilizar actualizaciones en cach, las tablas Paradox son creadas de forma
transparente por el BDE).
6. El directorio privado ha sido asignado a un directorio raz.

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;

2,4. Coloque el ejecutable y las tablas en directorios separados.


3. Si no tiene mltiples ejecutables que accedan simultneamente a las mismas tablas, asigne False a Local Share (en la pgina System de la utilidad
BDE Configuration/Administration). Asgnele True si las mquinas de una

Mensajes de error

365

red punto-a-punto estn accediendo a las tablas a travs de su propia copia


del ejecutable.
5. Llame siempre a CommitUpdates despus de ApplyUpdates.
6. Asigne el Directorio Privado a un subdirectorio, nunca al directorio raz de
una unidad.

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.

Lock time out


Posible causa de error
Puede ser que una aplicacin que est intentando acceder a una tabla haya
colocado un bloqueo de escritura sobre el archivo de bloqueos (.LCK) mientras
hace una bsqueda para asegurarse de que no hay ningn bloqueo exclusivo
sobre la tabla (que le impedira el acceso a la tabla). Al mismo tiempo, otra
aplicacin que ya tiene un bloqueo sobre la tabla est intentando acceder al
archivo de bloqueos para liberarlo, pero no puede debido al bloqueo de escritura que la otra aplicacin ha aplicado. La aplicacin que ha colocado el bloqueo de escritura (y que quiere acceder a la tabla) localiza el bloqueo que la
otra aplicacin asign, y contina comprobando el archivo de bloqueos. Esto no

366

Los Tomos de Delphi: Delphi sin problemas


permite que la otra aplicacin tenga una oportunidad para acceder al archivo
de bloqueos y liberar el bloqueo que ha colocado. Despus de un intervalo de
tiempo especificado (el perodo de timeout) durante el que este interbloqueo se
mantiene, el mensaje de error bajo discusin se mostrar.

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:

Deshabilitar la nueva semntica de bloqueos


1. En la mquina Windows 95, seleccione Inicio | Configuracin | Panel
de Control.
2. Haga doble clic sobre el icono Sistema.
3. Seleccione la pgina Rendimiento.
4. Pulse el botn Sistema de Archivos.
5. Seleccione la pgina Solucin de Problemas.
6. Seleccione Deshabilitar la nueva semntica de bloqueos y uso compartido de archivos.

Deshabilitar la cach de escritura en segundo plano


1. Siga los pasos 1-6 de arriba.
2. Seleccione Deshabilitar la cach de escritura en segundo plano para
todas las unidades.

Lookup information for field <> is incomplete


Posible causa de error
Puede estar intentando hacer referencia a un campo de bsqueda (lookup)
cuya tabla ha sido eliminada del formulario o proyecto. Por ejemplo, puede
haber creado un campo calculado basado en un campo de una tabla relacionada
y posteriormente haber borrado la tabla (eliminando por lo tanto la referencia
a ella). Si posteriormente hace referencia al campo, obtendr este mensaje de
error.

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

Los Tomos de Delphi: Delphi sin problemas

Low bound exceeds High bound


Posible causa de error
Puede haber declarado un subrango cuyo lmite inferior es mayor que el lmite
superior. Por ejemplo, las dos siguientes declaraciones producen este mensaje
de error:
type
YellowSubmarange = 12..1;
HomeHomeOnTheRange = 'w'..'c';

-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.

Master has detail records. Cannot delete or modify


Posible causa de error
El registro maestro que est intentando borrar tiene registros de detalle que
hacen referencia a l.

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

procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);


begin
with Query1 do
begin
SQL.Clear;
SQL.Add('DELETE FROM STATS');
SQL.Add('WHERE STATS."NO" = 32');
Prepare;
try
ExecSQL;
finally
Unprepare;
end;
end;
end;

Colocar este tipo de cdigo en el evento BeforeDelete permite que el registro


maestro (que no tendr ms hijos en la tabla de detalles una vez que la sentencia SQL sea ejecutada) sea borrado.

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.

Master has detail records. Cannot empty it


Posible causa de error
Puede estar intentando borrar todo el contenido de una tabla maestra para la
que se cumplen las siguientes dos condiciones:
Update tiene asignado Prohibit.
La tabla contiene registros que tienen registros hijos en una tabla de
detalle.

370

Los Tomos de Delphi: Delphi sin problemas

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.

Master record missing


Posible causa de error
Puede haber introducido un valor en un campo de clave fornea de una tabla
de detalle para el que no existe un valor en la clave primaria de la tabla
maestra.

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.

Maximum Validity Check Failed


Posible causa de error
Puede haber intentado asignar a un campo de tipo TBCDField, TFloatField,
TCurrencyField o TIntegerField un valor que es mayor que el valor del

Mensajes de error

371

parmetro MaxValue que se le ha asignado al campo en el Database Desktop.


Por ejemplo, puede haber asignado un valor de 1.000.000 a MaxValue para el
campo Salary de tipo TCurrencyField y luego haber intentado asignar un valor
mayor que ste al campo:
TblEmployeesSalary.Value := 112000;

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.

Memo too large


Posible causa de error
Puede estar ejecutando Delphi 2/BDE 3.5/MS SQL Server 6.5 bajo Windows
NT 4, y utilizando una tabla con un ndice nico.

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).

Metafile is not valid


Posible causa de error
Puede estar cargando un archivo en la propiedad Picture de TImage que, aunque tenga una extensin .WMF o .EMF, no es realmente un metaarchivo.

372

Los Tomos de Delphi: Delphi sin problemas

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: <>.

Method <> hides virtual method of base class <>


Posible causa de error
1. Puede haber intentado redeclarar un mtodo virtual heredado con la directiva Virtual. Por ejemplo, la clase ancestro puede parecerse a esto:
type
TBass = class
procedure WalkAndRock; virtual;
end;

Y la clase descendiente:
type
TGuitar = class
procedure WalkAndRock; virtual;
end;

2. Puede haber declarado un mtodo que tiene el mismo nombre que el


mtodo virtual en la clase base, pero olvid (o deliberadamente no lo hizo)
utilizar la directiva Override. Por ejemplo, lo siguiente producir este mensaje de error:
type
TAndCrumpets(TComponent)
. . .
public
constructor Create(AOwner: TComponent);

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;

Method <> not found in base class


Posible causa de error
Puede haber aadido la directiva Override a un mtodo, pero el mtodo no
existe en la clase ancestro.

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.

Method <> not supported by automation object


Posible causa de error
Puede haber intentado llamar a un mtodo no existente para un objeto de
Automatizacin OLE. Por ejemplo, lo siguiente generar este mensaje de error:
var
ExcelObj: Variant;
begin

374

Los Tomos de Delphi: Delphi sin problemas


ExcelObj := CreateOLEObject('Excel.Application');
. . .
ExcelObj.SaveAll;
//error: method SaveAll not supported by automation object

Ya que Excel no expone un mtodo SaveAll.

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.

Method <> with identical parameters exists already


Posible causa de error
Puede haber declarado dos mtodos con la misma signatura (nombre, cantidad,
tipos y orden de los parmetros). Por ejemplo, lo siguiente generar este mensaje de error:
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent); overload;

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

constructor Create(AOwner: TComponent); overload; override;


constructor Create(AOwner: TComponent; i:integer); overload;

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.

Method identifier expected


Posible causa de error
1. Puede haber recibido primero el error Undeclared Identifier:<> dentro
de un procedimiento o funcin que no es miembro de la declaracin de tipos
de la unidad, y luego intent rectificar este error anteponiendo el nombre
de la clase (por ejemplo TForm1) al identificador. Por ejemplo, si tiene un
procedimiento parecido a ste:
procedure loopdeloop;
begin
Label1.Caption := IntToStr(SizeOf(Byte));
end;

Obtendr el error Undeclared Identifier:<>. Si luego aade el nombre


del tipo de la clase as:
procedure loopdeloop;
begin
TForm1.Label1.Caption := IntToStr(SizeOf(Byte));
end;

recibir el mensaje de error bajo discusin.


2. Puede haber declarado un campo privado en una clusula Read o Write de
una propiedad en la seccin Automated de un tipo.
3. Puede haber utilizado la palabra reservada Inherited en Delphi 1 sin especificar el mtodo o propiedad que est siendo heredado. Por ejemplo, lo
siguiente ocasionar este error en Delphi 1:
procedure TascY2KDBComboBox.DoExit;
begin
try
if length(Self.Text)<10 then
begin
SelectAll;
SetFocus;
raise EFullDateNotSupplied.Create(SEnterAFourDigitYear);
end;

376

Los Tomos de Delphi: Delphi sin problemas


except
SelectAll;
SetFocus;
raise;
end;
inherited; //aqu est el problema
end;

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;

2. Las propiedades en las secciones Automated deben hacer referencia a


mtodos, y no a campos, en sus clusulas Read y Write.
3. Aada el nombre del mtodo a la llamada, as:
procedure TascY2KDBComboBox.DoExit;
begin
try
if length(Self.Text)<10 then
begin
SelectAll;
SetFocus;
raise EFullDateNotSupplied.Create(SEnterAFourDigitYear);
end;
except
SelectAll;
SetFocus;
raise;
end;
inherited DoExit;
end;

Informacin adicional
Para ms informacin, consulte object-oriented programming | programming
with Delphi objects en la ayuda de Delphi.

Microsoft Transaction Server is not installed


Posible causa de error
Puede haber incluido una directiva en un tipo de disp-interfaz. Por ejemplo, lo
siguiente generar este mensaje de error:

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.

Minimum Validity Check failed


Posible causa de error
Puede haber tratado de asignar a un campo de tipo TBCDField, TFloatField,
TCurrencyField o TIntegerField un valor que es menor que el valor asignado al
parmetro MinValue para el campo en el Database Desktop. Por ejemplo,
puede haber asignado un valor de 20.000 al parmetro MinValue para el
campo Salary de tipo TCurrencyField, y luego haber intentado asignar un
valor ms pequeo que ese al campo:
TblEmployeesSalary.Value := 19000;

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

Los Tomos de Delphi: Delphi sin problemas

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.

Missing Connection or Connection String


Posible causa de error
1. Puede haber desplegado el Editor de Campos (Fields Editor) para un componente TADODataSet, TADOTable o TADOQuery (seleccionando Fields
Editor del men de contexto o haciendo doble clic sobre l), y luego seleccion Add Fields o Add All Fields del men de contexto del Editor de
Campos sin tener una entrada vlida en la propiedad Connection o
ConnectionString.
2. Puede haber intentado ejecutar una sentencia SQL sin especificar un componente TADOConnection para un componente TADOQuery o
TADODataset. Por ejemplo, lo siguiente generar este mensaje de error:
with TADOQuery.Create(nil) do begin
try
SQL.Add('ALTER TABLE SCRIPTURES');
SQL.Add('ADD ORDER_SEQUENCE VARCHAR(3)');
ExecSQL;
finally
Free;
end;
end;

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

Los Tomos de Delphi: Delphi sin problemas


aplicacin, asignando su propiedad ConnectionString, y tener todos los conjuntos de datos asociados al componente TADOConnection. TADOConnection es
similar a TDatabase en las aplicaciones de BDE, y a TIBDatabase en las aplicaciones InterBase Express. Los componentes ADO aparecieron en Delphi 5.

Missing Data Provider or Data Packet


Posible causa de error
1. Puede haber intentado asignar True a la propiedad Active de un componente TClientDataSet sin haber especificado un componente TProvider en
la propiedad ProviderName (el proveedor de datos no se encuentra).
2. El proveedor puede no haber devuelto registros (el paquete de datos se ha
perdido).
3. Puede estar utilizando un TClientDataSet en una aplicacin de una capa y
haber olvidado asignar un valor a la propiedad FileName.
4. Puede estar intentando utilizar sentencias SQL contra un conjunto de
datos local (una capa). Por ejemplo, lo siguiente generar este error si
cdsDinnerGuests es un conjunto de datos de una sola capa (la propiedad
ProviderName no est asignada a un TDataSetProvider que apunte a datos
SQL o a otra capa lgica o lgica y fsica):
cdsDinnerGuests.CommandText :=
'DELETE FROM cdsDinnerGuests WHERE FName = ''Jeffrey'' AND
+ LName = ''Dahmer''';
cdsStudents.Execute;

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.

Missing ENDIF directive


Posible causa de error
Puede tener una directiva de compilacin $IFDEF, $IFNDEF o $IFOPT sin la
correspondiente directiva $ENDIF. Por ejemplo, lo siguiente generar este
mensaje de error:
uses
Windows, Messages, SysUtils, Classes, Graphics,
Registry, {$IFDEF Leppard} IniFiles,
{$IFNDEF DumbAndBlindKid} Controls;

Solucin rpida
Asegrese de que cada sentencia {$IFDEF} tenga un sentencia {$ENDIF}
correspondiente.

Informacin adicional
Consulte Invalid compiler directive: <>.

Missing operator or semicolon


Posible causa de error
1. Puede haber olvidado poner un punto y coma al final de una lnea.
2. Puede haber omitido un operador o palabra reservada entre los operandos.
Por ejemplo, en una sentencia With... Do, puede haber olvidado el Do:
with Table1
begin

382

Los Tomos de Delphi: Delphi sin problemas


3. Puede haber omitido el operador de concatenacin (+) entre cadenas definidas una detrs de otra.
4. Puede haber tenido un nico apstrofe (') en su propia lnea y luego haber
intentado compilar. Entonces habr obtenido el mensaje de error Unterminated string, seguido por el mensaje de error bajo discusin.
5. Puede estar llamando a un procedimiento o funcin que no est en mbito,
pero otro procedimiento o funcin que tiene el mismo nombre pero una signatura diferente s lo est. Por ejemplo, puede estar intentando llamar al
procedimiento estndar Delete declarado en la unidad System, pero est
llamando en su lugar (inadvertidamente) al mtodo Delete de TStringList.

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)';

Puede tambin concatenar las cadenas en la misma lnea y mostrarlas en


mltiples lneas, o concatenar valores de propiedades con cadenas

Mensajes de error

383

literales. Por ejemplo, para mostrar un mensaje partindolo en varias


lneas en un cuadro de dilogo (en una lnea de cdigo), puede hacer esto:
ShowMessage('I remember you used to pick the git-fiddle
+ #13#10 + fairly tolerable, Andy!');

Tambin puede incorporar y concatenar variables, valores de propiedades,


y literales de cadena en una simple lnea de texto, as:
ShowMessage('Listen: ' + Edit1.Text + ' ' + s + '!')

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.

Missing or invalid conditional symbol in <$> directive


Posible causa de error
Puede haber aadido las directivas $IFDEF, $IFNDEF, $DEFINE o $UNDEF
sin especificar qu smbolo condicional pretende verificar, definir o indefinir.
Por ejemplo, lo siguiente generar este mensaje de error:
uses
Windows, Messages, SysUtils, Classes,
Graphics, {$IFDEF} Registry, { ... }

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.

Missing parameter type


Posible causa de error
Puede haber declarado un procedimiento o funcin que recibe uno o ms parmetros por valor cuyos tipos no se han especificado. Por ejemplo, lo siguiente
generar este mensaje de error:
procedure fudgsicle(a);

384

Los Tomos de Delphi: Delphi sin problemas

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);

Missing right quote


Posible causa de error
Puede tener un apstrofe sin emparejar en una sentencia SQL.

Solucin rpida
Borre el apstrofe solitario o adale su pareja.

Informacin adicional
Consulte QuotedStr en la ayuda de Delphi.

Missing TableName property


Posible causa de error
1. Puede haber intentado ejecutar una accin sobre una tabla para la cual no
se ha proporcionado un valor a la propiedad DatabaseName.
2. Puede haber intentado crear los campos persistentes de una tabla en
tiempo de diseo pulsando dos veces sobre el componente TTable y luego
seleccionando Add Fields del men de contexto sin haber asignado a la propiedad TableName del objeto TTable una tabla vlida.
3. Puede haber intentado asignar True a la propiedad Active de un componente TTable sin haberle asignado valor a su propiedad TableName.

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.

Module <>s time/date changed. Reload?


Posible causa de error
1. Puede haber (inadvertidamente) iniciado varias instancias de Delphi.
2. Puede haber marcado para guardar (check-out) mediante un sistema de
control de versiones (como PVCS) una versin de un archivo que es anterior o posterior a la del archivo cargado en el proyecto (es una versin
diferente del archivo, en otras palabras).

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

Los Tomos de Delphi: Delphi sin problemas

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.

Module header is missing or incorrect


Posible causa de error
1. Puede haber cambiado el nombre del archivo fuente fuera del entorno integrado (por ejemplo, en el Explorador de Windows).
2. Puede haber omitido la clusula Uses de la seccin Interface de una
unidad.
3. Puede haber copiado los archivos .DSK y/o .DOF junto con los archivos
fuente de un proyecto de un directorio a otro.

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.

Puede entonces cambiar su nombre a Whatever (o el nombre que desee) y


utilizarla en la otra unidad.

Mensajes de error

387

3. En las primeras versiones de Delphi, los archivos .DOF tenan la extensin


.OPT.

Multiple Net Files found


Posible causa de error
1. Dos o ms usuarios pueden estar intentando acceder a la misma tabla de
la base de datos, pero no comparten la misma configuracin de NET DIR.
2. Si todos los usuarios tienen la misma configuracin de NET DIR, puede ser
que haya un archivo .LCK viejo que apunte a una ruta distinta del directorio al que apunta NetDir.
3. Puede tener un archivo PDOXUSRS.NET o PDOXUSRS.LCK daado.

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

Los Tomos de Delphi: Delphi sin problemas


a. Abra la utilidad de configuracin del BDE (BDECFG32.EXE)
seleccionando Inicio | Programas | Delphi | BDE Config.
b. Con la entrada de 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.
Consulte Delphi de 32 bits ms abajo.

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.

Multiple Paradox Net files found/in use


Para ms informacin, consulte Directory is controlled by other .NET
file y Multiple Net Files found.

Must apply updates before refreshing data


Posible causa de error
Puede haber llamado al mtodo Refresh de un TClientDataSet, o ha pulsado el
botn Refresh de un TDBNavigator asociado a l mientras hay actualizaciones
pendientes.

390

Los Tomos de Delphi: Delphi sin problemas

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.

Name not unique in this context


Posible causa de error
Puede estar utilizando un objeto TDatabase cuya propiedad HandleShared
tiene asignado el valor False.

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

Nota: Si est utilizando un servidor de aplicacin multi-hilos, asegrese de colocar


un objeto TSession en el Mdulo de Datos Remoto, y de asignar True a su propiedad
AutoSessionName.

Need to specify at least one dimension for SetLength of dynamic


array
Posible causa de error
Puede haber llamado a SetLength sobre un array, pero olvid especificar un
valor para la longitud del array. Por ejemplo, lo siguiente generar este mensaje de error:
procedure ShortestProcedureNameKnownToWesternCivilization;
var
ABunchOfIntegers: array of integer;
begin
SetLength(ABunchOfIntegers);
end.

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.

Never-build package <> must be recompiled


Posible causa de error
Puede haber hecho modificaciones a otro paquete que es requerido por el
paquete al que se hace referencia en el mensaje de error.

Solucin rpida
Recompile manualmente el paquete al que se hace referencia en el mensaje.

392

Los Tomos de Delphi: Delphi sin problemas

Informacin adicional
Para ms informacin, consulte packages en la ayuda de Delphi.

Never-build package <> requires always-build package <>


Posible causa de error
Puede estar intentando crear un paquete de no construir (never-build) que
requiere un paquete construir siempre (always-build).

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.

New not supported for dynamic arraysuse SetLength


Posible causa de error
Puede estar intentado especificar el tamao de un array dinmico utilizando el
procedimiento New. Por ejemplo, lo siguiente generar este mensaje de error:
procedure Newby;
var
ArrayOfScores: array of integer;
begin
New(ArrayOfScores, StrToInt(edtNumberOfGames));
end.

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.

No argument for format <>


Posible causa de error
Puede no haber proporcionado la misma cantidad de argumentos que los especificadores de formato indicados en una llamada a la funcin Format. Por ejemplo, lo siguiente generar este mensaje de error, debido a que hay tres
especificadores de formato, pero solamente dos argumentos han sido
proporcionados:
Label1.Caption := Format('Los %s de %s ganarn la %s,
['Baltimore', Serie Mundial']);

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

Los Tomos de Delphi: Delphi sin problemas


Label1.Caption := Format('Los %s de %s ganarn la %s,
[' Orioles', 'Baltimore', Serie Mundial']);

Informacin adicional
Para ms informacin, consulte Format function, format specifier, y format
strings en la ayuda de Delphi.

No code was generated for the current line


Posible causa de error
1. Puede estar intentando ejecutar hasta la ubicacin del cursor, pero seleccion Run | Run To Cursor o puls F4 sobre una lnea para la que no se
gener cdigo. Por ejemplo, puede ser un encabezamiento de un procedimiento (en lugar de una sentencia de asignacin).
2. La lnea en cuestin puede no haber generado cdigo debido a que no
estaba enlazada al proyecto. Si el cdigo no es llamado, el enlazador inteligente de Delphi lo dejar fuera para reducir el tamao del ejecutable. Por
ejemplo, si incluye el siguiente procedimiento en la unidad:
procedure TForm1.DontCallUs;
. . .

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

4. Cierre la unidad que est almacenada en una ubicacin distinta de la que


se ha designado en el Gestor de Proyectos (Project Manager), y abra la
copia de la unidad que reside en el directorio/localizacin correcto. Seleccione View | Project Manager para ver las unidades incluidas en el
proyecto y su ubicacin.

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.

No Databases Are Listed In Transaction Component


Posible causa de error
Puede haber llamado al mtodo StartTransaction de un componente
TIBTransaction sin primero haber configurado su propiedad DefaultDatabase.

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.

No definition for abstract method <> allowed


Posible causa de error
Puede haber definido un mtodo que fue declarado anteriormente como abstracto en la misma unidad. Por ejemplo, lo siguiente generar este mensaje de
error:

396

Los Tomos de Delphi: Delphi sin problemas

procedure VAndA; virtual; abstract;


. . .
procedure TForm1.VAndA;
var
SpudLovers: string;
begin
SpudLovers := 'Bendocchi, Christy, Rogers, Shannon';
end;

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.

No fields definedcannot create dataset


Posible causa de error
Puede haber intentado llamar al mtodo CreateDataSet de TClientDataSet sin
primero proporcionar el conjunto de datos que debe crear es decir, no ha
asignado valores a las propiedades FieldDefs o Fields del TClientDataSet.

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.

No index currently active


Posible causa de error
Puede haber intentado llamar a uno de los mtodos FindKey o Locate de un
conjunto de datos sin especificar un ndice por el que buscar.

Solucin rpida
Asigne un valor apropiado a la propiedad IndexName o IndexFieldNames del
conjunto.

398

Los Tomos de Delphi: Delphi sin problemas

Informacin adicional
Si est creando un conjunto de datos mediante programacin, utilice el mtodo
AddIndexDef.

No MDI forms are currently active


Consulte Cannot create form. No MDI forms are currently active.

No MDI Parent Active


Posible causa de error
1. Puede haber olvidado designar al formulario principal de la aplicacin MDI
como el formulario padre MDI.
2. Puede estar creando dinmicamente el formulario MDI principal.

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.

No overloaded method of <> with this parameter list exists


Posible causa de error
Puede haber intentado llamar a un mtodo sobrecargado con un parmetro o
conjunto de parmetros para los cuales no hay un mtodo sobrecargado compatible. Por ejemplo, lo siguiente generar este mensaje de error:
function BTOSong(AName: String): Integer; overload;
function BTOSong (ALengthInSeconds: Integer): String; overload;
. . .
s := BTOSong(3.36);

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

Los Tomos de Delphi: Delphi sin problemas

No SQL statement available


Posible causa de error
1. Puede haber llamado al mtodo Prepare de un TQuery, pero la propiedad
SQL no tena asignada ninguna sentencia.
2. Puede haber intentado aadir campos a un componente TQuery utilizando
el Editor de Campos sin primero haber asignado una sentencia SQL a la
propiedad SQL del componente TQuery.
3. Puede haber llamado al mtodo Open o ExecSQL de un TQuery cuando la
propiedad SQL estaba vaca.
4. Puede haber intentado asignar el valor True a la propiedad Active de un
componente TDecisionQuery sin haber especificado primero una sentencia
SQL para la propiedad SQL.
5. Puede haber llamado a Open o haber asignado True a Active para un componente TSQLQuery (DBExpress) que no tena una sentencia SQL
asignada en su propiedad SQL.

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;

4. Proporcione una sentencia SQL, en el entorno integrado o en el cdigo,


para la propiedad SQL del objeto TDecisionQuery.
5. Asigne una sentencia SQL a la propiedad SQL, en tiempo de diseo en el
Inspector de Objetos o en tiempo de ejecucin, antes de activar el componente TSQLQuery.

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.

No user transaction is currently in progress


Posible causa de error
Puede haber llamado al mtodo Commit de un componente TDatabase sin
haber primero iniciado una transaccin mediante una llamada a
StartTransaction.

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

Los Tomos de Delphi: Delphi sin problemas


Rollback;
except
Rollback;
end; {bloque except}
end; {bloque with}
end;

Para ms informacin sobre las transacciones de bases de datos, consulte


handling transactions en la ayuda de Delphi.

No Web browser could be located


Posible causa de error
Ha intentado entrar a un sitio web o ver un documento .HTML, pero Delphi no
puede localizar un navegador en el sistema.
Por ejemplo, puede haber seleccionado Borland Home Page, Delphi Home Page
o Borland Programs & Services del men Help de Delphi.

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.

NODEFAULT clause not allowed in OLE automation section


Posible causa de error
Puede haber utilizado la clusula Nodefault en una seccin Automated.

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.

Not enough actual parameters


Posible causa de error
1. Puede haber llamado a un procedimiento o funcin sin proporcionar todos
los parmetros necesarios. Por ejemplo, puede haber intentado algo as:
MessageDlg('Eat at Joe''s', mtCustom, [mbOK]);
{ Olvid aadir el cuarto parmetro (HelpCtx) }

2. Puede estar intentando redefinir un mtodo de la clase ancestro, pero no


ha proporcionado todos los parmetros declarados en el ancestro. Por ejemplo, lo siguiente generar este mensaje de error, ya que el constructor que
est siendo redefinido declara un parmetro como de tipo TComponent:
type
TYoopdl = class(TComponent)
private
FOutstanding: string;
public
constructor Create; override;
end;
. . .
constructor TYoopdl.Create;
begin
inherited Create; {esta lnea ocasiona el error}
FOutstanding := 'yowza-bop';
end;

3. Puede estar intentando revisar si un gestor de eventos est asignado a una


propiedad de evento comprobando si su valor es Nil, as:
if TrueIdentity.OnValidate = nil then

4. Puede haber utilizado un punto y coma en una llamada a un procedimiento


o funcin. Por ejemplo:
rptModule.PrintReport(ProgramMode, sOutFileName;
sStartDate, sEndDate, sDaysPrevious, iUpdateOption);

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

Los Tomos de Delphi: Delphi sin problemas


MessageDlg('Eat at Joe''s, mtCustom, [mbOK, mbHelp], 11);

2. Borre la llamada a Inherited de la definicin del constructor si lo que desea


es crear un nuevo constructor, en lugar de redefinir el constructor de
TComponent. Para redefinir el constructor de TComponent, aada el parmetro a la declaracin, definicin y llamada, as:
constructor Create(AOwner: TComponent);
. . .
constructor TCmpntDescendent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
. . .

3. Utilice la funcin Assigned para hacer la comprobacin, as:


if not Assigned(TrueIdentity.OnValidate) then

4. Sustituya el punto y coma por una coma:


rptModule.PrintReport(ProgramMode, sOutFileName,
sStartDate, sEndDate, sDaysPrevious, iUpdateOption);

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.

Not enough file handles


Posible causa de error
Puede tener ms aplicaciones/archivos abiertos de los que el sistema es capaz
de manejar.

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.

Not exact read/write in <>.mb and <>.mb


Posible causa de error
Puede tener una tabla daada.

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

Not in cached update mode


Posible causa de error
Puede estar intentando acceder a la propiedad OldValue de un registro, pero la
propiedad CachedUpdates del DataSet tiene asignado el valor False.

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;

Podra tambin si lo desea verificar que el registro no es nuevo, en cuyo caso


no tendra un valor anterior:
if (Table1.CachedUpdates = True) and
(Table1.State <> dsInserting) then
LegacyVal := OldValue;

406

Los Tomos de Delphi: Delphi sin problemas


Consulte At End of Table para ms informacin.

Not initialized for accessing network files


Posible causa de error
1. Puede tener una configuracin invlida en el archivo IDAPI.CFG en relacin con la ubicacin del directorio del archivo de control de red.
2. Puede tener una configuracin invlida en WIN.INI o en el Registro del
sistema en relacin con la ubicacin del archivo de configuracin del BDE
(IDAPI.CFG).

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).

Cmo crear un Alias utilizando la herramienta de Configuracin del BDE


En Delphi 1, la herramienta de configuracin de BDE es BDECFG.EXE. En
Delphi 2, es BDECFG32.EXE. En Delphi 3 y 4 es BDEADMIN.EXE. En Delphi
5 y 6 es DBEXPLOR.EXE. En Windows 95 y posteriores, est disponible seleccionando Inicio | Programas | Borland Delphi X | BDE Administrator.
Para crear un alias con la herramienta BDE Configuration/Administration,
siga estos pasos:
1. Seleccione Inicio | Programas | Borland Delphi X | BDE [Configuration, Administration].
2. Con la pestaa Databases activa, seleccione Object | New. . . y luego indique el tipo de alias que desea crear (por ejemplo, Standard para una base
de datos Paradox).
3. Verifique que el parmetro Type se corresponda con el tipo de base de
datos que quiere crear o crear (Standard para Paradox, dBASE, y ASCII,
Access para MS Access, etc.).
4. Si selecciona el controlador Standard (para crear una base de datos Paradox, por ejemplo), asigne al parmetro Path la ubicacin de la base de
datos (ServerName para InterBase y Oracle; DatabaseName para MS SQL
Server y MS Access, Sybase, e Informix; DB2 DS2 para DB2). Si utiliza
Path, puede introducir una ruta DOS, as:
I:\LessTaken\Diff

5. Asigne a Path la ubicacin de la base de datos. Puede introducir una ruta


DOS, as:
K:\HallOfFame\Baseball

o, en Delphi de 32 bits, puede utilizar el convenio de nombres UNC (Universal Naming Convention), que tiene este formato:
\\Servidor\Recurso\Directorio

408

Los Tomos de Delphi: Delphi sin problemas

Number is out of range


Posible causa de error
1. Puede haber intentado aadir un ndice primario a una tabla que ya tiene
una clave primaria definida.
2. Puede estar intentando crear un ndice primario sobre un campo que no es
el primer campo de la tabla.

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]);

Si no est utilizando una tabla de Paradox 7 y prueba lo anterior, obtendr el


mensaje de error Higher table level required. Consulte esta entrada para
ms informacin.
Las opciones de ndice que puede asignar en el parmetro final son ixPrimary,
ixUnique, ixDescending, ixCaseInsensitive y ixExpression. No puede utilizar
ixPrimary o ixCaseInsensitive en el caso de una tabla dBASE. No puede utilizar ixExpression para una tabla Paradox.

Number of elements differs from declaration


Posible causa de error
Puede haber declarado un array de constantes con tipo, pero ha proporcionado
una cantidad de elementos diferente de los declarados. Por ejemplo, las
siguientes dos declaraciones generarn este mensaje de error:
{No se proporcionan suficientes elementos}

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.

Object Factory for TwebResponse Missing


Posible causa de error
Puede estar haciendo referencia a un mtodo de la interfaz Webbrokerscript,
pero su biblioteca de tipos no ha sido registrada.

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.

Object or class type required


Posible causa de error
Puede estar intentando llamar a un mtodo de un tipo que no es un objeto o
clase. Por ejemplo, lo siguiente generar este mensaje de error:
type
TNumberWithoutDecimalPoints = Integer;
. . .
procedure TForm1.WhateverDude(Sender: TObject);

410

Los Tomos de Delphi: Delphi sin problemas


var
s: String;
tnwdp: TNumberWithoutDecimalPoints;
begin
tnwdp := 8;
s := TNumberWithoutDecimalPoints.AsString;

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.

OLE error 800A03EC


Posible causa de error
Puede estar utilizando Microsoft Excel y ha intentado asignar un valor a las
celdas de una hoja de Excel antes de aadir una hoja de trabajo. Por ejemplo,
lo siguiente generar este mensaje de error:
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');
SetColumnTitles;
xl.Workbooks.Add;
end;

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.

Only one of a set of overloaded methods can be published


Posible causa de error
Puede haber declarado varios mtodos sobrecargados en una seccin Published.
Por ejemplo, lo siguiente generar este mensaje de error:
. . .
published
procedure yoopdl(tl: TThreadList); overload;
procedure yoopdl(tl: TList; ol: TObjectList); overload;

412

Los Tomos de Delphi: Delphi sin problemas

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;

Only one TIDAntiFreeze can exist per application


Posible causa de error
Puede haber aadido mltiples componentes TIDAntiFreeze a una aplicacin,
o puede haber colocado uno sobre un formulario y haber creado una segunda
instancia del formulario en tiempo de ejecucin.

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

propsito de TIDAntiFreeze es resolver ese problema que su aplicacin no se


congele.
Los programadores de Internet Direct se llaman a s mismos la tripulacin de
Indy, y por lo tanto el trmino Anticongelante se ajusta bien al tema general
del producto.

Only register calling convention allowed in OLE automation section


Posible causa de error
Puede haber especificado un convenio de llamada distinto de Register en la
seccin Automated de la clase. Por ejemplo, lo siguiente generar este mensaje
de error:
automated
procedure Blip; stdcall;

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.

Operation not allowed on a unidirectional dataset


Posible causa de error
1. Puede haber conectado un conjunto de datos de DBExpress directamente a
un DBGrid a travs de la propiedad DataSource del DBGrid, y luego
intent desplazarse hacia atrs por el conjunto resultado en la rejilla.
2. Puede haber intentado moverse hacia atrs por un conjunto de datos cuya
propiedad Unidirectional tiene asignado True.

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

Los Tomos de Delphi: Delphi sin problemas

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.

Operation not allowed on sorted string list


Posible causa de error
1. Puede haber intentado un operacin de filtro invlida sobre un campo de
tipo String. Por ejemplo, puede haber asignado a la propiedad Filter de un
TDataset algo as:
common_name > graphic

2. Puede haber intentado asignar un valor a una lista de cadenas ordenada.


Por ejemplo, lo siguiente generar este mensaje de error:
slTemp := TStringList.Create;
try
TStringList(slTemp).Sorted := True;
{ Crear una lista delimitada por puntos y comas (campos)
y tildes (registros)}
i := 0;
while i < Pred(sl.Count) do begin
slTemp.Add(Format('%s;%s;%s;%s;%s;%s~',
[sl[i],sl[i+1],sl[i+2],sl[i+3],sl[i+4],sl[i+5]]));
inc(i,NUM_COLUMNS);
end;
{ El contenido de sl ha sido movido a slTemp. Vaciar sl
para que pueda recibir de nuevo el contenido ordenado. }
sl.Clear;
{ Analizar las lneas ordenadas de slTemp y devolverlas a sl }
for j := 0 to Pred(slTemp.Count) do
while (Pos('~',slTemp[j]) > Pos(';',slTemp[j])) do
if Pos(';',slTemp[j]) > 0 then begin
sl.Add(Copy(slTemp[j],1,Pred(Pos(';',slTemp[j]))));
slTemp[j] := Copy(slTemp[j],Pos(';',slTemp[j])+1,
length(slTemp[j]));
end else
sl.Add(Copy(slTemp[j],1,Pos('~',slTemp[j])));

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 ;-)

Operation not applicable


Posible causa de error
1. Puede estar desarrollando una aplicacin multicapa y est utilizando una
copia antigua de DBClient.DLL.
2. Puede estar intentando acceder a la propiedad RecordCount sin haber primero llamado al procedimiento Last del TQuery.
3. Puede haber incluido un campo memo en una consulta, por ejemplo:
SELECT
STRINGFIELD, INTEGERFIELD, AMEMOFIELD
FROM
SIMTABLE

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

Los Tomos de Delphi: Delphi sin problemas


with qryQuarry do
begin
Open;
Last;
Retrieved := RecordCount;
. . .
Close;
end;
end;

3. Elimine el campo memo de la sentencia SELECT de SQL.


4. Convierta la aplicacin CGI en una aplicacin ISAPI.
5. Asigne un valor vlido al parmetro. De otra manera, verifique esta condicin y evite el fallo del procedimiento, as:
Params.ParamByName('Food').AsString := HungryFor;
if HungryFor = '' then begin
Exit;
ShowMessage(You must not be hungry);
end;

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.

Operation not supported


Posible causa de error
1. Si obtiene este mensaje de error en relacin con una consulta, eso normalmente indica algn error en la sintaxis de la sentencia SQL.
2. Puede estar utilizando parntesis en lugar de corchetes al indizar un
array. Por ejemplo, lo siguiente generar este error si ha declarado un
array llamado Synergy:
i := Synergy(0);

3. Puede haber aadido un nuevo alias al SQL Explorer y ha intentado


expandirlo antes de grabar los cambios.

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).

Operator not applicable to this operand type


Posible causa de error
1. Puede haber intentado utilizar un operador aplicable solamente a enteros
sobre operandos de punto flotante, o viceversa. Por ejemplo, lo siguiente
generar este mensaje de error:
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
{ los campos son campos TFloat; Percentage es un campo calculado}
begin
Table1Percentage.Value :=
Table1MySalary DIV Table1AllTheMoneyInTheWorld;
end;

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';

4. Puede haber intentado hacer una asignacin a travs de un puntero sin


tipo, as:
. . .

418

Los Tomos de Delphi: Delphi sin problemas


var
p: pointer;
begin
p^ := 5;

-Otype
TParty = (Boston, DelFuegos, JGeils);
var
JustAnotherBand: TParty;
BradleyDelp: pointer;
begin
JustAnotherBand := Boston;
BradleyDelp^ := JustAnotherBand;

5. Puede estar llamando a un procedimiento como si fuera una funcin que


devuelve un valor Boolean. Por ejemplo, puede estar llamando a un procedimiento denominado ValidateState as:
if not ValidateState then

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...

7. Puede haber estado intentando asignar el resultado de una expresin de


tipo Boolean que utiliza el operador Not a una variable o propiedad de tipo
Boolean, y olvid encerrar la expresin que ser evaluada entre parntesis.
Por ejemplo, lo siguiente generar este mensaje de error:
btnNew.Enabled := not CurrentMode = Restrict;

Solucin rpida
1. No utilice Div sobre valores de tipo float; utilice / en su lugar:
. . .
Table1Percentage.Value :=
Table1MySalary.Value / Table1AllTheMoneyInTheWorld.Value;
. . .

2. Hgalo de esta manera:


if State in [dsEdit, dsInsert] then
. . .

3. Borre el signo (+) adicional del cdigo.


4. Utilice un tipo de puntero con tipo, as:
procedure ThatWasAGood;

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;

5. Llame al procedimiento directamente o cambie el procedimiento por una


funcin que devuelva un valor Boolean.
6. No utilice los operadores Is o As sobre operandos Variant.
7. Encierre la expresin Boolean a negar entre parntesis, as:
btnNew.Enabled := not (CurrentMode = Restrict);

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.

ORA-1001 invalid cursor


Posible causa de error
Lo siguiente podra ser cierto:
Est utilizando Delphi 4.
Est intentando ejecutar un procedimiento almacenado en un paquete
situado en un servidor de Oracle 7.3.x.
Tiene un procedimiento con ms de un parmetro.

420

Los Tomos de Delphi: Delphi sin problemas

Uno de los parmetros es un REF CURSOR.

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.

Order of fields in record constant differs from declaration


Posible causa de error
Puede haber declarado una constante con tipo (variable inicializada) que inicializa a los miembros de un registro en un orden distinto del de la declaracin
del registro. Por ejemplo, lo siguiente generar este mensaje de error.
Type
TTresHombres = record
Z: String;
Zee: String;
Top: String;
end;
var
TresHombres : TTresHombres
= (Zee: 'Billy'; Z: 'Dusty'; Top: 'Frank');

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

Ordinal type required


Posible causa de error
Puede haber utilizado un tipo no ordinal en un lugar o situacin donde un tipo
ordinal es requerido. Cualquiera de los siguientes ejemplos generar este mensaje de error:
{ a }
type
GilligansIsland = 'Ginger'..'MaryAnne';
{ b }
var
i: Integer;
s: String;
begin
for i := 0 to ColCount-1 do
strgrd.Cells[i,s];
{ c }
Type
GoodViewing = set of string;
{ d }
var
SixPack: string;
begin
case SixPack of
'Pilsner Urquell':'Czech Republic';
'Lambic':'Belgium';
'Becks':'Germany';
'Guinness Stout':'Ireland';
'Sprechers': 'USA';

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

Los Tomos de Delphi: Delphi sin problemas


var
Etikett: String;
begin
case WineChoice of
Zinfandel: Etikett := 'Stevenot';
CabernetSauvignon:Etikett := 'Sutter Home';
Burgundy: Etikett := 'Almaden';
end;

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)

Reducir la aceleracin de hardware de la tarjeta de vdeo.

Mensajes de error

423

Experimentar con la intensidad/resolucin de color; 1024x768 en

colores de 16 bits parece ser lo peor.


Obtener la ltima versin de los controladores de DirectX
(probablemente no los necesite para sistemas Win98).
No utilizar fondos de escritorio o utilizar un fondo que consuma poca
memoria.

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.

Out of system resources


Posible causa de error
Puede tener muchas ventanas abiertas.

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

Los Tomos de Delphi: Delphi sin problemas

Overflow in conversion or arithmetic operation


Posible causa de error
Puede tener un archivo .DCU daado.

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.

Overloaded procedure <> must be marked with the overload


directive
Posible causa de error
Puede haber intentado sobrecargar un mtodo, pero olvid proporcionar la
directiva Overload a uno o ambos mtodos. Por ejemplo, lo siguiente generar
este mensaje de error:
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; i:integer);

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

Overriding automated virtual method <> cannot specify a dispid


Posible causa de error
Puede estar intentando declarar un nuevo disp-id para un procedimiento de
tipo Automated que est redefiniendo.

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.

Package <> already contains unit <>


Posible causa de error
Puede estar intentando compilar un paquete que requiere (a travs de la clusula Requires o de la lista de paquetes) otro paquete, y ambos paquetes (el que
est intentando compilar y el requerido, que se menciona en el mensaje de
error) contienen la unidad especificada en el mensaje.

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.

Package <> cant be installed because another package with the


same base name is already loaded (<>)
Posible causa de error
1. Puede haber intentado reinstalar un paquete que ya ha sido instalado en
su sistema.
2. Puede haber intentado instalar un componente dentro de un paquete
siguiendo estos pasos:

426

Los Tomos de Delphi: Delphi sin problemas


a. Seleccion Component | Install Component.
b. Seleccion la pgina New Package.
c.

En el cuadro de combinacin Package File Name, proporcion el


nombre de un paquete existente dentro del cual instalar el componente.

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.

Package <> cant be installed because it is not a design time


package
Posible causa de error
Puede haber intentado instalar un paquete de tiempo de ejecucin en la Paleta
de Componentes.

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

hacerlo es aadir una D a los paquetes de tiempo de diseo; para propsitos


de control de versin, la base de cdigo del compilador se aade al final del
nombre del archivo (por ejemplo, DCLIB60.BPL para el paquete de tiempo de
diseo de InterBase).

Package <> is recursively required


Posible causa de error
Puede haber colocado un paquete en su propia seccin Required.

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.

Package unit <> cannot appear in contains or uses clauses


Posible causa de error
Puede haber intentado aadir un paquete a la clusula Contains o Uses de un
paquete.

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

Los Tomos de Delphi: Delphi sin problemas

Packages <> and <> both contain unit <>


Posible causa de error
Puede estar intentando compilar un proyecto que utiliza los dos paquetes mencionados en el mensaje de error, y cada uno contiene una unidad del mismo
nombre (quizs la misma unidad, quizs dos unidades que por coincidencia tienen el mismo nombre).

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.

PACKED not allowed here


Posible causa de error
Puede estar intentando aplicar la palabra reservada Packed a un tipo que no
es un conjunto (set), array, registro (record), clase (class) o archivo (file). Por
ejemplo, lo siguiente generar este mensaje de error:
type
House = Extended;
CamdenYards = packed House;

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

Page Fault in module <> at <>


Posible causa de error
Puede estar intentando mostrar un formulario que ya ha sido liberado.
Cualquiera de los dos ejemplos siguientes generar este mensaje de error si el
formulario ha sido creado y luego liberado:
Form1.Show;
Form1.ShowModal;

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.

Page name cannot be blank


Posible causa de error
Puede estar intentando utilizar el Asistente de Componentes (Component
Wizard) para crear un nuevo componente, pero borr el texto del cuadro de
combinacin Palette Page.

Solucin rpida
Introduzca un nombre en el cuadro de combinacin Palette Page, o seleccione
uno de la lista desplegable.

430

Los Tomos de Delphi: Delphi sin problemas

Informacin adicional
Palette Page es la pgina de la Paleta de Componentes en la que el nuevo componente ser instalado.

Param <> not found


Posible causa de error
Puede haber borrado un parmetro de una lista, pero olvid actualizar el
cdigo que hace referencia al parmetro. Por ejemplo, puede haber tenido una
sentencia SQL como:
INSERT INTO ABC.Alphabet
(SQU_ID, LetterCode, ReportedOn, EffectiveDate)
VALUES (:squid, :ltrcode, :sysDate, :effDate)

Y luego elimin el campo ReportedOn y el parmetro :sysDate, quedando la


sentencia como:
INSERT INTO ABC.Alphabet
(SQU_ID, LetterCode, EffectiveDate)
VALUES (:squid, :ltrcode, :effDate)

Pero an se hace referencia al parmetro :sysDate en algn lugar del cdigo,


por ejemplo:
Params.ParamByName('sysDate').AsDateTime := Now;

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')

Parameter <> not allowed here due to default value


Posible causa de error
Puede haber intentando combinar dos variables con un mismo valor por
defecto en la declaracin de un mtodo, as:
procedure PTBoat(i: Integer; j, k: Integer = 0);

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.

Parameter <> not found


Posible causa de error
Puede haber llamado al mtodo Params.ParamByName de un componente
TSQLQuery (DBExpress) sin haber configurado antes su propiedad
SQLConnection.

Solucin rpida
Configure la propiedad SQLConnection del objeto TSQLQuery, asignndole un
componente TSQLConnection apropiado.

Informacin adicional
DBExpress apareci por primera vez en Delphi 6.

Parameters of this type cannot have default values


Posible causa de error
Puede haber intentado proporcionar un valor o valores por defecto a un parmetro de un mtodo, pero esta caracterstica no est soportada para el tipo de
datos del parmetro para el que est proporcionando el valor por defecto.
type
AI2 = array [0..2] of integer;
. . .
procedure BraveAttempt(a: AI2 = [1, 2, 3]);

Solucin rpida
Elimine los valores por defecto.

432

Los Tomos de Delphi: Delphi sin problemas

Informacin adicional
Para ms informacin, consulte default property values en la ayuda de
Delphi.

Parent Interface must be Dispatchable for dual interface


Posible causa de error
Puede estar intentando cargar una biblioteca de tipos con Delphi 3.

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.

Passthrough SQL connection must be shared


Posible causa de error
Puede estar utilizando Microsoft Access e intent actualizar los resultados de
una consulta.

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.

Path not found. File <>


Posible causa de error
Puede estar intentando abrir o activar un componente TTable cuya propiedad
DatabaseName apunta a una ubicacin de la tabla indicada en la propiedad

Mensajes de error

433

TableName que difiere de la ubicacin real de la tabla. La tabla puede haber


sido movida o borrada, o el alias no ha sido configurado apropiadamente.

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.

Path too long


Posible causa de error
Puede estar utilizando tablas Paradox anteriores al nivel 7.

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.

Pointer type required


Posible causa de error
Puede estar intentando aplicar un operador de derreferenciacin (^) a un identificador que no es un puntero. Los dos ejemplos siguientes generarn este
mensaje de error:
{ Ejemplo A }
procedure ItsNotPoliteTo;
var
i, j: Integer;
p: Pointer;
begin
p := @i;

434

Los Tomos de Delphi: Delphi sin problemas


i^ := j; //esto provoca el error, ya que i no es un puntero
//y no puede aplicrsele el operador ^
{ Ejemplo B }
procedure ItsNotPoliteTo;
var
i, j: Integer;
p, q: Pointer;
begin
p := @i;
q := i^; //esto provoca el error, ya que i no es un puntero
//y no puede aplicrsele el operador ^

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.

Preparation of default expression failed with error Type mismatch


in expression
Posible causa de error
Puede haber asignado a la propiedad DefaultExpression de un TField un valor
que no es un entero o no est encerrado entre apstrofes. Por ejemplo, si
asigna True o False como DefaultExpression para un campo TBooleanField,
obtendr este mensaje de error.

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.

Previous declaration of <> was not marked with the overload


directive
Posible causa de error
1. Puede estar intentando crear una segunda versin de un mtodo con una
lista de parmetros diferente del primero (esto es lo que el mensaje de
error indica).
2. Puede tener listas de parmetros diferentes en la seccin Implementation y
en la seccin Interface para un mismo mtodo, procedimiento o funcin.
Por ejemplo, puede tener en la interfaz una declaracin similar a sta:
procedure BelowZeroError(Sender: TObject);

y en la implementacin una definicin como sta:


procedure BelowZeroError(PercentageType: String; Sender: TObject);

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

Los Tomos de Delphi: Delphi sin problemas


var
Palindrome: System.Text;
begin
AssignPrn(Palindrome);
Rewrite(Palindrome);
Writeln(Palindrome,'SIT ON A POTATO PAN OTIS');

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.

Procedure cannot have a result type


Posible causa de error
Puede haber declarado un procedimiento, pero le asoci un tipo de resultado.
Por ejemplo, lo siguiente generar este mensaje de error:
procedure FetchMySlippersFido: TSlippers;

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

procedure HotEnoughForYa(var globalWarming: Boolean);


var
Centigrade: integer;
begin
Centigrade := StrToInt(Edit1.Text);
if Centigrade > 77 then
globalWarming := True;
end;

Procedure FAIL only allowed in constructor


Posible causa de error
Puede haber llamado a Fail en algn lugar que no es un constructor. Por ejemplo, lo siguiente generar este mensaje de error:
if Grade in ['D','F'] then Fail;

Solucin rpida
Llame a Fail solamente desde un constructor.

Informacin adicional
Incluso dentro de un constructor, no es buena costumbre llamar a Fail.

Procedure, function or property expected


Posible causa de error
Puede haber seleccionado Edit | Add to Interface en un proyecto que tiene
una biblioteca de tipos, pero olvid especificar el tipo del elemento que quiere
aadir a la interfaz. Por ejemplo, si escribe Condemned en el cuadro de edicin, obtendr este mensaje de error.

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

Los Tomos de Delphi: Delphi sin problemas


de resultado: function <nombre>: <tipo_resultado>. Si aade una propiedad,
debe especificar un tipo: property <nombre>: <tipo>.

Procedure or Function expected


Posible causa de error
Puede estar intentando crear un mtodo de clase, pero olvid aadir la palabra
reservada Function o Procedure. Por ejemplo, lo siguiente generar este mensaje de error:
public
function BillyCanYouLendMeA: Currency;
class a;

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;

Los constructores y destructores son tipos especiales de mtodos de clase.

Mensajes de error

439

Procedure or Function name expected


Posible causa de error
Puede haber especificado un identificador que no es un procedimiento o funcin
en una clusula Exports. Por ejemplo, si Yoopdl es el nombre de una variable
de tipo Integer, lo siguiente en un archivo de biblioteca (.DLL) generar este
mensaje de error:
exports
yoopdl;

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.

Program or unit <> recursively uses itself


Posible causa de error
Puede haber aadido el nombre de la unidad actual a su propia clusula Uses
(en la seccin Interface o Implementation). Por ejemplo, lo siguiente generar
este mensaje de error:
unit TheGooch;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, TheGooch;

Solucin rpida
Elimine la referencia a s misma de la clusula Uses.

Informacin adicional
Consulte Circular Unit Reference [to <>].

440

Los Tomos de Delphi: Delphi sin problemas

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

3. En la seccin Debugging, marque la casilla de verificacin Break on


Exceptions.

Property <> does not exist in base class


Posible causa de error
Puede haber declarado una propiedad sin declarar su tipo. Por ejemplo, puede
haber hecho algo as:
published
property ValuesKeepSkyrocketing;

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

Los Tomos de Delphi: Delphi sin problemas


private
FRealEstate: Currency;
protected
{ }
public
{ }
published
property RealEstate: Currency read FRealEstate write FRealEstate;

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;

Property <> inaccessible here


Posible causa de error
Puede haber intentado acceder a una propiedad dentro de un procedimiento o
funcin. Por ejemplo, lo siguiente generar este mensaje de error:
class procedure TWhatever.Cre8Yourself;
begin
with TWhatever.Create(Application) do
Show;
SomeProperty := 1;
end;

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

Property does not exist


Posible causa de error
Puede estar abriendo un proyecto creado en Delphi 4 o superior con Delphi 3 o
una versin inferior.

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.

Property getters and setters cannot be overloaded


Posible causa de error
Puede haber aadido mtodos de acceso de lectura (getters) o de escritura (setters) sobrecargados a una declaracin de la clase. Por ejemplo, lo siguiente
generar este mensaje de error:
type
TGoIrish = class
function GoGetter: Integer; overload;
function GoGetter: String; overload;
procedure IrishSetter(Value: Integer); overload;
procedure IrishSetter(Value: String); overload;

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

Los Tomos de Delphi: Delphi sin problemas

Property overrides not allowed in interface type


Posible causa de error
Puede haber derivado un tipo de interfaz de otro, y utiliz la misma propiedad
en la interfaz derivada. Por ejemplo, lo siguiente generar este mensaje de
error:
type
BigDog = interface
function Fetch: Integer;
procedure Dig(ADepth : Integer);
property PapersAndHoles: Integer read Fetch write Dig;
end;
Puppy = interface (BigDog)
function FetchQuicker: Integer;
property PapersAndHoles: Integer read FetchQuicker;
end;

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.

Provider name was not recognized by the server


Posible causa de error
Puede haber hecho cambios a la aplicacin servidora sin reconstruir todo el
proyecto.

Solucin rpida
Seleccione Project |Build All.

Informacin adicional
Para ms informacin, consulte multi-tiered aplications en la ayuda de
Delphi.

Mensajes de error

445

Published field <> not a class nor interface type


Posible causa de error
1. Puede haber intentado declarar un campo que no es de un tipo de clase en
una seccin Published. Por ejemplo, lo siguiente generar este mensaje de
error:
type
TScantyClass = class
published
eye : Integer;
end;

2. Puede haber olvidado especificar la visibilidad para un campo que declar


en una clase. Por ejemplo, lo siguiente generar este mensaje de error:
type
TMyClass = class(TComponent)
FInteger: Integer;
. . .
end;

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;

2. Proporcione un especificador de visibilidad, as:


type
TMyClass = class(TComponent)
private
FInteger: Integer;
. . .
end;

Informacin adicional
Para ms informacin, consulte class types y class type compatibility rules
en la ayuda de Delphi.

446

Los Tomos de Delphi: Delphi sin problemas

Published property <> cannot be of type <>


Posible causa de error
Puede haber declarado una propiedad de un tipo que no es ordinal, Single,
Double, Extended, Comp, String, Set (hasta 16 elementos en Delphi 1; hasta
32 elementos en Delphi de 32 bits), o puntero a mtodo.

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.

Published real[48] property <> must be Single, Double, or


Extended
Posible causa de error
Puede haber intentado publicar una propiedad de tipo Real en Delphi 1, 2 3.
Por ejemplo, lo siguiente generar este mensaje de error:
. . .
private
FElCamino: Real;
public
{ Public declarations }
published
property ElCamino: real read FElCamino
write SetElCamino;

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.

PutObject to undefined item


Posible causa de error
Puede estar intentando insertar en una lista de cadenas un objeto que no tiene
una cadena correspondiente.

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.

Query Is Too Complex


Posible causa de error
Puede que la propiedad UpdateMode de un TQuery tenga el valor UpWhereAll.

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

Los Tomos de Delphi: Delphi sin problemas

Todos los campos (si UpdateMode es igual a UpWhereAll). Comparar todos


los campos puede resultar en un duro golpe para el rendimiento; en
consecuencia, el mensaje de error.

Query makes no sense


Posible causa de error
Puede estar intentando una insercin, pero ha especificado nombres de columnas en lugar de los valores a insertar. Por ejemplo, lo siguiente generar este
mensaje de error:
INSERT INTO TEAM VALUES(Catcher, Pitcher, Shortstop, Centerfield)

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;

Para especificar valores literales, sustituya la lnea SQL.Add por:


SQL.Add('INSERT INTO TEAM VALUES( + QuotedStr(Hoiles)
+ QuotedStr(Mussina') + QuotedStr('Bordick')
+ QuotedStr('Anderson') + ));

Informacin adicional
Consulte la documentacin de su base de datos para conocer los detalles especficos de SQL y su sintaxis.

Mensajes de error

449

Query may take a long time to process


Posible causa de error
Puede estar utilizando una sentencia SQL que devuelve un conjunto de resultados muy grande, por ejemplo
SELECT * FROM TEXAS WHERE FAVORITE_EXPRESSION = 'YEE-HAH!'

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!'

Range check error


Posible causa de error
1. Puede haber intentado acceder mediante un ndice a un elemento de un
array proporcionando un nmero que es mayor que el tamao del array.
Por ejemplo, lo siguiente producira este mensaje de error:
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
a: array[1..16] of integer;
begin
i := 17;
a[i] := 1;
{se intenta asignar al elemento 17, que no existe}
end;

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

Los Tomos de Delphi: Delphi sin problemas

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.

Read failure. File: <>.val


Posible causa de error
Puede haber intentado asignar True a la propiedad Active de un componente
TTable que representa una tabla Paradox, y la tabla contiene un archivo .VAL
daado.

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.

Read or Write clause expected but identifier <> found


Posible causa de error
Puede haber olvidado proporcionar un especificador Read o Write en la declaracin de una propiedad que lo requiere . Por ejemplo, debido a que las propiedades que son utilizadas para implementar interfaces por delegacin requieren
un especificador Read, lo siguiente generar este mensaje de error:

Mensajes de error

451

property SomeInterface: ISomeInterface


implements ISomeInterface;

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.

Record already locked by this session


Posible causa de error
1. Puede estar utilizando Paradox y tener un archivo .LCK o .NET daado.
2. Puede haber asignado True a la propiedad Active de un conjunto de datos
en tiempo de diseo.

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).

Record changed by another user


Posible causa de error
Puede estar utilizando MS SQL Server, y el registro en cuestin contiene una
columna DateTime.

452

Los Tomos de Delphi: Delphi sin problemas

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.

Record Key deleted


Posible causa de error
Puede estar utilizando MS Access y un controlador ODBC.

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

Record Locked by another User


Posible causa de error
Puede estar intentando editar un registro mientras otro usuario lo tiene
bloqueado.

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).

Record, object or class type required


Posible causa de error
Puede haber intentado utilizar la palabra reservada With sobre una variable.
Por ejemplo, lo siguiente generar este mensaje de error:
var
JAndJWentUpTheVerticallyChallengedMountain: Boolean;
. . .
with JAndJWentUpTheVerticallyChallengedMountain do
if True then False;

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

Los Tomos de Delphi: Delphi sin problemas

Recursive include file <>


Posible causa de error
Puede haber utilizado la directiva de compilador {$I <archivo>}, y el archivo
que incluy tambin contiene la misma directiva {$I <archivo>} (es decir, el
archivo incluido est tratando de incluirse a s mismo). Por ejemplo, si aadi:
{$I Murder.inc}

a una unidad, y el archivo contena esta lnea:


{$I Murder.inc}

obtendr este mensaje de error.

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}

a una unidad, y el archivo Murder.inc incluy esto:


{ El idioma francs, con su gran cantidad de letras mudas,
ha ocasionado el desperdicio de muchos galones de tinta.
no es cierto, Phydeaux? }

Este comentario ser aadido al cdigo fuente.

Redeclaration of <> hides a member in the base class


Posible causa de error
1. Puede haber creado un descendiente de una clase y declar un mtodo que
tiene el mismo nombre de alguno situado en la clase de la cual hered, pero
no ha utilizado la directiva Override.
2. Puede haber sido instalada una nueva versin de una clase base, a la que
se han aadido nuevas propiedades y/o mtodos que tienen el mismo nombre que otras propiedades y/o mtodos en la clase descendiente.

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 <>.

Redeclaration of property not allowed in OLE automation section


Posible causa de error
Puede haber intentado promover una propiedad heredada a la seccin Automated de una clase descendiente.

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.

Required package <> not found


Posible causa de error
Puede estar intentando compilar un paquete que contiene en su clusula
Requires una unidad (explcitamente por su nombre o implcitamente a travs
de una unidad utilizada por la unidad nombrada) que no existe o no est en la
ruta de bsqueda de Delphi.

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

Los Tomos de Delphi: Delphi sin problemas

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.

REQUIRES clause is incorrect


Posible causa de error
Puede haber omitido el punto y coma final en la clusula Requires del archivo
fuente de paquete, o aadi alguna extensin de archivo a la declaracin.

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;

Re-raising an exception only allowed in exception handler


Posible causa de error
1. Puede haber intentado relanzar una excepcin fuera de un bloque de
excepcin.
2. Puede haber reasignado el gestor de eventos OnException del objeto Application as:
Application.OnException := FilterExceptions;

y luego utiliz la palabra reservada Raise en el gestor de excepcin personalizado, as:

Mensajes de error

457

if ReportObj.ProgramMode = pmBatch then begin


ReportObj.WriteToLogFile(
SReportName, SDelphiErrorMessage+E.Message,
SWindowsErrorCode+IntToStr(GetLastError),
DateToStr(Now), TimeToStr(Now));
Abort;
end else
raise;

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.

Resource <> not found


Posible causa de error
Puede haber aadido su propio recurso a un proyecto, pero ste no puede ser
encontrado por el compilador debido a que est mal escrito el nombre del
recurso o no est en el mismo directorio que el archivo de proyecto (.DPR).

458

Los Tomos de Delphi: Delphi sin problemas

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.

Segment/Offset pairs not supported in Borland 32-bit Pascal


Posible causa de error
Puede estar utilizando una versin de Delphi diferente de Delphi 1 y haber
especificado una direccin de memoria con un segmento y un desplazamiento.
Por ejemplo, la siguiente declaracin de variable generar este mensaje de
error en Delphi de 32 bits:
type
Vodka = Integer;
var
Absolut: Vodka absolute $00:40;

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.

Selection contains a component introduced in an ancestor form


which cannot be deleted
Posible causa de error
Puede haber intentado borrar un componente heredado de un formulario
descendiente.

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.

Como se puede ver, el nico objeto que ha sido aadido al formulario es un


TButton, declarado como Button1: TButton.
Cuando se hereda de este formulario (seleccionando File | New, y luego seleccionando el formulario de la pgina que tiene el mismo nombre del proyecto), el
cdigo fuente es:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes,

460

Los Tomos de Delphi: Delphi sin problemas


Graphics, Controls, Forms, Dialogs;
type
TForm2 = class(TForm1)
private
{ Declaraciones Private }
public
{ Declaraciones Public }
end;
var
Form2: TForm2;
implementation
{$R *.DFM}
end.

Como se puede ver, no hay una declaracin explcita de un objeto TButton en


la clase descendiente. Sin embargo, esto est implcito en la declaracin
TForm2 = class (TForm1), que dice, en efecto, que TForm2 hereda todo de
TForm1 (incluyendo el botn). Si se permitiera borrar cualquier cosa de
TForm2 que fuera heredada de TForm1, la declaracin de arriba no sera vlida, y el enlace de herencia quedara roto.

Server Execution Failed


Posible causa de error
Puede haber intentado asignar True a la propiedad Connect de un componente
TDCOMConnection, TOLEEnterprise o TRemoteServer sin haber especificado
una valor vlido para la propiedad ServerName o ServerGUID.

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.

Session name missing


Posible causa de error
Puede estar intentando asignar True a la propiedad Active de un componente
TSession sin primero proveer un valor para su propiedad SessionName.

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.

Sets may have at most 256 elements


Posible causa de error
Puede haber intentado declarar un tipo conjunto (set) utilizando un tipo base
que contiene ms de 255 elementos. Por ejemplo, los siguientes tipos generarn
este mensaje de error:
type
sow = set of Word;
sos = set of String;

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

Los Tomos de Delphi: Delphi sin problemas

type
TAWholeMessOfIntegers = 2..243;
TIntegerSet = set of TAWholeMessOfIntegers;
var
SetTopBox, Settee: TIntegerSet;
begin
SetTopBox := [1, 3, 5, 7, 9];

Recuerde, sin embargo, que no puede exceder el lmite inferior de 0 ni el lmite


superior de 255. Ninguna de las declaraciones siguientes compilar:
type
TAWholeMessOfIntegers = -2..243;
TAWholeMessOfIntegers = 23..263;

Share not loaded. It is required to share local files


Posible causa de error
Al archivo SYSTEM.INI o AUTOEXEC.BAT le puede faltar una lnea que es
requerida por el BDE (el mdulo Share no est cargado).

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

Para editar AUTOEXEC.BAT en una ventana DOS, siga estos pasos:


1. Teclee Edit autoexec.bat y pulse la tecla Enter.
2. Aada SET SHARE=C:\dos\share /F:4096 /L:40 al final del archivo.
3. Guarde el archivo, seleccionando File | Exit y luego Yes para grabar los
cambios.
4. Escriba autoexec y pulse la tecla Enter.

Size mismatch error


Consulte Record Key deleted.

Size of published set <> is greater than [4 bytes, 32 bits]


Posible causa de error
Puede haber intentado declarar un propiedad de un tipo conjunto que tiene
ms de 32 elementos. Por ejemplo, lo siguiente generar este mensaje de error:
TGridIronMen = set of
(TQuarterback, THalfback, TFullback, TTailback, TFlanker,
TLWideReceiver, TRWideReceiver, TTightEnd, TLTackle, TRTackle,
TRGuard, TLGuard, TCenter, TMiddleLinebacker, TNoseguard,
TLDefensiveTackle, TRDefensiveTackle, TLDefensiveEnd,
TRDefensiveEnd, TLLinebacker, TRLinebacker, TLSafety,
TLCornerback, TRCornerback, TRSafety, TKicker, TPunter,
TPuntReturner, TKickReturner, TSpecialTeamsDemon,
TGeneralManager, TCoach, TWaterboy);
type
private
FGridIronMen: TGridIronMen;
public
{}
published
property GridIronMen: TGridIronMen read FGridIronMen
write FGridIronMen;

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

Los Tomos de Delphi: Delphi sin problemas


TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut);
TFontStyles = set of TFontStyle;

La clase TFont luego declara una propiedad Style:


property Style: TFontStyles read GetStyle write SetStyle;

Puede luego asignar valores a la propiedad as:


Font.Style := [fsBold, fsItalic];

Puede borrar todos los estilos asignndole a la propiedad el conjunto vaco:


Font.Style := [];

Para ms informacin, consulte sets (set types) en la ayuda de Delphi.

Slice standard function is only allowed as open array argument


Posible causa de error
Puede haber llamado a la funcin Slice, pero no est enviando el resultado a
un procedimiento o funcin que espera un argumento de array abierto. Por
ejemplo, lo siguiente generar este mensaje de error:
procedure Chop;
begin
Slice(Dice,2);

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.

Socket Error # 10061 Connection Refused


Posible causa de error
1. Puede estar intentando conectarse a un socket (representado por un componente TIdTCPServer) con un componente TIdTCPClient, y el servidor no
est en ejecucin.
2. Puede haber especificado un socket invlido o inexistente al intentar conectarse a un socket con un componente TIdTCPClient.

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.

Socket Error # 10065 No route to host


Posible causa de error
Puede estar intentando conectarse a un componente TIdTCPServer con un
componente TIdTCPClient, pero ha introducido un valor errneo en la propiedad Host de TIdTCPClient.

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

Los Tomos de Delphi: Delphi sin problemas

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.

Socket Error # 11001 Host not found


Posible causa de error
Puede estar intentando conectarse a un componente TIdTCPServer, pero no es
posible establecer una conexin con la mquina a la cual est intentando
conectarse. Por ejemplo, puede estar intentando conectarse a un servidor
HTTP, pero no tiene una conexin a Internet activa.

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.

SQL Connection timed out


Posible causa de error
1. Puede estar experimentando un bajo rendimiento de la red.
2. Puede estar intentando obtener un conjunto resultado muy grande.
3. Puede que necesite cambiar el valor de un parmetro del controlador del
BDE o de su sistema de base de datos.

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.

SQL Dialect Invalid


Posible causa de error
Puede haber cambiado el valor de la propiedad SQLDialect de un componente
TIBDatabase a algo diferente de 1 mientras utilizaba una versin de InterBase
anterior a InterBase 6.

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).

SQL is too complex


Posible causa de error
Puede haber intentado grabar registros mientras la propiedad UpdateMode del
objeto TTable o TQuery tiene asignado el valor UpWhereAll.

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

Los Tomos de Delphi: Delphi sin problemas


valor UpWhereAll en el parmetro UpdateMode, algunos controladores de
bases de datos no son lo suficientemente robustos para manejarlo. Para ms
informacin, consulte UpdateMode en la ayuda de Delphi.

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}

2. Reduzca el tamao y cantidad de las variables globales.


3. Si no est utilizando deliberadamente la recursin, verifique el cdigo de
gestores de eventos como OnChange, donde puede estar provocando un
cambio que dispara el evento de nuevo, que provoca el cambio de nuevo,
que dispara el evento de nuevo, etc.
4. Pase punteros a registros en lugar de pasar los propios registros.
5. Divida los procedimientos y/o funciones grandes en otros ms pequeos.
6. Pase las variables grandes como parmetros variables o constantes.

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.

Statement expected, but expression of type <> found


Posible causa de error
Puede estar intentando llamar al procedimiento Abort de la unidad SysUtils,
pero tambin tiene la unidad DbiProcs o BDE en la seccin Uses.

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.

Statements not allowed in interface part


Posible causa de error
Puede haber aadido una sentencia a la parte Interface de una unidad. Por
ejemplo, lo siguiente generar este mensaje de error:
unit Unit4;
interface
procedure ColorFormWhite(Sender: TObject);
begin
TForm(Sender).Color := clWhite;

470

Los Tomos de Delphi: Delphi sin problemas


end;
implementation

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.

STORED clause not allowed in OLE automation section


Posible causa de error
Puede estar intentando utilizar la clusula Stored en la seccin Automated.

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.

Stream Read Error


Posible causa de error
Puede estar intentando cargar un formulario creado en Delphi de 32 bits en
Delphi 1.

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.

String constant truncated to fit STRING[ ]


Posible causa de error
Puede haber asignado una cadena a una variable cuyo tamao es menor que el
de la cadena que est intentando asignar. Por ejemplo, lo siguiente generar
este mensaje de error:
var
s: String[3];
begin
s := string;

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.

String [literal]s may have at most 255 elements


Posible causa de error
1. Puede haber declarado una cadena corta de ms de 255 caracteres. Por
ejemplo, la siguiente declaracin generar este mensaje de error:
var
s: string[256];

472

Los Tomos de Delphi: Delphi sin problemas


2. Puede haber asignado una cadena de ms de 255 caracteres a una cadena
corta. Por ejemplo, si declara una variable ShortString:
var
s: ShortString;

y luego intenta asignarle una cadena de ms de 255 caracteres, obtendr


este mensaje de error.
3. Puede haber asignado una cadena con ms de 255 caracteres en una nica
lnea del editor de cdigo (en esta situacin, el error se producir incluso si
se trabaja con cadenas largas).
4. Puede haber declarado una constante de cadena con ms de 255 caracteres.
Por ejemplo, si asignara el texto de la direccin completa de Gettysburg a
una constante de cadena, obtendra este mensaje de error.

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.

Syntax Error in Field Definition


Posible causa de error
Probablemente tiene un error de sintaxis en una sentencia SQL. Por ejemplo,
lo siguiente generar este mensaje de error:
with TADOQuery.Create(nil) do begin
try
Connection := ADOConnection1;
SQL.Add(ALTER TABLE SCRIPTURES);
SQL.Add(ADD INDEX ORD_SEQ ON ORDER_SEQUENCE);

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;

En otras palabras, la sintaxis SQL correcta en este caso es:


CREATE INDEX <NombreIndice> ON <NombreTabla>(<NombreCampo>)

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.

Syntax error in query. Incomplete query clause


Posible causa de error
Puede estar intentando acceder a una tabla de Access que tiene espacios en su
nombre, pero ha olvidado encerrar el nombre de la tabla entre corchetes. Por
ejemplo, puede haber hecho algo as:
SELECT *
FROM "ROUND TABLE"

474

Los Tomos de Delphi: Delphi sin problemas

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.

Syntax error in real number


Posible causa de error
Puede haber aadido un factor de escala a un nmero de punto flotante sin
seguidamente haber escrito el exponente. Por ejemplo, lo siguiente generar
este mensaje de error:
var
Mint: Double;
begin
Mint := 123.E;

Solucin rpida
Aada un nmero al factor de escala (E):
var
Mint: Double;
begin
Mint := 123.E7;

Informacin adicional
E significa diez elevado a.

System unit out of date or corrupted


Posible causa de error
La ruta de bsqueda de bibliotecas puede estar apuntando a una versin obsoleta de SYSTEM.DCU, o SYSTEM.DCU puede haberse daado.

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.

Table cannot be opened for exclusive use


Posible causa de error
Puede estar intentando llevar a cabo sobre una tabla abierta una accin que
requiere que la tabla est cerrada para poder ser llevada a cabo. Por ejemplo,
no puede vaciar una tabla (llamando al mtodo EmptyTable de TTable) o aadir ndices a una tabla que est abierta.

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;

Active es una propiedad de TTable, que puede ser asignada as:


Table1.Active := True;

476

Los Tomos de Delphi: Delphi sin problemas


Si trata de aadir un segundo ndice por un mismo campo mediante cdigo,
tambin se generar este mensaje de error.
Por ejemplo, la segunda lnea en el siguiente fragmento de cdigo produce este
error:
Table1.AddIndex('LastNameAsc', 'LastName', []);
Table1.AddIndex('LastNameDesc', 'LastName', [ixDescending]);

Table corruptother than header


Posible causa de error
Puede estar utilizando tablas de Paradox sobre una red Windows NT y no ha
asignado True a Local Share en cada uno de los clientes y/o tiene habilitados
los bloqueos oportunistas.

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.

Table does not exist


Posible causa de error
1. Puede tener un error en la sentencia SQL. Verifique la ortografa en la propiedad SQL del objeto TQuery, ya que puede faltar el nombre de la tabla.
2. Puede haber intentado asignar True a la propiedad Active de un objeto
TTable sin proporcionar un valor vlido a la propiedad DatabaseName.

Mensajes de error

477

3. Puede estar intentando utilizar un componente TBatchMove, habiendo


asignado a su propiedad UpdateMode un valor distinto de batCopy, y la
tabla de destino no corresponde a una tabla existente en la ubicacin especificada por la propiedad DatabaseName.
4. Puede estar intentando acceder a tablas Oracle a travs de una sentencia
SQL utilizando un objeto TQuery con la propiedad RequestLive asignada a
True, pero ha olvidado escribir en maysculas los nombres de las tablas.
5. Puede estar intentando acceder a tablas de MS SQL Server, y ha olvidado
anteponer dbo. al nombre de la tabla. Por ejemplo, puede estar utilizando
el siguiente tipo de sentencia SQL:
SELECT * FROM Cooper

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

6. Compruebe que la tabla a la que est intentando acceder est abierta en el


hilo actual (si su aplicacin es una aplicacin multihilo). Compruebe el
valor del parmetro SQLPASSTHRU MODE para el controlador de su base
de datos con la utilidad BDE Configuration. Si est asignada a NOT
SHARED, puede estar intentando leer los datos de una tabla temporal que
est disponible a travs de otra conexin.

Informacin adicional
5. dbo significa database owner (propietario de la base de datos).

Table does not support this operation


Posible causa de error
1. Puede estar utilizando SQL Anywhere y llamando al mtodo RecordCount
de un objeto TTable asociado a una tabla que contiene campos memo.

478

Los Tomos de Delphi: Delphi sin problemas


2. Puede estar accediendo a tablas de MS SQL Server y olvid anteponer dbo.
al nombre de la tabla. Por ejemplo, puede tener un sentencia SQL como:
SEECT * FROM UHF

3. Puede estar intentando llamar a Refresh sobre un TQuery asociado a una


base de datos SQL Server (Oracle, MS SQL Server, InterBase, etc.) que
tiene asociada una consulta compleja o que involucra productos
cartesianos.

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

2. Anteponga dbo. al nombre de la tabla. Por ejemplo:


SELECT * FROM dbo.UHF

3. Llame al mtodo Close del objeto TDataset y luego al mtodo Open en


lugar de llamar a Refresh si tiene este problema con Refresh.

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

Los Tomos de Delphi: Delphi sin problemas

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

Tamao mximo de tabla

2 KB

128 MB

4 KB

256 MB

8 KB

512 MB

16 KB

1.024 MB

32 KB

2.048 MB

Table is not indexed


Posible causa de error
Puede estar intentando crear un ndice secundario sobre una tabla Paradox
que no tiene un ndice primario.

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]);

Para ms informacin, consulte secondary indexes en la ayuda de Delphi.

Table is read only


Posible causa de error
1. Puede haber intentado llamar al mtodo Edit o Delete de un objeto TTable
cuya propiedad ReadOnly tiene asignado el valor True.
2. Puede estar intentando editar el resultado de una consulta que conecta
varias tablas.
3. Puede estar intentando editar el resultado de una consulta sobre una nica
tabla, y el parmetro RequestLive del objeto TQuery tiene asignado False.

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

Los Tomos de Delphi: Delphi sin problemas

Table or View does not exist


Posible causa de error
1. Puede no tener derechos para ver la tabla o vista a la que est intentando
acceder.
2. Puede estar utilizando una consulta viva (con valor True en su propiedad
RequestLive) y no haber utilizado las maysculas para especificar el nombre de la tabla. Por ejemplo, lo siguiente generar este mensaje de error:
SELECT * FROM Round

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.

TActiveFormX declaration missing or incorrect


Posible causa de error
Puede haber cambiado el nombre de una CoClass antes de cambiar el nombre
del formulario.

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

y modifquela para que contenga el nombre su variable de instancia y su tipo


de clase, por ejemplo:
object Whatever: TWhatever

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.

Text after final END


Posible causa de error
Puede tener algn texto despus del End final. (El End final va seguido de un
punto en lugar de un punto y coma).

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.

The <>.EXE file is linked to missing export <>.DPL:<>


Posible causa de error
Puede haber creado una aplicacin que utiliza paquetes, y actualiz uno o ms
de los paquetes que usa sin actualizar el .EXE.

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

Los Tomos de Delphi: Delphi sin problemas

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.

Despus de crear un botn y asociarle un gestor de eventos, el archivo .PAS


tendr la siguiente apariencia:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
{sta es la seccin Published}
Button1: Tbutton;
{Los componentes que coloque sobre el formulario
sern colocados en la seccin Published}
procedure Button1Click(Sender: TObject);
{Los gestores de eventos que cree
sern colocados en la seccin Published}
private
{ Declaraciones Private }
public
{ Declaraciones Public }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.

Esto es diferente a lo que ocurre en el caso de un archivo de componente .PAS,


que contiene explcitamente secciones Private, Protected, Public y Published.
El siguiente cdigo es del que usted deber partir si utiliza el Asistente de
Componentes (Component Wizard) para crear un nuevo componente basado en
el componente TStringGrid:
unit StringGrid1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, Grids;
type
TStringGrid1 = class(TStringGrid)
private
{ Declaraciones Private }
protected

486

Los Tomos de Delphi: Delphi sin problemas


{ Declaraciones Protected }
public
{ Declaraciones Public }
published
{ Declaraciones Published }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TStringGrid1]);
end;
end.

The <> method referenced by <>.<> has an incompatible


parameter list. Remove the reference?
Posible causa de error
Puede haber cambiado la lista de parmetros original del mtodo (la que est
en la parte Interface).

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).

The application or DLL <> is not a valid Windows image. Please


check this against your installation diskette.
Posible causa de error
Puede haber intentado registrar un servidor de automatizacin de Delphi
antes de compilarlo. Por ejemplo, si escribe <Proyecto>.DPR /regserver en
la lnea de comandos, obtendr este mensaje de error.

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.

The Edit Buffer of <> is marked read-only


Posible causa de error
Puede estar intentando editar un archivo bloqueado. Por ejemplo, puede estar
intentando hacer cambios a un archivo que ha sido marcado como de slo lectura desde un sistema de control de versiones como PVCS.

Solucin rpida
Marque el archivo como apto para escritura, y luego haga los cambios.

488

Los Tomos de Delphi: Delphi sin problemas

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.

The Master Source property of <> must be linked to a DataSource


Posible causa de error
Puede haber intentado asignar la propiedad MasterFields de un componente
TTable sin primero haber asignado la propiedad MasterSource.

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

The package already contains unit named <>


Posible causa de error
Est intentando instalar un componente dentro de un paquete que ya contiene
un componente con el mismo nombre.

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.

The package already requires a package named <>


Posible causa de error
Puede haber intentado aadir un paquete a la seccin Required de otro
paquete que ya ha sido especificado en la seccin Required del primer paquete.

Solucin rpida
Seleccione OK. El paquete no es aadido por segunda vez.

490

Los Tomos de Delphi: Delphi sin problemas

Informacin adicional
Para ms informacin, consulte packages en la ayuda de Delphi.

The page cannot be displayed


Posible causa de error
Puede haber especificado incorrectamente el puerto en el URL, o ningn
puerto, o est escuchando por el puerto equivocado en su aplicacin Site
Express.

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.

The path entered does not exist


Posible causa de error
Puede haber seleccionado el botn Finish en el Asistente de Aplicaciones
(Application Wizard) sin haber especificado una ruta vlida en el cuadro de
edicin donde se debe indicar dnde la aplicacin se almacena.

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.

The project already contains a form or module named <>


Posible causa de error
Puede estar intentando darle a un formulario o unidad el mismo nombre de
otro ya existente en el proyecto. Puede ser que est tratando de asignarle a un
formulario el mismo nombre de archivo que el nombre de componente que le ha
asignado en el Inspector de Objetos (o el nombre que Delphi asigna por defecto)
por ejemplo, Form1.

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

Los Tomos de Delphi: Delphi sin problemas


El nombre bajo el que grabe la unidad ser el nombre del archivo (Unit1 por
defecto). Este es el nombre que ver en los cuadros de dilogo Open y Save, en
el Explorador de Windows, etc.
En el cdigo, haga referencia al formulario por su nombre de objeto/clase,
excepto en la seccin Uses. Por ejemplo, sta es una declaracin de formulario
sencilla:
unit Unit1;

{nombre por defecto del primer formulario


o unidad del proyecto}

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.

The Resource DLL Wizard requires a project to be open


Posible causa de error
Puede haber seleccionado el Asistente de .DLLs (File | New | DLL Wizard)
sin tener un proyecto abierto.

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.

The search string cannot be blank


Posible causa de error
Puede haber intentado buscar una cadena en el entorno integrado de Delphi
utilizando Search | Find, pero olvid introducir una cadena para buscar en el
cuadro de combinacin correspondiente.

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.

The selected bitmap is larger than 24x24


Posible causa de error
Mientras creaba una plantilla de componente, puede haber intentado grabar
un mapa de bits para el icono del componente que es demasiado grande para
ser mostrado en el espacio reservado para ello en la pgina correspondiente de
la Paleta de Componentes.

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

Los Tomos de Delphi: Delphi sin problemas


tecla May, o b) el del componente situado ms a la izquierda o ms arriba, si
seleccion los componentes marcando un rea con el ratn.
Si no desea utilizar el icono por defecto, puede crear uno (recuerde que no debe
ser mayor de 24 x 24 pxeles) con el Image Editor o cualquier otro programa de
edicin de mapas de bits, como Microsoft Paint.
Para crear un icono con el Image Editor, siga estos pasos:
1. Seleccione Tools | Image Editor.
2. Seleccione File | New. . . | Bitmap file (OJO: no Icon file, aunque el
cuadro de dilogo Component Template Information lo llama Palette
Icon).
3. Asigne 24 a Width (ancho) y Height (altura).
4. Seleccione View | Zoom In hasta cuatro veces (dependiendo de su
preferencia).
5. Cree el mapa de bits que desee utilizar como su icono de la paleta.
6. Guarde el archivo de mapa de bits.

The server returned an invalid response


Posible causa de error
Puede estar haciendo referencia a un mtodo de la interfaz Webbrokerscript,
pero su biblioteca de tipos no ha sido registrada.

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.

The type library has syntax errors


Posible causa de error
Probablemente ha omitido algo necesario de la biblioteca de tipos, como una
interfaz para una CoClass.

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

Los Tomos de Delphi: Delphi sin problemas

There is currently no active project


Posible causa de error
Puede haber seleccionado File | New | Control Panel Applet sin tener
activo un proyecto de aplicacin del Panel de Control.

Solucin rpida
Abra primero una aplicacin del Panel de Control, seleccionando File | New |
Control Panel Application.

Posible causa de error


Las aplicaciones del Panel de Control pueden ser creadas con la versiones Professional y Enterprise de Delphi.

There is no default printer currently selected


Posible causa de error
Puede estar ejecutando Citrix Winframe sobre Windows NT y no ha
establecido una impresora por defecto.

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.

There is no overloaded version of <> that can be called with these


arguments
Posible causa de error
1. Puede estar llamando a una funcin de conversin inapropiada. Por ejemplo, lo siguiente generar este mensaje de error:
HollywoodSquare :=
IntToStr(Sqr(StrToInt(edtNum2Square.Text)));

Mensajes de error

497

2. Puede estar pasando un parmetro de un tipo diferente al indicado en la


signatura del mtodo al que est llamando. Por ejemplo, el siguiente cdigo
generar este mensaje de error:
if SelectDirectory(TaxSolver.FileLocation,
[sdAllowCreate, sdPerformCreate, sdPrompt], 0) then

debido a que TaxSolver.FileLocation es una propiedad, y SelectDirectory


espera un parmetro Var como primer argumento.

Solucin rpida
1. Utilice la funcin de conversin correcta:
HollywoodSquare :=
FloatToStr(Sqr(StrToInt(edtNum2Square.Text)));

2. Asigne el valor de la propiedad a una variable de tipo String, y luego pase


la cadena a la funcin:
NewPayrollFileLocation := TaxSolver.FileLocation;
. . .
if SelectDirectory(NewPayrollFileLocation,
[sdAllowCreate, sdPerformCreate, sdPrompt], 0) then

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)));

2. Las propiedades no pueden ser utilizadas como parmetros Var.

This form of method call only allowed for class methods


Posible causa de error
1. Puede haber estado intentando llamar a un mtodo normal utilizando el
tipo de clase en lugar de una instancia (variable) del tipo. Esto es solamente permitido para los mtodos de clase no para mtodos normales.
2. Puede haber olvidado anteponer el tipo de la clase al nombre del mtodo.
3. Puede estar intentando llamar a un mtodo abstracto desde la unidad en la
que ste ha sido declarado.

498

Los Tomos de Delphi: Delphi sin problemas

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;

Lo siguiente compilar bien (anteponiendo el nombre de la clase al nombre


del mtodo):
procedure TForm1.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;

recibir el mensaje de error bajo discusin. Debe hacerlo de esta manera:


AboutBox := TAboutBox.Create(nil);
try
AboutBox.ShowModal;
finally
AboutBox.Free;
end;

3. No llame a mtodos abstractos dentro de la unidad en la que estan


declarados.

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

procedure Rock; virtual; abstract;


procedure Thump; dynamic; abstract;
end;

sus mtodos puede ser redefinidos en una clase descendiente as:


type
TGarryTallent = class(TBassist)
procedure Walk; override;
procedure Rock; override;
procedure Thump; override;
end;

This form of method call only allowed in methods of derived types


Posible causa de error
Este mensaje de error se produce si se intenta hacer una llamada a un mtodo
de un tipo ancestro, pero no se hace desde un mtodo. Puede simplemente
haber olvidado anteponer el nombre del tipo al nombre del mtodo. Por ejemplo, lo siguiente generar este mensaje de error:
procedure KeyPress(var Key: Char);
var
TextLength, i: Integer;
begin
inherited KeyPress;

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

Los Tomos de Delphi: Delphi sin problemas

This package already contains unit named <>


Posible causa de error
Est intentando instalar una unidad dentro de un paquete que ya contiene una
unidad con el mismo nombre.

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).

This type cannot be initialized


Posible causa de error
Puede estar intentando declarar una constante con tipo (variable inicializada)
del tipo File, Text, Textfile o Variant. Por ejemplo, lo siguiente generar este
mensaje de error:
argyle: array[0..1] of variant = ('zig','zag');

El mensaje de error tambin ser generado si en lugar de Variant se hubiera


utilizado Text, File o Textfile.

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

Thread local variables cannot be ABSOLUTE


Posible causa de error
Puede haber aplicado la palabra reservada Absolute a una variable local de un
hilo (Threadvar).

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.

Thread local variables cannot be local to a function


Posible causa de error
Puede haber intentado declarar una variable local de hilo, mediante la palabra
reservada Threadvar, en un mtodo de un objeto TThread o descendiente. Por
ejemplo, lo siguiente generar este mensaje de error:
procedure TFancyThread.Execute;
threadvar
ILostTheThread: Integer;
begin
{ Coloque el cdigo del hilo aqu}
end;

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

Los Tomos de Delphi: Delphi sin problemas

Token not found


Posible causa de error
Puede haber omitido una parte necesaria de una sentencia SQL. Por ejemplo,
puede haber introducido:
FROM
Customer
WHERE
AmountOwed > 0

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

Token not found. Token :dbo. line number:1


Posible causa de error
Puede estar utilizando un componente TQuery con su propiedad RequestLive
asignada a True y no ha encerrado el propietario/nombre de la tabla entre
dobles comillas. Por ejemplo, la sentencia SQL podra ser similar a sta:
SELECT *
FROM dbo.COOPER

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

Too many actual parameters


Posible causa de error
1. Puede haber proporcionado ms parmetros a un procedimiento o funcin
que la cantidad de parmetros con la que ste ha sido declarado.
2. Puede estar intentando pasar ms de 255 parmetros individuales a un
procedimiento o funcin de automatizacin OLE.
3. Puede estar llamando a un procedimiento o funcin del que hay dos versiones, y el compilador piensa que est intentando llamar a una versin
distinta de la que usted tiene en mente.

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.

Too many connections


Posible causa de error
Puede estar utilizando demasiadas conexiones a bases de datos asociando
directamente cada componente TTable, TQuery y TStoredProc a un alias del
BDE a travs de su propiedad DatabaseName.

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

Los Tomos de Delphi: Delphi sin problemas


Name del componente TDatabase a la propiedad DatabaseName de todos los
componentes TTable, TQuery y TStoredProc.

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.

Too many files open


Posible causa de error
1.
2.
3.
4.

Puede
Puede
Puede
Puede

estar intentando escribir en un CD-ROM.


estar olvidando cerrar los archivos despus de abrirlos.
tener un valor muy pequeo en el parmetro Files en CONFIG.SYS.
tener su proyecto en un directorio con un nombre de ruta muy largo.

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;

3. Configure la lnea Files= en CONFIG.SYS a un valor mayor que el actual,


por ejemplo a 100 o an a 255, si es necesario.
4. Mueva su proyecto a una ubicacin que tenga una ruta ms corta, como
C:\MeFeelMe.

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

3. Cuando mueva un proyecto de un directorio a otro, no mueva el archivo


.DSM del proyecto, ya que contiene informacin de directorio (y por lo tanto
apuntar al directorio anterior).

Too many locks on table


Posible causa de error
Puede haber modificado ms de 255 registros de una tabla Paradox durante
una transaccin sobre una base de datos local.

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.

Too many open cursors


Posible causa de error
Puede tener muchas tablas abiertas.

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

Los Tomos de Delphi: Delphi sin problemas


configurado a un valor independiente, distinto del configurado para el BDE.
Consulte la documentacin de su base de datos para ms detalles.

Too many open files


Posible causa de error
1. Puede tener ms archivos abiertos de los que Windows puede manejar.
2. Puede tener ms archivos abiertos que el lmite impuesto por el parmetro
MAXFILEHANDLES del BDE.

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.

Too many parameters


Posible causa de error
1. Puede estar proporcionando a un procedimiento o funcin ms parmetros
de los especificados en su declaracin. Por ejemplo, si llama al procedimiento estndar Release (que no tiene parmetros) y le pasa un parmetro,
recibir este mensaje de error:
Release(MeLetMeGo);

2. Puede estar intentando llamar en una clase descendiente a un mtodo


esttico que tiene el mismo nombre que un mtodo de una clase ancestro,
pero el tipo de la variable es del tipo ancestro (aunque se haya instanciado
el tipo descendiente). Por ejemplo, lo siguiente generar este mensaje de
error, ya que los mtodos estticos son resueltos de acuerdo al tipo de la
variable (TGramps en este caso), y no al tipo de la instancia (que en este
caso es TYoungWhipperSnapper):
type
TGramps = class
procedure NoteOrTriad(note: string);
. . .
TYoungWhipperSnapper = class(TGramps)
procedure NoteOrTriad(note1, note2, note3: string);

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

Los Tomos de Delphi: Delphi sin problemas


IBTrans.StartTransaction;
. . .

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;

Transaction not Assigned


Posible causa de error
Puede tener algunos conjuntos de datos abiertos en tiempo de diseo o que se
han dejado abiertos al salir del programa en una aplicacin de InterBase
Express.

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.

Translate error, value out of bounds


Posible causa de error
1. Puede estar copiando datos de una mquina a otra (por ejemplo, de un
cliente a un servidor) donde los formatos de fecha son diferentes.

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.

Tried to search marked block but it is invalid


Posible causa de error
Puede tener el entorno integrado configurado para buscar en el bloque
marcado (en lugar de ejecutar un bsqueda global), pero no hay un bloque
marcado.

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.

Type <> has no type info


Posible causa de error
Puede estar intentando obtener un puntero a la informacin de tipos para un
tipo que no puede ser utilizado en una propiedad Published y por lo tanto no

510

Los Tomos de Delphi: Delphi sin problemas


tiene informacin de tipos en tiempo de ejecucin asociada a l. Por ejemplo, lo
siguiente generar este mensaje de error:
var
BirdDog: Pointer;
begin
BirdDog := TypeInfo(file);

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.

Type <> is not yet completely defined


Posible causa de error
Puede tener asignada como clase ancestro a la misma clase descendiente en
una seccin Type. Por ejemplo, lo siguiente generar este mensaje de error:
type
TForm3 = class(TForm3)

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.

Type <> must be a class to have a PUBLISHED section


Posible causa de error
Puede haber declarado un objeto utilizando el viejo estilo (Turbo Pascal con
Objetos) y haber intentado proporcionarle una seccin Published. Por ejemplo,
lo siguiente generar este mensaje de error:

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.

Type <> must be a class to have OLE automation


Posible causa de error
Puede haber declarado un objeto utilizando el viejo estilo (Turbo Pascal con
Objetos) y haber intentado proporcionarle una seccin Automated. Por ejemplo,
lo siguiente generar este mensaje de error:
type
TModel = object
Black: TColor;
automated
AssemblyLines: Integer;

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

Los Tomos de Delphi: Delphi sin problemas

Type <> needs finalizationnot allowed in file type


Posible causa de error
Puede estar declarando cadenas largas en un tipo File of Record. Por ejemplo,
lo siguiente generar este mensaje de error:
type
TDateRec = File of record
FlowSnakes, Snirt: Integer;
Bouldershades: String;
end;

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.

Type expected but <> found


Posible causa de error
Puede haber introducido un carcter ilegal en un identificador de tipo. Por
ejemplo, lo siguiente generar este mensaje de error:
type
ShesNotMy = @

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.

Type expected but real constant found


Posible causa de error
Puede haber omitido uno de los dos puntos requeridos en la declaracin de un
tipo array. Por ejemplo, lo siguiente producir el mensaje de error bajo
discusin:
type
gross = array[0.143] of integer;

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

Los Tomos de Delphi: Delphi sin problemas


Puede inicializar todos los valores del array en el evento OnCreate del
formulario as:
procedure TForm1.FormCreate(Sender: TObject);
var
w: word;
begin
for w:=0 to sizeof(gross)-1 do grody[w]:=0;
end;

Type mismatch for field <FieldName>, expecting: <Field type>,


actual: <Field type>
Posible causa de error
Puede estar utilizando un TClientDataSet para almacenar datos, y ha grabado
datos para una columna en particular en un formato (por ejemplo, AsMemo);
luego ha creado un descendiente de TFieldType de otro tipo de datos (como
TStringField), e intentado asignar los datos en el archivo actual al campo del
ClientDataSet.

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.

Type mismatch [in expression]


Posible causa de error
Puede haber intentado ejecutar una operacin de agregacin sobre un campo
no numrico en una sentencia SQL. Por ejemplo, lo siguiente generar este
mensaje de error si el campo State no es numrico:
SELECT AVG(State) FROM CUSTOMER

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.

Type not allowed in OLE Automation call


Posible causa de error
Puede haber utilizado en una llamada de automatizacin OLE un tipo que no
puede ser convertido en un Variant. Por ejemplo, lo siguiente generar esta
excepcin, ya que el argumento aqu es una clase (TThread), y las clases no
pueden ser convertidas a variantes:
procedure TFancyThread.Execute;
var
v: Variant;
begin
v.WontWork(Self);
end;

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.

Type of expression must be BOOLEAN


Posible causa de error
1. Puede haber utilizado en una sentencia condicional If o un bucle While una
expresin que no produce un resultado de tipo Boolean (no puede ser evaluada como True o False). Por ejemplo, lo siguiente generar este mensaje
de error:
if Form1.Name then

2. Algunas veces este mensaje de error es ocasionado por un error de sintaxis


cuando se intenta convertir a otro tipo el parmetro Sender. Por ejemplo, lo
siguiente producir el mensaje de error bajo discusin:
if (Sender as TDBEdit)Tag = 8 then

516

Los Tomos de Delphi: Delphi sin problemas

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

2. En este caso, necesita aadir el operador de alcance . entre la conversin


de tipos Sender As TDBEdit y la propiedad Tag:
if (Sender as TDBEdit).Tag = 8 then

Informacin adicional
Algunos lenguajes y entornos se refieren al tipo Boolean como Logical
(incluyendo Paradox).

Type of expression must be INTEGER


Posible causa de error
Puede haber especificado la longitud de una cadena como algo distinto de un
valor entero. Por ejemplo, lo siguiente generar este mensaje de error:
Wisconsin: String['cheese'];

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.

TYPEINFO standard function expects a type identifier


Posible causa de error
Puede haber intentado llamar a la funcin TypeInfo, pero proporcion un
argumento que no es un tipo. Por ejemplo, lo siguiente generar este mensaje
de error:
var
BirdDog: pointer;
. . .

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.

TYPEOF can only be applied to object types with a VMT


Posible causa de error
Puede haber llamado a TypeOf sobre un objeto que no tiene una Tabla de
Mtodos Virtuales (VMT). Por ejemplo, lo siguiente generar este mensaje de
error:
type
TSimple = class
procedure Einfach;
end;
. . .
var
pWhatYouBe: Pointer;
begin
pWhatYouBe := TypeOf(TSimple);
. . .
end.

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

Los Tomos de Delphi: Delphi sin problemas

Types of actual and formal var parameters must be identical


Posible causa de error
1. Puede estar intentando pasar un parmetro real que difiere en el tipo del
parmetro formal definido para el procedimiento o funcin. Por ejemplo, lo
siguiente generar este mensaje de error:
procedure TForm1.Button1Click(Sender: TObject);
procedure Snowblind(var nish: Variant);
begin
nish := 'nash, I was takin'' a bash';
end;
begin
Snowblind(Query1);
end;

2. Puede estar intentando compilar un proyecto que contiene una llamada a


la API de Windows y estaba originalmente desarrollado utilizando una
versin anterior de Windows. Por ejemplo, puede tener un procedimiento
como ste:
function WinExecAndWait32(FileName: String;
Visibility: Integer; DoWait : Boolean): Integer;

cuyo resultado es pasado as:


Result := WinExecAndWait32('OPECDonuts.txt', 2, True);
GetExitCodeProcess(ProcessInfo.hProcess, Result);

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

Unable to Execute a Query


Posible causa de error
Puede haber llamado a Open o asignado True a la propiedad Active de un
componente TSQLQuery (DBExpress) que no tiene una sentencia SQL
asignada en su propiedad SQL.

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.

Unable to find both a form and a source file


Posible causa de error
Puede haber movido o borrado al archivo .PAS y/o el archivo .DFM de un
proyecto en el Almacn de Objetos.

Solucin rpida
Sustituya los archivos que faltan.

Informacin adicional
Delphi almacena los proyectos del Almacn de Objetos en el directorio
\DelphiX\Objrepos.

Unable to insert a line


Posible causa de error
Puede estar intentando insertar una lnea en una lista de cadenas utilizando
un ndice que todava no contiene un valor. Por ejemplo, si hay solamente tres
lneas en ListBox1 (en los ndices 0, 1 y 2), lo siguiente generar este mensaje
de error:
ListBox1.Items.Insert(3, 'DreiTresTrey');

520

Los Tomos de Delphi: Delphi sin problemas

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.

Unable to load GDS[32].DLL


Posible causa de error
Puede haber intentado arrastrar un componente IBEventAlerter sobre un
formulario, pero la .DLL correspondiente de InterBase no est instalada en su
sistema. Puede haber elegido no instalar InterBase cuando instal 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.

Unable to load RPTSMITH.EXE


Posible causa de error
La seccin [ReportSmith] de DELPHI.INI puede haber sido borrada o no
refleja la ubicacin actual de ReportSmith.

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.

Undeclared Identifier: <>


Posible causa de error
Hay muchas causas posibles a este mensaje de error.
1. Puede haber asignado un valor a una variable que no est declarada en el
mbito del programa (en cuyo caso el error fue causado por la parte
izquierda de la sentencia de asignacin).
2. Puede haber asignado a una propiedad un valor que no es apropiado para
ella (en cuyo caso el error fue causado por la parte izquierda de la sentencia de asignacin genera el error).
3. Puede haber antepuesto el nombre de la clase a un mtodo en la parte
Interface de una unidad (esto es necesario en la parte Implementation,
pero innecesario y no permitido en la parte Interface).
4. Puede haber escrito mal un identificador en el punto de la declaracin o en
el de la implementacin.
5. Puede ser que est refirindose a un objeto, procedimiento, tipo o funcin
que reside en una unidad que no est incluida en la seccin Uses. Por
ejemplo, puede estar llamando la funcin ShowMessage o MessageDlg sin
tener incluida la unidad Dialogs en la seccin Uses, o puede haber hecho
referencia al objeto Clipboard sin haber incluido la unidad Clipbrd en la
seccin Uses.
6. Puede haber alterado el ancestro en la declaracin de tipo del formulario.
Por ejemplo, si cambia el tipo del formulario base de Form a Application,
as:
{ debera ser TForm1 = class(TForm) }
TForm1 = class(TApplication)

obtendr el mensaje de error bajo discusin.


7. Puede estar intentando acceder a un identificador que est declarado en la
seccin Private de otra unidad.
8. Puede estar intentando liberar una instancia de una interfaz mediante una
llamada a Free. Por ejemplo, lo siguiente generar este mensaje de error:
type
ILittleDog = interface(IUnknown)

522

Los Tomos de Delphi: Delphi sin problemas


['{51DDE8C0-CBE2-11D1-9BDB-444553540000}']
function FetchedPaper: Boolean;
function getBarkType: string;
procedure setBarkType(Value: string);
property BarkType: string read getBarkType
write setBarkType;
end;
TPoodle = class(TInterfacedObject, ILittleDog)
FBarkType: string;
function FetchedPaper: Boolean;
function getBarkType: string;
procedure setBarkType(Value: string);
. . .
procedure TForm1.Button1Click(Sender: TObject);
var
Fifi: ILittleDog;
begin
Fifi := TPoodle.Create;
try
. . .
finally
Fifi.Free;
end;
end;

9. Puede haber aadido un punto y coma a la declaracin de un objeto de


interfaz, as:
type
TClassThatImplementsAnInterface =
class(TGr8OoglyMoogly, IChihuahua);

10. Puede estar haciendo una referencia a un valor Resourcestring situado en


la seccin Implementation de otra unidad, por ejemplo:
unit NGCDialogMessages;
interface
implementation
const
AppName = 'NGC';
resourcestring
SEntriesMustMatch = 'New password entries did not match;
SEntriesDoNotMatch =
'New password entries do not match. Please try again.';
SAppWillClose_LogOnWithNewPassword =
AppName + ' will now close. Execute ' +
AppName + ' again to log on with the new password.';

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
. . .

13. Puede estar llamando a un mtodo de clase en una seccin Initialization o


Finalization.

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

Los Tomos de Delphi: Delphi sin problemas


9. Borre el punto y coma.
10. Mueva los elementos Resourcestring a la seccin Interface, as:
unit NGCDialogMessages;
interface
const
AppName = 'NGC';
resourcestring
SEntriesMustMatch = 'New password entries did not match;
SEntriesDoNotMatch =
'New password entries do not match. Please try again.';
SAppWillClose_LogOnWithNewPassword =
AppName + ' will now close. Execute ' +
AppName + ' again to log on with the new password.';
implementation

11. Borre la asignacin a Result, o cambie el procedimiento a una funcin (no


olvide aadir un tipo de resultado, por ejemplo Boolean).
12. Aada la unidad en la que est definido el tipo Set o enumerado a la clusula Uses:
implementation
uses
SysUtils,
fmOKOpts,
nvcmod,
AbArcTyp, // necesaria para utilizar soStripPath
fmDCmprs,
fmZipstr
FileCtrl; // necesaria para hacer referencia al tipo
// TFileAttr (ftArchive, etc.)

13. Convierta el mtodo en un procedimiento o funcin, o mueva el cdigo a la


seccin Initialization o Finalization.

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

En Delphi 6, CurrToBCD y BCDToCurr han sido movidos de DB.PAS a la


nueva unidad FMTBCD.PAS. Cuando porte una aplicacin de una versin
anterior de Delphi a Delphi 6 o superior, puede necesitar aadir FMTBCD
a la clusula Uses (preferiblemente a la clusula Uses de la seccin Implementation) si recibe este mensaje de error debido a una llamada a una de
aquellas funciones que no puede ser resuelta.
Puede acceder a los mtodos y propiedades Public y Published de otra clase
siempre y cuando est utilizando la unidad en la que esa clase est
declarada. Puede tener tambin acceso a la seccin Protected si est
creando una clase descendiente de la clase en cuestin. Sin embargo, nunca
tendr acceso a una seccin Private en otra unidad.
Las instancias de interfaces son liberadas automticamente en las
siguientes situaciones:
La variable de interfaz sale de mbito.
Usted asigna a la variable de interfaz un objeto de una interfaz
diferente.
Usted asigna Nil a la variable de interfaz.
Consulte <> is not a valid component name.
El compilador no espera un punto y coma hasta el final de la declaracin
de la primera clase.
Un control puede tener una propiedad de tipo conjunto cuyos posibles valores estn definidos en otra unidad, en la que se implementa una clase
situada ms arriba en el rbol de herencia. Por ejemplo, en el ejemplo, en
el que se accede a la propiedad FileType de TFileListBox, el tipo conjunto y
su tipo enumerado asociado estn definidos en la unidad FileCtrl:
type
TFileAttr = (ftReadOnly, ftHidden, ftSystem, ftVolumeID,
ftDirectory, ftArchive, ftNormal);
TFileType = set of TFileAttr;

Undeclared Identifier: 'EmptyParam'


Posible causa de error
Puede haber olvidado aadir Variants a la clusula Uses.

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

Los Tomos de Delphi: Delphi sin problemas

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).

Undeclared Identifier: 'Result'


Posible causa de error
Puede haber deshabilitado la sintaxis extendida y ha hecho una asignacin a
la variable local Result que est declarada implcitamente en las funciones.

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.

Undeclared Identifier: 'Unassigned'


Consulte Undeclared Identifier: EmptyParam.

Undeclared Identifier: 'VarToStr'


Consulte Undeclared Identifier: EmptyParam.

Unexpected end of command


Posible causa de error
Puede no haber escrito parte de una sentencia SQL; por ejemplo, en la
siguiente sentencia SQL no se especifica la columna que va a ser utilizada
como clave primaria:
ALTER TABLE Placemats
ADD CONSTRAINT pkSlogan PRIMARY KEY

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.

Unit <> was compiled with a different version of <>


Posible causa de error
1. Puede haber asignado a una unidad el mismo nombre que una unidad que
ya existe en la ruta de bsqueda de las bibliotecas de Delphi.
2. Usted (o el autor de la unidad en cuestin) puede haber cambiado la
declaracin de un smbolo en la parte Interface de una unidad, y otra
unidad que haca referencia a esta unidad (modificada) en su clusula Uses
no puede ser recompilada debido a que el archivo fuente (.PAS) no est
disponible.

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

Los Tomos de Delphi: Delphi sin problemas


riesgo. Los cambios tienden a afectar imperceptiblemente a otras cosas
aparentemente no relacionadas.

Unit File Format Error


Posible causa de error
Puede haber abierto un proyecto en una versin de Delphi anterior a la ltima
con la que lo compil.

Solucin rpida
Borre los archivos .DCU y recompile.

Informacin adicional
El mensaje de error puede mostrar una lnea del archivo de proyecto (.DPR).

Unit name mismatch: <>


Posible causa de error
Puede haber alterado manualmente el nombre de una unidad sin actualizar las
referencias a ella en otras unidades.

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.

Unit version mismatch: <>


Posible causa de error
1. Puede haber dado a una unidad un nombre que ya existe en la VCL o RTL,
como Buttons, SysUtils, etc.

Mensajes de error

529

2. Puede haber alterado el cdigo fuente de la VCL.

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

Los Tomos de Delphi: Delphi sin problemas


2. Proporcione un valor para la propiedad AliasName antes de asignar True a
la propiedad Connected.
3. Asegrese de que la clave del Registro del sistema que apunta a la
ubicacin de IDAPI32.CFG se corresponda con la ubicacin actual del
archivo.

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

Si no tiene un archivo IDAPI32.CFG en el sistema, cpielo a la ubicacin apropiada del CD de Delphi.


Si va a distribuir una aplicacin de base de datos en otras mquinas, deber
asegurarse de que las mquinas de destino tengan configurados los alias que
vaya a utilizar para acceder a bases de datos. Puede hacer esto tanto con
InstallShield como mediante cdigo. Consulte AddAlias en la ayuda de
Delphi para ver un ejemplo de cmo crear un alias en el cdigo. Consulte la
documentacin de InstallShield para instrucciones sobre cmo proporcionar un
alias durante la instalacin.
Si est utilizando una ruta (en lugar de un alias), un mtodo que puede
utilizar para garantizar que la base de datos siempre ser encontrada es seguir
uno de estos pasos:
Indicar a los usuarios que mantengan todos los archivos en el mismo
directorio que la aplicacin.
-O Asignar /. a la propiedad DatabaseName.

Unknown directive: <>


Posible causa de error
1. Puede estar utilizando una sintaxis incorrecta en una declaracin de
procedimiento o funcin. El problema puede ser simplemente algo mal
escrito, o la falta de un punto y coma.
2. Puede estar intentando declarar un mtodo como Virtual, Dynamic,
Abstract u Overload fuera de la declaracin de una clase.
3. Puede estar intentando interceptar un mensaje de Windows, pero olvid
colocar un punto y coma antes de la directiva Message. Esta no es reconocida por el compilador, que espera un punto y coma.
Por ejemplo, esto ocasionar el error:
procedure wmcommand(var Message: TMessage) message WM_COMMAND;

4. Puede haber aadido la directiva Stored a un procedimiento en una seccin


Private, Protected o Public de una clase. Por ejemplo, lo siguiente generar
el mensaje de error bajo discusin
procedure Setuuuu(b: string) stored;

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

Los Tomos de Delphi: Delphi sin problemas


3. Cuando intercepte mensajes de Windows, recuerde incluir el punto y coma
antes de la directiva Message.
procedure wmcommand(var Message: TMessage); message WM_COMMAND;

4. No utilice la directiva Stored en una seccin Private, Protected o Public de


una clase.

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;

y luego escriba un mensaje en un archivo de texto cada vez que Windows


enve este mensaje a su aplicacin:
var {Esto est en la seccin Interface}
TForm1: TForm;
tf: TextFile;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
AssignFile(tF,'trakmsgs.txt');
if FileExists('trakmsgs.txt') then
Append(tF)
else
Rewrite(tF);
WriteLn(tF, DateTimeToStr(Now));
end;
...
procedure TForm1.wmactivate(var Message: TMessage);
begin
{Hereder la respuesta de Delphi al mensaje}
inherited;
Writeln(tf,'Se ha recibido el mensaje WM_Activate');
end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseFile(tF);
end;

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;

Unknown directive (already exists)


Posible causa de error
Puede haber aadido la directiva Override a un mtodo redefinido en la seccin
Implementation.

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

Los Tomos de Delphi: Delphi sin problemas

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.

Unknown picture file extension: <>


Posible causa de error
1. Puede estar intentando cargar un archivo con una extensin distinta a
.BMP, .ICO, .EMF o .WMF en la propiedad Picture de un objeto TImage.
Por ejemplo, la siguiente lnea producir el mensaje de error bajo
discusin:
Image1.Picture.LoadFromFile('Sunflowers.txt');

2. Puede haber omitido la extensin del archivo al hacer referencia al archivo.

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');

Unknown SQL Error


Posible causa de error
Puede estar accediendo a una base de datos de servidor SQL y ha aadido o
borrado una columna o ndice, o modificado una descripcin de campo nulo o no
nulo mientras el parmetro del BDE ENABLE SCHEMA CACHE tena asignado True.

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.

Unknown user name or password


Posible causa de error
Puede haber introducido una contrasea invlida en el cuadro de dilogo de
conexin a base de datos (Database Login) despus de lo siguiente:
a. Intent asignar True a la propiedad Connected de un componente
TDatabase, en tiempo de diseo o en tiempo de ejecucin (en el cdigo).
b. Llam al mtodo Open de un componente TDatabase o TTable.
c. Intent asignar True a la propiedad Active de un objeto TTable, en
tiempo de diseo o en tiempo de ejecucin (en el cdigo).

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

Los Tomos de Delphi: Delphi sin problemas


Session.AddPassword('Kennwort');

Para asignar la contrasea utilizando la seccin Parameter Overrides del


componente TDatabase, siga estos pasos:
1. Haga doble clic sobre el componente TDatabase.
2. Verifique que se muestren el nombre y alias correctos.
3. Quite la seleccin de la casilla de verificacin Login Prompt.
4. Pulse el botn Defaults.
5. Aada la contrasea a la lnea Password= en el cuadro de lista Parameter
Overrides.
Alternativamente, puede proporcionar un gestor de eventos para el evento
OnLogin.

Unnamed arguments must precede named arguments in OLE


Automation call
Posible causa de error
Puede haber nombrado un argumento en una llamada OLE, y luego haber
escrito un valor para un argumento sin nombre. Por ejemplo, el siguiente
cdigo generar este mensaje de error si se intenta activar la base de datos:
procedure BackwardsCoding;
var
v: Variant;
begin
v.Tail(Bonanza := 'Cartwrights', 'Beech');

Solucin rpida
Elimine el argumento con nombre:
procedure BackwardsCoding;
var
v: Variant;
begin
v.Tail('Cartwrights', 'Beech');

O nombre tambin el argumento que le sigue:


procedure BackwardsCoding;
var
v: Variant;
begin
v.Tail(Bonanza := 'Cartwrights', HarrietStower := 'Beech');

O invierta el orden de los argumentos:


procedure BackwardsCoding;

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.

Unrecognized database parameter block


Posible causa de error
Puede haber aadido una sentencia invlida a la propiedad Params de un
componente IBDatabase. Por ejemplo, la siguiente entrada generar este
mensaje de error si intenta activar la base de datos:
username=SYSDBA
password=masterkey

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.

Unsatisfied forward or external declaration: <>


Posible causa de error
1. Este mensaje de error aparece cuando tiene una declaracin adelantada o
externa de un procedimiento o funcin, o una declaracin de un mtodo en
una clase o tipo de objeto, y no define el mtodo, procedimiento o funcin
en algn lugar. De hecho, puede ser que la definicin haya sido omitida o

538

Los Tomos de Delphi: Delphi sin problemas


quizs simplemente su nombre est mal escrito. Note que una declaracin
de procedimiento o funcin en la parte Interface de una unidad es equivalente a una declaracin adelantada usted deber proporcionar su
implementacin en la parte Implementation. De forma similar, la declaracin de un mtodo en una clase o tipo de objeto es equivalente a una
declaracin adelantada. Puede necesitar anteponer el nombre de la clase al
procedimiento. Por ejemplo, si ha declarado en la parte Interface un
mtodo llamado PlayBaseball, su definicin en la parte Implementation
debe ser la siguiente (asumiendo que la clase es TForm1):
TForm1.PlayBaseball;

2. Puede haber olvidado aadir la palabra reservada External a la


declaracin formal de un procedimiento (o funcin) situado en una .DLL.

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.

Unsupported 16bit resource


Posible causa de error
Puede estar intentando instalar en Delphi de 32 bits un componente que tiene
asociado un archivo .DCR (recurso de icono de mapa de bits) que fue creado con
una herramienta de 16 bits (como el Image Editor de Delphi 1).

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?';

USES clause is missing or incorrect


Posible causa de error
Puede tener un error de sintaxis en la clusula Uses de la parte Interface.

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).

Validation error for column <Column Name>, value <***Null***>


Posible causa de error
Puede haber intentado insertar una fila en una tabla sin proporcionar un valor
para una columna no nula de esa tabla. Por ejemplo, puede tener un cdigo

540

Los Tomos de Delphi: Delphi sin problemas


similar al siguiente para insertar en una tabla que tiene una columna llamada
TAX_CODE definida como NOT NULL :
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').Adate := APayrollDate;
Params.ParamByName('LiabilityAmount').AsCurrency :=
ALiabilityAmount;
Params.ParamByName('DueDate').Adate := dDueDate;
. . .

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

Variable <> inaccessible here due to optimization


Posible causa de error
El valor de la variable o propiedad que est intentando ver o examinar ha sido
optimizado en este punto de la vida del programa.

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.

Variable name expected


Posible causa de error
Puede haber intentado utilizar una direccin absoluta al declarar una variable
en una versin de Delphi (Delphi 6 y superiores) que incluye la Biblioteca de
Componentes de Borland (conocida como CLX, que significa Component
Library X-Platform o Class Library X-Platform). Por ejemplo, lo siguiente
generar este mensaje de error:
var
x: Integer absolute $1234;

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

Los Tomos de Delphi: Delphi sin problemas

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.

Variant does not reference an automation object


Posible causa de error
Puede haber olvidado crear un objeto OLE antes de acceder a la variable de
tipo Variant utilizada para hacer referencia a l. Por ejemplo, lo siguiente
generar este mensaje de error:
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;

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.

Variant does not reference an OLE object


Posible causa de error
Puede haber intentado acceder a un objeto OLE asignado a una variable de
tipo Variant que no ha sido registrado en su sistema.

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

Los Tomos de Delphi: Delphi sin problemas

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.

Variant is not an array


Posible causa de error
Puede haber intentado acceder a un elemento de una variable de tipo Variant,
como si fuera una cadena. Por ejemplo, puede haber intentado algo as:
var
CoderCandy: Variant;
begin
CoderCandy := 'Melts In Your Mug, Not In Your Mitt';
{La siguiente lnea generar el error}
Label1.Caption := CoderCandy[1] + '&' + CoderCandy[1];
{Lo mismo esta lnea}
CoderCandy[4] := 'u';
end;

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

Vendor initialization failure: ORA[NT]7[1,2,3].DLL


Posible causa de error
El BDE podra no estar encontrando la .DLL de Oracle que se ha especificado
en el parmetro Vendor Init de la utilidad de Administracin/Configuracin del
BDE.

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.

Windows socket error: <> on API <>


Posible causa de error
1. Si el primer parmetro de este mensaje de error es 10014, 10022 10049,
puede que est utilizando Delphi 4 Update Pack 2.
2. Si el primer parmetro en este mensaje de error es 10049, puede haber
intentado asignar True a la propiedad Active de un componente
TClientSocket mientras el valor de su propiedad Address contena un valor
errneo.

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

Los Tomos de Delphi: Delphi sin problemas

Windows Socket Error: (10060), on API connect


Posible causa de error
Puede haber intentado asignar True a la propiedad Connected de un objeto
TRemoteServer mientras la propiedad ConnectType tena asignado el valor
ctSockets, pero el servidor de aplicacin no ha sido configurado.

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.

Write error on <>


Posible causa de error
El disco en el que el compilador est intentando grabar un archivo puede estar
lleno.

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.

You cannot add a <> to the current project because it is not an


ActiveX library. Click OK to start a new ActiveX library project
Posible causa de error
Puede haber seleccionado File | New... | ActiveX | ActiveForm o ActiveX
Control mientras estaba abierto un proyecto convencional (no ActiveX).

Mensajes de error

547

Si est utilizando Delphi 4, puede haber seleccionado File | New... | ActiveX


| MTS Automation object mientras estaba abierto un proyecto convencional
(no ActiveX).

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.

You cannot specify a size for a field of this type


Posible causa de error
Puede estar intentando cambiar el tipo de datos de un campo en el Database
Desktop, por ejemplo de A (Alpha) a N (Number), pero el valor anterior del
tamao (Size) est todava especificado, y no es aplicable al tipo de datos al
que se desea cambiar el campo.

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

Los Tomos de Delphi: Delphi sin problemas

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.

You must select a VCL class


Posible causa de error
Puede estar intentando crear un control ActiveX utilizando el Asistente de
Controles ActiveX, pero no ha proporcionado la clase VCL en la que se basa el
control ActiveX en el cuadro de combinacin VCL Class Name.

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.

Your application is not enabled for use with this driver


Posible causa de error
1. Puede estar intentando utilizar SQL Links con una versin de Delphi que
no es la Cliente/Servidor (Enterprise).
2. Puede estar intentando utilizar un controlador ODBC con una versin de
Delphi estndar o de evaluacin.
3. Puede que originalmente tuviera una versin inferior de Delphi en su sistema, y luego instal Delphi Cliente/Servidor sin desinstalar antes la
versin previa.

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

3. Desinstale la versin anterior de Delphi, y luego instale Delphi


Cliente/Servidor.

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

Los Tomos de Delphi: Delphi sin problemas

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

C++ Builder, 89 ,541


C0000006, 241
C0000008, 242
C0000012, 242
C3254, 324
CachedUpdates, 58
Campos
calculado, 252
calculados, 258
obligatorios, 251
capacity, 359
case, 124 ,193
CGI, 415
Chr , 276
Citrix Winframe, 496
clases abstractas, 149
class , 497
Close, 115

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

Database Desktop, 287


DatabaseName, 115 ,168 ,194 ,384 ,504 ,529
DateTime, 451
Datos
de Automatizacin, 341
del Registro, 243
en Paradox, 298
dBASE, 167 ,337 ,338 ,494 ,509
DBClient.DLL, 415 ,416
DBCLIENT.DLL, 98
DBExpress, 38 ,110 ,142 ,395 ,400 ,413 ,519
DCOM, 173 ,393
Dec, 359
Default, 179 ,255

DefaultExpression, 251 ,434


DefineProperties, 343
Delete, 114
DeleteTable, 115
Delphi 3, 422
Delphi 4, 419 ,431
Delphi 5, 75
Delphi 6, 26 ,27 ,33 ,75 ,93 ,111 ,113 ,140 ,143
,289 ,326 ,346 ,381 ,395 ,409 ,412 ,427 ,431
,437 ,490 ,494 ,519 ,524
Delphi/400, 243
destructores, 150
dfBinary, 113 ,381
dfXML, 113 ,381
dfXMLUTF8, 381
DisableControls, 283
dispid, 190 ,425
dispinterface, 33
Dispose, 191
DLLPATH, 100 ,103
duplicados
nombres, 196 ,198 ,258
propiedades, 199 ,200
recursos, 197
valores, 196 ,199

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

General Protection Fault GPF, 45


GetLastError, 59 ,457
GetMem, 49 ,284 ,342
GetProcAddress, 230 ,240
GExperts, 233
GoTo, 282 ,354
grfico, API, xxxiv
grficos, formatos, 63
GROUP BY, 256 ,283 ,348
GUID, 34

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

overload, 299 ,374 ,411 ,412 ,424 ,435


override, 109 ,149 ,372 ,375 ,444 ,533

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

Query Builder, 163


QuickReports, 232 ,521

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

TableName, 9 ,115 ,252 ,308 ,384


TableType, 116
TADOConnection, 22
TBatchMove, 183 ,184 ,298

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

XML, 113 ,380 ,514

También podría gustarte