Вы находитесь на странице: 1из 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 . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

xvi

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

xviii

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

xx

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

xxii

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

45

Para ms informacin sobre las diferencias y las ventajas/desventajas de utilizar mtodos estticos, virtuales y dinmicos en diferentes circunstancias, consulte dispatching methods en la ayuda de Delphi.

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
GetMem(ptrBuf, RightSize); FillChar(ptrBuf, RightSize, 0);

49

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 Alpha Autoincrement BCD Binary Byte Date Formatted Memo Graphic Logical Long Integer Memo Money Number OLE Short Time Timestamp Descendiente TField de Delphi TStringField TAutoIncField TBCDField TBlobField TBytesField TDateField TBlobField TGraphicField TBooleanField TIntegerField TMemoField TCurrencyField TFloatField TBlobField TSmallIntField TTimeField 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
FormStyle := fsStayOnTop; end;

81

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
Liszt.Free; end; end;

87

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

89

Navegar 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

99

2.

3.

4. 5.

6.

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
begin CheckInactive; ValidateName(Value); FDatabaseName := Value; end; end;

119

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
2: TakeAFriend; 3: ThreesCompany; else ; end;

125

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
TForm1 = class(TForm) private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation

127

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
with Self.Create(nil) do try ShowModal; finally Free; end; end;

133

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
else MessageDlg(SErrorInStudentsDblClick, mtInformation, [mbOK], 0); end; end; end;

135

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
procedure BigShovel(const Immutable: string); begin GiveMeAPointer(Immutable); end; procedure RoyalMountainKingMineOrangeMonster; begin BigShovel('Hitachi'); end;

145

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 Por ltimo, tambin puede utilizar:


f: Textfile;

147

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 254 64 255 255 512 1024 300 255 255 2.000 2.000 10.800 32.750 127 16 255 256 100 15 63 159 63 Tablas abiertas por el sistema Tablas abiertas por el sistema (BDE 4.01 y posteriores) Bloqueos de registros en una tabla (16 bits) por sesin Bloqueos de registros en una tabla (32 bits) por sesin Registros en transaccin sobre una tabla (32 bits) Archivos fsicos abiertos (DB, PX, MB, X??, Y??, VAL, TV) Archivos fsicos abiertos (BDE 4.01 y posteriores) Usuarios en un archivo de red PDOXUSRS.NET Nmero de campos por tabla Tamao de los campos de caracteres Millones de registros en una tabla Millones de bytes en un archivo .DB (tabla) Bytes por registro para tablas indizadas Bytes por registro para tablas no indizadas Nmero de ndices secundarios por tabla Nmero de campos en un ndice Usuarios concurrentes por tabla Megabytes de datos por campo BLOb Contraseas por sesin Longitud mxima de contrasea Contraseas por tabla Campos con chequeos de validacin (32 bits) 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
. . . 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;

183

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

e.

Informacin adicional
1. Reduzca el tamao de las clusulas Uses, eliminando de ellas cualquier unidad que no sea necesaria. 3. El archivo de recursos del proyecto, que es creado automticamente por Delphi, no se debe modificar. Consulte EResNotFound. Si todo lo anterior falla, intente borrar todos los archivos *.DSM, *.DOF y *.DSK. Consulte Error Creating Form: Duplicate resource [Type:,Name:].

Mensajes de error

199

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
Image1.Picture.LoadFromFile('Kangaroo.jpg'); Image1.Picture.LoadFromFile('ChoosyMothersChooseSkippyNot.gif');

207

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
procedure SetStringLength(s: String; ANumber: Integer); begin SetLength(s, ANumber); end;

209

Informacin adicional
El tipo de cadena nativo en Delphi de 32 bits no almacena la longitud de la cadena en el elemento 0, como es el caso en Turbo Pascal y Delphi 1. Esta es la razn por la cual intentar obtener o asignar la longitud de la cadena a travs del elemento 0 no funciona y no est permitido. S puede asignar cualquier elemento vlido de una cadena (con ndice distinto de 0) a otra cadena, por ejemplo:
var s,t: string; begin s := 'Are you just stringing me along?'; t := s[1]; end;

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

217

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.

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

2. 3. 4. 5.

6. 7. 8.

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 -q Para eliminar del Registro un servidor o biblioteca de tipos. 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
+#13#10+ ' en el cuadro de edicin Divisor); Edit2.SetFocus; end; end;

239

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
function BashBrutus(fLock: BOOL): HResult; stdcall; end;

255

Solucin rpida
Elimine el campo de la declaracin de interfaz. Las interfaces no almacenan valores, y por lo tanto no pueden contener campos.

Informacin adicional
En lo que a m respecta, IUnknown es un nombre un poco ridculo para la interfaz base. Lo siguiente, extrado del archivo SYSTEM.PAS de Delphi, es mucho ms significativo:
IInterface = IUnknown;

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
var tex: TextFile; begin Rewrite(tex); Writeln(tex, 'I think I forgot something'); CloseFile(tex); end;

265

Solucin rpida
Tenga presente llamar siempre a AssignFile antes de intentar utilizar Rewrite, Reset, Append, Rename o Erase sobre un archivo:
var tex: TextFile; begin AssignFile(tex, 'McMurtry.txt'); try Rewrite(tex); Writeln(tex, 'Lonesome Dove'); . . . finally CloseFile(tex); end; end;

Informacin adicional
Este es el error de Entrada/Salida nmero 102.

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

7. 8.

Mensajes de error

267

Informacin adicional
1. En este caso, Delphi buscar un archivo con el nombre que aparece en la seccin Uses con una extensin .DCU. Si desea abrir un archivo para escritura utilizando el procedimiento Append, es recomendable prepararse para la no existencia del archivo en el momento de la llamada mediante programacin defensiva. Por ejemplo, podra utilizar un cdigo similar al siguiente para evitar errores ocasionados por archivos inexistentes:
procedure TForm1.btnWriteToTextFileClick(Sender: TObject); var tF: TextFile; begin AssignFile(tF, 'sexyexe.txt'); if FileExists(ChangeFileExt(Paramstr(0),'.txt')) then Append(tF) else Rewrite(tF); WriteLn(tF, DateTimeToStr(Now)); CloseFile(tF); end;

8. Los archivos de bibliotecas de tipos pueden tener las siguientes extensiones: OLB, TLB, OCX, DLL y EXE.

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
Printer.Canvas.Font.Size := 16; Printer.Canvas.Font.Style := [fsBold]; Writeln(PrintText,'Dont leave me, oh my darling'); Writeln; // Esto genera el error

269

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
var Date: TDateRec; begin for Date.Year := 1984 to 2001 do Orwellian(Superman);

275

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
s := 'esszet'; i := High(s);

285

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
type TSeriousSubrange = 32..255; type TSuaveSubrange = 32..((32 * 8) -1);

291

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
published property EmUpJoe: Boolean read FEmUpJoe write SetEmUpJoe; end;

301

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
procedure TForm1.Button2Click(Sender: TObject); begin Button1.OnClick := HandCodedMethod; end;

303

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 Alpha Autoincrement BCD Binary Byte Date Formatted Memo Graphic Logical Descendiente TField de Delphi TStringField TAutoIncField TBCDField TBlobField TBytesField TDateField TBlobField TGraphicField TBooleanField

304

Los Tomos de Delphi: Delphi sin problemas

Long Integer Memo Money Number OLE Short Time Timestamp

TIntegerField TMemoField TCurrencyField TFloatField TBlobField TSmallIntField TTimeField 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
procedure LowerCase;

305

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
where SCRIPT_TYPE = :SCRIPT_TYPE

307

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

311

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. Pulse el botn Define. Aparecer el cuadro de dilogo Define Secondary Index. Seleccione el ndice que se desea convertir en mantenido.

313

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 -Oinsert into "MACABRE.DB" (OttoIncrease, DrOctopus, EightHead) values (:SomeNum, :Villain, :DistinguishingFeature)

315

Solucin rpida
No intentente editar (mediante Update) o asignar (mediante Insert) valores a campos de tipo Autoincrement.

Informacin adicional
Los campos Autoincrement son de slo lectura, y por lo tanto no pueden ser editados. Un campo Autoincrement, por su propia naturaleza, no debera ser editado manualmente. Al ser incrementado automticamente, cada valor ser nico. Si pudiera cambiarse manualmente el valor, al final podran obtenerse varios valores idnticos, lo que resultara en una violacin de clave. Por esta razn, los campos Autoincrement son de slo lectura. Puede especificar el valor inicial para los campos Autoincrement utilizando la propiedad Minimum en el Database Desktop. En caso contrario, el valor siempre comenzar a partir de 1 y se incrementar en 1 para cada registro. Los campos Autoincrement son muy parecidos a los nmeros de los cheques que usted recibe de su institucin financiera.

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
WHERE Director = 'Sayles' OR 'Morris'

333

2. Puede no haber especificado la sentencia SQL de la forma precisa (sintcticamente) en la que Delphi espera verla. Por ejemplo, la siguiente sentencia puede generar este mensaje de error:
SELECT * FROM Customers WHERE State = 'ID'

Solucin rpida
1. Compruebe que solamente intenta acceder a campos que existen realmente en la base de datos. 2. Puede necesitar poner el nombre de la tabla en maysculas y encerrar el nombre del campo entre comillas dobles. Dada la sentencia SQL de arriba, puede tener que modificarla as:
SELECT * FROM CUSTOMERS WHERE CUSTOMERS."State = 'ID'

Informacin adicional
Si est conectndose a una base de datos de servidor SQL, familiarcese con la sintaxis SQL particular del servidor que est utilizando, as como con las caractersticas que soporta (que cambian de un fabricante a otro).

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

343

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

349

Solucin rpida
1. Inserte la clusula FROM junto con el nombre de la(s) tabla(s) de la(s) que desea seleccionar registros. No puede utilizar parmetros (con la sintaxis :<parmetro>) en la parte SELECT o FROM de una sentencia SQL. Vea Informacin adicional ms abajo para ms informacin sobre cmo permitir que el usuario seleccione las tablas y/o campos en tiempo de ejecucin utilizando la funcin Format. 2. Proporcione al menos un nombre de columna a continuacin de la palabra reservada SELECT, y al menos un nombre de tabla despus de FROM. 3. Si utiliza una sentencia GROUP BY, proporcione al menos una funcin de agregacin en la clusula SELECT, y agrupe por todas las columnas no agregadas que especific en la clusula SELECT. Por ejemplo:
SELECT Fruit, Vegetable, Spice, Count(Dessert) FROM Speisekarte WHERE Calories > 1000 GROUP BY Fruit, Vegetable, Spice

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
Shell: { ... } end;

357

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 7. Aada la funcin de conversin AsX al nombre de campo:


with nvcmod.cds do begin FieldByName('ID').AsString := edtAddFName.Text;

359

Informacin adicional
4. Inc y Dec tienen un segundo parmetro opcional, que especifica en cunto incrementar o decrementar la variable que est siendo manipulada. Para ms informacin, consulte assignment statements en la ayuda de Delphi. 6. Para ms informacin, consulte Invalid variable reference.

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
for i := 0 to Items.Count-1 do if Items[i]='' then Items.Delete(i); end; end;

361

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

369

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
public constructor Create(AOwner: TComponent); override;

373

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
constructor Create(AOwner: TComponent); overload; override; constructor Create(AOwner: TComponent; i:integer); overload;

375

Informacin adicional
Note que no es vlido aadir la directiva Override a ms de uno de los mtodos sobrecargados, ya que el mtodo redefinido puede solamente compartir una lista de parmetros idnticos con slo uno de los mtodos sobrecargados que se declaren. Si se hubiera aadido la directiva Override a ambos mtodos, se obtendra el mensaje de error Declaration of <> differs from previous declaration.

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
type IDelawareIgnoresSourPatch = dispinterface ['{00000000-0000-0000-0000-000000000000}'] procedure RoverDover; register; end;

377

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

393

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
end; with IndexDefs.AddIndexDef do begin Fields := 'CaptainHumboldtEpisode'; Name := 'CaptainHumboldtEpisodeIndex'; end; CreateDataSet; end;

397

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

409

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
type iptr = ^Integer; var i,j: integer; p: pointer; q: iptr; begin p := @i; q := p; q^ := j; i := q^; end;

419

-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
published property ElCamino: Single read FElCamino write SetElCamino;

447

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
property SomeInterface: ISomeInterface implements ISomeInterface;

451

Solucin rpida
Aada un especificador Read junto con el campo o funcin correspondiente a la declaracin, as:
FSomeInterface: ISomeInterface; property SomeInterface: ISomeInterface read FSomeInterface implements ISomeInterface;

Informacin adicional
Consulte Implements getter must be register calling convention en este libro, e Implementing Interfaces by delegation en la ayuda de Delphi (4 o superior) para ms informacin.

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
if ReportObj.ProgramMode = pmBatch then begin ReportObj.WriteToLogFile( SReportName, SDelphiErrorMessage+E.Message, SWindowsErrorCode+IntToStr(GetLastError), DateToStr(Now), TimeToStr(Now)); Abort; end else raise;

457

Solucin rpida
1. Solamente relance las excepciones dentro de un bloque de excepcin. 2. Sustituya la palabra reservada Raise por una llamada al mtodo ShowException del objeto Application, pasndole el objeto E de tipo Exception, as:
if ReportObj.ProgramMode = pmBatch then begin ReportObj.WriteToLogFile( SReportName, SDelphiErrorMessage+E.Message, SWindowsErrorCode+IntToStr(GetLastError), DateToStr(Now), TimeToStr(Now)); Abort; end else Application.ShowException(E);

Informacin adicional
El gestor OnException sustituto debe tener la siguiente signatura:
procedure FilterExceptions(Sender: TObject; E: Exception);

Los bloques Try. . . Except tienden a ser sobreutilizados por muchos desarrolladores. Una regla general emprica es que los bloques Try. . . Finally deberan exceder en nmero a los bloques Try. . . Except en una razn de 10:1. Delphi manejar las excepciones que no maneje usted especficamente a travs de su propio mecanismo de deteccin y gestin de errores. Si no se hace un manejo anterior, el gestor de excepciones por defecto de Delphi gestionar las excepciones que lleguen a ese punto. Sin embargo, no liberar los recursos por s mismo eso es responsabilidad del desarrollador.

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
ExecSQL; finally Free; end; end;

473

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 2 KB 4 KB 8 KB 16 KB 32 KB Tamao mximo de tabla 128 MB 256 MB 512 MB 1.024 MB 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
AddIndex('DogfaceIndex', 'Name;Rank;SerialNumber', [ixPrimary]);

481

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
public { Declaraciones Public } end; var Form1: TForm1; implementation {$R *.DFM} end.

485

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
procedure Rock; virtual; abstract; procedure Thump; dynamic; abstract; end;

499

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
. . . var Gitfiddle: TGramps; begin Gitfiddle:= TYoungWhipperSnapper.Create; Gitfiddle.NoteOrTriad(1, 2, 3)

507

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
BirdDog := TypeInfo('yowza-bop');

517

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
if IncludeArchiveFiles then frmZipster.lstbxROFiles.FileType := frmZipster.lstbxROFiles.FileType + [ftArchive] // problema else . . .

523

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

525

7.

8.

9. 12.

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 2. Puede haber alterado el cdigo fuente de la VCL.

529

Solucin rpida
1. Utilice nombres nicos para sus unidades; trate de establecer un convenio de nombres que garantice la unicidad, como anteponer o aadir sus iniciales, las iniciales de la compaa, etc. 2. No modifique el cdigo fuente de la VCL a menos que tenga una muy buena razn para hacerlo, y est dispuesto a proporcionar su propio soporte tcnico a partir de ese momento.

Informacin adicional
1. El compilador no le impedir que nombre a su unidad de la misma forma que una ya existente, por ejemplo, Buttons. 2. El cdigo fuente de la VCL est destinado principalmente para referencia; no es recomendable modificarlo.

Unknown Column
Consulte Unknown SQL Error.

Unknown database
Posible causa de error
1. Puede haber especificado un alias de base de datos o una ruta para la propiedad DatabaseName de un componente TDatabase o de un TDataset (TTable, TQuery, o TStoredProc en todas las versiones de Delphi; TClientDataset en las versiones 3 y superiores de Delphi Cliente/Servidor; TNestedTable en Delphi 4 y superiores) que no ha sido reconocido. 2. Puede haber intentado asignar el valor True a la propiedad Connected de un componente TDatabase sin proporcionar un valor para la propiedad AliasName. 3. El archivo de configuracin del BDE (IDAPI32.CFG en Delphi de 32 bits, IDAPI.CFG en Delphi 1) puede haber sido movido o borrado.

Solucin rpida
1. Si proporciona una ruta para esta propiedad, la ruta debera ser plenamente cualificada* y la base de datos utilizada debe ser Paradox o dBASE. Si la propiedad DatabaseName corresponde a un alias, asegrese de que el alias haya sido configurado apropiadamente.

530

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. -OAsignar /. 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
var v: Variant; begin v.Tail('Beech', Bonanza := 'Cartwrights');

537

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
begin xl.Workbooks.Add; SetColumnTitles; xl.Visible := True; end;

543

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 3. Desinstale la versin anterior de Delphi, y luego instale Delphi Cliente/Servidor.

549

Informacin adicional
Consulte Application is not licensed to use this feature.

Your username and password are not defined. Ask your database administrator to set up an InterBase login
Posible causa de error
Puede haber intentado activar un componente IBDatabase cuando la propiedad Login tena el valor False, pero la propiedad Params no contena el nombre de usuario y la contrasea necesarias.

Solucin rpida
Aada el nombre de usuario y la contrasea a la propiedad Params, o cambie el valor de la propiedad Login a True en tiempo de ejecucin, y entonces suministre los valores adecuados.

Informacin adicional
Durante el desarrollo, es conveniente asignar el valor False a la propiedad Login del componente IBDatabase, y suministrar la informacin necesaria (nombre de usuario y contrasea) en la propiedad Params. Sin embargo, despus de la implantacin puede ser conveniente forzar al usuario a introducir su nombre y contrasea para acceder a la base de datos (dependiendo, por supuesto, del tipo de aplicacin o datos de que se trate). En este caso, es recomendable cambiar los valores de usuario y contrasea por defecto, SYSDBA y masterkey.

550

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

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

ii

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

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

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

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

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

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

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

iv

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

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

Q R

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

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

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

unidirectional, 413 Unprepare, 116 ,141 ,317 UpdateMode, 447 ,467 UseBroker, 173 Uses, 521

vi

Вам также может понравиться