590
Los Tomos de Delphi ® : “Delphi sin problemas” Clay Shannon © 2002 Danypress [www.danypress.com]

Dsp

  • Upload
    ciroarc

  • View
    484

  • Download
    7

Embed Size (px)

Citation preview

Page 1: Dsp

Los Tomos de Del phi®:“Delphi sin problemas”

Clay Shannon

© 2002 Danypress[www.danypress.com]

Page 2: Dsp

Los Tomos de Delphi: Delphi sin problemasPor Clay ShannonCopyright versión en castellano © 2002 Danysoft InternacionalAvda. de España 17 - 28100 Alcobendas - Madridwww.danypress.comISBN: 84-923926-81Depósito Legal: M.

Traducido de: The Tomes of Delphi: Developer’s Guide to Troubleshooting© Wordware Publishing - ISBN 1-55622-816-3

DERECHOS RESERVADOS.El contenido de esta publicación tiene todos los derechos reservados, por lo que no se puedereproducir, transcribir, transmitir, almacenar en un sistema de recuperación o traducir aotro idioma de ninguna forma o por ningún medio mecánico, manual, electrónico, magnético,químico, óptico, o de otro modo. La persecución de una reproducción no autorizada tiene comoconsecuencia la cárcel y/o multas.

LIMITACIÓN DE LA RESPONSABILIDAD.Tanto los autores como el equipo de Danysoft hemos revisado el texto para evitar cualquiertipo de error, pero no podemos prometerle que el libro estará siempre libre de errores. Porello, y para que esto no sea una molestia para usted, hemos habilitado enhttp://www.danypress.com un apartado especial para que cada libro que publiquemospermanezca "vivo". Asimismo, podrá enviarnos por e-mail a [email protected] suscomentarios sobre el libro.

DESCUENTOS ESPECIALES.Recuerde que Danypress ofrece descuentos especiales a centros de formación y en compraspor volumen. Para más detalles, consulte con [email protected] en España o [email protected] en Latinoamérica.

Todos los productos y marcas se mencionan únicamente con fines de identificación y estánregistrados por sus respectivas compañías.

Delphi es una marca registrada de Borland Software Corporation. Otros nombres deproductos mencionados son utilizados únicamente para propósitos de identificación y puedenser marcas comerciales registradas de sus respectivas compañías.

Page 3: Dsp

Dedicatoria

Para:

Mi esposa, Che rri.

Mis hijos, Kel vin Caleb Mor de cai “Immer fort Purify” Shan non y Mor ganTell Mac ken zie “Immer fort Purify” (“Sluggo”) Shannon.

Mis padres, The dore Rus sell Shan non y Alice Rosa lie Shannon.

Mis her ma nos y her ma nos polí ti cos, Theo dore Patrick “Ted” Shan non;Jonat han Kelly “Barn” Shan non y Melinda “Min diana” Shan non; Patri ciaMau reen “Trish” Bau gus y Jimmy Don “Jim” Baugus.

Roger “S”. L. Hugi.

“The Cartwrights” (Jerry Dunn, Eddie J. Nelson, Alex Szajki y otros).

Sin su apoyo, amor, sacri fi cio, peleas con almoha das, ejem plo y leal tad,este esfuerzo, y la vida misma, habrían per dido gran parte de su sig ni fi-cado y su belleza.

Finalmente, también quiero extender mi agradecimiento a las siguien tesper so nas, que han hecho mi vida más agra da ble gra cias a su inteligenciacrea tiva o habi li da des deportivas:

Johann Sebas tian Bach, Bruce Spring steen, Dwight Yoa kam, the DesertRose Band, Mark Twain, Jack Lon don, Mar lon Brando, David Muench yAnsel Adams, Baltimore Orio les, Green Bay Pac kers y Mil wau kee Bucks.

iii

Page 4: Dsp

iv

Comentarios sobre:

Los Tomos de Del phi: “Del phi sin pro ble mas”de Clay Shan non

“Una referencia que he encontrado particularmente útil ha sido ‘Del phi sinpro ble mas’, de Clay Shannon, que es esencialmente una enciclopedia demensajes de error de Delphi. Si ha pro gra mado durante años en Delphi (oTurbo Pas cal), encontrará algunos ‘viejos cono ci dos’ aquí. Al prin ci pio mepre gun taba si habría algo nuevo para mí en este libro. No tuve que esperarmucho tiempo. A los pocos días de recibir esta valiosa referencia, una expli-ca ción sobre un error me aho rró horas de esfuerzo a la hora de con se guir queuna llamada a la API de Win dows fun cio nara”.

Alan C. MooreColum nista de “File | New”, Del phi Infor mant

“Es muy útil cuando tienes que dar solu ción a pro ble mas”.Bill ArtemikDroste Consultants, Inc.

“He estado uti li zando el libro durante el mes pasado y fue muy útil cuandoestaba tra tando de resol ver el men saje de error inex pli ca ble de turno. Nouti li zará este libro todos los días, pero cuando ocu rra un error mis te riosoestará muy feliz de tenerlo a su alcance. En él no sola mente se iden ti fica lacausa que está pro vo cando el men saje de error, sino que ade más se ofre censolu cio nes y ejem plos que per mi ten resol ver el pro blema muy rápi da mente.Si su tiempo es valioso y desea mini mi zar su ‘tiempo muerto’, le reco men da-ría adqui rir este libro”.

Barry McClurePresidentGrebar Systems, Inc.

“Otro libro que yo recomendaría es ‘Del phi sin pro ble mas’, de ClayS h a n n o n . . . Este libro es una referencia com pleta de los men sa jes de errorde Del phi y sus cau sas comu nes”.

David R. RobinsonDirector of DevelopmentCarpe Diem Electronic Time SheetSage U.S. Holdings, Inc.

Page 5: Dsp

Contenido

Cómo este libro se diferencia de los demás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxixLos mensajes de er ror son sus ami gos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxixCómo encontrar mensajes de er ror específicos en este libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxCuando hay muchas causas potenciales para el mismo er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiCuando necesite más información . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxii

Mensajes de Er ror“.” Ex pected. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1$2109 Can not ini tial ize the BDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1$DENYPACKAGEUNIT <> can not be put into a pack age . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2$DESIGNONLY and $RUNONLY both spec i fied . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2$DESIGNONLY and $RUNONLY only al lowed in pack age unit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3$WEAKPACKAGEUNIT & $DENYPACKAGEUNIT both spec i fied . . . . . . . . . . . . . . . . . . . . . . . . . . . 4$WEAKPACKAGEUNIT <> can not have ini tial iza tion or fi nal iza tion code . . . . . . . . . . . . . . . . . . . . . . 4$WEAKPACKAGEUNIT <> con tains global data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5‘;’ not al lowed be fore ‘Else’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<> al ready ex ists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<> can’t be added to this pack age be cause an other file with the same base name (<>) is al ready in the di rec tory ofthe pack age . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<> clause not al lowed in in ter face type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<> di rec tive not al lowed in in ter face type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<> ex pected but <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<> has no in dex for fields <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<> has the de scen dent <> in the Re pos i tory and there fore can not be re moved . . . . . . . . . . . . . . . . . . 10<> is a read-only file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<> is a re served word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<> is al ready in the Re pos i tory. Re place it? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<> is al ready in use by <>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<> is an in valid file name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<> is an in valid PageIndex value. PageIndex must be be tween 0 and <> . . . . . . . . . . . . . . . . . . . . . 13<> is not a type iden ti fier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<> is not a unique name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<> is not a valid com po nent name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<> is not a valid date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<> is not a valid date and time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<> is not a valid float ing point value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<> is not a valid float ing point value for field “<>” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

v

Page 6: Dsp

<> is not a valid iden ti fier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<> is not a valid in te ger value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<> is not a valid in te ger value for field “<>” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<> is not a valid path. Make sure that the path name is spelled cor rectly and that you are con nected to the server onwhich the file re sides. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<> is not a valid time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<> is not a valid value for field <>. The al lowed range is <> to <>. . . . . . . . . . . . . . . . . . . . . . . . 23<> must be saved be fore add ing to Re pos i tory. Save now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<> or <> ex pected but <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<> prop erty out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25{$R *.RES} miss ing or in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26(<>, <>, <>, <>) is not a valid DateMonthWeek quad . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26(<>, <>, <>) is not a valid DateWeek trip let . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2716-Bit seg ment en coun tered in ob ject file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27A class named <> is al ready in stalled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28A CoClass must have at least one de fault in ter face . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28A CoClass must im ple ment at least one in ter face . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29A com po nent class named <> al ready ex ists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30A com po nent named <> al ready ex ists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31A com po nent named <> al ready ex ists in a de scen dent form . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31A con nec tion with the server could not be es tab lished . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32A de vice at tached to the sys tem is not func tion ing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33A dispinterface type can not have an an ces tor in ter face . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33A dispinterface type re quires an in ter face iden ti fi ca tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34A field or method named <> al ready ex ists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34A mod ule called <> is al ready in stalled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35A page must be empty be fore it can be de leted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36A ref er ence to <> al ready ex ists in the Type Li brary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37A re quired .DLL file, <>, was not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37A trans ac tion is al ready ac tive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38A user trans ac tion is al ready in prog ress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39A value must be spec i fied for <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40A Win32 API func tion failed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43Ab stract method er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43Ab stract meth ods must be vir tual or dy namic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Ac cess vi o la tion (Gen eral Pro tec tion Fault) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45Ac cess vi o la tion at ad dress <>.<> of ad dress <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Am big u ous over loaded call to <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49An ces tor com po nent not found. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50An er ror oc curred while at tempt ing to ini tial ize the Borland Da ta base En gine (er ror <>) . . . . . . . . . . . . . 51An other file named <> is al ready on the search path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51An other file with the same base name (<>) is al ready on the search path . . . . . . . . . . . . . . . . . . . . . 51Ap pli ca tion is not li censed to use this fea ture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53Arith me tic Over flow Er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

vi

Page 7: Dsp

Ar ray type re quired. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55As ser tion failed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55As sign ment to FOR-Loop vari able <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56Asyn chron ous socket er ror <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57At end of ta ble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58Bad ar gu ment type in vari able type ar ray con struc tor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58Bad global sym bol def i ni tion: <> in ob ject file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60Bad pack aged unit for mat: <>.<>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60Bad unit for mat: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61BDE Ini tial iza tion Er ror $2501 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62Be fore you can de ploy, you must com plete the Web De ploy ment page of the Pro ject|Web De ploy Op tions di a log. . 63Bitmap im age is not valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63Bits in dex out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64BLOb has been mod i fied . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65Break or Con tinue out side of loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67Break point is set on line that may have been re moved by the optimizer or con tains no de bug in for ma tion. Run any way?

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70Call to Ap pli ca tion.CreateForm is miss ing or in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70Call to RegisterClass is miss ing or in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72Can’t change value while socket is ac tive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72Can’t com pile Complib. Too many files in pro ject. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73Can’t de lete or change re cord. Since re lated re cord ex ists in ta ble =‘xxx’, ref er en tial in teg rity rules would be vi o lated

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73Can’t load [complib.dcl, cmplib32.dcl, vcl30.dpl, vcl40.bpl, vcl50.bpl, vcl.bpl] . . . . . . . . . . . . . . . . . . . . 74Can’t load pack age <>.<> One of the li brary files needed to run this pack age can not be found . . . . . . . . . . 75Can’t load pack age <>. The spec i fied mod ule could not be found. . . . . . . . . . . . . . . . . . . . . . . . . . 76Can’t write .EXE file. Disk full?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77Can not add a ses sion to the form or data mod ule while ses sion <> has AutoSessionName en abled . . . . . . . . 78Can not as sign to a read-only prop erty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Can not break, con tinue, or exit out of a fi nally clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79Can not change the size of an icon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80Can not change Vis i ble in OnShow or OnHide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80Can not com plete a class with in com plete meth ods im ple men ta tions . . . . . . . . . . . . . . . . . . . . . . . . 82Can not con nect, <> must con tain a valid ServerName or ServerGUID . . . . . . . . . . . . . . . . . . . . . . . 83Can not con nect to da ta base <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83Can not copy a Re pos i tory Pro ject to a di rec tory un der neath it self . . . . . . . . . . . . . . . . . . . . . . . . . . 84Can not cre ate cur sor han dle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85Can not cre ate file <>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85Can not cre ate form. No MDI forms are cur rently ac tive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87Can not cre ate Win dow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88Can not de bug pro ject un less a host ap pli ca tion is de fined. Use the Run|Pa ram e ters. . . di a log box . . . . . . . . . . 88Can not en able AutoSessionName prop erty with more than one ses sion on a form or data mod ule . . . . . . . . . . 89Can not find <> on the search path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Can not find En gine con fig u ra tion file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

vii

Page 8: Dsp

Can not find im ple men ta tion of method <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92Can not find server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92Can not fo cus a dis abled or in vis i ble win dow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93Can not hide an MDI Child Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94Can not in herit from form <>. It con tains a com po nent with a blank name prop erty . . . . . . . . . . . . . . . . 95Can not ini tial ize lo cal vari ables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95Can not ini tial ize mul ti ple vari ables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97Can not ini tial ize thread lo cal vari ables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97Can not Load IDAPI Ser vice Li brary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98Can not load IDAPI[32].DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100Can not load lan guage driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101Can not load pack age <>. It con tains unit <> which is also con tained in pack age <>. . . . . . . . . . . . . . 102Can not lo cate IDAPI[01,32].DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102Can not make a vis i ble win dow modal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105Can not mod ify a read-only dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106Can not mod ify SessionName while AutoSessionName is en abled . . . . . . . . . . . . . . . . . . . . . . . . . . 106Can not open com po nent li brary <Path>\Complib.dcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107Can not open file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107Can not open mod ule be cause it is a de pend ent of <>, which is open as text . . . . . . . . . . . . . . . . . . . 108Can not op ti mize. Not an .exe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108Can not over ride a static method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109Can not per form op er a tion - DB is not open. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110Can not per form this op er a tion on a closed con nec tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110Can not per form this op er a tion on a closed da ta base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111Can not per form this op er a tion on a closed dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112Can not per form this op er a tion on an ac tive ses sion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114Can not per form this op er a tion on an empty dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114Can not per form this op er a tion on an open da ta base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115Can not per form this op er a tion on an open dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116Can not per form this op er a tion with ta ble open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117Can not per form util ity while ta ble is in use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117Can not read a write-only prop erty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117Can not Run a Unit or DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119Can not up date, <> is not owned by <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120Can not use ar ray of Field val ues with Ex pres sion In di ces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120Can not use re served unit name <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Can not write EXE or DLL to disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Can not Write to En gine Con fig u ra tion File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Ca pa bil ity Not Sup ported . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Case la bel out side of range of case ex pres sion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124Cir cu lar datalinks are not al lowed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126Cir cu lar Unit Ref er ence [to <>] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126Class <> not found. [Ig nore the er ror and con tinue?] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128Class al ready has a de fault prop erty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

viii

Page 9: Dsp

Class does not have a de fault prop erty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130Class, in ter face and ob ject types only al lowed in type sec tion . . . . . . . . . . . . . . . . . . . . . . . . . . . 131Class meth ods not al lowed as prop erty get ters and set ters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Class not reg is tered. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133Class or ob ject types only al lowed in type sec tion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134Class type re quired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135Clip board does not sup port Icons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136Close er ror on <File name> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136Code In sight fea tures are dis abled while de bug ging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137Code Seg ment Too Large . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137COINITIALIZE has not been called . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138Col umn not a BLOb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138Comma Ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138Com pi la tion ter mi nated; too many er rors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139Com po nent al ready in stalled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139Con nec tion er ror—no server avail able . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140Con nec tion in use by an other state ment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141Con nec tion name miss ing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142Con stant ex pres sion ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Con stant ex pres sion vi o lates subrange bounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Con stant ob ject can not be passed as var pa ram e ter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144Con stant or type iden ti fier ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146Con stant out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147Con stants can not be used as open ar ray ar gu ments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148Con structing In stance of <> con tain ing ab stract meth ods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149Con struc tors and De struc tors must have reg is ter call ing con ven tion . . . . . . . . . . . . . . . . . . . . . . . . 150Con struc tors and De struc tors not al lowed in OLE au to ma tion sec tion . . . . . . . . . . . . . . . . . . . . . . . 151CON TAINS clause is in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151Con trol <> has no par ent win dow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153Con trols can not be added to a data mod ule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154Cor rupt ta ble/in dex header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155Could not cre ate out put file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156Could not find IDataBroker in type li brary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157Could not find in ter face <> in type li brary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158Could not find in ter face IDataBroker in type li brary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158Could not find lan guage driver ($220B) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159Could not find ob ject. Can not load an IDAPI ser vice li brary. File: ODBC32.DLL . . . . . . . . . . . . . . . . . . . 159Could not ini tial ize IDAPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160Could not load <>. The OLE con trol may pos si bly re quire sup port li brar ies that are not on the cur rent search path orare not pres ent on your sys tem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161Could not load RLINK32.DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161Could not load StdOle ver sion 1.0 type li brary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161Could not load Type Li brary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162Could not load unit <> sym bol in for ma tion for <> Do you want to try to find this file your self? . . . . . . . . . 162

ix

Page 10: Dsp

Could n’t per form the edit be cause an other user changed the re cord . . . . . . . . . . . . . . . . . . . . . . . . 163Data Base Er ror: Da ta base ac cess re sulted in er ror. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163Data Seg ment Too Large . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164Data Struc ture Cor rup tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166Data Type too large: ex ceeds 2 GB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168Da ta base name miss ing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168Da ta base not As signed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169Dataset is not a query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170Dataset not con fig ured for net work ac cess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171Dataset [is] not in edit or in sert mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171DAX Er ror: Class not reg is tered. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172DAX Er ror: Name not unique in this con text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173DAX Er ror: Un ex pected fail ure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173DCOM not in stalled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173De bug pro cess is al ready run ning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173De bug ses sion in prog ress. Ter mi nate? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174Debugger ker nel er ror. Er ror code: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175Dec la ra tion ex pected but <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176Dec la ra tion of <> dif fers from dec la ra tion in in ter face <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177Dec la ra tion of <> dif fers from pre vi ous dec la ra tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177Dec la ra tion of class <> is miss ing or in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178DE FAULT clause not al lowed in OLE au to ma tion sec tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179De fault pa ram e ter ‘<>’ must be by-value or const . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179De fault prop erty must be an ar ray prop erty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180De fault value re quired for <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181De fault val ues must be of or di nal, pointer, or small set type . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181Des ti na tion must be in dexed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183Di rec tory Is Busy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184Di rec tory is con trolled by other .NET file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185Disk Er ror. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188Disk full. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188Disk read er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189Disk write er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189Dispid <> al ready used by <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190Dispid clause only al lowed in OLE au to ma tion sec tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191Dis pose not sup ported (nor nec es sary) for dy namic ar rays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191Di vi sion by zero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192Du pli cate case la bel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193Du pli cate da ta base name <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194Du pli cate dy namic method in dex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195Du pli cate field name <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195Du pli cate im ple ments clause for in ter face <>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196Du pli cate mes sage method in dex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197Du pli cate re source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

x

Page 11: Dsp

Du pli cate ses sion name <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199Du pli cate Tag Value. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199Dy namic method or mes sage han dler not al lowed here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200Dy namic method or mes sage han dlers not al lowed in OLE au to ma tion sec tions . . . . . . . . . . . . . . . . . . 201EAccessViolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201EBitsError. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201EClassNotFound . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201EComponentError. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202EConvertError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202EDatabaseError. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203EDivByZero. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204EFCreateError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204EFilerError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204EGPFault . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205EInOutError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205EIntOverflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206EInvalidCast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206EInvalidGraphic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206EInvalidGraphicOperation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207EInvalidOp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207EInvalidOperation: Can not cre ate form. No MDI forms are cur rently ac tive . . . . . . . . . . . . . . . . . . . . 207EInvalidOperation: Can not make a vis i ble win dow modal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207EInvalidPointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208El e ment 0 In ac ces si ble—use Length or SetLength . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208END ex pected but <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209END ex pected but im ple men ta tion found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209END. miss ing at end of mod ule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210EOLEError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211EOLEException . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211EOleSysClass not Reg is tered . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211EOleSysError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211EOleSysOperation Un avail able . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212EOutOfMemory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212EOutOfResources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213ERangeError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214EReadError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214ERegistryException . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214EResNotFound . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215Er ror 0: RLINK32 Er ror open ing file <TypeLibrary>.tlb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216Er ror 2—File not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216Er ror 4—Too many open files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216Er ror 68—Cir cu lar Unit Ref er ence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Er ror 76—Con stant out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Er ror 94—“.” Ex pected. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

xi

Page 12: Dsp

Er ror 101—Disk write er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Er ror 102—File not as signed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Er ror 103—File not open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Er ror 104—File not open for in put . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Er ror 105—File not open for out put . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Er ror 200—Di vi sion by zero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Er ror 201—Range check er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Er ror 202—Stack over flow er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Er ror 203—Heap over flow er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Er ror 204—In valid pointer op er a tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Er ror 207—In valid float ing point op er a tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Er ror 210—Ab stract Method Er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Er ror 215—Arith me tic over flow er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Er ror 216—Ac cess Vi o la tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Er ror 219—In valid Type cast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Er ror 220—In valid Vari ant Type cast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219Er ror 227—As ser tion failed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219Er ror Cre ating Cur sor Han dle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219Er ror cre at ing form: ac cess vi o la tion at. . . vcl[30,40,50,60] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220Er ror cre at ing form: An ces tor for “<>” not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220Er ror Cre ating Form: Can not in herit from form <>. Con tains a com po nent <> that does not support in her i tance 221Er ror Cre ating Form: Can not in herit from form <>. It con tains a com po nent with a blank name prop erty . . . . 221Er ror cre at ing form: Can not open file <>.DFM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223Er ror Cre ating Form: Du pli cate re source [Type:,Name:] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223Er ror Cre ating Form: In valid Stream For mat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224Er ror cre at ing Pro cess. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225Er ror Cre ating Vari ant Ar ray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226Er ror Cre ating Win dow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226Er ror de bug set ting hook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227Er ror in CRE ATE IN DEX state ment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227Er ror in mod ule <>: Call to Ap pli ca tion.CreateForm is miss ing or in cor rect . . . . . . . . . . . . . . . . . . . . 228Er ror in mod ule <>: CON TAINS clause is in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228Er ror in mod ule <>: Dec la ra tion of class <> is miss ing or in cor rect . . . . . . . . . . . . . . . . . . . . . . . 228Er ror in mod ule <>: END. miss ing at end of mod ule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228Er ror in mod ule <>: Im ple men ta tion part USES clause in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . 229Er ror in mod ule <>: In cor rect field dec la ra tion: class <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229Er ror in mod ule <>: RE QUIRES clause is in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229Er ror in mod ule <>: USES clause is miss ing or in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229Er ror initializing BDE ($2B05) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229Er ror load ing type li brary/dll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229Er ror Open ing Com po nent Li brary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230Er ror read ing <>.<>: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231Er ror read ing <ComponentName or FormName>.<Propertyname>. Prop erty does not ex ist. Ig nore the er ror and con-tinue? NOTE: ig nor ing the er ror may cause com po nents to be de leted or prop erty val ues to be lost. . . . . . . . . 232

xii

Page 13: Dsp

Er ror read ing <Da ta base>.SessionName. Du pli cate da ta base name <> . . . . . . . . . . . . . . . . . . . . . 233Er ror read ing <Ses sion>.SessionName. Du pli cate ses sion name <> . . . . . . . . . . . . . . . . . . . . . . . 233Er ror read ing sym bol file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234Er ror sav ing I(In ter face): The pa ram e ter is in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235Er ror set ting de bug ex cep tion hook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235Er ror start ing Pro gram. The <>.DLL file ap pears to be cor rupt. Re in stall the file, and then try again. . . . . . . . 236EStackOverflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236EStringListError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236EThread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236EVariantError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237Ex cept or Finally ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237Ex cep tion <> in mod ule <> at <>.<>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Ex pected an iden ti fier but func tion found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Ex pect ing a col umn sep a ra tor in ta ble [header] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240Ex ports al lowed only at global scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240Ex pres sion ex pected but <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240Ex ter nal er ror C0000006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241Ex ter nal er ror C0000012 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242Ex ter nal ex cep tion C0000008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242F004 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243Failed to get data for <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243Failed to load stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244Fa tal Er ror: <>: Re quired Pack age <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244Field <> can not be mod i fied. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245Field <> can not be used in a fil ter ex pres sion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245Field <>.<> does not have a cor re spond ing com po nent. Re move the dec la ra tion? . . . . . . . . . . . . . . . . 246Field <> is not in dexed and can not be mod i fied . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247Field <> is not of the ex pected type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248Field <> is of an un known type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249Field <> is of an un sup ported type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250Field <> must have a value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251Field <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252Field <> should be of type <> but is de clared as <>. Cor rect the dec la ra tion? . . . . . . . . . . . . . . . . . 253Field dec la ra tions not al lowed in in ter face type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254Field def i ni tion not al lowed af ter meth ods or prop er ties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255Field in group by must be in re sult set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256Field in or der by must be in re sult set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256Field in dex out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257Field name al ready ex ists. Re name one of the fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258Field not found in ta ble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259Field or method iden ti fier ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259Field out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261Field types do not match . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261Field value re quired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262

xiii

Page 14: Dsp

File <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262File ac cess de nied . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263File ex ten sion <> is not valid. Ex pect ing <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263File is Locked. Ta ble: <> User: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264File not as signed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264File not found <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265File not open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267File not open for in put . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270File not open for out put. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271File or di rec tory does not ex ist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272File type not al lowed here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272Fixed col umn count must be less than col umn count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273Fixed row count must be less than row count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274For Loop con trol vari able must be sim ple lo cal vari able . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274For Loop con trol vari able must have or di nal type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275For-Loop vari able <> can not be passed as var pa ram e ter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276Form <> links to form <> which can not be found in the cur rent pro ject. Do you wish to re move/re di rect the links toan other form?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277Form <> ref er ences an other form and can not be saved un til <> is loaded . . . . . . . . . . . . . . . . . . . . 277For mat “<>” in valid or in com pat i ble with ar gu ment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278Func tion needs re sult type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278Gen eral SQL Er ror—con nec tion does not ex ist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279Gen eral SQL Er ror—FROM key word not found where ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . 279Gen eral SQL Er ror: Missing Left Pa ren the sis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280Gen eral SQL Er ror: SQL Com mand not prop erly ended . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280Gen eral SQL Er ror: SQL is too com plex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281Gen eral SQL er ror. The [Com mit,Roll back] Trans ac tion re quest has no cor re spond ing be gin trans ac tion . . . . . . 281GOTO <> leads into or out of TRY state ment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282Grid In dex Out of Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282GROUP BY is re quired when both ag gre gate and non-ag gre gate fields are used in re sult set . . . . . . . . . . . . 283Heap Over flow Er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284High can not be ap plied to a long string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284Higher ta ble level re quired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285I/O Er ror 102 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288I/O Er ror 103 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288I/O Er ror 104 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288I/O Er ror 105 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288I/O er ror found for file “<Cur rent di rec tory>\Da ta base.GDB”. Er ror while try ing to open file. The sys tem can not findthe file spec i fied. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289Iden ti fier ex pected but <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289Iden ti fier ex pected but ar ray found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290Iden ti fier ex pected but num ber found. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290Iden ti fier redeclared: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Il le gal char ac ter in in put file: <> (<>) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291

xiv

Page 15: Dsp

Il le gal mes sage method in dex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292Il le gal type in OLE au to ma tion sec tion: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293Il le gal type in Read/Readln state ment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293Il le gal type in Write/Writeln state ment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294IM PLE MEN TA TION part is miss ing or in cor rect. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294Im ple men ta tion part USES clause in cor rect. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295Im ple ments clause only al lowed for prop er ties of class or in ter face type . . . . . . . . . . . . . . . . . . . . . . 295Im ple ments clause only al lowed for read able prop erty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296Im ple ments clause only al lowed within class types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297Im ple ments get ter must be reg is ter call ing con ven tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297Im proper GUID syn tax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298In com pat i ble Re cord Struc tures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298In com pat i ble Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299In com pat i ble types: <> and <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299In com pat i ble types: Pa ram e ter lists dif fer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304In cor rect field dec la ra tion: class <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305In cor rect method dec la ra tion in class <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306In cor rect syn tax near ':' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306In dex al ready ex ists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307IN DEX clause not al lowed in OLE au to ma tion sec tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308In dex does not ex ist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308In dex is out of date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309In dex is out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312In dex is read only . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312In dex not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313In dex or Pri mary Key can not con tain a Null value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313IN DEX, READ, OR WRITE clause ex pected but ‘;’ found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314IN SERT and UP DATE op er a tions are not sup ported on autoincrement field type . . . . . . . . . . . . . . . . . . 314In stal la tion er ror –113 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315In stance vari able <> in ac ces si ble here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316In suf fi cient disk space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316In suf fi cient mem ory for this op er a tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317In suf fi cient SQL rights for op er a tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318In suf fi cient ta ble rights for op er a tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319In te ger con stant too large . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320InterBase in stall DLL ibinstall.dll not found in path. Please in stall InterBase 6 to use this func tion al ity. . . . . . . 321In ter face <> al ready im ple mented by <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321In ter face <> has no in ter face iden ti fi ca tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322In ter face <> not men tioned in in ter face list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322In ter face mis match. En gine ver sion dif fer ent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323In ter face type re quired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323In ter nal er ror: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324In ter nal Er ror; Near: query shellmgr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325In ter nal Er ror 500. In ter face not sup ported . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326

xv

Page 16: Dsp

In ter nal Server Er ror 500 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326In valid ad dress value. Must be a hex a dec i mal value in the range 00000000-FFFFFFFF. . . . . . . . . . . . . . . 326In valid ar gu ment to date en code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327In valid ar gu ment to time en code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327In valid Batch Move Pa ram e ters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328In valid Bind Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329In valid BLOb han dle [in re cord buffer] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329In valid BLOb Size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329In valid class string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330In valid class type cast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330In valid com piler di rec tive: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331In valid di rec tory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332In valid field name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332In valid field size. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333In valid field type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334In valid file name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334In valid float ing point op er a tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335In valid func tion re sult type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337In valid GUID for mat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337In valid in dex descriptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337In valid in dex ex pres sion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338In valid in dex/tag name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338In valid mes sage pa ram e ter list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340In valid pack age file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340In valid Pa ram e ter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341In valid pa ram e ter type: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341In valid path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342In valid pointer op er a tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342In valid prop erty path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343In valid prop erty value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343In valid prop erty value on line <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344In valid re source for mat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345In valid Stream For mat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345In valid type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346In valid Type Con ver sion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347In valid type cast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347In valid use of key word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348In valid vari able ref er ence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351In valid vari ant type con ver sion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351Key Vi o la tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353La bel <> is not de clared in cur rent pro ce dure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354La bel al ready de fined: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354La bel dec la ra tion not al lowed in in ter face part . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355La bel de clared and ref er enced, but not set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355

xvi

Page 17: Dsp

La bel ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356Left side can not be as signed to . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357Line num ber must be be tween 1 and <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359Line too long [more than 255 char ac ters] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359List ca pac ity out of bounds (<>) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359List in dex out of bounds (<>) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360Lo cal class, in ter face or ob ject types not al lowed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363Lo cal class or ob ject types not al lowed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363Lo cal pro ce dure/func tion <> as signed to pro ce dure vari able. . . . . . . . . . . . . . . . . . . . . . . . . . . . 363Lock file [has grown] too large . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364Lock time out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365Lock Vi o la tion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366Lookup in for ma tion for field <> is in com plete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367Low bound ex ceeds High bound. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368Mas ter has de tail re cords. Can not de lete or mod ify. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368Mas ter has de tail re cords. Can not empty it. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369Mas ter re cord miss ing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370Max i mum Va lid ity Check Failed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370Memo too large. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371Metafile is not valid. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371Method <> hides vir tual method of base class <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372Method <> not found in base class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373Method “<>” not sup ported by au to ma tion ob ject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373Method <> with iden ti cal pa ram e ters ex ists al ready . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374Method iden ti fier ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375Microsoft Trans ac tion Server is not in stalled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376Min i mum Va lid ity Check failed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377Mis match in datapacket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378Missing comma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378Missing Con nec tion or Con nec tion String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379Missing Data Pro vider or Data Packet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380Missing ENDIF di rec tive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381Missing op er a tor or semi co lon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381Missing or in valid con di tional sym bol in <$> di rec tive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383Missing pa ram e ter type. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383Missing right quote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384Missing TableName prop erty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384Mod ule <>s time/date changed. Re load? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385Mod ule header is miss ing or in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386Mul ti ple Net Files found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387Mul ti ple Par a dox Net files found/in use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389Must ap ply up dates be fore re fresh ing data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389Name con flict ing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390Name not unique in this con text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390

xvii

Page 18: Dsp

Need to spec ify at least one di men sion for SetLength of dy namic ar ray . . . . . . . . . . . . . . . . . . . . . . . 391Never-build pack age <> must be recompiled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391Never-build pack age <> re quires al ways-build pack age <> . . . . . . . . . . . . . . . . . . . . . . . . . . . 392New not sup ported for dy namic ar rays—use SetLength . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392No ad dress spec i fied . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393No ar gu ment for for mat <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393No code was gen er ated for the cur rent line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394No Da ta bases Are Listed In Trans ac tion Com po nent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395No def i ni tion for ab stract method <> al lowed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395No fields de fined—can not cre ate dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396No frames in pro ject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397No in dex cur rently ac tive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397No MDI forms are cur rently ac tive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398No MDI Par ent Ac tive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398No over loaded method of <> with this pa ram e ter list ex ists . . . . . . . . . . . . . . . . . . . . . . . . . . . 398No Pro vider Avail able . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399No SQL state ment avail able . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400No user trans ac tion is cur rently in prog ress. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401No Web browser could be lo cated . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402NODEFAULT clause not al lowed in OLE au to ma tion sec tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402Not enough ac tual pa ram e ters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403Not enough file han dles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404Not ex act read/write in <>.mb and <>.mb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405Not in cached up date mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405Not in i tial ized for ac cess ing net work files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406Num ber is out of range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408Num ber of el e ments dif fers from dec la ra tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408Ob ject Fac tory for TwebResponse Missing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409Ob ject or class type re quired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409OLE er ror 800A03EC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410One or more lines were too long and have been trun cated . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411Only one of a set of over loaded meth ods can be pub lished . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411Only one TIDAntiFreeze can ex ist per ap pli ca tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412Only reg is ter call ing con ven tion al lowed in OLE au to ma tion sec tion . . . . . . . . . . . . . . . . . . . . . . . . 413Op er a tion not al lowed on a uni di rec tional dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413Op er a tion not al lowed on sorted string list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414Op er a tion not ap pli ca ble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415Op er a tion not sup ported . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416Op er a tor not ap pli ca ble to this op er and type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417ORA-1001 in valid cur sor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419Or der of fields in re cord con stant dif fers from dec la ra tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420Or di nal type re quired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421Out of mem ory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422Out of sys tem re sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423

xviii

Page 19: Dsp

Over flow in con ver sion or arith me tic op er a tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424Over loaded pro ce dure <> must be marked with the over load di rec tive . . . . . . . . . . . . . . . . . . . . . . 424Over riding au to mated vir tual method <> can not spec ify a dispid . . . . . . . . . . . . . . . . . . . . . . . . . 425Pack age <> al ready con tains unit <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425Pack age <> can’t be in stalled be cause an other pack age with the same base name is al ready loaded (<>) . . . 425Pack age <> can’t be in stalled be cause it is not a de sign time pack age . . . . . . . . . . . . . . . . . . . . . . 426Pack age <> is re cur sively re quired. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427Pack age unit <> can not ap pear in con tains or uses clauses . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427Pack ages <> and <> both con tain unit <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428PACKED not al lowed here. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428Page Fault in mod ule <> at <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429Page name can not be blank. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429Param <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430Pa ram e ter <> not al lowed here due to de fault value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430Pa ram e ter <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431Pa ram e ters of this type can not have de fault val ues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431Par ent In ter face must be Dispatchable for dual in ter face . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432Passthrough SQL con nec tion must be shared . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432Path not found. File <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432Path too long . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433Pointer type re quired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433Prep a ra tion of de fault ex pres sion failed with er ror “Type mis match in ex pres sion” . . . . . . . . . . . . . . . . . 434Pre vi ous dec la ra tion of <> was not marked with the ‘over load’ di rec tive . . . . . . . . . . . . . . . . . . . . . 435Print ing in Prog ress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435Pro ce dure can not have a re sult type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436Pro ce dure FAIL only al lowed in con struc tor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437Pro ce dure, func tion or prop erty ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437Pro ce dure or Func tion ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438Pro ce dure or Func tion name ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439Pro gram or unit <> re cur sively uses it self . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439Pro ject <> raised ex cep tion class <> with mes sage <>. Pro cess stopped. Use Step or Run to continue. . . . . 440Prop erty <> does not ex ist in base class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441Prop erty <> in ac ces si ble here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442Prop erty does not ex ist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443Prop erty get ters and set ters can not be over loaded . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443Prop erty over rides not al lowed in in ter face type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444Pro vider name was not rec og nized by the server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444Pub lished field <> not a class nor in ter face type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445Pub lished prop erty <> can not be of type <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446Pub lished real[48] prop erty <> must be Sin gle, Dou ble, or Ex tended . . . . . . . . . . . . . . . . . . . . . . . 446PutObject to un de fined item . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447Query Is Too Com plex. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447Query makes no sense . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448Query may take a long time to pro cess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449

xix

Page 20: Dsp

Range check er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449Read fail ure. File: <>.val . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450Read or Write clause ex pected but iden ti fier <> found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450Re cord al ready locked by this ses sion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451Re cord changed by an other user . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451Re cord Key de leted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452Re cord/Key De leted. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452Re cord Locked by an other User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453Re cord, ob ject or class type re quired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453Re cur sive in clude file <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454Redeclaration of <> hides a mem ber in the base class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454Redeclaration of prop erty not al lowed in OLE au to ma tion sec tion . . . . . . . . . . . . . . . . . . . . . . . . . 455Re quired pack age <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455RE QUIRES clause is in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456Re-rais ing an ex cep tion only al lowed in ex cep tion han dler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456Re source <> not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457Seg ment/Off set pairs not sup ported in Borland 32-bit Pascal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458Se lec tion con tains a com po nent in tro duced in an an ces tor form which can not be de leted . . . . . . . . . . . . . 458Server Ex e cu tion Failed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460Ses sion name miss ing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460Sets may have at most 256 el e ments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461Share not loaded. It is re quired to share lo cal files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462Size mis match er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463Size of pub lished set <> is greater than [4 bytes, 32 bits] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463Slice stan dard func tion is only al lowed as open ar ray ar gu ment . . . . . . . . . . . . . . . . . . . . . . . . . . . 464Socket Er ror # 10061 – Con nec tion Re fused . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465Socket Er ror # 10065 – No route to host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465Socket Er ror # 11001 – Host not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466SQL Con nec tion timed out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466SQL Di a lect In valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467SQL is too com plex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467Stack over flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468State ment ex pected, but ex pres sion of type <> found. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469State ments not al lowed in in ter face part . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469STORED clause not al lowed in OLE au to ma tion sec tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470Stream Read Er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470String con stant trun cated to fit STRING[ ] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471String [lit eral]s may have at most 255 el e ments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471Syn tax Er ror in Field Def i ni tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472Syn tax er ror in query. In com plete query clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473Syn tax er ror in real num ber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474Sys tem unit out of date or cor rupted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474Ta ble can not be opened for ex clu sive use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475Ta ble cor rupt—other than header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476

xx

Page 21: Dsp

Ta ble does not ex ist. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476Ta ble does not sup port this op er a tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477Ta ble is busy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478Ta ble is full . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479Ta ble is not in dexed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480Ta ble is read only . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481Ta ble or View does not ex ist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482TActiveFormX dec la ra tion miss ing or in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482Text af ter fi nal END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483The <>.EXE file is linked to miss ing ex port <>.DPL:<> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483The <> method ref er enced by <>.<> does not ex ist. Re move the ref er ence? . . . . . . . . . . . . . . . . . . 484The <> method ref er enced by <>.<> has an in com pat i ble pa ram e ter list. Re move the ref er ence? . . . . . . . 486The ap pli ca tion or DLL <> is not a valid Win dows im age. Please check this against your in stal la tion dis kette. . . 486The changes you re quested to the ta ble were not suc cess ful be cause they would cre ate du pli cate val ues in the in dex,pri mary key, or re la tion ship. Change the data in the field or fields that con tain du pli cate data, re move the in dex, or re-de fine the in dex to per mit du pli cate en tries and try again. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487The Edit Buffer of <> is marked read-only . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487The Mas ter Source prop erty of <> must be linked to a DataSource . . . . . . . . . . . . . . . . . . . . . . . . 488The OLE con trol may pos si bly re quire sup port li brar ies that are not on the cur rent search path or are not pres ent onyour sys tem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488The pack age al ready con tains unit named <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489The pack age al ready re quires a pack age named <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489The page can not be dis played . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490The path en tered does not ex ist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490The pro ce dure en try point <> can not be found in the dy namic link li brary <>.DLL . . . . . . . . . . . . . . . 491The pro ject al ready con tains a form or mod ule named <>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491The Re source DLL Wiz ard re quires a pro ject to be open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492The search string can not be blank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493The se lected bitmap is larger than 24x24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493The server re turned an in valid re sponse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494The trans ac tion iso la tion level must be dirty read for lo cal da ta bases . . . . . . . . . . . . . . . . . . . . . . . 494The type li brary has syn tax er rors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495There is cur rently no ac tive pro ject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496There is no de fault printer cur rently se lected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496There is no over loaded ver sion of <> that can be called with these ar gu ments . . . . . . . . . . . . . . . . . . 496This form of method call only al lowed for class meth ods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497This form of method call only al lowed in meth ods of de rived types . . . . . . . . . . . . . . . . . . . . . . . . . 499This pack age al ready con tains unit named <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500This type can not be in i tial ized . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500Thread lo cal vari ables can not be AB SO LUTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501Thread lo cal vari ables can not be lo cal to a func tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501To ken not found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502To ken not found. To ken :dbo. line num ber:1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502Too many ac tual pa ram e ters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503

xxi

Page 22: Dsp

Too many con nec tions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503Too many files open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504Too many locks on ta ble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505Too many open cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505Too many open files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506Too many pa ram e ters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506Trans ac tion Is Ac tive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507Trans ac tion not As signed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508Trans late er ror, value out of bounds. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508Tried to search marked block but it is in valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509Type <> has no type info . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509Type <> is not yet com pletely de fined . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510Type <> must be a class to have a PUB LISHED sec tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510Type <> must be a class to have OLE au to ma tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511Type <> needs fi nal iza tion—not al lowed in file type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512Type ex pected but <> found. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512Type ex pected but real con stant found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513Type mis match for field <FieldName>, ex pect ing: <Field type>, ac tual: <Field type> . . . . . . . . . . . . . 514Type mis match [in ex pres sion] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514Type not al lowed in OLE Au to ma tion call . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515Type of ex pres sion must be BOOLEAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515Type of ex pres sion must be IN TE GER. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516TYPEINFO stan dard func tion ex pects a type iden ti fier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516TYPEOF can only be ap plied to ob ject types with a VMT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517Types of ac tual and for mal var pa ram e ters must be iden ti cal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518Un able to Ex e cute a Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519Un able to find both a form and a source file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519Un able to in sert a line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519Un able to load GDS[32].DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520Un able to load RPTSMITH.EXE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520Un de clared Iden ti fier: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521Un de clared Iden ti fier: 'EmptyParam' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525Un de clared Iden ti fier: 'Re sult' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526Un de clared Iden ti fier: 'Un as signed' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526Un de clared Iden ti fier: 'VarToStr' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526Un ex pected end of com mand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526Unit <> was com piled with a dif fer ent ver sion of <>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527Unit File For mat Er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528Unit name mis match: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528Unit ver sion mis match: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528Un known Col umn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529Un known da ta base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529Un known di rec tive: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531Un known di rec tive (al ready ex ists) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533

xxii

Page 23: Dsp

Un known Iden ti fier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533Un known pic ture file ex ten sion: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534Un known SQL Er ror. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534Un known user name or pass word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535Un named ar gu ments must pre cede named ar gu ments in OLE Au to ma tion call . . . . . . . . . . . . . . . . . . . 536Un rec og nized da ta base pa ram e ter block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537Un sat is fied for ward or ex ter nal dec la ra tion: <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537Un sup ported 16bit re source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538Unterminated string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539USES clause is miss ing or in cor rect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539Val i da tion er ror for col umn <Col umn Name>, value <***Null***> . . . . . . . . . . . . . . . . . . . . . . . 539Vari able <> in ac ces si ble here due to op ti mi za tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541Vari able name ex pected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541Vari able re quired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542Vari ant does not ref er ence an au to ma tion ob ject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542Vari ant does not ref er ence an OLE ob ject. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543Vari ant er ror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544Vari ant is not an ar ray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544Ven dor ini tial iza tion fail ure: ORA[NT]7[1,2,3].DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545Win dows socket er ror: <> on API <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545Win dows Socket Er ror: (10060), on API con nect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546Write er ror on <> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546You can not add a <> to the cur rent pro ject be cause it is not an ActiveX li brary. Click OK to start a new ActiveX li-brary pro ject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546You can not spec ify a size for a field of this type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547You must open a pro ject be fore you can add an Au to ma tion Ob ject . . . . . . . . . . . . . . . . . . . . . . . . 547You must se lect a VCL class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548Your ap pli ca tion is not en abled for use with this driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548Your username and pass word are not de fined. Ask your da ta base ad min is tra tor to set up an InterBase login . . . . 549

xxiii

Page 24: Dsp

xxiv

Page 25: Dsp

Prólogo

Desa rro llar soft ware es una tarea difí cil. Algu nas veces se sen tirá como siestu viera bus cando un camino a tra vés de un campo minado. Algu nasminas son leta les y explo tan en su cara, haciendo que su apli ca ción dejede fun cio nar. Otras podrían sim ple mente cau sarle heri das de diversa con-si de ra ción. Y otras podrían acti varse tem pra na mente, para comen zar acau sar daños sólo al cabo de cierto tiempo.

El pro blema es, por supuesto, doble: algu nas minas son colo ca das por Ud.mismo y otras por pode res “extra ños” — podría ser Win dows, una actua li-za ción de Win dows, una DLL des ca rriada que ha que dado en memo ria, oalguna apli ca ción inco rrec ta mente pro gra mada que com parte el orde na-dor con su apli ca ción.

Por supuesto, la solu ción ver da dera pasa por tener un mapa del campo deminas. Cono ciendo donde están las minas, cier ta mente será más fácilencon trar el camino seguro.

Los men sa jes de error, por supuesto, sir ven para un pro pó sito válido ypue den ayu dar a detec tar esas “minas” de pro gra ma ción. Aun que losdesa rro lla do res gene ral mente detes tan ver men sa jes de error, fran ca-mente esta rían per di dos sin ellos. No obs tante, his tó ri ca mente el pro cesode resol ver los pro ble mas de una apli ca ción que se com porta inco rrec ta-mente a par tir de los men sa jes de error ha tenido gene ral mente un ciertocom po nente de “magia negra”. Muchas veces los men sa jes de error no sonmuy úti les, y en oca sio nes pue den ser total mente enga ño sos.

Cuando se pro duce un error, es gene ral mente res pon sa bi li dad del crea dorde esa pieza de código par ti cu lar (apli ca ción, con tro la dor, com po nente,con trol, etc.) pro por cio nar una des crip ción sig ni fi ca tiva de lo que ha ocu-rrido. Desa for tu na da mente, escri bir men sa jes de error sig ni fi ca ti vos esuna tarea que cae siem pre en la parte infe rior de la lista de prio ri da desdel desa rro lla dor. Como resul tado, un men saje de error podría no expli carcon sufi ciente cla ri dad cuál es el pro blema. Mi favo rito es “Gene ral SQLError” (”Error gene ral de SQL”). Cla ra mente es un men saje de error nadaútil — usted sabe que el error tiene rela ción con SQL, pero nada más. Elpro blema puede estar en cual quier lugar, haberse pro du cido por cual quiercausa, y eso sería todo lo que podría supo nerse para corre gir el pro blema.

Un pro blema de aún más difí cil solu ción se pro duce cuando un men saje deerror no tiene abso lu ta mente nada que ver con el pro blema real. El

xxv

Prólogo

Page 26: Dsp

usua rio se rasca la cabeza y comienza a inves ti gar el pro blema, muchasveces yendo 180 gra dos en la direc ción equi vo cada. Per so nal mente he per-dido días ente ros por culpa de erro res de ese tipo.

Esto es lo que hace que este libro sea único y valioso. El autor ha creadoun mapa del campo de minas para noso tros. Incluso nos indica cuándo unmen saje de error es real mente un falso señuelo que puede dejar al desa-rro lla dor per dido durante días. Hay muchos libros dis po ni bles sobre Del-phi, pero muy pocos tie nen el enfo que tan defi nido de éste. Está dedi cadoínte gra mente a un único tema, pero es cla ra mente el libro que Ud. bus-cará cuando nece site ayuda durante la solu ción de pro ble mas.

Hacer un libro que no sigue las fór mu las usua les exige mucho valor. Miala banza a Mr. Shan non por pre pa rar tan indis pen sa ble refe ren cia

Robert Viv rette, Edi tor Téc nicoThe Del phi Infor mant Maga zine

xxvi

Prólogo

Page 27: Dsp

Agradecimientos

Nin gún libro es una isla. Aun que mucha de la infor ma ción que se pre-senta aquí fue adqui rida a tra vés de la apro xi ma ción directa (¡pro gra-mando!), alguna infor ma ción trans mi tida en este libro ha sidoindi rec ta mente adap tada de muchas y varia das fuen tes. Entre estas otrasfuen tes se inclu yen otros libros de Del phi, publi ca cio nes perió di cas, gru-pos de noti cias y lis tas de correo, la docu men ta ción de ayuda de Del phi, elcódigo de otras per so nas y con ver sa cio nes con cole gas.

Cuando era joven escu ché muchas veces la expre sión “Cons truya unarato nera, y el mundo encon trará el camino hasta ella”. Ahora sé que esono es cierto. El mundo debe saber de la exis ten cia de su rato nera, y nor-mal mente habrá que darla a cono cer para que la ten gan en cuenta, noimporta cuán buena sea. Una gran ayuda para mí en el pro ceso de hacermi “rato nera” cono cida ha sido Inter net, a tra vés de los gru pos de noti ciasy el correo elec tró nico.

Apre cio la ayuda que recibí de Bor land, fun da men tal mente de KendyllUppstrom, Karen Giles, Chris tine Ellis, John Kas ter, Anneke Leigh,David Inter si mone, Dale Fuller, Bill Wid mer y Char lie Cal vert.

Un agra de ci miento espe cial a Mark John son por ponerme en con tacto conWord ware cuando estaba bus cando un edi tor y ellos esta ban bus candoauto res de libros sobre Del phi.

Me gus ta ría agra de cer tam bién al autor de Del phi John Ayres y a lassiguien tes per so nas en Word ware: Kellie Hen der son, Jim Hill, Beth Koh-ler, Denise McEvoy, Diane Mue ller y Paula Price.

Por último, quiero agra de cer a las siguien tes per so nas la con tri bu ción dediver sos mate ria les: Michael Bur ton, Eric Engler, Ken Hale, Dave Klein,Wal ter Nova cek, Numega, Ata nas Sto ya nov, Bob Swart, Tur bo Po wer Soft-ware y Robert Viv rette.

xxvii

Agradecimientos

Page 28: Dsp

Sobre el autor

Clay Shan non ha gas tado muchos y varia dos som bre ros a lo largo de suvida. En su juven tud, su acti vi dad prin ci pal eran los depor tes (béis bol,fút bol y balon cesto), la música (gui ta rra rít mica y bajo eléc trico) y la foto-gra fía. Como balon ces tista, él se des cribe a sí mismo como un “pequeño,gordo y viejo Arvydas Sabo nis”. En otro tiempo un músico ávido (blues,rock, country-rock, blue grass), ahora rara vez encuen tra tiempo paratocar. Como fotó grafo, muchas de sus fotos fue ron publi ca das en revis tasy mate ria les publi ci ta rios. Ahora ni siquiera tiene ahora una cámara“decente”.

A la tem prana edad de 35, Clay des cu brió la pro gra ma ción, y nada hasido lo mismo desde enton ces. Como ante rior mente ocu rrió con la “fie brede la gui ta rra”, hoy se ha con ver tido en un rehén de la “fie bre de la codi fi-ca ción”, ya que tra baja en el desa rro llo de soft ware día y noche, tanto losdías labo ra bles como los fines de semana.

Shan non ha tra ba jado inten si va mente y exten si va mente con Del phi desdeel sur gi miento de éste. Nativo de Cali for nia (nació en Fort Bragg, cre cióen Eureka, San José y la región de la fie bre del oro del norte de Cali for-nia), reside actual mente en Coeur d’Alene, Idaho. Ha tra ba jado comoescri tor téc nico y desa rro lla dor de Del phi y Access para Infor ma tionAnywhere en Jack son, CA, y como desa rro lla dor de Del phi para Marotzen Sacra mento, CA; Soft gear en Mil wau kee, WI; John Deere en Brook-field, WI; Source Ser vi ces (Romac Inter na tio nal) en New Ber lin, WI; Stra-ta gem en Wau wa tosa, WI; y eMake (antes Smart Shop) en Post Falls, ID.Actual mente es con sul tor inde pen diente de Del phi, ins truc tor y autor(“Have Com pi ler, Will Tra vel”).

Shan non puede ser con tac tado en bclays han non@eart hlink.net.

xxviii

Sobre el autor

Page 29: Dsp

Introducción

Cómo este libro se diferencia de los demásUna exce lente colec ción de libros de Del phi está dis po ni ble en el mer cado.Pocos, sin embargo, con tie nen sufi ciente infor ma ción sobre los men sa jesde error espe cí fi cos de Del phi, qué sig ni fi can y cómo resol ver los. Ave ri-guar las cau sas y dar solu cio nes a los men sa jes de error leyendo los archi-vos de ayuda de Del phi y escu dri ñando los índi ces de los librostra di cio na les de Del phi puede ser un pro ceso que con suma mucho tiempo.

Este libro llena ese vacío y sirve como una refe ren cia rápida para imple-men tar solu cio nes rápi das a más de 800 men sa jes de error que podrá reci-bir mien tras tra baja con Del phi. Ade más, cada men saje de error seexplica con sufi ciente deta lle para que pueda enten der cómo evi tar la rea-pa ri ción del mismo pro blema en el futuro.

Los mensajes de error son sus amigosMien tras tra baja con Del phi, podrá encon trar men sa jes de error en treseta pas dis tin tas del desa rro llo: tiempo de diseño, tiempo de com pi la ción ytiempo de eje cu ción. Los erro res de tiempo de diseño y tiempo de com pi la-ción los ve el desa rro lla dor sola mente. Los erro res de tiempo de eje cu ciónpue den ser vis tos tanto por el desa rro lla dor como por el usua rio final. Loserro res de tiempo de eje cu ción no son nece sa ria mente culpa del desa rro-lla dor — aun que el desa rro lla dor debe ría con tar con la posi bi li dad de queocu rran, y codi fi car defen si va mente para anti ci par tal posi bi li dad.

Una cate go ría de error de la cual este libro no trata son los erro res lógi-cos. Los erro res lógi cos no gene ran direc ta mente men sa jes de error. Dehecho, puede que ni siquiera pro vo quen men sa jes de error indi rec ta mente(aun que los resul ta dos no sean los espe ra dos). Los erro res lógi cos pue densub sis tir inde fi ni da mente sin ser detec ta dos, y si son des cu bier tos des-pués de la implan ta ción del soft ware, lo son gene ral mente por los usua-rios fina les.

Este libro le ayu dará a deter mi nar la causa y la solu ción para los erro resde tiempo de diseño, tiempo de com pi la ción y tiempo de eje cu ción.

xxix

Introducción

Page 30: Dsp

Cuando obtenga un error de tiempo de diseño (un cua dro de men saje quele dice, a veces de forma mis te riosa, que ha hecho algo mal), con sulte estelibro para más infor ma ción.

La pri mera acción a rea li zar cuando reciba un men saje de error de tiempode com pi la ción debe ser pul sar la tecla F1 para obte ner la ayuda sen si bleal con texto de Del phi. Muchas veces esto le pro por cio nará infor ma ciónsufi ciente para resol ver rápi da mente el pro blema que ha pro du cido elmen saje de error. En los casos en que la infor ma ción no sea sufi cien te-mente clara y espe cí fica, con sulte este libro. Del phi le ayu dará a deter mi-nar la causa del error colo cando el cur sor sobre la línea de código en quese ha pro du cido el error o la situada inme dia ta mente des pués.

Si está expe ri men tando un error de tiempo de eje cu ción, con sulte estelibro para obte ner una expli ca ción. Adi cio nal mente, las teclas F4, F7 y F8resul tan úti les de cara a la depu ra ción. Si tiene acti vada la opción Breakon Excep tion (selec cione Tools | Envi ron ment Options, y com pruebeque la casi lla de veri fi ca ción Break on Excep tion en la sec ción Debug-ging de la página Pre fe ren ces esté mar cada), Del phi deberá mos trarleel lugar del código donde se ha pro du cido el error. Colo que el cur sor unpoco antes de este sitio, y pulse la tecla F4 para eje cu tar hasta la posi cióndel cur sor. El pro grama se eje cu tará hasta que alcance ese sitio, y haráuna parada. Enton ces usted podrá sal tar a tra vés del código de línea enlínea uti li zando las teclas F7 (Trace Into) ó F8 (Step), eva luando el estadodel pro grama y los valo res de las varia bles a lo largo de la eje cu ción. Paramás infor ma ción, con sulte “debug ger” en la ayuda de Del phi.

Cómo encontrar mensajes de error específicos en este libroPor lo gene ral, loca li zar infor ma ción en este libro es muy sim ple, ya quelos men sa jes de error se pre sen tan en orden alfa bé tico. Por ejem plo, paraencon trar la dis cu sión rela cio nada con el men saje de error “A CoC lassmust have at least one default inter face”, sim ple mente bús quelo enla tabla de con te nido, situada al ini cio del libro (entre “A class named <>is already ins ta lled” y “A CoC lass must imple ment at least oneinter face”, para ser más exac tos).

Men sa jes de error que con tie nen va ria blesAlgu nos men sa jes de error son diná mi cos o están para me tri za dos, ya quesu redac ción exacta será dife rente de acuerdo con la situa ción espe cí ficacon la que esté tra tando. Por ejem plo, el men saje lis tado en este librocomo “Pac kage <> already con tains unit <>” con tiene dos varia bles,que depen den del paquete al que se está inten tando aña dir una uni dad yel nom bre de la uni dad que ya existe en ese paquete. Si el paquete al que

xxx

Introducción

Page 31: Dsp

está inten tando aña dir una uni dad es dclusr40.dpk, y la uni dad que estáinten tando aña dir es XProcs.PAS, pero de hecho esa uni dad ya ha sidoaña dida al paquete, el men saje de error será “Pac kage dclusr40.dpkalready con tains unit XProcs.PAS”.

Esto no debe ría ser un pro blema a la hora de loca li zar un men saje,excepto qui zás en el caso en que una varia ble se encuen tre al ini cio de unmen saje de error. Aún así, esto no es un gran obs táculo si toma con cien ciadel hecho de que el ini cio del men saje de error podría ser una varia ble.Por ejem plo, si recibe el men saje de error “; expec ted but END found”,podría ser un poco con fuso saber exac ta mente dónde encon trar la dis cu-sión sobre ese men saje de error en este libro. Aún cuando sepa dónde estásituado el punto y coma en el orden alfa bé tico, no encon trará el men sajede error en ese lugar, ya que el men saje de error con tiene varia bles. Si seda cuenta, sin embargo, de que este men saje de error puede des ple garsebajo diver sas cir cuns tan cias, sabrá que debe bus carlo bajo “<> expec tedbut <> found”.

La mora leja de todo lo dicho ante rior mente es la siguiente: si no estáseguro de qué parte de un men saje de error puede ser varia ble, bus quepri mero el men saje de error exacto por orden alfa bé tico; si no puede loca-li zarlo uti li zando ese método, bús quelo a lo largo de la sec ción de la tablade con te nido donde se ubi can los men sa jes de error que comien zan conuna varia ble (<>).

Men sa jes de error en cap su la dosAlgu nas veces Del phi le dará un men saje de error muy largo que encap-sula un men saje de error más espe cí fico en su inte rior. Por ejem plo, podráobte ner un error como: “Pro ject <> rai sed excep tion class EClass Not-Found with mes sage ‘Class <> not found. Pro cess stop ped’”. Encasos como éste, bus que el men saje de error más interno (en este caso“Class <> not found”).

De la misma forma, si el men saje de error comienza con “Fatal Error”,“Run-time Error”, “I/O Error”, “Error in Module <>” u otra cate go ríade error gené rica, bus que el men saje de error más espe cí fico que sigue ala cla si fi ca ción gene ral. Por ejem plo, si obtiene el men saje “Fatal Error<>: Requi red Pac kage <> not found”, bús quelo bajo “Requi red Pac-kage <> not found”.

Cuando hay muchas causas potenciales para el mismo errorAlgu nos men sa jes de error pue den ser pro vo ca dos por más de una accióncla ra mente defi nida. En muchos de esos casos, las dife ren tes cau saspoten cia les del men saje de error son enu me ra das y dis cu ti das

xxxi

Introducción

Page 32: Dsp

sepa ra da mente en las tres sec cio nes que com po nen cada entrada (‘Po si blecausa de error’, ‘So lu ción rápi da’ e ‘Infor ma ción adi cio nal’).En tales casos, haga corres pon der el número en la sec ción ‘Po si ble causade error’ con su corres pon diente dis cu sión en la sec ción ‘So lu ción rápi da’(en oca sio nes, cier tas cau sas de error espe cí fi cas se dis cu ten tam bién indi-vi dual mente en la sec ción ‘Infor ma ción adi cio nal’).

Cuando necesite más informaciónHabrá oca sio nes en las que deseará infor ma ción más deta llada que la con-te nida en este libro. Afor tu na da mente, exis ten nume ro sos recur sos a dis-po si ción de los pro gra ma do res de Del phi, tales como publi ca cio nesperió di cas, gru pos de usua rios, gru pos de noti cias de Inter net, sitios web,y por supuesto, otros libros que puede encon trar en www.dany press.com.

Aquí están algu nos de los mejo res recur sos dis po ni bles en cada cate go ría:

Pu bli ca cio nesImpre sas

Del phi Deve lo pers Jour nal

Visite su sitio web en http://www.cobb.com/ddj para obte ner artícu los deejem plo, infor ma ción de sus crip ción, etc.

The Del phi Infor mant Maga zine

Visite su sitio web en http://www.delp hi zine.com para obte ner artícu los deejem plo, com po nen tes free ware, infor ma ción de sus crip ción, etc.

The Del phi Maga zine

Visite su sitio web en http://www.ite cuk.com/dmag/ para obte ner artícu losde ejem plo, com po nen tes free ware, infor ma ción de sus crip ción, etc.

Elec tró ni cas

Bole tín infor ma tivo Dany soft. Puede sucri birse, y tam bién des car garartícu los, infor ma ción y recur sos desde http://www.dany soft.com

UNDU (Unof fi cial News let ter of Del phi Users). Puede sus cri birse, y tam-bién des car gar todas las edi cio nes ante rio res de UNDU de su sitio web:Http://www.undu.com

Si tios web de di ca dos a Del phiExiste una gran can ti dad de sitios web exce len tes dedi ca dos a Del phi.Aquí se lis tan algu nos de ellos, desde los cua les podrá conec tarse a otros:

xxxii

Introducción

Page 33: Dsp

http://www.bor land.com/del phi/http://www.dany soft.com/http://SunSITE.icm.edu.pl/del phi/http://www.delp hi32.comhttp://www.delp hi cor ner.f9.co.ukhttp://www.chami.com/tips/del phi/http://www.mindspring.com/~city zoo/city zoo.htmlhttp://www.adv delp hisys.comhttp://www.drbob42.comhttp://www.icss.net/~nhod geshttp://www.bor land.com/code cen tralhttp://www.bor land.com/dev sup porthttp://www.efg2.com/Lab/Library/Del phi/IO/IORe sult.htm

Para obte ner una lista de otros sitios dedi ca dos a Del phi, visite:

http://www.bor land.com/del phi/

y

www.undu.com (siga el enlace “Del phi links”)

Se puede acce der al sitio web de Bor land direc ta mente desde Del phi 3 ysupe rio res (si tiene un nave ga dor ins ta lado y una cuenta de Inter net)selec cio nando Help | Bor land Home Page o Help | Del phi HomePage.

Gru pos de no ti cias de Inter netHe aquí algu nos gru pos de noti cias de Inter net rela cio na dos con Del phi:

alt.lang.del phicomp.lang.pas cal.del phi.data ba sescomp.lang.pas cal.del phi.misccomp.lang.pas cal.del phi.com po nents.misccomp.lang.pas cal.del phi.com po nents.usagecomp.lang.pas cal.del phi.com po nents.wri ting

Y éstos son algu nos de los gru pos de noti cias sobre Del phi de Bor land:

bor land.public.del phi.object pas calbor land.public.del phi.data base.desk topbor land.public.del phi.data base.sqlser versbor land.public.del phi.idebor land.public.del phi.com po nents.using

xxxiii

Introducción

Page 34: Dsp

bor land.public.del phi.multi-tierbor land.public.del phi.winapibor land.public.del phi.inter net

Para obte ner un lista com pleta y actua li zada de los gru pos de noti ciassobre Del phi de Bor land, visite http://www.bor land.com

Gru po de no ti cias/si tio webEn una cate go ría espe cial debe mos incluir el sitio web de Tama rack Asso-cia tes (www.tama racka.com). Este sitio man tiene un archivo actua li zadode todos los men sa jes envia dos a los gru pos de noti cias de Bor land, y per-mite hacer sobre ellos bús que das de pala bras espe cí fi cas, fra ses, frag men-tos de código, sig na tu ras de méto dos, etc.

Gru pos de Usua rios de Del phiVisite http://www.bor land.com/pro grams/user groups/uglist.html#Del phi,donde podrá encon trar el Grupo de Usua rios de Del phi más cer cano a Ud.

Otros li brosLos Tomos de Del phi: “Algo rít mos y estruc tu ras de datos” por JulianBuck nall.Pro gra ma ción COM en Del phi por Eric Har mon.Los Tomos de Del phi: “API grá fico Win 32” por John Ayres y otros.Los Tomos de Del phi: “Núcleo del API Win 32” por John Ayres y otros.201 Prin ci ples of Soft ware Deve lop ment por Alan M. Davis.Code Com plete por Scott McCon nell.Del phi Com po nent Design por Danny Thorpe.Del phi Deve lo per’s Hand book por Marco Cantu, Tim Gooch y John Lam.Del phi in a Nuts hell por Ray Lis chner.Del phi Pro gram ming Pro blem Sol ver por Neal Ruben king.Del phi X Deve lo per’s Guide por Steve Tei xeira y Xavier Pacheco.Del phi X Unleas hed por Char les Cal vert.Mas te ring Del phi X por Marco Cantu.Teach Your self Del phi in 21 Days por Kent Reis dorph

Otra fuente impor tante es la docu men ta ción de Bor land (inclu yendo losFAQs y TIs en el CD de Del phi) y los pro gra mas de ejem plo (situa dos pordefecto en C:\Archi vos de pro grama\Bor land\Del phi X\Demos yC:\Archi vos de pro grama\Del phi X\Help\Exam ples).

xxxiv

Introducción

Page 35: Dsp

Mensajes de error

“.” ExpectedPo si ble cau sa de error

Puede haber asig nado un objeto o una clase a una varia ble. Por ejem plo, si elnom bre de la uni dad es BigU nit, lo siguiente gene rará este error:

pro ce du re TForm1.Wha te verC lick(Sen der: TObject);var Dia mond back Pit cher: String;be gin Dia mond back Pit cher := BigU nit;end;

So lu ción rá pi daCam bie el nom bre de la varia ble. En el contexto mos trado anteriormente, unacadena debe ría ser asig nada a la varia ble, así:

pro ce du re TForm1.Wha te verC lick(Sen der: TObject);var Dia mond back Pit cher: String;be gin Dia mond back Pit cher := 'BigU nit';end;

Infor ma ción adi cio nalCuando se intenta asig nar un nom bre de clase a una varia ble, el com pi la dorestará espe rando encon trar un punto y una pro pie dad de la clase de un tipoade cuado a con ti nua ción del nom bre de la clase.

Uti lice nom bres des crip ti vos para todos los iden ti fi ca do res — for mu la rios, uni-da des, com po nen tes, varia bles y cons tan tes.

$2109 Cannot initialize the BDEPo si ble cau sa de error

Puede haber dis tri buido uti li zando Install Shield Express una apli ca ción quenece sita el BDE, pero la entrada reque rida no ha sido aña dida al Regis tro deWin dows.

Mensajes de error 1

Page 36: Dsp

So lu ción rá pi daIntro duzca el camino de IDAPI32.DLL en la siguiente clave del Regis tro:HKEY_LOCAL_MACHINE\SOFTWARE\BORLAND\DATABASEENGINE\DLLPATH.

El valor usual de esta entrada es: \Bor land\Com mon files\BDE.

Infor ma ción adi cio nalPuede que la entrada reque rida esté ausente sola mente en el Regis tro de lamáquina en la que se rea liza la distribución de una apli ca ción.

Para acce der a RegE dit (el edi tor del Regis tro), selec cione Ini cio| Eje cu tar,escriba rege dit, y pulse el botón Acep tar.

$DENYPACKAGEUNIT <> cannot be put into a packagePo si ble cau sa de error

Puede estar inten tando colo car una uni dad com pi lada con la direc tiva$DENYPACKAGEUNIT den tro de un paquete.

So lu ción rá pi daEli mine la direc tiva de com pi la dor {$DENYPACKAGEUNIT ON} de la uni dado cám biela a {$DENYPACKAGEUNIT OFF}.

Infor ma ción adi cio nalEste men saje de error es único para Del phi 3 y pos te rio res, ya que Del phi 1 y 2no uti li zan paque tes.

La direc tiva de com pi la dor {$DENYPACKAGEUNIT ON} prohibe que la uni-dad que la con tiene pueda ser colo cada en un paquete.

{$DENYPACKAGEUNIT OFF} es la con fi gu ra ción por defecto.

$DESIGNONLY and $RUNONLY both specifiedPo si ble cau sa de error

Puede haber uti li zado las direc tivas de com pi la dor $DESIGNONLY y$RUNONLY al mismo tiempo. Estas direc ti vas pro veen una fun cio na li dadopuesta, por lo que no pue den ser espe ci fi ca das simultáneamente.

2 Los Tomos de Delphi: Delphi sin problemas

Page 37: Dsp

So lu ción rá pi daEli mine una o ambas direc ti vas de com pi la dor del archivo fuente dondeapa re cen.

Infor ma ción adi cio nalAmbas direc ti vas de com pi la dor están desac ti va das (off) por defecto. Puedenser acti va das (on) o desac ti va das (off) de la siguiente manera:

{$DESIGNONLY ON} o {$DESIGNONLY OFF}{$RUNONLY ON} o {$RUNONLY OFF}

El valor por defecto para ambas direc ti vas de com pi la dor es desac ti vado (off).En rea li dad, ambas direc ti vas de com pi la dor pue den ser espe ci fi ca das simul tá-nea mente, pero si es así, al menos una de ellas debe estar desac ti vada (que esde todas for mas su estado por defecto).

La direc tiva de com pi la dor {$DESIGNONLY ON} oca siona que el archivo depaquete (archivo .DPK) en el que ésta apa rece sea com pi lado para su ins ta la-ción den tro del entorno inte grado de Del phi.

La direc tiva de com pi la dor {$RUNONLY ON} oca siona que el paquete (archivo.DPK) sea com pi lado como un paquete de tiempo de eje cu ción sola mente.

Uti lice ambas direc ti vas de com pi la dor $DESIGNONLY y $RUNONLY sola-mente en archi vos .DPK.

$DESIGNONLY and $RUNONLY only allowed in package unitPo si ble cau sa de error

Puede haber incluido la direc tiva de com pi la dor $DESIGNONLY o$RUNONLY (o ambas) en un archivo fuente que no es un archivo de paquete(.DPK).

So lu ción rá pi daEli mine estas direc ti vas de com pi la dor del archivo fuente donde apa re cen.

Infor ma ción adi cio nalEstas direc ti vas de com pi la dor afec tan la forma en que el entorno inte grado deDel phi trata una DLL que con tiene un paquete. Por esa razón, sola mente pue-den estar con te ni das en archi vos fuente de paque tes (.DPK).

Mensajes de error 3

Page 38: Dsp

$WEAKPACKAGEUNIT & $DENYPACKAGEUNIT both specifiedPo si ble cau sa de error

Puede haber espe ci fi cado ambas direc ti vas de com pi la dor$WEAKPACKAGEUNIT y $DENYPACKAGEUNIT en el mismo archivofuente.

So lu ción rá pi daEli mine una o ambas direc ti vas de com pi la dor del archivo fuente dondeapa re cen.

Infor ma ción adi cio nalSi la direc tiva de com pi la dor {$WEAKPACKAGEUNIT ON} apa rece en unarchivo de uni dad, el com pi la dor omite esa uni dad de los .DPLs (las biblio te casde paque tes de Del phi) si es posi ble.

No uti lice la direc tiva de com pi la dor {$WEAKPACKAGEUNIT ON} en una uni-dad que con tenga varia bles glo ba les, sec cio nes Ini tia li za tion o sec cio nesFina li za tion.

$WEAKPACKAGEUNIT <> cannot have initialization or finalizationcode

Po si ble cau sa de errorPuede haber uti li zado la direc tiva de com pi la dor $WEAKPACKAGEUNIT enuna uni dad que tam bién con tiene una sec ción Ini tia li za tion o sec cio nesInitializa tion y Fina li za tion.

So lu ción rá pi daEli mine la direc tiva de com pi la dor $WEAKPACKAGEUNIT o las sec cio nesInitia li za tion/Fina li za tion.

Infor ma ción adi cio nalLa razón para que una uni dad que incluye la direc tiva de com pi la dor$WEAKPACKAGEUNIT no pueda con te ner código de ini cia li za ción o fina li za-ción (o datos glo ba les, en rea li dad) es que poten cial mente podrían apa re cermúl ti ples copias de las mis mas uni da des débil mente empa que ta das en lamisma apli ca ción.

4 Los Tomos de Delphi: Delphi sin problemas

Page 39: Dsp

Una uni dad puede tener una sec ción Ini tia li za tion sin una sec ción Fina li za-tion, pero no lo contrario. Si nece sita esta última pero no la pri mera, puedesim ple mente decla rar una sec ción Ini tia li za tion vacía, así:

ini tia li za tion // Nada !!!

fi na li za tion {Sa car el gato fue ra, ce rrar la puer ta, apa gar las lu ces, dar las bue nas no ches}

$WEAKPACKAGEUNIT <> contains global dataPo si ble cau sa de error

Puede haber uti li zado la direc tiva de com pi la dor $WEAKPACKAGEUNIT enuna uni dad que tam bién con tiene datos glo ba les.

So lu ción rá pi daEli mine la direc tiva de com pi la dor $WEAKPACKAGEUNIT o los datosglo ba les.

Infor ma ción adi cio nalLa razón para que una uni dad que incluye la direc tiva de com pi la dor$WEAKPACKAGEUNIT no pueda con te ner código de ini cia li za ción o fina li za-ción (o datos glo ba les, en rea li dad) es que poten cial mente podrían apa re cermúl ti ples copias de las mis mas uni da des débil mente empa que ta das en lamisma apli ca ción.

‘;’ not allowed before ‘Else’Po si ble cau sa de error

Puede haber colo cado un punto y coma justo antes de la pala bra reser vadaElse en una sen ten cia If.

So lu ción rá pi daEli mine el punto y coma.

Infor ma ción adi cio nalUn punto y coma sig ni fica el final de una sen ten cia If. Por ejem plo, el siguienteejem plo gene rará el men saje de error bajo dis cu sión:

Mensajes de error 5

Page 40: Dsp

if SunIsShi ning then Play Ba se ball; {cau sa el error}else Play Bas ket ballIndoors;

La forma correcta de hacer esto es:

if SunIsShi ning then Play Ba se ball {sin pun to y coma, no hay error}else Play Bas ket ballIndoors;

<> already existsPo si ble cau sa de error

Está inten tando aña dir como miem bro de un objeto de auto ma ti za ción o biblio-teca de tipos un pro ce di miento, fun ción o pro pie dad que ya está declarada.

So lu ción rá pi daEli mine la segunda decla ra ción del pro ce di miento, fun ción o pro pie dad.

Infor ma ción adi cio nalSe debe tener abierto un pro yecto para crear un objeto de auto ma ti za ción.

<> can’t be added to this package because another file with thesame base name (<>) is already in the directory of the package

Po si ble cau sa de errorEstá inten tando inser tar en un paquete un archivo que ya existe o que tiene elmismo nom bre de un archivo ya incluido en el paquete.

So lu ción rá pi daSi el archivo ya está con te nido en el paquete, no intente aña dirlo de nuevo. Siquiere incor po rar al paquete una nueva ver sión del archivo, eli mine pri mero elarchivo ori gi nal. Si el archivo difiere en fun cio na li dad pero tiene el mismonom bre (y los nece sita a ambos), renom bre el que está inten tando añadir eintén telo de nuevo.

6 Los Tomos de Delphi: Delphi sin problemas

Page 41: Dsp

Infor ma ción adi cio nalLos paque tes apa re cie ron con Del phi 3. Hay dos tipos de paque tes: de tiempode diseño y de tiempo de eje cu ción. Para más deta lles, con sulte “pac ka ges” enla ayuda de Del phi.

<> clause not allowed in interface typePo si ble cau sa de error

Puede estar uti li zando en una decla ra ción de inter faz una cláu sula que no esválida para las inter fa ces. Por ejem plo, lo siguiente gene rará este men saje deerror, debido a que la cláu sula Sto red se uti liza para alma ce nar (o no) el valorde un campo en un archivo .DFM de for mu la rio, y no puede estar pre sente enuna pro pie dad de interfaz:

type IXMLDOMDe loui seIm ple men ta tion = in ter fa ce(IDis patch) ['{2933BF8F-8B36-11D2-B20E-00C04F983E60}'] func tion has Fea tu re(const fea tu re: Wi deS tring; const ver sion: Wi deS tring): Word Bool; sa fe call; func tion JR: Inte ger; pro ce du re Orvi lleAn dWil bur(iC hihuahua: Inte ger); pro perty Va lues KeepSkyroc ke ting: Inte ger read JR wri te Orvi lleAn dWil bur sto red Fal se; end;

So lu ción rá pi daEli mine de la decla ra ción de inter faz la cláu sula cul pa ble (en el caso de arriba,la direc tiva Sto red).

Infor ma ción adi cio nalLas inter fa ces son simi la res en cierto modo a las cla ses abs trac tas; ellas noimple men tan sus pro pios méto dos. Se dife rencian en que no pro veen alma ce na-miento para las pro pie da des. No hay cam pos de datos en una inter faz. Unaclase con creta debe imple men tar la inter faz; una clase puede imple men tarmúl ti ples inter fa ces. Para más infor ma ción, con sulte “imple ments” en la ayudade Del phi.

<> directive not allowed in interface typePo si ble cau sa de error

Puede estar uti li zando en una decla ra ción de inter faz una direc tiva que no esválida para inter fa ces. Por ejem plo, lo siguiente gene rará este men saje de error

Mensajes de error 7

Page 42: Dsp

debido a que Pri vate se uti liza en las cla ses de Del phi como espe ci fi ca dor devisi bi li dad, y no es apli ca ble a tipos de inter faz:

type IXMLDOMi nic Sar di naIm ple men ta tion = in ter fa ce(IDis patch) ['{2933BF8F-9B36-11D2-B20E-00C04F983E60}'] pri va te func tion Troia no(const fea tu re: Wi deS tring; const ver sion: Wi deS tring): Word Bool; sa fe call; func tion Ger man No vel: Inte ger; pro ce du re Ri chard(iC hi ca go: Inte ger); pro perty Va lues KeepSkyroc ke ting: Inte ger read Ger man No vel wri te Ri chard; end;

So lu ción rá pi daEli mine de la decla ra ción de interfaz la direc tiva res pon sa ble (en el caso dearriba, la direc tiva Pri vate).

Infor ma ción adi cio nalLas inter fa ces no sopor tan nin gún iden ti fi ca dor de visi bi li dad. Con sulte “imple-ments” en la ayuda de Del phi para más infor ma ción sobre la imple men ta ciónde inter fa ces en las cla ses de Del phi.

<> expected but <> foundPo si ble cau sa de error

1. Basado en el código ante rior, el com pi la dor estaba espe rando encon traruna cosa, pero se le ha pro por cio nado algo ines pe rado. Por ejem plo, puedehaber tra tado de hacer una asig na ción uti li zando el signo igual (=), comoen BASIC, en lugar de dos pun tos igual (:=), escri biendo algo pare cido a:

ActiveControl = btnClose;

2. Puede haber omi tido algo nece sa rio, como por ejem plo la pala bra reser vadaEnd en una sen ten cia Case.

So lu ción rá pi da1. Reem place el ele mento encon trado por uno ade cuado.2. Añada el ele mento omi tido.

Infor ma ción adi cio nal1. Si viene a Del phi/Object Pas cal de un len guaje que, como Visual Basic, uti-

liza el sím bolo = como ope ra dor de com pa ra ción (igual dad) y como sím bolo

8 Los Tomos de Delphi: Delphi sin problemas

Page 43: Dsp

de asig na ción, ten drá que cam biar su manera de pen sar. En Object Pas cal,= se uti liza sólo para la com pa ra ción y debe pro du cir un resul tado de tipoBoo lean (True o False). Por ejem plo, las dos siguien tes sen ten cias que uti li-zan el ope ra dor = son váli das, ya que ambas pro du cen resul ta dos Boo lean.

if ActiveControl = btnClose then Bat tenT he Hat ches := (ActiveControl = btnClose);

<> has no index for fields <>Po si ble cau sa de error

1. Puede estar inten tando cam biar el índice de una tabla a un índice que noexiste a tra vés de la pro pie dad Index Field Na mes, ya sea direc ta mente entiempo de diseño o en el código en tiempo de eje cu ción. Por ejem plo, lasiguiente línea:

Table1.IndexFieldNames := ‘PeanutGallery’;

pro vo cará este error si la tabla no tiene un índice sobre el campoPea nut Ga llery.

2. Puede haber cam biado la pro pie dad Table Name de un com po nente TTa ble,y el valor de la pro pie dad Index Field Na mes estaba asig nado para la tablaante rior.

So lu ción rá pi da1. Cree el índice antes de inten tar asignarlo.2. Borre el valor de la pro pie dad Index Field Na mes o cám bielo a uno apro-

piado para la tabla actual.

Infor ma ción adi cio nal1. El código que pro voca este error com pi lará, debido a que hasta donde el

com pi la dor sabe, usted podrá crear el índice mediante código antes deactivarlo. En otras pala bras, el error se detec tará sola mente en tiempo deeje cu ción.Para crear un índice mediante código (lo con tra rio de hacerlo durante lacrea ción de la tabla), uti lice el pro ce di miento AddIndex.Las pro pie da des Index Field Na mes e Index Name son mutua mente exclu si-vas. Cuando se asigna un valor a una, el valor de la otra es borrado.

Mensajes de error 9

Page 44: Dsp

<> has the descendent <> in the Repository and therefore cannotbe removed

Po si ble cau sa de errorPuede haber here dado de un objeto del Alma cén de Obje tos (Object Repo si-tory), haber luego aña dido el objeto here dado al Alma cén (pre su mi ble mentedes pués de hacerle algunos cam bios), y ahora intenta eli mi nar el objeto ori gi-nal del cual ha here dado.

So lu ción rá pi daSi real mente desea eli mi nar un objeto del Almacén, debe pri mero eliminarcual quier otro objeto que herede alguna fun cio na li dad de él.

Infor ma ción adi cio nalEste men saje de error es cau sado por lo que se conoce en el mundo de las basesde datos como inte gri dad refe ren cial. No se puede borrar un regis tro maes trodel que depen den otros regis tros. La situa ción es simi lar aquí, ya que el objetohere dado en el Alma cén depende del objeto que se pre tende eliminar.

<> is a read-only filePo si ble cau sa de error

1. Está inten tando modi fi car un archivo que es de sólo lec tura.2. Puede estar inten tando gra bar un archivo .PAS mien tras tra baja con un

sis tema de con trol de ver sio nes (como PVCS) sin haber mar cado (check out)el archivo.

So lu ción rá pi da1. Puede cam biar el atri buto de sólo lec tura del archivo de True a False uti li-

zando el Explorador de Win dows u otro pro grama de mani pu la ción dearchi vos. En el Explo rador, siga estos pasos:a. Localice el archivo y pulse sobre él con el botón derecho del ratón.

b. Si la casilla de verificación de sólo lectura está activada, pulse sobreella para desmarcarla.

2. Mar que (check out) el archivo e intente gra barlo de nuevo. Ase gúrese de nohaber mar cado el archivo en modo de sólo lec tura.

10 Los Tomos de Delphi: Delphi sin problemas

Page 45: Dsp

Infor ma ción adi cio nal1. Com pruebe que real mente quiere modi fi car el archivo. Puede ser que se

haya defi nido como de sólo lec tura (por usted u otra per sona) por unabuena razón.

2. Si ha rea li zado una modi fi ca ción que afecta al archivo .DFM (como habercam biado una pro pie dad del for mu la rio o sus hijos), la pre sen cia de unarchivo .DFM tam bién mar cado (chec ked out) será nece saria cuando segra ben los cam bios a un archivo .PAS.

<> is a reserved wordPo si ble cau sa de error

Puede estar inten tando uti li zar una pala bra reser vada de Object Pas cal paranom brar a un iden ti fi ca dor.

So lu ción rá pi daRenom bre el iden ti fi ca dor. Dé al iden ti fi ca dor un nom bre sig ni fi ca tivo (lo quehará el código más fácil de leer y depu rar), comenzando ya sea con una letra oun guión bajo y con ti nuando des pués con cual quier com bi na ción de letras,dígitos y guio nes bajos.

Infor ma ción adi cio nalDel phi/Object Pas cal reserva las siguien tes pala bras para su pro pio uso:

Palabras reservadas de Object Pascal

and, array, as, asm, begin, case, class, const, cons truc tor, des truc tor, dis pin ter-face, div, do, downto, else, end, except, exports, file, fina li za tion, finally, for,func tion, goto, if, imple men ta tion, in, inhe ri ted, ini tia li za tion, inline, inter face,is, label, library, mod, nil, not, object, of, or, out, pac ked, pro ce dure, pro gram,pro perty, raise, record, repeat, resour ces tring, set, shl, shr, string, then,thread var, to, try, type, unit, until, uses, var, while, with, xor.

Aun que Del phi no impide hacerlo, es acon se ja ble no nom brar los iden ti fi ca do-res mediante alguna de las siguien tes direc ti vas de Object Pas cal:

Directivas de Object Pascal

abso lute, abs tract, assem bler, auto ma ted, cdecl, con tains, default, dis pid, dyna-mic, export, exter nal, far, for ward, imple ments, index, mes sage, name, near,node fault, over load, ove rride, pac kage, pas cal, pri vate, pro tec ted, public,publis hed, read, rea donly, regis ter, rein tro duce, requi res, resi dent, safe call,stdcall, sto red, vir tual, write, wri teonly.

Mensajes de error 11

Page 46: Dsp

El len guaje no hace dis tin ción entre mayús cu las y minús cu las en los iden ti fi ca-do res y directivas.

<> is already in the Repository. Replace it?Po si ble cau sa de er ror

Puede estar inten tando aña dir al Alma cén de Obje tos un objeto que ya existe.

So lu ción rá pi daPulse el botón Can cel.

Infor ma ción adi cio nalLos obje tos en el Alma cén pue den ser com par ti dos entre desa rro lla do res y pro-yec tos. Si añade un objeto del Alma cén a un pro yecto, tiene tres posi bi li da des:copiar, here dar o uti li zar. Si hace una copia del objeto, obten drá una copiainde pen diente, sin cone xión con el ori gi nal que reside en el Almacén. Si heredadel objeto del Alma cén, los cam bios futu ros que se hagan al objeto del Alma cénse refle ja rán en su objeto. Si decide usar direc ta mente el objeto, estará tra ba-jando sobre la copia ori gi nal en el Almacén - los cam bios que haga sobre elobjeto se refle ja rán en todos los obje tos que sean here da dos de él.

Para más infor ma ción, con sulte “sha ring objects in a team envi ron ment” en laayuda de Del phi.

<> is already in use by <>Po si ble cau sa de error

1. Puede estar inten tando ver o edi tar la estruc tura de una tabla de base dedatos en el Data base Desk top o eje cu tar alguna otra ope ra ción (o uti li dad,como las deno mina el Data base Desk top) mien tras la tabla está abiertatoda vía.

2. Puede ser que uno o más com po nen tes TTa ble o TData base estén abier tosen el entorno de desa rro llo de Del phi.

So lu ción rá pi da1. Cie rre el Data base Desk top, si tiene la tabla en cues tión abierta.2. Cie rre la(s) tabla(s), asig nando False a la pro pie dad Active de los com po-

nen tes TDa ta set (TTa ble, TQuery y TSto redP roc en todas las ver sio nes deDel phi; TClient Da ta set en las ver sio nes Cliente/Servi dor de Del phi 3 enade lante; TNes ted Ta ble a par tir de Del phi 4), y False a la pro pie dadConnec ted de los com po nen tes TDa tabase.

12 Los Tomos de Delphi: Delphi sin problemas

Page 47: Dsp

Infor ma ción adi cio nalSi ha expe ri men tado una ter mi na ción anor mal de la apli ca ción (o una caída delsis tema), puede que sea nece sa rio salir y luego rei ni ciar Del phi antes de poderacce der a la tabla para uso exclu sivo.

<> is an invalid filenamePo si ble cau sa de error

Puede haber asig nado para un nom bre de archivo una exten sión que no es ade-cuada para el tipo de archivo con el cual está tra ba jando.

So lu ción rá pi daBorre la exten sión, de modo que la exten sión apro piada sea aña dida auto má ti-ca mente, o cam bie la exten sión por una apro piada.

Infor ma ción adi cio nalUn ejem plo de acción que podría cau sar este error es si está uti li zando el Acti-veX Con trol Wizard (Asis tente de con troles Acti veX) y está inten tando gra barel nom bre del pro yecto con una exten sión dife rente de .DPR.

Win dows y Del phi depen den de las exten sio nes de los nom bres de archivospara saber qué tipo de infor ma ción éstos con tie nen y por tanto cómo deben sertra tados. Si cam bia la exten sión de un archivo, la máquina no tiene forma desaber si es un archivo de texto, un archivo fuente, un archivo objeto, unarchivo de pro yecto, un archivo eje cu ta ble, etc. (a menos que espe ci fi que la aso-cia ción usted mismo).

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

Po si ble cau sa de errorPuede haber tra tado de asig nar a la pro pie dad PageIn dex de un com po nenteTTabS heet un valor de índice de página que no existe. Por ejem plo, puedehaber escrito un código simi lar a este:

TabS heet1.Pa geIn dex := 3;

cuando hay sola mente tres pági nas (con índi ces 0, 1, y 2, pero no 3).

Mensajes de error 13

Page 48: Dsp

So lu ción rá pi daCam bie el índice de página a asignar por uno que exista, o cree una nuevapágina en el Edi tor de For mu la rios (Form Edi tor) o en el código antes de hacerla asig na ción.

Infor ma ción adi cio nalEste error no será detec tado en tiempo de com pi la ción, debido a que el com pi la-dor supone que la página podrá ser creada en el código antes de ser acti vadamediante un código simi lar al de arriba.

<> is not a type identifierPo si ble cau sa de error

Puede haber uti li zado un tipo de datos que no existe en un pro ce di miento ofun ción. En todo caso, se espe raba un iden ti fi ca dor de tipo en el lugar dondeocu rrió el error, pero un nom bre de tipo reco no cido no fue encon trado allí.

So lu ción rá pi daAse gú rese de que ha escrito el nom bre del tipo correc ta mente.

Infor ma ción adi cio nalUn ejem plo de cuándo se podría obte ner este men saje de error es si se está tra-tando de escri bir una ver sión más corta de un tipo de datos. Por ejem plo,podría inten tar esto:

vars: Str; {se debe de cla rar string, no str}i: Int; {se debe de cla rar in te ger, no int}tidy: Bool; {sin em bar go, esto está bien ...}wooly: Boo lean; {...al igual que la for ma lar ga}

<> is not a unique namePo si ble cau sa de error

Puede haber inten tado asig nar un nom bre que ya existe a una base de datosmediante el Data base Explo rer o SQL Explo rer (en la edi ción Enter prise deDel phi).

So lu ción rá pi daAsigne nom bres úni cos a todos los alias de bases de datos.

14 Los Tomos de Delphi: Delphi sin problemas

Page 49: Dsp

Infor ma ción adi cio nalTodas las cosas deben tener nom bres úni cos para ser iden ti fi ca das correcta yabso lu ta mente. Las per so nas, por ejem plo, tie nen nom bres que per mi ten dis-tin guir a unos de otros. Si dos nom bres coin ci den hasta un cierto nivel de deta-lle (por ejem plo, si tanto el nom bre como el pri mer ape llido coin ci den), enton cesse debe con ti nuar con otro nivel de deta lle, tal como el segundo ape llido, lafecha de naci miento, etc. para que de una manera única y pre cisa se puedaiden ti fi car a una per sona. Los alias de bases de datos deben iden ti fi carse demanera única, y de hecho el meca nismo es mucho más sim ple que en el caso delos seres huma nos. Si un nom bre de alias tiene una sílaba y es único, eso essufi ciente.

<> is not a valid component namePo si ble cau sa de error

Puede haber asig nado a un com po nente un nom bre que no es per mi tido en ellen guaje Object Pas cal.

So lu ción rá pi daAsigne al com po nente un nom bre que se adhiera a las siguien tes reglas: Debe comenzar con una letra o un caracter de guión bajo (_). Los caracteres siguientes deben ser letras, números o el caracter de guión

bajo. No utilice una palabra reservada de Object Pascal para nombrar un

componente. Las palabras reservadas de Object Pascal son:and, array, as, asm, be gin, case, class, const, cons truc tor, des truc tor, dis-pin ter fa ce, div, do, down to, else, end, ex cept, ex ports, file, fi na li za tion,fi nally, for, func tion, goto, if, im ple men ta tion, in, in he ri ted, ini tia li za tion,in li ne, in ter fa ce, is, la bel, li brary, mod, nil, not, ob ject, of, or, out, pac ked,pro ce du re, pro gram, pro perty, rai se, re cord, re peat, re sour ces tring, set, shl,shr, string, then, thread var, to, try, type, unit, un til, uses, var, whi le, with,xor.

Infor ma ción adi cio nalPor defecto, Del phi asigna a los obje tos nom bres secuen cia les basa dos en eltipo del com po nente, tales como But ton1, But ton2, Timer1, etc. Para hacer elcódigo más legi ble (y de fácil man te ni miento), cam bie esos nom bres por otrosmás sig ni fi ca ti vos. Por ejem plo, puede uti li zar nom bres como btnSave,btnClose, tmrSplash, etc.

Puede uti li zar hasta 63 carac te res para un nom bre de com po nente.

Mensajes de error 15

Page 50: Dsp

Aun que es posi ble hacerlo sin reci bir un men saje de error, es acon se ja ble nouti li zar las siguien tes direc ti vas están dar de Object Pas cal:

abso lute, abs tract, assem bler, auto ma ted, cdecl, con tains, default, dis pid, dyna-mic, export, exter nal, far, for ward, imple ments, index, mes sage, name, near,node fault, over load, ove rride, pac kage, pas cal, pri vate, pro tec ted, public,publis hed, read, rea donly, regis ter, rein tro duce, requi res, resi dent, safe call,stdcall, sto red, vir tual, write, wri teonly.

De forma simi lar, evite uti li zar iden ti fi ca do res ya defi ni dos en el len guajeObject Pas cal (tales como Wri teln, Exit, String, Word, etc.) para nom brar loscom po nen tes.

No cam bie los nom bres de los com po nen tes en tiempo de eje cu ción. En otraspala bras, no cam bie los nom bres en el código. Asigne nom bres a com po nen tessola mente desde el entorno de desa rro llo en tiempo de diseño (en el Inspec torde Obje tos).

<> is not a valid datePo si ble cau sa de error

Puede haber inten tado alma ce nar una fecha invá lida en un campo de unatabla de base de datos, o con ver tir una fecha invá lida de un for mato de cadenaa un for mato de fecha.

So lu ción rá pi daAse gú rese de que la fecha intro du cida sea válida.

Infor ma ción adi cio nalInter na mente, un valor TDa te Time es alma ce nado como un número real (paraser más espe cí ficos, un Double). La parte entera (la situada a la izquierda delpunto deci mal) repre senta la fecha (donde el valor 0 repre senta al 31 dediciem bre de 1899, el valor 366 repre senta el 1º de enero de 1901, etc.); la partefrac cio na ria (a la dere cha del punto deci mal) repre senta la hora del día.

Se puede alma ce nar fechas ante rio res al 31 de diciem bre de 1899 uti li zandonúme ros nega ti vos (–2 repre senta el 29 de diciem bre de 1899, etc.).

Puede atra par fácil mente este error ence rrando un intento de con ver sión detipos a un tipo de datos TDateTime en un blo que Try...Except, de esta manera:

var Fig: TDa te Ti me;try Fig := StrTo Da te(Edit1.Text);ex cept on ECon vertError do ...

16 Los Tomos de Delphi: Delphi sin problemas

Page 51: Dsp

Si está uti li zando Del phi 3 o supe rior, con si dere la uti li za ción del com po nenteTDa te Ti me Pic ker para obte ner del usua rio valo res de tipo fecha. El com po-nente TDa te Ti me Pic ker no per mite que el usua rio selec cione fechas invá li das,y de esta manera pro por ciona una solu ción sin nece si dad de escri bir códigoalguno.

Si está uti li zando Del phi 4 o superior, tenga en cuenta ade más el com po nenteTMont hCa len dar.

<> is not a valid date and timePo si ble cau sa de error

Puede haber inten tado con ver tir una fecha invá lida desde una cadena decarac te res al tipo TDa te Time, o de alguna otra manera alma ce nar un valorinvá lido en una varia ble de tipo TDa te Time.

So lu ción rá pi daVeri fi que que el valor TDa te Time que intenta con ver tir es válido.

Si está alma ce nando direc ta mente un valor en una varia ble TDa te Time, uti liceeste for mato:

var The Day: TDa te Ti me;be gin The Day := 30678.001 {28/12/1983 12:01:26}

Si con vierte desde una cadena, uti lice este for mato:

var The Day: TDa te Ti me;be gin The Day := StrTo Da te Ti me('18/11/2001 2:11 am');

Infor ma ción adi cio nalNo es nece sa rio aña dir la parte corres pon diente a la hora del valor (la parte ala dere cha del punto deci mal). Por ejem plo, en los ejem plos de arriba se podríahaber asig nado los valo res 30678 y 18/11/2001 (sin las par tes de hora, .001 y‘2:11 am’, res pec ti va mente).

Inter na mente, un valor TDa te Time es alma ce nado como un valor de tipoDouble. La parte entera (la situada a la izquierda del punto deci mal) repre-senta la fecha (donde el valor 0 repre senta al 31 de diciem bre de 1899, el valor366 repre senta el 1º de enero de 1901, etc.); la parte frac cio na ria (a la dere chadel punto deci mal) repre senta la hora del día.

Se puede alma ce nar fechas ante rio res al 31 de diciem bre de 1899 uti li zandonúme ros nega ti vos (–2 repre senta el 29 de diciem bre de 1899, etc.).

Mensajes de error 17

Page 52: Dsp

Puede atra par fácil mente este error ence rrando un intento de con ver sión detipos a un tipo de datos TDateTime en un blo que Try...Except, de esta manera:

var Fig: TDa te Ti me;try Fig := StrTo Da te Ti me(Edit1.Text);ex cept on ECon vertError do ...

<> is not a valid floating point valuePo si ble cau sa de error

Puede estar inten tando con ver tir a un valor de punto flo tante una cadena decarac te res que no es reco no cida como valor de punto flo tante por el com pi la dor.Por ejem plo, si el código es simi lar a éste:

var Trou ble: Dou ble;be gin Trou ble := StrToF loat(Edit1.Text);

y el usua rio intro duce cual quier número en el campo Edit1, el valor será con-ver tido a un número de punto flo tante y alma ce nado en la varia ble indi cada.Pero si el usua rio intro duce cual quier cosa que no puede ser inter pre tada comoun número real, el men saje de error bajo dis cu sión se des ple gará.

So lu ción rá pi daVeri fi que que el valor es un valor de punto flo tante válido antes de asig narlo ala varia ble. Por ejem plo, podría uti li zar algo como esto:

var Trou ble: Dou ble;try Trou ble := StrToF loat(Edit1.Text);ex cept on ECon vertError do ...

Infor ma ción adi cio nalLos tipos de datos Real, Sin gle, Dou ble, Exten ded, Comp y Currency son todostipos de punto flo tante.

Si se intenta asig nar un valor de un tipo invá lido a una varia ble real (porejem plo, asig nar el valor True, de tipo Boo lean, a la varia ble Trou ble del ejem-plo), se obten drá el error “Incom pa ti ble types: <> and <>” en tiempo decom pi la ción.

18 Los Tomos de Delphi: Delphi sin problemas

Page 53: Dsp

<> is not a valid floating point value for field “<>”Po si ble cau sa de error

Puede estar inten tando asig nar algo que no es un valor de punto flo tante a uncampo de punto flo tante de una base de datos. Por ejem plo, el siguiente códigogene rará este error si el usua rio intro duce la cadena “Insufi ciente” en el con-trol TDBEdit (dbedt Sa lary) y pulsa el botón (btnSa lary):

pro ce du re TfrmGet Nosy.btnSa lary Click(Sen der: TObject);be gin tblPer so nalI nfo.FieldByNa me('Sa lary').AsFloat := dbedt Sa lary.Text;end;

So lu ción rá pi daPuede evi tar que un usu a rio intro duzca un valor invá lido per mi tiendo sólo undígito para el pri mer carác ter y un dígito o el punto deci mal para los siguien tescarac te res. Por ejem plo, aña diendo el siguiente código al evento KeyP ress:

pro ce du re TfrmGet Nosy.dbedt Sa lary KeyP ress( Sen der: TObject; var Key: Char);be gin { so la men te per mi te dí gi tos y el ca rác ter de re tro ce so } if not (key in ['0'..'9','.',#8]) then be gin Mes sa ge Beep(0); Key := #0 end; end;

Infor ma ción adi cio nalCon sulte ade más la pro pie dad Edit Mask de los com po nen tes TField yTMaskEdit (en caso de que pueda pres cin dir de un com po nente con cone xión adatos).

<> is not a valid identifierPo si ble cau sa de error

1. Puede haber pul sado un botón OK sin sumi nis trar la infor ma ciónnece sa ria.

2. Puede estar inten tando gra bar un archivo de uni dad con una exten sión dis-tinta a .PAS o un archivo de pro yecto con una exten sión dis tinta a .DPR.

Mensajes de error 19

Page 54: Dsp

So lu ción rá pi da1. Haga la selec ción ade cuada en el cua dro de diá logo antes de pul sar el botón

OK.2. Uti lice las exten sio nes por defecto (o nin guna, en cuyo caso la exten sión

apro piada será aña dida auto má ti ca mente) para los archi vos que Del phidebe admi nis trar.

Infor ma ción adi cio nalUn ejem plo (de entre muchos simi la res) donde se obten dría este men saje deerror, es si está inten tando ins ta lar un com po nente y pulsa OK en el cua dro dediá logo sin intro du cir un valor en el con trol de edi ción del nom bre de archivode uni dad.

<> is not a valid integer valuePo si ble cau sa de error

1. Puede estar inten tando con ver tir una cadena de carac te res que no es reco-no cida como un valor entero a un tipo entero. Por ejem plo, si su código essimi lar a éste:

var CountOfMonteCarlo: In te ger;be gin CountOfMonteCarlo := StrToInt(Edit1.Text);

y el usua rio intro duce un valor entero en el campo Edit1, el valor será con-ver tido a un entero y alma ce nado en la varia ble corres pon diente. Pero si elusua rio intro duce algo que no se puede inter pre tar como un entero, el men-saje de error bajo dis cu sión se visua li zará.

2. Puede estar inten tando abrir un pro yecto con una ver sión de Del phi ante-rior a la ver sión uti li zada la última vez que lo com piló, en cuyo caso puedehacerse refe ren cia a un for mu la rio como el valor entero invá lido

So lu ción rá pi da1. Veri fi que que el valor es un entero válido antes de asig narlo a la varia ble.

Por ejem plo, se podría inten tar algo pare cido a esto:

var CountOfMonteCarlo: In te ger;try CountOfMonteCarlo := StrToInt(Edit1.Text);ex cept on EConvertError do ...

2. Pulse OK para con ti nuar.

20 Los Tomos de Delphi: Delphi sin problemas

Page 55: Dsp

Infor ma ción adi cio nalSí está inten tando asig nar un valor de un tipo ina de cuado a un entero (porejem plo, asig nar el valor “Drá cula” a la varia ble entera CountOfMon te Carlo)obten drá en tiempo de com pi la ción el error “Incom pa ti ble types: <> y <>” (yno en tiempo de eje cu ción, como en el ejem plo de arriba).

ShortInt, SmallInt, Inte ger, Byte, Word y Car di nal son todos tipos ente ros.

<> is not a valid integer value for field “<>”Po si ble cau sa de error

Puede estar inten tando asig nar algo que no puede ser inter pre tado como unvalor entero a un campo entero de una base de datos. Por ejem plo, el siguientecódigo gene rará este error si el usua rio intro duce “Fig!” en el con trol TDBEdit(dbedt Way nes World) y pulsa el botón btnLoun ge Li zard:

pro ce du re TfrmLil Big City.btnLoun ge Li zard Click(Sen der: TObject);be gin tblAlte red Ci ties.FieldByNa me( 'Ti mesI ve Been To Re no But Did Not See Way ne New ton').AsInte ger := dbedt Way nes World.Text;end;

So lu ción rá pi daPuede impe dir que un usua rio intro duzca valo res invá lidos per mi tiéndoleintro du cir en el campo sólo dígi tos y el carác ter de retro ceso. Por ejem plo, aña-diendo el siguiente código al evento KeyP ress:

pro ce du re TfrmLil Big City. dbedt Way nes World(Sen der: Tob ject; var Key: Char);be gin { per mi te so la men te dí gi tos y el ca rác ter de re tro ce so} if not (key in ['0'..'9', #8]) then be gin Mes sa ge Beep(0); Key := #0 end; end;

Infor ma ción adi cio nalCon sulte ade más la pro pie dad Edit Mask de los com po nen tes TField yTMaskEdit (si puede pres cin dir de un com po nente con cone xión a datos).

Mensajes de error 21

Page 56: Dsp

<> is not a valid path. Make sure that the path name is spelledcorrectly and that you are connected to the server on which the fileresides.

Po si ble cau sa de errorPuede estar uti li zando un com po nente TADOCon nec tion cuya pro pie dadConnec tionS tring está apun tando a una base de datos en una loca li za ción queno existe. Puede que haya borrado el direc to rio en el que la base de datosreside, cam biado su nom bre, o movido el pro yecto a una máquina dis tinta en laque no existe la misma estruc tura de direc to rios.

So lu ción rá pi daSiga estos pasos:1. Haga doble clic sobre el com po nente TADOCon nec tion para abrir el edi tor

de la pro pie dad Con nec tionS tring.2. Pulse el botón de radio Use con nec tion string.3. Pulse el botón Build.4. Modi fi que la infor ma ción del camino de la base de datos de tal forma que

coin cida con la rea li dad.5. Pulse OK dos veces.

Alter na ti va mente, modi fi que el archivo de Enlace a Datos (Data Link), si estáuti li zando alguno.

Infor ma ción adi cio nalUti lice siem pre el edi tor de la pro pie dad Con nec tionS tring para cons truir sucadena de cone xión. Hacerlo “a mano” es para maso quis tas. De esta forma, sease gu rará tam bién de que está intro du ciendo un camino válido de la base dedatos (por supuesto, si mueve un pro yecto de una máquina a otra, puede quenece site modi fi car esta pro pie dad como se ha des crito arriba).

<> is not a valid timePo si ble cau sa de error

Puede estar inten tando con ver tir un valor invá lido desde una cadena de carac-te res a una varia ble TDa te Time, o de algún otro modo inten tando alma ce narun valor invá lido en una varia ble TDa te Time.

So lu ción rá pi daAse gú rese de que el valor a con ver tir sea válido.

22 Los Tomos de Delphi: Delphi sin problemas

Page 57: Dsp

Sí está alma ce nando direc ta mente un valor en una varia ble TDa te Time, uti liceeste for mato:

var The Ti meOf Our Li ves: TDa te Ti me;be gin The Ti meOf Our Li ves := 0.8125;

Sí con vierte desde una cadena, uti lice este for mato:

var The Ti meOf Our Li ves: TDa te Ti me;be gin The Ti meOf Our Li ves := StrTo Ti me('7:30 pm');

Infor ma ción adi cio nalInter na mente, un valor TDa te Time es alma ce nado como un número real (paraser más espe cí fi cos, un Dou ble). La parte entera (la situada a la izquierda delpunto deci mal) repre senta la fecha (donde el valor 0 repre senta al 31 dediciem bre de 1899, el valor 366 repre senta el 1º de enero de 1901, etc.); la partefrac cio na ria (a la dere cha del punto deci mal) repre senta la hora del día.

Puede atra par fácil mente este error ence rrando un intento de con ver sión detipos a un tipo de datos TDa te Time en un blo que Try...Except, de esta manera:

var The Ti meOf Our Li ves: TDa te Ti me;be gin try The Ti meOf Our Li ves := StrTo Ti me(Edit1.Text); ex cept on ECon vertError do be gin Show Mes sa ge('La hora no es co rrec ta'); Acti ve Con trol := Edit1; end; end; end;

<> is not a valid value for field <>. The allowed range is <> to <>Po si ble cau sa de error

Puede haber inten tado asig nar a un campo de base de datos un valor que esmenor que la pro pie dad Min Va lue o mayor que la pro pie dad MaxValue delcampo.

Mensajes de error 23

Page 58: Dsp

So lu ción rá pi daIntro duzca un valor que per te nezca al rango espe ci fi cado para el campo, oamplíe el rango per mi tido dis mi nu yendo la pro pie dad Min Va lue y/o incre men-tando la pro pie dad Max Va lue.

Infor ma ción adi cio nalTodos los des cen dien tes numé ri cos de TField (que son crea dos por Del phicuando los cam pos de bases de datos sub ya cen tes son ini cia li za dos) tie nen laspro pie dades Min Va lue y Max Va lue.

<> must be saved before adding to Repository. Save now?Po si ble cau sa de error

Puede estar inten tando aña dir al Alma cén de Obje tos un for mu la rio que aúnno ha sido guardado.

So lu ción rá pi daGuarde la uni dad, selec cio nando File | Save, y luego añá dala al Alma cén.Para ello pulse el botón dere cho del ratón sobre él y selec cione Add to Repo si-tory, o bien selec cione Pro ject | Add to Repo si tory.

Infor ma ción adi cio nalSi está tra ba jando en un entorno de pro gra ma ción en equipo, se puede con fi gu-rar un direc to rio com par tido de la red como Alma cén de Obje tos de Del phi, alque todos los desa rro lla do res pue dan acce der. Puede con fi gu rar Del phi paraque uti lice este direc to rio selec cio nando Tools | Envi ron ment Options, eintro du ciendo la loca li za ción de este direc to rio com par tido en el campo Sha redRepo si tory, en la parte infe rior de la pes taña Pre fe ren ces.

La loca li za ción por defecto de la copia local del Alma cén de Obje tos esC:\Archi vos de pro grama\Bor land\Del phi X\ObjRe pos.

<> or <> expected but <> foundPo si ble cau sa de error

1. Puede haber uti li zado un parén te sis donde debe ría haber un cor chete, ovice versa.

2. Puede haber uti li zado un punto y coma donde debe ría haber un punto, ovice versa.

24 Los Tomos de Delphi: Delphi sin problemas

Page 59: Dsp

3. Puede haber pro por cio nado una can ti dad de argu men tos errónea en unalla mada a pro ce di miento o fun ción (en cuyo caso el com pi la dor estará espe-rando una coma, en lugar de un parén te sis dere cho/de cie rre).

4. Puede haber omitido el punto y coma de la línea ante rior.5. Puede haber inser tado algún código entre las par tes Unit e Inter face de

una uni dad. Por ejem plo, puede haber inser tado ahí una sec ción Var y/oConst.

6. Puede estar uti li zando un archivo .PAS en el cual se ha omi tido una pala-bra reser vada nece sa ria, por ejem plo, Unit.

7. Puede haber inten tado decla rar un tipo en una sec ción Var, de la siguientemanera:

var TForm1 = class(TForm)

En este caso, el men saje de error espe cí fico será “, or : expec ted but =found”.

8. Puede haber ante puesto el nom bre de la uni dad en lugar del nom bre de laclase a un método (por ejem plo, escri biendo la sig na tura de un método enla parte Imple men ta tion como Unit1.Pro ce du re Name, en lugar deTForm1.Pro ce dureName).

So lu ción rá pi da1-6.Sus ti tuya el sím bolo exis tente por el espe rado.7. Colo que las decla ra cio nes de tipos sola mente en sec cio nes Type.8. Sus ti tuya el nom bre de la uni dad por el nom bre de la clase.

Infor ma ción adi cio nalCon sulte la ayuda de Del phi para más infor ma ción sobre las sen ten cias dedecla ra ción de tipos, pro ce di mien tos y fun cio nes.

<> property out of rangePo si ble cau sa de error

Puede haber asig nado un valor invá lido a una pro pie dad de un con trolTrackBar, Pro gress Bar, Tab Con trol o Page Con trol. Por ejem plo, si asigna unvalor nega tivo a las pro pie da des Tab Height o Tab Width de un Tab Con trol oPage Con trol, obten drá este men saje de error.

Mensajes de error 25

Page 60: Dsp

So lu ción rá pi daIntro duzca un valor válido para la pro pie dad. En el caso de las pro pie da desTab Height y Tab Width de los con tro les Tab Con trol y Page Con trol, asigne a lapro pie dad un valor entre 0 y 32767.

Infor ma ción adi cio nalSi asigna un valor mayor que 32767 a las pro pie da des Tab Height o Tab Widthde un Tab Con trol o Page Con trol, se gene rará el men saje de error “Value mustbe bet ween –32768 and 32767”. Sin embargo, real mente el valor debe estarentre 0 y 32767. Intro du cir un número nega tivo pro duce el men saje de errorbajo dis cu sión.

{$R *.RES} missing or incorrectPo si ble cau sa de error

Puede haber borrado o modi fi cado la direc tiva de com pi la dor $R del archivo depro yecto (.DPR).

So lu ción rá pi daVeri fi que que el archivo .DPR del pro yecto con tiene la línea:

{$R *.RES}

entre sus sec cio nes Uses y Begin. . . End. Selec cione View | Pro ject Source yañada o modi fi que esta línea si es nece sa rio.

Infor ma ción adi cio nalLa direc tiva de com pi la dor {$R *.RES} espe ci fica que el archivo con el mismonom bre base del pro yecto y la exten sión .RES debe ser enla zado al pro yecto.Este archivo de recur sos nor mal mente con tiene sola mente el icono de la apli ca-ción del pro yecto.

No edite este archivo de recur sos, ya que cual quier cam bio que haga se per derála pró xima vez que recom pile. Uti lice un archivo de recur sos sepa ra do paraaña dir recur sos adi cio na les.

(<>, <>, <>, <>) is not a valid DateMonthWeek quadPo si ble cau sa de error

Puede haber lla mado a la fun ción IsVa lid Da te Mont hWeek (que apa re ció conDel phi 6, en la uni dad DateU tils), ya sea directa o indi rec ta mente, y haberlepro por cio nado un año, mes, semana del mes, o día de la semana invá lido.

26 Los Tomos de Delphi: Delphi sin problemas

Page 61: Dsp

So lu ción rá pi daVeri fi que que el año esté entre 1 y 9999, el mes esté entre 1 y 12, la semanadel mes esté entre 1 y 5, y el día de la semana esté entre 1 y 7.

Infor ma ción adi cio nalDel phi 6 con tiene muchas uni da des de uti li dades nue vas, tales como DateU tils,StrUtils, VarU tils, IBUtils, Conv Utils y Mask Utils.

(<>, <>, <>) is not a valid DateWeek tripletPo si ble cau sa de error

Puede haber lla mado a IsVa lid Da te Mont hWeek (que apa re ció con Del phi 6, enla uni dad DateU tils), ya sea directa o indi rec ta mente, y haberle pro por cio nadoun año, semana del año, o día de la semana invá lido.

So lu ción rá pi daVeri fi que que el año esté entre 1 y 9999, la semana del año esté entre 1 y 52, yel día de la semana esté entre 1 y 7.

Infor ma ción adi cio nalDel phi 6 con tiene muchas uni da des de uti li dades nue vas, tales como DateU tils,StrUtils, VarU tils, IBUtils, Conv Utils, y Mask Utils.

16-Bit segment encountered in object file <>Po si ble cau sa de error

Un seg mento de 16 bits ha sido encon trado en el archivo objeto (.OBJ) enla-zado al pro grama a tra vés de la direc tiva de com pi la dor $L .

So lu ción rá pi daUti lice un archivo objeto que no contenga defi ni cio nes de seg mento de 16 bits.

Infor ma ción adi cio nalCon sulte la docu men ta ción del pro ducto que fue uti li zado para crear el archivoobjeto, y bus que ins truc cio nes sobre la con ver sión de defi ni cio nes de seg mentode 16 bits a defi ni cio nes de seg mento de 32 bits.

Mensajes de error 27

Page 62: Dsp

A class named <> is already installedPo si ble cau sa de error

Puede haber inten tado ins ta lar un nuevo com po nente, pero un men saje deerror (refe rente al código de la uni dad del com po nente, por ejem plo) se lo haimpedido. Algu nas veces parece que el com po nente está “ins ta lado a medias”:se ha ins ta lado lo sufi ciente como para que Del phi piense que el com po nenteestá ins ta lado, pero no lo sufi ciente para que esté dis po ni ble en la Paleta deCompo nen tes.

Por ejem plo, puede haber inten tado ins ta lar el con trol de calen da rio de Micro-soft y habér sele infor mado que “A class named TCa len dar already exists”.

So lu ción rá pi da1. Selec cione Com po nent | Con fi gure Palette2. Loca lice la página en la que el com po nente debe ría apa re cer en el cua dro

de lista Pages y selec ció nela. Se puede deter mi nar cuál es la página ade-cuada ins pec cio nando la lla mada a Regis ter Com po nents en la uni dad delcom po nente o su uni dad de regis tro. Por ejem plo, en este caso, la página es“Sam ples”:

Re gis ter Com po nents('Sam ples', [TAISWeb Laun cher1]);

3. Selec cione el com po nente en el cua dro de lista Com po nents.4. Pulse el botón Delete.5. Solu cione el pro blema del com po nente e intente ins ta larlo de nuevo (este

pro ceso se debe repe tir tan tas veces como sea nece sa rio).

Infor ma ción adi cio nalEste pro blema ocu rre más fre cuen te mente cuando se intenta ins ta lar com po-nen tes pro pios. Usted intenta ins ta larlo, no puede hacerlo debido a un men sajede error, solu ciona el problema, e intenta ins ta larlo de nuevo; enton ces reci biráeste men saje de error.

A CoClass must have at least one default interfacePo si ble cau sa de error

Puede haber des mar cado la casi lla que indica que una inter faz miem bro de unobjeto CoC lass es la inter faz por defecto del objeto.

So lu ción rá pi daSiga estos pasos:

28 Los Tomos de Delphi: Delphi sin problemas

Page 63: Dsp

1. Decida cuál de las inter fa ces de la CoC lass (si hay más de una) quieredesig nar como la inter faz por defecto.

2. Teniendo la CoC lass afec tada selec cio nada en el panel izquierdo del Edi torde Biblio te cas de Tipos, selec cione la página Mem bers en el panel derecho.

3. Si las inter fa ces no están en la lista, pulse el botón dere cho en la páginaMem bers y selec cione Insert Inter face.

4. Selec cione de la lista tan tas inter fa ces como desee (uti lice la com bi na ciónMay./botón para selec cio nar más de una inter faz) y pulse el botón OK.

5. Selec cione la inter faz que quiera desig nar como inter faz por defecto para elobjeto CoC lass.

6. Pulse con el botón dere cho sobre la inter faz y active el ele mento de menúDefault.

Ahora puede guar dar la biblio teca de tipos.

Infor ma ción adi cio nalAde más de sim ple mente solu cio nar el error de sin ta xis gene rado por no teneruna inter faz por defecto o inter fa ces para el objeto CoC lass, segu ra mente tam-bién deseará aña dir pro ce di mien tos, fun cio nes y pro pie da des a la inter faz (encaso de que no lo haya hecho toda vía). Para infor ma ción espe cí fica sobre cómohacer esto, con sulte “crea ting a new type library” en la ayuda de Del phi.

El Edi tor de Biblio te cas de Tipos (Type Library Edi tor) puede ser acce didoselec cio nando File | New | Acti veX | Type Library. Uti lice el Edi tor deBiblio te cas de Tipos para crear e ins pec cio nar la infor ma ción de tipos de loscon tro les Acti veX y los obje tos COM.

Debe tener abierto un pro yecto para poder selec cio nar File | New | Acti veX| Auto ma tion Object, ya que los obje tos de auto ma ti za ción son espe cí fi cospara un pro yecto. Este no es el caso para la selec ción File | New | Acti veX |Type Library.

A CoClass must implement at least one interfacePo si ble cau sa de error

Puede haber inten tado guardar una biblio teca de tipos que con tiene un objetoCoC lass sin nin guna inter faz asociada.

So lu ción rá pi daAñada al menos una inter faz al objeto CoC lass, o eli mine el objeto CoC lass.Para añadir una inter faz a un objeto CoC lass, siga estos pasos:1. En Edi tor de Biblio te cas de Tipos, pulse el icono que repre senta las inter fa-

ces (pare cido a una raqueta de ping-pong roja).

Mensajes de error 29

Page 64: Dsp

2. Pulse la página Mem bers para acti varla.3. Pulse con el botón dere cho en la página Mem bers y selec cione la opción

Insert Inter face del menú de con texto.4. Selec cione la inter faz que desea aña dir en el cua dro de diá logo Insert

Interface y pulse el botón OK.

Ahora puede guar dar la biblio teca de tipos.

Infor ma ción adi cio nalAde más de sim ple mente solu cio nar el error de sin ta xis gene rado por no tenernin guna inter faz aso ciada al objeto CoC lass, segu ra mente tam bién desearáaña dir pro ce di mien tos, fun cio nes y pro pie da des a la inter faz (en caso de que nolo haya hecho toda vía). Para infor ma ción espe cí fica sobre cómo hacer esto, con-sulte “crea ting a new type library” en la ayuda de Del phi.

El Edi tor de Biblio te cas de Tipos (Type Library Edi tor) puede ser acce didoselec cio nando File | New | Acti veX | Type Library. Uti lice el Edi tor deBiblio te cas de Tipos para crear e ins pec cio nar la infor ma ción de tipos de loscon tro les Acti veX y los obje tos COM.

Debe tener abierto un pro yecto para poder selec cio nar File | New | Acti veX| Auto ma tion Object, ya que los obje tos de auto ma ti za ción son espe cí fi cospara un pro yecto. Este no es el caso para la selec ción File | New | Acti veX |Type Library.

A component class named <> already existsPo si ble cau sa de error

Al crear un nuevo com po nente mediante el Asis tente para Nue vos Com po nen-tes (File | New | Com po nent o Com po nent | New Com po nent), puedehaber intro du cido en el cua dro de edi ción Class Name el nom bre de un com po-nente que ya existe en su VCL. Por ejem plo, puede haber inten tado uti li zar elnom bre TBat chMove (que ya existe).

So lu ción rá pi daCam bie el nom bre en el cua dro de edi ción Class Name a uno que sea únicopara su VCL.

Infor ma ción adi cio nalPor defecto, Del phi selec cio nará un nom bre que no entre en con flicto con loscom po nen tes que están ins ta la dos en la VCL del usua rio.

30 Los Tomos de Delphi: Delphi sin problemas

Page 65: Dsp

Por ejem plo, si selec ciona THea der como el tipo ances tro del com po nente queva a crear, Del phi intro du cirá THea der1 en el cua dro de edi ción Class Name(si ya hay una clase THea der1 en la VCL del usua rio, será THea der2, etc.).

La frase “la VCL del usua rio” es uti li zada en lugar de “la VCL”, debido quecada usua rio de Del phi pro ba ble mente tenga una colec ción única de com po nen-tes VCL. Segu ra mente ten drá el núcleo de los com po nen tes de la VCL de Del-phi que vie nen con el pro ducto (que es dife rente para las dis tin tas ver sio nes yedi cio nes de Del phi), pero podrá tam bién tener ins ta la dos en su sis tema varia-dos com po nen tes de ter ce ros (como los ofre ci dos por Dany soft), com po nen tessha re ware, com po nen tes free ware, así como tam bién algu nos pro pios. Todosellos, en su con junto, cons ti tu yen la VCL del usua rio.

A component named <> already existsPo si ble cau sa de error

Puede haber inten tado asig narle a un com po nente un nom bre que ya existe.

So lu ción rá pi daAsigne a cada com po nente un nom bre único, pre fe ri ble mente uno que des cribael pro pó sito del com po nente, tal como mniA bout para un ítem de menú quedes pliega una caja About (Acerca de...), btnClose para un botón que cie rra unfor mu la rio o cua dro de diá logo, etc.

Infor ma ción adi cio nalDel phi asigna auto má ti ca mente a cada com po nente que se coloca sobre un for-mu la rio un nom bre único basado en el tipo de com po nente y un número incre-men tal. Por ejem plo, si se colo can tres eti que tas sobre un for mu la rio, Del philes dará los nom bres Label1, Label2, y Label3. Puede cam biar estos nom brespor otros más des crip tivos si lo desea, pero cada nom bre de com po nente debeser único.

A component named <> already exists in a descendent formPo si ble cau sa de error

Puede haber uti li zado la carac te rís tica de heren cia visual de for mu la rios, dis-po ni ble en Del phi a par tir de la ver sión 2, y luego haber renom brado el for mu-la rio del cual ha here dado (o un com po nente de ese for mu la rio) uti li zando unnom bre de com po nente que ya está siendo uti li zado en un for mu la riodes cen diente.

Mensajes de error 31

Page 66: Dsp

So lu ción rá pi daAsigne al for mu la rio ori gi nal (ances tro) y a todos los com po nen tes situa dossobre él nom bres úni cos al pro yecto.

Infor ma ción adi cio nalPuede tener (y pro ba ble mente ten drá) com po nen tes en for mu la rios des cen dien-tes que ten gan el mismo nom bre que los colo ca dos sobre el for mu la rio ances tro,pero éstos serán aque llos com po nen tes que fue ron colo ca dos ini cial mente sobreel for mu la rio ances tro (y que son here da dos por el for mu la rio des cen diente -inclu yendo el nom bre). En otras pala bras, los com po nen tes colo ca dos sobre elfor mu la rio ances tro son here da dos por el for mu la rio des cen diente e incluso tie-nen el mismo nom bre. Los com po nen tes colo ca dos sobre el for mu la rio des cen-diente rede fi nen o extien den la decla ra ción del for mu la rio ances tro, y elances tro no puede here dar nada del for mu la rio des cen diente.

Por ejem plo, cree un for mu la rio des cen diente siguiendo estos pasos:1. Selec cione File | New.2. Selec cione la pes taña que tiene el mismo nom bre que el pro yecto.3. Selec cione el for mu la rio del que desea here dar.4. Veri fi que que el botón de radio Inhe rit esté selec cio nado.

Si añade un com po nente TLa bel sobre el for mu la rio ances tro, Del phi asig naráal com po nente el nom bre Label1. El for mu la rio des cen diente tam bién ten dráun Label1 en la misma posi ción (lo ha here dado de su ances tro). Sin embargo,si ahora añade un com po nente TLa bel direc ta mente sobre el for mu la rio des-cen diente (al cual Del phi asig nará el nom bre Label2), luego añade otro TLa belsobre el for mu la rio ances tro (al cual Del phi asig nará el nom bre Label3), yfinal mente intenta asig nar a Label3 en el for mu la rio ances tro el nom breLabel2, se pro du cirá el men saje de error bajo dis cu sión.

A connection with the server could not be establishedPo si ble cau sa de error

Puede haber espe ci fi cado el puerto equi vo cado en el URL, o nin gún puerto enabso luto, o está escu chando por el puerto equi vo cado en una apli ca ción SiteExpress.

So lu ción rá pi daVeri fi que que la apli ca ción de ser vi dor esté con fi gu rada para escu char por elpuerto correcto, y que la apli ca ción cliente esté inten tando conec tarse a esemismo puerto.

32 Los Tomos de Delphi: Delphi sin problemas

Page 67: Dsp

Infor ma ción adi cio nalSi está pro bando una apli ca ción Site Express, puede uti li zar el siguiente tipode URL: http://local host:1024/Svrinfo.exe

Local host es su máquina (IP # 127.0.0.1), a la que está inten tando conec tarsepor el puerto 1024 y eje cu tar la apli ca ción Svrinfo.

Site Express hizo su apa ri ción con Del phi 6.

A device attached to the system is not functioningPo si ble cau sa de error

1. Puede estar inten tando ins ta lar un paquete que requiere un archivo .DLLque no está en el camino de bús queda de Del phi. La DLL no encon tradapuede ser tam bién una uni dad de paquete.

2. El paquete puede haber sido com pi lado con una ver sión de Del phi dife rentede la que está uti li zando.

So lu ción rá pi da1. Veri fi que que todas las DLLs reque ri das, inclu yendo los paque tes, estén

dis po ni bles en el sis tema y ubi ca das en el lugar ade cuado. Deben estar enel camino de bús queda de Del phi (Tools | Envi ron ment Options, pes-taña Library, cua dro Library Path), y los paque tes, espe cí fi ca mente,deben estar en el direc to rio \Win dows\System.

2. Si usted es el autor del paquete, recom pile el paquete con la ver sión deDelphi en la que está inten tando ins ta larlo. Si no es el autor, intente con-tac tar con su autor para obte ner la ver sión com pi lada apro piada.

Infor ma ción adi cio nalEste es uno de esos men sa jes de error que real mente no apor tan muchas indi-ca cio nes en rela ción con el pro blema real.

Antes de obte ner este men saje de error, se puede haber obte nido “The <>.EXEfile is lin ked to mis sing export <>.DPL:<>”. Con sulte esa entrada en estelibro para más infor ma ción.

A dispinterface type cannot have an ancestor interfacePo si ble cau sa de error

Puede haber espe ci fi cado una disp-inter faz (inter faz de auto ma ti za ción) comoances tro para un tipo disp-inter faz.

Mensajes de error 33

Page 68: Dsp

So lu ción rá pi daNo declare otra inter faz como ances tro de un tipo disp-inter faz.

Infor ma ción adi cio nalUn tipo de inter faz espe ci fi cado mediante la pala bra reser vada Dispin ter faceno puede espe ci fi car una inter faz ances tro, debido a que se trata de inter fa cesabs trac tas.

Con sulte “dis patch inter fa ces”, “crea ting and acces sing inter fa ces” y “dualinter fa ces” en la ayuda de Del phi para más infor ma ción.

A dispinterface type requires an interface identificationPo si ble cau sa de error

Puede haber dejado de espe ci fi car un GUID en un tipo disp-inter faz.

So lu ción rá pi daSumi nis tre un GUID para que el tipo disp-inter faz sea acce si ble.

Infor ma ción adi cio nalUn GUID es un valor bina rio de 16 bytes cuya uni ci dad está garan tizada(GUID sig ni fica Glo bally Uni que Iden ti fier - Iden ti fi ca dor Glo balmente Unico).

A field or method named <> already existsPo si ble cau sa de error

Su archivo .PAS puede con te ner una refe ren cia al objeto o método que estáinten tando aña dir al for mu la rio, pero no se encuen tra la refe ren cia corres pon-diente en el archivo .DFM de for mu la rio. Por ejem plo, puede haber aña dido elbotón But ton1 a un for mu la rio, luego haber borrado manual mente la refe ren-cia a But ton1 del archivo de for mu la rio (.DFM), y luego aña dido otro botón alfor mu la rio. Los archi vos .DFM y .PAS no están sin cro ni za dos, ya que elarchivo .PAS cree que hay dos con tro les TBut ton, mien tras que el archivo.DFM sola mente conoce la exis ten cia de uno.

So lu ción rá pi daPri mero eli mine del archivo .PAS la refe ren cia al objeto o método que no tieneuna refe ren cia corres pon diente en el archivo .DFM de for mu la rio; luego vuelvaa aña dir el objeto o método al archivo .DFM.

34 Los Tomos de Delphi: Delphi sin problemas

Page 69: Dsp

Infor ma ción adi cio nalCuando añade un objeto o método al for mu la rio, Del phi intenta asig narle elpró ximo nom bre dis po ni ble para una ins tan cia de su clase (por ejem plo, siarras tra un botón sobre el for mu la rio, reci birá el nom bre But ton1 si no haymás boto nes en el for mu la rio, But ton2 si ya existe uno, etc.). Si hay una refe-ren cia a But ton1 en el archivo .PAS (pero no en el archivo .DFM), Del phiinten tará nom brar el botón But ton1 (debido a que no hay refe ren cias a boto nesen el archivo .DFM), lo que oca sio nará el men saje de error bajo dis cu sión, yaque no puede haber dos com po nen tes lla ma dos But ton1 en el mismo archivo.PAS.

A module called <> is already installedPo si ble cau sa de error

Puede estar inten tando ins ta lar un com po nente que ante rior mente trató deins ta lar sin éxito.

So lu ción rá pi daSiga estos pasos:1. Cie rre el cua dro de men saje, pul sando el botón OK.2. En el cua dro de la lista Insta lled Units, selec cione la uni dad que está

inten tando ins ta lar.3. Pulse el botón Remove.4. Intente ins ta lar el com po nente de nuevo

Infor ma ción adi cio nalEl módulo (uni dad de com po nente) estaba ins ta lado par cial mente, impi dién-dole uti li zarlo o inten tar reins ta larlo (debido a que la ins ta la ción se quedó amitad de camino).

Esto no se aplica a Del phi 3 y superiores, en los que los com po nen tes se ins ta-lan den tro de paque tes. No existe el cua dro de lista Insta lled Units en esasver sio nes de Del phi. Para ver qué com po nentes han sido ins ta la dos en las pági-nas de la Paleta de Compo nen tes en Del phi 3 y superiores, selec cione Com po-nent | Con fi gure Palette. Para ver qué com po nen tes están ins ta la dos porpaquete, siga estos pasos:1. Selec cione Com po nent | Install Pac ka ges.2. En la sec ción Design Pac ka ges del cua dro de dia logo que se des pliega,

selec cione el paquete que desea ins pec cio nar.3. Pulse el botón Com po nents.

Mensajes de error 35

Page 70: Dsp

A page must be empty before it can be deletedPo si ble cau sa de error

Puede estar inten tando eli mi nar una página de la Paleta de Compo nen tes quecon tiene toda vía com po nen tes.

So lu ción rá pi daEli mine todos los com po nen tes de una página antes de inten tar eli mi nar lapágina. Si desea que darse con los com po nen tes pero des ha cerse de la página,arrás tre los de la página que desea eliminar a otra página; enton ces podrá eli-mi nar la página.

Infor ma ción adi cio nal

Delphi 1 y 2

Para eli mi nar un com po nente, siga estos pasos:1. Selec cione Com po nent | Con fi gure Palette.2. En el cua dro de lista Pages, del lado izquierdo del cua dro de diá logo que se

des pliega, selec cione la página que con tiene el com po nente que deseaeliminar. Los com po nen tes que la inte gran apa re ce rán en el cua dro de listaCom po nents al lado dere cho.

3. Selec cione el com po nente que desea eli mi nar.4. Pulse el botón Delete.5. Pulse el botón OK.

Delphi 3

Para eli mi nar com ple ta mente un com po nente (a dife ren cia de moverlo a unapágina dife rente), ten drá que eli mi narlo del paquete en el que reside.

Para borrar un com po nente de un paquete, siga estos pasos:1. Selec cione Pro ject | Options, y luego pulse sobre la pes taña Pac ka ges.2. En la sec ción Design Pac ka ges de la página Pac ka ges, selec cione el

paquete donde está el com po nente que quiere eli mi nar (para ver qué com-po nen tes están con te ni dos en cada paquete, pulse el botón Com po nents).

3. Pulse el botón Edit (no pulse el botón Remove, a menos que se quiera des-ha cer de todo el paquete).

4. Selec cione Yes en el cua dro de diá logo de con fir ma ción que apa rece.5. Pulse con el botón dere cho sobre la uni dad que quiere eliminar y selec cione

Remove Unit del menú de con texto.

36 Los Tomos de Delphi: Delphi sin problemas

Page 71: Dsp

Delphi 4 y superiores

Para eliminar un com po nente, debe eli mi nar el paquete en el que éste reside.Para hacerlo, siga estos pasos:1. Selec cione Pro ject | Options, y luego pulse sobre la pestaña Pac ka ges.2. En la sec ción Design Pac ka ges de la página Pac ka ges, selec cione el

paquete donde se encuen tra el com po nente que quiere eli mi nar (para verqué com po nen tes están con te ni dos en cada paquete, pulse el botónCom po nents).

3. Pulse el botón Remove.4. Selec cione Yes en el cua dro de diá logo que apa rece para con fir mar la eli mi-

na ción del paquete.

A reference to <> already exists in the Type LibraryPo si ble cau sa de error

Puede estar inten tando crear un con trol Acti veX basado en un com po nenteVCL, y el nom bre dado al con trol Acti veX ya ha sido uti li zado.

So lu ción rá pi daCam bie el nom bre en el cua dro de edi ción New Acti veX Name a uno que seaúnico entre los com po nen tes de su VCL.

Infor ma ción adi cio nalCuando se deriva un con trol Acti veX de un com po nente de Del phi uti li zando elAsis tente de Con tro les Acti veX (File | New | Acti veX | Acti veX Con trol),el asis tente crea un nom bre por defecto para el nuevo con trol Acti veX eli mi-nando la ‘T’ del prin ci pio del nom bre de la clase del com po nente y aña diendouna ‘X’ al final. Por ejem plo, si deriva un con trol Acti veX de un com po nente desu biblio teca lla mado TNav Pa nel, el asis tente gene rará para el nuevo con trol elnom bre Nav Pa nelX. Usted puede cam biar este nom bre si lo desea, y si ya hacreado un con trol Acti veX a par tir del com po nente y ha uti li zado este nom brepor defecto la vez anterior, ten drá que uti li zar un nuevo nom bre en las oca sio-nes sub si guien tes o reci birá el men saje de error bajo discusión.

A required .DLL file, <>, was not foundPo si ble cau sa de error

Puede estar tra tando de eje cu tar un pro grama que ha sido com pi lado para uti-li zar paque tes de tiempo de eje cu ción, y uno (o más) de esos paque tes, por

Mensajes de error 37

Page 72: Dsp

ejem plo VCL30.DPL, no está ins ta lado en la máquina o no está situado en eldirec to rio ade cuado.

So lu ción rá pi daAse gú rese de que todos los paque tes reque ri dos estén ins ta la dos en el direc to-rio de sis tema de Win dows (C:\Win dows\System).

Infor ma ción adi cio nalEn Del phi 3, VCL30.DPL es el archivo de biblio teca de com po nen tes prin ci pal.En Del phi 4, es VCL40.BPL, y en Del phi 5 - VCL50.BPL. En Del phi 6, sinembargo, las cosas cam bian: es sim ple mente VCL.BPL. Todos los pro ble mas dever sio nes se resol ve rán con ser vando estos archi vos en loca li za cio nes sepa ra daspara cada ver sión de Del phi que tenga ins ta lada. En otras pala bras, Del phi 7pre su mi ble mente ven drá con un archivo deno mi nado VCL.BPL (como lo haceDel phi 6), pero éste será ins ta lado en un lugar dife rente del disco que elVCL.BPL que viene con Del phi 6. Estos fiche ros (VCL*.BPL) sus ti tu yen par-cial mente a COMPLIB.DCL (Del phi 1) y CMPLIB32.DCL (Del phi 2). Deci mos“par cial mente” debido a que la biblio teca de código com pleta de Del phi estáahora divi dida en varios fiche ros .BPL dife ren tes (VCL.BPL, RTL.BPL, etc.).

Cuando esté cons tru yendo apli ca cio nes para uti li zar los paque tes de tiempo deeje cu ción, ase gú rese de que todos los paque tes reque ri dos se ins ta len en lamáquina de des tino. Puede hacer esto uti li zando Install Shield Express, que espro por cio nado con la mayo ría de las ver sio nes de Del phi.

A transaction is already activePo si ble cau sa de error

Puede haber ini ciado una tran sac ción en DBExpress mien tras otra tran sac ciónya estaba en curso. Por ejem plo, puede haber hecho una segunda lla mada almétodo Start Tran sac tion sin antes con fir mar o des ha cer la pri meratran sac ción.

So lu ción rá pi daDebe confir mar o des ha cer cual quier tran sac ción antes de ini ciar otra.

Infor ma ción adi cio nalEn DBExpress, las tran sac cio nes son nume ra das. Por ejem plo:

SQLTran sac tion1.Start Tran sac tion(1);

38 Los Tomos de Delphi: Delphi sin problemas

Page 73: Dsp

Cuando se encie rra un con junto de ope ra cio nes sobre una base de datos en unatran sac ción, se deben con fir mar los cam bios o des ha cer los al final de la eje cu-ción de las ope ra cio nes. Por ejem plo:

SQLCon nec tion1.Start Tran sac tion(1);try {Aquí las ope ra cio nes sobre la base de da tos} SQLCon nec tion1.Com mit(1);ex cept SQLCon nec tion1.Roll back(1);end;

A user transaction is already in progressPo si ble cau sa de error

Puede estar inten tando ini ciar una tran sac ción de base de datos mien tras unatran sac ción ante rior está toda vía en curso. Por ejem plo, el siguiente código oca-sio nará el men saje de error bajo dis cu sión:

be gin with Da ta ba se1 do be gin Con nec ted := True;

Start Tran sac tion; try Query1.Acti ve := True; Start Tran sac tion; {bo rre esta lí nea para evi tar el error}

Com mit; ex cept Roll back;

end; end;end;

So lu ción rá pi daDebe fina li zar una tran sac ción de base de datos con fir mán dola o des ha cién dolaantes de ini ciar otra.

Infor ma ción adi cio nalCon sulte “Start Tran sac tion” e “InTran sac tion” en la ayuda de Del phi para másinfor ma ción.

Mensajes de error 39

Page 74: Dsp

A value must be specified for <>Po si ble cau sa de error

No se ha asig nado valor a un campo de una tabla de base de datos que fueespe ci fi cado como obli ga to rio (en el momento en que la tabla fue dise ñada opos te rior mente mediante código).

So lu ción rá pi daAse gú rese de asig nar siem pre un valor a todos los cam pos obli ga to rios de lastablas.

Infor ma ción adi cio nalSe pue den uti li zar tres nive les dife ren tes de vali da ción de los datos de unatabla: a nivel de tabla, a nivel de regis tro y a nivel de campo. Adi cio nal mente,se puede impo ner una vali da ción a nivel de carac te res en el momento que elusua rio está intro du ciendo valo res uti li zando la pro pie dad Edit Mask de TFieldo a tra vés de código per so na li zado añadido a cual quiera de los even tos OnKey-Down u OnKeyP ress.

La vali da ción a nivel de tabla se esta blece durante el diseño de la tabla paragaran ti zar que el tipo de datos y el tamaño del campo es apro piado para losvalo res con los que el campo será lle nado. Por ejem plo, un campo lla madoDateOf Birth (Fecha de Naci miento) deberá uti li zar el tipo de datos Date, uncampo lla mado Last Name (Apellido) deberá con te ner un String (cono cido comoAlpha en Para dox, Char y VarC har en las bases de datos SQL), etc.

Puede (y se reco mienda hacerlo) espe ci fi car un campo o columna de una tablacomo su clave pri ma ria. Esto evita que a dos regis tros se les pueda asig nar elmismo valor para este campo. Un ejem plo de dónde podría uti li zar esta carac-te rís tica es en un campo SSN (Número de Segu ri dad Social) para una tablaEmplo yee (Emplea dos). Los cam pos de tipo Autoin cre ment tam bién se uti li zanfrecuentemente como claves pri ma rias.

Uti li zando el Data base Desk top y tablas Para dox, se esta blece un campo comoclave pri ma ria de la tabla durante su diseño haciendo doble clic sobre lacolumna Key (o pul sando cual quier tecla cuando la columna tenga el foco). Sicrea la tabla mediante código, puede uti li zar el método AddIndex y el valorixP ri mary en el pará me tro Options para indi car que el campo es clave pri ma-ria. Con sulte “TTa ble.AddIndex” en la ayuda de Del phi para más infor ma ción.

Adi cio nal mente, puede desig nar cam pos como obli ga to rios (requi red) para evi-tar que puedan ser dejados en blanco. Para hacer esto en el Data base Desk topcon tablas Para dox, selec cione la casilla de verificación 1. Requi red Fieldmien tras el campo que se quiere hacer obli ga to rio está selec cio nado en la sec-ción Field Ros ter.

40 Los Tomos de Delphi: Delphi sin problemas

Page 75: Dsp

Si crea la tabla mediante código, puede uti li zar el método Field Defs.Add deTTa ble y asig nar el valor True al pará me tro Requi red. Por ejem plo, si deseacrear cua tro defi ni cio nes de campo, esta ble ciendo los dos pri me ros como obli ga-to rios y los dos siguien tes como opcionales, podría hacerlo de esta manera:

Ta ble1.Field Defs.Add('OfDreams', ftString, 20, True);Ta ble1.Field Defs.Add('WC', ftBlob, 256, True);Ta ble1.Field Defs.Add('DepthOf', ftInte ger, 0, Fal se);Ta ble1.Field Defs.Add('Mrs', ftBytes, 32, Fal se);

Los pará me tros del método Add son:1. El nom bre que se asigna al campo.2. El tipo de datos que se asigna al campo.3. El tamaño del campo (0 en caso de que la elec ción del tamaño no sea posi-

ble para el tipo de datos, como en el caso de un campo Inte ger)4. El pará me tro boo leano Requi red, para indi car si el campo es obli ga to rio o

no.

Con sulte “TDa ta Set.Field Defs” en la ayuda de Del phi para más infor ma ción.

La vali da ción a nivel de tabla sola mente, sin embargo, no evita que el usua riointro duzca un valor inco rrecto del tipo de datos correcto. Por ejem plo, la intro-duc ción de 15/10/1879 como fecha de naci miento o de K6%l3^b6&n como elape llido de un empleado será acep tado como una entrada válida (a menos quese haya imple men tado algún código defen sivo para pre ve nir estos tipos deerro res).

La vali da ción a nivel de regis tro tam bién se pro por ciona durante el diseño dela tabla, cuando es posi ble designar un campo como clave pri maria (Del phigaran ti zará que no se intro duzca el mismo valor para ese campo en dos regis-tros dife ren tes), desig nar un campo como obli ga to rio (Del phi no per mi tirá quesea dejado en blanco), o asig nar los valo res míni mos o máxi mos que pue den seracep ta dos por el campo, etc.

La vali da ción a nivel de tabla y de regis tro es rea li zada por Del phi siem pre queusted intente moverse del regis tro que está inser tando o modificando a otroregis tro diferente. Si los valo res de cual quiera de los cam pos violan las reglasde vali da ción incor po ra das a la base de datos, reci birá los men sa jes de errorapro pia dos en ese momento.

Si pre fiere pro por cio nar la vali da ción a nivel de regis tro mediante código, uti-lice el evento Befo re Post de TDa ta Set (TTa ble, TQuery y TSto redP roc sontodos des cen dien tes de TDa ta Set que están dis po ni bles en todas las ver sio nesde Del phi; TClient Da ta set está dis po ni ble a par tir de Del phi 3 y 4 edi ciónCliente/Ser vi dor; TNes ted Ta ble apa re ció por pri mera vez en Del phi 4). Paramás infor ma ción, con sulte “TDa ta Set.Befo re Post” en la ayuda de Del phi.

Si lo desea, puede tam bién pro por cio nar vali da ción a nivel de campo, que seeje cuta inme dia ta mente des pués de que se intro duzca un valor para un campo

Mensajes de error 41

Page 76: Dsp

(al con tra rio de espe rar hasta que los valo res de todos los cam pos del regis trosean intro du ci dos).

Para imple men tar la vali da ción a nivel de campo, puede uti li zar el eventoOnVa li date de la clase TField. Uti li zando este evento, podrá detec tar un erroren la intro duc ción de datos inme dia ta mente, y no varios cam pos más ade lante.

Por ejem plo, he aquí un ges tor de even tos que puede ser asig nado a un eventoOnVa li date de TField para impe dir que un valor ina pro piado sea intro du cido:

const crlf = #13#10; {re tor no/cam bio de línea} ...pro ce du re TForm1.Ta ble1 Quan tity Va li da te(Sen der: TField);be gin if Ta ble1 Quan tity.Va lue < 1 then be gin rai se Excep tion.Crea te( Cada ítem so li ci ta do re quie re' + crlf +

‘ una can ti dad de al me nos 1.' + crlf + ‘De lo con tra rio, ire mos a la quie bra' + crlf +

' y se que da rá sin tra ba jo.'); Edit3.Co lor := clRed; Edit3.Set Fo cus;

end;end;

La excep ción que es creada “al vuelo” mediante la lla mada a Excep tion.Createevita que el valor sea intro du cido en el campo. Las dos siguien tes líneas decódigo mue ven el cur sor al con trol en el que el usua rio intro dujo el valor y loresaltan en rojo, para que el usua rio vuelva a intro du cir un valor ade cuado.

Hay toda vía otra forma de imple men tar la vali da ción a nivel de campo: uti li-zando las pro pie da des Cus tom Cons traint y Cons traintError Mes sage de TField.Cus tom Cons traint es una sen ten cia SQL que debe eva luarse a True para quela entrada sea con si de rada válida. Cons traintError Mes sage es el men saje queel usua rio verá cuando la res tric ción falle (la entrada no sea válida).

Para utili zar estas dos pro pie da des para implementar la vali da ción mos tradaen el pro ce di miento Table1 Quan tity Va li date, asigne a Cus tom Cons traint elvalor x > 0 y a Cons traintError Mes sage el valor “Cada ítem requiere una can-ti dad de al menos 1. De lo con tra rio, ire mos a la quie bra y se que dará sintra bajo”.

Existe tam bién una pro pie dad de sólo lec tura lla mada Impor ted Cons traint,que mues tra las res tric cio nes crea das del lado del ser vi dor (si está conec tán-dose a un ser vi dor SQL). No puede alte rar esta pro pie dad, pero sí puede aña dirnue vas res tric cio nes a las impor ta das asig nán dole un valor a la pro pie dad Cus-tom Cons traint. Con sulte en la ayuda de Del phi “TField.Cus tom Cons traint” y“TField.Cons traintError Mes sage” para más infor ma ción.

Si quiere una retroa li men ta ción aún más inme diata para los usua rios cuandoéstos intro duz can datos, espe cial mente en el caso de datos que deman den unfor mato muy pre ciso, puede uti li zar la pro pie dad Edit Mask de TField. Esto se

42 Los Tomos de Delphi: Delphi sin problemas

Page 77: Dsp

conoce como vali da ción a nivel de carac te res. Mien tras el evento OnVa li date deTField valida una asig na ción de valor a un campo como un todo, la pro pie dadEdit Mask de TField per mite la vali da ción de los datos carác ter a carác ter en elmomento en que son intro du cidos por el usua rio.

La pro pie dad Edit Mask pro por ciona muchas más ca ras pre de fi ni das para vali-dar números de telé fono, códi gos pos ta les, fechas y horas. Usted puede tam biéncrear sus pro pias más ca ras para los tipos espe cí fi cos de entra das reque ri daspor su apli ca ción. Si asigna valor a un campo mediante pro gra ma ción, la vali-da ción esta ble cida por Edit Mask no es rea li zada; en este caso, uti lice el eventoOnValidate de TField para vali dar la entrada antes de que sea enviada a latabla. Para más infor ma ción, con sulte “TField.Edit Mask” en la ayuda deDel phi.

Si todas las posi bles entra das váli das para un campo son cono ci das de ante-mano o están con te ni das en una tabla, otra manera efec tiva de ase gu rar quetodas las entra das de usua rio sean váli das es uti li zar los com po nen tesTDBLoo kup Lis tBox y/o TDBLoo kup Com bo Box. De esta manera, se puede limi-tar a los usua rios a selec cio nar uno de los posi bles valo res del campo. Para másinfor ma ción, con sulte “TDBLoo kup List Box” y “TDBLoo kup Com bo Box” en laayuda de Del phi.

A Win32 API function failedCon sulte “EOutO fRe sour ces”.

Abstract method errorPo si ble cau sa de error

1. Puede estar inten tando eje cu tar un método vir tual abs tracto. Por ejem plo,puede haber creado un des cen diente de TCus tomG rid sin rede fi nir elmétodo vir tual abs tracto Draw Cell de TCus tomG rid, y haber inten tado lla-mar a ese método.

2. De modo simi lar al punto anterior, puede estar inten tando lla mar a losméto dos Delete o Insert de TString Grid.

So lu ción rá pi da1. Debe rede fi nir e imple men tar cual quier método vir tual abs tracto antes de

lla marlo. Para el ejem plo de TCus tomG rid, rede fina el método Draw Cell enla decla ra ción del com po nente, de esta forma:

pro tec ted pro ce du re Draw Cell(ACol, ARow: Lon gint; ARect: TRect; ASta te: TGridD rawS ta te); ove rri de; . . .

Mensajes de error 43

Page 78: Dsp

Y luego imple mén telo, de esta forma:

pro ce du re TGridI ron.Draw Cell(ACol, ARow: Lon gint; ARect: TRect; ASta te: TGridD rawS ta te);be gin {Há ga lo a su ma ne ra}end;

2. No llame a los méto dos Delete o Insert de una reji lla de cade nas, ya queestos méto dos vir tua les abs trac tos no son rede fi ni dos en la clase des cen-diente de TStrings (TString GridS trings) que las pro pie da des Rows yColumns uti li zan.

Infor ma ción adi cio nalLos méto dos vir tua les pue den ser rede fi ni dos en las cla ses des cen dien tes. Losméto dos vir tua les abs trac tos deben ser rede fi ni dos en las cla ses des cen dien tes.Tenga en cuenta este tipo de situa cio nes cuando herede de un com po nenteTCus tomX, así como de la clase TStrings.

Abstract methods must be virtual or dynamicPo si ble cau sa de error

Puede estar inten tando decla rar un método abs tracto, pero haber omi tido ladirec tiva Vir tual o Dyna mic.

So lu ción rá pi daIncluya la direc tiva Virtual o Dyna mic detrás de la sig na tura del método,antes de la direc tiva Abstract.

Infor ma ción adi cio nalPara los méto dos nor ma les (no abs tractos), el tipo de método por defecto es elestá tico. Para méto dos abs trac tos, se debe espe ci fi car Virtual o Dyna mic. Losméto dos Abstract deben ser rede fi ni dos, ya que no están defi ni dos en la clasedonde han sido decla ra dos. Esa es la razón por la cual este tipo de cla ses seconoce gene ral mente como clases base (otras cla ses here dan de ellas, rede fi-niendo el com por ta miento abs tracto). Las tres decla ra cio nes siguien tes sontodas acep ta bles:

pro ce du re Ra dio(Inter fe ren ce: Va riant); {mé to do es tá ti co}pro ce du re Rea lity(Me mory: Exten ded); vir tual; {mé to do vir tual}pro ce du re Fluid(Duo: Boo lean); dyna mic; {vir tual y di ná mi co}

Sin embargo, decla rar un método abs tracto como el siguiente pro du cirá el errorbajo dis cu sión:

pro ce du re Extra po la te(Inter po la te: Exten ded); abs tract;

44 Los Tomos de Delphi: Delphi sin problemas

Page 79: Dsp

Para evi tar el error, declare el método de una de las siguien tes for mas:

pro ce du re Extra po la te(Inter po la te: Exten ded); vir tual; abs tract;pro ce du re Extra po la te(Inter po la te: Exten ded); dyna mic; abs tract;

Para más infor ma ción sobre las dife ren cias y las ven ta jas/des ven ta jas de uti li-zar méto dos está ti cos, vir tua les y diná mi cos en dife ren tes cir cuns tan cias, con-sulte “dis pat ching met hods” en la ayuda de Del phi.

Access violation (General Protection Fault)Po si ble cau sa de error

Algu nas veces parece ser que hay más mane ras de obte ner una vio la ción deacceso que par tí cu las sub a tó mi cas en el uni verso. Este es un men saje de errorbas tante gené rico, común y serio.

1. Puede estar inten tando hacer refe ren cia a un objeto que no existe toda vía oque ha dejado de exis tir. Por ejem plo, puede estar inten tando abrir unTTa ble en el evento OnCreate del for mu la rio prin ci pal cuando el TTa bleestá loca li zado en un for mu la rio o módulo de datos que no ha sido creadotoda vía (pre fe ren te mente un módulo de datos).

2. Puede haber creado un com po nente que hace refe ren cia a otro com po nentea tra vés de una de sus pro pie da des, pero ha olvi dado rede fi nir el métodoNoti fi ca tion. Por esta razón, su com po nente puede seguir haciendo refe ren-cia a un com po nente ya ine xis tente si se eli mina el com po nente al que lapro pie dad de su com po nente hace refe ren cia.

3. Puede haber colo cado en el for mu la rio un com po nente que no hace la lla-mada a Inhe ri ted en su cons truc tor.

4. Puede haber publi cado una pro pie dad del tipo de dato Real en un com po-nente en Del phi 1, 2, o 3 (el tipo Real es admi tido en los com po nen tes enDel phi 4 y pos te rio res, donde se imple men tan de una manera dis tinta a lasver sio nes ante rio res de Del phi). Por ejem plo, el siguiente código gene raráel men saje de error bajo dis cu sión (ante rior a Del phi 4):

unit No Rea lityAllo wed;in ter fa ce uses WinT ypes, WinP rocs, Clas ses, Con trols, Forms;type TDont Get Real = class(TWin Con trol)pri va te FEsta te: Real;pu blis hed Esta te: Real read FEsta te wri te FEsta te;end;

5. Puede estar pasando un pará me tro invá lido a una lla mada a la API deWin dows. Por ejem plo, puede estar pasando un pun tero invá lido comopará me tro de buf fer.

Mensajes de error 45

Page 80: Dsp

6. Puede estar uti li zando pun te ros y haber olvi dado reser var la memo riaantes de acce der a ella tra vés de un pun tero, o estar inten tando hacer refe-ren cia a una zona de memo ria que ya ha sido libe rada.

7. Puede tener una con fi gu ra ción del pará me tro del BDESHAREDMEMLOCATION que es con tra dic to ria con otros pro ce sos.

So lu ción rá pi da1. Ase gú rese de que los obje tos a los que hace refe ren cia ya hayan sido crea-

dos, y que no se haga nin guna refe ren cia a obje tos des pués que hayan sidodes trui dos. Por ejem plo, ase gú rese de que el for mu la rio (o módulo de datos)en el que su objeto reside haya sido creado (y no haya sido toda vía des-truido) cuando haga refe ren cia a cual quiera de sus pro pie da des y méto dos.

2. Rede fina el método Noti fi ca tion y asigne Nil a la pro pie dad en caso de queel com po nente al que se hace refe ren cia sea eliminado del for mu la rio. Porejem plo, he aquí las par tes rele van tes para la imple men ta ción del códigode noti fi ca ción:

TForT he Ti ller man = class(TCom po nent);pri va te FRe fe ren cedO bject: TBird;. . .pro tec ted pro ce du re No ti fi ca tion(ACom po nent: TCom po nent; Ope ra tion: TOpe ra tion); ove rri de;. . .im ple men ta tion. . .pro ce du re TForT he Ti ller man.No ti fi ca tion(ACom po nent: TCom po nent; Ope ra tion: TOpe ra tion);be gin in he ri ted No ti fi ca tion(ACom po nent, Ope ra tion); if (Ope ra tion = op Re mo ve) and (ACom po nent = FRe fe ren cedO bject) then

FRe fe ren cedO bject := nil;end;

3. Si tiene acceso al archivo fuente del com po nente (*.PAS), ase gú rese de queéste rede fine el cons truc tor de su ances tro de la siguiente forma:

pu blic . . . cons truc tor Crea te(AOwner: TCom po nent); ove rri de;. . .cons truc tor TCon trol.Crea te(AOwner: TCom po nent);be gin {Esto hace ac ce si ble a los mé to dos y pro pie da des he re da dos y re ser va me mo ria para ellos} in he ri ted Crea te(AOwner); . . .end;

46 Los Tomos de Delphi: Delphi sin problemas

Page 81: Dsp

4. Si nece sita uti li zar un número de punto flo tante en la sec ción Publis heddel com po nente (en Del phi 1, 2, o 3), no uti lice el tipo de datos Real; enlugar de ello, uti lice Sin gle, Dou ble, Exten ded o Comp.

5. Con sulte la ayuda de la API de Win dows para obte ner infor ma ción sobre lafun ción de la API y los pará me tros y tipos de pará me tros que espera. Sinece sita más infor ma ción de la que el archivo de ayuda ofrece (¡es un pro-ducto de Micro soft, no de Bor land!), con sulte “Los Tomos de Del phi: Núcleodel API Win32”, de John Ayres y otros, edi tada en cas te llano por Dany-press (http://www.dany press.com), que ofrece un enfo que orien tado a Del phide las fun cio nes de la API de Win dows, con ejem plos espe cí fi cos de cómouti li zar las desde Del phi.

6. Siem pre reserve memo ria antes de hacer refe ren cia a ella a tra vés de unpun tero, y libere la memo ria cuando ter mine de tra ba jar con ella. Por ejem-plo, podría reser var cierta memo ria en la sec ción Ini tia li za tion de launi dad, y libe rar la memo ria en su sec ción Fina li za tion, de esta manera:

ini tia li za tion New(ptrOne); New(ptrTwo); . . .fi na li za tion Dis po se(ptrOne); Dis po se(ptrTwo); . . .end;

Si está tra ba jando con Del phi 1, no dis pon drá de una sec ción Fina li za tion.Ten drá que libe rar la memo ria en cual quier otro lugar, o crear un pro ce di-miento de salida, de esta manera:

pro ce du re Gar ba ge Co llec tion; far;be gin Dis po se(ptrOne); Dis po se(ptrTwo); . . .end;ini tia li za tion New(ptrOne); New(ptrTwo); . . . AddExitP roc(Gar ba ge Co llec tion);end.

7. Si está eje cu tando Win dows 95/98, asigne a SHAREDMEMLOCATION unvalor entre $9000 y $FFFF; si es Win dows NT/2000, entre $1000 y $7F00.

Infor ma ción adi cio nalPara crear diná mi ca mente un for mu la rio (y pos te rior mente des truirlo), sigaestos pasos:

a. Seleccione View | Pro ject Man ager.

Mensajes de error 47

Page 82: Dsp

b. Pulse el botón Options.c. En el cuadro de lista Auto-Cre ate Forms, seleccione el formulario que

desea crear dinámicamente.

d. Pulse el botón de flecha a la derecha, para mover el formulario a lalista Avail able Forms.

e. Pulse el botón OK.f. Modifique el código 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 mos trar 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 Cre ate, provocará el mensaje deerror bajo discusión.Es una buena idea crear dinámicamente los formularios en el código,especialmente cuando éstos no son utilizados durante todo el tiempoque el programa está en ejecución. Si no crea los formulariosdinámicamente, éstos serán automáticamente creados por Delphidurante el arranque de la aplicación. Casi siempre querrá que Delphicree automáticamente el formulario principal, pero debería considerarposponer la creación de los demás formularios hasta tanto se necesiten.

7. Con sulte “BDE Ini tia li za tion Error $2501”.

Access vio la tion at address <>.<> of address <>Po si ble cau sa de error

Puede haber sobres crito la pila mani pu lando direc ta mente un pun tero en lugardel área de memo ria a la que él apunta. En otras pala bras, puede haber olvi-dado derre fe ren ciar un pun tero. Por ejem plo, el siguiente código pro vo cará estemen saje de error (“… Read of address 00000000”):

var ptrBuf: Poin ter; //o cual quier otro tipo puntero, como PCharbe gin

48 Los Tomos de Delphi: Delphi sin problemas

Page 83: Dsp

Get Mem(ptrBuf, Righ tSi ze);Fill Char(ptrBuf, Righ tSi ze, 0);

So lu ción rá pi daUti lice el ope ra dor de derre fe ren cia ción (^), de esta manera:

var ptrBuf: Poin ter; //o cual quier otro tipo puntero, como PCharbe gin Get Mem(ptrBuf, Righ tSi ze); Fill Char(ptrBuf^, Righ tSi ze, 0);

Infor ma ción adi cio nalEn el con texto del ejem plo anterior, el código com pila sin error, ya que es sin-tác ti ca mente correcto. Sin embargo, dado que el pun tero en sí (y no la memo riaa la que apunta) es quien ha sido relle nado con ceros, cuando el pro gramaeven tual mente vuelva a la pila para ver a dónde debe retornar, la direc ciónque leerá no será una direc ción válida, sino $00000000 (lo que pro vo cará elmen saje de error).

Ambiguous overloaded call to <>Po si ble cau sa de error

Puede haber uti li zado una com bi na ción de sobre carga de méto dos y pará me trospor defecto (ambas carac te rís ti cas fue ron intro du ci das en Del phi 4), y luegohaber hecho una lla mada a pro ce di miento o fun ción que podría corres pon der avarios de esos méto dos sobre car ga dos. Por ejem plo, si declara los siguien tesméto dos sobre car ga dos:

pro ce du re PTBoat(I: Inte ger; J: Inte ger = 0); over load;pro ce du re PTBoat(Size: Inte ger); over load;. . .

Y luego intenta lla mar a uno de ellos de esta manera:

pro ce du re TForm1.But ton1 Click(Sen der: TObject);be gin PTBoat(109);end;

Obten drá este men saje de error, ya que es impo si ble para el com pi la dor deter-mi nar a cuál de los dos pro ce di mien tos está lla mando.

Mensajes de error 49

Page 84: Dsp

So lu ción rá pi daPuede lla mar al método que uti liza el pará me tro por defecto pro por cio nán doleel segundo pará me tro (aún cuando su valor sea el mismo que el valor pordefecto pro por cio nado en la decla ra ción), de esta manera:

pro ce du re TForm1.But ton1 Click(Sen der: TObject);be gin PTBoat(109, 0) {lla ma al se gun do mé to do PTBoat}end;

Infor ma ción adi cio nalLa solu ción mos trada arriba no es la apro xi ma ción reco men dada, ya que ustedno sería capaz de lla mar al otro método PTBoat. Es mejor evi tar la uti li za cióncon junta de méto dos con el mismo nom bre (sobre car ga dos) y pará me tros pordefecto, a menos que las sig na tu ras de los métodos difieran lo sufi ciente comopara no cau sar con fu sión (al hom bre o a la máquina) cuando se llame a cual-quiera de los méto dos.

Ancestor component not foundPo si ble cau sa de error

Puede haber cam biado un for mu la rio que here daba de otro tipo de for mu la rio(heren cia visual) para hacerlo des cen diente de un TForm “gené rico”, y luegohaber selec cio nado View As Text seguido de View As Form desde el menú decon texto del for mu la rio. Por ejem plo, puede haber cam biado una decla ra ción detipo de un for mu la rio de:

TForm Main te nan ceS cript = class(Tss_Ba seS ta tus Form)

a:

TForm Main tai nan ceS cript = class(TForm)

So lu ción rá pi daSi la inten ción es real mente cam biar a TForm como clase base, sim ple mentepulse OK en res puesta a todos los men sa jes “Com po nent was dele ted, deleterefe rence?”.

Infor ma ción adi cio nalSi quiere colo car los com po nentes sobre el for mu la rio que ahora des ciende deTForm, selec cione Create com po nent as new on the des cen dant.

50 Los Tomos de Delphi: Delphi sin problemas

Page 85: Dsp

An error occurred while attempt ing to ini tial ize the BorlandData base Engine (error <>)

Po si ble cau sa de errorPuede haber dejado de lla mar a Ses sions.Open Ses sion antes de lla mar a unafun ción del BDE.

So lu ción rá pi daLlame a Ses sions.Open Ses sion antes de lla mar a la fun ción del BDE.

Infor ma ción adi cio nalTam bién es posi ble que esté eje cu tando con insu fi ciente memo ria.

Si el código del error es $2C08, con sulte “Not ini tia li zed for acces sing net-work files”.

Si el código del error es $2C09, con sulte “Share not loa ded. It is requi redto share local files”.

Si el código del error es $2108, con sulte “Can not locate IDAPI32.DLL”.

Si el código del error es $2109, con sulte “Can not load IDAPI32.DLL”.

Another file named <> is already on the search pathCon sulte el men saje “Anot her file with the same base name (<>) isalready on the search path”.

Another file with the same base name (<>) is already on the searchpath

Po si ble cau sa de errorPuede estar inten tando ins ta lar en la VCL un com po nente del que ya hay unaver sión ins ta lada (o un com po nente dife rente con el mismo nom bre ya estáins ta lado).

So lu ción rá pi daSi está reem pla zando una ver sión más anti gua por una nueva ver sión, pri meroeli mine la ver sión más vieja de la biblio teca de com po nen tes antes de ins ta larla nueva ver sión.

Mensajes de error 51

Page 86: Dsp

Si el archivo no es una nueva ver sión de un archivo exis tente, pero tiene elmismo nom bre de otro archivo ya exis tente (y desea con ser var el archivo ori gi-nal en su biblio teca de com po nen tes), sim ple mente cam bie el nom bre del nuevocom po nente e intente ins ta larlo de nuevo.

Infor ma ción adi cio nalPara eliminar un com po nente exis tente de su biblio teca de com po nen tes, sigaestos pasos:

Delphi 1y 2

Para eliminar un com po nente, siga estos pasos:1. Selec cione Com po nent | Con fi gure Palette.2. En el cua dro de lista Pages situado a la izquierda del cua dro de diá logo

que se des pliega, selec cione la página que con tiene el com po nente quedesea eli mi nar. Los com po nen tes que inte gran esa página apa re ce rán en elcua dro de lista Com po nents al lado dere cho.

3. Selec cione el com po nente que desea borrar.4. Pulse el botón Delete.5. Pulse el botón OK.

Delphi 3

Para eli mi nar un com po nente en Del phi 3 pue den uti li zarse dos méto dos:

Puede eli mi nar un com po nente de una página en par ti cu lar:1. Selec cione Com po nent | Con fi gure Palette.2. Selec cione la página en la que el com po nente reside en el cua dro de lista

Pages.3. Pulse sobre el com po nente en el cua dro de lista Com po nents (no es sufi-

ciente que el com po nente esté sim ple mente resal tado — debe pul sar sobreél para evi tar obte ner el men saje de error “A page must be emptybefore it can be dele ted”).

4. Pulse el botón Delete.

O puede eliminar un com po nente de un paquete en par ti cu lar:1. Selec cione Pro ject | Options, y luego pulse sobre la pestaña Pac ka ges.2. En la sec ción Design Pac ka ges de la página Pac ka ges, selec cione el paquete

en el que reside el com po nente que desea eli mi nar (para ver qué com po nen-tes están con te ni dos en cada paquete, pulse el botón Com po nents).

3. Pulse el botón Edit (no pulse el botón Remove, a menos que quiera des ha-cerse del paquete entero).

4. Selec cione Yes en el cua dro de diá logo de con fir ma ción que apa rece.5. Pulse con el botón dere cho sobre la uni dad que desea eli mi nar y selec cione

la opción Remove Unit del menú de con texto.

52 Los Tomos de Delphi: Delphi sin problemas

Page 87: Dsp

Para loca li zar el archivo que tiene el mismo nom bre del que se está inten tandoins ta lar, selec cione Tools | Envi ron ment Options. . . y luego ins pec cione elcua dro Library path de la página Library para deter mi nar el camino de bús-queda que Del phi está uti li zando. Puede luego bus car el archivo en esos direc-to rios uti li zando las carac te rís ti cas del Explo ra dor de Win dows.

Delphi 4 y superiores

Puede ocul tar un com po nente de modo que no apa rezca en la Paleta de Com po-nen tes, o eliminar el paquete en el que reside.

Para hacer que un com po nente no apa rezca en la Paleta (escon derlo), sigaestos pasos:1. Selec cione Com po nent | Con fi gure Palette.2. Selec cione la página de la paleta en la que el com po nente apa rece en el

cua dro de lista Pages.3. Pulse sobre el com po nente en el cua dro de lista Com po nents (no basta

con sim ple mente selec cio nar el com po nente — debe pul sar sobre él paraevi tar obte ner el men saje de error “A page must be empty before it canbe dele ted” ).

4. Pulse el botón Hide.

Para eliminar un com po nente de un paquete en par ti cu lar, siga estos pasos:1. Selec cione Pro ject | Options, y luego pulse sobre la pes taña Pac ka ges.2. En la sec ción Design Pac ka ges de la página Pac ka ges, selec cione el

paquete en el que el com po nente que desea eli mi nar reside (para ver quécom po nen tes están con te ni dos en cada paquete, pulse el botónCom po nents).

3. Pulse el botón Remove.

Application is not licensed to use this featurePo si ble cau sa de error

Puede estar inten tando eje cu tar un pro grama de demos tra ción incluido en Del-phi Cliente/Ser ver (Enter prise) con la edi ción Stan dard o Pro fes sio nal.

So lu ción rá pi daSi no tiene Del phi Cliente/Server (Enter prise), ten drá que desis tir de inten tareje cu tar el pro grama de demos tra ción o adqui rir la edi ción Cliente/Ser ver(Enter prise).

Si tiene Del phi Cliente/Ser ver y toda vía obtiene este men saje de error, deberádesins ta lar Del phi y luego vol verlo a ins ta lar siguiendo estos pasos:

Mensajes de error 53

Page 88: Dsp

1. Selec cione Ini cio | Con fi gu ra ción | Panel de con trol | Agre gar/Qui-tar Pro gra mas.

2. En la página Insta lar/Desins ta lar, selec cione la ver sión de Del phi quetenga sobre su sis tema.

3. Pulse el botón Acep tar y siga las indi ca cio nes.4. Reins tale Del phi Enter prise.

Infor ma ción adi cio nalComo las dife ren tes edi cio nes de Del phi difie ren en carac te rís ti cas y com po nen-tes, no es posi ble mez clar y com bi nar pro yec tos crea dos con dife ren tes edi cio-nes. Esto tam bién es válido entre ver sio nes. Es decir, usted no puede com pi larun pro yecto creado con una ver sión de Del phi de 32 bits en Del phi 1 (sin haceralgu nas modi fi ca cio nes). Con sulte la página prin ci pal de Del phi en el sitio webde Bor land (http://www.bor land.com) para obte ner infor ma ción espe cí fica sobrelas dife ren cias en cuanto a carac te rís ti cas y com po nen tes entre las dis tin tasedi cio nes de Del phi.

Con sulte el men saje “Your appli ca tion is not ena bled for use with thisdri ver”.

Arithmetic Overflow ErrorPo si ble cau sa de error

Puede estar inten tando asig nar a una varia ble entera un valor que supera lacapa ci dad de repre sen ta ción del tipo entero. Por ejem plo, obten drá este error siintenta asig nar el valor 256 a un varia ble de tipo Byte.

So lu ción rá pi daCuando declare varia bles, veri fi que que sus tipos son ade cuados para con te nertodos los posi bles valo res que podría que rer alma ce nar en ellas. Por ejem plo, siuna varia ble par ti cu lar puede mane jar valo res hasta 100.000, no uti lice un tipode varia ble Word; en lugar de ello, uti lice un Inte ger (LongInt en Del phi 1).

Infor ma ción adi cio nalLa excep ción es “Run time Error 215”. Esta excep ción sola mente se pro duce siha habi li tado la com pro ba ción de des bor da miento en el entorno inte grado o enel código.

Para habi li tar la com pro ba ción de des bor da miento en el entorno inte grado,siga estos pasos:

54 Los Tomos de Delphi: Delphi sin problemas

Page 89: Dsp

Delphi 1

Selec cione Options | Pro ject, y sobre la página Com pi ler, veri fi que que lacasi lla de veri fi ca ción Over flow chec king esté habi li tada.

Delphi de 32 bits

Selec cione Pro ject | Options, y sobre la página Com pi ler, veri fi que que lacasi lla de veri fi ca ción Over flow chec king (Q) esté habi li tada.

Para habi li tar la com pro ba ción de des bor da miento mediante código, añada ladirec tiva {$Q+} en la parte supe rior de la(s) uni dad(es) donde desee habilitarla.

Array type requiredPo si ble cau sa de error

Puede estar inten tando apli car un índice a un iden ti fi ca dor que no es un tipode array.

So lu ción rá pi daAse gú rese de que sola mente aplica índi ces a varia bles de tipo array.

Infor ma ción rá pi daEl siguiente código pro du cirá el men saje de error bajo dis cu sión, debido a queen él se hace un intento de acce der a un ele mento de Rug gedI ndi vi dua list, yesta varia ble no es un array y por ello no tiene ele men tos que pue dan serindizados:

pro ce du re IndexI ntoT heA rray(ele ment: in te ger);var Rug gedI ndi vi dua list: in te ger;be gin Rug gedI ndi vi dua list[1] := ele ment;end;

Assertion failedPo si ble cau sa de error

Una expre sión de tipo Boo lean pasada a la fun ción Assert ha pro du cido False.

So lu ción rá pi daSi la aser ción debe ría cumplirse, revise el código para ave ri guar la causa por laque está fallando.

Mensajes de error 55

Page 90: Dsp

Infor ma ción adi cio nalSi el valor de la expre sión debe ser True para que el pro grama se eje cute efec-ti va mente o pro por cione resul ta dos váli dos, inte rrumpa el pro grama en caso deque la aser ción falle.

Aquí se mues tra un ejem plo de cómo uti li zar el pro ce di miento Assert:

pro ce du re Scru ti ni ze PayC heck(amt paid, am tex pec ted: Cu rrency);be gin try Assert(amt paid >= am tex pec ted, '¿Qué está pa san do aquí?'); ex cept

on EAsser tion Fai led do Halt;

end;end;

El pará me tro de cadena opcio nal es el men saje de error que se des pliega encaso de que la aser ción falle.

Assignment to FOR-Loop variable <>Po si ble cau sa de error

Puede estar inten tando asig nar un valor a la varia ble de con trol de un bucleFor en cual quier ver sión de Del phi de 32 bits.

So lu ción rá pi daEli mine la asig na ción a la varia ble de con trol del bucle For.

Infor ma ción adi cio nalLa varia ble de con trol de un bucle For es la varia ble (común mente una varia-ble entera como i) a la cual se asigna un valor ini cial como valor de par tida, yque se incre menta en 1 al fina li zar cada ite ra ción. Este valor frecuentementese ini cia liza a 0. El valor final es gene ral mente una varia ble, cuyo valor deter-mina cuán tas veces el bucle For se eje cu tará. Por ejem plo, a con ti nua ción semues tra un bucle For con sus ele men tos ano ta dos en los comen ta rios:

pro ce du re Sim ple Loop(Ti mes To Loop: in te ger);var i: in te ger; {i es la va ria ble de con trol del bu cle} s: string;be gin s := ''; for i := 0 to Ti mes To Loop do {va lores ini cial y fi nal} s := s + IntToStr(i); {cuer po del bu cle}end;

56 Los Tomos de Delphi: Delphi sin problemas

Page 91: Dsp

Lo siguiente, sin embargo, no es acep ta ble y pro du cirá el men saje de error bajodis cu sión:

pro ce du re Bad Loop(Ti mes To Loop: in te ger);var i: in te ger;be gin for i := 0 to Ti mes To Loop do i := i + IntToStr(i); {No se per mi te asig nar a la va ria ble de con trol del bu cle}end;

Si quiere aban do nar con di cio nal mente un bucle For en depen den cia del valorde la varia ble de con trol del bucle, compruebe el valor y llame al pro ce di mientoExit o Break si desea aban do nar el bucle. Puede hacer esto de la siguientemanera:

pro ce du re Sim ple Loop(Ti mes To Loop: in te ger);var i: in te ger; s: string[10];be gin s := ''; for i := 0 to Ti mes To Loop do be gin if i > 10 then Break; s := s + IntToStr(i); end;end;

Asynchronous socket error <>Po si ble cau sa de error

Puede estar inten tando esta ble cer una comu ni ca ción entre un com po nenteTClient Soc ket y un com po nente TSer ver Soc ket, pero ha olvi dado asig nar a suspro pie da des Port el mismo valor.

So lu ción rá pi daAsigne a las pro pie da des Port de ambos com po nen tes el mismo valor; de estaforma, el com po nente TClient Soc ket se conec tará al mismo puerto por el cualel com po nente TSer ver Soc ket está escu chando.

Infor ma ción adi cio nalCon sulte el archivo Ser vi ces (en C:\Win dows) para deter mi nar los núme ros depuertos que ya están aso cia dos nor mal mente para otros usos. Por ejem plo, estees un extracto del archivo:

Mensajes de error 57

Page 92: Dsp

ftp 21/tcpTel net 23/tcpsmtp 25/tcp

At end of tablePo si ble cau sa de error

Puede estar inten tando acce der a la pro pie dad OldVa lue de un campo al inser-tar un nuevo regis tro en modo de actua li za ciones en caché (CachedU pda tes).Debido a que no existe una ver sión ante rior de este regis tro, es impo si ble acce-der a su valor anterior.

So lu ción rá pi daAntes de inten tar acce der a la pro pie dad OldVa lue, pri mero deter mine si esfac ti ble efec tuar una com pro ba ción para ver si el estado del Data Set es dsEdit,así:

if Ta ble1.Sta te = dsEdit then Fo gie Val := OldVa lue;

Alter na ti va mente, puede ence rrar la lec tura de OldVa lue en un blo queTry. . . Except, así:

try Gee zer Val := OldVa lue;ex cept Mes sa ge Box('No hay un va lor an te rior dis po ni ble’); Abort;end;

Infor ma ción adi cio nalCuando se uti li zan actua li za cio nes en caché, los regis tros alma ce na dos en lacaché se cono cen como ‘valo res anti guos’. Esto le per mite can ce lar lasmodificacio nes realizadas, y que los cam pos vuel van a sus valo res ante rio res(con los valo res anti guos recu pe rando su sta tus como valo res actua les).

Bad argument type in variable type array constructorPo si ble cau sa de error

1. Puede haber uti li zado un pro ce di miento (que no devuelve ningún valor, ypor lo tanto no puede pro por cio nar el valor nece sa rio) como argu mento dela fun ción For mat. Por ejem plo, el siguiente código gene rará este men sajede error, ya que Rai se Last Win32Error es un pro ce di miento que poten cial-mente pro duce un men saje de error (en lugar de devol ver una cadena):

58 Los Tomos de Delphi: Delphi sin problemas

Page 93: Dsp

SlErrMsgs.Add( For mat(SError Mes sa ge, [E.Mes sa ge, Rai se Last Win32Error, Da te Ti me ToStr(Now)]);

2. Puede haber inten tado inser tar una sen ten cia en el lugar donde se espe-raba un array cons tante, como la sec ción de argu men tos de la fun ciónFor mat. Por ejem plo, el siguiente código gene rará este men saje de error:

Va ria ble For mat := For mat('%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s\', [ SEGMENT_IDENTIFIER, {3} Tax Pa yerI den ti fi ca tion, {4} TAX_TYPE_CODE, {5} Pay roll Da te, {6} if length(Trim(NYSta te Tax With held)) > 0 then Sta teA mountType Co de := STATE_AMOUNT_TYPE_CODE; {7} . . .

So lu ción rá pi da1. Eli mine el pro ce di miento, o sus ti tú yalo por una fun ción o varia ble del tipo

de datos apro piado. Para repa rar la línea de código mos trada arriba, porejem plo, podría cam biarla a:

SlErrMsgs.Add( For mat(SError Mes sa ge, [E.Mes sa ge, SysError Mes sa ge(Get LastError), Da te Ti me ToStr(Now)]);

2. Mueva la sen ten cia fuera de la sec ción de argu men tos. Por ejem plo, pararepa rar el código de arriba, haga esto:

Sta teA mountType Co de := '';. . .if length(Trim(NYSta te Tax With held)) > 0 then Sta teA mountType Co de := STATE_AMOUNT_TYPE_CODE;Va ria ble For mat := For mat('%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s\', [ SEGMENT_IDENTIFIER, {3} Tax Pa yerI den ti fi ca tion, {4} TAX_TYPE_CODE, {5} Pay roll Da te, {6} Sta teA mountType Co de, {7} . . .

Infor ma ción adi cio nalEn todo jar dín “se cue lan” algu nos insec tos.

Mensajes de error 59

Page 94: Dsp

Bad global symbol definition: <> in object file <>Po si ble cau sa de error

Puede haber enla zado a su apli ca ción un archivo objeto (.OBJ) que con tieneuna defi ni ción de un sím bolo que no fue decla rado en Pas cal como un pro ce di-miento externo. El sím bolo puede haber sido decla rado como varia ble.

So lu ción rá pi daIgnore el error si la defi ni ción espe ci fi cada en el men saje de error no es nece sa-ria para sus pro pó si tos, o modifique el archivo .OBJ.

Infor ma ción adi cio nalSi recibe este men saje de error, la defi ni ción del archivo objeto (.OBJ) que pro-voca el error sea igno rado.

Las direc ti vas $L y $LINK son sinó ni mas, y se uti li zan para enla zar pro ce di-mien tos y fun cio nes escri tos en otros len gua jes y decla ra dos en Del phi comoexter nos.

La sin ta xis que se uti liza para ello es:

$L[INK] <Archi vo ob je to>

Por ejem plo, si quiere enla zar el archivo CBUILDER.OBJ (situado en elcamino de bús queda de Del phi), podría intro du cir cual quiera de las dos direc ti-vas siguien tes:

$L CBUILDER$LINK CBUILDER

Si no incluye un camino en el nom bre del archivo, Del phi bus cará en el mismodirec to rio del módulo actual, seguido por los cami nos espe ci fi ca dos en Tools |Envi ron ment Options | Library | Library Path.

Bad packaged unit format: <>.<>Po si ble cau sa de error

El archivo nom brado en el men saje de error puede estar corrupto. Podría ser elresul tado de una ter mi na ción anor mal del com pi la dor durante la escri tura delarchivo de paquete, tal vez como resul tado de la pér dida de ener gía en esemomento.

60 Los Tomos de Delphi: Delphi sin problemas

Page 95: Dsp

So lu ción rá pi da

Delphi 3

Mueva o borre el archivo .DCP mencionado en el men saje de error y recom pileel paquete.

Delphi 4 y superiores

Mueva o borre el archivo .DCP mencionado en el men saje de error y reins taleel paquete.

Infor ma ción adi cio nalPara recom pi lar un paquete des pués de borrar el archivo .DCP, siga estospasos:1. Selec cione Com po nent | Install Pac ka ges. . . .2. Selec cione el paquete apro piado en el cua dro de lista Design Pac ka ges.3. Pulse el botón Edit.4. Pulse el botón Yes en el cua dro de diá logo de con fir ma ción que aparece.5. Pulse el icono Com pile.

Si con ti núa reci biendo el mismo men saje de error des pués de borrar el archivocorrupto y recom pi lar el paquete, con tacte con Bor land por telé fono o a tra vésde su sitio web.

Bad unit format: <>Po si ble cau sa de error

Un archivo de uni dad com pi lada (.DCU) pro ba ble mente se ha dañado.

So lu ción rá pi daRecom pile el archivo fuente de la uni dad (.PAS) para pro du cir un nuevoarchivo de uni dad com pi lada (.DCU).

Infor ma ción adi cio nalSi el .DCU es un archivo de com po nente, siga estos pasos para recom pi lar elarchivo fuente de uni dad (.PAS) para pro du cir un nuevo archivo de uni dadcom pi lada (.DCU):1. Selec cione la siguiente opción, en depen den cia de su ver sión de Del phi:

Del phi 1: Options | Install Com po nentsDel phi 2: Com po nent | InstallDel phi 3-6: Com po nent | Install Com po nent

Mensajes de error 61

Page 96: Dsp

2. Selec cione la pes taña apro piada en el cua dro de diá logo Install Com po nent(Into Exis ting Pac kage o Into New Pac kage), en depen den cia de dóndedesea ins ta lar el com po nente.

3. Pulse el botón Browse.4. En el cua dro de diá logo Unit File Name, nave gue y selec cione el archivo

.PAS.5. Pulse el botón Open.6. Pulse el botón OK en el cua dro de diá logo Install Com po nent.

Si el archivo .DCU es un archivo de uni dad com pi lada tra di cio nal (no unarchivo de com po nente), siga estos pasos para recom pi lar el archivo fuente(.PAS) y pro du cir una nuevo archivo de uni dad com pi lada (.DCU):1. Borre el archivo .DCU (o mué valo a un lugar dis tinto del sitio donde reside

el pro yecto al que per te nece).2. Car gue el pro yecto del cual es parte la uni dad .PAS corres pon diente.3. Recom pile el pro yecto (F9).

Si recom pi lar el archivo fuente no resuelve el pro blema, puede que desins ta lary vol ver a ins ta lar Del phi sí lo haga.

BDE Initialization Error $2501Po si ble cau sa de error

Puede estar uti li zando un com po nente TDa ta base o TSes sion en una apli ca ciónde múl ti ples capas, y nece sita modi fi car los pará me trosSHAREDMEMLOCATION y/o SHAREDMEMSIZE.

So lu ción rá pi daCam bie los valo res de los pará me tros SHAREDMEMLOCATION ySHAREDMEMSIZE con la Uti li dad de Con fi gu ra ción del BDE (página System| nodo Init). Incre mente el valor de SHAREDMEMSIZE a $4096 u $8192 (es$2048 por defecto).

Si está eje cu tando Win dows 95/98, intro duzca un valor paraSHAREDMEMLOCATION entre $9000 y $FFFF; si es Win dows NT/2000,entre $1000 y $7F00. Intén telo pri mero con $1000. Des pués cam biar el valor,cie rre todas las apli ca cio nes que uti li cen el BDE. Puede ser nece sa rio pro barcon varios valo res antes de encon trar uno que fun cione bien.

Infor ma ción adi cio nalEste error corres ponde a “Insuf fi cient memory for this ope ra tion” (memo-ria insu fi ciente para esta ope ra ción).

Para más infor ma ción, con sulte la ayuda del BDE.

62 Los Tomos de Delphi: Delphi sin problemas

Page 97: Dsp

Before you can deploy, you must complete the Web Deploymentpage of the Project|Web Deploy Options dialog

Po si ble cau sa de errorPuede haber selec cio nado Pro ject | Web Deploy sin haber pro por cio nadotoda la infor ma ción nece sa ria en la pes taña Pro jects del cua dro de diá logoWeb Deploy Options (no hay una página Web Deploy ment, a pesar del textodel men saje de error).

So lu ción rá pi daPulse OK para dese char el men saje de error y vol ver a la página Pro jects delcua dro de diá logo Web Deploy Options (Pro ject | Web Deploy Options).Debe pro por cio nar entra das en los cua dros de edi ción Tar get Dir, Tar getURL y HTML Dir.

Infor ma ción adi cio nalAde más de las entra das reque ri das en la página Pro jects, hay tam bién otrasopcio nes que debe espe ci fi car tam bién en las pági nas Pac ka ges, Addi tio nalFiles y Code Sig ning del cua dro de diá logo Web Deploy Options.

Los ítems de menú Web Deploy Options y Web Deploy no están dis po ni blessi no ha abierto un pro yecto o está tra ba jando con un tipo de pro yectocon ven cio nal.

Bitmap image is not validPo si ble cau sa de error

1. Puede haber inten tado car gar en la pro pie dad Pic ture de un com po nenteTImage un archivo que, aun que tiene una exten sión .BMP, no es real menteuna ima gen en for mato BMP, o el archivo .BMP puede estar corrupto.

2. Puede que exista una falta de coor di na ción entre el mapa de bits y la pro-pie dad Pixel For mat de Pic ture.Bit map.

3. Puede estar inten tando car gar un grá fico BLOb de MS Access, MS SQLSer ver o MS Fox Pro en un com po nente TDBImage.

So lu ción rá pi da1. Ase gú rese de que cual quier archivo que intente car gar en la pro pie dad

Picture del com po nente TImage sea real mente un archivo grá fico válido.2. Cam bie el valor de la pro pie dad Pic ture.Bit map.Pixel For mat.3. Haga lo siguiente en el evento AfterS croll del objeto TData set:

Mensajes de error 63

Page 98: Dsp

pro ce du re TWha te ver.<Da ta set Na me>AfterS croll(Da ta set: TDa ta set);const LENGTH_OF_HEADER_INFO = 78;var bm: TBit map; bs: TBLObStream;be gin bx := TBLObStream.Crea te(<TField Na me>, bmRead); try bs.Seek(LENGTH_OF_HEADER_INFO, soF rom Be gin ning); bm := Tbit map.Crea te; try bm.LoadF romS tream(bs); DBIma ge.Pic tu re.Grap hic := bm; fi nally bm.Free; end; fi nally bs.Free; end;end;

Infor ma ción adi cio nal3. Las bases de datos de Micro soft antes men cio na das alma ce nan los grá fi cos

como obje tos OLE y no como datos puros.

Nota: <TFieldName> es la concatenación de un nombre de Dataset y unnombre de campo.

Del phi pro por ciona soporte nativo para cua tro for ma tos de archi vos grá fi-cos, con cre ta mente .BMP (mapas de bits), .ICO (iconos), .WMF (Win dowsMeta file) y .EMF (Enhan ced Meta file).Puede ser que alguien haya cam biado la exten sión de un archivo, de modoque parezca ser un archivo de mapa de bits por su exten sión aun que real-mente no lo es.

Bits index out of rangePo si ble cau sa de error

Puede haber inten tado hacer refe ren cia a un ele mento de un array de valo resde tipo Boo lean mediante un índice que es mayor que el tamaño del objetoTBits o menor que 0. Por ejem plo, ambas asig na cio nes a la varia ble little en elsiguiente frag mento de código pro vo can este men saje de error, ya que en la pri-mera se intenta acce der a un ele mento con un índice que supera el tamaño delobjeto TBits, y en la segunda se uti liza un índice menor que 0:

64 Los Tomos de Delphi: Delphi sin problemas

Page 99: Dsp

pro ce du re TForm1.BitsUnderO verE xam ple(Sen der: TObject);var kib bles: TBits; litt le: Boo lean;be gin kib bles := TBits.Crea te; try kib bles.Size := 7;

litt le := kib bles.Bits[8]; litt le := kib bles.Bits[-1];

fi nally Kib bles.Free; end;end;

So lu ción rá pi daNo uti lice como índice un número nega tivo o un número mayor que el valor dela pro pie dad Size de TBits. Si no se asigna explí ci ta mente un valor a la pro pie-dad Size, el array se expan dirá auto má ti ca mente tanto como sea nece sa riocuando se asig nen valo res a ele men tos de un array TBits.

Infor ma ción adi cio nalLos Bits a los que se refiere el men saje de error es el objeto TBits, que imple-menta un array de valo res Boo lean.

En el ejem plo de arriba, un intento de asig nar un valor al ele mento 7 del arraytam bién pro vo ca ría el men saje de error, ya que el índice está basado en 0 (ypor ello un tamaño de 7 creará únicamente los ele men tos 0, 1, 2, 3, 4, 5 y 6).

BLOb has been modifiedPo si ble cau sa de error

1. Múl ti ples apli ca cio nes pue den estar acce diendo a una tabla desde unamáquina que eje cuta Win dows 95 con la ver sión 4.00.1111 o la ver sión4.00.1113 del Redi rec tor de Redes Virtuales de Micro soft (VREDIR.VXD).

2. Puede estar inten tando mos trar el con te nido de un campo BLOb (como porejem plo un campo memo con for mato de Para dox) en un con trolTDBRich Edit.

So lu ción rá pi da1. Reem place la ver sión de VREDIR.VXD. La ver sión ori gi nal (4.00.950) y la

ver sión 4.00.1116 no oca sio nan el pro blema. VREDIR.VXD debe ría estar

Mensajes de error 65

Page 100: Dsp

loca li zado en C:\Win dows\System. Tam bién puede des car gar un archivoactua li zado del sitio web de Micro soft.

2. Uti lice un campo Memo de Para dox (TMemo en Del phi) en lugar de uncampo For mat ted Memo si desea mos trar el con te nido del campo en uncon trol TDBRich Edit. Enton ces podrá mediante pro gra ma ción for ma tear elcon te nido del con trol TRich Edit.

Infor ma ción adi cio nal1. Todos los usua rios pue den ser afec ta dos si algún usua rio tiene la ver sión

invá lida de VREDIR.VXD (incluso aque llos que per so nal mente tie nen unaver sión correcta en sus máqui nas).

2. A con ti nua ción se mues tra una tabla de los tipos de datos Para dox y suscorres pon dien tes cla ses des cen dien tes de TField de Del phi:

Tipo de dato Paradox Descendiente TField de Delphi

Alpha TStringField

Autoincrement TAutoIncField

BCD TBCDField

Binary TBlobField

Byte TBytesField

Date TDateField

Formatted Memo TBlobField

Graphic TGraphicField

Logical TBooleanField

Long Integer TIntegerField

Memo TMemoField

Money TCurrencyField

Number TFloatField

OLE TBlobField

Short TSmallIntField

Time TTimeField

Timestamp TDateTimeField

66 Los Tomos de Delphi: Delphi sin problemas

Page 101: Dsp

Break or Continue outside of loopPo si ble cau sa de error

Puede estar lla mando al pro ce di miento Break o Con ti nue fuera de un bucleFor, While o Repeat.

So lu ción rá pi daSola mente llame a Break o Con ti nue den tro de un bucle For, While o Repeat.Extienda el bucle For o While, si es nece sa rio, aña diendo una sec ciónBegin. . . End des pués de la pala bra reser vada Do (los bucles Repeat ya con si de-ran el blo que entero entre Repeat y Until como una sen ten cia com puesta, y porlo tanto éstas no nece si tan estar ence rra das en un blo que Begin. . . End.)

Infor ma ción adi cio nalLo siguiente pro du cirá el men saje de error bajo dis cu sión:

pro ce du re Sa tur day NightAtThe Mo vies;be gin whi le Wat ching Mo vie do Eat Pop corn;

if Thea ter Cat ches Fi re then Break;end;

Para evi tar el men saje de error, encie rre la lla mada al pro ce di miento Break oCon ti nue den tro de un blo que Begin. . . End, así:

pro ce du re Sa tur day NightAtThe Mo vies;be gin whi le Wat ching Mo vie do be gin Eat Pop corn;

if Thea ter Cat ches Fi re then Break; {aho ra esto es par te del bucle}

end;end;

Lo mismo, por supuesto, es aplicable al pro ce di miento Con ti nue. Para másinfor ma ción sobre las sen ten cias For, While y Repeat, con sulte “wri ting loops”en la ayuda de Del phi.

Hay cua tro pro ce di mien tos de con trol del flujo que pue den ser uti li za dos endiver sas cir cuns tan cias: Con ti nue, Break, Exit y Halt. Adi cio nal mente, la claseTAppli ca tion ofrece un pro ce di miento Ter mi nate.

Para expli car estos pro ce di mien tos en pocas pala bras, dire mos que Con ti nuepro voca un salto a la pró xima ite ra ción del bucle; Break trans fiere el con trolfuera del bucle; Exit trans fiere el con trol fuera del pro ce di miento o fun ción; yHalt implica la ter mi na ción del pro grama entero (como Appli ca tion.Ter mi nate).

Mensajes de error 67

Page 102: Dsp

Exa mi ne mos estos pro ce di mien tos con más deta lle:

Una lla mada al pro ce di miento Con ti nue devuelve el flujo de con trol al ini cio dela sen ten cia For, While o Repeat. En otras pala bras, la pró xima ite ra ción delbucle se ini cia inme dia ta mente cuando el pro ce di miento Con ti nue es lla mado.Por ejem plo, observe el código a continuación:

func tion One ForT heT humb: Boo lean;var i: in te ger;be gin i := 0; Re sult := Fal se; re peat

Play(Re gu lar Sea son Ga mes); if not WinT he Di vi sion then

Con ti nue; Play(Pla yoffs);

if not WinT heP la yoffs then Con ti nue;

Play(Cham pions hip Ga me); if not WinT heC ham pions hip Ga me then

Con ti nue; i := i + 1;

un til i = 5; Re sult := True;end;

Una lla mada al pro ce di miento Break oca siona que el flujo de con trol se inte-rrumpa para un bucle For, While o Repeat y se pro siga con la pró xima sen ten-cia des pués del bucle.

Por ejem plo, ana lice el siguiente ejem plo:

pro ce du re ForAllThe TeaIn Chi na(wid gets: in te ger);var i: in te ger; s: string;be gin for i := 0 to wid gets do be gin

if i >= 1000 then Break; {el bu cle es abandonado}

s := IntToStr(i); {si i >= 1000, esta lí nea no será ejecutada} end; Order('Tsing Tao', i * 2); Order('Hot Pep per BeefS tick', i);end;

Una lla mada al pro ce di miento Exit trans fiere el con trol inme dia ta mente devuelta al pro ce di miento que llamó al pro ce di miento actual, donde el pro gramacon ti nuará a par tir de la línea siguiente a la lla mada del pro ce di miento den trodel que se llamó a Exit.

68 Los Tomos de Delphi: Delphi sin problemas

Page 103: Dsp

Por ejem plo, la lla mada a Exit en el siguiente código pro voca que el pro ce di-miento CheckItOut sea aban do nado y se retorne a donde se hizo la lla mada:

type TGen re = (Ba ro queC ham ber, Blues, CountryRock, Dis co, Ope ra, Rap, Reg gae, Rock, Soul);. . .pro ce du re CheckItOut(Mu sicStyle: TGen re);be gin if Mu sicStyle in [Dis co..Rap] then Exit

else if Mu sicStyle in [Ba ro queC ham ber..CountryRock] then Lis ten ToT he Mu sic

else if Mu sicStyle in [Reg gae..Soul] then Dan ce ToT he Mu sic else Show Mes sa ge('¿Qué músi ca es ésta?');end;

pro ce du re De ter mi ne Cour seOfAction;be gin CheckItOut(Soul); CashItOut(Re ti re ment);end;

Una lla mada al pro ce di miento Ter mi nate de TAppli ca tion pro voca un cie rreorde nado de la apli ca ción, aun que ésta no nece sa ria mente se deten drá inme-dia ta mente. He aquí un ejem plo de cómo uti li zar este pro ce di miento:

pro ce du re StopInThe Na meOf The Law;be gin if You Need ToS hut Down TheApp then Appli ca tion.Ter mi na te;

end;

Para más infor ma ción, con sulte “Appli ca tion.Ter mi nate” en la ayuda deDel phi.

Una lla mada al pro ce di miento Halt oca siona una ter mi na ción anor mal del pro-grama y el retorno al sis tema ope ra tivo. He aquí un ejem plo de cómo se usaeste pro ce di miento:

pro ce du re StopInThe Na meOf The Law;be gin if You Need To Quit NowAndIMean Now then Halt; {Esto pro vo ca rá la ter mi na ción in me dia ta de su pro gra ma}

end;

La ter mi na ción nor mal de un pro grama tiene lugar auto má ti ca mente cuandose cie rra su for mu la rio prin ci pal (no es nece sa ria nin guna lla mada).

Mensajes de error 69

Page 104: Dsp

Breakpoint is set on line that may have been removed by theoptimizer or contains no debug information. Run anyway?

Po si ble cau sa de errorPuede estar inten tando esta ble cer un punto de rup tura sobre una línea delcódigo fuente para la cual el com pi la dor no genera código; por lo tanto, nopuede hacer una parada ahí.

So lu ción rá pi daQuite el punto de rup tura. Asigne puntos de rup tura sola mente sobre líneasque gene ran código, tales como líneas que con tie nen sen ten cias de asig na ción.

Infor ma ción adi cio nalEl opti mi za dor de Del phi puede haber eliminado la línea en cues tión (obvia-mente, no igno rando las líneas que usted ha escrito, sino sólo en lo que al com-pi la dor con cierne), debido a que el código nunca es lla mado en la apli ca ción.

Un ejem plo de dónde podría obte ner el men saje de error bajo dis cu sión es siintenta eje cu tar la apli ca ción hasta un lugar de la sec ción Inter face de unauni dad. Nor mal mente no debería inten tar hacer esto; otros ejem plos (en la sec-ción Imple men ta tion) podrían ser la pri mera línea de un pro ce di miento, unalínea de decla ra ción de varia bles, etc.

En el siguiente pro ce di miento, las líneas que pro du cen este men saje de error(si coloca un punto de rup tura sobre ellas) se indi can mediante comen ta riosque indi can “¡aquí no!”:

pro ce du re Sa tur day NightAtThe Mo vies; {¡aquí no!}be gin whi le Wat ching Mo vie do be gin {¡aquí no!}

Eat Pop corn; Thea ter Cat ches Fi re := OLeary sCowI sHe re; if Thea ter Cat ches Fi re then Break; end; {¡aquí no!}end;

Call to Application.CreateForm is missing or incorrectPo si ble cau sa de error

Puede haber modi fi cado la línea del archivo de pro yecto (.DPR) que con tiene lalla mada a Appli ca tion.Crea te Form.

70 Los Tomos de Delphi: Delphi sin problemas

Page 105: Dsp

So lu ción rá pi daAse gú rese de que el archivo de pro yecto (seleccione View | Pro ject Source —Pro ject | View Source en Del phi 4 y posteriores — para exa mi nar el códigofuente del archivo de pro yecto) con tiene la siguiente sin ta xis para car gar almenos el for mu la rio prin ci pal del pro grama (puede haber múl ti ples líneassimi la res para crear diver sos for mu la rios):

Appli ca tion.Crea te Form(TForm1, Form1);

Infor ma ción adi cio nalTodos los demás for mu la rios de la apli ca ción (excep tuando el for mu la rio prin ci-pal) pue den ser car ga dos diná mi ca mente cuando sean nece sa rios. Esto amor-tiza el coste de tener crea dos los for mu la rios durante períodos de tiempo máslar gos de lo necesario, y de crear algu nos for mu la rios (como el cua dro de diá-logo Acerca de..., si tiene alguno) que podrían no ser nece sa rios en abso luto.

Para crear diná mi ca mente un for mu la rio (y pos te rior mente des truirlo), sigaestos pasos:1. Selec cione View | Pro ject Mana ger.2. Pulse el botón Options.3. En el cua dro de lista Auto-Create Forms, selec cione el for mu la rio que

desea crear diná mi ca mente.4. Pulse el botón de fle cha a la dere cha para mover el for mu la rio a la lista

Avai la ble Forms.5. Pulse el botón OK.6. Modi fi que el código que uti lizó para mos trar el for mu la rio por el siguiente:

pro ce du re TForm1.ShowA bout(Sen der: TObject);be gin About := TAbout.Crea te(nil); try About.Show Mo dal; fi nally About.Free; end;end;

Sin embargo, si intenta mos trar el for mu la rio antes de que sea creado, así:

About Box.Show Mo dal:About Box := TAbout Box.Crea te(Appli ca tion);About Box.Free;

o si ha obviado com ple ta mente la lla mada a Create, provocará el men sajede error bajo dis cu sión.

Es una buena idea crear diná mi ca mente los for mu la rios mediante código, espe-cial mente si no son nece sa rios durante todo el tiempo de eje cu ción de laaplicación. Si no crea diná mi ca mente sus for mu la rios, todos serán crea dos

Mensajes de error 71

Page 106: Dsp

auto má ti ca mente por Del phi cuando la apli ca ción arran que. Siem pre que rráque Del phi cree auto má ti ca mente el for mu la rio prin ci pal, pero podría pos po nerla crea ción de los demás for mu la rios hasta el momento en que se nece si ten.

Call to RegisterClass is missing or incorrectPo si ble cau sa de error

Inde pen dien te mente del texto del men saje de error, la causa real del pro blemapuede ser que ha comen tado o borrado el End final (el único que debe ría ter mi-nar con un punto, en lugar de un punto y coma) en una uni dad.

So lu ción rá pi daAse gú rese de que el End final está intacto y que no ha sido comen tado. Veri fi-que que todo Begin tiene un End correspondiente, y que todos los comen ta riosque empie zan con una llave izquierda ({ ) estén empa re ja dos con su corres pon-diente llave dere cha ( }).

Infor ma ción adi cio nalEl pro ce di miento Regis terC lass es dife rente de Regis ter Com po nents, que seuti liza en las uni da des de com po nen tes para espe ci fi car el nom bre del com po-nente y la página en la que será colo cado (o, si la página no existe, la páginaque será creada para alo jar el com po nente).

Can’t change value while socket is activePo si ble cau sa de error

1. Puede estar inten tando cam biar el valor de las pro pie da des Address, Host,Port o Ser vice de un com po nente TClient Soc ket mien tras su pro pie dadActive tiene asig nado el valor True.

2. Puede estar inten tando cam biar el valor de la pro pie dad Port o Ser vice delcom po nente TSer ver Soc ket mien tras su pro pie dad Active tiene asig nado elvalor True.

So lu ción rá pi da1, 2. Cam bie el valor de la pro pie dad Active a False, haga los cam bios, y luego

asigne nue va mente True a la pro pie dad Active.

Infor ma ción adi cio nalEl com po nente TClient Soc ket apa re ció en Del phi 4, como el resto de los com po-nen tes de la página Inter net. Las ver sio nes ante rio res de Del phi tenían una

72 Los Tomos de Delphi: Delphi sin problemas

Page 107: Dsp

página Inter net en la Paleta de Compo nen tes, pero se uti li zaba para los con tro-les Acti veX; el nuevo con junto de com po nen tes lo com po nen con tro les nati vosde Del phi.

Can’t compile Complib. Too many files in projectPo si ble cau sa de error

Puede tener “demasiados” archi vos en el pro yecto, o tener los situa dos en dema-sia das loca li za cio nes dife ren tes (direc to rios).

So lu ción rá pi daFusione algu nos de los com po nen tes pro pios o de ter ce ros den tro de uno o unospocos direc to rios comu nes y edite la ruta de bús queda consecuentemente.

Infor ma ción adi cio nalPuede tam bién ser útil uti li zar nom bres de direc to rios tan cor tos como seaposi ble. Apa ren te mente, es el tamaño con junto de todas las rutas de archivoslo que oca siona el pro blema.

Can’t delete or change record. Since related record exists in table=‘xxx’, referential integrity rules would be violated

Po si ble cau sa de error1. Puede estar inten tando borrar o modi fi car un regis tro maes tro que tiene

regis tros depen dien tes en otra tabla. En otras pala bras, puede estar inten-tando modi fi car un valor de clave o borrar un regis tro del que otrosregis tros depen den.

2. Puede estar uti li zando Access 95 e inten tando hacer uso de la inte gri dadrefe ren cial. Lo último es una buena idea, pero no cuando uti lice Access 95.

So lu ción rá pi da1. Si nece sita modi fi car un regis tro maes tro, no cam bie los valores de los cam-

pos cla ves, ya que los regis tros hijos (de deta lle) los utilizan para loca li zara su “padre”. Si nece sita borrar un regis tro maes tro, borre pri mero losregis tros hijos aso cia dos e él.

2. Actua lí cese a Access 97, Para dox, Inter Base, o alguna otra base de datos.Alter na ti va mente, eli mine la “fun cio na li dad” de inte gri dad refe ren cial de labase de datos Access 95.

Mensajes de error 73

Page 108: Dsp

Infor ma ción adi cio nalCon sulte “refe ren tial inte grity” en la ayuda de Del phi.

Can’t load [complib.dcl, cmplib32.dcl, vcl30.dpl, vcl40.bpl, vcl50.bpl,vcl.bpl]

Po si ble cau sa de error1. Puede haber movido o borrado el archivo men cio nado en el men saje de

error.2. La VCL de Del phi puede haberse dañado debido a cam bios rea li za dos en el

código fuente de la VCL.3. Puede haber inten tado sin éxito ins ta lar un com po nente en su VCL.4. Puede haber inten tado ins ta lar un com po nente que hace refe ren cia a otro

com po nente o una DLL que no está dis po ni ble o no está en el camino debús queda del orde na dor.

So lu ción rá pi da1. Ase gú rese de que su archivo de biblio teca de com po nen tes reside en el

lugar apro piado en depen den cia de su ver sión de Del phi. Si encuen tra elarchivo en otro lugar, mué valo a la loca li za ción apro piada e inten tarrecom pi lar la biblio teca (Del phi 1 y 2) o paquete o reins ta lar el paquete(Del phi 3-6). Si el archivo ya está en el lugar correcto pero sigue reci biendoeste men saje 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 almacénela en un lugar seguro.

b. Borre la copia original del archivo que ha copiado.c. Si anteriormente había hecho cambios al archivo, Delphi habrá creado

antes una copia de resguardo de la versión anterior, reemplazando laprimera letra de la extensión con una tilde (~) y truncando la últimaletra de la extensión. En Delphi 1, este archivo se llamaráCOMPLIB.~DC; en Delphi 2, CMPLIB32.~DC, etc. Si encuentra elarchivo apropiado para su versión de Delphi, renómbrelo encorrespondencia con su versión de Delphi y restáurelo a su estadoinicial como biblioteca de componentes de Delphi. Si no ha hechocambios anteriormente al archivo, o la copia de resguardo no existe,copie el archivo desde el CD de Delphi al lugar apropiado para suversión de Delphi.

2. Recons truya o reins tale la biblio teca de com po nen tes.3. Siga los pasos a-c de arriba para reins ta lar la última copia buena de la

VCL.

74 Los Tomos de Delphi: Delphi sin problemas

Page 109: Dsp

4. Ase gú rese de dis tri buir todos los módu los reque ri dos con cual quier com po-nente o pro grama que dis tri buya.

Infor ma ción adi cio nalEn Del phi 1, el nom bre de archivo de la biblio teca de com po nen tes eraCOMPLIB.DCL. Su tamaño era de 1.036 KB. En Del phi 2, el archivo de labiblio teca de com po nentes fue renom brado a CMPLIB32.DCL. Su tamaño erade 4.636 KB. En Del phi 3-6, no hay nin gún archivo con exten sión .DCL. Enlugar de una uni dad con te niendo toda la VCL, se pro por cio nan muchos paque-tes inde pen dien tes que con tie nen gru pos de com po nen tes rela cio na dos. Elpaquete prin ci pal, que con tiene los com po nen tes más comu nes y las uni da desque nece si tará para un pro yecto de Del phi típico, está con te nido en un archivo.DPL (Del phi pac kage library). En Del phi 3, VCL30.DPL ocupa 1.257 KB. EnDel phi 4, VCL40.BPL ocupa 1.753 KB. En Del phi 5, VCL50.BPL ocupa 1.976KB. En Del phi 6, el tamaño de VCL60.BPL es de 2.386 KB. Una ins ta la cióncom pleta de Del phi 3 incluye apro xi ma da mente 25 archi vos .DPL. Del phi 4intro duce los archivos .BPL, de los cua les hay 38 en la ver sión Cliente/Server.La edi ción Enter prise de Del phi 5 (equi va lente a la anti gua edi ción Client/Ser-ver) con tiene 40 archi vos .BPL, y la misma edi ción de Del phi 6 con tiene apro xi-ma da mente 55 archi vos .BPL.

Can’t load package <>.<> One of the library files needed to runthis package cannot be found

Po si ble cau sa de error1. Puede ser que el paquete al que se hace refe ren cia en el men saje de error

(o un paquete o .DLL del que éste depende) no esté ins ta lado, o no esté ins-ta lado en el lugar adecuado.

2. Puede estar inten tando car gar un paquete que depende de otro paquete o.DLL que, aun que está ins ta lado en el sis tema (y en el lugar correcto), noes de la ver sión ade cuada.

So lu ción rá pi da1. Ase gú rese de que todos los paque tes y .DLLs reque ri dos estén situa dos en

el direc to rio actual o en el camino de bús queda de Win dows (pre fe ren te-mente en el direc to rio \Win dows\System).

2. Si hace cam bios a un paquete del que otro paquete depende, recom pileambos paque tes (el reque rido pri mero y el depen diente después).

Infor ma ción adi cio nalLos paque tes de Del phi son DLLs espe cia li za das (con exten sión .DPL en Del-phi 3 y exten sión .BPL en Del phi 4 y supe rio res) que apa re cie ron por pri mera

Mensajes de error 75

Page 110: Dsp

vez en Del phi 3. Cuando se com pi lan los paque tes de tiempo de eje cu ción, losarchi vos .DPL/.BPL y .DCP son crea dos en dife ren tes luga res en depen den ciade la ver sión de Del phi que esté uti li zando. En Del phi 3, los archi vos son gra-ba dos en el mismo direc to rio que el archivo de paquete (.DPK); en Del phi 4, el.BPL se alma cena en el mismo direc to rio que el paquete, y el .DCP en \Delp-hi4\Lib; en Del phi 5 y 6, ambos archi vos son gra ba dos en \Del phiX\Projects\BPL. Copie el archivo .BPL desde allí hacia el lugar apro piadopara el sis tema ope ra tivo que esté uti li zando (\Win dows\System en Win dows95/98, \WinNt\System32 en Win dows NT/2000). Para más infor ma ción, con-sulte “about pac ka ges” en la ayuda de Del phi.

La mayo ría de los paque tes vie nen en parejas para tiempo de eje cu ción ytiempo de diseño. Los paque tes run time (de tiempo de eje cu ción) con tie nen la“sus tan cia” del código, y per miten la com pi la ción de apli ca cio nes que uti li cenpaque tes de tiempo de eje cu ción. Los paque tes de tiempo de diseño con tie nenlos ele men tos espe cí fi cos nece sa rios durante el diseño, tales como el icono delcom po nente, las uni da des de regis tro, los edi to res de pro pie da des y los edi to resde com po nen tes. Los paque tes de tiempo de diseño con tie nen estas uni da desespe cí fi cas, y nece si tan el archivo .DCP del paquete de tiempo de eje cu ción. Enotras pala bras, un paquete de tiempo de eje cu ción con tiene el código de tiempode eje cu ción (!) y para su com pi la ción requie ren de VCLX0.DCP (VCL50.DCPpara los paque tes de Del phi 5, VCL60.DCP para los paque tes de Del phi 6, etc).Los paque tes de tiempo de diseño con tienen el código espe cí fico de tiempo dediseño (*REG.PAS, *REG.DCR, etc.) y requieren el archivo .DCP creadocuando el paquete de tiempo de eje cu ción es com pi lado.

Nota: No instale un paquete de tiempo de ejecución pulsando el botón Installdespués de compilar. El botón Install en el editor de paquetes es sólo para paquetesde tiempo de diseño. Una vez que haya registrado un componente en Delphi alinstalarlo, no podrá instalar otro componente con ese nombre en otro paquete. Enotras palabras, instalar el paquete de tiempo de ejecución le impedirá instalar elpaquete de tiempo de diseño (que es lo que realmente quiere hacer).

Can’t load package <>. The specified module could not be found.Po si ble cau sa de error

Puede haber ins ta lado un paquete en Del phi, y haberlo movido pos te rior mentea una loca li za ción dife rente.

So lu ción rá pi daPuede:

Mover el paquete de nuevo a su loca li za ción ante rior.

-O-

76 Los Tomos de Delphi: Delphi sin problemas

Page 111: Dsp

Eli mi nar el paquete de la lista de paque tes de tiempo de diseño (Com po nent| Install pac ka ges, selec cione el paquete corres pon diente, pulse el botónRemove, y res ponda Yes al men saje de con fir ma ción), y luego vol verlo a aña-dir desde su nueva loca li za ción.

Infor ma ción adi cio nalEsto puede ocu rrirle si ins tala un paquete desde una loca li za ción arbi tra ria,como por ejem plo un direc to rio en el que des carga fiche ros de Inter net, y pos te-rior mente decide mover el código a un lugar más cen tra li zado y/o lógico. Lamore leja de este men saje de error es: debe deter mi nar de ante mano dóndequiere que resi dan sus paque tes de tiempo de diseño. Para más infor ma ción,con sulte “Can’t load pac kage <>.<> One of the library files nee ded torun this pac kage can not be found”.

Can’t write .EXE file. Disk full?Po si ble cau sa de error

Puede no tener sufi ciente RAM o memo ria vir tual dis po ni ble.

So lu ción rá pi daPruebe suce si va mente con estas solu cio nes cada vez más drás ti cas hasta queuna de ellas fun cione:1. Salga de Del phi; rei ni cie Del phi; intente com pi lar la apli ca ción de nuevo.2. Salga de Win dows; rei ni cie Win dows (ini cio en caliente); rei ni cie Del phi;

intente com pi lar la apli ca ción de nuevo.3. Salga de Win dows; apa gue el orde na dor (ini cio en frío); espere un par de

minu tos; encienda el orde na dor; rei ni cie Del phi; intente com pi lar la apli ca-ción de nuevo.

4. Si el espa cio en disco duro está en bajo mínimos (menos del 10 por cientodel tamaño total de la uni dad está libre), borre todos los archi vos inne ce sa-rios. Una vez que haya libe rado espa cio del disco duro (que podrá uti li zarsecomo memo ria vir tual), defrag mente el disco duro y luego intente com pi larla apli ca ción de nuevo.

5. Veri fi que que la memo ria vir tual esté con fi gu rada correc ta mente en el sis-tema (Vea la infor ma ción adicio nal).

6. Com pre más RAM.

Infor ma ción adi cio nalSi le parece que tiene pro ble mas con la con fi gu ra ción de la memo ria vir tual,puede hacer que Win dows ajuste auto má ti ca mente la memo ria vir tualsiguiendo estos pasos:

Mensajes de error 77

Page 112: Dsp

1. Selec cione Ini cio | Con fi gu ra ción | Panel de Con trol.2. Haga doble clic sobre el icono Sis tema.3. Selec cione la página Ren di miento.4. Pulse el botón Memo ria Vir tual.5. Mar que el botón de radio Per mi tir que Win dows admi nis tre la con fi-

gu ra ción de memo ria vir tual.

Cannot add a session to the form or data module while session <>has AutoSessionName enabled

Po si ble cau sa de errorPuede que ya tenga un com po nente TSes sion sobre un for mu la rio o módulo dedatos con la pro pie dad Auto Ses sion Name asig nada a True.

So lu ción rá pi daSi va a añadir múl ti ples com po nen tes TSes sion a un for mu la rio o módulo dedatos, asigne False a sus pro pie da des Auto Ses sion Name.

Infor ma ción adi cio nalEn una apli ca ción típica, no nece si tará colo car ni siquiera un com po nenteTSes sion sobre el for mu la rio o módulo de datos. Un com po nente TSes sion esnece sa rio para la conec ti vi dad con bases de datos, pero se crea auto má ti ca-mente para usted, de una forma simi lar a como el objeto Appli ca tion es creadoauto má ti ca mente para cada apli ca ción Del phi.

Si está creando apli ca cio nes con múl ti ples hilos o si está acce diendo a tablasPara dox que resi den en varios luga res de una red, sin embargo, puede colo carcom po nen tes TSes sion adi cio na les sobre el for mu la rio o módulo de datos parafaci li tar el tra bajo en esas cir cuns tan cias espe cia les.

El pro pó sito de la pro pie dad Auto Ses sion Name es garan ti zar a los desa rro-lladores de apli ca cio nes con múl ti ples hilos que las sesio nes gene ra das paracada hilo son úni cas en tiempo de eje cu ción. Cuando se le asigna True a la pro-pie dad Auto Ses sion Name, auto má ti ca mente se generará un nom bre único paracada nueva sesión.

Para más infor ma ción, con sulte “Auto Ses sion Name” en la ayuda de Del phi.

Cannot assign to a read-only propertyPo si ble cau sa de error

Puede estar inten tando asig nar un valor a una pro pie dad de sólo lec tura.

78 Los Tomos de Delphi: Delphi sin problemas

Page 113: Dsp

So lu ción rá pi daAñada un espe ci fi ca dor Write para la pro pie dad en cues tión, o abs tén gase deasig narle valores si la pro pie dad debe per ma ne cer como de sólo lec tura.

Infor ma ción adi cio nalUna pro pie dad debe tener un espe ci fi ca dor Read, un espe ci fi ca dor Write, oambos. Es una prác tica común leer de un campo pri vado (cuyo nom bre, porcon ve nio, empieza con la letra F), y escri bir en él uti li zando un pro ce di mientocuyo nom bre comience con la pala bra Set. A con ti nua ción se pre senta un ejem-plo de algu nas de las posi bles mane ras de decla rar pro pie da des:

pri va te FScott Fitz ge rald: String; FLee Bai ley: Boo lean; FAOSchwarz, FDR: Cu rrency; FPSan tan ge lo: Exten ded; pro ce du re Set Fee(i: Inte ger); pro ce du re SetP ri ce(c: Cu rrency);pu blic {Esta pro pie dad es de sólo lec tu ra} pro perty Scott Fitz ge rald: String; read FScott Fitz ge rald; {Esta pro pie dad es de sólo es cri tu ra} pro perty Lee Bai ley: Boo lean; wri te Set Fee; {Esta pro pie dad es de lec tu ra y escritura} pro perty AOSchwarz: Cu rrency; read FAOSchwarz; wri te SetP ri ce;

Si declara una pro pie dad como Scott Fitz ge rald (que es una pro pie dad de sólolec tura, ya que no incluye un espe ci fi ca dor Write en su decla ra ción), y luegointenta escri bir en ella, de la siguiente forma:

Scott Fitz ge rald := 'Los mi llo na rios son di fe ren tes a us ted y a mí';

obten drá el men saje de error bajo dis cu sión.

Cannot break, continue, or exit out of a finally clausePo si ble cau sa de error

Puede haber colo cado una lla mada a Break, Con ti nue o Exit en la parteFinally de una sen ten cia Try. . . Finally.

So lu ción rá pi daEli mine la lla mada que causa el pro blema de la parte Finally de la sen ten ciaTry. . . Finally.

Mensajes de error 79

Page 114: Dsp

Infor ma ción adi cio nalEl len guaje garan tiza que la parte Finally de una sen ten cia Try. . . Finally seeje cu tará siem pre com ple ta mente. Por lo tanto, no se per mite uti li zar en ellospro ce di mien tos de con trol de flujo tales como Break, Con ti nue o Exit, queimpe di rían poten cial mente que se eje cute algún código situado en la parteFinally.

Cannot change the size of an iconPo si ble cau sa de error

Puede estar inten tando cam biar el tamaño de un icono. Por ejem plo, elsiguiente código gene ra ría este error:

Ima ge1.Pic tu re.Icon.Width := 23;

So lu ción rá pi daNo intente cam biar el tamaño de un archivo de icono (.ICO). Las pro pie da desHeight y Width de TIcon son de sólo lec tura y uni for mes para todos los ico nosde Win dows (32*32 píxeles para los ico nos regu la res, y 16*16 píxeles para losico nos peque ños).

Infor ma ción adi cio nalPuede crear ico nos (entre otras cosas) con la uti li dad Ima geE di tor de Del phi.Para acti varla, selec cione Tools | Image Edi tor y luego File | New | Icon.

Puede tam bién crear archi vos .DCR para los com po nen tes per so na li za dos queusted cree. Estos deben ser cua dra dos, con 24 píxe les de lado. Para hacerlo,selec cione Tools | Image Edi tor, luego File | New | Bit map, asigne 24 alancho y la altura, y selec cione VGA (16 colo res), a menos que esté seguro deque todos los usua rios de su com po nente uti li zan sis te mas SuperVGA (256colo res). Las imá ge nes de 16 colo res se mues tran correc ta mente en sis te mascon fi gu ra dos para 256 colo res, pero las imá ge nes de 256 colo res pue den lucirmal al mos trarse en sis te mas con fi gu ra dos para 16 colo res.

Cannot change Visible in OnShow or OnHidePo si ble cau sa de error

1. Puede haber inten tado cam biar el valor de la pro pie dad FormStyle de unfor mu la rio en sus even tos OnActi vate u OnShow. Por ejem plo, lo siguientegene rará el men saje de error bajo dis cu sión:

pro ce du re TForm1.Form Show(Sen der: TObject);be gin

80 Los Tomos de Delphi: Delphi sin problemas

Page 115: Dsp

FormStyle := fsStayO nTop;end;

2. Puede haber inten tado asig nar un valor a la pro pie dad Visi ble de un for-mu la rio den tro de los even tos OnActi vate, OnShow u OnHide delfor mu la rio. Por ejem plo, lo siguiente pro du cirá el men saje de error bajodis cu sión:

pro ce du re TForm1.FormActi va te(Sen der: TObject);be gin Vi si ble := fal se;end;

So lu ción rá pi da1. No cam bie el valor de la pro pie dad FormStyle del for mu la rio durante los

even tos OnActi vate u OnShow.2. No cam bie el valor de la pro pie dad Visi ble del for mu la rio durante los even-

tos OnActi vate, OnShow u OnHide.

Infor ma ción adi cio nalSi asigna True a la pro pie dad Visi ble de un for mu la rio en tiempo de diseño,éste apa re cerá inme dia ta mente en tiempo de eje cu ción. Del phi mos trará auto-má ti ca mente el for mu la rio prin ci pal de la apli ca ción en el arran que, y losdemás for mu la rios se mos tra rán cuando sus méto dos Show o Show Mo dal seanlla ma dos. Si asigna True a la pro pie dad Visi ble de todos los for mu la rios de suapli ca ción en tiempo de diseño, éstos se mos tra rán tan pronto como la apli ca-ción se ini cie, lo cual podría pro vo car que la inter faz de usua rio no sea intui-tiva y pro vo que con fu sión al usua rio.

Si quiere que un for mu la rio apa rezca en res puesta a un evento par ti cu lar (porejem plo, una pul sa ción sobre un botón) y per ma nezca en pan ta lla mien tras setra baja con otros for mu la rios, puede hacerlo así:

pro ce du re TForm1.But ton12Click(Sen der: TObject);be gin Form3.Show;end;

Si quiere que el for mu la rio apa rezca en pan ta lla y obli gue al usua rio a emi tiruna res puesta en él antes de que pueda con ti nuar tra ba jando con los demásfor mu la rios, puede hacerlo así:

pro ce du re TForm1.But ton12Click(Sen der: TObject);be gin Form3.Show Mo dal;end;

Show Mo dal mos trará el for mu la rio modal mente, de forma simi lar a un cua drode diá logo, y exi girá que el usua rio le dé res puesta y lo cie rre antes de podercon ti nuar tra ba jando con otros for mu la rios. Un ejem plo de este tipo de

Mensajes de error 81

Page 116: Dsp

for mu la rios o cua dros de diá logo son los com po nen tes de Del phi que encap su-lan los cua dros de diá logo comu nes de Win dows, que están situa dos en lapágina Dia logs de la Paleta de Com po nen tes (TOpen Dia log, TSa ve Dia log, etc.).

Puede tam bién crear for mu la rios diná mi ca mente, en el momento en que seannece sa rios. Esto ayuda a con ser var los recur sos del sis tema y es espe cial menteútil cuando se tie nen for mu la rios que podrían no ser uti li za dos en una eje cu-ción dada de la apli ca ción, como por ejem plo un cua dro ‘Acerca de’.

Para crear un for mu la rio diná mi ca mente, siga estos pasos:1. Selec cione View | Pro ject Mana ger.2. Pulse el botón Options.3. En el cua dro de lista Auto-Create Forms, selec cione el for mu la rio que

desea crear diná mi ca mente.4. Pulse el botón de fle cha a la dere cha para mover el for mu la rio a la lista

Avai la ble Forms.5. Pulse el botón OK.6. Modi fi que el código que haya uti li zado para mos trar el for mu la rio a lo

siguiente:

pro ce du re TForm1.But ton12Click(Sen der: TObject);be gin Form3 := TForm3.Crea te(nil); try Form3.Show Mo dal; fi nally Form3.Free; end;end;

Cannot complete a class with incomplete methods implementationsPo si ble cau sa de error

Puede haber inten tado invo car la carac te rís tica de com ple ta miento de código(Code com ple tion) cuando la uni dad tenía un error de sin ta xis.

So lu ción rá pi daSolu cione cual quier error de sin ta xis que exista (selec cione Alt+P, S para veri-fi car la sin ta xis), y luego intén telo de nuevo.

Infor ma ción adi cio nalCon sulte “class com ple tion” en la ayuda de Del phi.

82 Los Tomos de Delphi: Delphi sin problemas

Page 117: Dsp

Cannot connect, <> must contain a valid ServerName orServerGUID

Po si ble cau sa de errorPuede haber inten tado asig nar True a la pro pie dad Con nect de un com po nenteTDCOMCon nec tion, TMIDASCon nec tion o TRe mo te Ser ver sin haber espe ci fi-cado un valor válido para la pro pie dad Ser ver Name o Ser verGUID.

So lu ción rá pi daIntro duzca un GUID válido en la pro pie dad Ser verGUID con este for mato:

98ED7140-EE18-11D3-A238-80584EC12700

o intro duzca el nom bre de un ser vi dor regis trado en la pro pie dad Ser ver Name.

Infor ma ción adi cio nalSi pro por ciona un valor tanto para Ser ver Name como para Ser verGUID, estemen saje de error no apa re cerá, siem pre y cuando uno de los dos valo res seaválido.

Cannot connect to database <>Po si ble cau sa de error

Puede haber inten tado conec tarse a una base de datos por uno de los siguien-tes méto dos:

a. Ha intentado asignar True a la propiedad Connected de un componenteTDatabase, en tiempo de diseño o en tiempo de ejecución (por código).

b. Ha llamado al método Open de un componente TDatabase o TTable.

c. Ha intentado asignar True a la propiedad Active de un TTable, entiempo de diseño o en tiempo de ejecución (por código), y luego hapulsado el botón Cancel en respuesta al cuadro de diálogo Data baseLogin (Conexión a Base de Datos).

So lu ción rá pi daPro por cione la con tra seña cuando se pre sente el cua dro de diá logo DatabaseLogin, y luego pulse el botón OK.

Infor ma ción adi cio nalPuede evi tar tener que intro du cir con ti nua mente una con tra seña mien tras estádesa rro llando su apli ca ción, asig nando la con tra seña mediante código o a tra-vés de la sec ción Para me ter Ove rri des del edi tor del com po nente TDa tabase.

Mensajes de error 83

Page 118: Dsp

Para asig nar la con tra seña mediante código, añada una línea como la siguienteantes de acce der a la base de datos (por ejem plo, en el evento OnCreate del for-mu la rio o módulo de datos):

Ses sion.AddPass word('Kenn wort');

Para asig nar la con tra seña uti li zando la sec ción Para me ter Ove rri des deledi tor del com po nente TDa ta base, siga estos pasos:1. Haga doble clic sobre el com po nente TDa ta base.2. Veri fi que que se mues tran el Alias de la base de datos y el nom bre de

usua rio (Name) correcto.3. Des mar que la casi lla de veri fi ca ción Login Prompt.4. Pulse el botón Defaults.5. Añada la con tra seña en la línea Pass word= en el cua dro de lista Para me-

ter Ove rri des.

Alter na ti va mente, puede pro por cio nar un mane ja dor para el evento OnLo gindel com po nente TDatabase. Para más infor ma ción, con sulte “OnLo gin” en laayuda de Del phi.

Cannot copy a Repository Project to a directory underneath itselfPo si ble cau sa de error

Puede haber inten tado copiar un pro yecto que ha selec cio nado del Alma cén deObje tos (Repo si tory) a un direc to rio que está bajo el direc to rio en que el pro-yecto del Alma cén reside.

So lu ción rá pi daGuarde el nuevo pro yecto en un direc to rio dife rente.

Infor ma ción adi cio nalUn ejem plo de cómo podría ocu rrir este error es si se eje cu tan los siguien tespasos:1. Bajo el direc to rio Del phi X\Objre pos\Logoapp (en Del phi 3 o 4), crear un

direc to rio lla mado Log jam.2. Selec cio nar File | New.3. Selec cio nar el icono Win 95 Logo Appli ca tion de la página Pro jects.4. Inten tar guar dar el nuevo pro yecto (basado en el pro yecto Logoapp del

Almacén) en el direc to rio creado anteriormente.

84 Los Tomos de Delphi: Delphi sin problemas

Page 119: Dsp

Cannot create cursor handlePo si ble cau sa de error

1. Puede haber inten tado lla mar al método Open de un com po nente TQuerycuando la sen ten cia SQL no devuelve un con junto de valo res. Por ejem plo,lo siguiente pro du ci ría este men saje de error:

with Query1.SQL do be gin Add('INSERT (Last Na me) VALUES'); Add('(Mu rray)'); Add('INTO RBIHRKINGS'); Open; {Reem pla ce esto por ExecSQL para que funcione} end;

2. La pro pie dad SQL del com po nente TQuery puede estar vacía.

So lu ción rá pi da1. Si la sen ten cia SQL uti li zada en el com po nente TQuery no devuelve un

con junto de valo res (no es una sen ten cia SELECT de SQL), uti lice elmétodo ExecSQL de TQuery en lugar de Open.

2. Asigne una sen ten cia SELECT de SQL válida a la pro pie dad SQL.

Infor ma ción adi cio nalSi está uti li zando la pro pie dad SQL para inser tar, actua li zar o borrar valo resde una tabla, uti lice el método ExecSQL de TQuery. El método Open es sólopara sen ten cias SELECT.

Cannot create file <>Po si ble cau sa de error

1. Puede haber inten tado gra bar un archivo en una loca li za ción que no existeuti li zando el método Save To File. Por ejem plo, puede haber inten tado haceresto:

Ima ge1.Pic tu re.Sa ve To Fi le('C:\dot bumps\road.BMP');

sin que exista un direc to rio lla mado dot bumps en la uni dad C.2. Puede haber inten tado modi fi car y luego guardar un archivo de sólo lec tura

uti li zando el método Save To File. Por ejem plo, si el archivoSNAPSHOT.TXT es de sólo lec tura, lo siguiente gene ra ría el men saje deerror bajo dis cu sión:

var Anno ta te: TStrings;. . .

Mensajes de error 85

Page 120: Dsp

Anno ta te := TString List.Crea te;try Anno ta te.LoadF rom Fi le('C:\stan ding\snaps hot.txt'); Anno ta te.Add('Siendo las ' + Da te Ti me ToStr(Now) + ', los re sul ta dos son los si guien tes...'); . . . Anno ta te.Sa ve To Fi le('C:\stan ding\snaps hot.txt');fi nally Anno ta te.Free;end;. . .

So lu ción rá pi da1. Ase gú rese de que el direc to rio en el que intenta gra bar un archivo con el

método Save To File ya ha sido creado. Puede pri mero crear el direc to rio yluego gra bar el archivo en él. Por ejem plo, en el ejem plo de arriba podríahacer esto:

Crea te Dir('C:\dot bumps');Ima ge1.Pic tu re.Sa ve To Fi le('C:\dot bumps\road.BMP');

2. Ase gú rese de que el archivo en el que intenta escri bir no esté pro te gidocon tra escri tura (sólo lec tura).

Infor ma ción adi cio nalLos méto dos Save To File y LoadF rom File de la clase TPic ture pue den ser uti li-za dos con archi vos grá fi cos. Los méto dos Save To File y LoadF rom File de laclase abs tracta TStrings pue den ser apli ca dos a cual quier varia ble o pro pie dadde tipo TStrings, como por ejem plo la pro pie dad SQL del com po nente TQuery,así como a obje tos de cla ses des cen dien tes de TStrings, tales como TString List.

Por ejem plo, a con ti nua ción se mues tran algu nas for mas en las que el métodoSave To File puede ser uti li zado:

pro ce du re TForm1.But ton3 Click(Sen der: TObject);var Liszt: TStrings;be gin Liszt := TString List.Crea te; try Liszt.Add('Franz, Hun gary'); Crea te Dir('C:\Com po sers'); {Lla ma da a Sa ve To Fi le de TString List} Liszt.Sa ve To Fi le('C:\Com po sers\FLiszt.txt'); {Lla ma da a Sa ve To Fi le de la pro pie dad SQL de TQuery} Query1.SQL.Sa ve To Fi le('st8ments.txt'); {Lla ma da a Sa ve To Fi le de TPic tu re para gra bar un bitmap; se asu me que el di rec to rio Pit chers ya ha sido crea do} Ima ge1.Pic tu re.Sa ve To Fi le('C:\Pit chers\vase.BMP'); fi nally

86 Los Tomos de Delphi: Delphi sin problemas

Page 121: Dsp

Liszt.Free; end;end;

Cannot create form. No MDI forms are currently activePo si ble cau sa de error

1. Puede haber inten tado crear un for mu la rio hijo MDI (un for mu la rio quetiene la pro pie dad FormStyle asig nada a fsMDIChild) antes de que el for-mu la rio prin ci pal (su padre, con el valor fsMDIForm en la pro pie dadFormStyle) haya sido creado.

2. Puede haber desig nado un for mu la rio como hijo MDI con fi gu rando su pro-pie dad FormStyle a fsMDIChild mien tras la pro pie dad FormStyle delfor mu la rio prin ci pal no ha sido configurada a fsMDIForm.

So lu ción rá pi da1. Ase gú rese de que la pro pie dad FormStyle del for mu la rio padre (el for mu la-

rio cuya pro pie dad FormStyle tiene el valor fsMDIForm) sea creado antesde la crea ción de los for mu la rios hijos.

2. Si algún for mu la rio de la apli ca ción ha sido con fi gu rado como for mu la riohijo MDI (asign ando fsMDIChild a su pro pie dad FormStyle), el valorcorres pon diente del for mu la rio prin ci pal del pro yecto debe ser fsMDIForm.

Infor ma ción adi cio nal1. Si crea for mu la rios diná mi ca mente (en el código, en tiempo de eje cu ción),

el for mu la rio padre debe ser creado en pri mer lugar.

MDI sig ni fica ‘Inter faz de Múl ti ples Docu men tos. El estilo de apli ca ción alter-na tivo es SDI (’Inter faz de Docu mento Único). Una apli ca ción MDI con tiene unfor mu la rio cuya pro pie dad FormStyle tiene el valor fsMDIForm y uno o másfor mu la rios hijos, a cuya pro pie dad FormStyle se le debe asig nar el valorfsMDIChild. En una apli ca ción MDI, los for mu la rios hijos están siem pre con te-ni dos en den tro de los lími tes del for mu la rio padre.

Un ejem plo de una apli ca ción MDI es el Admi nis tra dor de Archi vos deWindows 3.x. Se podían abrir muchas ven ta nas den tro del espa cio de tra bajodel Administrador, y luego disponer las en cas cada (cas cade) o en mosaico (tile),o mover las a cual quier posi ción den tro de los límites de la ven tana del Admi-nis tra dor, pero no fuera de ella.

Un ejem plo de apli ca ción SDI es Del phi. Del phi está com puesto de múl ti plesfor mu la rios que flo tan libremente (el Inspec tor de Obje tos, la Paleta de Com po-nen tes, el Edi tor de Código, etc.) y que no están con te ni dos o res trin gidos pornin guna otra ven tana.

Mensajes de error 87

Page 122: Dsp

Cannot create WindowPo si ble cau sa de error

1. Puede estar uti li zando una can ti dad exce siva de con tro les TEdit yTCombo Box, y se está que dando sin espa cio en el heap local. Estos con tro-les uti li zan el heap local para alma ce nar su con te nido.

2. Puede tener una can ti dad exce siva de des cen dien tes de TWin Con trol en laapli ca ción, y estarse que dando sin mane ja do res de ven tana (hand les)dis po ni bles.

3. Puede haber expe ri men tado ante rior mente un fallo del sis tema, y la memo-ria no fue libe rada, por lo que la can ti dad de memo ria dis po ni ble paracrear nue vas ven ta nas está limitada.

So lu ción rá pi da1. Reduzca si es posi ble el número de con tro les TEdit y TCom boBox que está

uti li zando. Si esto no es posi ble, crée los diná mi ca mente cuando sean nece-sa rios, y libé re los cuando ya no sean nece sa rios (como ocu rre cuando estoscon tro les apa re cen sobre dife ren tes pági nas de un com po nente de cua dernocon pes ta ñas).

2. Reduzca si es posi ble el número de des cen dien tes de TWin Con trol (con tro-les visua les capa ces de reci bir el foco) que esté uti li zando. Si esto no esposi ble, crée los diná mi ca mente cuando sean necesarios, y libé re los cuandoya no sean nece sa rios (como ocu rre cuando estos con tro les apa re cen sobredife ren tes pági nas de un com po nente de cua derno con pestañas).

3. Rei ni cie la máquina e intén telo de nuevo.

Infor ma ción adi cio nalCon sulte “EOutO fRe sour ces” en la ayuda de Del phi.

Cannot debug project unless a host application is defined. Use theRun|Parameters. . . dialog box

Po si ble cau sa de error1. Puede haber creado un Acti ve Form o biblio teca Acti veX e inten tado eje cu-

tarla sin espe ci fi car la apli ca ción desde la que se accede a la biblio teca.2. Puede haber inten tado eje cu tar direc ta mente una .DLL seleccionando la

opción Run | Run o pul sando la tecla F9.

So lu ción rá pi da1. Siga estos pasos:

88 Los Tomos de Delphi: Delphi sin problemas

Page 123: Dsp

a. Seleccione Run | Param e ters.b. En el cuadro de combinación Host Appli ca tion, puede:

Seleccionar la aplicación principal (host application) de la lista.-O-Introducir el camino de la aplicación principal.-O-

Navegar hasta la aplicación principal utilizando el botón Browse.2. En Del phi 4 y supe rio res, puede aña dir una .DLL a un pro yecto selec cio-

nando Pro ject | Add to Pro ject. . . , y luego eje cu tar indi rec ta mente la.DLL eje cu tando el .EXE que la llama. Para más infor ma ción, con sulte“Pro ject Mana ger”, “remote debug ging” y “Resource .DLLs” en la ayuda deDel phi.

Infor ma ción adi cio nalLa crea ción de Acti ve Forms y con tro les Acti veX se intro dujo a par tir de Del phi3. Los for mu la rios Acti ve Form pue den ser dis tri bui dos a tra vés de la WorldWide Web (WWW); los con tro les Acti veX tam bién pue den ser uti li za dos enapli ca cio nes web, pero no sólo sir ven para ese fin. Creando com po nen tes Del phiy luego con vir tién do los en con tro les Acti veX, puede poner los a dis po si ción nosólo de los desa rro lladores de Del phi, sino tam bién de aque llos que uti li cencual quier entorno de desa rro llo que soporte los con tro les Acti veX, como C++Buil der, Visual C++, Intra Buil der, Inter net Explo rer, Visual Basic yPower Buil der.

Cannot enable AutoSessionName property with more than onesession on a form or data module

Po si ble cau sa de errorPuede haber inten tado asig nar True a la pro pie dad Auto Ses sion Name de uncom po nente TSes sion cuando hay uno o más com po nen tes TSes sion adi cio na lesen el for mu la rio o módulo de datos.

So lu ción rá pi daMan tenga el valor False en la pro pie dad Auto Ses sion Name si uti liza más deun com po nente TSes sion sobre un for mu la rio o módulo de datos.

Infor ma ción adi cio nalSi uti liza más de un com po nente TSes sion en una apli ca ción, no debe asig narTrue a la pro pie dad Auto Ses sion Name de nin guno de ellos. Del phi puede asig-nar auto má ti ca mente los nom bres de sesión (y garan ti zar que las sesio nes

Mensajes de error 89

Page 124: Dsp

gene ra das en tiempo de eje cu ción ten gan nom bres úni cos) sólo cuando se uti-liza un único com po nente TSes sion.

Cuando la pro pie dad Auto Ses sion Name tiene el valor False (como debe ser encaso de que haya más de un com po nente TSes sion sobre un for mu la rio), ustedes el res pon sa ble de asig nar un nom bre de sesión a tra vés de la pro pie dadSession Name, ya sea en tiempo de diseño o en tiempo de eje cu ción (en elcódigo).

Para más infor ma ción sobre las res tric cio nes a tener en cuenta cuando se tra-baja con com po nen tes TSes sion, con sulte “Can not modify Ses sion Namewhile Auto Ses sion Name is ena bled”.

Cannot find <> on the search pathPo si ble cau sa de error

Puede haber inten tado ver el código fuente de una uni dad en el Pac kage Edi tor(Edi tor de Paque tes), pero esta no está en el camino de bús queda de Del phi.

So lu ción rá pi daLoca lice el archivo y coló quelo en el camino de bús queda de Del phi, o modi fi-que el camino de bús queda para incluir la loca li za ción actual del archivo.

Infor ma ción adi cio nalPara loca li zar un archivo uti li zando el Explo ra dor de Win dows, siga estospasos:1. En el panel de direc to rios de la izquierda, selec cione el área donde desea

bus car; para bus car sobre toda la máquina, selec cione el icono que repre-senta al orde na dor (deno mi nado por defecto MiPc).

2. Selec cione Herra mien tas| Bus car | Archi vos o Car pe tas....3. Intro duzca el nom bre del archivo en el cua dro de com bi na ción Nom bre

(por ejem plo, Mis pla ced.PAS).4. Pulse el botón Bus car ahora.

Para colo car el archivo en el camino de bús queda de Del phi, pri mero podríadesear ver qué direc to rios cons ti tu yen el camino de bús queda de Del phi. Paraello, siga estos pasos:1. Selec cione Tools | Envi ron ment Options.2. Selec cione la página Library.3. Con sulte el con te nido del cua dro de com bi na ción Library Path.4. Mueva el archivo a uno de esos direc to rios, o añada el direc to rio en que

reside el archivo al camino de búsqueda.

90 Los Tomos de Delphi: Delphi sin problemas

Page 125: Dsp

Cannot find Engine configuration filePo si ble cau sa de error

Puede que IDAPI.CFG (Win dows 3.x) o IDAPI32.CFG (Win dows/Del phi de 32bits) no pueda ser encon trado donde debe ría estar.

So lu ción rá pi daSi está uti li zando Del phi 1/Win dows 3.x, ase gú rese de que la loca li za ción delarchivo IDAPI.CFG (por defecto C:\IDAPI) coin cide con lo indi cado en la sec-ción [IDAPI] de WIN.INI bajo la entrada CONFIGFILE01.

Si es nece sa rio, mueva el archivo al lugar indi cado por la con fi gu ra ción enWIN.INI, o modi fi que la entrada en WIN.INI para que esté en con cor dan ciacon la loca li za ción actual del archivo.

Si está uti li zando Del phi de 32 bits y Win dows 95, ase gú rese de que la loca li za-ción del archivo IDAPI32.CFG (C:\Archi vos de pro grama\Bor land\Com monfiles\BDE por defecto) coin cide con lo indi cado en el Regis tro del sis tema.

Si es nece sa rio, mueva el archivo al lugar indi cado en el Regis tro, o modi fi quela entrada del Regis tro para que coi ncida con la loca li za ción actual del archivo.

Infor ma ción adi cio nalLas cosas han cam biado con la apa ri ción del Regis tro en las ver sio nes de Win-dows de 32 bits. Antes de Win dows 95, el archivo de con fi gu ra ción del BDE(IDAPI.CFG) estaba situado por defecto en el direc to rio IDAPI de la uni dad C:.WIN.INI apun taba a la loca li za ción de ese archivo; de esta manera, se podíacam biar de sitio el archivo de con fi gu ra ción siem pre que se indi cara la nuevaloca li za ción en WIN.INI, para que los pro gra mas que nece si ta ban refe rirse a élpudie ran encon trarlo.

En las ver sio nes de Del phi de 32 bits, la loca li za ción del archivo de con fi gu ra-ción del BDE se indica en el Regis tro del sis tema. Siga estos pasos:1. Selec cione Ini cio | Eje cu tar.2. Intro duzca rege dit en el cua dro de com bi na ción Abrir y pulse el botón

Acep tar.3. Nave gue hasta HKEY_LOCAL_MACHINE\Soft ware\Bor land\Data base

Engine.4. El valor de la clave CONFIGFILE01 indica el direc to rio donde el archivo

de con fi gu ra ción debe estar situado.

Mensajes de error 91

Page 126: Dsp

Cannot find implementation of method <>Po si ble cau sa de error

Puede haber borrado (o comen tado) un método de la sec ción Imple men ta tionsin borrar la decla ra ción del método en la sec ción Inter face, dejando una refe-ren cia a él en la página de even tos del Inspec tor de Obje tos. Luego intentó vol-ver a crear el ges tor de even tos pul sando dos veces sobre la columna dere chade la página de even tos (Events) del Inspec tor de Obje tos (o sobre un objetopara crear un ges tor para su evento por defecto).

So lu ción rá pi daBorre la refe ren cia al método mane ja dor de even tos en la columna dere cha dela página de even tos del for mu la rio, y borre la decla ra ción del método de lasec ción Inter face de la uni dad.

Infor ma ción adi cio nalSi borra tanto el cuerpo del método de la sec ción Imple men ta tion de la uni dadcomo la decla ra ción del método de la sec ción de Inter face (dejando la refe ren ciaal evento sobre la página de even tos del Inspec tor de Objetos), y luego intentavol ver a crear el ges tor de even tos, no reci birá un men saje de error, pero Del-phi no creará el esque leto del ges tor de even tos. Como en el caso de arriba,debe eli mi nar la refe ren cia al método ges tor de even tos en la columna dere chade página de even tos del for mu la rio antes de poder vol ver a codi fi car elmétodo.

Cannot find serverPo si ble cau sa de error

Puede haber espe ci fi cado inco rrec ta mente el número de puerto en un URL, onin gún puerto en abso luto, o está escu chando por un puerto inco rrecto en suapli ca ción Site Express.

So lu ción rá pi daVeri fi que que la apli ca ción ser vi dora está escu chando por el puerto correcto, yque la apli ca ción cliente está inten tando conec tarse a ese mismo puerto.

Infor ma ción adi cio nalSi está pro bando una apli ca ción Site Express, puede uti li zar el siguiente tipode URL: http://local host:1024/Svrinfo.exe

92 Los Tomos de Delphi: Delphi sin problemas

Page 127: Dsp

Local host es su máquina (IP #127.0.0.1); está inten tando conec tarse al puerto1024 y eje cu tar la apli ca ción Svrinfo.

Site Express hizo su apa ri ción en Del phi 6.

Cannot focus a disabled or invisible windowPo si ble cau sa de error

1. Puede haber inten tando lla mar al método Set Fo cus para un con trol cuyapro pie dad Visi ble o Ena bled tie nen el valor False. Por ejem plo, si no haynin gún texto selec cio nado en el com po nente Rich Edit1, lo siguiente gene-rará este men saje de error:

pro ce du re Di sa bleAn dFo cus(Sen der: TObject);be gin But ton1.Ena bled := Rich Edit1.Sel Length > 0; ... {Otro pro ce sa mien to} But ton1.Set Fo cus;end;

Lo mismo suce de ría si la pro pie dad Visi ble estu viera siendo compro bada deuna manera simi lar y su valor fuera False. Por ejem plo, en caso de que nohayan datos de texto en el por ta pa pe les, el siguiente código gene ra ría elmen saje de error bajo dis cu sión:

pro ce du re Hi deAn dFo cus(Sen der: TObject);be gin But ton1.Vi si ble := Clip board.Has For mat(CF_TEXT); ... {Otro pro ce sa mien to} But ton1.Set Fo cus;end;

2. Puede haber uti li zado un com po nente TPa ge Con trol en Del phi 2 (este com-po nente no estaba dis po ni ble en Del phi 1; esto no ocu rre en Del phi 3 ysupe rio res) y asignó a la pro pie dad Acti ve Con trol un con trol que no estabavisi ble la última vez que el pro yecto fue cerrado.

So lu ción rá pi da1. Veri fi que que las pro pie da des Visi ble y Ena bled del con trol tie nen ambas el

valor True antes de inten tar asig narle el foco.2. Abra el for mu la rio como texto y borre la línea donde se asigna el valor a la

pro pie dad Acti ve Con trol. Puede hacer esto de dos mane ras:Pul sando el botón dere cho del ratón sobre el for mu la rio y selec cio nando laopción View as Text del menú de con texto.-O-Selec cio nando File | Open, asig nando el fil tro para mos trar los archi vos.DFM y abriendo el for mu la rio en cues tión.

Mensajes de error 93

Page 128: Dsp

Infor ma ción adi cio nalEste men saje de error puede pro vo car con fu sión, debido a una posi ble dife ren-cia de con cepto entre lo que Ud. puede con si de rar nor mal mente como una ven-tana y de lo que Win dows y Del phi con si deran como una ven tana. En este caso,cuando se habla de ven tana se quiere decir en rea li dad un con trol de ven tana(cual quier con trol al que se asigna un mane ja dor de ven tana y que es capaz dereci bir el foco y ser padre de otros con tro les). En este sentido, un botón es unaven tana, un cua dro de edi ción es una ven tana — y en rea li dad todos los com po-nen tes que des cien den de TWin Con trol son ven ta nas.

Cannot hide an MDI Child FormPo si ble cau sa de error

Puede estar inten tando escon der un for mu la rio hijo MDI de cual quiera de lassiguien tes mane ras:

pro ce du re TMDIChild.Form Clo se(Sen der: TObject; var Action: TClo seAc tion);be gin Action := ca Hi de; { el va lor por de fec to es ca Mi ni mi ze }end;

pro ce du re TMDIChild.But ton1 Click(Sen der: TObject);be gin Hide; {pue de mostrarlo, pero no pue de es con der lo}end;

pro ce du re TMDIChild.But ton1 Click(Sen der: TObject);be gin Vi si ble := Fal se; {esto hace lo mis mo}end;

So lu ción rá pi daNo asigne el valor caHide al pará me tro Action del evento Form Close, ni llameal método Hide del for mu la rio o asigne False a la pro pie dad Visi ble del for mu-la rio para un for mu la rio hijo MDI. Si desea eli mi nar el for mu la rio, llame a sumétodo Close.

Esto cerrará el for mu la rio:

pro ce du re TMDIChild.But ton1 Click(Sen der: TObject);be gin Clo se;end;

94 Los Tomos de Delphi: Delphi sin problemas

Page 129: Dsp

Infor ma ción adi cio nalEl método Hide de TForm asigna False a la pro pie dad Visi ble.

Cuando se cie rra un for mu la rio hijo MDI, el valor que se asigna por defecto alpará me tro Action es caMi ni mize. Si no quiere que el for mu la rio hijo sea mini-mi zado, puede asig nar el valor caF ree al pará me tro Action para libe rar lamemo ria reser vada para el for mu la rio.

pro ce du re TMDIChild.Form Clo se(Sen der: Tob ject; var Action: TClo seAc tion);be gin Action := caF ree;end;

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

Con sulte “Error Crea ting Form: Can not inhe rit from form <>. It con-tains a com po nent with a blank name pro perty”.

Cannot initialize local variablesPo si ble cau sa de error

Puede haber inten tado asig nar un valor a una varia ble local en el momento desu decla ra ción. Por ejem plo, lo siguiente gene rará el men saje de error bajodis cu sión:

pro ce du re TForm2.But ton1 Click(Sen der: TObject);var ThisIsThis: Boo lean = True;. . .

Lo siguiente tam bién gene rará el men saje de error bajo dis cu sión (a pesar deltexto del men saje de error, que hace pare cer que éste sola mente se pro duce enuna sec ción Var):

pro ce du re TForm2.But ton1 Click(Sen der: TObject);const ThisIsThis: Boo lean = True;. . .

So lu ción rá pi daNo asigne valo res a las varia bles en la sec ción Var de un pro ce di miento ofun ción.

Mensajes de error 95

Page 130: Dsp

No asigne un tipo de datos a una cons tante en la sec ción Const de un pro ce di-miento o fun ción.

Para ini cia li zar la varia ble ThisIsThis con el valor True (como se intenta en elpro ce di miento de arriba), pro ceda de la siguiente forma:

pro ce du re TForm2.But ton1 Click(Sen der: TObject);var ThisIsThis: Boo lean;be gin ThisIsThis := True; . . .

O de esta forma, si es que el valor nunca cam biará:

pro ce du re TForm2.But ton1 Click(Sen der: TObject);const ThisIsThis = True;. . .

Infor ma ción adi cio nalTurbo Pas cal y todas las ver sio nes de Del phi sopor tan una espe cie de varia blesini cia li za das que se conocen como cons tan tes con tipo (typed cons tants). Lascons tan tes con tipo son real mente un híbrido entre cons tantes y varia bles.Como en el caso de las cons tan tes puras, usted puede asig nar les un valor en elmismo momento en que las declara. Como en el caso de las varia bles, sus valo-res pue den cam biar en tiempo de eje cu ción. Y tam bién como las varia bles (y adife ren cia de las cons tan tes), su tipo de datos se espe ci fica en el momento queson decla ra das (por eso pre ci sa mente se les conoce como cons tan tes con tipo).

A con ti nua ción se mues tran algu nos ejem plos de cómo decla rar varia bles,cons tan tes típi cas y cons tan tes con tipo en la sec ción Inter face de una uni dad,mos trando sus seme jan zas y dife ren cias:

unit Aryan;in ter fa cevar tf: Text Fi le; ThisIsThis: Boo lean = True; {va ria ble ini cia li za da - le gal en una sec ción glo bal}const crlf = #13#10; {cons tan te “pura”} Satz: String[50] = 'All we are is dust in the wind'; {cons tan te con tipo}

im ple men ta tion. . .

96 Los Tomos de Delphi: Delphi sin problemas

Page 131: Dsp

Cannot initialize multiple variablesPo si ble cau sa de error

Puede estar inten tando decla rar más de una varia ble ini cia li zada (o cons tantecon tipo) uti li zando una asig na ción. Por ejem plo, lo siguiente gene rará el men-saje de error bajo dis cu sión:

in ter fa ceconst Que Se ra Se ra, Wha te ver Will Be Will Be: Boo lean = True; . . .

Para ini cia li zar a True a ambas cons tan tes con tipo, debe hacerlo así:

in ter fa ceconst Que Se ra Se ra: Boo lean = True; Wha te ver Will Be Will Be: Boolean = True; . . .

So lu ción rá pi daIni cia lice cada cons tante con tipo en su pro pia sentencia.

Infor ma ción adi cio nalSe puede decla rar múl ti ples varia bles en una misma sentencia, así:

var i,j,k,l: in te ger;

o así:

var aBeam: array[0..3] of in te ger;

Pero no es posi ble ini cia li zar las en una única sen ten cia, en caso de que las con-vir tié ra mos en cons tan tes con tipo.

Cannot initialize thread local variablesPo si ble cau sa de error

Puede estar inten tando asig nar un valor ini cial a una varia ble local de hilo(decla rada mediante la pala bra reser vada Thread var). Por ejem plo, lo siguientegene rará este men saje de error:

thread var Thread ba re: Byte = 7;

Mensajes de error 97

Page 132: Dsp

So lu ción rá pi daSim ple mente declare la varia ble, así:

thread var Thread ba re: Byte;

Infor ma ción adi cio nalLas varia bles loca les de hilo se decla ran como si fue ran varia bles glo ba les (esdecir, no puede decla rar las en un método de un objeto TThread), pero los obje-tos TThread pue den hacer refe ren cia a ellas como si hubie sen sido decla ra daslocal mente. Alter na ti va mente, puede decla rar un campo o un par campo/pro-pie dad en la decla ra ción de una clase deri vada de TThread, así:

type Thread Bear = class(TThread) pri va te FTroop: Wi deS tring; pro tec ted pro ce du re Exe cu te; ove rri de; pro perty Troop: Wi deS tring read FTroop wri te FTroop; end;

Cannot Load IDAPI Service LibraryPo si ble cau sa de error

1. Si está uti li zando el con tro la dor del BDE para MS Access, y Access 95 oMicro soft Office 95 no fue ron uti li za dos para ins ta lar el motor DAO, esposi ble que falte una entrada nece sa ria en el Regis tro.

2. Puede que IDPROV32.DLL no esté situado en la loca li za ción espe rada.3. Si obtiene este men saje de error en una apli ca ción de múl ti ples capas, es

posi ble que STDVCL[32,40].DLL y/o DBCLIENT.DLL no estén regis tra dasen el ser vi dor.

4. El Regis tro del sis tema puede estar con fi gu rado como de sólo lec tura.5. Puede estar inten tando acce der a tablas de Access, pero el motor DAO de

Micro soft no está ins ta lado en el sis tema (o está ins ta lada una ver siónanti gua de él).

6. Una DLL reque rida por el BDE puede estar ausente o dañada.

So lu ción rá pi da1. Añada la entrada al Regis tro del sis tema, siguiendo estos pasos:

a. Seleccione Inicio | Ejecutar... desde el escritorio de Win dows.

98 Los Tomos de Delphi: Delphi sin problemas

Page 133: Dsp

b. Introduzca regedit en el cuadro de combinación Abrir y pulse el botónAceptar.

c. Navegue hastaHKEY_LOCAL_MACHINE\Soft ware\Microsoft\Shared Tools\DAO.

d. Pulse con el botón derecho sobre la entrada Path, seleccione Mod ificaren el menú de contexto, y luego asigne en el cuadro de edición queaparece la localización de DAO3032.DLL.

2. Loca lice el archivo IDPROV32.DLL, y mué valo al direc to rio del BDE en elser vi dor. La loca li za ción por defecto es: C:\Archi vos de pro grama\Bor-land\Com mon files\BDE.

3. Veri fi que que IDPROV32.DLL está situada en el direc to rio de DLLs delBDE (como está espe ci fi cado en WIN.INI o el Regis tro del sis tema, según elsis tema ope ra tivo de que se trate). Adi cio nal mente, DBCLIENT.DLL ySTDVCL[32,40].DLL deben estar ins ta la dos en el direc to rio de sis tema deWin dows y regis trados.

4. Modi fi que el estado gene ral del Regis tro del sis tema a lec tura/escri tura, oal menos la entrada corres pon diente para la .DLL en cues tión.

5. Instale el motor DAO, y luego añada la entrada para el con tro la dor deAccess incluido en su ver sión de DAO, uti li zando la utili dad de Con fi gu ra-ción del BDE (Con fi gu ra tion | Dri vers | Native | MSAccess |DLL32), por ejem plo, IDDA3532.DLL.Si no está uti li zando la última ver sión del BDE, des cár guela del sitiowww.borland.com. Eje cute la uti li dad de Con fi gu ra ción del BDE y modi fi-que la entrada corres pon diente al con tro la dor de Access de IDDAO32.DLLa IDDA3532.DLL (o cual quiera que sea la ver sión más reciente del con tro-la dor de Access).

6. Veri fi que que ha rea li zado una ins ta la ción com pleta del BDE y de todo elsoft ware cliente que sea nece sa rio para conec tarse a la base de datos queesté uti li zando.

Infor ma ción adi cio nal1. Del phi 4 y pos te rio res ofre cen soporte nativo para Access 97.6. Si no puede deter mi nar la causa de este men saje, puede recu rrir a la

medida drás tica de reins ta lar el BDE (selec cione Full Install) desde el CDde Del phi y/o reins ta lar cual quiera de los con tro la do res de base de datos yherra mien tas de cliente de la base de datos a la cual se esté conec tando.

Para más infor ma ción, con sulte “Class not regis te red”.

Mensajes de error 99

Page 134: Dsp

Cannot load IDAPI[32].DLLPo si ble cau sa de error

1. Pue den fal tar uno o más archi vos del BDE. O puede que el BDE no hayasido ins ta lado en abso luto.

2. El BDE puede no estar correc ta mente con fi gu rado. Uno de los posi bles pro-ble mas es que haya una entrada inco rrecta en WIN.INI (Del phi 1) o en elRegis tro del sis tema (Del phi de 32 bits) para la clave CONFIGFILE01.

3. Puede haber rea li zado sólo una ins ta la ción par cial del BDE.4. Puede haber uti li zado Install Shield Express para ins ta lar una apli ca ción

que uti liza el BDE, y no haber aña dido la entrada corres pon diente alcamino de las .DLLs del BDE en el Regis tro del sis tema.

So lu ción rá pi da1. Instale el BDE en todos los orde na do res que eje cu ta rán pro gra mas de base

de datos crea dos con Del phi (a menos que esté uti li zando una alter na tivade ter ce ros para el BDE, en cuyo caso no debe ría obte ner este men saje deerror).Con sulte DEPLOY.TXT para la infor ma ción espe cí fica sobre cómo dis tri-buir las apli ca cio nes para su ver sión par ti cu lar de Del phi. Este archivoestá ubi cado por defecto en el direc to rio \Del phi.

2. Ase gú rese de que el lugar indicado por el valor de la entrada Con fi gFi le01en WIN.INI o en el Regis tro del sis tema apunte a la loca li za ción de suarchivo de con fi gu ra ción (IDAPI[32].CFG).

Aquí están los deta lles espe cí fi cos:

Delphi 1

Loca lice el pará me tro DLLPATH en la sec ción [IDAPI] deC:\Windows\WIN.INI y com pruebe que su valor sea correcto. Por defecto, es:

[IDAPI]DLLPATH = C:\IDAPI

Si el camino de la DLL en WIN.INI corres ponde al valor C:\IDAPI, peroIDAPI.DLL está situada en otro sitio, mueva IDAPI.DLL al lugar asig nado enWIN.INI, o modi fi que la con fi gu ra ción en WIN.INI para que apunte al caminodonde reside IDAPI.DLL.

Delphi de 32 bits

Loca lice la clave del Regis tro que indica la loca li za ción de las .DLLs del BDE:HKEY_LOCAL_MACHINE\Soft ware\Bor land\Data base Engine\DLLPath.

Si el camino con fi gu rado en el Regis tro del sis tema corres ponde al valor pordefecto C:\Archi vos de pro grama\Bor land\Com mon files\BDE, pero

100 Los Tomos de Delphi: Delphi sin problemas

Page 135: Dsp

IDAPI32.DLL está en otro sitio, mueva IDAPI32.DLL al lugar con fi gu rado enel Regis tro o cam bie la con fi gu ra ción del Regis tro para que indi que el caminodonde reside IDAPI32.DLL.3. Reins tale el BDE, selec cio nando Full ins tall.4. Edite el Regis tro del sis tema, como se indica en Infor ma ción adi cio nal.

Intro duzca el camino de acceso a IDAPI32.DLL en el pará me tro DLLPATH(por defecto C:\Archi vos de pro grama\Bor land\Com mon files\BDE).

Infor ma ción adi cio nalPara edi tar el Regis tro del sis tema, siga estos pasos:1. Selec cione Eje cu tar del menú Ini cio.2. Intro duzca rege dit en el cua dro de edi ción y pulse el botón Acep tar.3. Nave gue hasta HKEY_LOCAL_MACHINE\Soft ware\Bor land\Data base

Engine\DLLPath.4. Pulse el botón dere cho sobre DLL Path en el panel de la dere cha.5. Selec cione Modi fi car del menú de con texto.6. Edite el camino en el cua dro de edi ción que aparece.

Una ins ta la ción par cial coloca una ver sión ‘recor tada’ del BDE en el direc-to rio del pro grama que uti liza el BDE.

Cannot load language driverPo si ble cau sa de error

Su con tro la dor de len guaje podría estar ausente, o la entrada del Regis tropodría ser inco rrecta.

So lu ción rá pi daPara veri fi car la con fi gu ra ción, siga estos pasos:1. Selec cione Ini cio | Eje cu tar.2. Intro duzca rege dit y pulse Acep tar.3. Nave gue hasta \HKEY_LOCAL_MACHINE\Soft ware\Bor land\Data base

Engine\Set tings\System\INIT\LANGDRIVER.

El valor de la entrada depende de su loca li za ción física (EE.UU., Europa,Japón, etc.), o más espe cí fi ca mente, de la loca li za ción para la que ha sido con fi-gu rada el orde na dor. Por ejem plo, si está usted en los Esta dos Uni dos, el valorde la entrada LANGDRIVER debe ría ser DBWINUS0.

Veri fi que que la entrada del Regis tro sea correcta. Si es nece sa rio, modifíquela.Si la entrada es inco rrecta, veri fi que que el con tro la dor de len guaje apro piadoexista en el sis tema (en \Archi vos de pro grama\Bor land\Com mon files\BDE).Por ejem plo, el archivo corres pon diente a la entrada DBWINUS0 es USA.BLL.

Mensajes de error 101

Page 136: Dsp

Si el con tro la dor de len guaje apro piado (.BLL) está ausente, cópielo desde elCD-ROM de Del phi al lugar indi cado arriba.

Infor ma ción adi cio nal

Nota: Este es el error de inicialización del BDE $3E06.

Cannot load package <>. It contains unit <> which is alsocontained in package <>

Po si ble cau sa de error1. Puede estar inten tando car gar un paquete que con tiene una uni dad que ya

está pre sente en su biblio teca.2. Puede estar inten tando recom pi lar un paquete exis tente des pués de ins ta-

lar en él un com po nente que ya está con te nido en la VCL.

So lu ción rá pi da1. Si el paquete no con tiene uni da des adi cio na les que usted nece site, sim ple-

mente abs tén gase de car gar el paquete redun dante.2. Selec cione Acep tar para cerrar el cua dro de men saje de error, y luego

pulse No cuando se le pre gunte si desea guar dar los cam bios. Puede per derel paquete en el cual ins taló el com po nente. En ese caso, sim ple mentereins tale el paquete (esta vez sin el com po nente adi cio nal).

Infor ma ción adi cio nal1. Si ambos paque tes con tie nen com po nen tes que usted nece sita, puede crear

un nuevo paquete que incluya las par tes que nece sita de ambos paque tes.

Cannot locate IDAPI[01,32].DLLPo si ble cau sa de error

Puede haber optado por una ins ta la ción par cial cuando ins taló Del phi.

Delphi 1

Puede ser que el archivo IDAPI01.DLL nunca haya sido ins ta lado, haya sidomovido o borrado, o la sec ción [IDAPI] de WIN.INI esté ausente o seainco rrecta.

102 Los Tomos de Delphi: Delphi sin problemas

Page 137: Dsp

Delphi de 32 bits

Puede ser que el archivo IDAPI32.DLL nunca haya sido ins ta lado, haya sidomovido o borrado, la con fi gu ra ción nece sa ria en el Regis tro esté ausente o seainco rrecta.

So lu ción rá pi daAse gú rese de que el BDE esté ins ta lado y con fi gu rado correc ta mente. Si noestá ins ta lado, ins tá lelo. Con sulte DEPLOY.TXT para obte ner infor ma ciónsobre la ins ta la ción del BDE para su ver sión par ti cu lar de Del phi. El archivoDEPLOY.TXT está ubi cado por defecto en el direc to rio \Del phi. Si el BDE estáins ta lado, puede no estar con fi gu rado correc ta mente. Con sulte la parte rela cio-nada con su ver sión de Del phi de la siguiente sec ción.

Delphi 1

Veri fi que que la localización de IDAPI.DLL a la que apunta el archivoWIN.INI esté en con cor dan cia con la loca li za ción actual de IDAPI01.DLL. Bus-que la sec ción [IDAPI]. Las entra das CONFIGFILE01 y DLLPATH se refie rena C:\IDAPI por defecto.

Delphi de 32 bits

Veri fi que que la ubi ca ción a la que apunta el Regis tro del sis tema paraIDAPI.DLL esté en con cor dan cia con la loca li za ción actual de IDAPI32.DLL.Para com pro barlo, eje cute Rege dit y nave gue hastaHKEY_LOCAL_MACHINE\Soft ware\Bor land\Data base Engine.

La ubi ca ción por defecto indicada por las entra das CONFIGFILE01 yDLLPATH es C:\Archi vos de pro grama\Bor land\Com monfiles\BDE\IDAPI32.CFG.

Infor ma ción adi cio nal

Delphi 1

Para con sul tar y posi ble mente edi tar el archivo WIN.INI, nave gue hasta él enel direc to rio de Win dows, ábralo y bus que la sec ción [IDAPI], que debe ría pare-cerse un poco a esto:

[IDAPI]DLLPATH=C:\IDAPICONFIGFILE01=C:\IDAPI\IDAPI.CFG

Si no hay una entrada [IDAPI], o están ausen tes los valo res de con fi gu ra ciónpara DLLPATH y/o CONFIGFILE01, añá da los para que apun ten a las ubi ca-cio nes de las DLLs de IDAPI (IDAPI01.DLL, etc.) y al archivo IDAPI.CFG,res pec ti va mente.

Mensajes de error 103

Page 138: Dsp

Si parece que las entra das son correctas, mueva los archi vos a la loca li za ciónindicada por las entra das, o modi fi que las entra das en con cor dan cia con la ubi-ca ción de los archi vos.

Delphi de 32 bits

Para con sul tar y posi ble mente edi tar el Regis tro del sis tema, siga estos pasos:1. Selec cione Eje cu tar del menú Ini cio.2. Intro duzca rege dit en el cua dro de edi ción y pulse el botón Acep tar.3. Nave gue hasta HKEY_LOCAL_MACHINE\Soft ware\Bor land\Data base

Engine\DLLpath.4. Pulse el botón dere cho sobre DLL Path en el panel de la dere cha.5. Selec cione Modificar en el menú de con texto.6. Edite el camino en el cua dro de edi ción que aparece.

Como crear un Alias utilizando la herramienta de configuración de BDE

En Del phi 1, la herra mienta de con fi gu ra ción del BDE es BDECFG.EXE. EnDel phi 2, es BDECFG32.EXE. A par tir de Del phi 3 es BDEADMIN.EXE. Encual quier ver sión, debe estar dis po ni ble selec cio nando Ini cio | Pro gra mas |Bor land Del phi X | BDE [Con fi gu ra tion, Admi nis tra tor]. Alter na ti va-mente, usted puede aña dirlo al menú Tools de Del phi para acce der rápi da-mente a él mien tras tra baja en Del phi (Tools | Con fi gure Tools | Add).

Para crear un alias con la herra mienta de Con fi gu ra ción del BDE, siga estospasos:1. Selec cione Ini cio | Pro gra mas | Bor land Del phi X | BDE [Con fi gu ra-

tion, Admi nis tra tor].2. Teniendo activa la eti queta Data ba ses y el ele mento Data ba ses selec cio-

nado en la vista jerár quica, selec cione Object | New. . . .3. Com pruebe que el pará me tro Type corres ponda al tipo de la base de datos

que haya creado o creará (’Stan dard’ para Para dox, dBASE, y ASCII;‘Access’ para MS Access, etc.).

4. Si selec cionó el con tro la dor Stan dard (para crear una base de datos Para-dox, por ejem plo), asigne la ubi ca ción de la base de datos al pará me troPath (Ser ver Name para Inter Base y Ora cle; Data base Name para MS SQLSer ver, MS Access, Sybase, e Infor mix; DB2 DS2 para DB2). Si uti lizaPath, puede intro du cir un camino DOS, como:

K:\HallOfFa me\Ba se ball

o, en Del phi de 32 bits, puede uti li zar el for mato UNC (Con ve nio Uni ver salde Nom bres), con el formato:

\\Ser ver Na me\Sha re Na me\Sha re Dir

104 Los Tomos de Delphi: Delphi sin problemas

Page 139: Dsp

Cannot make a visible window modalPo si ble cau sa de error

Puede haber lla mado al método Show Mo dal de un for mu la rio que ya estabades ple gado.

So lu ción rá pi daNo llame al método Show Mo dal de un for mu la rio al menos que esté creán dolodiná mi ca mente.

Infor ma ción adi cio nalCuando un for mu la rio es creado auto má ti ca mente por Del phi (como ocu rre pordefecto con todos los for mu la rios, y siem pre con el for mu la rio prin ci pal de laapli ca ción), Del phi cam bia el valor de la pro pie dad Visi ble del for mu la rio deFalse a True.

La única situa ción en la que puede (y debe) lla mar a uno de los métodos Showo Show Mo dal del for mu la rio es cuando cree el for mu la rio diná mi ca mente. Esreco men da ble crear diná mi ca mente aquellos for mu la rios que no estarán abier-tos durante todo el tiempo de eje cu ción de la apli ca ción (como un cua dro dediá logo ‘Acerca de...’).

Para crear un for mu la rio diná mi ca mente, siga estos pasos:1. Selec cione View | Pro ject Mana ger.2. Pulse el botón Options.3. Selec cione el for mu la rio que desea crear diná mi ca mente en el cua dro de

lista Auto-Create Forms.4. Mué valo al cua dro de lista Avai la ble Forms pul sando el botón de fle cha

dere cha.5. Pulse el botón OK.6. Añada el siguiente código al evento en el que desee mos trar el for mu la rio

(sus ti tuya About Box por el nom bre de varia ble de la ins tan cia del for mu la-rio y TAbout Box por el nom bre de la clase del for mu la rio):

pro ce du re TForm1.About BoxC lick(Sen der: TObject);be gin About Box := TAbout Box.Crea te(nil); try About Box.Show Mo dal; fi nally About Box.Free; end;end;

Mensajes de error 105

Page 140: Dsp

Cannot modify a read-only datasetPo si ble cau sa de error

Puede estar inten tando edi tar un com po nente TTa ble cuya pro pie dadReadOnly tiene el valor True.

So lu ción rá pi daAse gú rese de que la pro pie dad ReadOnly del objeto TTa ble tenga el valor Falseantes de inten tar edi tar la tabla.

Infor ma ción adi cio nalNo es posi ble cam biar la pro pie dad ReadOnly de un TTa ble mien tras la tablaesté abierta (su pro pie dad Active tenga el valor True), por lo que deberá pri-mero cerrar la tabla, cam biar el valor de la pro pie dad ReadOnly, y luego hacerla actualización, inser ción o borrado.

with Ta ble Ten nis do be gin Acti ve := Fal se; ReadOnly := Fal se; Acti ve := True; Insert; Insert Re cord(['Gump', 'Fo rrest', 'Ping Pong', 1]);end;

Cannot modify SessionName while AutoSessionName is enabledPo si ble cau sa de error

Puede estar inten tando asig nar un nuevo valor a la pro pie dad Ses sion Name deun com po nente TSes sion cuando su pro pie dad Auto Ses sion Name tiene el valorTrue.

So lu ción rá pi daAbstén gase de edi tar el nom bre gene rado auto má ti ca mente para un com po-nente TSes sion, o asigne pri mero False a la pro pie dad Auto Ses sion Name antesde modi fi car la pro pie dad Ses sion Name.

Infor ma ción adi cio nalEl com po nente TSes sion es simi lar a TAppli ca tion, ya que nor mal mente no esnece sa rio preo cu parse por crear uno, ya que Del phi lo hace auto má ti ca mentecuando sea nece sa rio. Pero si está desa rro llando apli ca cio nes multi-hilo o sidesea acce der a tablas Para dox situa das en dife ren tes luga res de una red,usted puede aña dir com po nen tes TSes sion adi cio na les al for mu la rio o módulo

106 Los Tomos de Delphi: Delphi sin problemas

Page 141: Dsp

de datos para faci li tar las ope ra cio nes bajo esas cir cuns tan cias espe cia les. Paramás infor ma ción, Con sulte “Auto Ses sion Name” y “mana ging mul ti ple ses sions”en la ayuda de Del phi.

Cannot open component library <Path>\Complib.dclPo si ble cau sa de error

Puede haber ins ta lado un com po nente que se enlaza está ti ca mente a una .DLLque no puede ser encon trada.

So lu ción rá pi daCopie una ver sión de copia de segu ri dad de su biblio teca de com po nen tes(COMPLIB.DCL) a \Del phi\bin (Del phi 1).

Resuelva el pro blema con la .DLL antes de ins ta lar el com po nente de nuevo.

Infor ma ción adi cio nalSiem pre que sea posi ble, uti lice el enlace diná mico a .DLLs (mediante las fun-cio nes Load Li brary y GetP rocAddress) en lugar del enlace está tico. Para másinfor ma ción, con sulte “exter nal reser ved word | exter nal decla ra tions” y“GetP rocAddress func tion” en la ayuda de Del phi.

Cannot open file <>Po si ble cau sa de error

1. Puede estar inten tando abrir un archivo cuyo con te nido no está en el for-mato ade cuado. Por ejem plo, si intenta car gar un archivo que se espera quecon tenga un grá fico, y en rea li dad es un archivo de texto, obten drá estemen saje de error.

2. Puede estar inten tando abrir un archivo que no existe, uti li zando el métodoLoadF rom File (o al menos, el fichero no existe en la ubi ca ción que haespe ci fi cado).

So lu ción rá pi da1. Veri fi que que el archivo que está inten tando abrir es real mente del tipo de

archivo que espera.2. Ase gú rese de que el archivo esté ubi cado en el direc to rio que ha indi cado, y

de que ha escrito correc ta mente el direc to rio y el nom bre del archivo.

Mensajes de error 107

Page 142: Dsp

Infor ma ción adi cio nal1. Puede ser que la exten sión del archivo haya sido cam biada, de tal forma

que no se corres ponde con el tipo de archivo. Por ejem plo, se puede habermodi fi cado la exten sión del archivo Sha pesOfThing sTo Come.TXT de .TXTa .BMP. Inten tar car gar este archivo en la pro pie dad Pic ture de un com po-nente TImage oca sio nará este error. Un archivo de texto con cual quier otraexten sión sigue siendo un archivo de texto (y vice versa — un archivo BLObcon una exten sión de archivo de texto sigue siendo un archivo BLOb).

2. El método LoadF rom File puede ser apli cado a obje tos TPic ture y TStringsy sus des cen dien tes (como TString List).

Si está uti li zando un objeto TClient Da ta Set y archivos loca les (el modelo deuna capa o de male tín), deberá inser tar en él al menos un regis tro antes de quesea gra bado y pueda ser pos te rior mente car gado.

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

Po si ble cau sa de errorMien tras está inten tando com pi lar un pro yecto, puede tener un archivo de for-mu la rio abierto (.DFM) como texto.

So lu ción rá pi daCam bie la vista del archivo a la vista de for mu la rio y com pile de nuevo.

Infor ma ción adi cio nalPara cam biar la vista de un for mu la rio (archivo .DFM) que está mos trando surepre sen ta ción tex tual a su repre sen ta ción visual (Form View), siga estospasos:1. Pulse el botón dere cho den tro de la ven tana de código del archivo .DFM.2. Selec cione View As Form del menú de con texto.

Cannot optimize. Not an .exePo si ble cau sa de error

Puede estar escaso de espa cio de disco o memo ria RAM.

108 Los Tomos de Delphi: Delphi sin problemas

Page 143: Dsp

So lu ción rá pi daLibere espa cio del disco duro, cie rre algu nos pro gra mas que no esté uti li zando,y/o ins tale más memo ria RAM. Desac ti var las opti mi za cio nes puede ayudar.

Para desac ti var las opti mi za cio nes:

Delphi 1

Selec cione Options | Pro ject | Lin ker | EXE and DLL Options. Des mar-que la casi lla Opti mize for size and load time.

Delphi de 32 bits

Selec cione Pro ject | Options | Com pi ler | Code Gene ra tion, y des mar quela casi lla Opti mi za tion.

Infor ma ción adi cio nalPuede tam bién reci bir el men saje “Una ble to rename <path>.<pro ject>.$$$’to ‘<path>.<pro ject name>.dpr’”. Podrá nece si tar cam biar la exten sión delarchivo de pro yecto (.DPR) en el Explo ra dor de Win dows de .$$$ a .DPR.

Cannot override a static methodPo si ble cau sa de error

Puede haber aña dido la direc tiva Override a un método que no ha sido decla-rado como Virtual en la clase ances tro.

So lu ción rá pi daEli mine la direc tiva Override en la clase des cen diente, o añada una direc tivaVirtual o Dyna mic en la clase ances tro.

Infor ma ción adi cio nalEs posi ble rede fi nir (ove rride) los méto dos de los obje tos ances tros que han sidodecla ra dos uti li zando las direc ti vas Virtual, Dyna mic, o las direc ti vas Virtual oDyna mic y Abstract.

Por ejem plo, si la decla ra ción del objeto ances tro es la siguiente:

type A = class pro ce du re Work Hard; vir tual; pro ce du re Play Hard; dyna mic; pro ce du re Study Hard; vir tual; abs tract; pro ce du re Run Hard; dyna mic; abs tract; pro ce du re Leo tard;

Mensajes de error 109

Page 144: Dsp

end;

Se puede rede fi nir los méto dos Work Hard, Play Hard, Study Hard y Run Hard,pero no el método Leo tard, ya que es un método está tico (por defecto). Podrácrear un método con ese mismo nom bre en la clase des cen diente, pero ten dráque abs te nerse de aso ciarle la direc tiva Ove rride, y el nuevo método no here-dará la fun cio na li dad del método de igual nom bre en la clase ances tro.

De esta manera, lo siguiente es per mi tido en la clase des cen diente:

type AA = class(A) pro ce du re Work Hard; ove rri de; pro ce du re Play Hard; ove rri de; pro ce du re Study Hard; ove rri de; pro ce du re Run Hard; ove rri de; pro ce du re Leo tard; {Sin nin gu na re la ción con el mé to do de la cla se A} end;

Cannot perform operation - DB is not openPo si ble cau sa de error

Puede haber inten tado asig nar True a la pro pie dad Active de un com po nenteTIBTran sac tion (o haber lla mado a su método Start Tran sac tion) mien tras elcom po nente TIBDa ta base al cual está conec tada la tran sac ción no está activo.

So lu ción rá pi daAsigne True a la pro pie dad Active del com po nente TIBDa ta base, o llame a sumétodo Open antes de inten tar acti var el com po nente TIBTran sac tion o lla mara cual quiera de sus méto dos.

Infor ma ción adi cio nalTIBTran sac tion y TIBDa ta base son com po nen tes de Inter Base Express.

Cannot perform this operation on a closed connectionPo si ble cau sa de error

Puede haber inten tado acti var un con junto de datos de DBExpress antes deque su objeto TSQLCon nec tion aso ciado esté abierto.

110 Los Tomos de Delphi: Delphi sin problemas

Page 145: Dsp

So lu ción rá pi daLlame al método Open del objeto TSQLCon nec tion antes de abrir un con juntode datos que dependa de él.

Infor ma ción adi cio nalEsto podría haberle ocu rrido si tiene un con junto de datos abierto en tiempo dediseño en su for mu la rio prin ci pal, y el com po nente TSQLCon nec tion estásituado en otro for mu la rio, como por ejem plo un módulo de datos. El for mu la-rio prin ci pal se crea pri mero, y puesto que el objeto TSQLCon nec tion no hasido creado toda vía, no está abierto. En este caso, será nece sa rio pos po ner laaper tura del con junto de datos hasta el tiempo de eje cu ción.

Los com po nen tes DBExpress apa re cie ron con Del phi 6.

Cannot perform this operation on a closed databasePo si ble cau sa de error

Puede haber inten tado lla mar al método Start Tran sac tion de un com po nenteTDa ta Base sin pri mero asig nar True a la pro pie dad Con nec ted o lla mar a sumétodo Open. Por ejem plo, puede haber hecho algo así:

with Da ta ba se1 do be gin Start Tran sac tion; Ta ble1.FieldByNa me('Mis ter').Va lue := 'Ma goo';

So lu ción rá pi daAsigne True a la pro pie dad Con nec ted en tiempo de diseño o en el código, ollame al método Open del com po nente TDa ta base, antes de lla mar a Start-Tran sac tion. Por ejem plo, para solu cio nar el pro blema mos trado arriba, puedehacer esto:

with Da ta ba se1 do be gin Con nec ted := True; Start Tran sac tion; try try Ta ble1.FieldByNa me('Mis ter').Va lue := 'T'; . . . fi nally Com mit; end; ex cept Roll back end;

-O-

Mensajes de error 111

Page 146: Dsp

with Da ta ba se1 do be gin Open; Start Tran sac tion; try try Ta ble1.FieldByNa me('Mis ter').Va lue := 'Cof fee(Joe Di Mag gio)'; . . . fi nally Com mit; end; ex cept Roll back end;

Infor ma ción adi cio nalSi asignó True a la pro pie dad Con nec ted del com po nente TDa ta base (en tiempode diseño o en tiempo de eje cu ción, antes de hacer la refe ren cia a la base dedatos) y tam bién asignó True a su pro pie dad Keep Con nec tion, evi tará reci bireste men saje de error, ya que la cone xión a la base de datos siem pre estaráabierta.

Cannot perform this operation on a closed datasetPo si ble cau sa de error

1. Puede haber inten tado refres car, edi tar, vaciar, borrar o bus car en un com-po nente TDa taSet que no estaba abierto o activo.Por ejem plo, se pro du cirá este men saje de error si trata de hacer losiguiente:

Ta ble1.Clo se;Ta ble1.Re fresh;

-O-

Ta ble1.Acti ve := Fal se;Ta ble1.Edit;

2. Un con junto de datos auxi liar que es reque rido por otro con junto de datospuede estar inac tivo o cerrado. Por ejem plo, puede haber una tabla de bús-queda que deberá estar abierta para que sus valo res pue dan ser acce di dos.

3. Puede haber lla mado a Open o asig nado True a la pro pie dad Active de unTClient Da ta Set que es uti li zado en una apli ca ción multi-capa, y no ha asig-nado un com po nente TDa ta SetP ro vi der válido a la pro pie dad Pro vi der delTClient Da ta Set.

4. Puede haber lla mado a Open o asig nado True a la pro pie dad Active de unTClient Da ta Set que es uti li zado en una apli ca ción de una sola capa, y noha abierto toda vía el archivo que con tiene los datos.

112 Los Tomos de Delphi: Delphi sin problemas

Page 147: Dsp

So lu ción rá pi da1,2.Abra todos los con jun tos de datos nece sa rios antes de eje cu tar cual quiera

de las accio nes indi ca das arriba.3. Asigne un TDa ta SetP ro vi der al com po nente TClient Da ta Set.4. Asigne la pro pie dad File Name del objeto TClient Da ta Set, o llame al

método LoadF rom File antes de tra ba jar con los datos. En Del phi 6 y supe-rio res, puede gra bar los datos en dos posi bles for ma tos: el bina rio o“clá sico”, con exten sión .CDS, y el for mato XML (¡mara vi lla!), con exten sión.XML. Por ejem plo, podría guar dar y luego vol ver a abrir de esta manera:

with dm.cdsStu dents do be gin Mer geC han ge Log; Sa ve To Fi le('Stu dents.cds'); //, dfBi nary); Sa ve To Fi le('Stu dents.xml'); //, dfXML);end;

with dm.cdsStu dents do be gin if Fi leE xists('Stu dents.cds') then LoadF rom Fi le('Stu dents.cds') else LoadF rom Fi le('Stu dents.xml');

(donde dm es un módulo de datos, y cdsStu dents es un com po nenteTClient Da ta Set).

Infor ma ción adi cio nalTTa ble, TQuery, TSto redP roc y TClient Da ta Set son todos des cen dien tes de laclase TDa taSet, y por lo tanto son con jun tos de datos.2. Si está uti li zando un campo cal cu lado en una tabla, éste puede estar

haciendo refe ren cia en el evento OnCalc Fields a otra tabla que no ha sidocreada toda vía. Todas las tablas deben exis tir antes de que pue dan serrefe ren cia das. El orden de crea ción de los com po nen tes no visua les estádeter mi nado en pri mer lugar por el orden en que se colo can los com po nen-tes sobre el for mu la rio. Si el objeto TTa ble al que se hace refe ren cia fuecolo cado sobre el for mu la rio des pués del TTa ble que hace la refe ren cia,puede alte rar el orden de crea ción selec cio nando Edit | Crea tion Order,y uti li zando los boto nes de fle chas mover el TTa ble al que se hace refe ren-cia para que quede encima del TTa ble que hace refe ren cia a él.

3,4.En Del phi 6 y supe rio res, la tec no lo gía MIDAS y la clase TClient Da ta Setestán por todos lados. Ya que la capa de acceso a datos DBExpress no per-mite la nave ga ción hacia atrás en un con junto de resul tados, esreco men da ble uti li zar un TDa ta SetP ro vi der como inter me dia rio entreDBExpress y un TClient Da ta Set, espe cial mente si va a mos trar los datosen una reji lla. Si no es incluido como parte inte gral de Del phi 6, bus que elcom po nente TClient Da ta SetG rid, creado por John Kas ter y AndersOhlsson, en Code Cen tral de Bor land (com mu nity.bor land.com/code cen tral).Este ofrece una orde na ción de colum nas “estilo explo ra dor”, así como un

Mensajes de error 113

Page 148: Dsp

indi ca dor visual que indica que los datos están orde na dos por una columnay en qué direc ción.

Cannot perform this operation on an active sessionPo si ble cau sa de error

Puede estar inten tando asig nar True a la pro pie dad Auto Ses sion Name de uncom po nente TSes sion, o modi fi cando su pro pie dad Ses sion Name mien tras supro pie dad Active tiene el valor True.

So lu ción rá pi daAsigne pri mero False a la pro pie dad Active antes de inten tar cam biar la pro-pie dad Auto Ses sion Name del objeto TSes sion a True o modi fi car su pro pie dadSes sion Name.

Infor ma ción adi cio nalPara más infor ma ción sobre las sesio nes, con sulte los temas “mana ging data-base ses sions”, “mana ging mul ti ple ses sions”, “naming a ses sion”, “wor kingwith a ses sion com po nent”, “using the default ses sion” y “using a ses sion com-po nent in data modu les” en la ayuda de Del phi.

Cannot perform this operation on an empty datasetPo si ble cau sa de error

Puede haber inten tado lla mar al método Delete de un objeto TTa ble cuando latabla no con te nía regis tros.

So lu ción rá pi daAntes de lla mar al método Delete, veri fi que que la tabla no esté vacía. Porejem plo, podría hacer esto:

if Ta ble1.IsEmpty then Exitelse Ta ble1.De le te;

-O-

if not Ta ble2.IsEmpty then Ta ble2.De le te;

114 Los Tomos de Delphi: Delphi sin problemas

Page 149: Dsp

Infor ma ción adi cio nalEl método Delete de TDa taSet borra sola mente el regis tro actual.

Para borrar todos los regis tros de una tabla, uti lice el método EmptyTa ble.

Para borrar no sola mente todos los regis tros, sino tam bién la tabla en sí (lainfor ma ción de estruc tura), uti lice el método Dele te Ta ble. La tabla debe estarcerrada antes de la lla mada a Dele te Ta ble (llame al método Close de TTa ble oasigne False a su pro pie dad Active).

Para borrar los regis tros que cum plan un cierto cri te rio, uti lice un com po nenteTQuery y asigne a su pro pie dad SQL una cadena del tipo:

DELETE FROM Bo gus Da ta {para bo rrar to dos los re gis tros}DELETE FROM Air wa ves WHERE Con tentType = SoapO pe ra {para bo rrar to dos los re gis tros con el va lor ‘SoapO pe ra’ en el cam po Con tentType}

Cannot perform this operation on an open databasePo si ble cau sa de error

1. Puede haber inten tado asig nar el valor True a la pro pie dad Exclu sive deun objeto TTa ble mien tras su pro pie dad Active tenía el valor True.

2. Puede haber inten tado asig nar un valor a la pro pie dad Table Name de unTTa ble mien tras su pro pie dad Active tenía el valor True.

3. Puede haber inten tado asig nar un valor a una de las pro pie da des Alias oData ba se Name de un TDa ta base mien tras su pro pie dad Con nec ted tenía elvalor True.

4. Puede haber inten tado asig nar un valor a una de las pro pie dades Active oAuto Ses sion Name de un com po nente TSes sion mien tras la pro pie dadConnec ted de un com po nente TDa ta base aso ciado tenía el valor True.

So lu ción rá pi da1-4.Ase gú rese de que el com po nente TTa ble o TDa ta base no estén acti vos

antes de inten tar tales ope ra cio nes. Puede hacer esto haciendo lla ma das auno de los siguien tes méto dos:

Ta ble1.Clo se; {para un com po nen te TTa ble}Da ta ba se1.Clo se; {para un com po nen te TDa ta Ba se}

o mediante asig na cio nes a pro pie da des:

Ta ble1.Acti ve := Fal se; {para un com po nen te TTa ble}Da ta ba se1.Con nec ted := Fal se; {para un com po nen te TDa ta Ba se}

Mensajes de error 115

Page 150: Dsp

Infor ma ción adi cio nalSi el valor de la pro pie dad Exclu sive de un objeto TTa ble es True y se intentaasig nar a la pro pie dad Active el valor True, se gene rará el men saje de error“Table is busy”.

Cannot perform this operation on an open datasetPo si ble cau sa de error

1. Puede haber inten tado modi fi car una de las pro pie dades Exclu sive,ReadOnly, Data ba se Name, Table Name, TableType o Ses sion Name de unobjeto TTa ble mien tras la tabla estaba abierta.

2. Puede haber lla mado al método Unpre pare para un objeto TQuery mien-tras la con sulta estaba activa.

3. Puede haber modi fi cado la pro pie dad SQL de un objeto TQuery mien tras lacon sulta estaba activa.

So lu ción rá pi da1. Cie rre el TTa ble antes de modi fi car cual quiera de las pro pie dades men cio-

nadas arriba.2. Cie rre el TQuery antes de lla mar a Unpre pare.3. Asigne pri mero False a la pro pie dad Active del con junto de datos, o llame a

su método Close, y luego haga las modi fi ca cio nes al texto de la con sultaantes de abrirla (acti varla) de nuevo.

Infor ma ción adi cio nalPuede cerrar un TDa ta Set (del que des cien den tanto TTa ble como TQuery)asig nando False a la pro pie dad Active:

Ta ble1.Acti ve := Fal se;

-O-

Query1.Acti ve := Fal se;

o lla mando a su método Close:

Ta ble1.Clo se;

-O-

Query1.Clo se;

Es nece sa rio asig nar True a la pro pie dad Exclu sive de un objeto TTa ble antesde eje cu tar cier tas tareas, tales como aña dir índi ces con el método AddIndex.Por lo tanto, debe pri mero cerrar el TTa ble, aña dir los índi ces, y luego abrir latabla de nuevo.

116 Los Tomos de Delphi: Delphi sin problemas

Page 151: Dsp

Cannot perform this operation with table openPo si ble cau sa de error

Puede haber inten tado borrar una tabla en el Data base Desk top mien tras latabla estaba abierta.

So lu ción rá pi daCie rre la tabla antes de borrarla.

Infor ma ción adi cio nalPuede eje cu tar muchas ope ra cio nes sobre bases de datos loca les o de escri to rio,tales como Para dox, dBASE, MS Access, etc., uti li zando la uti li dad Data baseDesk top. Con sulte “Data base Desk top” en la ayuda de Del phi.

Cannot perform utility while table is in usePo si ble cau sa de error

Puede estar inten tando eje cu tar cierta acción, como por ejem plo edi tar o modi-fi car la estruc tura de una tabla en el Data base Desk top, mien tras la tabla estáabierta.

So lu ción rá pi daCie rre la tabla, asig nando False a la pro pie dad Active del TTa ble y a la pro pie-dad Con nec ted de los com po nen tes TDa ta base, y luego vuelva a inten tar laoperación.

Infor ma ción adi cio nalLa tabla puede estar abierta por una apli ca ción en eje cu ción o den tro delentorno inte grado de Del phi, si la pro pie dad Active del TTa ble o la pro pie dadCon nec ted de un com po nente TDa ta base tie nen asig nado el valor True.

Cannot read a write-only propertyPo si ble cau sa de error

Puede estar inten tando acce der al valor de una pro pie dad que es de sóloescri tura.

Mensajes de error 117

Page 152: Dsp

So lu ción rá pi daSola mente intente leer el valor de las pro pie da des que no son de sólo escritura.Del mismo modo, sola mente intente modi fi car las pro pie da des en las que sepuede escri bir, o sea, aque llas que no son de sólo lec tura. Por ejem plo, puedeleer el valor de la pro pie dad Can Mo dify así:

if Ta ble1.Can Mo dify = True then {Rea li zar el pro ce sa mien to con di cio nal}

Pero no puede asig narle un valor, por que es de sólo lectura.

Infor ma ción adi cio nalSi una pro pie dad es de sólo lec tura, es decla rada así:

pro perty Re qui red: Boo lean read FRe qui red;

y es decla rada nor mal mente en la sec ción Public o Publis hed de una clase.

Si una pro pie dad es tanto de lec tura como escri tura, se declara así:

pro perty Net Fi le Dir: string read Get Net Fi le Dir wri te Set Net Fi le Dir;

Es común para una pro pie dad acce der a un campo pri vado, desde el que se leeun valor interno, y a un método pri vado que escribe el valor. A con ti nua ción sepre senta un ejem plo extraído de la uni dad Dbta bles.PAS, donde se declara elcom po nente TTa ble, y se mues tra la pro pie dad Data ba se Name y su campo ypro ce di miento pri va dos asociados:

TTa ble = class(TDBDa ta Set) pri va te ... FDa ta ba se Na me: string; ... pro ce du re Set Da ta ba se Na me(const Va lue: string); ... pro tec ted ... pu blic ... pu blis hed pro perty Da ta ba se Na me: string read FDa ta ba se Na me wri te Set Da ta ba se Na me;end;

Esta es la defi ni ción del método Set Da ta ba se Name:

pro ce du re TDa ta ba se.Set Da ta ba se Na me(const Va lue: string);be gin if csRea ding in Com po nent Sta te then FDa ta ba se Na me := Va lue else if FDa ta ba se Na me <> Va lue then

118 Los Tomos de Delphi: Delphi sin problemas

Page 153: Dsp

be gin Check Inac ti ve; Va li da te Na me(Va lue); FDa ta ba se Na me := Va lue; end;end;

Como puede verse, cuando un usua rio accede a la pro pie dad Data ba se Name, elvalor es leído del campo pri vado interno FDa ta ba se Name. Cuando un usua rioasigna un valor a la pro pie dad Data ba se Name, al método Set Da ta ba se Name sele pasa el valor que el usua rio está inten tando asig nar a Data ba se Name.

Cannot Run a Unit or DLLPo si ble cau sa de error

1. Puede estar inten tando eje cu tar una apli ca ción desde el entorno inte gradode Del phi sin tener el pro yecto (.DPR) abierto. Por ejem plo, puede haberabierto una o más uni da des que son parte de un pro yecto, pero no abrió elpro yecto en sí.

2. Puede haber inten tado eje cu tar una .DLL.

So lu ción rá pi da1. Abra el archivo fuente del pro yecto (archivo .DPR) del cual es parte la uni-

dad antes de inten tar eje cu tar la apli ca ción.2. Aunque las .DLLs son eje cu ta bles, no pue den ser eje cu ta das direc ta mente.

Llame a la .DLL desde un .EXE para eje cu tarla.

Infor ma ción adi cio nalPuede eje cu tar una apli ca ción sin que todas las uni da des que la cons ti tu yenestén abier tas en el entorno inte grado (siem pre que el archivo .DPR estéabierto), pero no lo contrario. Dicho de otra manera, si abre un archivo de pro-yecto y lo eje cuta, éste car gará los archi vos de uni dad (.PAS) que com po nen elpro yecto. Lo opuesto no es cierto— una uni dad no carga el .DPR del cual esparte cons ti tu yente. Una misma uni dad puede per te ne cer a múl ti ples pro yec-tos, y por lo tanto podría no ser evi dente qué pro yecto car gar.

Si quiere com pi lar una uni dad (crear un archivo .DCU a par tir de un archivo.PAS), puede hacerlo uti li zando el com pi la dor de línea de comandos dcc32.EXE,loca li zado en el direc to rio \bin de Del phi.

Mensajes de error 119

Page 154: Dsp

Cannot update, <> is not owned by <>Po si ble cau sa de error

Puede haber lla mado a ApplyUpda tes y haber sumi nis trado el nom bre de uncom po nente TDa taSet que no hace refe ren cia al com po nente TDa ta base cuyométodo ApplyUpda tes usted ha lla mado. Por ejem plo, si llamó a ApplyUpda tesasí:

Da ta ba se1.ApplyUpda tes([Back gam mon, Pool]);

y Pool hacía refe ren cia a Data ba se2 en lugar de Data ba se1 en su pro pie dadData ba se Name, obten drá este men saje de error.

So lu ción rá pi daVeri fi que que todos los obje tos TDa ta Set pasa dos a ApplyUpda tes hagan refe-ren cia al mismo com po nente TDa ta base.

Infor ma ción adi cio nalLos des cen dien tes de TDa taSet inclu yen a TTa ble, TQuery, TSto redP roc yTClient Da ta Set.

Cannot use array of Field values with Expression IndicesPo si ble cau sa de error

Puede haber inten tado aña dir un índice a una tabla dBASE uti li zando cor che-tes en lugar de parén te sis, así:

Ta ble1.AddIndex([<Nom breIn di ce>],[<Nom bre Cam po>],[ixExpres sion]);

So lu ción rá pi daUti lice parén te sis en lugar de cor che tes:

Ta ble1.AddIndex(<Nom breIn di ce>, <Nom bre Cam po>, [ixExpres sion]);

Infor ma ción adi cio nalAsigne True a la pro pie dad Exclu sive del TTa ble antes de aña dir un índice.

120 Los Tomos de Delphi: Delphi sin problemas

Page 155: Dsp

Cannot use reserved unit name <>Po si ble cau sa de error

Puede haber uti li zado un nom bre de uni dad que el com pi la dor de Del phi tienereser vado. Por ejem plo, puede haber nom brado una uni dad como System oSysInit.

So lu ción rá pi daNo uti lice System o SysInit como nom bres de uni dad. En rea li dad, no uti lice elnom bre de nin guna uni dad que ya esté en uso por su apli ca ción.

Infor ma ción adi cio nalDel phi añade implí ci ta mente de forma auto má tica las uni da des System ySysInit a la cláu sula Uses de la inter faz de sus uni dades.

Cannot write EXE or DLL to diskPo si ble cau sa de error

Puede haber eje cu tado el módulo (.EXE o .DLL) y luego intentó com pi lar elpro yecto mien tras el módulo estaba toda vía resi dente en memo ria.

So lu ción rá pi daCie rre la ins tan cia del pro grama antes de inten tar recom pi larlo. Si es nece sa-rio, rei ni cie Win dows para “echar” al eje cu ta ble o la .DLL de la memo ria.

Infor ma ción adi cio nalEsto tam bién puede ocu rrir des pués de una caída del pro grama al ser eje cu-tado desde el entorno inte grado. Cie rre Del phi y rei ní cielo, y luego intente com-pi lar el pro yecto/pro grama de nuevo.

Cannot Write to Engine Configuration FilePo si ble cau sa de error

IDAPI.CFG (Win dows 3.x) o IDAPI32.CFG (Win dows/Del phi de 32 bits) puedeno estar situado donde debe ría.

Mensajes de error 121

Page 156: Dsp

So lu ción rá pi da

Delphi 1/Windows 3.x

Ase gú rese de que la loca li za ción real de IDAPI.CFG (C:\IDAPI por defecto)coin cide con el valor que apa rece en la entrada CONFIGFILE01 de la sec ción[IDAPI] de WIN.INI.

Si es nece sa rio, mueva el archivo al lugar indi cado en WIN.INI, o modi fi que laentrada en WIN.INI para que coin cida con la ubi ca ción del archivo.

Delphi de 32 bits /Windows 95

Ase gú rese de que la localización real de IDAPI32.CFG (C:\Archi vos de pro-grama\Bor land\Com mon files\BDE por defecto) coin cide con el valor indi cadoen el Regis tro del sis tema.

Si es nece sa rio, mueva el archivo al lugar indi cado por el Regis tro, o modi fi quela entrada del Regis tro para que refleje la loca li za ción real del archivo.

Infor ma ción adi cio nalEste es el error $8453 del BDE.

Capability Not SupportedPo si ble cau sa de error

1. Puede tener un error de sin ta xis en una sen ten cia SQL. Puede estar inten-tando rea li zar sobre una base de datos local o de escri to rio una acción quesólo puede lle varse a cabo sobre una base de datos cliente/servidor. Porejem plo, puede estar inten tando uti li zar una sen ten cia SELECT ani dadasobre tablas Para dox.

2. Puede estar uti li zando una sin ta xis SELECT de SQL que no per mite pro-du cir un con junto de resul ta dos actua li za ble (”vivo”) mien tras la pro pie dadRequest Live del com po nente TQuery tiene asig nado el valor True.

3. Puede haber inten tado modi fi car la pro pie dad Sto redP roc Name de un com-po nente TSto redP roc mien tras la pro pie dad Data ba se Name hacíarefe ren cia a una base de datos local o de escri to rio.

4. Puede haber omi tido el nom bre de la tabla en una sen ten cia SELECT (pro-por cio nando sola mente el nom bre de la columna). Por ejem plo, puede teneruna sen ten cia SELECT simi lar a:

SELECT Candy FROM Sees WHERE Cho co la te = ‘Dark Rasp berry’

5. Puede haber inten tando uti li zar las actua li za cio nes en caché sobre unatabla que con tiene cam pos BLOb.

122 Los Tomos de Delphi: Delphi sin problemas

Page 157: Dsp

So lu ción rá pi da1. Com pruebe que la sin ta xis de las sen ten cias SQL sean sopor ta das por la

base de datos que esté uti li zando. Para más deta lles, consulte la docu men-ta ción de la base de datos.

2. Si no nece sita un con junto de resul tados actua li za ble, cam bie el valor de lapro pie dad Request Live del com po nente TQuery a False.Si nece sita un con junto de resul ta dos actua li za ble, la con sulta no puedecon te ner lo siguiente: funciones agregadas (SUM, COUNT, AVG, MIN, MAX, etc.) Operaciones JOIN, UNION, INTER SECT o MINUS Una cláusula ORDER BY

3. No intente modi fi car la pro pie dad Sto redP roc Name mien tras la pro pie dadData ba se Name del com po nente TSto redP roc hace refe ren cia a una base dedatos local o de escri to rio.

4. Incluya el nom bre de la tabla en la sen ten cia SELECT, y encie rre los nom-bres de columnas entre comi llas. Por ejem plo:

SELECT Sees."Cho co la te"FROM SeesWHERE Sees."Cho co la te" = ‘Dark Rasp berry’

5. Abstén gase de uti li zar actua li za cio nes en caché en com bi na ción con cam posBLOb.

Infor ma ción adi cio nal1. Aun que SQL es la “lin gua franca” tanto para las bases de datos cliente/ser-

vi dor como para las de escri to rio, los dia lectos y voca bu la rios difieren entrelas dis tin tas imple men ta cio nes. Por ejem plo, Ora cle uti liza PL/SQL, MSSQL Ser ver uti liza Tran sact SQL, etc.

3. Si está uti li zando una base de datos local o de escri to rio (como Para dox,dBASE, MS Access, etc.), no puede uti li zar pro ce di mien tos alma ce na dos.Estos son úni ca mente una carac te rís tica de las bases de datos de ser vi-dores SQL (como Inter Base, Ora cle, MS SQL Ser ver, Sybase, Infor mix,etc.).Si todo lo demás falla, intente uti li zar una varia ble de cadena en la cláu-sula WHERE. Por ejem plo,

var Whe re Var: String; . . . Whe re Var:= 'Mor gan Tell Mac ken zie Shan non'; . . . Query1.SQL.Add('SELECT * from "RUNTHE"'); Query1.SQL.ADD('WHERE Wha te ver = ' + Whe re Var);

Mensajes de error 123

Page 158: Dsp

5. Si está uti li zando la ver sión Cliente/Ser vi dor (Enter prise) de Del phi 3 ósupe rior, con sulte en la ayuda de Del phi “TClient Da ta Set” para una alter-na tiva a las actua li za cio nes en caché.

Case label outside of range of case expressionPo si ble cau sa de error

Puede estar inten tando eva luar en una sen ten cia Case una eti queta que noestá en el rango de la varia ble de con trol de la sen ten cia Case. Por ejem plo, losiguiente gene rará este men saje de error, debido a que Dallas Cow boys no esparte de NFCCen tral Di vi sion:

type So me Foot ball Teams = (Green Bay Pac kers, Min ne so ta Vi kings, Chi ca go Bears, De troit Lions, Tam pa Bay Buc ca neers, Ten nes see Ti tans, StLouis Rams, Da llas Cow boys); NFCCen tral Di vi sion = Green Bay Pac kers..Tam pa Bay Buc ca neers;

var BlackAndBlue Di vi sion : NFCCen tral Di vi sion;

. . .be gin case BlackAndBlue Di vi sion of Min ne so ta Vi kings: Wri teln('A ro lling moss gat hers no sto ne’); Da llas Cow boys: Wri teln('Achy Breaky Aik man'); Tam pa Bay Bu can neers: Wri teln('A sta tue of the coach would be a dungy idol'); else ; // Lo que haga falta end;end.

So lu ción rá pi daUti lice una varia ble del tipo Some Foot ball Teams (en lugar de una del tipoNFCCen tral Di vi sion), o extienda la decla ra ción de NFCCen tral Di vi sion paraque incluya todos los valo res que quiera eva luar.

Infor ma ción adi cio nalLas sen ten cias Case son más rápi das que las sen ten cias If ani da das. Dondesea posi ble, uti lice sen ten cias Case. Por ejemplo:

case iNum berO fTic kets of0: Scalp TheS cal per;1: GoA lo ne;

124 Los Tomos de Delphi: Delphi sin problemas

Page 159: Dsp

2: Ta keAF riend;3: Threes Com pany;else ;end;

es pre fe ri ble a esto:

if iNum berO fTic kets = 0 then Scalp TheS cal perelse if iNum berO fTic kets = 1 then GoA lo neelse if iNum berO fTic kets = 2 then Ta keAF riendelse if iNum berO fTic kers = 3 then Threes Com pany;

Tam bién es una opti mi za ción eva luar las eti que tas en orden ascen dente. Porejem plo, dadas estas decla ra cio nes:

const Fav re = 1; Cul pep per = 2; Batch = 3; King = 4; McNown = 5;

var QBRa ting: Inte ger;

este código:

case QBRa ting ofFav re: s := ‘Lock him up (to a long-term contract)’;Cul pep per: s := ‘Gi ve him a raise’;Batch: s := ‘Ba ke him some cookies’;King: s := ‘Gi ve him a crown’;McNown: s := ‘He might get bet ter’;end;

es pre fe ri ble a este código:

case QBRa ting ofFav re: s := ‘Lock him up (to a long-term con tract)’;Cul pep per: s := ‘Gi ve him a rai se’;King: s := ‘Gi ve him a crown’;McNown: s := ‘He might get bet ter’;Batch: s := ‘Ba ke him some coo kies’;end;

Mensajes de error 125

Page 160: Dsp

Circular datalinks are not allowedPo si ble cau sa de error

Puede estar inten tando uti li zar un com po nente TTa ble como su pro pia tabla debús queda, con fi gu rando la pro pie dad Mas ter Source del com po nente TTa blepara que apunte a un com po nente TDa ta Source que hace refe ren cia al pro piocom po nente TTa ble.

So lu ción rá pi daAsigne a la pro pie dad Mas ter Source una fuen te de datos (de la lista des ple ga-ble que apa rece en la pro pie dad Mas ter Source) que esté aso ciada a otro com po-nente TTa ble.

Infor ma ción adi cio nalDel phi no mues tra en la lista des ple ga ble de posi bles valo res de la pro pie dadMas ter Source aque llos com po nentes TDa ta Source que hacen refe ren cia al pro-pio com po nente TTa ble. Se trata de una medida pre ven tiva para evi tar estemen saje de error. No obs tante, se puede teclear lo que se quiera, y si intro duceun TDa taSource aso ciado a la pro pia tabla en la pro pie dad Mas ter Source delTTa ble, gene rará este men saje de error.

Para más infor ma ción sobre la uti li za ción de tablas de bús queda y la pro pie dadMas ter Source, con sulte “TTa ble.Mas ter Source” en la ayuda de Del phi.

Circular Unit Reference [to <>]Po si ble cau sa de error

Puede haber colo cado refe ren cias mutuas en las cláu sulas Uses de la sec ciónInter face de dos uni da des.

So lu ción rá pi daMueva al menos una de las refe ren cias de la cláu sula Uses de la inter faz de launi dad a la cláu sula Uses de la sec ción Imple men ta tion (direc ta mente debajode la pala bra reser vada Imple men ta tion). Por ejem plo, si el men saje de errores oca sio nado por la refe ren cia mutua de Unit1 y Unit2 en cada una de las sec-cio nes Uses de sus interfaces, de tal forma que Unit1 actual mente apa rece así:

unit Unit1;in ter fa ceuses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Con trols, Forms, Dia logs, Unit2;type

126 Los Tomos de Delphi: Delphi sin problemas

Page 161: Dsp

TForm1 = class(TForm) pri va te { Pri va te de cla ra tions } pu blic { Pu blic de cla ra tions } end;var Form1: TForm1;

im ple men ta tion

Modi fí quela de forma que quede así:

unit Unit1;in ter fa ceuses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Con trols, Forms, Dia logs; {eli mi na da Unit2}type TForm1 = class(TForm) pri va te { Pri va te de cla ra tions } pu blic { Pu blic de cla ra tions } end;var Form1: TForm1;

im ple men ta tionuses Unit2; {aña di da la re fe ren cia a Unit2 aquí}

Infor ma ción adi cio nalPuede tam bién mover ambas refe ren cias a la parte Imple men ta tion de las uni-dades (debe mover al menos una; o puede mover ambas).

Las úni cas uni da des que nece si tan ser inclui das en la cláu sula Uses de la sec-ción Inter face son aque llas cla ses a las que se hace refe ren cia en la pro piainterfaz. Todas las demás pue den (y deben) ser colo ca das en la cláu sula Usesde la sec ción Imple men ta tion.

La cláu sula Uses de la sec ción Inter face es aña dida auto má ti ca mente por Del-phi. Ten drá que aña dir manual mente la cláu sula Uses de la parteImple men ta tion.

Mensajes de error 127

Page 162: Dsp

Class <> not found. [Ignore the error and continue?]Po si ble cau sa de error

1. Puede haber modi fi cado el archivo .DFM de un for mu la rio y cam biado eltipo de un objeto por otro (por ejem plo, un TBut ton a TBitBtn), y Del phi nopuede recon ci liar las dife ren cias.

2. Puede haber uti li zado en el pro yecto una uni dad o com po nente queposterior mente ha sacado del camino de bús queda de Del phi, desins ta ladoo borrado.

3. Puede estar car gando un pro yecto en una ver sión de Del phi ante rior a laver sión uti li zada la última vez que lo com piló.

4. Puede haber modi fi cado direc ta mente la decla ra ción de un campo de uncom po nente en un archivo .PAS (es decir, no a tra vés del Inspec tor deObje tos, cam biando el valor de la pro pie dad Name del com po nente), y luegohaber res pon dido Yes al men saje “Field <> does not have a corres pon-ding com po nent. Remove the decla ra tion?”

So lu ción rá pi da1. Con sulte el texto del archivo .DFM del for mu la rio pul sando con el botón

dere cho sobre el for mu la rio y selec cio nando View As Text en el menú decon texto. Veri fi que que las defi ni cio nes de objetos ahí coin ci dan con lo queestá actual mente sobre el for mu la rio.

2. Si toda vía quiere uti li zar la clase per dida, ten drá que rein tro du cirla enDel phi ahora o más adelante. Si quiere espe rar hasta más tarde (o si nonece sita la clase en abso luto), sim ple mente ignore el error. Para incor po rarde nuevo la clase a Del phi, siga el curso de acción apro piado en depen den-cia de lo que oca sionó el pro blema: Si ha movido el archivo que el proyecto necesita, devuélvalo al

directorio que aparece en el camino de búsqueda de Delphi o añada eldirectorio donde actualmente reside al camino de búsqueda de Delphi(seleccione Tools | Envi ron ment Options. . . , luego la páginaLibrary y el cuadro de combinación Library Path).

Si la clase es un componente que ha desinstalado, reinstálelo. 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 deterceros, un sitio web, etc.).

Si ha eliminado del camino de búsqueda de Delphi el directorio quecontiene la unidad que necesita, añada de nuevo el directorio o muevala unidad a una ubicación a la que se haga referencia en el camino debúsqueda de Delphi.

3. Puede igno rar el error, y las par tes del pro yecto que no son espe cí fi cas a laver sión pos te rior de Del phi se abri rán. Si el pro yecto ha sido creado porusted mismo, pro ba ble mente aún ten drá acceso a la ver sión más nueva de

128 Los Tomos de Delphi: Delphi sin problemas

Page 163: Dsp

Del phi. Si este es el caso, car gue el pro yecto en la ver sión más nueva paraman te ner el uso de la clase a la que se refiere el men saje de error.

4. Pulse el botón OK. En modo de diseño, eli mine el com po nente que no fueencon trado, y luego añá dalo de nuevo.

Infor ma ción adi cio nalSi elige igno rar el error y con ti nuar, Del phi eli mi nará la refe ren cia a la claseno encon trada del archivo .DFM. De todos modos, su decla ra ción aún exis tiráen el archivo .PAS. Cuando intente com pi lar el pro yecto, que ahora con tieneuna dis cre pan cia entre la des crip ción pro por cio nada por el archivo .PAS y lades crip ción pro por cio nada por su corres pon diente archivo .DFM, obten drá estemen saje de error “Field <> does not have a corres pon ding com po nent.Remove the decla ra tion?” Si selec ciona Yes, la decla ra ción tam bién será eli-mi nada del archivo .PAS.1. Nor mal mente, edi tar el objeto en el archivo .DFM tam bién oca sio nará que

éste cam bie sobre el for mu la rio. Esto es lo que quie ren decir cuando serefie ren a Del phi como una herra mienta bi-direc cio nal.Des pués de cam biar un com po nente de un tipo a otro en el archivo .DFM,cuando intente com pi lar el pro yecto puede obte ner el men saje “Field <>should be of type <> but is decla red as <>. Correct the decla ra-tion?”. Pulse Yes para per mi tir que Del phi recon ci lie la diferen cia.

3. Un ejem plo de este suceso sería si crea un pro yecto en Del phi 3 ó 4 que uti-lice un com po nente TChart, y luego intenta car gar el pro yecto en Del phi 2(o Del phi 1).

4. Para más infor ma ción, con sulte el men saje “Field <> does not have acorres pon ding com po nent. Remove the decla ra tion?”.

Class already has a default propertyPo si ble cau sa de error

Puede haber inten tado asig nar una pro pie dad por defecto a una clase que yatiene una pro pie dad por defecto defi nida.

So lu ción rá pi daEli mine una de las decla ra cio nes de pro pie dad por defecto. Una clase puedetener sola mente una pro pie dad por defecto.

Infor ma ción adi cio nalCuando se declara una pro pie dad de tipo array, se la puede defi nir como lapro pie dad por defecto de la clase, así:

Mensajes de error 129

Page 164: Dsp

type TCir cus = class . . . pro perty Clowns[Index: Inte ger]: String read Fbo zo wri te Set Bo zo; de fault; . . . end;var Cir cus: TCir cus;

La ven taja de hacer esto con siste en que luego se puede acce der o asig nar valo-res a la pro pie dad de tipo array en el código sin tener que espe ci fi car el nom brede la pro pie dad. Por ejem plo, con la pro pie dad decla rada arriba, se podría asig-nar un valor así:

Cir cus[i] := Bozo;

En otras pala bras, ya que es la pro pie dad por defecto, no es nece sa rio escri birel nom bre de la pro pie dad cuando se le asigna algo, así:

Cir cus.Clowns[i] := Bozo;

Sin embargo, si trata de hacer lo siguiente, obten dría este men saje de error:

type TCir cus = class . . . pro perty Clowns[Index: in te ger]: String read Fbo zo wri te Set Bo zo; de fault; pro perty Ani mals[Index: in te ger]: String read FAni mals wri te SetA ni mals; de fault; {No se pue de aña dir una se gun da pro pie dad por de fec to} . . . end;

Class does not have a default propertyPo si ble cau sa de error

Puede haber inten tado asig nar un valor a una varia ble de clase uti li zando unaexpre sión de array, cuando el tipo de la clase no tiene una pro pie dad pordefecto. Por ejem plo, puede haber escrito algo como esto:

TCo llec tion[i] := Bos ton Har bor;

-O-

Beat les Pa rap her na lia := TCo llec tion;

pero la clase TCo llec tion no tiene una pro pie dad por defecto (aun que sí tieneuna pro pie dad de tipo array lla mada Items).

130 Los Tomos de Delphi: Delphi sin problemas

Page 165: Dsp

So lu ción rá pi daEspe ci fi que explí ci ta mente todas las pro pie da des que no sean la pro pie dad pordefecto en cual quier sen ten cia que haga refe ren cia a ellas.

Infor ma ción adi cio nalLas pro pie da des por defecto son pro pie da des de tipo array cuyo nom bre puedeser omi tido en la sen ten cias de asig na ción. Para más infor ma ción, con sulte laentrada ante rior “Class already has a default pro perty”.

Class, interface and object types only allowed in type sectionPo si ble cau sa de error

Puede haber inten tado decla rar una varia ble de un tipo de clase fuera de lasec ción Type. Por ejem plo, puede haber inten tado algo así:

var ts: class(TFont);

So lu ción rá pi daDeclare los tipos de clase úni ca mente den tro de las sec cio nes de decla ra ción detipos, por ejem plo así:

type TForm1 = class(TForm)

Infor ma ción adi cio nalSi intenta decla rar un tipo de clase en una sec ción Var, así:

var TForm1 = class(TForm)

Obten drá el men saje de error “, or : expec ted but = found”.

Si inten tar decla rar un tipo de clase en una sec ción Const, así:

const TForm1 = class(TForm)

Obten drá el men saje de error “Expres sion expec ted but CLASS found”.

Si intenta decla rar un tipo de clase en un pro ce di miento o método local, así:

pro ce du re TryTo De cla reA Lo cal Form Class; type TForm1 = class(TForm)

Mensajes de error 131

Page 166: Dsp

Obten drá el men saje de error “Local class, inter face, or object types notallo wed”.

Class methods not allowed as property getters and settersPo si ble cau sa de error

Puede haber espe ci fi cado un método de clase como “get ter” (método de accesode lec tura) o “set ter” (método de acceso de escri tura o trans formación). Porejem plo, lo siguiente gene rará este men saje de error:

TypeNo = class pri va te Ffffft: String; class pro ce du re AskThe Cat(ARes pon se: String); pu blic pro perty fffft :String read Ffffft wri te AskThe Cat; end;

So lu ción rá pi daBorre la pala bra “class” para hacer que el método se con vierta en un métodocorriente, en lugar de un método de clase.

Infor ma ción adi cio nalLos pro ce di mien tos de clase se uti li zan a menudo para imple men tar “cons truc-to res” para for mu la rios moda les. Eli mi nando la varia ble que Del phi añadeauto má ti ca mente a la sec ción Inter face de la uni dad, usted puede for zar quecual quier cons truc ción del for mu la rio se rea lice a tra vés del pro ce di miento declase. Por ejem plo:

type TfrmTMSExpress Ma te rial = class(TForm) Sta tus Bar1: TSta tus Bar; pri va te { de cla ra cio nes privadas} pu blic class pro ce du re Cre8Thyself; end;

//Obser ve que no hay va ria bles de for mu la rio como://var// frmTMSExpress Ma te rial: TfrmTMSExpress Ma te rial;

im ple men ta tion{$R *.DFM}

class pro ce du re TfrmTMSExpress Ma te rial.Cre8Thyself;be gin

132 Los Tomos de Delphi: Delphi sin problemas

Page 167: Dsp

with Self.Crea te(nil) do try Show Mo dal; fi nally Free; end;end;

Class not registeredPo si ble cau sa de error

1. Puede que esté inten tando eje cu tar una apli ca ción que con tiene un con trolActi veX (.OCX) que no ha sido ins ta lado o regis trado en el sis tema.

2. Puede haber inten tado asig nar el valor True a la pro pie dad Con nec ted deun com po nente TOLEEnter pri se Con nec tion, TRe mo te Ser ver Con nec tion oTDCOMCon nec tion cuyo ser vi dor (que se indica mediante la pro pie dadSer ver Name o Ser verGUID) no ha sido regis trado en el sis tema.

So lu ción rá pi da1. Ase gú rese de que ha ins ta lado y regis trado todos los con tro les Acti veX

antes de hacer refe ren cia a ellos.2. Ase gú rese de que ha ins ta lado y regis trado todos los ser vi do res antes de

hacer una refe ren cia a ellos.

Infor ma ción adi cio nal1. Aun que los con tro les Acti veX (.OCX) son un tipo de .DLL, no es sufi ciente

que se encuen tren en el lugar ade cuado, como ocu rre en el caso de las.DLLs. Los con tro les Acti veX se iden ti fi can mediante su GUID (iden ti fi ca-dor glo bal único), no por su nom bre de archivo, y este GUID debe habersido regis trado pre via mente ante Win dows (en el Regis tro del sis tema)para que el con trol Acti veX pueda ser utilizado.

Para regis trar manual mente un con trol Acti veX (una .DLL con exten sión.OCX), cópielo pri mero al direc to rio \Win dows\System y luego siga estospasos:

a. Abra una ventana DOS.b. Vaya al directorio \Win dows\Sys tem.c. Introduzca el siguiente comando y pulse la tecla Intro:

Regsvr32 <biblioteca>.

Por ejem plo, si la biblio teca de tipos a regis trar es IDa taB ro ker, deberá teclearlo siguiente (ya que está defi nida en STDVCL32.DLL): Regsvr32 STDVCL32.

Mensajes de error 133

Page 168: Dsp

(En Del phi 4, el archivo corres pon diente es STDVCL40.DLL, y por ello elcomando nece sa rio sería Regsvr32 STDVCL40.)

En Del phi 3-6 es posi ble regis trar y borrar del Regis tro con tro les Acti veX a tra-vés de ele men tos del menú, espe cí fi ca mente Run | Regis ter Acti veX Ser very Run | Unre gis ter Acti veX Ser ver. Estos ítems están dis po ni bles cuandoun pro yecto de con trol de Acti veX o Biblio teca Acti veX está abierto en elentorno inte grado.

Con sulte “DAX Error: Class not regis te red”.

Class or object types only allowed in type sectionPo si ble cau sa de error

Puede haber inten tado decla rar un tipo de clase en una sec ción Var, así:

var TStu dent Com mand = (scAdd, scEdit, scActi va te, scInac ti va te, scRe mo ve); TMa te rial Com mand = (mcAdd, mcEdit, mcDe le te, mcImport); TSche du le Com mand = (scSche du le, scPrint);

So lu ción rá pi daDeclare los tipos en una sec ción Type, así:

type TStu dent Com mand = (scAdd, scEdit, scActi va te, scInac ti va te, scRe mo ve); TMa te rial Com mand = (mcAdd, mcEdit, mcDe le te, mcImport); TSche du le Com mand = (scSche du le, scPrint);

Infor ma ción adi cio nalLos tipos de datos defi ni dos por el usua rio son una de las bue nas carac te rís ti-cas de Object Pas cal. Al uti li zar los, podrá escri bir código como el siguiente:

pro ce du re TfrmTMSXpress Main.lstbxStu dentsDblClick (Sen der: TObject);var Stu dent Com mands: TStu dent Com mand;be gin Stu dent Com mands := TStu dent Com mand(lstbxStu dents.ItemI ndex); with dm do be gin case Stu dent Com mands of scAdd: AddStu dents; scEdit: EditS tu dentsInfo; scActi va te: Acti va teS tu dents; scInac ti va te: Inac ti va teS tu dents; scRe mo ve: Re mo veS tu dents;

134 Los Tomos de Delphi: Delphi sin problemas

Page 169: Dsp

else Mes sa geDlg(SErrorInStu dentsDblClick, mtInfor ma tion, [mbOK], 0); end; end;end;

Class type requiredPo si ble cau sa de error

1. Puede haber hecho una refe ren cia a un tipo que no es una clase como elargu mento de una sen ten cia Raise de un blo que de excep ción. Por ejem plo,puede haber hecho algo así:

var b : Byte; aRuc kus: String;be gin try b := StrToInt(Edit1.Text); ex cept on Cain do rai se aRuc kus('¡Vaca sa gra da!'); end;end;

2. Puede haber uti li zado dos tipos de inter fa ces en la decla ra ción de un tipode clase Acti ve Form, así:

type TActi ve FormX = class(IActi ve FormX, IActi ve FormX)

So lu ción rá pi da1. Cuando uti lice la cons truc ción Try. . . Except On. . . <Obje toEx cep ción> Do,

uti lice una clase de excep ción pre de fi nida. Esta puede ser una clase deexcep ción de Object Pas cal o una defi nida por el usua rio.

2. En la decla ra ción de una clase Acti ve Form, debe uti li zar un tipo de claseseguido de un tipo de inter faz, así:

TActi ve FormX = class(TActi ve Form, IActi ve FormX)

Infor ma ción adi cio nal1. Este es un ejem plo de uti li za ción de una excep ción pre de fi nida de Object

Pas cal (EDivB yZero):

func tion Di vi deT he Pie(Pie ces, Re ci pients: Inte ger): Inte ger;be gin try

Mensajes de error 135

Page 170: Dsp

Re sult := Pie ces div Re ci pients; ex cept on EDivB yZe ro do Re sult := 0; end;end;

Este es un ejem plo de decla ra ción y uti li za ción de un objeto de excep cióndefi nido por el usua rio (ESo Much Trou ble):

type ESo Much Trou ble = class(Excep tion); . . . if Pro blems > Brea king Point then rai se ESo Much Trou ble.Crea te('La gota que col mó el va so');

Para más infor ma cion sobre las excep cio nes, con sulte “excep tion decla ra-tions”, “pre de fi ned excep tions” y “excep tion” en la ayuda de Del phi.

2. Con sulte “Inter face type requi red”.

Clipboard does not support IconsPo si ble cau sa de error

Puede haber inten tado colo car un icono en el portapapeles. Por ejem plo, puedehaber tra tado de hacerlo cuando un con trol de ima gen se refe ría a un archivo.ICO:

Clip board.Assign(Ima ge1.Pic tu re);

So lu ción rá pi daNo intente colo car ico nos (archi vos con exten sión .ICO) en el portapapeles.

Infor ma ción adi cio nalPuede colo car mapas de bits (archi vos con exten sión .BMP) y metaar chi vos deWin dows (archi vos con exten sión .WMF) en el portapapeles.

En otras pala bras, el mismo código podría en un caso pro du cir este men saje deerror (si un icono está asig nado a la pro pie dad Pic ture) y en otro fun cio narcorrec ta mente (si un mapa de bits o metaar chivo está asig nado a la pro pie dadPic ture).

Close error on <Filename>Po si ble cau sa de error

Puede tener el disco lleno o dañado.

136 Los Tomos de Delphi: Delphi sin problemas

Page 171: Dsp

So lu ción rá pi daVeri fi que que tiene al menos 50 MB o el 10% del disco duro vacío. Si este no esel caso, podrá sufrir todo tipo de pro ble mas indig nan tes (archi vos daña dos, caí-das aquí y allá, etc.). Si tiene sufi ciente espa cio libre en el disco duro, veri fi queque éste no se ha dañado.

Infor ma ción adi cio nalSi no dis pone de herra mien tas de ter ce ros (como Nor ton Uti li ties), puede uti li-zar la herra mienta de defrag men ta ción pro vista con Win dows para veri fi car loserro res del disco duro. Para loca li zarla, vaya a Ini cio | Pro gra mas | Acce-so rios | Herra mien tas del Sis tema | Defrag men ta dor de Disco. Algu nasver sio nes de Win dows tam bién ofre cen la uti li dad Scan disk, que pro vee dosnive les de prueba (exa men de la super fi cie y com pleto).

Code Insight features are disabled while debuggingPo si ble cau sa de error

Está inten tando uti li zar carac te rís ti cas de Code Insight mien tras el pro gramaestá eje cu tán dose den tro del entorno inte grado de Del phi. Por ejem plo, puedehaber inten tado hacer uso de las carac te rís ti cas de com ple ta miento de código,pul sando Ctrl+espa cio mien tras depura el código línea a línea.

So lu ción rá pi daUti lice las carac te rís ti cas Code Insight sola mente en tiempo de diseño, sin queel pro grama esté eje cu tán dose.

Infor ma ción adi cio nalCode Insight no está dis po ni ble en Del phi 1 y 2. Para más infor ma ción, con-sulte “Code Insight” en la ayuda de Del phi.

Code Segment Too LargePo si ble cau sa de error

Puede haber colo cado dema siado código en una misma uni dad del pro yecto.

So lu ción rá pi daMueva algo de código a otra uni dad, y añada direc ta mente des pués de la pala-bra reser vada Imple men ta tion una sec ción Uses que haga refe ren cia a la

Mensajes de error 137

Page 172: Dsp

segunda uni dad. Por ejem plo, si el nom bre de la segunda uni dad es SecondCU,deberá hacer refe ren cia a ella desde la uni dad ori gi nal así:

im ple men ta tion uses Se condCU; {$R *.DFM}

Infor ma ción adi cio nalEste es generalmente un pro blema de Del phi 1, ya que el seg mento de códigoen Win dows 3.x está limi tado a 64 KB.

COINITIALIZE has not been calledPo si ble cau sa de error

Puede estar uti li zando múl ti ples hilos en una apli ca ción COM, pero no ha lla-mado a CoI ni tia lize para cada hilo.

So lu ción rá pi daLlame siem pre a CoI ni tia lize en todo hilo de una apli ca ción COM.

Infor ma ción adi cio nalTam bién deberá lla mar a CoU ni ni tia lize cuando la eje cu ción de cada hilofina lice.

Column not a BLObCon sulte “Unknown SQL Error”.

Comma ExpectedPo si ble cau sa de error

Puede no estar sumi nis trando los pará me tros sufi cien tes a un pro ce di miento ofun ción.

So lu ción rá pi daSi el pro ce di miento o fun ción donde se pro duce este men saje de error es unmétodo de Object Pas cal, bús quelo en la ayuda de Del phi para deter mi nar lacan ti dad y tipos de los pará me tros que el método espera. Si la decla ra ción delpro ce di miento o fun ción está con te nida en las uni da des del pro yecto (es un

138 Los Tomos de Delphi: Delphi sin problemas

Page 173: Dsp

pro ce di miento o fun ción propio), revise su decla ra ción para deter mi nar esainfor ma ción.

Infor ma ción adi cio nalEn rea li dad, Del phi pro ba ble mente no sólo está espe rando una coma, sino tam-bién como mínimo el pará me tro que sigue a la coma. Como la coma es lo pri-mero que no aparece, se indica como el pro blema.

Compilation terminated; too many errorsPo si ble cau sa de error

Hay muchos erro res en el pro yecto actual.

So lu ción rá pi daPara redu cir el número de erro res “vivos”, colo que entre comen ta rios un granblo que de código y solu cione los erro res uno a uno, hasta que pueda qui tar loscomen ta rios (y enton ces corre gir los erro res con te ni dos allí).

Infor ma ción adi cio nalPuede estar tra tando de hacer muchas cosas a la vez, o haber espe rado muchotiempo antes de com pi lar. Cuando desa rro lle pro gra mas, veri fi que perió di ca-mente la vali dez del código selec cio nando Pro ject | Syntax Check, yresuelva los erro res que vaya encon trando, en lugar de espe rar hasta el finalpara depu rar.

Component already installedPo si ble cau sa de error

El com po nente que está inten tando ins ta lar ya es parte de su VCL.

So lu ción rá pi daSelec cione Revert en el cua dro de diá logo Install.

Infor ma ción adi cio nalSi obtiene este men saje de error, y pos te rior mente se queda sin VCL (la biblio-teca podría no car garse debido a que ha quedado dañada), deberá reins ta larladesde del CD de Del phi.

Mensajes de error 139

Page 174: Dsp

Delphi 1

Reins tale COMPLIB.DCL en C:\Bor land\Del phi\BIN.

Delphi 2

Reins tale CMPLIB32.DCL en C:\Archi vos de pro grama\Bor land\Del phi2\BIN.

Delphi 3 y 4

Reins tale VCL30.DPL (Del phi 3) ó VCL40.DPL (Del phi 4) en \Win-dows\System y VCL30.DCP (Del phi 3) o VCL40.DCP (Del phi 4) en \Archi vosde pro grama\Bor land\Del phi X\Lib.

Puede que sea nece sa rio ins ta lar Del phi. En ese caso, desins tale pri mero elDel phi que tenga en el sis tema.

Delphi 5 y 6

Reins tale VCL50.DCP (Del phi 5) o VCL60.DCP (Del phi 6) en \Archi vos de pro-grama\Bor land\Del phi [5,6]\Lib.

Connection error—no server availablePo si ble cau sa de error

Puede estar inten tando uti li zar Del phi Con nec tion de Report Smith sin pro por-cio nar un com po nente TRe port y un com po nente TTable o TQuery (con el valorTrue asig nado a su pro pie dad Active).

So lu ción rá pi daPro por cione un com po nente TRe port y un com po nente TTa ble o TQuery,asignando el valor True a la pro pie dad Active de la tabla o con sulta.

Infor ma ción adi cio nalDebe tener el Report Smith ins ta lado y un com po nente TRe port de Del phi paraincor po rar infor mes Report Smith en las apli ca cio nes de Del phi. Report Smithse sumi nis traba con Del phi 1 y Del phi 2. El CD de Del phi 3 con tiene Del phi 1,así que puede ins ta lar Report Smith desde ahí si lo desea (no con fun dir con elcom po nente TRe port — Report Smith es una herra mienta de gene ra ción deinfor mes, mien tras que TRe port es la encap su la ción en Del phi de la inter faz deesa herra mienta). Aun que el com po nente TRe port no viene ins ta lado pordefecto con Del phi 3, está dis po ni ble. Siga estos pasos para ins ta larlo en laPaleta de Compo nen tes:1. Selec cione Com po nent | Con fi gure Palette. . . .2. Selec cione Data Access de la lista Pages.

140 Los Tomos de Delphi: Delphi sin problemas

Page 175: Dsp

3. Des plá cese a la parte infe rior y loca lice el com po nente TRe port.4. Selec cione el com po nente TRe port.5. Pulse el botón Add. El com po nente TRe port será aña dido a la página Data

Access de la Paleta de Compo nen tes.

Connection in use by another statementPo si ble cau sa de error

1. Puede estar inten tando abrir o eje cu tar una con sulta mien tras el con juntoresul tado de una con sulta ante rior está toda vía pen diente. En otras pala-bras, todo el con junto resul tado no ha sido devuelto toda vía.

2. Puede estar inten tando eje cu tar un pro ce di miento alma ce nado des pués deque ante rior mente haya fallado otro pro ce di miento alma ce nado.

3. Puede haber lla mado al método Unpre pare de un objeto TQuery antes deque todo el con junto resul tado haya sido devuelto.

So lu ción rá pi da1. Ase gú rese de que ha fina li zado el pro ce sa miento de la con sulta ante rior

antes de eje cu tar una nueva con sulta. Para ello, llame al método Last deTQuery. Luego puede lla mar al método First para moverse al ini cio delcon junto resul tado si lo desea. Por ejem plo:

with Query1 dobe gin Open; Last; First;end;

Alter na ti va mente, puede lla mar al método FetchAll:

with Query1 dobe gin Open; FetchAll;end;

2. Llame al método Unpre pare de TSto redP roc justo des pués de la eje cu cióndel pri mer pro ce di miento alma ce nado y antes de la eje cu ción del segundo,así:

with Sto redP roc1 do be gin Pre pa re; try ExecP roc; fi nally Clo se; Unpre pa re;

Mensajes de error 141

Page 176: Dsp

end;end;

with Sto redP roc1 do be gin Sto redP roc Na me := 'Sa fe way Mo saic'; Pre pa re; try ExecP roc; fi nally Clo se; Unpre pa re; end;end;

3. Añada una lla mada a Last antes de lla mar a Unpre pare:

with Query1 dobe gin Last; Clo se; Unpre pa re;end;

Infor ma ción adi cio nal3. Lla mando a TQuery.Unpre pare se libe ran los recur sos que el com po nente

TQuery ha reser vado. Del phi llama implí ci ta men a Pre pare y Unpre paresi no son lla ma dos explí ci ta mente. Llame a Pre pare cada vez que cam bie laparte Select de una sen ten cia SQL. Si la parte Select nunca cam bia, llamea Pre pare una vez antes de que la con sulta se eje cute por pri mera vez.Cada lla mada a Pre pare debe tener una corres pon diente lla mada aUnpre pare.

Connection name missingPo si ble cau sa de error

Puede haber tra tado de asig nar valor a una de las pro pie dades Com mand Texto Sort Field Na mes de un com po nente SQLDa ta Set (DBExpress) sin espe ci fi carpri mero el corres pon diente com po nente TCon nec tion.

So lu ción rá pi daEspe ci fi que el com po nente TCon nec tion que uti li zará, arras trán dolo hasta elmódulo de datos (método pre fe rido) o for mu la rio (otra posi bi li dad) y luego asig-nán dolo mediante el edi tor de pro pie da des a la pro pie dad Con nec tion delSQLDa ta Set.

142 Los Tomos de Delphi: Delphi sin problemas

Page 177: Dsp

Infor ma ción adi cio nalTCon nec tion en DBExpress es aná logo a TDa ta base en las apli ca cio nes basa-das en el BDE, TIBDa ta base en las apli ca cio nes Inter Base Express, yADOCon nec tion en las apli ca cio nes ADO Express.

DBExpress apa re ció con Del phi 6.

Constant expression expectedPo si ble cau sa de error

Puede haber inten tado asig nar la direc ción de una varia ble local (de pila) odiná mica (en el heap) a una cons tante de tipo pun tero. Por ejem plo, losiguiente gene rará este men saje de error:

pro ce du re TForm1.But ton1 Click(Sen der: TObject);var i: in te ger; const ptr: Poin ter = @i;

So lu ción rá pi daPara asig nar la direc ción de una varia ble a una cons tante de tipo pun tero, lavaria ble debe ser glo bal:

{ sec ción Inter fa ce }var Form1: TForm1; s: string = 'It''s Howdy Doody Time!';. . .pro ce du re TForm1.But ton1 Click(Sen der: TObject);var const ptr: Poin ter = @s;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “poin ters” en la ayuda de Del phi.

Constant expression violates subrange boundsPo si ble cau sa de error

1. Puede estar inten tando hacer una asig na ción a un ele mento de un arrayque no existe. Por ejem plo, lo siguiente pro du cirá este men saje de error, yaque se está inten tando acce der a un ele mento que está fuera de los límitesdecla ra dos para el array:

Mensajes de error 143

Page 178: Dsp

type Rays = array[0..6] of string;end;...pro ce du re Ra dia tion;var Fa mous Rays: Rays;be gin Fa mous Rays[0] := 'Ray Bol ger'; Fa mous Rays[1] := 'Ray Dea ton'; Fa mous Rays[2] := 'Ray Ko nop ka'; Fa mous Rays[3] := 'Ray Krok'; Fa mous Rays[4] := 'Ray Lis chner'; Fa mous Rays[5] := 'Ray Pier ce'; Fa mous Rays[6] := 'Ray Ro gers'; Fa mous Rays[7] := 'Ray [O-Hope, O-Light, O-Vac] West'; {Esta lí nea provoca el error, pues no hay ele men to 7}end;

2. Puede haber asig nado a una varia ble un valor muy pequeño o muy grandepara su tipo de datos. Por ejem plo, puede estar asig nando un número nega-tivo a una varia ble de tipo Byte, que sola mente acepta ente ros de 0 a 255.

So lu ción rá pi da1. Ase gú rese de no inten tar asig nar valor a un ele mento de un array que está

fuera de los lími tes decla ra dos para el array.2. Ase gú rese de que los valo res que asigne sean com pa ti bles con el tipo de

datos de las varia bles a las que rea liza las asig na cio nes.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “sub range types” en la ayuda de Del phi.

Constant object cannot be passed as var parameterPo si ble cau sa de error

1. Puede haber inten tado pasar un pará me tro cons tante a un pro ce di miento ofun ción que espera un pará me tro varia ble. Por ejem plo, lo siguiente gene-rará este men saje de error:

pro ce du re Gi ve MeA Poin ter(var ma llea ble: string);var oww hooo We re wol vesO fLon don: Inte ger;be gin oww hooo We re wol vesO fLon don := Form1.Instan ce Si ze; ma llea ble := ma llea ble + ' ' + IntToStr(oww hooo We re wol vesO fLon don);end;

144 Los Tomos de Delphi: Delphi sin problemas

Page 179: Dsp

pro ce du re BigS ho vel(const Immu ta ble: string);be gin Gi ve MeA Poin ter(Immu ta ble);end;pro ce du re Ro yal Moun tain King Mi neO ran ge Mons ter;be gin BigS ho vel('Hi ta chi');end;

debido a que el pará me tro Immu ta ble es un pará me tro cons tante, pero elpará me tro Mallea ble es un pará me tro varia ble.

2. Puede haber inten tado pasar una pro pie dad de una clase a un pro ce di-miento o fun ción que espera una varia ble. Por ejem plo, puede haberinten tado hacer algo como lo siguiente:

type TTi me = class pri va te FWound: string; pu blic . . . pu blis hed pro perty Wound: string read FWound wri te Set Wound; end;. . .pro ce du re TForm1.HealAll(Sen der: TObject);var Sage: TTi me;be gin Sage := TTi me.Crea te; Wound := 'Bury My Heart at Woun ded Knee'; Dele te(Sage.Wound, 1, Length(Sage.Wound));

So lu ción rá pi da1. Si quiere modi fi car el valor del pará me tro, eli mine la pala bra reser vada

Const de la decla ra ción del pará me tro en el pro ce di miento en el que sehace la lla mada. Si no quiere que se modi fi que el valor, eli mine la pala brareser vada Var de la decla ra ción del pará me tro en el pro ce di mientolla mado.

2. Asigne el valor de la pro pie dad a una varia ble y pase la varia ble al pro ce di-miento o fun ción. Por ejem plo, para resol ver el pro blema creado en elcódigo de arriba, podría hacer esto:

pro ce du re TForm1.HealAll(Sen der: TObject);var s: String; Sage: TTi me;be gin Sage := TTi me.Crea te; Wound := 'Bury My Heart at Woun ded Knee';

Mensajes de error 145

Page 180: Dsp

s := Sage.Wound; de le te(s, 1, Length(s)); Sage.Wound := s;

Infor ma ción adi cio nal1. Sea con sis tente en la forma de decla rar los pará me tros. Estos pue den ser

decla ra dos como cons tan tes (Const), varia bles (Var), o por valor (pordefecto), pero una vez son decla rados de un tipo no pue den ser cam bia dos aotro. Para más infor ma ción sobre los tipos de pará me tros, vea “pas singpara me ters” en la ayuda de Del phi.

2. Bus que el pro ce di miento o fun ción en la ayuda de Del phi para ave ri guarlos tipos y el orden de los argu men tos que espera. Si es un pro ce di miento ofun ción de algún ter cero, con sulte la docu men ta ción o el código fuente. Sies un pro ce di miento o método pro pio, con sulte su código fuente. Desdeluego, alter na ti va mente podría deci dir alte rar la decla ra ción del pro ce di-miento o fun ción.

Constant or type identifier expectedPo si ble cau sa de error

Puede haber decla rado una varia ble local de un tipo des co no cido para el com pi-la dor. En otras pala bras, el com pi la dor conoce el sím bolo que se ha uti li zadocomo tipo, pero no es aplicable en este con texto (no es un tipo válido). Porejem plo, lo siguiente gene rará este men saje de error:

var f: Text;

So lu ción rá pi daAse gú rese de que los tipos que uti lice para las varia bles sean tipos pre de fi ni-dos de Object Pas cal o tipos defi ni dos por el usua rio a los que el módulo actualtenga acceso, debido a que han sido decla ra dos en la uni dad actual o en unauni dad men cio nada en la sec ción Uses.

Infor ma ción adi cio nalLo siguiente pro duce el men saje de error “Unde cla red Iden ti fier: Tex”:

f: Tex;

Como se ha indi cado arriba, lo siguiente pro du cirá el men saje de error “Cons-tant or Type Iden ti fier Expec ted”:

f: Text;

Puede tam bién uti li zar el tipo Text ante po nién dole System así:

f: System.Text;

146 Los Tomos de Delphi: Delphi sin problemas

Page 181: Dsp

Por último, tam bién puede uti li zar:

f: Text fi le;

Constant out of rangePo si ble cau sa de error

1. Puede haber asig nado a una varia ble de un tipo sub rango un valor másgrande o más pequeño que sus límites. Para ser más espe cí fico, puedehaber decla rado una varia ble de tipo sub rango y luego haber inten tado unaasig na ción, así:

var Octo ber Ros ter: 1..25;be gin Octo ber Ros ter := 0;

2. Puede haber asig nado a un tipo de Object Pas cal un valor más grande omás pequeño de lo que puede alma ce nar. Por ejem plo, el tipo de datos Bytepuede alma ce nar valo res entre 0 y 255. Obten drá este men saje de error sitrata de alma ce nar algo menor que 0 o mayor que 255 en una varia bleByte, así:

const Under, Over: Byte;be gin Under: -1; Over := 256;

So lu ción rá pi da1,2.Ase gú rese de res pe tar los lími tes de los tipos de Object Pas cal y los tipos

sub rango defi ni dos por el usua rio en todas las asig na cio nes que haga.

Infor ma ción adi cio nalEn lugar de tra tar de resol ver el pro blema des pués de que se pro duzca (porreac ción), puede tra tarlo proac ti va mente pre pa rando las con di cio nes para evi-tar que ocu rra. He aquí una forma de cómo puede hacerlo:

const Under, Over: Byte;be gin if StrToInt(Edit1.Text) in [0..255] then Under := StrToInt(Edit1.Text);

Alter na ti va mente, en lugar de veri fi car explí ci ta mente el pro blema, puedecodi fi car de manera defen siva y reac cio nar (lo con tra rio de proac tivo) mane-jando el error cuando se produzca, así:

Mensajes de error 147

Page 182: Dsp

const Under, Over: Byte;be gin try Under := StrToInt(Edit1.Text); ex cept on Excep tion do {atra par y ma ne jar el error}; end;end;

Constants cannot be used as open array argumentsPo si ble cau sa de error

Puede tener un error de sin ta xis en una lla mada a un método, como podría serel método Insert Re cord de TDa ta Set. Por ejem plo, lo siguiente gene rará estemen saje de error:

Ta ble1.Insert Re cord('Jenny Lind', 'Ca la ve ras', 'Ca li for nia', 50, 1200);

So lu ción rá pi daColo que el array de valo res entre corchetes:

Ta ble1.Insert Re cord(['Jenny Lind', 'Ca la ve ras', 'Ca li for nia', 50, 1200]);

Infor ma ción adi cio nalAde más del ejem plo mos trado ante rior mente, el pro ce di miento per so na li zadoSendAryOfInts pro duce este men saje de error:

pro ce du re busy work(aoi: array of in te ger);var li: lon gint; i: in te ger;be gin for i := low(aoi) to high(aoi) do ext := ext + aoi[i];end;pro ce du re TForm1.SendAryOfInts(Sen der: TObject);be gin Busy work(12, 24, 36, 48); {aquí se pro du ce el error}end;

De nuevo, sim ple mente añada cor che tes a la lla mada del pro ce di miento:

Busy work([12,24,36,48]);

148 Los Tomos de Delphi: Delphi sin problemas

Page 183: Dsp

Constructing Instance of <> containing abstract methodsPo si ble cau sa de error

1. Puede estar inten tando crear una ins tan cia de una clase que con tieneméto dos abs trac tos. Un ejem plo de cuándo podría ocu rrir esto es si creauna varia ble TStrings así:

var Cof feeS trings: TStrings; . . . Cof feeS trings := TStrings.Crea te;

2. Puede estar inten tando crear un objeto que hereda uno o más méto dos vir-tua les abs trac tos que no están rede fi ni dos (ove rride) en las cla sesdes cen dien tes.

So lu ción rá pi da1. Es mejor evi tar crear ins tan cias de cla ses abs trac tas, ya que es muy fácil

lla mar acci den tal mente a algún método abs tracto (los cua les, por defi ni-ción, no tie nen imple men ta ción).

2. Si no va a rede fi nir el método en las cla ses des cen dien tes, haga el métodosola mente vir tual (y no vir tual y abs tracto) en el ances tro. Si desea que elmétodo sea vir tual y abs tracto, ase gú rese de imple men tarlo en todas lascla ses des cen dien tes.

Infor ma ción adi cio nal1. Puede desear decla rar una varia ble de tipo TStrings, pero ins tan ciarla

como un des cen diente con creto de TStrings (TString List, por ejem plo), así:

var Cof feeS trings: TStrings; . . . Cof feeS trings := TString List.Crea te;

2. Los méto dos vir tua les no tie nen que ser rede fi ni dos en los des cen dien tes.Si los rede clara y uti liza la direc tiva Ove rride, puede acce der a la fun cio na-li dad en el ances tro lla mando a:

in he ri ted <mé to do>;

en el cuerpo de la defi ni ción del método en la clase des cen diente. Puedeluego exten der (aña dir fun cio na li dad) el método con código espe cí fico parala clase des cen diente.Si rede clara el nom bre del método sin la direc tiva Override, estará sus ti tu-yendo u ocul tando el método del ances tro (con sulte “Met hod <> hidesvir tual met hod of base class <>”).Si declara un método como vir tual, debe tam bién defi nirlo en la misma uni-dad, aun que puede defi nir un cuerpo de método vacío, así:

Mensajes de error 149

Page 184: Dsp

pu blic pro ce du re Ove rri de Me; vir tual; . . .im ple men ta tion . . . pro ce du re TForm1.Ove rri de Me; be gin end;

Si declara un método vir tual y abs tracto, las cla ses des cen dien tes debenrede fi nirlo e implementarlo (en caso con tra rio, obten drán este men saje deadvertencia).No defina un método decla rado como vir tual y abs tracto en la uni dad en laque es intro du cido (esto deberá hacerse en las cla ses des cen dien tes).

Constructors and Destructors must have register calling conventionPo si ble cau sa de error

Puede haber aña dido una pala bra reser vada de con ve nio de lla mada dife rentede Regis ter en la decla ra ción de un cons truc tor o des truc tor. Por ejem plo, cual-quiera de los siguien tes ejem plos pro du cirá este men saje de error:

cons truc tor Crea te(AOwner: TCom po nent); ove rri de; pas cal;des truc tor Des troy; ove rri de; stdcall;cons truc tor Crea te(AOwner: TCom po nent); ove rri de; sa fe call;des truc tor Des troy; ove rri de; cdecl;

So lu ción rá pi daEli mine la direc tiva Pascal, Stdcall, Safe call o Cdecl.

Infor ma ción adi cio nalRegis ter es el con ve nio de lla mada por defecto para los méto dos, y es el únicoper mi tido para los cons truc to res y des truc to res. No es nece sa rio aña dir explí ci-ta mente la pala bra reser vada Regis ter.

Para más infor ma ción sobre este tema, con sulte “calling con ven tions”, “cons-truc tors and des truc tors” y “met hod calling con ven tions” en la ayuda deDel phi.

150 Los Tomos de Delphi: Delphi sin problemas

Page 185: Dsp

Constructors and Destructors not allowed in OLE automationsection

Po si ble cau sa de errorPuede haber decla rado un cons truc tor o des truc tor en la sec ción Auto ma ted dela decla ra ción de una clase.

So lu ción rá pi daSaque el cons truc tor y/o des truc tor fuera de la sec ción Auto ma ted.

Infor ma ción adi cio nalLos cons truc to res y des truc to res se decla ran nor mal mente en la sec ción Public.

La sec ción Auto ma ted fue intro du cida en Del phi 2, dando a Del phi cinco espe-ci fi ca do res de visi bi li dad: Pri vate, Pro tec ted, Public, Publis hed y Auto ma ted.La sec ción Auto ma ted se con serva en Del phi 3 y supe rio res para com pa ti bi li-dad hacia atrás con Del phi 2.

Para más infor ma ción, con sulte “auto ma ted com po nents” en la ayuda deDel phi.

CONTAINS clause is incorrectPo si ble cau sa de error

La cláu sula Con tains en el Pac kage Edi tor puede tener un error de sin ta xis. Losiguiente no es per mi tido y podría oca sio nar este men saje de error:1. Aña dir uni da des invá li das a la cláu sula Con tains.2. Incluir exten sio nes de nom bres de archi vos (por ejem plo, .PAS) en la cláu-

sula Con tains.3. Omi tir el punto y coma detrás del último archivo lis tado en la cláu sula

Con tains.

So lu ción rá pi da1. Ase gú rese de que todas las uni da des que añada sean váli das. Para ser váli-

das, deben exis tir, estar correc ta mente escri tas, y estar en la ruta debús queda de Del phi. Para veri fi car la ruta de bús queda de Del phi, selec-cione Tools | Envi ron ment Options. . . | Library | Library Path.

2. Borre cual quier exten sión de nom bre de archivo que pueda haber aña didoa los nom bres de las uni da des.

3. Ase gú rese de que la cláu sula Con tains fina liza con un punto y coma.

Mensajes de error 151

Page 186: Dsp

Infor ma ción adi cio nalLa página Con tains del Edi tor de Paque tes (Pac kage Edi tor) mues tra las uni-da des que apa re cen en la cláu sula Con tains en el archivo fuente del paquete(.DPK). Un ejem plo de archivo .DPK se mues tra a continuación:

pac ka ge 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 & Mea su res Com po nent Sui te'}{$DESIGNONLY}{$IMPLICITBUILD ON}re qui res vcl30;con tains AreaM, Cu bicM, DryM, Li nearM, Li quidM, W8snMsrs, W8s;end.

152 Los Tomos de Delphi: Delphi sin problemas

Page 187: Dsp

Control <> has no parent windowPo si ble cau sa de error

1. Puede estar inten tando mos trar o rea li zar alguna otra acción sobre uncom po nente que no tiene asig nado un padre (parent). Por ejem plo, losiguiente pro du cirá este men saje de error, ya que nin gún con trol padre hasido asig nado a la varia ble TBitBtn:

pro ce du re TForm1.Orphan BitBtn(Sen der: TObject);var Oli ver: TBitBtn;be gin Oli ver := TBitBtn.Crea te(Self); Oli ver.Set Fo cus; {No se pue de asig nar el foco a un con trol sin pa dre}end;

2. Puede estar inten tando acce der a un con trol cuya ven tana padre no tieneaún asig nado un men ja dor (handle). Por ejem plo, el for mu la rio sobre el quereside el con trol puede no haber sido creado toda vía.

So lu ción rá pi da1. Asigne un padre al con trol antes de inten tar mos trarlo o eje cu tar cual quier

otra acción sobre él. Por ejem plo, asig nar el for mu la rio (el cual es refe ridocomo Self, puesto que la asig na ción tiene lugar en un método del for mu la-rio) como el padre (parent) evita el error:

pro ce du re TForm1.Child BitBtn(Sen der: TObject);var Ju nior: TBitBtn;be gin Ju nior:= TBitBtn.Crea te(Self); Ju nior.Pa rent := Self; {asig nar Form1 como padre} Ju nior.Set Fo cus; {esto fun cio na es tu pen da men te}end;

2. Ase gú rese de que un con trol tiene su mane ja dor de ven tana asig nado antesde hacer una refe ren cia a él. Puede que sea nece sa rio rede fi nir el métodoCrea teWnd para eje cu tar ope ra cio nes sobre un con trol que requiere unmane ja dor de ven tana válido (que puede no haber sido com ple ta mentecreado en el cons truc tor del objeto). Puede mover la sen ten cia que causa elerror a este método redefinido Crea teWnd de esta forma:

pro ce du re TWha te ver.Crea teWnd;be gin in he ri ted; {Aquí se aña de el có di go que no es ade cua do para el con struc tor del ob je to}end;

Mensajes de error 153

Page 188: Dsp

Infor ma ción adi cio nal1. No con funda el parent (padre) y el owner (pro pie ta rio) de un con trol. Es

posi ble (pero no impres cin di ble) que un con trol tenga al mismo con trolcomo pro pie ta rio y como padre.Un pro pie ta rio (owner) se encarga de la crea ción y des truc ción de los com-po nen tes de los que es propietario, y por lo tanto tiene que rea li zar laasig na ción y libe ra ción de memo ria.Un padre (parent), por otra parte, es un con trol de ven tana que visual-mente con tiene otros con troles. El padre, por lo tanto, tiene que ver con lasuper fi cie sobre la cual el con trol hijo es mos trado.Un con trol puede tener un mismo pro pie ta rio y padre. Por ejem plo, unTBitBtn podría tener un TPa nel como padre, y tanto el TBitBtn como elTPa nel ten drían un TForm como pro pie ta rio.Como ya se ha men cio nado, el padre de un con trol puede tam bién ser supro pie ta rio. Esto no es impres cin di ble, sin embargo. El for mu la rio podríaser el pro pie ta rio del TBitBtn, pero un TPa nel podría ser su padre. He aquíun ejem plo de esto:

pro ce du re TForm1.Pa rent Not Sa meAsOwner(Sen der: TObject);var Ju nior: TBitBtn;be gin Ju nior:= TBitBtn.Crea te(Self); Ju nior.Pa rent := Pa nel1; {se asig na a Pa nel1 como pa dre} Ju nior.Set Fo cus; {esto fun cio na per fec ta men te}end;

2. Para más infor ma ción, con sulte “crea tion order” en la ayuda de Del phi.

Controls cannot be added to a data modulePo si ble cau sa de error

Puede estar inten tado aña dir un com po nente visual (un con trol) a un módulode datos.

So lu ción rá pi daSola mente añada com po nen tes no visua les a los módu los de datos.

Infor ma ción adi cio nalAun que los módu los de datos tie nen como obje tivo cen tral con te ner com po nen-tes de acceso a datos, no tie nen úni ca mente que con te ner éstos. Es posi blesituar cual quier com po nente no visual sobre ellos; por ejem plo, com po nen tesTTi mer y com po nen tes de diá logos (como TOpen Dia log, TSa ve Dia log, etc.).

154 Los Tomos de Delphi: Delphi sin problemas

Page 189: Dsp

Corrupt table/index headerPo si ble cau sa de error

1. Puede estar inten tando asig nar una valor a la pro pie dad Index Name oIndex Field Na mes de un com po nente TTa ble que tiene un índice dañado.

2. Puede estar inten tando ins tan ciar los cam pos de una tabla en tiempo dediseño (uti li zando el edi tor de cam pos - Fields Edi tor), pero la tabla tieneun índice dañado.

3. Puede estar inten tando asig nar True a la pro pie dad Active de un TTa ble,pero la tabla tiene un índice dañado.

4. Puede estar inten tando abrir en el Data base Desk top una tabla que tieneun índice dañado.

So lu ción rá pi da1-4.Eli mine y luego vuelva a crear el archivo de índice.

Infor ma ción adi cio nalSi recibe este men saje de error en el Data base Desk top, puede estar pre ce didopor “Una ble to open table”.

Si la tabla del pro blema es un tabla Para dox, el archivo de índice que estádañado pro ba ble mente tiene una exten sión .PX. A con ti nua ción se mues trauna lista de los archi vos auxi lia res que pue den ser crea dos (indi rec ta mente)con Para dox y para qué se uti li zan:

<NombreTabla>.PX

Este archivo con tiene la infor ma ción de clave pri ma ria de la tabla, y es pro ba-ble mente el que se ha dañado. Si designa un campo o grupo de cam pos como laclave pri ma ria de la tabla, este archivo es creado.

<NombreTabla>.Xnn

Los archi vos con la exten sión .Xnn (donde nn es un número hexa de ci mal) con-tie nen infor ma ción de índi ces secun da rios.

<NombreTabla>.Ynn

Los archi vos con la exten sión .Ynn (donde nn es un número hexa de ci mal) con-tie nen infor ma ción de índi ces secun da rios.

<NombreTabla>.VAL

Los archi vos con la exten sión .VAL con tie nen infor ma ción que se ha pro por cio-nado a tra vés del Data base Desk top con res pecto a los che queos de vali da ción,como por ejem plo si una columna debe tener obli ga to ria mente un valor (no se

Mensajes de error 155

Page 190: Dsp

per mite que sea nula), los valo res máxi mos y míni mos per mi ti dos para unacolumna, los valo res por defecto para una columna y los patro nes devali da ción.

Selec cione Vali dity Checks en el cua dro de com bi na ción de pro pie da des de latabla en el Data base Desk top para acce der a estas carac te rís ti cas.

<NombreTabla>.MB

Los archi vos con la exten sión .MB con tie nen los datos de las colum nas de tiposMemo y Grap hic (TMe mo Field y TGrap hic Field).

Could not create output file <>Po si ble cau sa de error

1. Puede haber espe ci fi cado un direc to rio que no existe para alma ce nar archi-vos de salida.

2. Puede haber espe ci fi cado un direc to rio que está pro te gido con tra escri turapara alma ce nar archi vos de salida.

3. Puede estar tra tando de eje cu tar un archivo que está toda vía en eje cu ción oque ya está eje cu tán dose en otra ins tan cia de Del phi.

4. Si la exten sión del archivo de salida men cio nado en el men saje de error es.OCX, puede estar inten tando modi fi car un Acti ve Form que ya está ins ta-lado en Del phi.

So lu ción rá pi da1. Ase gú rese de que existe el direc to rio en el que el archivo de salida supues-

ta mente será creado.2. Quite el atri buto de sólo lec tura del direc to rio. Para hacerlo uti li zando el

Explo ra dor de Win dows, pulse con el botón dere cho del ratón sobre el direc-to rio, selec cione Pro pie da des del menú de con texto, y des mar que lacasi lla de veri fi ca ción Sólo Lectura.

3. Si ha expe ri men tado un Error de Pro tec ción Gene ral y no ha rei ni ciado,hágalo.

4. Eli mine el con trol Acti ve Form de la Paleta de Compo nen tes de Del phi, yluego pro ceda.

Infor ma ción adi cio nal4. Cuando un .OCX está siendo uti li zado por Del phi, no puede ser sobres crito.

Por defecto, Del phi alma ce nará los archi vos de salida en el mismo direc to-rio del archivo de pro yecto (.DPR). Ejem plos de archi vos de salida son los

156 Los Tomos de Delphi: Delphi sin problemas

Page 191: Dsp

eje cu ta bles (.EXE), las uni da des com pi la das (.DCU), y los archi vos demapas de carga (.MAP).

Si desea alma ce nar los archi vos de salida en algún lugar dis tinto del direc to riodel pro yecto para un pro yecto en par ti cu lar, siga estos pasos:1. Cree, si es nece sa rio, el direc to rio que alma ce nará los archi vos de salida.2. Ase gú rese de que el direc to rio no está pro te gido con tra escri tura.3. Selec cione Pro ject | Options.4. Selec cione la página Direc to ries/Con di tio nals.5. Intro duzca la ruta com pleta del direc to rio en el cua dro de com bi na ción

Out put Direc tory, por ejem plo, I:\Sepa rate\Out put.6. Pulse el botón OK para cerrar el cua dro de diá logo Pro ject Options.

Could not find IDataBroker in type libraryPo si ble cau sa de error

Puede haber borrado un archivo nece sa rio, más con cre ta menteSTDVCL[32,40].DLL, que debe ría estar en el direc to rio \Win dows\System.

So lu ción rá pi daCopie STDVCL[32,40].DLL desde el CD de Del phi a \Win dows\System yregís trelo uti li zando TRegSvr (de Bor land) o RegSvr32 (de Micro soft).

Para regis trar la .DLL (des pués de copiarla al direc to rio \Win dows\System),siga estos pasos:1. Abra una ven tana DOS.2. Vaya al direc to rio \Win dows\System.3. Intro duzca Regsvr32 <biblio teca> y luego pulse la tecla Intro.

Por ejem plo, si la biblio teca de tipos del pro blema es IDa taB ro ker, podría intro-du cir lo siguiente (ya que está defi nido en STDVCL32.DLL): Regsvr32STDVCL32. En Del phi 4, el archivo corres pon diente es STDVCL40.DLL; por lotanto, deberá teclear Regsvr32 STDVCL40.

Infor ma ción adi cio nalSTDVCL[32,40].DLL tiene una biblio teca de tipos corres pon diente,STDVCL.TLB,que está ubi cada por defecto en C:\Archi vos de pro grama\Bor-land\Del phi X\BIN. Stdvcl32 es espe cí fica de Del phi 3 y Stdvcl40 para Del phi4.

TRegSvr.EXE está ubi cado en \Del phi\bin en Del phi 4 y supe rio res. RegSvr32está ubi cado en \Win dows\System.

Mensajes de error 157

Page 192: Dsp

Para ins truc cio nes espe cí fi cas sobre cómo uti li zar TRegSvr, con sulte “Can notLoad IDAPI Ser vice Library”, solu ción número 3.

Could not find interface <> in type libraryPo si ble cau sa de error

La biblio teca de tipos a la que se hace refe ren cia por su nom bre en este men-saje de error no ha sido regis trada.

So lu ción rá pi daRegis tre la biblio teca de tipos a la que se hace refe ren cia en el men saje deerror siguiendo estos pasos:1. Abra un ven tana DOS.2. Vaya al direc to rio C:\Win dows\System.3. Intro duzca Regsvr32 <biblioteca> y pulse la tecla Intro.

Por ejem plo, si la biblio teca de tipos del pro blema es IDa taB ro ker, se debeintro du cir lo siguiente (ya que está defi nida en STDVCL32.DLL): Regsvr32STDVCL32. En Del phi 4, el archivo corres pon diente es STDVCL40.DLL; por lotanto, deberá teclear: Regsvr32 STDVCL40.)

Infor ma ción adi cio nalLa ubi ca ción por defecto de STDVCL[32,40].DLL es: C:\Archi vos de pro-grama\Bor land\Del phi X\BIN.

STDVCL[32,40].DLL con tiene las decla ra cio nes de inter faz para la VCL están-dar de Bor land.

Could not find interface IDataBroker in type libraryPo si ble cau sa de error

Puede que la biblio teca de tipos que define IDa taB ro ker no haya sido correc ta-mente regis trada durante la ins ta la ción de Del phi.

So lu ción rá pi daRegis tre STDVCL[32,40].DLL uti li zando REGSVR32.EXE ó TREGSVR.

Infor ma ción adi cio nalIDa taB ro ker está defi nido en la biblio teca VCL están dar de Bor land, ubi cadapor defecto en C:\Archi vos de pro grama\Bor land\Del phi X\bin.

158 Los Tomos de Delphi: Delphi sin problemas

Page 193: Dsp

Could not find language driver ($220B)Po si ble cau sa de error

Puede haber selec cio nado un con tro la dor de len guaje uti li zando la uti li dadBDE Con fi gu ra tion (o edi tando direc ta mente WIN.INI o el Regis tro de Win-dows) cuyo archivo corres pon diente está ausente o no está en el lugar espe-rado, o está ausente la línea que hace refe ren cia a él en WIN.INI.

So lu ción rá pi da

Delphi 1

Ase gú rese de que la ruta indi cada en WIN.INI corres ponde a la ubi ca ciónactual de los con tro la do res de len guaje que están en el sis tema. Una entradatípica es:

[Bor land Lan gua ge Dri vers]LDPATH=C:\IDAPI\LANGDRV

Delphi de 32 bits

Ase gú rese de que el Regis tro con tiene la con fi gu ra ción corres pon diente. Eje-cute RegE dit y nave gue hasta la clave HKEY_LOCAL_MACHINE | Soft ware| Bor land | Data base Engine | Set tings | Dri vers.

Infor ma ción adi cio nalEste es el código de error $220B.

Could not find object. Cannot load an IDAPI service library. File:ODBC32.DLL

Po si ble cau sa de errorPuede estar inten tando car gar los pará me tros por defecto en el edi tor del com-po nente TDa ta base, con un alias no reco no cido intro du cido en el cua dro decom bi na ción Alias Name.

So lu ción rá pi daSelec cione un alias en el cua dro de com bi na ción Alias Name. Si es nece sa rio,cree un nuevo alias del BDE antes de con fi gu rar los pará me tros por defecto.

Infor ma ción adi cio nalPara crear un alias del BDE, siga estos pasos:1. Selec cione Data base | Explore.

Mensajes de error 159

Page 194: Dsp

2. En SQL Explo rer/Data base Explo rer, selec cione Ob ject | New. . . .3. Selec cione el tipo de con tro la dor ade cuado en el cua dro de com bi na ción

(selec cione Stan dard si está tra ba jando con tablas Para dox o dBASE) ypulse el botón OK.El nuevo alias se mos trará en la página Data base del panel izquierdo conel nom bre por defecto Stan dard1.

4. Pulse con el botón dere cho sobre el nuevo alias, selec cione Rename delmenú de con texto, e intro duzca el nom bre que quiera darle al alias.

5. En la página Defi ni tion del panel dere cho, selec cione el con tro la dor apro-piado en el cua dro de com bi na ción Default Dri ver.

6. Intro duzca la ruta de la base de datos en el cua dro de edi ción Path.7. Selec cione Object | Exit, y luego Yes para gra bar los cam bios rea li za dos.

Could not initialize IDAPIPo si ble cau sa de error

1. Las .DLLs del BDE pue den haber sido movi das o borra das.2. El archivo WIN.INI o el Regis tro del sis tema pueden haber sido

modi fi cados.

So lu ción rá pi da1,2.Com pruebe que las .DLLs del BDE exis ten y están en la loca li za ción espe-

ci fi cada por el archivo WIN.INI (Del phi 1) o el Regis tro de Win dows(Del phi 32 bits). Si no están en la ubi ca ción espe ci fi cada pero están encual quier otro lugar del sis tema, mué va las al lugar espe rado o editeWIN.INI o el Regis tro y con fi gure su ubi ca ción actual. Si no están en el sis-tema, cópie las desde el CD Del phi.

Infor ma ción adi cio nalCada PC que uti lice el BDE nece sita las .DLLs del BDE y un archivo de con fi-gu ra ción. En Del phi 1, el archivo de con fi gu ra ción IDAPI se lla mabaIDAPI.CFG. En Del phi de 32 bits, es IDAPI32.CFG. En Del phi 1, la ubi ca ciónde IDAPI.CFG se encuen tra en la sec ción [IDAPI] del archivo WIN.INI. Pordefecto, la con fi gu ra ción es:

DLLPATH=C:\IDAPICONFIGFILE01=C:\IDAPI\IDAPI.CFG

En Del phi de 32 bits, la ubi ca ción de las .DLLs y el archivo de con fi gu ra ción esman te nido en el Regis tro del sis tema. La con fi gu ra ción del Regis tro puede serencon trada eje cu tando Rege dit y nave gando hastaHKEY_LOCAL_MACHINE\Soft ware\Bor land\Data base Engine.

160 Los Tomos de Delphi: Delphi sin problemas

Page 195: Dsp

Las entra das por defecto son C:\Archi vos de pro grama\Bor land\Com monfiles\BDE\IDAPI32.CFG como camino de las DLL, y C:\Archi vos de pro-grama\Bor land\Com mon files\BDE\IDAPI32.CFG para CONFIGFILE01 (elarchivo de con fi gu ra ción).

Could not load <>. The OLE control may possibly require supportlibraries that are not on the current search path or are not presenton your system

Con sulte “The OLE con trol may pos sibly require sup port libra ries thatare not on the current search path or are not pre sent on your system”.

Could not load RLINK32.DLLPo si ble cau sa de error

El archivo RLINK32.DLL puede no estar ubi cado en la ruta de bús queda deDel phi.

So lu ción rá pi daLoca lice RLINK32.DLL. Su ubicación por defecto es C:\Archi vos de pro-grama\Bor land\Del phi X\BIN.

Si no está en el lugar por defecto, pero está en algún otro lugar del sis tema,ase gú rese de que esté en la ruta de bús queda de Del phi. Selec cione Tools |Envi ron ment Options, luego la página Library y el cua dro de com bi na ciónLibrary Path para veri fi car o modi fi car la ruta de bús queda de Del phi.

Si no está en el sis tema, cópielo desde el CD de Del phi.

Infor ma ción adi cio nalSiem pre que sea posi ble, es mejor man te ner los archi vos en los luga res pordefecto. No cam bie de lugar arbi tra ria mente los archi vos. No borre archi vos sino conoce su pro pó sito — el archivo puede ser vital para la ope ra ción del sis-tema, para Del phi, y/o para su pro pio bie nes tar.

Con sulte “Error 0: RLINK32 Error ope ning file <>.tlb”.

Could not load StdOle version 1.0 type libraryPo si ble cau sa de error

STDOLE.TLB o STDOLE2.TLB pueden haber sido movidos o borrados.

Mensajes de error 161

Page 196: Dsp

So lu ción rá pi daLoca lice el archivo y mué valo al direc to rio \Win dows\System.

Si el archivo no está en su sis tema, cópielo a \Win dows\Syste desde el CD deDel phi hasta \Win dows\System.

Infor ma ción adi cio nalDel phi 1 uti liza STDOLE.TLB. Del phi de 32 bits uti liza STDOLE2.TLB.

Could not load Type LibraryPo si ble cau sa de error

Puede haber borrado un archivo de biblio teca de tipos (Type Library).

So lu ción rá pi daSi borra un archivo de biblio teca de tipos, pero no ha vaciado la Pape lera deReci claje de Win dows, siga estos pasos:1. Pulse con el botón dere cho sobre la Pape lera de Reci claje.2. Selec cione Abrir desde el menú de con texto.3. Pulse con el botón dere cho sobre el archivo que quiera res tau rar (un

archivo de biblio teca de tipos en este caso).4. Selec cione Res tau rar desde el menú de con texto.

Si el archivo no se encuen tra en el sis tema (ni está en la Pape lera de Reci-claje), trate de reins ta larlo desde la fuente ori gi nal (El CD de Del phi, si es dedonde lo obtuvo).

Infor ma ción adi cio nalEl archivo más impor tante de biblio teca de tipos que viene con Del phi 3 esSTDVCL32.TLB, el cual es una inter faz para los con tro les VCL están dar. Elcorres pon diente archivo en Del phi 4 es STDVCL40.DLL. No ha habido actua li-za cio nes para Del phi 5 o 6; es decir, no hay un STDVCL50.DLL oSTDVCL60.DLL.

Could not load unit <> symbol information for <> Do you want totry to find this file yourself?

Po si ble cau sa de errorPuede obte ner este men saje de error mien tras tra baja con el Asis tente para lacrea ción de con tro les Acti veX (Acti veX Con trol Wizard), des pués de selec cio nar

162 Los Tomos de Delphi: Delphi sin problemas

Page 197: Dsp

un com po nente VCL del cual here dar. Puede ser que el archivo esté en el lugarcorrecto (a pesar del men saje de error), pero hay un error en el archivo.

So lu ción rá pi daSi hay un error en el com po nente del que intenta deri var, solu cione el errorantes de inten tar deri var un con trol Acti veX de este com po nente.

Infor ma ción adi cio nalSi el archivo no puede ser car gado debido a un error, puede que le haya hechocam bios des pués de haberlo ins ta lado en la VCL. La ven tana de men sa jes delcom pi la dor mos trará cual quier error que encuen tre. Pulse el botón dere cho delratón sobre el men saje de error y selec cione Edit Source. Esto lo lle vará direc-ta mente a la línea de código que oca siona el error en el archivo. Solu cione elerror, grabe y cie rre el archivo .PAS, y luego intente de nuevo crear el con trolActi veX.

Couldn’t perform the edit because another user changed the recordPo si ble cau sa de error

Ade más de lo obvio (otro usua rio acce dió al regis tro y lo modificó), puede serque tenga con fi gu rados dis pa ra do res (trig gers) que estén gene rando auto má ti-ca mente los valo res de cier tos cam pos.

So lu ción rá pi daCom pruebe los dis pa ra do res para ver qué es lo que están cam biando y cuándo.

Infor ma ción adi cio nalSi es real mente posi ble que otro usua rio cam bie el regis tro que está edi tando,puede que desee uti li zar cual quier meca nismo de blo queo que soporte su basede datos. Para más infor ma ción bus car “locks”, “Upda te Mode”, y “Trans Iso la-tion” en la ayuda de Del phi.

Data Base Error: Database access resulted in errorPo si ble cau sa de error

Puede haber inten tado acce der al cons truc tor de con sul tas SQL (Query Buil-der) de Del phi pul sando el botón dere cho del ratón sobre un com po nenteTQuery y selec cio nando Query Buil der. . . del menú de con texto, pero des puésde pro por cio nar el nom bre del alias no pro por cionó una con tra seña válida ypulsó el botón OK.

Mensajes de error 163

Page 198: Dsp

So lu ción rá pi daPro por cione una con tra seña válida en el cua dro de edi ción Pass word e intén-telo de nuevo.

Infor ma ción adi cio nalEl Query Buil der sola mente está dis po ni ble en la ver sión Cliente/Ser vi dor(Enter prise) de Del phi.

Data Segment Too LargePo si ble cau sa de error

1. Puede haber decla rado dema sia das varia bles glo ba les (es decir, varia blesglo ba les a la uni dad). Estas se alma ce nan en el seg mento de datos.

2. Puede estar uti li zando estruc tu ras de datos que con su men gran can ti daddel espa cio en el seg mento de datos, por ejem plo, cade nas en Del phi 1 (lascade nas con su men 256 bytes en Del phi 1, a menos que se decla ren explí ci-ta mente más peque ñas), arrays gran des, o regis tros que con tie nennume ro sos cam pos o cam pos gran des (como cade nas). Por ejem plo, puedeestar decla rando un regis tro como:

TRe cor ding = re cord Num ber: Inte ger; Hits: Inte ger; Tit le: String; Artist: String;end;var Plat ter, Album, Disc, CD, Mu sic, Tu nes, Toons: TRe cor ding;

3. Puede haber decla rado demasiadas cons tan tes con tipo.

So lu ción rá pi da1. Mueva algu nas o todas las varia bles a la sec ción Pri vate de un objeto en su

uni dad.2. Si el pro blema se debe a uti li zar muchas cade nas en Del phi 1 (en Del phi de

32 bits, sim ple mente uti lice cade nas lar gas, que son en el fondo pun te rosde 4 bytes), puede dis mi nuir la can ti dad de espa cio que éstas con su mendecla rando explí ci ta mente su tamaño, como:

TRe cor ding = re cord Num ber: Inte ger; Hits: Inte ger; Tit le: String[24]; Artist: String[16];end;

164 Los Tomos de Delphi: Delphi sin problemas

Page 199: Dsp

-O-Puede uti li zar recur sos de cade nas de carac te res para las cons tan tes que elpro grama uti li zará. Esto es par ti cu lar mente fácil a par tir de Del phi 3, queintro dujo la pala bra reser vada Resour ces tring. Las cons tan tes de cadenason alma ce na das auto má ti ca mente en un archivo de recur sos y car ga dasdiná mi ca mente cuando se hace refe ren cia a ellas. Podría uti li zar algo así:

re sour ces tring Knock Knock = '%s who?'; Excu se = 'The rea son %s doesn''t %s is %s'; Weat her Dia log = '%s enough for ya?'; Elvin Bis hop = 'The re ain''t no %s like %s %s';

Para las varia bles de cadena, puede redu cir el tamaño de memo ria asig-nada decla rando el tamaño máximo que se quiere per mi tir para unavaria ble de cadena par ti cu lar. En otras pala bras, si declara una cadenaque con ten drá el ape llido de la per sona, no es nece sa rio reser var la can ti-dad por defecto de 256 bytes para ella. En ese caso podría hacer losiguiente:

var Sur na me: String[20];

Esto reserva 21 bytes en lugar de 256, un aho rro sig ni fi ca tivo de memo ria.Si el pro blema se debe a que tiene dema sia das estruc tu ras de datos gran-des (que no son cade nas), puede con ver tir las en pun te ros, que sola mentecon su men cua tro bytes cada uno, así:

TptrRe cor ding = ^TRe cor ding;TRe cor ding = re cord Num ber: Inte ger; Hits: Inte ger; Tit le: String; Artist: String;end;. . .var ptrPlat ter, ptrAlbum, ptrDisc, ptrCD, ptrMu sic, ptrTu nes, ptrToons: TptrRe cor ding;

Si uti liza pun te ros, deberá reser var y libe rar explí ci ta mente la memo riaque utilizará. En Del phi 1, puede uti li zar para ello una sec ción Ini tia li za-tion y un pro ce di miento de salida. En Del phi de 32 bits, puede uti li zar lassec cio nes Ini tia li za tion y Fina li za tion. A con ti nua ción se mues tra un ejem-plo para Del phi 1 (uti li zando un pro ce di miento de salida):

pro ce du re Sa ni taryEngi neer; far;be gin Dis po se(ptrPlat ter); Dis po se(ptrAlbum); . . .end;

Mensajes de error 165

Page 200: Dsp

ini tia li za tion New(ptrPlat ter); New(ptrAlbum); . . . AddExitP roc(Sa ni taryEngi neer);end.

En lo ade lante, puede acce der a la memo ria apun tada por el pun tero derre-fe ren cián dolo. Por ejem plo, para alma ce nar un valor en el campo Artist,podría hacerlo de esta forma:

ptrPlat ter^.Artist := 'Hoo tie and the Blow fish';

3. Uti lice varia bles ini cia li za das en lugar de cons tan tes con tipo. Por ejem plo,en lugar de las siguien tes cons tan tes con tipo:

const String Chee seS tring: String = 'Wis con sin Won der'; TypedT ypeTy pTip: Inte ger = 17;

Uti lice las siguien tes varia bles ini cia li za das:

const String Chee seS tring = 'Wis con sin Won der'; TypedT ypeTy pTip = 17;

Infor ma ción adi cio nalEsto es principalmente un pro blema de Del phi 1; más espe cí fi ca mente, un pro-blema de Win dows 3.x, donde el seg mento de datos está limi tado a 64 KB.1. Trate de evi tar uti li zar varia bles glo ba les en la medida de lo posi ble. Uti-

lice varia bles loca les siem pre que sea posi ble. Si nece sita com par tirvaria bles glo ba les entre múl ti ples uni da des, uti lice una uni dad glo bal espe-cí fi ca mente para esto.

2. Puede incluir tan tas tablas de cade nas de carac te res como quiera, y losnúme ros uti li za dos en ellas para desig nar las cade nas no tie nen que sercon se cu tivos.

3. Las cons tan tes con tipo se aña den al seg mento de datos del pro grama. Lasvaria bles ini cia li za das, por otra parte, no. Si no va a rea sig nar el valor deuna con stante con tipo, uti lice una cons tante sin tipo, o una varia ble ini cia-li zada. Sus ti tuya las cons tan tes con tipo por varia bles ini cia li za das paracom pa ti bi li dad con ver sio nes futu ras de Del phi.

Data Structure CorruptionPo si ble cau sa de error

1. Puede estar inten tando rea li zar más de 255 cam bios en una sola tran sac-ción de base de datos.

2. Puede estar uti li zando la ver sión 3.00 o 3.10 del BDE.

166 Los Tomos de Delphi: Delphi sin problemas

Page 201: Dsp

So lu ción rá pi da1. Limite la can ti dad de cam bios en una única tran sac ción a no más de 255.2. Des car gue la ver sión más reciente del BDE desde el sitio

www.borland.com/dev sup port/bde/bdeup date.html

Infor ma ción adi cio nalLos lími tes de Para dox se indi can más abajo. Para infor ma ción gene ral rela cio-nada con las limi ta cio nes del BDE y dBASE, con sulte en la Web de Bor landhttp://www.bor land.com.

127 Tablas abiertas por el sistema

254 Tablas abiertas por el sistema (BDE 4.01 y posteriores)

64 Bloqueos de registros en una tabla (16 bits) por sesión

255 Bloqueos de registros en una tabla (32 bits) por sesión

255 Registros en transacción sobre una tabla (32 bits)

512 Archivos físicos abiertos (DB, PX, MB, X??, Y??, VAL, TV)

1024 Archivos físicos abiertos (BDE 4.01 y posteriores)

300 Usuarios en un archivo de red PDOXUSRS.NET

255 Número de campos por tabla

255 Tamaño de los campos de caracteres

2.000 Millones de registros en una tabla

2.000 Millones de bytes en un archivo .DB (tabla)

10.800 Bytes por registro para tablas indizadas

32.750 Bytes por registro para tablas no indizadas

127 Número de índices secundarios por tabla

16 Número de campos en un índice

255 Usuarios concurrentes por tabla

256 Megabytes de datos por campo BLOb

100 Contraseñas por sesión

15 Longitud máxima de contraseña

63 Contraseñas por tabla

159 Campos con chequeos de validación (32 bits)

63 Campos con chequeos de validación (16 bits)

Mensajes de error 167

Page 202: Dsp

Data Type too large: exceeds 2 GBPo si ble cau sa de error

Puede haber inten tado decla rar un tipo de datos defi nido por el usua rio que esexce si va mente grande. Por ejem plo, la siguiente decla ra ción de tipo pro duceeste men saje de error:

TDe viant Va riants = array[0..135000000] of va riant;

como tam bién lo hace ésta:

TSo Much Trou ble = array[0..1333333333] of in te ger;

So lu ción rá pi daDebe dis mi nuir el tamaño del tipo. Por ejem plo, lo siguiente com pi lará:

TTe xas Si zedA rray = array[0..100000000] of va riant;

Como tam bién esto:

TAlas ka Si zedA rray = array[0..200000000] of in te ger;

Infor ma ción adi cio nal200.000.000 ente ros y 100.000.000 de varian tes debe rían ser sufi cien tes en lamayo ría de los casos. Si es nece sa rio, declare dos tipos sepa ra dos, así:

TAlas ka = array[0..200000000] of in te ger;TAlas kaAn nex = array[0..200000000] of in te ger;

(Decla rar un array con el tamaño com bi nado de los dos ante rio res oca sionaeste men saje de error).

Database name missingPo si ble cau sa de error

Puede haber inten tado asig nar True a la pro pie dad Con nec ted de un com po-nente TDa ta base sin haber asig nado pri mero un valor a la pro pie dadData ba se Name.

So lu ción rá pi daAsigne un valor a la pro pie dad Data ba se Name del com po nente TDa ta baseantes de inten tar asig nar el valor True a su pro pie dad Con nec ted.

168 Los Tomos de Delphi: Delphi sin problemas

Page 203: Dsp

Infor ma ción adi cio nalEl com po nente TDa ta base es simi lar al com po nente TSes sion, en el sen tido deque se crea implíc ita mente una ins tan cia de ellos con sus pro pie da des asig na-das a valo res por defecto cuando es necesario.

En muchas oca sio nes resulta ven ta joso crear explí ci ta mente un com po nenteTDa ta base, espe cial mente cuando se desea conec tar con ser vi do res de bases dedatos SQL (como Inter Base, Ora cle, MS SQL Ser ver, Infor mix, etc.).

Puede mejo rar el ren di miento en tales casos asig nando el valor True a la pro-pie dad Keep Con nec ted del com po nente TDa ta base, evi tando muchas ini cia li za-cio nes de cone xión que con su men tiempo durante la eje cu ción del pro grama.

Un com po nente TDa ta base per mite tam bién uti li zar pro ce sa miento de tran sac-cio nes lla mando al método Start Tran sac tion de TDa ta base, seguido por unalla mada a Com mit o Roll back, en depen den cia del éxito o fallo de latran sac ción.

He aquí un ejem plo de cómo uti li zar las tran sac cio nes de bases de datos:

be gin with Da ta ba se1 do be gin Start Tran sac tion; try Query1.Acti ve := True; Com mit; ex cept Roll back; end; {blo que ex cept} end; {blo que with}end;

Para más infor ma ción sobre las tran sac cio nes de base de datos, con sulte“hand ling tran sac tions” en la ayuda de Del phi.

Database not AssignedPo si ble cau sa de error

Puede haber eje cu tado una sen ten cia SQL sin asig nar una base de datos alcom po nente de con sulta. Por ejem plo, lo siguiente gene rará este men saje deerror:

IBQry := TIBQuery.Crea te(nil);try with IBQry do be gin SQL.Add('SELECT COUNT(Delp hi Con verts) FROM Red mond'); SQL.Add('WHERE Job_Sta tus = For merMSEmplo yees'); Open;

Mensajes de error 169

Page 204: Dsp

Re sult := Fields[0].AsString; end;fi nally IBQry.Free;end;

So lu ción rá pi daAsigne una base de datos al com po nente de con sulta antes de eje cu tar la con-sulta, así:

. . . Da ta ba se := dm.IBDB; . . . Open;

Infor ma ción adi cio nalEn el código de arriba, dm es un módulo de datos en el que reside un objeto detipo TIBDa ta base lla mado IBDB. Los com po nen tes IBX apa re cen en la páginaInte rBase de la Paleta de Compo nen tes para ser uti li za dos en las apli ca cio nesque uti li cen bases de datos Inter Base (sin nece si dad del BDE). A par tir de laver sión 6 de Del phi, tam bién se tiene la opción de uti li zar los com po nen tesDBExpress para acce der a Inter Base sin el BDE.

Dataset is not a queryPo si ble cau sa de error

Puede haber inten tado asig nar el valor True a la pro pie dad Active de un com-po nente TQuery Client Da ta Set, pero el con junto de datos al que hace refe ren ciael com po nente TPro vi der (indi cado mediante la pro pie dad Pro vi der del objetoTQuery Client Da ta set) no es un objeto TQuery. Por ejem plo, puede que se tratede un com po nente TTa ble o TSto redP roc.

So lu ción rá pi daPro por cione un com po nente TQuery como valor de la pro pie dad Data set delcom po nente TPro vi der.

Infor ma ción adi cio nal

Nota: Los componentes MIDAS solamente son proporcionados con Delphi 3Cliente/Servidor y versiones posteriores de Delphi.TQueryClientDataSet apareció con Delphi 4 y desapareció en Delphi 5.

170 Los Tomos de Delphi: Delphi sin problemas

Page 205: Dsp

Dataset not configured for network accessPo si ble cau sa de error

Puede haber asig nado el pará me tro Net Dir del BDE a una uni dad local.

So lu ción rá pi daEl pará me tro Net Dir debe apun tar a un direc to rio com par tido de red al quetodos los usua rios que acce de rán a las tablas debe rán tener dere chos de accesode lec tura, escri tura y crea ción.

Infor ma ción adi cio nalDos pro pie da des de TSes sion, Net Fi le Dir y Pri va te Dir, son espe cí fi cas paraapli ca cio nes que tra ba jan con tablas Para dox. Net Fi le Dir espe ci fica el direc to-rio que con tiene el archivo de con trol de red de Para dox, PDOXUSRS.NET.Este archivo ges tiona la com par ti ción de las tablas Para dox sobre la red. Todaslas apli ca cio nes que nece si ten com par tir tablas Para dox deben espe ci fi car elmismo direc to rio de archivo de con trol de red (nor mal mente un direc to rio sobreel ser vi dor de archi vos de la red).

Dataset [is] not in edit or insert modePo si ble cau sa de error

Puede estar inten tando edi tar un valor en una tabla o inten tando inser tar unnuevo regis tro mien tras el con junto de datos está en un modo dis tinto a dsEdito dsInsert. Por ejem plo, puede haber inten tado hacer algo así:

with qryUpda te Ma te rial do be gin SQL.Add('UPDATE Ma te rial'); SQL.Add('SET Stu dent = :Stu dent'); SQL.Add('WHERE Week Be gin = :Week Be gin'); SQL.Add('AND TalkIndi ca tor = :TalkIndi ca tor'); if Hou sehol der then Pa rams.Pa ramB yNa me('Stu dent').AsString := For mat(‘%s HH: %s',[Exis ting,Astu dent ToS che du le]) else Pa rams.Pa ramB yNa me('Stu dent').AsString := AStu dent ToS che du le; Pa rams.Pa ramB yNa me('Week Be gin').AsDa te Ti me := dtpWeek ToS che du le.Date; Pa rams.Pa ramB yNa me('TalkIndi ca tor').AsString := ATalkIndi ca tor; ExecSQL; Post;end;

Mensajes de error 171

Page 206: Dsp

So lu ción rá pi daColo que el con junto de datos en modo de edi ción o inser ción antes de hacermodi fi ca cio nes o adi cio nes a él. Por ejem plo, si quiere edi tar el regis tro actualdel campo MonthlySpe cial de la tabla Pizza, podría hacer lo siguiente:

with Piz za dobe gin Edit; Piz za MonthlySpe cial.AsString := 'Ita lian Gar lic'; Post;end;

En el ejem plo de arriba, borre la lla mada a Post, ya que ExecSQL ya la hace.

Infor ma ción adi cio nalPara que la sin ta xis de arriba funcione (Piz za MonthlySpe cial.AsString), elcampo debe haber sido creado en tiempo de diseño uti li zando el edi tor de cam-pos (Fields Editor). De otro modo, nece si tará asig nar un valor al campo uti li-zando las pro pie da des Fields, Field Va lues o FieldByName de TDa ta set.

Los esta dos o modos posi bles de un TDa ta set son: dsBrowse, dsCalc Fields,dsCur Va lue, dsEdit, dsFil ter, dsInac tive, dsInsert, dsNew Va lue, dsOldVa lue ydsSet Key.

DAX Error: Class not registeredPo si ble cau sa de error

Puede no tener un archivo nece sa rio, por ejem plo DBCLIENT.DLL, ins ta lado yregis trado en la máquina cliente.

So lu ción rá pi daInstale y regis tre el archivo sobre la máquina cliente.

Infor ma ción adi cio nalPara regis trar el archivo (des pués de copiarlo al direc to rio \Win dows\System),siga estos pasos:1. Abra una ven tana DOS.2. Vaya al direc to rio \Win dows\System.3. Intro duzca Regsvr32 <archivo> y luego pulse la tecla Enter.

Por ejem plo, si el archivo del pro blema es DBCLIENT.DLL, seríaRegsvr32 DBCLIENT.DLL.Con sulte “Class not regis te red”.

172 Los Tomos de Delphi: Delphi sin problemas

Page 207: Dsp

DAX Error: Name not unique in this contextCon sulte “Name not uni que in this con text”.

DAX Error: Unexpected failurePo si ble cau sa de error

El ser vi dor de apli ca cio nes ha dis pa rado una excep ción durante laini cia li za ción.

So lu ción rá pi daAñada un ges tor de excep cio nes a su ser vi dor de apli caciones.

Infor ma ción adi cio nalAtra pando los erro res en el ser vi dor de apli ca cio nes podrá deter mi nar la natu-ra leza espe cí fica del pro blema que está expe ri men tando.

DCOM not installedPo si ble cau sa de error

Puede haber inten tado asig nar el valor True a la pro pie dad Con nec ted de uncom po nente TMIDASCon nec tion mien tras su pro pie dad Con nectType estabaasig nada a ctDCOM y su pro pie dad UseB ro ker era False sin ins ta lar pri meroDCOM.

So lu ción rá pi daSi es nece sa rio, des car gue e ins tale DCOM del sitio Web de Micro soft.

Infor ma ción adi cio nalWin dows NT 4, Win dows 98, Inter net Explo rer 4, y sus ver sio nes pos te rio resinclu yen DCOM.

Debug process is already runningPo si ble cau sa de error

1. Puede tener una ven tana de visua li za ción de varia bles abierta y estar tra-zando la eje cu ción del código más rápi da mente de lo que la ven tana escapaz de actua li zarse.

Mensajes de error 173

Page 208: Dsp

2. Puede haber inten tado com pi lar o eje cu tar den tro del entorno inte grado deDel phi sin haber ter mi nado la eje cu ción de un pro grama que generó unaexcep ción mediante Run | Pro gram Reset.

So lu ción rá pi da1. Espere hasta que la ven tana de visua li za ción se haya actua li zado antes de

con ti nuar la traza de la eje cu ción.2. Des pués de una excep ción en tiempo de eje cu ción, selec cione Run | Pro-

gram Reset.

Infor ma ción adi cio nal2. Al selec cio nar Run | Pro gram Reset des pués de expe ri men tar excep cio-

nes, hará que Del phi libere los recur sos asig na dos por lla ma das a la VCL eini cia lice las varia bles del pro grama.Sin embargo, rei ni ciar un pro grama desde el entorno inte grado de Del phide esta manera no nece sa ria mente libera todos los recur sos de Win dowsasig na dos por el pro grama.Si con ti núa expe ri men tando ines ta bi li dad sin razón apa rente, selec cioneFile | Close All, luego File | Exit, y final mente rei ni cie Del phi e intentecom pi lar el pro yecto de nuevo.

Debug session in progress. Terminate?Po si ble cau sa de error

Puede haber selec cio nado Pro ject | Build All, Pro ject | Com pile, o Pro ject| Syntax Check mien tras su pro yecto estaba en eje cu ción o sus pen dido.

So lu ción rá pi daSelec cione Can cel cuando reciba este men saje de error y luego selec cione Run| Pro gram Reset.

Infor ma ción adi cio nalSi está expe ri men tando excep cio nes o men sa jes de error inu sua les, selec cioneFile | Close All, luego File | Exit y rei ni cie Del phi. Si con ti núa teniendo pro-ble mas, cie rre todo y rei ni cie Win dows.

174 Los Tomos de Delphi: Delphi sin problemas

Page 209: Dsp

Debugger kernel error. Error code: <>Po si ble cau sa de error

1. Su pro grama puede estar inten tando car gar una DLL (puede ser una DLLregu lar o un paquete, que no es más que una DLL espe cí fica de Del phi conexten sión .DPL) que no puede encon trar. Puede que no exista en el sis temao no esté en el direc to rio actual de la ruta de bús queda.

2. Puede ser que un pro ce di miento o fun ción de una DLL a la que está inten-tando acce der no esté dis po ni ble debido a una mala escri tura del nom bre.

3. Puede ser que un pro ce di miento o fun ción de una DLL a la que está inten-tando acce der no esté dis po ni ble debido a la uti li za ción de una sig na turainco rrecta (un error en la can ti dad de pará me tros, sus tipos u orden).

4. Puede estar tra zando la eje cu ción del código dema siado rápi da mente mien-tras muchas varia bles com ple jas se están moni to ri zando en la ven tana devisualización.

5. Si el código de error es 25, puede haber inten tado depu rar remo ta mente enDel phi 4 o supe rio res y haber espe ci fi cado un camino remoto o nom bre deequipo invá lido.

So lu ción rá pi da1. Ase gú rese de que cual quier DLL reque rida esté acce si ble. Por con ve nio, los

archi vos DLL (inclu yendo los DPLs, o paque tes) se ins ta lan en el direc to rio\Win dows\System. En el mundo de los orde na do res, nor mal mente es útilseguir un con ve nio, a menos que se tenga una exce lente razón para nohacerlo.

2. Veri fi que que cual quier pro ce di miento o fun ción que esté lla mando en lasDLLs corres pon dan en nom bre y argu men tos. En Win dows de 32 bits, losnom bres de los pro ce di mien tos expor ta dos son sen si bles a las dife ren ciasmayús cu las/minúsculas.

3. Veri fi que que está pasando a los pro ce di mien tos o fun cio nes que llama lacan ti dad y tipos de pará me tros ade cua dos, y en el orden correcto.

4. Per mita que todos los valo res de la ven tana de visua li za ción se actua li cenantes de con ti nuar tra zando el código, o eli mine algu nas varia bles de lalista.

5. Veri fi que que la ruta y el nom bre del ser vi dor remoto que esté uti li zandosean váli dos.

Infor ma ción adi cio nalIntente eje cu tar el pro grama desde el Explo ra dor de Win dows. Puede queobtenga un men saje de error más des crip tivo, que indi que qué archivo .DLL esel que falta.

Mensajes de error 175

Page 210: Dsp

Recuerde ade más que no es posi ble mez clar y com bi nar DLLs de 16 bits y de32 bits.5. Con sulte “remote debug ging” en la ayuda de Del phi para deta lles

espe cí fi cos.

Declaration expected but <> foundPo si ble cau sa de error

1. Puede haber intro du cido algo dis tinto a una decla ra ción de Object Pas calválida en una posición donde el com pi la dor espera encon trar unadecla ra ción.Para ser más espe cí fi cos, puede obte ner este men saje de error si uti lizauna pala bra reser vada de Object Pas cal o ini cia una decla ra ción con algodis tinto a un guión bajo o un carac ter alfa bé tico (a..z, A..Z). Los dígi tos seper mi ten des pués del pri mer carac ter; otros carac te res no son per mi ti dos.Por ejem plo, estas decla ra cio nes no son per mi ti das:

string: string; {pala bra re ser va da de Object Pas cal}1string: string; {em pie za con un dígito}+1string: string {el ca rac ter ‘+’ no pue de ser uti li za do}

2. Puede haber borrado u omi tido algo que es nece sa rio. Por ejem plo, borrarla sec ción Begin … End de una DLL pro du cirá este men saje de error.

3. Puede haber aña dido una sec ción Fina li za tion a una uni dad sin haber pro-por cio nado una sec ción Ini tia li za tion.

So lu ción rá pi da1. Uti lice un nom bre válido de Object Pas cal para la decla ra ción. Estas decla-

ra cio nes están bien:

stringy: string;a1s tring: string;_1string: string;

2. Añada de nuevo la decla ra ción nece sa ria.3. Añada una sec ción Ini tia li za tion antes de la sec ción Fina li za tion.

Infor ma ción adi cio nal3. Si uti liza una sec ción Fina li za tion, debe tam bién uti li zar una sec ción Ini-

tia li za tion. Puede ini cia li zar varia bles, asig nar memo ria, etc., en la sec ciónIni tia li za tion. La sec ción Fina li za tion es un buen lugar para libe rar memo-ria y otros recur sos.

176 Los Tomos de Delphi: Delphi sin problemas

Page 211: Dsp

Declaration of <> differs from declaration in interface <>Po si ble cau sa de error

Puede haber decla rado una clase que imple menta una inter faz, y la sig na turade uno (o más) de los méto dos que está imple men tando difiere de la sig na turade la imple men ta ción. Por ejem plo, lo siguiente gene rará este men saje deerror:

type ITom Jo nesT he Sin ger NotT heP ro ta go nistOfTheC las sic Book = in ter fa ce pro ce du re Ra veUp(var ItsNotU nu sual: Wi deS tring); end;type TTom Jo nesImple men tor = class(TInter fa cedO bject, ITom Jo nesT he Sin ger NotT heP ro ta go nistOfTheC las sic Book) pro ce du re Ra veUp(var Whats New Puss ycat: Inte ger); end;

Debido a que las sig na tu ras de los dos méto dos RaveUp no con cuer dan.

So lu ción rá pi daCam bie las sig na tu ras en la clase o inter faz para que coincidan.

Infor ma ción adi cio nalCuando las cla ses imple men tan inter fa ces, deben imple men tar todos los méto-dos que la inter faz declara. Todas las cla ses que imple men ten inter fa ces debenimple men tar los tres méto dos de IUnknown (QueryInter face, AddRef yRelease); si deriva su clase de TInter fa cedO bject (como se mues tra arriba), estose hace auto má ti ca mente. Se hereda la imple men ta ción pre de fi nida de esosméto dos here dando de TInter fa cedO bject.

Declaration of <> differs from previous declarationPo si ble cau sa de error

1. Una decla ra ción de un pro ce di miento o fun ción en la parte Imple men ta tiondifiere de la decla ra ción ante rior.

2. Un método que está inten tando rede fi nir puede tener una sig na tura dife-rente (en cuanto a número, tipo u orden de los pará me tros) del ori gi nal.

3. Puede estar inten tando rede fi nir un método vir tual, pero está uti li zandoun con ve nio de lla mada dis tinto del uti li zado por el método redefinido.

Mensajes de error 177

Page 212: Dsp

So lu ción rá pi da1. Con sulte la decla ra ción ori gi nal del pro ce di miento o fun ción y uti lice la

misma sig na tura en su imple men ta ción.2. Cuando se rede fine un método vir tual, se debe uti li zar la misma lista de

pará me tros (can ti dad, tipos, nom bres y orden de los pará me tros).3. Uti lice el mismo con ve nio de lla mada que se uti liza en el método a

redefinir.

Infor ma ción adi cio nal3. Para más infor ma ción, con sulte “calling con ven tions” en la ayuda de

Del phi.

Declaration of class <> is missing or incorrectPo si ble cau sa de error

1. Puede haber modi fi cado o borrado el nom bre de la clase (des cen diente) dela sec ción Inter face de una uni dad. Por ejem plo, modi fi cando una decla ra-ción de tipo del for mu la rio de:

TForm1 = class(TForm)

a:

TPa nel1 = class(TForm)

pro vo cará este men saje de error.2. Puede haber eli mi nado la refe ren cia al ances tro del tipo de la decla ra ción

Type, así:

TForm1 = class { (TForm) se ha bo rra do }

So lu ción rá pi da1,2.Vuelva a la decla ra ción que ha gene rado auto má ti ca mente Del phi, es decir:

TForm1 = class(TForm)

o cam bie el nom bre de la clase (for mu la rio) a tra vés del Inspec tor de Obje-tos (Object Inspec tor).

Infor ma ción adi cio nalPuede decla rar un nuevo tipo sin espe ci fi car un ances tro, así:

TBill = class

178 Los Tomos de Delphi: Delphi sin problemas

Page 213: Dsp

Si lo hace, su ances tro será el ances tro último de todas las cla ses, TObject. Nopuede, sin embargo, como se mues tra arriba, cam biar implí ci ta mente el ances-tro de un for mu la rio de, por ejem plo, TForm a TObject.

DEFAULT clause not allowed in OLE automation sectionPo si ble cau sa de error

Puede haber uti li zado la cláu sula Default en una sec ción Auto ma ted de OLE.

So lu ción rá pi daLa cláu sula Default no está per mi tida en las sec cio nes Auto ma ted de OLE. Eli-mine la cláu sula.

Infor ma ción adi cio nalDel phi 2 y pos te rio res ofre cen cinco espe ci fi ca do res de visi bi li dad: Pri vate, Pro-tec ted, Public, Publis hed y Auto ma ted. Una pro pie dad de una clase puedeespe ci fi car carac te rís ti cas de alma ce na miento mediante las pala bras reser va-das Sto red, Default o Node fault. Estos espe ci fi ca do res de alma ce na miento, sinembargo, no están per mi ti dos en las sec cio nes Auto ma ted.

El espe ci fi ca dor Index, que per mite que múl ti ples pro pie da des com par tan losmis mos méto dos de acceso, tam poco está per mi tido en la sec ción Auto ma ted.

Default parameter ‘<>’ must be by-value or constPo si ble cau sa de error

Puede haber creado un método que aso cia un valor por defecto a un pará me troque es un pará me tro Var (que se pasa por refe ren cia). Por ejem plo, lo siguientegene rará este men saje de error:

pro ce du re That Aint Wor kin(var iYi Yi: Inte ger = 86);

So lu ción rá pi daDebe ele gir una de tres posi bles solu cio nes:1. Cam bie el pará me tro a un pará me tro cons tante:

pro ce du re That Aint Wor kin(const iYi Yi: Inte ger = 86);

2. Cam bie el pará me tro a un pará me tro pasado por valor:

pro ce du re That Aint Wor kin(iYi Yi: Inte ger = 86);

3. Elimine el valor por defecto:

pro ce du re That Aint Wor kin(var iYi Yi: Inte ger);

Mensajes de error 179

Page 214: Dsp

Por supuesto, puede tam bién hacer esto:

pro ce du re That Aint Wor kin(const iYi Yi: Inte ger);

Infor ma ción adi cio nalEn Pas cal, hay tres for mas de pasar pará me tros: por refe ren cia (Var), cons-tante (Const) o por valor (como es el meca nismo por defecto, no es nece sa rioespe ci fi car nada). La forma por defecto (por valor) es la forma “más segura”,pero es tam bién la menos efi ciente. Cuando un pará me tro es pasado por valor,una copia es creada y enviada (por lo que hay dos ins tan cias del pará me tro).Cuando se pasa por refe ren cia (Var), se envía un pun tero al pará me tro concapa ci dad de escri tura. Cuando se pasa una cons tante, se pasa un pun tero desólo lec tura al pará me tro. Por lo tanto, si va a cam biar el valor (y desea que elcam bio se refleje tam bién en el con texto de la lla mada), páselo por refe ren cia(ante po niendo Var al nom bre del pará me tro). Si el valor no va a cam biar,páselo como una cons tante (ante po niendo Const al pará me tro). Sola mente uti-lice la forma por defecto (por valor) en caso de que el valor puede cam biar, y nodesea que esos cam bios se refle jen en el con texto desde el que se hace lalla mada.

Default property must be an array propertyPo si ble cau sa de error

Puede haber decla rado una pro pie dad que no es de tipo array como la pro pie-dad por defecto de la clase. Por ejem plo, la siguiente decla ra ción de pro pie dadgene rará este men saje de error:

pro perty Twiggy: String read FTwiggy wri te FTwiggy; de fault;

So lu ción rá pi daBorre la direc tiva Default de la decla ra ción de la pro pie dad. Sola mente es posi-ble desig nar una pro pie dad de tipo array como la pro pie dad por defecto de laclase. Por ejem plo, lo siguiente es acep ta ble:

type TCom pu ter = class . . . pro perty Clo nes[Index: Inte ger]: String read FNetPC wri te Set NetPC; de fault;

Infor ma ción adi cio nalLa ven taja de espe ci fi car una pro pie dad de tipo array como pro pie dad pordefecto es que luego puede acce der a esa pro pie dad en el código sin tener que

180 Los Tomos de Delphi: Delphi sin problemas

Page 215: Dsp

espe ci fi car el nom bre de la pro pie dad. Por ejem plo, a la pro pie dad decla radaarriba se le podría asig nar un valor así:

var PC: TCom pu ter;. . .PC[i] := Com paq;

En otras pala bras, como es la pro pie dad por defecto, no es nece sa rio escri bir elnom bre de la pro pie dad cuando se hace una asig na ción, así:

PC.Clones[i] := Pac kard Bell;

Default value required for <>Po si ble cau sa de error

Puede haber pro por cio nado un pará me tro con un valor por defecto, pero luegoaña dió otro pará me tro que no tiene un valor por defecto. Por ejem plo, losiguiente provocará este men saje de error:

pro ce du re Bi De fault(i: Inte ger = 76; s: String);

So lu ción rá pi daSi pro por ciona un valor por defecto para un pará me tro, deberá tam biénproporcionar valo res por defecto para todos los pará me tros que le siguen, así:

pro ce du re Bi De fault(i: Inte ger = 76; s: String = 'trom bo nes');

o colo car el pará me tro con valor por defecto en último lugar, así:

pro ce du re Bi De fault(s: String; i: Inte ger = 76);

Infor ma ción adi cio nalAlgu nas fun cio nes, como StrToIn tDef, tam bién per mi ten espe ci fi car un valorde retorno por defecto. Puede, por supuesto, escri bir sus pro pias fun cio nes deforma que sigan este patrón.

Default values must be of ordinal, pointer, or small set typePo si ble cau sa de error

Puede haber decla rado una pro pie dad que con tenga una direc tiva de alma ce na-miento por defecto cuyo tipo de datos es incom pa ti ble con los acep ta bles comovalo res por defecto. Por ejem plo, lo siguiente pro duce este men saje de error, yaque el tipo de datos String no puede tener un valor por defecto asociado:

pro perty Na nook: string read FZap pa wri te FZap pa de fault 'great oogly moogly';

Mensajes de error 181

Page 216: Dsp

So lu ción rá pi daEli mine la direc tiva de alma ce na miento Default y el corres pon diente valor pordefecto. No declare valo res por defecto para pro pie da des de tipo cadena(string), de punto flo tante o arrays.

Infor ma ción adi cio nalComo indica el texto de este men saje de error, los valo res de las pro pie dadespor defecto deben ser ordi nales, punteros, o tipos de con junto peque ños. En tér-mi nos prác ti cos, esto sig ni fica tipos enteros, Boo lean y enu me ra dos. Comoejem plo de lo que es acep tado y común mente uti li zado, he aquí un extracto dela uni dad But tons de Del phi:

{Tipo enu me ra do uti li za do des pués como tipo de pro pie dad}type TBut ton La yout = (blGlyphLeft, blGlyphRight, blGlyphTop, blGlyphBot tom); . . . TSpeed But ton = class(TGrap hic Con trol) {Pro pie dad de tipo Boo lean con direc ti va de al ma ce na mien to De fault asociada} pro perty AllowAllUp: Boo lean read FAllowAllUp wri te SetA llowAllUp de fault Fal se; {Pro pie dad de tipo en te ro con direc ti va de al ma ce na mien to De fault asociada} pro perty GroupI ndex: Inte ger read FGroupI ndex wri te SetG roupI ndex de fault 0; . . . {Pro pie dad de tipo enu me ra do con di rec ti va de al ma ce na mien to De fault asociada} pro perty La yout: TBut ton La yout read FLa yout wri te Set La yout de fault blGlyphLeft;

Del phi ofrece tres direc ti vas de alma ce na miento. Ade más de Default, tam biénestán Node fault y Stored. Nor mal mente, todos los valo res de pro pie da des sealma ce nan, y no hay valo res por defecto para una pro pie dad dada. La únicamanera de espe ci fi car un valor por defecto es uti li zando la direc tiva de alma ce-na miento Default. La única manera de evi tar que un valor sea alma ce nado esuti li zar la direc tiva de alma ce na miento Sto red, seguida por una fun ción boo-leana cuyo valor devuelto deter mina si la pro pie dad es alma ce nada o no. Heaquí otro frag mento de la uni dad But tons de Del phi que mues tra la direc tivaSto red en uso:

TBitBtn = class(TBut ton). . .pri va te func tion IsCus tom: Boo lean; func tion IsCus tom Cap tion: Boo lean;. . .pu blis hed

182 Los Tomos de Delphi: Delphi sin problemas

Page 217: Dsp

. . . pro perty Can cel sto red IsCus tom; pro perty Cap tion sto red IsCus tom Cap tion; . . .func tion TBitBtn.IsCus tom: Boo lean;be gin Re sult := Kind = bkCus tom;end;. . .func tion TBitBtn.IsCus tom Cap tion: Boo lean;be gin Re sult := Com pa reStr(Cap tion, Load ResS tring(BitBtnCap tions[FKind])) <> 0;end;

Para más infor ma ción, con sulte “sto rage spe ci fiers” en la ayuda de Del phi.

Destination must be indexedPo si ble cau sa de error

Puede estar inten tando aña dir, actua li zar o borrar regis tros de un tabla indi-zada desde una tabla no indi zada mediante el com po nente TBat chMove. Porejem plo, si la tabla Source con tiene una clave pri ma ria, y la tabla Des ti na tionno, y llama al método Exe cute del com po nente TBat chMove (en tiempo de eje-cu ción o en tiempo de diseño desde el entorno inte grado de Del phi; vea la sec-ción de Infor ma ción Adi cio nal) mien tras la pro pie dad Mode del com po nenteTBat chMove tiene asig nado el valor batA ppendUpdate, bat De lete o batU pdate,obten drá este men saje de error.

So lu ción rá pi daAse gú rese de que la tabla a la que hace refe ren cia la pro pie dad Des ti na tion delcom po nente TBat chMove tiene un índice corres pon diente a otro de la tabla a laque hace refe ren cia la pro pie dad Source.

Infor ma ción adi cio nalPara actua li zar o borrar regis tros espe cí fi cos de una tabla, Del phi deberá sercapaz de “empa re jar” los regis tros en la tabla Des ti na tion con los regis tros enla tabla Source. Si las tablas Des ti na tion y Source no tie nen índi ces corres pon-dien tes, esto es impo si ble y por ello obten drá este men saje de error.

Para eje cu tar la ope ra ción de Bat chMove en tiempo de diseño, siga estos pasos:1. Asigne a la pro pie dad Source del com po nente TBat chMove un com po nente

TDa ta set.2. Asigne a la pro pie dad Des ti na tion del com po nente TBat chMove un com po-

nente TTa ble.

Mensajes de error 183

Page 218: Dsp

3. Asigne a la pro pie dad Mode del com po nente TBat chMove la ope ra cióndeseada (batA ppend, batA ppendUpdate, bat Copy, bat De lete o batU pdate).

4. Pulse el botón dere cho del ratón sobre el com po nente TBat chMove.5. Selec cione Exe cute desde el menú de con texto.

Para más infor ma ción, con sulte “TBat chMove” en la ayuda de Del phi.

Directory Is BusyPo si ble cau sa de error

Múl ti ples apli ca cio nes (o múl ti ples ins tan cias de una misma apli ca ción) pue-den estar inten tando uti li zar el mismo direc to rio como direc to rio pri vado.

So lu ción rá pi daDis tri buya cada apli ca ción de manera que se eje cute en su pro pio direc to riosepa rado, o asigne la pro pie dad Pri va te Dir del com po nente TSes sion durante elarran que de la apli ca ción (antes de que se acceda a nin guna tabla). El direc to-rio pri vado de cada usua rio debe ser inac ce si ble a los demás usua rios; puedeestar situado en el disco duro local del usua rio, o sobre la red si el espa cio dealma ce na miento local es limi tado. Por ejem plo, para hacer que el pro gramacree un direc to rio en el disco duro local del usua rio, podría hacer esto antes deque las tablas sean acce di das:

var Exten sion, Exec Na me, Mi neA llMi ne : String; Exten sion Pos: Inte ger;. . .Exec Na me := Extract Fi le Na me(Appli ca tion.Exe Na me);Exten sion := Extract Fi leExt(Appli ca tion.Exe Na me);Exten sion Pos := Pos(Exten sion, Exec Na me);De le te(Exec Na me, Exten sion Pos, 4);Mi neA llMi ne := 'C:\Temp\' + Exec Na me;if not Di rec tory Exists(Mi neA llMi ne) then Crea te Dir(Mi neA llMi ne);if Di rec tory Exists(Mi neA llMi ne) then Ses sion.Pri va te Dir := Mi neA llMi neelse rai se Excep tion.Crea te('Por al gu na ra zón, el di rec to rio pri va do' + Mi neA llMi ne + ' no fue crea do.');end;

Infor ma ción adi cio nalEsto no es un pro blema si cada usua rio está eje cu tando su pro pia copia localdel eje cu ta ble, ya que el Direc to rio Pri vado es implí ci ta mente asig nado aldirec to rio actual. A menos que lo haya cam biado, éste será el direc to rio en elque el eje cu ta ble reside.

184 Los Tomos de Delphi: Delphi sin problemas

Page 219: Dsp

Si múl ti ples usua rios acce den al mismo pro grama sobre una red (todos eje cu-tan un mismo eje cu ta ble situado en una uni dad de red com par tida), para cadauno de ellos se deberá asig nar explí ci ta mente un direc to rio pri vado dis tinto delde los demás. De otra manera, todos los archi vos tem po ra les tra ta rán de uti li-zar el mismo direc to rio (el direc to rio en el que reside el eje cu ta ble compartido),y se pro du ci rán con flic tos (espe cí fi ca mente, se obten drá este men saje de error).

Directory is controlled by other .NET filePo si ble cau sa de error

1. Puede estar inten tando acce der a una tabla que está siendo actual menteuti li zada por alguien cuya con fi gu ra ción del pará me tro Net Dir de Para doxdifiere del suyo. Todos los usua rios deben com par tir el mismo archivo decon trol de red (PDOXUSRS.NET) para habi li tar el acceso con cu rrente a latabla.

2. Pueden haber archi vos de con trol de red (PDOXUSRS.NET) o archi vos deblo queos (*.LCK) invá li dos en su sis tema. Estos archi vos se que dan algu-nas veces des pués de una ter mi na ción anor mal del pro grama (una caídadel sistema).

3. Puede no tener con fi gu rado a True el pará me tro Local Share mien trasaccede a un direc to rio en una red local punto a punto.

So lu ción rá pi da1. Con fi gure cada máquina de usua rio de manera que ten gan el mismo valor

de con fi gu ra ción del pará me tro Net Dir (que indica el direc to rio de la red enel que reside el archivo PDOXUSRS.NET). Puede hacerlo siguiendo lospasos ade cua dos para su ver sión de Del phi:

Delphi 1

Si cada usua rio tiene su pro pia copia del BDE en su máquina, puede uti li zar lauti li dad de con fi gu ra ción del BDE para asig narles el direc to rio de red. Paraello, siga estos pasos:

a. Abra la utilidad de configuración del BDE (BDE Con fig u ra tion).b. Con la entrada ‘Par a dox’ seleccionada en el cuadro de lista Driver

Name, introduzca la ruta completa del directorio de red compartidodonde se almacena el archivo de control de red (PDOXUSRS.NET) enel parámetro NetDir.

c. Seleccione File | Exit y grabe los cambios.

Si algún usua rio no tiene una copia de la uti li dad de con fi gu ra ción del BDE,ase gú rese de que la ubi ca ción actual de su archivo IDAPI.CFG (por defectoC:\IDAPI) coin cida con lo indi cado en la entrada CONFIGFILE01 de la sec ción[IDAPI] del archivo WIN.INI.

Mensajes de error 185

Page 220: Dsp

Si es nece sa rio, mueva el archivo al direc to rio indi cado en WIN.INI, o modi fi-que la entrada de WIN.INI para que coin cida con la ubi ca ción del archivo.

Delphi 2

Si cada usua rio tiene su pro pia copia del BDE, puede uti li zar la uti li dad decon fi gu ra ción del BDE para asig nar les el direc to rio del archivo de con trol dered de Para dox. Para ello, siga estos pasos:

a. Abra la utilidad de configuración del BDE (BDECFG32.EXE)seleccionando Inicio | Pro gramas | Delphi | BDE Con fig u ra tion.

b. Con la entrada ‘Par a dox’ seleccionada en el cuadro de lista DriverName, introduzca la ruta completa del directorio de red compartidodonde se almacena el archivo de control de red (PDOXUSRS.NET) enel parámetro NetDir.

c. Seleccione File | Exit y grabe los cambios.

Vea Del phi de 32 bits más ade lante.

Delphi 3 y 4

Si cada usua rio tiene su pro pia copia de BDE, puede uti li zar la uti li dad deadmi nis tra ción del BDE para asig narles el direc to rio de red de Para dox. Paraello, siga estos pasos:

a. Abra la utilidad BDE Administration (Inicio | Pro gramas | DelphiX | BDE Admin is tra tor).

b. Seleccione Object | Open Con fig u ra tion. . . .c. Abra IDAPI32.CFG.d. Nav egue hasta Con fig u ra tion | Drivers | Native | Par a dox | 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 quetodos los usuarios de las tablas Par a dox tengan derechos de lectura,escritura y borrado.

f. Seleccione Object | Exit y luego Yes para grabar los cambiosrealizados.

Delphi de 32 bits

Si algún usua rio no tiene una copia de la uti li dad BDE Con fi gu ra tion/Admi nis-tra tion, puede con sul tar el Regis tro del sis tema para ase gu rarse de que la ubi-ca ción de IDAPI32.CFG (por defecto C:\Archi vos de pro grama\Bor land\Com mon files\BDE) coin cide con lo que se indica en el Regis tro del sis tema. Laclave del Regis tro DLLPATH está ubi cada en HKEY_LOCAL_MACHINE\Soft ware\Bor land\Data base Engine.

186 Los Tomos de Delphi: Delphi sin problemas

Page 221: Dsp

Si es nece sa rio, mueva el archivo para que coin cida con la entrada del Regis troo cam bie la entrada en el Regis tro del sis tema para que coin cida con la ubi ca-ción del archivo.2. Haga que todos los usua rios de los pro gra mas que acceden a las tablas en

cues tión sal gan de los programas. Bus que y borre el archivoPDOXUSRS.NET y los archi vos *.LCK inválidos.

3. Asigne el valor True al pará me tro Local Share mediante la uti li dad de con-fi gu ra ción del BDE.

Infor ma ción adi cio nalEl direc to rio en el que reside el archivo de con trol de red (PDOXUSRS.NET)debe ser un direc to rio de red com par tido sobre el que todos los usua rios queacce dan a las tablas deben tener dere chos de lec tura, escri tura y crea ción.Puede pen sar en el archivo de con trol de red como en un poli cía de trá fico. Loscon flic tos poten cia les pue den ser evi ta dos si todos los usua rios/con tro la do resmiran al mismo poli cía de trá fico/archivo de con trol de red para orien tarse. Silos usua rios se guían por dife ren tes poli cías, el resul tado no será agra da ble.

Si múl ti ples usua rios com par tie ran la misma copia de un archivo .EXE (porejem plo, uno que resida en una uni dad de red com par tida) que accede a tablasde Para dox, ellos deberán asig nar al pará me tro Pri va te Dir de Para dox unaubi ca ción a la que sola mente ellos pue dan acce der. Por ejem plo, pue den esta-ble cer como su direc to rio pri vado un direc to rio de su pro pio disco duro, asig-nán dolo a la pro pie dad Pri va te Dir del com po nente TSes sion. Un ejem plo decómo se podría hacer esto es el siguiente:

var Exten sion, Exec Na me, Go merP yle : String; Exten sion Pos: Inte ger;. . .Exec Na me := Extract Fi le Na me(Appli ca tion.Exe Na me);Exten sion := Extract Fi leExt(Appli ca tion.Exe Na me);Exten sion Pos := Pos(Exten sion, Exec Na me);De le te(Exec Na me,Exten sion Pos,4);Go merP yle := For mat( 'C:\Temp\%s',[Exec Na me]);if not Di rec tory Exists(Go merP yle) then Crea te Dir(Go merP yle);if Di rec tory Exists(Go merP yle) then Ses sion.Pri va te Dir := Go merP yleelse rai se Excep tion.Crea teFmt( ’El di rec to rio pri va do %s no fue creado.', [Go merP yle]);end;

Mensajes de error 187

Page 222: Dsp

Disk ErrorPo si ble cau sa de error

Puede haber rea li zado cam bios a un archivo, y luego haber inten tado gra barloa tra vés de un sis tema de con trol de ver sio nes, como PVCS, sin pri mero habermar cado (check out) el archivo en modo de escri tura.

So lu ción rá pi daSi quiere que los cam bios rea li za dos a un archivo se apli quen, debe pri meropre pa rarlo para escri tura.

Infor ma ción adi cio nalPVCS no se incluye de serie en Del phi, pero Del phi Cliente/Ser vi dor ofrecesoporte nativo para él. Para más infor ma ción, con sulte “PVCS” en la ayuda deDel phi.

Disk fullPo si ble cau sa de error

Puede estar inten tando ins ta lar un com po nente cuyo archivo de recur sos aso-ciado (.DCR) está dañado.

So lu ción rá pi daBorre el archivo .DCR (tiene el mismo nom bre del com po nente, pero su exten-sión es .DCR en lugar de .PAS o .DCU).

Infor ma ción adi cio nalLos archi vos .DCR con tie nen mapas de bits de paleta para el com po nentecorres pon diente. Son una carac te rís tica útil, que per mite dis tin guir visual-mente los com po nen tes en la Paleta, así como en los for mu la rios y módu los. Sino se pro por ciona un archivo .DCR, o si se ha pro por cio nado alguno pero no seuti liza, el com po nente uti li zará el mapa de bits de su ances tro.

Aún cuando dos com po nentes com par tan el mismo mapa de bits, hay for mas dedife ren ciar los. En la Paleta de Compo nen tes, posi cione el cur sor sobre el mapade bits hasta que apa rezca la indi ca ción (hint) que mues tra el nom bre del com-po nente. Si el com po nente está situado sobre un for mu la rio o módulo de datos,su tipo se mos trará sobre el Inspec tor de Obje tos (Object Inspec tor). Por ejem-plo, si crea un des cen diente de TBat chMove y lo deno mina TSoft Bat chMove, elcua dro de lista des ple ga ble situado en la parte supe rior del Inspec tor de

188 Los Tomos de Delphi: Delphi sin problemas

Page 223: Dsp

Obje tos mos trará Soft Bat chMo ve1: TSoft Bat chMove cuando el com po nente des-cen diente tenga el foco.

Disk read errorPo si ble cau sa de error

Puede haber inten tado leer más allá del final de un archivo. Por ejem plo, siestá leyendo un archivo de 50 líneas, lo siguiente gene rará este men saje deerror:

var s: String; I: Inte ger;be gin Assign Fi le(sta tes,'50sta tes.txt'); Re set(sta tes); i := 0; whi le i < 232 do be gin readln(sta tes, s); inc(i); end; . . .

So lu ción rá pi daVeri fi que que el bucle no intente leer más allá del tamaño del archivo. En elcódigo anterior, reem place 232 por 50. O mejor toda vía, cree una cons tante yutilí cela así:

const NUMBER_OF_STATES = 50; . . . whi le I < NUMBER_OF_STATES do . . .

Infor ma ción adi cio nalEste es el error 100 de Entrada/Salida.

Disk write errorPo si ble cau sa de error

Puede haber lla mado a uno de los siguien tes pro ce di mien tos cuando el disco enel que está inten tando escri bir está lleno o ha que dado lleno como resul tado dela ope ra ción: CloseFile

Mensajes de error 189

Page 224: Dsp

Flush Write Writeln

So lu ción rá pi daMantenga siem pre libre al menos el 10 por ciento del disco duro. Eli mine losarchi vos inne ce sa rios. Haga copia de segu ri dad en medios remo vi bles de losarchi vos que se uti li zan en con ta das oca sio nes o nunca y luego bórre los.

Infor ma ción adi cio nalEste es el error número 101 de Entrada/Salida.

No tener espa cio sufi ciente en disco duro puede indi rec ta mente oca sionarmuchos erro res no rela cio na dos. Una de las cau sas es que el sis tema uti liza eseespa cio para memo ria vir tual. Si hay más espa cio en disco libre, más memo riavir tual habrá dis po ni ble. Si comienza a reci bir men sa jes de error que no parez-can tener sentido, veri fi que el espa cio dis po ni ble en disco.

Dispid <> already used by <>Po si ble cau sa de error

Puede estar inten tando uti li zar un identificador dis pid que ya ha sido asig nadoa otro pro ce di miento de la clase. Por ejem plo, lo siguiente pro du ci ría este men-saje de error:

au to ma ted pro ce du re OnClick; dis pid 1; pro ce du re OnKeyP ress(var Key: Sma llint); dis pid 1;

So lu ción rá pi daUti lice un iden ti fi ca dor (dis pid) único para cada método. Por ejem plo, en elcódigo mos trado arriba, sim ple mente reem place una de las cláu su las “dis pid 1”por un número dis tinto de 1, como “dis pid 2”.

Infor ma ción adi cio nalLas decla ra cio nes de méto dos y pro pie da des en una sec ción Auto ma ted pue denopcio nal mente ir acom pa ña das de una direc tiva Dis pid. Si se uti liza una direc-tiva Dis pid, ésta debe ir seguida por una cons tante entera. Si no se espe ci ficaexplí ci ta mente una direc tiva Dis pid con su corres pon diente número, el com pi-la dor gene rará auto má ti ca mente un iden ti fi ca dor único.

Para más infor ma ción, con sulte “auto ma ted com po nents” en la ayuda deDel phi.

190 Los Tomos de Delphi: Delphi sin problemas

Page 225: Dsp

Dispid clause only allowed in OLE automation sectionPo si ble cau sa de error

Una direc tiva Dispid ha sido aña dida a una pro pie dad que no está situada enla sec ción Auto ma ted de la clase. Por ejem plo, lo siguiente gene rará este men-saje de error:

Pu blic . . . pro perty ri llest8: in te ger read getF14 dis pid 3;

So lu ción rá pi daAñada la direc tiva Dispid úni ca mente a las pro pie da des y méto dos situa dos enla sec ción Auto ma ted de la clase.

Infor ma ción adi cio nalLas direc ti vas Dis pid pue den ser uti li za das sólo en sec cio nes Auto ma ted. Paramás infor ma ción, con sulte “auto ma ted com po nents” en la ayuda de Del phi.

Dispose not supported (nor necessary) for dynamic arraysPo si ble cau sa de error

Puede haber inten tado apli car el pro ce di miento Dis pose a un array diná mico.Por ejem plo, lo siguiente gene rará este men saje de error:

pro ce du re Busy Work;var argh : array of in te ger;be gin Set Length(argh, 12); . . . Dis po se(argh); . . .

So lu ción rá pi daElimine la lla mada a Dis pose.

Infor ma ción adi cio nalDebido a que los arrays diná mi cos man tie nen un con ta dor de refe ren cias, selibe ran auto má ti ca mente cuando no que dan refe ren cias a ellos.

Mensajes de error 191

Page 226: Dsp

Division by zeroPo si ble cau sa de error

Puede haber inten tado divi dir un número por cero. Por ejem plo, si la varia bleDivi sor es igual a 0, lo siguiente gene rará este men saje de error:

var Di vi dend, Di vi sor, Quo tient: in te ger;be gin . . . Di vi dend := StrToInt(Edit1.Text); Di vi sor := StrToInt(Edit2.Text); Quo tient := Di vi dend div Di vi sor;

So lu ción rá pi daAse gú rese de que el divi sor no sea 0 antes de divi dir, o encie rre la ope ra ción dedivi sión en un blo que Try. . . Except. Por ejem plo, para pre ve nir que la ope ra-ción de divi sión tenga lugar si el divi sor es 0, puede hacer algo así:

. . .Di vi dend := StrToInt(Edit1.Text);if StrToInt(Edit2.Text) > 0 then be gin Di vi sor := StrToInt(Edit2.Text); Quo tient := Di vi dend div Di vi sor; end;else be gin Show Mes sa ge('Enter a num ber grea ter than 0 ' +#13#10+ ' in the Di vi sor edit box’); Edit2.Set Fo cus; end;

Para ence rrar la ope ra ción en un blo que Try. . . Except, puede hacer algo así:

. . .Di vi dend := StrToInt(Edit1.Text);Di vi sor := StrToInt(Edit2.Text);try Quo tient := Di vi dend div Di vi sor;ex cept on EDivB yZe ro do Show Mes sa ge('Enter a num ber grea ter than 0 ' +#13#10+ ' in the Di vi sor edit box’); Edit2.Set Fo cus; end;end;

192 Los Tomos de Delphi: Delphi sin problemas

Page 227: Dsp

Infor ma ción adi cio nalSi está divi diendo núme ros de punto flotante, debe uti li zar el ope ra dor / enlugar del ope ra dor div, que se uti liza sólo para divi dir ente ros.

Duplicate case labelPo si ble cau sa de error

Este men saje de error se pro duce cuando hay más de una eti queta de opcióncon el mismo valor en una sen ten cia Case.

So lu ción rá pi daAse gú rese de que haya sola mente una ocu rren cia de cada valor en una sen ten-cia Case.

Infor ma ción adi cio nalEspe ci fi car que más de una acción ten drá lugar para un valor par ti cu lar nopuede ser enten dido por el com pi la dor, ya que es ambi guo. El siguiente ejem-plo, donde el valor ‘wal ton’ se encuen tra dos veces, oca siona este men saje deerror:

func tion Get Firs tNa me(shag ger: out fiel ders): string;var Firs tNa me: string;be gin case shag ger of an der son: Firs tNa me := 'Brady'; be lle: Firs tNa me := 'Joey'; //Albert car ter: Firs tNa me := 'Joe'; da vis: Firs tNa me := 'Eric'; ham monds,wal ton: Firs tNa me := 'Jef frey'; king sa le: Firs tNa me := 'Eu ge ne'; ma tos: Firs tNa me := 'Luis'; sur hoff: Firs tNa me := 'B.J.'; ta ras co: Firs tNa me := 'Tony'; wal ton: Firs tNa me := 'Je ro me'; end; Re sult := Firs tNa me;end;

Puede espe ci fi car múl ti ples cons tan tes en una línea, pero nin guna de ellaspuede ser uti li zada más de una vez en la misma sen ten cia Case. Por ejem plo,las dos siguientes sentencias son váli das:

func tion Get FirstIni tial(shag ger: out fiel ders): string;var Firs tInitial: char;

Mensajes de error 193

Page 228: Dsp

be gin case shag ger of an der son,sur hoff: FirstIni tial := 'B'; da vis: FirstIni tial := 'E'; car ter,ham monds,wal ton: FirstIni tial := 'J'; ta ras co: FirstIni tial := 'T'; end; Re sult := FirstInitial;end;....func tion Star ters Eva lua tion(in nings: in te ger): string;var ou ting: string;be gin case Inning sPit ched of 1..3: ou ting := 'Bom bed'; 4 : ou ting := 'Poor'; 5,6 : ou ting := 'De cent'; 7,8 : ou ting := 'Good'; 9 : ou ting := 'Exce llent'; end; Re sult := ou ting;end;

Duplicate database name <>Po si ble cau sa de error

Puede haber asig nado a la pro pie dad Data ba se Name de un com po nente TDa ta-base un nom bre ya asig nado a otro com po nente TData base exis tente en elfor mu la rio.

So lu ción rá pi daAsigne nom bres úni cos a todos los com po nen tes TDatabase.

Infor ma ción adi cio nalPara mayor cla ri dad y faci li dad de man te ni miento del código, es una buenaprác tica uti li zar nom bres des crip ti vos para los com po nen tes y sus pro pie da des,como por ejem plo la pro pie dad Data ba se Name del com po nente TDa ta base. Del-phi no evita que pro por cione el nom bre “DB” o “BigI ron” o “q” a la pro pie dadData ba se Name, pero es mejor evitarlos en lo que res pecta a la cla ri dad y man-te ni miento del código.

194 Los Tomos de Delphi: Delphi sin problemas

Page 229: Dsp

Duplicate dynamic method indexPo si ble cau sa de error

Puede haber asig nado el mismo código de men saje a dos pro ce di mientos queres pon den a un men saje de ven tana espe cí fico. Por ejem plo, lo siguiente gene-rará este men saje de error:

const GOTTA_GETTA_MESSAGE_TO_YOU = WM_User + 160; MESSAGE_IN_A_BOTTLE = WM_User + 160;type TToo Much Mon key Bu si ness = class(TCom po nent) pro ce du re He re Co mesT he New Boss(var Msg: TMes sa ge); mes sa ge GOTTA_GETTA_MESSAGE_TO_YOU; pro ce du re Sa meAs TheOl dBoss(var Msg: TMes sa ge); mes sa ge MESSAGE_IN_A_BOTTLE; end;

So lu ción rá pi daCam bie las cons tan tes numé ri cas de los men sa jes para que ten gan valo resúni cos:

const GOTTA_GETTA_MESSAGE_TO_YOU = WM_User + 160; MESSAGE_IN_A_BOTTLE = WM_User + 161;

Infor ma ción adi cio nalLa apli ca cio nes escri tas en Del phi nor mal mente res pon den a even tos que sondis pa ra dos por los men sa jes de Win dows. Como se mues tra arriba, usted puedecrear sus pro pias cons tan tes y ges to res de men sa jes, y luego poner un men sajeen la cola de men sa jes de Win dows para hacer que el ges tor de men saje corres-pon diente se dis pare. Para más infor ma ción, con sulte “Post Mes sage” y “Send-Mes sage” en la ayuda del SDK de Win dows, o bus que el libro Los To mos deDel phi: Núcleo del API Win32, editado en español por Danypress, para másinfor ma ción sobre cómo uti li zar lla ma das a la API de Win dows. Este exce lentelibro con tiene mul ti tud de ejem plos en Del phi de lla ma das a la API de Win-dows. Para más infor ma ción, con sulte “mes sage dis pat ching” en la ayuda deDel phi. Para infor ma ción simi lar, con sulte “dupli cate mes sage met hod index”.

Duplicate field name <>Po si ble cau sa de error

Puede estar inten tando uti li zar el mismo nom bre para varios cam pos de basede datos. Por ejem plo, puede estar creando cam pos así:

Mensajes de error 195

Page 230: Dsp

with Ta ble1 do be gin. . . with Field Defs do be gin Clear; Add('Outs tan ding', ftBoo lean, 0, True); Add('Outs tan ding', ftString, 30, Fal se); end;

Alter na ti va mente, puede estar creando los cam pos varias veces. Por ejem plo, losiguiente funcionará bien la pri mera vez:

with Ta ble1 do be gin . . . with Field Defs do be gin Clear; Add('Ba se ball', ftBoo lean, 0, True); Add('For ce', ftString, 30, Fal se); end;

Pero fallará en una eje cu ción pos te rior, ya que los campos Base ball y Force yaexis ten.

So lu ción rá pi daSus ti tuya el nom bre de campo dupli cado por otro único. En el pri mer ejem plodado arriba, por ejem plo, podría renom brar el segundo campo comoSafeS li ding.

Infor ma ción adi cio nalPara más infor ma ción sobre crea ción de tablas en tiempo de eje cu ción, con sulte“Crea te Ta ble” en la ayuda de Del phi.

Duplicate implements clause for interface <>Po si ble cau sa de error

Puede haber decla rado dos pro pie da des dele ga das para la misma inter faz. Porejem plo, lo siguiente gene rará este men saje de error:

pro perty So meIn ter fa ce: ISo meIn ter fa ce read ReadItAndWeep im ple ments ISo meIn ter fa ce;pro perty So meOt herI nter fa ce: ISo meIn ter fa ce read ReadItAndRe joi ce im ple ments ISo meIn ter fa ce;

So lu ción rá pi daElimine una de las pro pie da des de inter faz dele ga das (o cam bie el nom bre deuna de las inter fa ces a otra inter faz dis po ni ble).

196 Los Tomos de Delphi: Delphi sin problemas

Page 231: Dsp

Infor ma ción adi cio nalPara más infor ma ción sobre lo que no está per mi tido cuando se dele gan pro pie-da des para imple men tar inter fa ces, con sulte “Imple ments get ter must beregis ter calling con ven tion” y “Read or Write clause expec ted, butiden ti fier <> found”.

Duplicate message method indexPo si ble cau sa de error

Puede haber uti li zado el mismo índice de men saje para más de un método deges tión de men saje. Por ejem plo, lo siguiente oca sio nará este men saje de error,ya que intenta asig nar el pro ce sa miento del men saje WM_CHAR a dosméto dos:

type TForm1 = class(TForm) pri va te { Pri va te de cla ra tions } pu blic pro ce du re WMChar(var Mes sa ge: TWMChar); mes sa ge WM_CHAR; pro ce du re WMKey Down(var Mes sa ge: TWMChar); mes sa ge WM_CHAR; end;

So lu ción rá pi daCam bie el valor de una de las cons tan tes de índice de men saje. En el caso dearriba, debe cam biar indu da ble mente la segunda constante, WM_CHAR porWM_KEYDOWN.

Infor ma ción adi cio nalPara más infor ma ción, con sulte la uni dad de Mes sa ges de Del phi. Tam biéncon sulte “Dupli cate dyna mic met hod index”.

Duplicate resourcePo si ble cau sa de error

1. Puede tener una uni dad o una clase en una uni dad que tiene el mismonom bre de una uni dad o clase ya exis tente en el ámbito visi ble del pro-grama. Podría ser una uni dad de Del phi o una uni dad pro pia que tengadupli cada.

2. Puede que esté uti li zando com po nen tes que ten gan los mis mos nom bres derecur sos en sus archi vos .DCR.

Mensajes de error 197

Page 232: Dsp

3. Puede haber inten tado aña dir manual mente un recurso al archivo .RES delpro yecto.

So lu ción rá pi da1. Loca lice la uni dad o nom bre de clase dupli cado y renóm brelo. Para hacer

esto en el caso de una uni dad, 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 edítelo directamente enla ventana de código.

2. Si los com po nen tes son suyos o si dis pone de su código fuente, revise losarchi vos .DCR para deter mi nar qué ele men tos tie nen el mismo nom bre.Renom bre uno de los recur sos e intén telo de nuevo. Para renom brar uno delos recur sos uti li zando el Edi tor de Imá ge nes de Del phi (Image Edi tor),siga estos pasos:a. Seleccione Tools | Image Edi tor.b. Seleccione File | Open.c. Navegue hasta el archivo de recursos (.DCR) y ábralo.d. En la vista de árbol, navegue hasta el elemento que desea renombrar.

e. Con el elemento seleccionado, pulse con el botón derecho del ratónsobre él y seleccione la opción 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 aña dir recur sos adi cio na les, uti lice un archivo de recur sosseparado, dán dole un nom bre que no entre en con flicto con el nom bre delpro yecto o cual quiera de los nom bres de uni dades. Añada su archivo derecursos per so na li zado a Del phi. Por ejem plo, para aña dir un archivo derecursos que haya creado con el nom bre Wha te ver.RES, intro duzca unalínea como:

{$R Wha te ver.Res}

Infor ma ción adi cio nal1. Reduzca el tamaño de las cláu su las Uses, eliminando de ellas cual quier

uni dad que no sea nece sa ria.3. El archivo de recur sos del pro yecto, que es creado auto má ti ca mente por

Del phi, no se debe modi fi car. Con sulte “ERes Not Found”.

Si todo lo ante rior falla, intente borrar todos los archi vos *.DSM, *.DOF y*.DSK.

Con sulte “Error Crea ting Form: Dupli cate resource [Type:,Name:]”.

198 Los Tomos de Delphi: Delphi sin problemas

Page 233: Dsp

Duplicate session name <>Po si ble cau sa de error

Puede haber asig nado el mismo valor a la pro pie dad Ses sion Name de dos com-po nen tes TSes sion.

So lu ción rá pi daAsigne un nom bre de sesión único a cada com po nente TSes sion. Del phi puedeencar garse de esto auto má ti ca mente si asigna el valor True a la pro pie dadAuto Ses sion Name.

Infor ma ción adi cio nalNor mal mente no es nece sa rio aña dir un com po nente TSes sion a las apli ca cio-nes de base de datos. Un com po nente TSes sion es creado auto má ti ca mente pordefecto (de forma simi lar al com po nente TDa ta base). Pero si crea apli ca cio nesmulti-hilo o si está uti li zando tablas Para dox que resi den en varios luga res deuna red, puede arras trar com po nen tes TSes sion adi cio na les sobre el for mu la rioo módulo de datos para faci li tar el tra bajo en tales cir cuns tan cias.

Duplicate Tag ValuePo si ble cau sa de error

Puede haber decla rado un regis tro variante que se refiere al mismo valor en lasec ción Case más de una vez. Por ejem plo, lo siguiente gene rará este men sajede error, ya que True ha sido espe ci fi cado dos veces:

Type TPro gram mer = re cord Firs tNa me, Last Na me: string[40]; Da teOf Firs tHe llo WorldPro gram: TDa teTime; case Bor land Tools: Boo lean of True: (Bor land Con fe ren cesA tten ded: Inte ger); True: (Fron tal Lo bo to miesU nder go ne: Inte ger); end;

So lu ción rá pi daCam bie la segunda apa ri ción de True por False.

Infor ma ción adi cio nalNo con funda los regis tros varian tes con el tipo de datos Variant.

Mensajes de error 199

Page 234: Dsp

Dynamic method or message handler not allowed herePo si ble cau sa de error

Puede haber espe ci fi cado un método de ges tión de men saje o un método diná-mico como método de acceso de lec tura o escri tura de una pro pie dad. Por ejem-plo, cual quiera de las decla ra cio nes siguien tes gene rará este men saje de error:

pri va te func tion Dyna mo: Inte ger; dyna mic; pro ce du re wmu ser chan ged(var Mes sa ge: TMes sa ge); mes sa ge WM_USERCHANGED;. . .pu blis hed pro perty prop wash: in te ger read dyna mo; pro perty im pro per: in te ger wri te wmu ser chan ged;type IMPei = in ter fa ce func tion Acces sor: IMPei; dyna mic; pro perty IMPei: IMPei read Acces sor im ple ments IWhatF la vor;end;

So lu ción rá pi daSus ti tuya el método de acceso a la pro pie dad por un campo pri vado o unmétodo corriente. No uti lice méto dos de ges tión de men sa jes o méto dos diná mi-cos como méto dos de acceso para pro pie da des. Por ejem plo, podría reem pla zarel código de arriba por algo así:

pri va te FDyna mi te: Inte ger; pro ce du re SetP ro per(NewP ro per: Inte ger); . . .pu blis hed pro perty prop wash: in te ger read FDyna mi te; pro perty pro per: in te ger wri te SetP ro per;

-O-

Eli mine la direc tiva Dyna mic o Message.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “crea ting pro per ties” y “dyna mic met hods” enla ayuda de Del phi.

200 Los Tomos de Delphi: Delphi sin problemas

Page 235: Dsp

Dynamic method or message handlers not allowed in OLEautomation sections

Po si ble cau sa de errorPuede haber decla rado un método diná mico o de ges tión de men saje en unasec ción Auto ma ted de una clase. Por ejem plo, cual quiera de las siguien tesdecla ra cio nes gene rará este men saje de error:

au to ma ted pro ce du re dyna mo; dyna mic; pro ce du re wmvscroll clip board(var Mes sa ge: in te ger); mes sa ge WM_VSCROLLCLIPBOARD;

So lu ción rá pi daNo uti lice méto dos diná mi cos ni méto dos de ges tión de men sa jes en seccionesAuto ma ted.

Infor ma ción adi cio nalTra tar de decla rar un método de ges tión de men sa jes como éstos apa re cen nor-mal mente (con un pará me tro de tipo TMes sage, en lugar de Inte ger, como en elejem plo de arriba) pro voca el men saje de error “Ille gal type in OLE auto ma-tion sec tion: TMes sage being gene ra ted”.

EAccessViolationCon sulte “Access Vio la tion”.

EBitsErrorCon sulte “Bits Index out of Range”.

EClassNotFoundPo si ble cau sa de error

Puede haber modi fi cado direc ta mente un archivo .DFM de for mu la rio, y ahoraDel phi no puede hacer com pa ti ble el con te nido del archivo .DFM con elarchivo .PAS.

Mensajes de error 201

Page 236: Dsp

So lu ción rá pi daExa mine el archivo .DFM pul sando con el botón dere cho del ratón sobre el for-mu la rio y selec cio nando View As Text del menú de con texto. Veri fi que que lasdefi ni cio nes de objetos en la clase del for mu la rio coin ci den con lo que estárealmente en el for mu la rio.

Infor ma ción adi cio nalMuchos estu dian tes nova tos han expe ri men tado erro res de este tipo tra tandode encon trar el camino en el cam pus de la Uni ver si dad.

EComponentErrorPo si ble cau sa de error

1. Puede haberle dado a un com po nente un nom bre que no es único.2. Puede haberle dado a un com po nente un nom bre que no es válido.3. Puede estar inten tando lla mar al método Regis ter Com po nents fuera del

pro ce di miento Regis ter en una uni dad de com po nente.

So lu ción rá pi da1. Siem pre uti lice nom bres úni cos den tro de un espa cio de nom bres. Si la uni-

dad abc y la uni dad xyz con tie nen ambas un com po nente lla madoAlpha be tSoup, ten drán una con vi ven cia muy difí cil.

2. En Object Pas cal, los iden ti fi ca do res (como los nom bres de com po nen tes)deben empe zar con una letra o un guión bajo y cada carác ter subsiguientedebe ser una letra, un guión bajo o un dígito.

3. Llame sola mente a Regis ter Com po nents den tro del pro ce di miento Regis terde una uni dad de com po nente.

Infor ma ción adi cio nal3. El pro ce di miento Regis ter y su lla mada a Regis ter Com po nents son crea das

auto má ti ca mente cuando se uti liza el Asis tente para la crea ción de Com po-nen tes (Com po nent Wizard).

EConvertErrorPo si ble cau sa de error

Puede estar inten tando con ver tir un valor de un tipo de datos a otro, pero lacon ver sión no es posi ble tal como se ha int entado.

202 Los Tomos de Delphi: Delphi sin problemas

Page 237: Dsp

So lu ción rá pi daCon vierta sola mente tipos cuando el valor en cues tión pueda ser tra du cido ocon ver tido al otro tipo. Esto requiere que los tipos que están siendo con ver ti dosten gan una fun ción de con ver sión corres pon diente, y que el valor que va a sercon ver tido pueda ser repre sen tado en el tipo de datos de des tino. Por ejem plo,inten tar con ver tir un String a Boo lean no resul ta ría, ni tam poco el intento detra du cir un Float a un BLOb. Ade más, algu nas veces el tipo de con ver sión esacep ta ble, pero el valor en sí no lo es. Por ejem plo, inten tar con ver tir el valorde tipo String ‘Pars ley, Sage, Rose mary and Thyme’ a un valor de tipo TTimeno fun cio nará en nin gún caso; en rea li dad, gene rará este men saje de error. Sinembargo, con ver tir el valor de tipo String ‘10:09’ al tipo TTime uti li zando lafun ción de con ver sión StrTo Time fun cionará bien.

Infor ma ción adi cio nalEste es un tipo de error gené rico, que es dis pa rado cuando se pro duce un pro-blema durante el intento de con ver tir de un tipo de datos a otro.

Puede uti li zar la clase de excep ción ECon vertError como herra mienta de vali-da ción de datos. Por ejem plo, para veri fi car que una fecha intro du cida por elusua rio es válida antes de alma ce narla, podría hacer algo así:

try DayT rip Day := StrTo Da te(Edit1.Text);ex cept on ECon vertError do Mes sa geDlg('El va lor in tro du ci do no es una fe cha vá li da’, mtError, mbOK, 0);end;

EDatabaseErrorPo si ble cau sa de error

1. Puede haber inten tado eje cu tar una apli ca ción que nece sita el BDE sobreuna máquina que no tiene el BDE ins ta lado.

2. Puede haber asig nado el valor True a la pro pie dad Requi red de un campoautoin cre men tal.

So lu ción rá pi da1. Es nece sa rio dis tri buir el BDE con las apli ca cio nes de Del phi que lo nece si-

ten. Puede con sul tar los deta lles en C:\Archi vos de pro grama\Bor land\Del phi X\deploy.txt.

2. El valor de un campo Autoin cre ment es asig nado por el motor de base dedatos durante la gra ba ción (post) del regis tro. A los campos obli ga to rios seles debe asig nar valor antes de inten tar su gra ba ción.

Mensajes de error 203

Page 238: Dsp

Infor ma ción adi cio nalPuede haber una segunda parte para este men saje de error, como “An erroroccu rred while attemp ting to ini tia lize the Bor land Data base Engine”.En tales casos, bus que el men saje de error espe cí fico en este libro.

EDivByZeroCon sulte “Divi sion by zero”.

EFCreateErrorPo si ble cau sa de error

Puede haber dado a un archivo un nom bre invá lido.

So lu ción rá pi daUti lice nom bres de Object Pas cal váli dos para todos los iden ti fi ca do res. Losnom bres deben comen zar con una letra o un guión bajo, y a con ti nua ción tenersólo letras, guio nes bajos y dígitos.

Infor ma ción adi cio nalEsta excep ción es des cen diente de EStreamE rror, la clase base de todas lasexcep cio nes rela cio na das con flujos.

EFilerErrorPo si ble cau sa de error

Puede haber inten tado regis trar una clase ante el sis tema de flu jos (strea ming)uti li zando el pro ce di miento Regis terC lass cuando ya había una clase dife renteregis trada con el mismo nom bre.

So lu ción rá pi daAse gú rese de que todas las cla ses que cree sean úni cas, no sola mente en fun-cio na li dad, decla ra ción e imple men ta ción, sino tam bién en el nom bre.

Infor ma ción adi cio nalInten tar regis trar la misma clase más de una vez a tra vés de una lla mada aRegis terC lass no oca siona pro ble mas; el segundo intento es sim ple mente igno-rado. Dife ren tes cla ses con un mismo nom bre, sin embargo, pro vo can error.

204 Los Tomos de Delphi: Delphi sin problemas

Page 239: Dsp

Este error es la clase base de los siguien tes des cen dien tes: EClass Not Found,EInva lidI mage, EMet hod Not Found y EReadE rror.

EGPFaultCon sulte “Access Vio la tion”.

EInOutErrorPo si ble cau sa de error

Puede haber inten tado aña dir datos a un archivo que no existe.

So lu ción rá pi daEvite este error com pro bando si el archivo existe, y creán dolo en caso de queno exista, así:

var tF: Text Fi le; {o sT: System.Text}be gin Assign Fi le(tF,'True Fun.txt'); if Fi leE xists('True Fun.txt') then Append(tF) else Rew ri te(tF); . . .

-O-

var sT: System.Text; {o tF: Text Fi le}be gin Assign Fi le(sT,'SoT rue.txt'); try System.Append(sT) ex cept on EInOutE rror do Rew ri te(sT); end; . . .

Puede tam bién pro te gerse con tra excep cio nes EInOutE rror al cerrar los archi-vos (que no se puedan gra bar) así:

pro ce du re TForm1.Clo se But tonC lick(Sen der: TObject);be gin . . . try

Mensajes de error 205

Page 240: Dsp

Clo se Fi le(glo bal Log); ex cept on EInOutE rror do if Mes sa geDlg( 'Pro ble ma al gra bar el ar chi vo. Sa lir de to das for mas?', mtError, [mbYes,mbNo], 0) = mrNo then Exit; {sale del pro ce di mien to, no del pro gra ma} end; end; . . .

Infor ma ción adi cio nalPara que EInOutE rror esté dis po ni ble, debe tener acti vada la direc tiva de com-pi la ción de veri fi ca ción de entrada/salida (I/O), ya sea en el entorno inte gradode Del phi o en el código fuente. Para acti varla desde el entorno inte grado deDel phi, siga estos pasos:1. Selec cione Pro ject | Options. . . .2. Selec cione la pes taña Com pi ler.3. Mar que la casi lla I/O chec king en la sec ción Run time Errors.4. Pulse el botón OK.

Para habi li tar la veri fi ca ción de Entrada/Salida en el código, añada la directiva{$I+} o {$IOCHECKS ON} en la parte supe rior de la uni dad en la que deseaacti var la veri fi ca ción de Entrada/Salida. Esto no es nece sa rio hacerlo a menosque haya des ha bi li tado la opción anteriormente, ya que por defecto estáhabi li tada.

EIntOverflowCon sulte “Arith me tic Over flow Error”.

EInvalidCastCon sulte “Inva lid type cast”.

EInvalidGraphicPo si ble cau sa de error

Puede haber inten tado car gar un archivo que no es un .BMP, .ICO o .WMF enun objeto que espera un grá fico válido de Del phi. Por ejem plo, las dos líneassiguien tes gene ra rían este error, ya que .JPG y .GIF no son for ma tos grá fi cosnati vos de Del phi:

206 Los Tomos de Delphi: Delphi sin problemas

Page 241: Dsp

Ima ge1.Pic tu re.LoadF rom Fi le('Kan ga roo.jpg');Ima ge1.Pic tu re.LoadF rom Fi le('Choosy Mot hers Choo seSkipp yNot.gif');

So lu ción rá pi daCar gue úni ca mente mapas de bits (.BMP), ico nos (.ICO) y metaar chi vos (.EMFy .WMF) en obje tos TPic ture.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “TImage”, “TPic ture”, “TGrap hic”, “TBit map”,“TIcon”, y “TMe ta file” en la ayuda de Del phi.

EInvalidGraphicOperationPo si ble cau sa de error

Puede haber inten tado eje cu tar una ope ra ción invá lida sobre un objeto grá fico.Por ejem plo, inten tar redi men sio nar un icono gene ra ría este error:

Ima ge1.Pic tu re.Icon.Height := 36;

So lu ción rá pi daNo intente modi fi car el tamaño por defecto de un icono, que es de 32 x 32píxeles para ico nos con ven cio na les y 16 x 16 píxeles para ico nos peque ños.

Infor ma ción adi cio nalPara más infor ma ción, con sulte el men saje de error “Can not change the sizeof an icon”.

EInvalidOpCon sulte “Inva lid floa ting point ope ra tion”.

EInvalidOperation: Cannot create form. No MDI forms are currentlyactive

Con sulte “Can not create form. No MDI forms are currently active”.

EInvalidOperation: Cannot make a visible window modalCon sulte “Can not make a visi ble win dow modal”.

Mensajes de error 207

Page 242: Dsp

EInvalidPointerCon sulte “Inva lid poin ter ope ra tion”.

Element 0 Inaccessible—use Length or SetLengthPo si ble cau sa de error

Puede estar inten tando acce der al ele mento 0 de una varia ble de tipo String enDel phi de 32 bits. Por ejem plo, el siguiente intento de alma ce nar el ele mentode índice 0 en la varia ble de tipo Byte LengthByte Con tents gene rará este men-saje de error:

pro ce du re Bight;var s : String; LengthByte Con tents : Byte;be gin s := 'Cheese'; LengthByte Con tents := s[0];end;

El siguiente intento de asig nar un valor al ele mento 0 tam bién gene rará estemen saje de error:

pro gram Pro du ce;var s: String; LengthByte Si ze: Inte ger;be gin LengthByte Si ze := 25; s[0] := LengthByte Si ze;end;

So lu ción rá pi daUti lice la fun ción Length y el pro ce di miento Set Length para lle var a cabo lamisma tarea en Del phi de 32 bits. Para alma ce nar la lon gi tud de una varia blede cadena en una varia ble entera, haga esto:

pro ce du re FindString Length;var s : String; StrLength : Inte ger;be gin s := 'How MuchIsThatPCInThe Win dow'; StrLength := Length(s);end;

Para asig nar la lon gi tud de la cadena, haga esto:

208 Los Tomos de Delphi: Delphi sin problemas

Page 243: Dsp

pro ce du re SetS tring Length(s: String; ANum ber: Inte ger);be gin Set Length(s, ANum ber);end;

Infor ma ción adi cio nalEl tipo de cadena nativo en Del phi de 32 bits no alma cena la lon gi tud de lacadena en el ele mento 0, como es el caso en Turbo Pas cal y Del phi 1. Esta es larazón por la cual inten tar obte ner o asig nar la lon gi tud de la cadena a tra vésdel ele mento 0 no fun ciona y no está per mi tido.

Sí puede asig nar cual quier ele mento válido de una cadena (con índice dis tintode 0) a otra cadena, por ejem plo:

var s,t: string;be gin s := 'Are you just strin ging me along?'; t := s[1];end;

END expected but <> foundPo si ble cau sa de error

Puede haber aña dido algo sobrante a una sen ten cia, como un parén te sis dere-cho donde no es nece sa rio.

So lu ción rá pi daEli mine el ele mento que causa el pro blema.

Infor ma ción adi cio nalPodría usted pre gun tarse por qué el men saje de Del phi no es “; expec ted but<> found”. Delante de la pala bra reser vada End, el punto y coma es inne ce sa-rio (aun que ino fen sivo); por lo tanto, el com pi la dor no lo espera.

END expected but implementation foundPo si ble cau sa de error

Puede haber omi tido el End que era nece sa rio para ter mi nar una decla ra ciónde tipo en la parte Inter face de una unidad.

Mensajes de error 209

Page 244: Dsp

So lu ción rá pi daTer mine la decla ra ción de tipo con la pala bra reser vada End.

Infor ma ción adi cio nalUna decla ra ción de tipo debe tener la siguiente estruc tura:

type Wha te ver You Want = class FWha te ver You Want: Boo lean; pro ce du re Wha te ver You Say(wid get: Inte ger); end; {¡no ol vi de este End al fi nal!}

END. missing at end of modulePo si ble cau sa de error

1. Puede que no haya con cor dan cia entre los pares Begin y End.2. Puede haber olvi dado aña dir la pala bra reser vada End al final de una sen-

ten cia Case, un blo que Try. . . Finally o un blo que Try. . . Except.3. Puede haber en rea li dad un End final, pero el com pi la dor no puede verlo

por alguna razón. Por ejem plo, puede haber dejado una llave abierta ({ ) enel código en algún lugar, que está cau sando que todo lo que está des pués deél sea con si de rado como un comen ta rio, ya que no existe una llave dere cha( }) corres pon diente para cerrar la sec ción de comen ta rio.

So lu ción rá pi da1. Ase gú rese de que cada Begin tiene su End corres pon diente.2. Añada End a cada sen ten cia Case y blo que Try. . . Finally y Try. . . Except.3. Si tiene una llave izquierda ({ ) sin pareja, eli mí nela si no desea comen tar

nada, o añada una llave dere cha ( }) al final de la sec ción que deseacomen tar.

Infor ma ción adi cio nalPuede tam bién comen tar código en Del phi de 32 bits con los dos barras alestilo de C++. Por ejem plo:

//Este es un co men ta rio. Expli que el có di go aquí.

Acons túm brese a aña dir un End tan pronto como codi fi que un Begin, una sen-ten cia Case, un blo que Try. . . Finally o un blo que Try. . . Except. Luego vuelvaatrás y rellene el con te nido de la sen ten cia. Tam bién, indente el código de talmanera que los blo ques Begin. . . End se pue dan dife ren ciar visual mente y seafácil deter mi nar qué Begin corres ponde a un End determinado.

210 Los Tomos de Delphi: Delphi sin problemas

Page 245: Dsp

A par tir de Del phi 3 están dis po ni bles las plan ti llas de código (code tem pla tes).Con sulte “code tem pla tes” en la ayuda de Del phi para más deta lles, o selec-cione Tools | Envi ron ment Options, y la página Code Insight. La sec ciónCode Tem pla tes mues tra una lista de plan ti llas pre de fi ni das y una ven tanaque las des pliega. Por ejem plo, la plan ti lla de código pre de fi nida tryf es lasiguiente:

try |fi nallyend;

La barra ver ti cal mues tra dónde se ubi cará el cur sor des pués de uti li zar estaplan ti lla de código — exac ta mente en donde debe empe zar a codi fi car el blo queTry. . . Finally.

Para uti li zar una plan ti lla de código, siga estos pasos:1. En la ven tana de código, pulse Ctrl + J.2. Selec cione de la lista la plan ti lla de código que desee.3. Pulse la tecla Intro.

EOLEErrorCon sulte “Class not regis te red”.

EOLEExceptionCon sulte “OLE error 800A03EC”.

EOleSysClass not RegisteredCon sulte “Class not regis te red”.

EOleSysErrorCon sulte “Error loa ding type library/dll”.

Mensajes de error 211

Page 246: Dsp

EOleSysOperation UnavailablePo si ble cau sa de error

Puede estar lla mando a un método de un ser vi dor de auto ma ti za ción OLE queno está eje cutándose. Por ejem plo, lo siguiente gene rará este error si Word noestá eje cu tán dose en el momento de la lla mada:

pro ce du re TForm1.Start That Hog(Sen der: TObject);var Ova ri: Ole Va riant;be gin Ova ri := GetA cti veO leOb ject('Word.Ba sic'); Ova ri.Fi le New; Ova ri.Insert('OLE! Mue re la tar de’);end;

So lu ción rá pi daAse gú rese de que el ser vi dor de auto ma ti za ción está eje cu tán dose antes deinten tar acce der a sus méto dos. Puede hacerlo mediante el métodoCrea teOLEObject:

pro ce du re TForm1.Start That Hog(Sen der: TObject);var Ova ri: Ole Va riant;be gin Ova ri := Crea teOLEObject('Word.Ba sic'); Ova ri.Fi leO pen('Sun Num Tu'); Ova ri.Insert('Kel vin Ca leb Mor de cai Shan non');end;

Infor ma ción adi cio nalSi va a uti li zar un ser vi dor de auto ma ti za ción más de una vez en la apli ca ción,puede evi tar múl ti ples car gas y des car gas del ser vi dor decla rando a nivel glo-bal una varia ble de tipo Ole Va riant e ins tan cián dola en el evento OnCreate delfor mu la rio.

EOutOfMemoryPo si ble cau sa de error

Puede haber inten tado reser var más memo ria de la que está dis po ni ble.

212 Los Tomos de Delphi: Delphi sin problemas

Page 247: Dsp

So lu ción rá pi daSi es posi ble, equipe su orde na dor con al menos 32 MB de RAM. Mantengalibre al menos el 10 por ciento del disco duro vacío, de manera que pueda seruti li zado para memo ria vir tual.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “out of memory” en la ayuda de Del phi.

EOutOfResourcesPo si ble cau sa de error

1. Puede estar (direc ta mente o indi rec ta mente) inten tando crear un mane ja-dor (handle) de ven tana, pero la can ti dad máxima de mane ja do res ya estásiendo uti li zada.

2. Una fun ción de la API de Win dows que ha lla mado directa o indi rec ta-mente puede haber fallado.

3. A pesar del men saje, puede haber un error en el con tro la dor de pan ta llaque está uti li zando, espe cí fi ca mente si está ope rando en modo avan zado(32 KB ó 64 KB colo res).

So lu ción rá pi da1. Man tenga el número de con tro les de ven tana (cla ses des cen dien tes de

TWin Con trol) en un mínimo. Uti lice con tro les grá fi cos donde sea posi ble(ya que no requieren un mane ja dor de Windows). Cree los for mu la riosdiná mi ca mente siem pre que sea posible.

2. Con sulte la ayuda de la API Win32 (Win32.HLP) que viene con Del phipara obte ner más infor ma ción sobre la lla mada par ti cu lar. Si no le aclarasufi cien te mente, podría con si de rar com prar Los Tomos de Del phi: Núcleodel API Win32 (edi tado por Dany soft Inter na cio nal,que puede encon trar enwww.dany press.com).

3. Cam bie al con tro la dor VGA están dar de Win dows, o a un modo menospotente de su con tro la dor. Si no sabe cómo hacerlo, con sulte la docu men ta-ción de Win dows.

Infor ma ción adi cio nal2. Un ejem plo de esto es una lla mada a Get De vi ce Con text de TWin Con trol,

que a su vez llama a la fun ción GetDC de la API de Win dows.

Mensajes de error 213

Page 248: Dsp

Nota: Para conservar los recursos:

Mueva tantos formularios como sea posible de la lista Auto-Create a la listaAvail able.

Siempre que sea posible, utilice componentes gráficos en lugar de componentes deventana. Los componentes gráficos no necesitan un controlador de ventana. Porejemplo, si desea mostrar una cadena de texto de sólo lectura, utilice un TLabel enlugar de un control TEdit.

ERangeErrorCon sulte “Range check error”.

EReadErrorPo si ble cau sa de error

Los archi vos .PAS y .DFM no están sin cro ni za dos. Espe cí fi ca mente, el archivo.DFM puede con te ner una refe ren cia a algo que no existe en el archivo .PAS.

So lu ción rá pi daBorre las refe ren cias a los méto dos o pro pie da des que haya borrado del archivode uni dad (.PAS) que exis tan en el archivo de for mu la rio (.DFM).

Infor ma ción adi cio nalSi borra un ges tor de even tos exis tente, Del phi le pre gun tará cuando com pile“The <> met hod refe ren ced by <>.<> does not exist. Remove the refe-rence?” Si selec ciona No, obten drá este error. Al selec cio nar Yes, el métodoBut ton1 Click (o cual quier método o pro pie dad que haya borrado) será eli mi-nado tam bién del archivo de for mu la rio (.DFM).

Con sulte “Inva lid pro perty value” o “Error rea ding <>.<>: <>”(dependiendo del men saje de error espe cí fico que acom pañe al men saje de errorgené rico EReadE rror).

ERegistryExceptionPo si ble cau sa de error

Puede haber lla mado a Read Bi nary Data y asig nado un tamaño muy pequeñoal argu mento Buf fer.

214 Los Tomos de Delphi: Delphi sin problemas

Page 249: Dsp

So lu ción rá pi daIncre mente el tamaño del argu mento Buf fer.

Infor ma ción adi cio nalEncie rre la ope ra ción en una sen ten cia Try. . . Finally para libe rar el objetoTRe gistry en caso de una excep ción.

Con sulte “Fai led to get data for <>”.

EResNotFoundPo si ble cau sa de error

1. Puede haber borrado o modi fi cado la direc tiva de recur sos {$R *.DFM} delarchivo del for mu la rio.

2. Puede haber cam biado el nom bre del for mu la rio prin ci pal en el código.3. Puede estar inten tando car gar recur sos pro pios, pero ha olvi dado aña dir

{$R <Nom breAr chivo>.RES} en el archivo de pro yecto.

So lu ción rá pi da1. Res taure la direc tiva {$R *.DFM} en el archivo de uni dad del for mu la rio

(.PAS). Si no tiene una cláu sula Uses en la sec ción Imple men ta tion, debeubi car la direc tiva detrás de la pala bra reser vada Imple men ta tion, así:

im ple men ta tion{$R *.DFM}

Si tiene una cláu sula Uses en la sec ción Imple men ta tion, la direc tiva {$R}debe apa re cer des pués de la cláu sula Uses, así:

im ple men ta tionUses ItsNog gin, Ti me Wi sely, HardlyAnyOil;{$R *.DFM}

2. Aun que puede hacerlo, es mejor evi tar cam biar los nom bres de los obje tosdirec ta mente en el código.

3. Añada {$R <Nom breAr chivo>.RES} en el archivo de pro yecto (.DPR).

Infor ma ción adi cio nalLa direc tiva {$R *.DFM} enlaza el archivo de for mu la rio (.DFM) con el archivode uni dad (.PAS). Es una parte nece sa ria en toda uni dad de for mu la rio. Unauni dad “pura” (creada con New | Unit en lugar de New | Form) no con tieneninguna direc tiva {$R *.DFM}, y su con te nido ini cial es mínimo:

unit Unit2;

Mensajes de error 215

Page 250: Dsp

in ter fa ce {Una “uni dad pura“: 1) No con tie ne nin gu na sec ción Uses con mu chas uni da des aña di das au to má ti ca men te, como en el caso de una uni dad de for mu la rio. 2) No con tie ne nin gu na de cla ra ción de tipo añadida au to má ti ca men te, como en el caso de una uni dad de for mu la rio. 3) No con tie ne nin gu na ins tan cia de va ria ble añadida automáticamente, como en el caso de una uni dad de for mu la rio}

implementation {4) No con tie ne nin gu na di rec ti va {$R *.DFM} aña di da au to má ti ca men te, como en el caso de una uni dad de for mu la rio}end.

Si todo lo ante rior falla, com pare el archivo de for mu la rio (.DFM) con elarchivo de uni dad (.PAS) y ase gú rese de que todos los com po nen tes, pro pie da-des y méto dos decla ra dos estén pre sen tes en ambos. Para ver el archivo de for-mu la rio .DFM como un texto, pulse con el botón dere cho del ratón sobre elfor mu la rio en tiempo de diseño y selec cione la opción View as Text del menúde con texto. Cuando haya fina li zado de ver el archivo .DFM, rea lice el pro cesoinverso (pulse con el botón dere cho del ratón sobre la ven tana de código yselec cione View as Form del menú de con texto).

Error 0: RLINK32 Error opening file <TypeLibrary>.tlbPo si ble cau sa de error

Puede estar inten tando crear un ser vi dor de auto ma ti za ción, Acti ve Form o con-trol Acti veX y sus DLLs de OLE son anti guas.

So lu ción rá pi daInstale el Inter net Explo rer desde el CD de Del phi, o copie las DLLs direc ta-mente desde \RunI mage\Del phi X\Win dows\System32.

Infor ma ción adi cio nalCon sulte “Could not load RLINK32.DLL”.

Error 2—File not foundCon sulte “File <> not found”.

Error 4—Too many open filesCon sulte “Too many open files”.

216 Los Tomos de Delphi: Delphi sin problemas

Page 251: Dsp

Error 68—Circular Unit ReferenceCon sulte “Cir cu lar Unit Refe rence”.

Error 76—Constant out of rangeCon sulte “Cons tant out of range”.

Error 94—“.” ExpectedCon sulte “ “.” Expec ted”.

Error 101—Disk write errorCon sulte “Disk write error”.

Error 102—File not assignedCon sulte “File not assig ned”.

Error 103—File not openCon sulte “File not open”.

Error 104—File not open for inputCon sulte “File not open for input”.

Error 105—File not open for outputCon sulte “File not open for out put”.

Error 200—Division by zeroCon sulte “Divi sion by zero”.

Mensajes de error 217

Page 252: Dsp

Error 201—Range check errorCon sulte “Range check error”.

Error 202—Stack overflow errorCon sulte “Stack over flow”.

Error 203—Heap overflow errorCon sulte “EOutO fMe mory”.

Error 204—Invalid pointer operationCon sulte “Inva lid poin ter ope ra tion”.

Error 207—Invalid floating point operationCon sulte “Inva lid floa ting point ope ra tion”.

Error 210—Abstract Method ErrorCon sulte “Abstract Met hod Error”.

Error 215—Arithmetic overflow errorCon sulte “Arith me tic Over flow Error”.

Error 216—Access ViolationCon sulte “Access Vio la tion”.

Error 219—Invalid TypecastCon sulte “Inva lid type cast”.

218 Los Tomos de Delphi: Delphi sin problemas

Page 253: Dsp

Error 220—Invalid Variant TypecastCon sulte “Inva lid variant type con ver sion”.

Error 227—Assertion failedCon sulte “Asser tion fai led”.

Error Creating Cursor HandlePo si ble cau sa de error

Este error nor mal mente ocu rre cuando Del phi no recibe un con junto resul tadocuando lo está espe rando.1. Puede haber inten tado asig nar el valor True a la pro pie dad Active de un

com po nente TQuery o lla mar a su método Open mien tras la pro pie dad SQLdel TQuery con te nía una sen ten cia SQL que no devuelve un con junto resul-tado (en otras pala bras, no una sen ten cia SELECT, sino una sen ten ciaINSERT, UPDATE o DELETE).

2. Puede haber inten tado asig nar el valor True a la pro pie dad Active de uncom po nente TSto redP roc o lla mar a su método Open mien tras no tenía unvalor asig nado a la pro pie dad Sto redP roc Name.

So lu ción rá pi da1. Si está uti li zando un com po nente TQuery y la sen ten cia SQL no es una

sen ten cia SELECT, uti lice el método ExecSQL en lugar del método Open.Por ejem plo, si el com po nente TQuery se llama Query1, uti lice:

Query1.ExecSQL;

en lugar de:

Query1.Open;

2. Asigne un valor a la pro pie dad Sto redP roc Name antes de inten tar asig narTrue a la pro pie dad Active o lla mar a su método Open. La pro pie dad Data-Ba se Name debe estar asig nada a un alias que des criba una base de datosde ser vi dor SQL, como Inter Base, Ora cle, MS SQL Ser ver, Sybase, Infor-mix, etc. Los pro ce di mien tos alma ce na dos no son una carac te rís tica de lasbases de datos de escri to rio como Para dox, dBASE, MS Access, etc.

Infor ma ción adi cio nal2. Los pro ce di mien tos alma ce na dos son sen ten cias SQL com pi la das que se

eje cu tan en el ser vi dor. Son mucho más rápi das que una sen ten cia SQL

Mensajes de error 219

Page 254: Dsp

local, y son una de las ven ta jas prin ci pa les de las bases de datos SQL sobrelas bases de datos loca les (de escri to rio).

Error creating form: access violation at. . . vcl[30,40,50,60]Po si ble cau sa de error

Puede haber cam biado el nom bre del for mu la rio en el código, así:

pro ce du re ChChChChChan ges;be gin Form1.Name := 'wha te ver';end;

So lu ción rá pi daNo cam bie el nom bre del for mu la rio prin ci pal en tiempo de eje cu ción. Si quierecam biar el nom bre del for mu la rio, hágalo en tiempo de diseño.

Infor ma ción adi cio nal¿Cómo se sen ti ría si un miem bro de su fami lia fuera por ahí cam bián dose elnom bre en oca sio nes supues ta mente alea to rias?

Error creating form: Ancestor for “<>” not foundPo si ble cau sa de error

Puede estar uti li zando heren cia visual de for mu la rios y no haber incluido todoslos for mu la rios ances tros en su pro yecto.

So lu ción rá pi daAñada los for mu la rios ances tros al pro yecto uti li zando Pro ject | Add toPro ject.

Infor ma ción adi cio nalOtra solu ción con siste en abrir los for mu la rios ances tros en el edi tor antes deabrir los for mu la rios des cen dien tes.

220 Los Tomos de Delphi: Delphi sin problemas

Page 255: Dsp

Error Creating Form: Cannot inherit from form <>. Contains acomponent <> that does not support inheritance

Po si ble cau sa de errorUti li zando la heren cia visual de for mu la rios en Del phi de 32 bits, puede haberinten tado here dar de un for mu la rio que con tiene un com po nenteTTab bed No te book.

So lu ción rá pi daSus ti tuya el TTab bed No te book por un TPa ge Con trol.

Infor ma ción adi cio nalSola mente obten drá este error en Del phi de 32 bits (Del phi 1 no soporta laheren cia visual de for mu la rios). Del phi de 32 bits pro por ciona el com po nenteTPa ge Con trol, que puede ser uti li zado en lugar del com po nenteTTab bed No te book.

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

Po si ble cau sa de errorPuede haber inten tado here dar de un for mu la rio del pro yecto actual que con-tiene un com po nente con la pro pie dad Name en blanco.

So lu ción rá pi daAse gú rese de que todos los com po nen tes tie nen nom bre. Del phi sólo per mitetener un com po nente sin nom bre hasta que se intente hacer refe ren cia a él, yasea directa o indi rec ta mente.

Infor ma ción adi cio nalDel phi 2 intro dujo la heren cia visual de for mu la rios. Incluso en Del phi 1, unfor mu la rio podía here darse de un ances tro, pero esto tenía que hacersemediante código. En Del phi de 32 bits, se puede here dar visual mente defor mu la rios.

Siga estos pasos para crear un for mu la rio ances tro:1. Cree un for mu la rio que incor pore todos los ele men tos comu nes que desee

incluir en los for mu la rios des cen dien tes.

Mensajes de error 221

Page 256: Dsp

Si sólo quiere que el for mu la rio esté dis po ni ble para el pro yecto actual, nonece sita hacer nada más. El for mu la rio ances tro está dis po ni ble auto má ti-ca mente para ser here dado.Si quiere que el for mu la rio esté dis po ni ble para otros pro yec tos (y no sola-mente para el pro yecto actual), siga estos pasos adi cio na les:

2. Pulse el botón dere cho del ratón sobre el for mu la rio y selec cione Add ToRepo si tory.

3. Pro por cione un título para el for mu la rio en el cua dro de edi ción Title.4. Opcio nal mente, pro por cione una des crip ción en el cua dro de edi ción.5. Selec cione o intro duzca la página del Alma cén de Obje tos (Object Repo si-

tory) en la que quiere que apa rezca el for mu la rio en el cua dro decom bi na ción Page.

6. Opcio nal mente, intro duzca su nom bre en el cua dro de edi ción Aut hor.7. Opcio nal mente, selec cione un icono para repre sen tar el for mu la rio.8. Pulse el botón OK.

Para here dar de un for mu la rio, siga estos pasos:1. Selec cione File | New.2. Selec cione el for mu la rio del que desea here dar en la página del Alma cén

donde se encuen tre.

Si hereda de un for mu la rio que tiene un botón lla mado But ton1, el botón en elfor mu la rio here dado será exac ta mente el mismo botón ances tro (el único queestá en el for mu la rio del que está here dando). Todas las pro pie da des, inclu-yendo los ges to res de even tos, serán here da dos. Por ejem plo, si el for mu la rioances tro tiene un botón con la pro pie dad Cap tion asig nada a ‘Belly’, la pro pie-dad Tag asig nada a 7, y el siguente ges tor del evento OnClick:

pro ce du re TForm1.But ton1 Click(Sen der: TObject);be gin Clo se;end;

El botón del for mu la rio here dado tam bién ten drá la pro pie dad Cap tion igual a‘Belly’, la pro pie dad Tag igual a 7, y su ges tor del evento OnClick here dará delges tor del ances tro:

pro ce du re TForm2.But ton1 Click(Sen der: TObject);be gin in he ri ted;end;

222 Los Tomos de Delphi: Delphi sin problemas

Page 257: Dsp

Error creating form: Cannot open file <>.DFMPo si ble cau sa de error

Puede estar inten tando abrir un archivo .PAS, y su corres pon diente archivo defor mu la rio (.DFM) con tiene erro res, se ha dañado o no está en el mismo lugarque el archivo .PAS que está inten tando abrir.

So lu ción rá pi daLoca lice el archivo .DFM espe ci fi cado en el men saje de error y mué valo aldirec to rio donde reside el resto del pro yecto.

Si el archivo ya estaba en el mismo direc to rio que el resto del pro yecto, abra elarchivo .DFM con un edi tor de texto (como el Bloc de Notas) y com pruebe loserro res.

Infor ma ción adi cio nalEl archivo de for mu la rio (.DFM) es una repre sen ta ción tex tual del for mu la rio.Con tiene las defi ni cio nes de los obje tos que están sobre el for mu la rio, dóndeestán situa dos esos obje tos (sobre el for mu la rio) y los valo res de suspro pie da des.

Esta infor ma ción es alma ce nada para que el for mu la rio puede ser “recreado”cuando usted lo abra. Si el for mu la rio con tiene erro res, se ha dañado o ha sidomovido, Del phi no podrá abrir el for mu la rio para crearlo, ya que no sabrá cómoensam blarlo. El pro ceso mediante el cual se rea liza la gra ba ción y carga delfor mu la rio se conoce como “strea ming”.

Des pués de mos trar este men saje de error, el pro yecto, junto con el archivo.PAS corres pon diente (el código aso ciado al for mu la rio), será abierto. Sinembargo, cual quier intento de ver la repre sen ta ción visual del for mu la riofallará, ya que para ello es nece sa ria la infor ma ción con te nida en el archivo.DFM.

Error Creating Form: Duplicate resource [Type:,Name:]Po si ble cau sa de error

Puede estar car gando un pro yecto en una ver sión de Del phi ante rior a la quese uti lizó para com pi larlo. Por ejem plo, puede estar abriendo un pro yectocreado con Del phi 2 en Del phi 1.

So lu ción rá pi daPulse el botón OK, y luego Build All. Para cons truir todo en Del phi 1 y 2,selec cione Com pile | Build All. En Del phi 3, selec cione Pro ject | Build All.

Mensajes de error 223

Page 258: Dsp

En Del phi 4 o superior, Pro ject | Build <Proyecto>. Todas las uni da desserán recom pi la das para la ver sión actual de Del phi que esté eje cu tando.

Alter na ti va mente, puede borrar el archivo .RES del pro yecto (el archivo con elnom bre del pro yecto y exten sión .RES). La pró xima vez que com pile, el archivo.RES apro piado será recreado para la ver sión de Del phi que esté uti li zando.

Infor ma ción adi cio nalLos recur sos de 16 bits y de 32 bits son como el agua y el aceite — no se mez-clan. Es decir, no puede uti li zar recur sos de 16 bits en Del phi de 32 bits, nipuede uti li zar recur sos de 32 bits en Del phi de 16 bits (Del phi 1).

Con sulte “Dupli cate resource”.

Error Creating Form: Invalid Stream FormatPo si ble cau sa de error

Puede estar inten tando por tar una apli ca ción a una ver sión de Del phi ante riora la uti li zada cuando se com piló la apli ca ción por última vez.

So lu ción rá pi daUti lice la uti li dad de con ver sión de Del phi para con ver tir los archi vos de for-mu la rio (.DFM) en el pro yecto desde texto a la ver sión .DFM espe rada. Puedehacerlo siguiendo estos pasos:1. Abra el pro yecto con la ver sión de Del phi con la que creó el pro yecto. Si no

lo ha hecho antes, guarde los archi vos de for mu la rio en for mato bina rio(pul sando con el botón dere cho sobre el for mu la rio y des mar cando la opciónText DFM si está selec cio nada).

2. Com pile el pro yecto.3. Eje cute la ver sión de con vert.exe de la ver sión ante rior de Del phi a la

cual quiere “por tar hacía atrás” su apli ca ción. Por ejem plo, si quiere com pi-lar un pro yecto creado en Del phi 5 en Del phi 3, eje cute la uti li dad con vertque está por defecto ins ta lada en C:\Archi vos de pro grama\Bor land\Delp hi3\bin.

4. Abra una ven tana DOS y vaya al direc to rio que con tiene la uti li dad con vertde Del phi 3. Por ejem plo, para con ver tir los archi vos .DFM que resi den enun direc to rio deno mi nado Con vertMe a texto, intro duzca el comandoconvert C:\Con vertMe\*.dfm.Ahora ten drá ver sio nes .TXT de esos archi vos de for mu la rio.

5. Abra los archi vos de texto (con el Bloc de Notas, Word Pad u otro edi torcual quiera) y haga los cam bios nece sa rios. Por ejem plo, si el archivo de for-mu la rio con tiene refe ren cias a pro pie da des que no exis ten en la ver siónante rior de Del phi, elimínelas.

224 Los Tomos de Delphi: Delphi sin problemas

Page 259: Dsp

6. Con vierta los archi vos .TXT a .DFM uti li zando el mismo comando, reem-pla zando “dfm” por “txt”: con vert C:\Con vertMe\*.txt.Ahora ten drá una ver sión bina ria (*.DFM) de los archi vos de for mu la rio enel for mato espe rado por la ver sión ante rior de Del phi.

7. Copie los archi vos de for mu la rio a una ubi ca ción sepa rada y añada suscorres pon dien tes archi vos .PAS (y el .DPR). Ahora deberá poder abrir elpro yecto y eje cu tarlo en la ver sión ante rior de Del phi.

Infor ma ción adi cio nalDesde Del phi 5, los archi vos de for mu la rios pue den ser alma ce na dos comoarchi vos de texto o bina rios (antes de Del phi 5, eran bina rios sola mente).

Si un for mu la rio ha sido guar dado como archivo bina rio en Del phi 5 o supe rior,el pro blema es bási ca mente el mismo, pero el men saje de error es “Error rea-ding <>. Pro perty does not exist”. Si el for mu la rio ha sido gra bado comotexto (como se ha men cio nado, una opción dis po ni ble desde Del phi 5), obten dráeste men saje de error.

Con sulte “Error rea ding <>. Pro perty does not exist”.

Error creating ProcessPo si ble cau sa de error

Puede estar haciendo refe ren cia a DLLs en Win dows NT espe ci fi cando laexten sión (.DLL). Por ejem plo, lo siguiente gene rará este men saje de error enNT:

pro ce du re Ha waiian Punch; ex ter nal ‘pi neappl.DLL';

Aun que es la forma apro piada de hacerlo en otras ver sio nes de Win dows.

So lu ción rá pi daEn Win dows NT, haga la refe ren cia sin la exten sión .DLL. Por ejem plo, lasiguiente es la sin ta xis apro piada para Win dows NT:

pro ce du re Ha waiian Punch; ex ter nal ‘pi neappl';

Infor ma ción adi cio nalSi ésta no es la causa del pro blema, intente eje cu tar el pro grama fuera delentorno inte grado de Del phi. Win dows puede darle un men saje más deta llado,como el nom bre de la .DLL que nece sita.

Mensajes de error 225

Page 260: Dsp

Error Creating Variant ArrayPo si ble cau sa de error

Puede haber inten tado crear un array variante de cade nas uti li zando el tipo dedatos varS tring. Por ejem plo, lo siguiente gene rará este men saje de error:

pro ce du re TForm1.But ton1 Click(Sen der: TObject);var Ros ter: Va riant;be gin Ros ter := VarA rrayC rea te([0,40], varS tring); . . .

So lu ción rá pi daUti lice el tipo de datos varOLEStr para crear un array variante de cade nas,así:

pro ce du re TForm1.But ton1 Click(Sen der: TObject);var Ros ter: Va riant;be gin Ros ter := VarA rrayC rea te([0,3], varOLEStr);. . .

Infor ma ción adi cio nalPara más infor ma ción, con sulte “VarA rrayC reate” y “VarArrrayOf” en la ayudade Del phi.

Error Creating WindowPo si ble cau sa de error

Puede tener simul tá nea mente dema sia dos mane ja do res de ven ta nas.

So lu ción rá pi daNo hay real mente una solu ción rápida para esto. Eli mine cual quier con trolextraño que pueda tener. Vea en la sec ción de Infor ma ción Adi cio nal más abajoalgu nos tru cos para recu pe rar algu nos de los mane ja do res de ven tana que estéuti li zando.

Infor ma ción adi cio nalEste error es cau sado gene ral mente porque la apli ca ción está uti li zando todoslos mane ja do res de ven ta nas dis po ni bles. Cada con trol de ven tana (con tro les

226 Los Tomos de Delphi: Delphi sin problemas

Page 261: Dsp

que reci ben el foco de entrada — en otras pala bras, cla ses des cen dien tes deTWin Con trol) es un ven tana y requiere un mane jador de ven tana.

Uti lice con tro les grá fi cos (des cen dien tes de TGrap hic Con trol) siem pre que seaposi ble. Por ejem plo, uti lice com po nen tes TLa bel para mos trar texto en lugarde TEdit, y com po nen tes TBe vel en lugar de TPa nel si todo lo que nece sita espro veer una sepa ra ción visual entre dife ren tes áreas del for mu la rio.

Excep tuando al for mu la rio prin ci pal, cree tan tos for mu la rios como sea posi blediná mi ca mente; par ti cu lar mente aque llos que no nece sa ria mente esta ránabier tos durante toda la eje cu ción de la apli ca ción — por ejem plo, un cua dro dediá logo ‘Acerca de’.

Error debug setting hookPo si ble cau sa de error

Puede haber ter mi nado la eje cu ción de su apli ca ción de un modo anor mal, porejem plo pul sando Ctrl+F2.

So lu ción rá pi daCons truya la apli ca ción (uti li zando Pro ject | Build en lugar de Pro ject |Com pile o Run | Run (F9)).

Si esto no ayuda, borre todos los archi vos, excep tuando los de exten sión .DPR,.PAS, .DFM y .RES.

Infor ma ción adi cio nalDes pués de caí das par ti cu lar mente graves, es muy útil algu nas veces cerrarDel phi y luego reiniciarlo.

Error in CREATE INDEX statementPo si ble cau sa de error

Pro ba ble mente tiene un error de sin ta xis en una sen ten cia CREATE INDEXde SQL. Por ejem plo, lo siguiente gene rará este men saje de error:

with TADOQuery.Crea te(nil) do try Con nec tion := ADOCon nec tion1; SQL.Add('CREATE INDEX ORD_SEQ (ORDER_SEQUENCE) ON SCRIPTURES'); ExecSQL; fi nally Free; end;

Mensajes de error 227

Page 262: Dsp

So lu ción rá pi daUti lice la sin ta xis apro piada. En el ejem plo de arriba, sería:

with TADOQuery.Crea te(nil) do try Con nec tion := ADOCon nec tion1; SQL.Add('CREATE INDEX ORD_SEQ ON SCRIPTURES(ORDER_SEQUENCE)'); ExecSQL; fi nally Free; end;

En otras pala bras, la sin ta xis correcta en este caso es:

CREATE INDEX <Nom breIn di ce> ON <Nom bre Ta bla> (<Nom bre Cam po>)

Infor ma ción adi cio nalUti lice la refe ren cia del len guaje SQL de la base de datos que esté uti li zandopara deter mi nar la sin ta xis correcta. La sin ta xis es usual mente la misma paralas dis tin tas bases de datos, pero hay varia cio nes. Si no tiene o no puedeencon trar la docu men ta ción del SQL de la base de datos, puede inten tar bus carun ejem plo en su disco duro, o tam bién podría encon trar un ejem plo bus candoen Inter net (como www.tama racka.com o www.goo gle.com). Por ejem plo, en elcaso de arriba bus que “CREATE INDEX”.

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

Con sulte “Call to Appli ca tion.Crea te Form is mis sing or inco rrect”.

Error in module <>: CONTAINS clause is incorrectCon sulte “CONTAINS clause is inco rrect”.

Error in module <>: Declaration of class <> is missing or incorrectCon sulte “Decla ra tion of class <> is mis sing or inco rrect”.

Error in module <>: END. missing at end of moduleCon sulte “END. mis sing at end of module”.

228 Los Tomos de Delphi: Delphi sin problemas

Page 263: Dsp

Error in module <>: Implementation part USES clause incorrectCon sulte “Imple men ta tion part USES clause inco rrect”.

Error in module <>: Incorrect field declaration: class <>Con sulte “Inco rrect field decla ra tion: class <>”.

Error in module <>: REQUIRES clause is incorrectCon sulte “REQUIRES clause is inco rrect”.

Error in module <>: USES clause is missing or incorrectCon sulte “USES clause is mis sing or inco rrect”.

Error initializing BDE ($2B05)Po si ble cau sa de error

Puede estar inten tando eje cu tar una apli ca ción que nece sita el BDE en unamáquina que no tiene el BDE ins ta lado.

So lu ción rá pi daInstale el BDE. Con sulte el fichero “deploy.txt” en C:\Archi vos de pro grama\Bor land\Del phi X.

Infor ma ción adi cio nalCuando se ins tala Del phi, el BDE tam bién se ins tala. Puede fácil mente crearuna apli ca ción de base de datos con Del phi, y luego copiar el archivo .EXE eincluso los archi vos de base de datos a otra máquina, espe rando que todo fun-cio nará bien en la máquina donde la ha ins ta lado. Sin embargo, como la Solu-ción Rápida indica, esto no es sufi ciente.

Error loading type library/dllPo si ble cau sa de error

El archivo STDVCL[32,40].DLL no se encuen tra, está en el lugar equi vo cado ono está regis trado.

Mensajes de error 229

Page 264: Dsp

So lu ción rá pi daVeri fi que que STDVCL[32,40].DLL esté en \Win dows\System y haya sidoregis trado.

Infor ma ción adi cio nalPara regis trar ser vi do res en su sis tema, puede uti li zar la uti li dad ‘TurboRegis ter Ser ver’ (TRegSvr), que es un pro grama de demos tra ción de Del phiubi cado por defecto en C:\Archi vos de pro grama\Bor land\Del phi X\Demos\Acti veX\TRegSvr.

Para hacerlo, siga estos pasos:1. Abra el archivo TRegSvr.DPR.2. Cons truya el pro yecto.3. Active una sesión de DOS o abra una ven tana de DOS.4. Nave gue hasta el direc to rio en el que está ubi cado TRegSvr.5. Intro duzca el siguiente comando: TRegSvr STDVCL.DLL

(STDVCL40.DLL para Del phi 4, 5, 6 o superior).6. Pulse la tecla Intro.

Turbo Regis ter Ser ver acepta tres opciones:

-u Para eliminar del Regis tro un ser vi dor o biblio teca de tipos.

-q Para ope rar en modo silen cioso.

-t Para regis trar una biblio teca de tipos (esta es la acción por defecto; siesto es lo que desea hacer, sim ple mente teclee el nom bre del pro grama seguidopor el nom bre del ser vi dor, como se mues tra en el ejem plo de arriba)

Error Opening Component LibraryPo si ble cau sa de error

Puede haber ins ta lado un com po nente que se enlaza está ti ca mente (es decir, atra vés de sen ten cias Exter nal) a una .DLL que no puede ser encon trada.

So lu ción rá pi daDesins tale el com po nente que causa el pro blema.

Si usted mismo ha creado el com po nente, reem place las direc ti vas Exter nal(carga está tica de .DLLs) por lla ma das a las fun cio nes Load Li brary yGetProcAddress (carga diná mica de .DLLs).

230 Los Tomos de Delphi: Delphi sin problemas

Page 265: Dsp

Infor ma ción adi cio nalLo más ade cuado parece ser car gar las .DLLs diná mi ca mente, y noestá ti ca mente.

Error reading <>.<>: <>Po si ble cau sa de error

1. Puede ser que los com po nentes a los que se hace refe ren cia en el archivo defor mu la rio (.DFM) no estén dis po ni bles. Puede haber desins ta lado esoscom po nen tes des pués de uti li zar los en un pro yecto. Esto ocu rre más fre-cuen te mente con com po nen tes de ter ce ros.

2. Puede haber abierto un pro yecto en una ver sión de Del phi ante rior a la queuti lizó para com pi lar el pro yecto. En este caso, podrán apa re cer uno o másmen sa jes que indi quen que cierta pro pie dad no existe.

3. Puede manual mente haber edi tado el archivo de for mu la rio (.DFM) inde-pen dien te mente del archivo .PAS, tal vez cam biando un tipo de objeto porotro. Si es así, habrá pro pie da des que un objeto tiene y el otro no, oca sio-nando este pro blema.

4. Puede ser que Del phi no pueda encon trar un archivo de con fi gu ra ción nece-sa rio, como IDAPI32.CFG.

So lu ción rá pi da1. Selec cione OK, y luego reins tale los com po nen tes a los que el archivo de

for mu la rio se refiere.2. Selec cione OK. La refe ren cia a la pro pie dad no exis tente será eliminada

del archivo .DFM.3. Selec cione OK, y luego siga estos pasos:

a. Pulse con el botón derecho del ratón sobre el formulario que contiene lapropiedad no existente y seleccione View As Text.

b. Edite el archivo .DFM que aparece para devolverlo a su estado original.c. Pulse con el botón derecho del ratón 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. Ase gú rese de que la ubi ca ción de IDAPI32.CFG coin cide con la indi cada enel Regis tro del sis tema. Por defecto, la ubi ca ción de este archivo esC:\Archi vos de pro grama\Bor land\Com mon files\BDE.El Regis tro de Win dows man tiene la infor ma ción sobre dónde se encuen traIDAPI32.CFG. Para ver en qué lugar éste se encuen tra en su máquina,siga estos pasos:

Mensajes de error 231

Page 266: Dsp

a. Seleccione Inicio | Ejecutar.b. Introduzca regedit en el cuadro de combinación Abrir... y pulse el

botón OK (o presione la tecla Intro).

c. Nav egue hastaHKEY_LOCAL_MACHINE\Soft ware\Borland\Data base Engine.

El valor para CONFIGFILE01 mos trará el camino donde está situado elarchivo de con fi gu ra ción. Si difiere de la ubi ca ción de su copia deIDAPI32.CFG, mueva el archivo a la ubi ca ción apun tada por la clave ante-rior del Regis tro (reco men dado), o cam bie el valor de la clave paraadecuarlo a la ubi ca ción actual del archivo.

Infor ma ción adi cio nalCon sulte “Stream Read Error”.

Error reading <ComponentName orFormName>.<Propertyname>. Property does not exist. Ignore theerror and continue? NOTE: ignoring the error may causecomponents to be deleted or property values to be lost.

Po si ble cau sa de error1. Puede haber inten tado cam biar un com po nente por otro que no es com pa ti-

ble edi tando el archivo .DFM. Por ejem plo, puede haber cam biadoTDa te Ti me Pic ker por TEdit, en cuyo caso la parte <Pro pert yName> delmen saje sería <CalA lign ment> (el pri mer men saje de error de este tipo quese obten dría en esta oca sión).

2. Puede haber abierto un pro yecto en una ver sión de Del phi ante rior a la uti-li zada para crear el pro yecto. Por ejem plo, ha creado el pro yecto con Del phi4, y luego inten tado abrirlo en Del phi 3. En ese caso, el men saje puede con-te ner <NombreFormulario>.OldCrea teOr der.

3. Puede haber eli mi nado un paquete de su sis tema y luego inten tado abrirun pro yecto que uti liza com po nen tes con te ni dos en dicho paquete.

4. Puede haber eli mi nado algu nos paque tes que pensó que nunca uti li za ría(como Fast Net o Quick Re ports) y luego haber abierto un pro yecto dedemos tra ción que uti liza uno de esos paque tes.

So lu ción rá pi da1. Sola mente cam bie los com po nen tes por com po nen tes com pa ti bles. Puede

cam biar, por ejem plo, un com po nente TEdit por un TDBEdit.2. Abrir los pro yec tos de Del phi con ver sio nes ante rio res de Del phi no es reco-

men dado. Sin embargo, puede selec cio nar Yes para igno rar el error, y las

232 Los Tomos de Delphi: Delphi sin problemas

Page 267: Dsp

pro pie da des ya no esta rán en oca sio nes pos te rio res en que abra el pro yecto.Lo con tra rio (es decir, abrir un pro yecto creado en Del phi 3 con Del phi 4)nor mal mente fun ciona bien.

3, 4Car gue el paquete que con tiene el com po nente al que se hace refe ren cia enel men saje de error (Com po nent | Install Pac ka ges) para resol ver losposibles errores mencionados en el punto 3 y 4.

Infor ma ción adi cio nalGExperts (dispo ni ble en www.gex perts.org) pro por ciona un Asis tente lla madoRepla ce Com po nents que per mite fácil mente sus ti tuir com po nen tes de un tipopor otro. La sus ti tu ción puede hacerse para todo un pro yecto, para un for mu la-rio espe cí fico o sola mente para los con tro les que selec cione en el edi tor de for-mu la rios de Del phi.

Con sulte “Error Crea ting Form: Inva lid Stream For mat”.

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

Po si ble cau sa de errorPuede tener asig nada a False la pro pie dad Hand leS hared de un com po nenteTDa ta base.

So lu ción rá pi daAsigne True a la pro pie dad Hand leS ha red del com po nente TDa ta base.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “Hand leS ha red” en la ayuda de Del phi.

Error reading <Session>.SessionName. Duplicate session name <>Po si ble cau sa de error

Puede tener asig nada a False la pro pie dad Auto Ses sionName del com po nenteTSes sion.

So lu ción rá pi daAsigne True a la pro pie dad Auto Ses sion Name del com po nente TSes sion.

Mensajes de error 233

Page 268: Dsp

Infor ma ción adi cio nalPara más infor ma ción, con sulte “Auto Ses sion Name” en la ayuda de Del phi.

Error reading symbol filePo si ble cau sa de error

1. El archivo de sím bolos del pro yecto (.DSM) puede estar dañado o no sin cro-ni zado con el pro yecto.

2. Puede estar abriendo en Del phi de 32 bits un pro yecto que ha com pi ladocon Del phi 1, y el pro yecto con tiene un archivo de sím bo los (.DSM) de 16bits.

3. Puede haber movido un pro yecto a un direc to rio o máquina dife rente.4. Puede estar eje cu tando un pro grama creado en otra máquina que hace

refe ren cia en el archivo .DSK a un direc to rio que no es válido.

So lu ción rá pi da1. Pulse el botón OK para dese char el men saje de error y luego selec cione

Pro ject | Build <Pro yecto>.2. Pulse el botón OK para dese char el men saje de error y luego selec cione

Pro ject | Build <Pro yecto>.3. Borre los archi vos .DSM y .DSK del pro yecto, o sim ple mente ignore el men-

saje (selec cione OK para dese char el men saje).4. Abra el archivo .DSK del pro yecto y vaya a la sec ción Symbols. Haga las

modi fi ca cio nes nece sa rias para hacer refe ren cia a los direc to rios correc tos.

Infor ma ción adi cio nalPara evi tar que apa rezca este men saje de error, puede borrar el archivo .DSMantes o des pués de mover el pro yecto.

Para cada pro yecto de Del phi, se crea rán algu nos archi vos que no deben serborra dos, en par ti cu lar los archi vos .PAS, .DFM y .DPR. Otras archi vos, sinembargo, serán rege ne ra dos auto má ti ca mente cada vez que com pile, así quepue den ser borra dos sin nin gún pro blema. Entre estos se encuen tran, endepen den cia de la ver sión de Del phi, los archi vos de exten sión .OPT, .DSK,.DSM, .RES y .DOF. Adi cio nal mente, la ver sión ante rior a la última guar dadade los archi vos de for mu la rio (.DFM), de pro yecto (.DPR), Pas cal (.PAS), y, enDel phi 3 y 4 (cuando sea apro piado), de biblio te cas de tipos (.TLB) se guar dancon una exten sión que comienza con una tilde (~) seguida por las dos pri me rasletras de la exten sión nor mal. Por ejem plo, los archi vos de res guardo de losarchi vos .PAS tie nen la exten sión .~PA. De esta manera, siem pre se puede vol-ver a la ver sión ante rior de uno de esos archi vos, si es nece sa rio, cam biando laexten sión de ésta a su for mato habi tual.

234 Los Tomos de Delphi: Delphi sin problemas

Page 269: Dsp

Error saving I(Interface): The parameter is incorrectPo si ble cau sa de error

Puede estar inten tando crear un ser vi dor de auto ma ti za ción, Acti ve Form o con-trol Acti veX y las .DLLs de OLE no están actua li za das.

So lu ción rá pi daInstale Inter net Explo rer desde el CD de Del phi (no está dis po ni ble en todaslas copias de Del phi) o copie direc ta mente las .DLLs de OLE desde el direc to rio\RunI mage\Delp hiX\Win dows\System32.

Infor ma ción adi cio nalCon sulte “Could not load RLINK32.DLL” y “Error 0: RLINK32 Error ope-ning file <Type Li brary>.tlb”.

Error setting debug exception hookPo si ble cau sa de error

1. Puede estar expe ri men tando un fallo menor en Del phi.2. Uno o más archivos de uni dades com pi la das (.DCU) pueden estar dañados.

So lu ción rá pi da1. Selec cione OK, pulse Ctrl+F2 o Alt+R+E, y luego selec cione Pro ject |

Build All.2. Si tiene los archi vos fuente corres pon dien tes (.PAS), borre los archi vos de

uni dad com pi la dos (.DCU) y recons trú ya los. Las uni da des com pi la dasserán rege ne ra das auto má ti ca mente a par tir de los archi vos fuen tes.

Infor ma ción adi cio nalNunca borre un archivo de pro yecto .DPR, .PAS (fuente Pas cal) o .DFM (de for-mu la rio). La mayo ría de los demás archi vos serán rege ne ra dos auto má ti ca-mente por Del phi sin inter ven ción o inte rac ción alguna del pro gra ma dor. Porsupuesto, si borra los archi vos que con tie nen las opcio nes de com pi la ción queha espe ci fi cado para la apli ca ción, deberá espe ci fi car esas opcio nes de nuevo.Un ejem plo de este tipo de archivo es el archivo de recur sos del pro yecto, quetiene el mismo nom bre base que el pro yecto y la exten sión .RES. Este archivoalma cena el nom bre que apa re cerá debajo del icono de la apli ca ción, el pro pioicono y el archivo de ayuda del pro yecto. Borrar tales archi vos es algu nas vecesnece sa rio (con sulte “Error rea ding symbol file”) y sola mente una moles tia(pero nunca un desas tre) recons truir los.

Mensajes de error 235

Page 270: Dsp

Error starting Program. The <>.DLL file appears to be corrupt.Reinstall the file, and then try again.

Po si ble cau sa de errorPuede haber inten tado eje cu tar en Del phi de 32 bits un pro grama que uti lizauna .DLL de 16 bits.

So lu ción rá pi daTrate de obte ner una .DLL de 32 bits que sus ti tuya a la de 16 bits.

Infor ma ción adi cio nalCuando porte su apli ca ción de 16 a 32 bits, deberá tener en cuenta todos losarchi vos com ple men ta rios y com po nen tes que su apli ca ción nece sita.

EStackOverflowCon sulte “Stack over flow”.

EStringListErrorCon sulte “List index out of bounds”.

EThreadPo si ble cau sa de error

1. Puede tener un hilo prin ci pal que ha lla mado al método Wait For, yposteriormente otro hilo ha lla mado al método Synchro nize.

2. Puede tener un hilo que ha lla mado al método Synchro nize, y luego el hiloprin ci pal ha lla mado al método Wait For.

So lu ción rá pi daEli mine en el hilo prin ci pal la lla mada a Wait For y/o la lla mada al métodoSynchro nize del otro hilo.

Infor ma ción adi cio nalNo se puede desa rro llar apli ca cio nes multi-hilo en Del phi 1. Para másinformación sobre una manera alter na tiva de eje cu tar pro ce sa miento ensegundo plano, con sulte “OnIdle” en la ayuda de Del phi.

236 Los Tomos de Delphi: Delphi sin problemas

Page 271: Dsp

EVariantErrorPo si ble cau sa de error

Puede haber inten tado hacer una refe ren cia a un valor Null de un con juntoresul tado. Por ejem plo, lo siguiente gene rará este men saje de error si el valordel campo Expen da bleIn come para el regis tro actual es Null:

var i: Inte ger;be gin i := Query1['Expen da bleIn co me'];

So lu ción rá pi daPuede compro bar el resul tado para ver si es Null, y sola mente asig narlo a lavaria ble si no lo es, así:

if not VarI sNull(Query1['Expen da bleIn co me']) then i := Query1['Expen da bleIn co me']else i := 0;

Infor ma ción adi cio nalLa pro pie dad Field Va lue de TDa ta set retorna un valor de tipo Variant, comose puede dedu cir del código de arriba. Es menos con ve niente pero más rápidohacer la refe ren cia a los cam pos de un con junto resul tado en su for mato nativo,por ejem plo:

bs := Query1['Expen da bleIn co me'].AsString;

Field Va lues es la pro pie dad por defecto de TDa ta set; por esa razón no es nece-sa rio hacer la refe ren cia explí ci ta mente. En otras pala bras, las siguien tes dosasig na cio nes eje cu tan la misma acción:

i := Query1['Expen da bleIn co me'];i := Query1.Field Va lues(['Expen da bleIn co me']);

Para más infor ma ción, con sulte “TDa ta set.Field Va lues” en la ayuda de Del phi.

Except or Finally expectedPo si ble cau sa de error

1. Ha omi tido la pala bra reser vada Finally o Except des pués de uti li zar lapala bra reservada Try. Por ejem plo, lo siguiente gene rará este men saje deerror:

pro ce du re TForm1.Sis koAndEbert Click(Sen der: TObject);var

Mensajes de error 237

Page 272: Dsp

TwoT humbsUp: String;be gin try TwoT humbsUp := 'Way lon and Wi llie meet God zi lla'; end; {con o sin este 'end' el men sa je de error es el mis mo}end;

2. Puede tener un parén te sis invá lido en el código. Por ejem plo, lo siguientegene rará este men saje de error:

sl[Bill To Na me Pos] := PadL(sl[Bill To Na me Pos],50));

So lu ción rá pi da1. Si uti liza la pala bra reser vada Try, deberá uti li zar la pala bra reser vada

Finally o la pala bra reser vada Except.2. Eli mine uno de los parén te sis al final de la línea, de tal manera que el

código se lea:

sl[Bill To Na me Pos] := PadL(sl[Bill To Na me Pos],50);

Infor ma ción adi cio nalLas sen ten cias Try. . . Finally se uti li zan gene ral mente para ase gu rar que losrecur sos asig na dos sean siem pre libe ra dos (por que la parte Finally siem pre eseje cu tada). Esta es la razón por la que los blo ques Try. . . Finally son cono ci doscomo blo ques de pro tec ción de recur sos. Un blo que Try. . . Finally típico podríaser :

var Feed: TStrings;be gin Feed := TString List.Crea te; try Feed.Add('Pu ri naH ye naC how'); Feed.Add('Pu ri naP te ra dactylChow'); Feed.Add('Pu ri naC howC how'); Feed.Add('Ciao Baby'); fi nally Feed.Free; end;end;

Los blo ques Try. . . Except se uti li zan gene ral mente para pro veer res pues tas aerro res espe cí fi cos. Un ejem plo de uti li za ción del blo que Try. . . Except es:

try Di vi dend := StrToInt(Edit1.Text); Di vi sor := StrToInt(Edit2.Text); Quo tient := Di vi dend div Di vi sor;ex cept on EDivB yZe ro do Show Mes sa ge('Intro duz ca un va lor más gran de que 0 '

238 Los Tomos de Delphi: Delphi sin problemas

Page 273: Dsp

+#13#10+ ' en el cua dro de edi ción Di vi sor’); Edit2.Set Fo cus; end;end;

Exception <> in module <> at <>.<>Po si ble cau sa de error

Este es el men saje de error por defecto que se obtiene si una excep ción hacetodo el reco rrido “hacia arriba” (la excep ción no ha sido atra pada por su códigoo el código de la VCL).

So lu ción rá pi daComo este es un men saje de error muy gené rico, ten drá que ir estre chando elcerco para deter mi nar dónde se está pro du ciendo la excep ción. Ase gú rese deque tiene acti vada la opción Break on Excep tions (vea la ayuda de Del phipara deta lles con cre tos, ya que es una opción espe cí fica a cada ver sión).

Infor ma ción adi cio nalTAppli ca tion.Hand leEx cep tion llama a ShowE xcep tion, que a su vez llama aExcep tionE rror Mes sage, que mues tra este men saje.

Expected an identifier but function foundPo si ble cau sa de error

Puede haber olvi dado aña dir el parén te sis final a la sig na tura de un pro ce di-miento o fun ción. Por ejem plo, lo siguiente gene rará este men saje de error:

pro ce du re Cal cu la te Due Da te(AAgencyID, AEmplo yerID: Inte ger; APay roll Da te: TDa te;

So lu ción rá pi daAñada el parén te sis fal tante:

pro ce du re Cal cu la te Due Da te(AAgencyID, AEmplo yerID: Inte ger; APay roll Da te: TDa te);

Infor ma ción adi cio nalAl pare cer, hay infi ni tas for mas de equi vo carse en la sin ta xis.

Mensajes de error 239

Page 274: Dsp

Expecting a column separator in table [header]Po si ble cau sa de error

La tabla indi cada en el men saje de error es pro ba ble mente una tabla Para doxque se ha dañado de algún modo.

So lu ción rá pi daSus ti tuya la tabla que causa el pro blema por su última copia de seguridad.

Infor ma ción adi cio nalPuede que sea nece sa rio simul tá nea mente reem pla zar los archi vos de Para doxcom ple men ta rios, como los archi vos de índice (.PX).

Exports allowed only at global scopePo si ble cau sa de error

Puede haber aña dido la cláu sula Exports a un pro ce di miento o fun ción local.

So lu ción rá pi daMueva la cláu sula Exports a una sec ción glo bal. Por con ve nio, está situadainme dia ta mente antes de la sec ción Ini tia li za tion de la uni dad (si existe una);en caso con tra rio, sitúela antes del End final.

Infor ma ción adi cio nalLa cláu sula Exports es uti li zada en las .DLLs, para que los pro ce di mien tos yfun cio nes estén dis po ni bles a los módu los externos. Enton ces se podrá acce dera esos pro ce di mien tos y fun cio nes uti li zando Load Li brary (o Load Li braryEx) yGetP rocAddress.

Expression expected but <> foundPo si ble cau sa de error

1. Puede haber omi tido algo. Por ejem plo, la siguiente sen ten cia (en la quefalta el segundo ope rando, que debe ría apa re cer des pués del signo más)genera este men saje de error:

LblInte gerA ddi tion.Cap tion := IntToStr(1+);

2. Puede estar inten tando asig nar una frac ción a un número real/punto flo-tante (o una hora en una varia ble TDa te Time), pero ha olvi dado ante po ner

240 Los Tomos de Delphi: Delphi sin problemas

Page 275: Dsp

un número al punto deci mal. Debe incluir algún dígito (aun que sea el cero),para que el com pi la dor acepte esta asig na ción. Por ejem plo, la siguienteasig na ción genera este men saje de error:

Me dio cre Bat tingAvg := .246;

3. Puede haber inten tado decla rar una clase en una sec ción Const, así:

const TForm1 = class(TForm)

En este caso, el men saje de error espe cí fico sería “Expres sion expec tedbut CLASS found”.

So lu ción rá pi da1. Pro por cione una expre sión en el lugar donde el com pi la dor generó el men-

saje de error. En este ejem plo, borre el signo más (+) o añada otracons tante o varia ble. IntToStr(1) o IntToStr(1+2) están bien.

2. Añada un dígito (como 0) antes del punto deci mal de esta manera:

Me dio cre Bat tingAvg := 0.246;

3. No declare tipos en sec cio nes Const.

Infor ma ción adi cio nal3. Los tipos deben ser decla ra dos en sec cio nes Type, y las ins tan cias de tipos

en sec cio nes Var, como lo hace Del phi auto má ti ca mente cuando crea unfor mu la rio:

type TForm1 = class(TForm) . . .var Form1: TForm1;

External error C0000006Po si ble cau sa de error

Puede haber ins ta lado un com po nente ines ta ble de un ter cero.

So lu ción rá pi daDesins tale los com po nen tes aña di dos recien te mente hasta que el pro blemadesa pa rezca. Para desins ta lar un com po nente del entorno inte grado de Del phien tiempo de diseño, siga estos pasos:

1. Selec cione Com po nent | Install Pac ka ges.

2. Des mar que la casi lla de veri fi ca ción corres pon diente al paquete que deseaeli mi nar, o selec ció nelo y pulse el botón Remove.

Mensajes de error 241

Page 276: Dsp

Infor ma ción adi cio nalSiempre podrá aña dir de nuevo aque llos paque tes que haya eli mi nado invir-tiendo el pro ceso:

1. Selec cione Com po nent | Install Pac ka ges.

2. Pulse el botón Add.3. Abra el archivo .BPL apro piado.

External error C0000012Po si ble cau sa de error

Ya que es un error “externo”, no es un fallo de Del phi. Puede ser una excep ciónno mane jada en una .DLL o cual quier otra cosa.

So lu ción rá pi daNo estoy seguro de por qué, pero en una oca sión resolví este pro blema cam-biando el valor de la pro pie dad OldCrea teOr der de un for mu la rio de False aTrue.

Infor ma ción adi cio nalSi obtiene “Inter nal error”, es cier ta mente un fallo de Del phi.

External exception C0000008Po si ble cau sa de error

Puede estar uti li zando el cliente de SQL Net ver sión 2.3.3.

So lu ción rá pi daTiene muchas opcio nes para reme diar este pro blema; uti lice cual quiera de lassiguien tes solu cio nes. La pri mera es la reco men dada por el soporte de Ora cle.

a. En Regedit, navegue hastaHKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ OTRACE73 yrenombre esta entrada o elimínela.

b. Elimine Ora cle Trace Col lec tion Ser vices 7.3.3.x.x utilizando elInstalador de Ora cle.

c. En Delphi, seleccione Tools | Options | Pref er ences | Debugging,y desmarque la casilla Inte grated Debugging.

d. Utilice una versión del cliente Ora cle SQL Net anterior a la 2.3.3.

242 Los Tomos de Delphi: Delphi sin problemas

Page 277: Dsp

Infor ma ción adi cio nalNT 4 informa de todas las excep cio nes que se dis pa ran durante la depu ra ción(incluso las excep cio nes que nor mal mente se igno ra rían).

F004Po si ble cau sa de error

Puede estar inten tando ins ta lar Del phi/400 y está uti li zando el pro to colo SNAy se cum ple una de las siguien tes condiciones: El servidor SNA no está ejecutándose. Ha sobrepasado la cantidad de licencias de puestos SNA.

So lu ción rá pi daDepen diendo de la causa del pro blema, arran que el ser vi dor SNA, eche a unusua rio del sis tema o aumente la can ti dad de licen cias de pues tos de trabajo.

Infor ma ción adi cio nalDel phi/400 es una ver sión espe cia li zada de Del phi para inte rac tuar con ser vi-do res AS/400. Para más infor ma ción, visite www.dany soft.com.

Failed to get data for <>Po si ble cau sa de error

Puede haber inten tado obte ner datos del Regis tro del sis tema a una varia blede un tipo de datos que difiere del tipo de datos del valor obte nido. Por ejem-plo, lo siguiente gene rará este men saje de error si el valor Third Base alma ce-nado en el Regis tro es un entero (o de hecho cual quier otra cosa dis tinta a unString):

func tion Go See Cal: String;var Reg giesT ree: TRe gistry;be gin Reg giesT ree := TRe gistry.Crea te; try Reg giesT ree.Root Key := HKEY_CURRENT_USER; Reg giesT ree.Open Key('\drmtma le\Bal ti mo re Orio les', Fal se); Re sult := Reg giesT ree.ReadS tring('Third Ba se'); fi nally Reg giesT ree.Free; end;end;

Mensajes de error 243

Page 278: Dsp

So lu ción rá pi daVeri fi que que el valor que está leyendo del Regis tro es del mismo tipo que lavaria ble o pro pie dad en la cual lo alma ce nará o asig nará. Puede ence rrar laasig na ción en un blo que Try. . . Except para atra par este error, así:

func tion Go See Cal: string;var Reg giesT ree: TRe gistry;be gin Reg giesT ree := TRe gistry.Crea te; try Reg giesT ree.Root Key := HKEY_CURRENT_USER; try Reg giesT ree.Open Key('\drmtma le\Bal ti mo re Orio les', Fal se); Re sult := Reg giesT ree.ReadS tring('Third Ba se'); ex cept on ERe gistryExcep tion do Re sult := ''; {ma ne jo de ex cep cio nes adi cio nal, si lo de sea} end; fi nally Reg giesT ree.Free; end;end;

Infor ma ción adi cio nalEste men saje de error es des cen diente de ERe gistryExcep tion.

El Regis tro del sis tema es mucho más fle xi ble que los archi vos .INI que se uti-li za ban antes de Win dows de 32 bits (y aún dis po ni bles en Win dows de 32bits). Mien tras que sola mente se pue den alma ce nar tres tipos de datos en losarchi vos .INI (Bool[ean], Inte ger y String), el Regis tro soporta nueve tipos:Binary, Bool[ean], Currency, Date, Date Time, Float, Inte ger, String y Time.

Failed to load streamCon sulte “BLOb has been modi fied”, número 2.

Fatal Error: <>: Required Package <> not foundCon sulte “Requi red pac kage <> not found”.

244 Los Tomos de Delphi: Delphi sin problemas

Page 279: Dsp

Field <> cannot be modifiedPo si ble cau sa de error

1. Puede estar inten tando modificar la pro pie dad Params de un objetoTClient DataSet des pués que ha sido asig nada, sin pri mero borrar el con te-nido ori gi nal de Params.

2. Puede estar inten tando hacer una bús queda uti li zando un índice dis tinto alíndice actual.

So lu ción rá pi da1. Borre el con te nido de Params, lla mando a CDS.Params.Clear.2. Asigne a la pro pie dad Index Name del con junto de datos el índice con el que

quiere tra ba jar.

Infor ma ción adi cio nalCon sulte “Index Name” en la ayuda de Del phi para ver ejem plos de cómo modi-fi car esta pro pie dad en tiempo de eje cu ción uti li zando el com po nenteTClient Da ta Set.

Field <> cannot be used in a filter expressionPo si ble cau sa de error

1. Puede estar inten tando fil trar por un campo cal cu lado.2. Puede estar inten tando fil trar por un campo cuyo tipo de datos no per mite

uti li zarlo en fil tros (como un grá fico).

So lu ción rá pi da1,2.Uti lice sola mente cam pos de datos está ti cos cuyos valo res pue dan ser cuan-

ti fi ca dos a tra vés de expre sio nes de fil tro tipo SQL.

Infor ma ción adi cio nal1. En la tabla Country de Para dox que viene con Del phi, lo siguiente es per-

mi tido en una expre sión de fil tro:

Name = 'Bo li via' OR 'Bra zil' OR 'Pa ra guay'

debido a que Name es uno de los cam pos de datos de la tabla.Sin embargo, si crea un campo cal cu lado (por ejem plo, Den sity, basado enlos cam pos Popu la tion y Area), las siguien tes expre sio nes de fil tro no seránper mi ti das en la pro pie dad Filter del TDa ta Set, y gene rarán este men sajede error:

Mensajes de error 245

Page 280: Dsp

Den sity > 6

2. Un fil tro que com pare cade nas o valo res numé ri cos no tra ba jará con cier tostipos de datos (como TGrap hic Field y TMe mo Field), y por lo tanto los cam-pos de estos tipos de datos provocarán este men saje de error si los uti lizaen una expre sión de fil tro. Un ejem plo podría ser el siguiente fil tro apli-cado a la tabla Bio life de Para dox que viene con Del phi:

Grap hic > 8

Field <>.<> does not have a corresponding component. Removethe declaration?

Po si ble cau sa de error1. Tiene una refe ren cia en el archivo .PAS que no tiene una refe ren cia corres-

pon diente en el archivo .DFM.2. Puede obte ner este men saje de error si des pués de reci bir el men saje de

error “Class <> not found. Ignore the error and con ti nue?” con ti núacon la carga del pro yecto (des pués de igno rar el men saje de error anterior).

3. Puede haber borrado manual mente la refe ren cia al campo en el archivo.DFM.

4. Puede haber modi fi cado la decla ra ción del campo en el archivo .PAS. Porejem plo, puede haber cam biado:

type TForm3 = class(TForm) La bel1: TLa bel;

a:

type TForm3 = class(TForm) abel1: TLa bel; {borró la L de La bel1}

5. Puede haber inten tado aña dir manual mente un tipo de clase en la partePublis hed del archivo de uni dad, así:

type TForm1 = class(TForm)

Ima ge1: TIma ge; Chlo ro: Form; {esta lí nea oca sio na el error} pri va te { De cla ra cio nes Pri va te } pu blic { De cla ra cio nes Pu blic } end;

So lu ción rá pi da1. Selec cione Yes para borrar la decla ra ción.

246 Los Tomos de Delphi: Delphi sin problemas

Page 281: Dsp

2. Si quiere luego vol ver a inser tar la refe ren cia en el archivo .DFM, es másfácil aña dir el com po nente de nuevo al for mu la rio, lo que auto má ti ca menterein ser tará la refe ren cia en el archivo .DFM.

3. Vuelva a inser tar la refe ren cia que haya borrado en el archivo .DFM.4. Res taure la decla ra ción del campo para que esté acorde con el nom bre del

com po nente en el Inspec tor de Obje tos.5. Cuando añada campos de tipos de clase, no los añada a la parte Publis hed

de un archivo de uni dad de for mu la rio (.PAS). Lo siguiente es acep ta ble:

type TForm1 = class(TForm) Ima ge1: Ti ma ge;

pri va te Con cre te: Form;

pu blic { Pu blic de cla ra tions }

end;

Infor ma ción adi cio nal5. Es más común aña dir tipos de clase en la sección Type de una uni dad de

com po nente que en una uni dad de for mu la rio. Así es como se crean loscom po nen tes com pues tos.

Para más infor ma ción sobre otras situa cio nes y men sa jes de error rela cio na doscon sulte “Class <> not found. Ignore the error and con ti nue?” y “Errorrea ding <>”.

Field <> is not indexed and cannot be modifiedPo si ble cau sa de error

Puede estar inten tando bus car por un campo de una tabla local (Para dox odBASE) que (a) no está indi zado o (b) está indizado, pero la pro pie dadIndexField Na mes del objeto TTa ble no tiene asig nada una clave pri ma ria (sim-ple o com puesta), o la pro pie dad Index Field no tiene asig nada una clave secun-da ria. Por ejem plo, lo siguiente gene rará este men saje de error si se da algunade esas posi bi li da des:

with Ta ble1 dobe gin Set Ran geS tart; FieldByNa me('Ball yard').AsString := 'Cam den'; Set Ran geEnd; FieldByNa me('Ball yard').AsString := 'Wri gley'; ApplyRan ge;end;

Mensajes de error 247

Page 282: Dsp

So lu ción rá pi daCuando acceda a tablas loca les (Para dox o dBASE), ase gú rese de que los cam-pos sobre los que va a rea li zar bús que das estén indi za dos y que la pro pie dadIndex Name del com po nente TTa ble apunte a ese campo.

Si quiere bus car por una clave pri ma ria (sim ple o com puesta), asigne el nom-bre del campo a la pro pie dad Index Field Na mes. Si es una clave pri ma ria com-puesta, separe los nom bres de campos mediante punto y coma. Puede rea li zaresta asig na ción en el entorno inte grado o en el código, así:

Index Field Na mes := 'Apellidos;Nombre';

Si quiere bus car por una clave secun da ria, uti lice la pro pie dad Index Field.Puede hacerlo en el entorno inte grado o desde código, así:

Index Na me := 'Se con daryIndx';

Infor ma ción adi cio nalSi está uti li zando una base de datos de ser vi dor SQL (Inter Base, Ora cle, MSSQL Ser ver, etc.), puede esta ble cer un rango o hacer una bús queda sobre cual-quier campo, esté indi zado o no. En tales casos, asigne el nom bre del camposobre el que desea esta ble cer el rango o bus car a la pro pie dad Index Field-Names del objeto TTable.

Field <> is not of the expected typePo si ble cau sa de error

Des pués de crear ins tan cias de los cam pos en tiempo de diseño, puede habermodi fi cado la estruc tura de la tabla borrando un campo (o cam pos) o modi fi-cando el nom bre de un campo, su tipo de datos o tamaño.

So lu ción rá pi daBorre las defi ni cio nes obso letas de los cam pos de la tabla y sus ti tú ya las porotras actua li zadas. Puede hacer esto siguiendo estos pasos:1. Pulse el botón dere cho del ratón sobre el com po nente TTa ble que con tiene

el campo que ha sido borrado o modi fi cado.2. Pulse el botón dere cho del ratón sobre la lista de cam pos y selec cione

Delete del menú de con texto.3. Pulse el botón dere cho del ratón sobre la ven tana ahora vacía y selec cione

Add Fields para crear las ins tan cias para las nue vas defi ni cio nes.

248 Los Tomos de Delphi: Delphi sin problemas

Page 283: Dsp

Infor ma ción adi cio nalAlgu nas veces podrá tener refe ren cias extra via das a com po nen tes o sus pro pie-da des en el archivo de for mu la rio (.DFM). Siem pre puede com pro bar el archivode for mu la rio pul sando el botón dere cho del ratón sobre el for mu la rio y selec-cio nando View as Text del menú de con texto. Bus que cual quier com po nente opro pie dad que no per te nezca o cuya con fi gu ra ción no corres ponda con lo quedebe ría ser. Por ejem plo, un objeto corres pon diente a un campo de base dedatos es repre sen tado así:

ob ject Ta ble1RptFi le Na me: TString Field Field Na me = 'RptFi le Na me' Re qui red = True Size = 6end

Si los valo res de las pro pie da des no se corres pon den con las pro pie da des actua-les del campo, borre o modi fi que esta entrada si es nece sa rio.

Field <> is of an unknown typePo si ble cau sa de error

1. Puede haber inten tando eje cu tar una con sulta para me tri zada en el edi torSQL de Del phi. Por ejem plo, puede tener una con sulta de estruc tura simi-lar a ésta:

se lect SCRIPT_ID, SCRIPT_DESC, BUILD_NO, SCRIPT_TYPEfrom SCRIPTMAINwhe re SCRIPT_TYPE = :SCRIPT_TYPE

2. Puede estar con sul tando tablas de Access que con tie nen valo res Date yTimeS tamp y tiene asig nado el valor True a la pro pie dad Request Live delTQuery.

3. Puede estar uti li zando un com po nente TUpda teSQL con una tabla que con-tiene un nom bre de campo al que se le ha aña dido el pre fijo OLD_.

So lu ción rá pi da1. El pará me tro no es reco no cido por el edi tor SQL. Para pro pó si tos de

prueba, sus ti tuya el pará me tro por un valor cual quiera. Por ejem plo:

se lect SCRIPT_ID, SCRIPT_DESC,

Mensajes de error 249

Page 284: Dsp

BUILD_NO, SCRIPT_TYPEfrom SCRIPTMAINwhe re SCRIPT_TYPE = 2

2. Asigne False a la pro pie dad Request Live.3. No ante ponga el pre fijo OLD_ a los nom bres de campo. Del phi lo hace

“inter na mente” con los regis tros que están siendo actua li za dos, de formaque pueda com pa rar el valor anti guo con el valor nuevo. Si tiene un campolla mado OLD_GEEZER, Del phi pen sará que se trata del anti guo valor deun campo lla mado GEEZER. Si no existe un campo llamado GEEZER, sepro du cirá un error.

Infor ma ción adi cio nal2. Micro soft Access desa fía la con ven ción habi tual de SQL y uti liza el signo

almoha di lla (#) en lugar de las comi llas para ence rrar los valo res de tipoDate y TimeS tamp (¿Qué? ¡Micro soft esta blece sus pro pios están da res!¡Incon ce bi ble!). Esto pro voca el pro blema.

Field <> is of an unsupported typePo si ble cau sa de error

Puede estar uti li zando una ver sión anti gua de algún soft ware de capa inter me-dia, por ejem plo un ver sión vieja del BDE.

So lu ción rá pi daMan tenga actua li zado todo su soft ware — las herra mien tas de conectividad,clien tes de base de datos, DLLs, actua li za cio nes de com po nen tes de ter ce ros yel pro pio Del phi.

Infor ma ción adi cio nalCon sulte el artículo de Dan Miser “The Upgrade Game” dis po ni ble enhttp://www.delp hi zine.com/opi nion/1998/04/di199804ft_o/di199804ft_o.asp, queda argu men tos fir mes sobre las ven ta jas de man te nerse actua lizado.

250 Los Tomos de Delphi: Delphi sin problemas

Page 285: Dsp

Field <> must have a valuePo si ble cau sa de error

Puede haber inten tado gra bar un regis tro a la base de datos, pero la tablatiene un campo obli ga to rio (o NOT NULL si es una base de datos de ser vi dorSQL) al que no se ha asig nado un valor.

So lu ción rá pi daPro por cione valores para todos los cam pos obli ga to rios (o NOT NULL) antes deinten tar gra bar el regis tro.

Infor ma ción adi cio nalEl campo mencionado en el men saje de error fue diseñado como un campo obli-ga to rio cuando se creó la tabla local (Para dox, dBASE, etc.) uti li zando el Data-base Desk top, o cuando la tabla fue creada mediante código de Object Pas cal.Alter na ti va mente, si está uti li zando una base de datos de ser vi dor (Inter Base,Ora cle, MS SQL Ser ver, etc.), el campo fue dise ñado como obli ga to rio al defi-nirlo como NOT NULL.

Si quiere veri fi car y mane jar este inci dente usted mismo (en lugar de per mi tirque Del phi lo maneje, pro por cio nán dole el men saje de error bajo dis cu sión),puede hacer una vali da ción a nivel de regis tro uti li zando el evento Befo re Postdel com po nente TTa ble, una vali da ción a nivel de campo uti li zando el eventoOnVa li date de TField, o una vali da ción a nivel de carác ter uti li zando la pro pie-dad Edit Mask del TField. Si cual quiera de estas vali da cio nes falla, puedehacer que el cur sor apa rezca sobre el campo que pro voca el pro blema. Paramás infor ma ción sobre cómo eje cu tar estas veri fi ca cio nes de vali da ción, con-sulte “A value must be spe ci fied for <>”.

Puede desig nar como obli ga to rio un campo TField que haya sido creado entiempo de diseño a tra vés de su pro pie dad Requi red. Puede tam bién pro por cio-nar un valor por defecto para los des cen dien tes de TField a tra vés de la pro pie-dad DefaultExpres sion. Si hace esto, el campo ten drá un valor por defecto, detal forma que no ten drá que preo cu parse por este men saje de error a menosque el valor por defecto sea borrado.

Si crea una tabla mediante código, puede indi car que un campo es obli ga to rioasig nando el valor True al cuarto pará me tro del método Field Defs.Add. Lospará me tros son el nom bre del campo (String), su tipo de datos (TFieldType), sutamaño (Word), y si es o no obli ga to rio (Boo lean). Por ejem plo, podría aña dir elcampo así:

Field Defs.Add('MrsLep pard',ftString,20,True);

Para más infor ma ción sobre la vali da ción de datos (a nivel de tabla, regis tro,campo y carác ter) con sulte “A value must be spe ci fied for <>”.

Mensajes de error 251

Page 286: Dsp

Field <> not foundPo si ble cau sa de error

1. Puede haber hecho refe ren cia, posi ble mente en la pro pie dad Fil ter de unTDa ta set, a un campo que no existe en el con junto de datos (un campo cal-cu lado, por ejem plo).

2. Puede haber cam biado la pro pie dad Table Name de un com po nente TTa ble,y la pro pie dad Fil ter aún hace refe ren cia a un campo de la tabla ante rior.

3. Des pués de crear los cam pos per sis ten tes uti li zando el edi tor de cam pos(Fields Edi tor), puede haber cam biado la pro pie dad Table Name de un com-po nente TTa ble.

4. Puede haber espe ci fi cado en una lla mada a AddIndex el nom bre de uncampo que no existe en el con junto de datos sub ya cente. Por ejem plo, losiguiente gene rará este men saje de error si no hay un campo lla mado Cityen Table1:

Ta ble1.AddIndex('City', 'City', []);

5. Puede haber borrado algu nos cam pos de un TTa ble que ante rior mentehabía aña dido explí ci ta mente uti li zando el edi tor de cam pos (FieldsEdi tor).

So lu ción rá pi da1. Ase gú rese que cual quier campo al que haga refe ren cia esté correc ta mente

escrito y sea parte del con junto de datos en cues tión.2. Borre el valor situado en la pro pie dad Fil ter o asigne un fil tro apro piado a

la tabla actual.3. Des pués de crear los cam pos en tiempo de diseño a tra vés del Editor de

Campos, bórre los antes de cam biar la pro pie dad Table Name del com po-nente TTa ble.

4. Veri fi que que el campo sobre el cual está inten tando crear un índice existaen la tabla. Puede que sea nece sa rio corre gir el nom bre, cam biar la pro pie-dad Table del com po nente TTa ble o modi fi car la tabla.

5. Borre las decla ra cio nes de des cen dien tes de TField en el archivo de for mu-la rio (.DFM). Obten drá el men saje “Field <> does not have acorres pon ding com po nent. Remove the decla ra tion?” Selec cione Yessiempre.

Infor ma ción adi cio nal1. No se puede hacer refe ren cia a un campo cal cu lado o de bús queda en la

pro pie dad Fil ter de un TDa ta set. Por ejem plo, si KnightsOfThe Round esuna tabla que tiene un campo llamado Address que hace refe ren cia a un

252 Los Tomos de Delphi: Delphi sin problemas

Page 287: Dsp

campo llamado CurrentAddress en una tabla de búsqueda, sería erró neointen tar asig nar lo siguiente a la pro pie dad Fil ter de KnightsOfThe Round:

Cu rrentAddress = ‘To wer of Lon don’

3. Para borrar los cam pos que haya creado uti li zando el Edi tor de Campos(Fields Edi tor), siga estos pasos:a. Haga doble clic sobre el componente TTable para activar el Editor de

Campos.

b. Pulse con el botón derecho del ratón en el Editor de Campos yseleccione Select All.

c. Con todos los campos resaltados, pulse con el botón derecho del ratónen el Editor de Campos y seleccione Delete.

4. Para infor ma ción sobre cómo crear cam pos mediante código, con sulte“AddField Defs” en la ayuda de Del phi.

5. Para ver el archivo de for mu la rio (.DFM), pulse con el botón dere cho delratón sobre el for mu la rio y selec cione View As Text del menú de con texto.La infor ma ción de TField que encontrará ahí será pare cida a:

ob ject Ta ble1 Cust No: TFloat Field Field Na me = 'Cust No'endob ject Ta ble1 Com pany: TString Field Field Na me = 'Com pany' Size = 30end

Para vol ver a la vista nor mal des pués de edi tar el archivo de for mu la rio,pulse con el botón dere cho del ratón en el edi tor y selec cione View AsForm del menú de con texto.

Field <> should be of type <> but is declared as <>. Correct thedeclaration?

Po si ble cau sa de error1. Puede haber cam biado manual mente un archivo de for mu la rio (.DFM). Por

ejem plo, puede haber cam biado un TEdit a TDBEdit des pués de pul sar conel botón dere cho del ratón sobre el for mu la rio y selec cio nar View As Text,y luego haber obte nido el men saje de error “Error rea ding <Com po nent-Name>.<Pro pert yName>: Pro perty does not exist. Ignore the errorand con ti nue? NOTE: igno ring the error may cause com po nents tobe dele ted or pro perty values to be lost” al selec cio nar View AsForm. Poste rior mente reci bió este men saje de error tra tando de com pi lar.

2. Puede haber reem pla zado la decla ra ción de un com po nente de forma talque el tipo de com po nente actual mente decla rado es dis tinto. Por ejem plo,si colocó un TEdit en un for mu la rio, este habrá sido decla rado como:

Mensajes de error 253

Page 288: Dsp

type TForm1 = class(TForm) Edit1: TEdit;

Si cam bió luego el TEdit a algo dis tinto de TEdit, como lo siguiente:

type TForm1 = class(TForm) Edit1: Cof feeE dit;

Habrá obte nido este men saje de error.

So lu ción rá pi da1. Selec cione Yes para corre gir la decla ra ción del com po nente en el archivo

.PAS, para que el archivo .PAS y .DFM estén coor di na dos.2. No modi fi que el código que Del phi genera auto má ti ca mente.

Infor ma ción adi cio nal1. En el con texto par ti cu lar men cio nado arriba, el men saje de error lite ral

sería “Error rea ding Edit1.Text: Pro perty does not exist. Ignore theerror and con ti nue? NOTE: igno ring the error may cause com po-nents to be dele ted or pro perty values to be lost”. Por supuesto, Edit1es sola mente Edit1 si es el pri mer com po nente que ha sido arras tradosobre el for mu la rio, y usted no ha cam biado su nom bre posteriormente.Nor mal mente, los cam bios que haga en el archivo .PAS (por ejem plo,borrar un com po nente situado en el for mu la rio) afec tan al .DFM. En estecaso, es el .DFM el que ha sido modi fi cado, y luego debe ser sin cro ni zadocon el .PAS.Vea en este libro la entrada “Error rea ding <Com po nent Name orForm Name>.<Pro pert yname>. Pro perty does not exist. Ignore theerror and con ti nue? NOTE: igno ring the error may cause com po-nents to be dele ted or pro perty values to be lost”.

2. Con sulte “Class <> not found”.

Field declarations not allowed in interface typePo si ble cau sa de error

Puede haber decla rado un campo en un tipo de inter faz. Por ejem plo, losiguiente gene rará este men saje de error:

IYamW hatI Yam = in ter fa ce(IInter fa ce) ['{360C6A60-6EE0-11D4-A238-705350C10000}'] FSpi nach Brand: String; //esto no tie ne sen ti do; pro vo ca el error func tion Smooch Oli ve Oil(const unk Ou ter: Iunk nown; const iid: TIID; out obj): HRe sult; stdcall;

254 Los Tomos de Delphi: Delphi sin problemas

Page 289: Dsp

func tion Bash Bru tus(fLock: BOOL): HRe sult; stdcall;end;

So lu ción rá pi daEli mine el campo de la decla ra ción de inter faz. Las inter fa ces no alma ce nanvalo res, y por lo tanto no pue den con te ner cam pos.

Infor ma ción adi cio nalEn lo que a mí res pecta, IUnknown es un nom bre un poco ridículo para lainter faz base. Lo siguiente, extraído del archivo SYSTEM.PAS de Del phi, esmucho más sig ni fi ca tivo:

IInter fa ce = IUnknown;

Pero no obs tante, es sim ple mente un nom bre, des pués de todo.

Field definition not allowed after methods or propertiesPo si ble cau sa de error

1. Puede estar inten tando aña dir un campo (o cam pos) a una decla ra ción declase des pués de decla rar un método o pro pie dad.

2. Puede haber aña dido las direc ti vas Index, Sto red, Default o Node fault des-pués de una fun ción en una sec ción Auto ma ted. Por ejem plo:

au to ma ted func tion yow za: string; in dex;

So lu ción rá pi da1. Las defi ni cio nes de campo deben ser situa das antes de las decla ra cio nes de

méto dos y pro pie da des.2. No uti lice estas direc ti vas en una sec ción Auto ma ted.

Infor ma ción adi cio nalEste es un ejem plo del orden correcto para decla rar un campo y un método:

pri va te FApprai sed Va lue: Cu rrency; . . . {Cam pos adicionales} pro ce du re Show Lis ting; . . . {Mé to dos adi cio na les}

Mensajes de error 255

Page 290: Dsp

Field in group by must be in result setPo si ble cau sa de error

Puede tener una sen ten cia SQL que hace refe ren cia en una cláu sula GROUPBY a un campo que no está incluido en la cláu sula SELECT. Por ejem plo,puede tener algo así:

SELECT Tit le, Pro ta go nist, Ra ting, Count(*)FROM Mo viesWHERE Pro ta go nist = 'Bo gart'OR Pro ta go nist = 'Bran do'GROUP BY Ra ting

So lu ción rá pi daSi uti liza una cláu sula GROUP BY en una sen ten cia SQL, incluya todos loscam pos de la parte SELECT en la parte GROUP BY (exclu yendo las colum nascal cu la das, como las crea das con las fun cio nes de agre ga ción COUNT, SUM,MIN, MAX y AVG). Por ejem plo, la sen ten cia de arriba nece sita ser modi fi cadade la siguiente forma:

SELECT Tit le, Pro ta go nist, Ra ting, Count(*)FROM Mo viesWHERE Pro ta go nist = 'De Ni ro'OR Pro ta go nist = 'Si ni se'GROUP BY Tit le, Pro ta go nist, Ra ting

Infor ma ción adi cio nalLa sin ta xis de SQL exacta reque rida o per mi tida depende del tipo de base dedatos al que esté acce diendo y la ver sión del BDE que esté uti li zando. Paradeta lles más espe cí fi cos, con sulte la docu men ta ción del ser vi dor (si uti liza unabase de datos de ser vi dor SQL) o el archivo de ayuda del SQL Local que vienecon Del phi (si uti liza Para dox o dBASE).

Field in order by must be in result setPo si ble cau sa de error

Puede estar inten tado orde nar por un campo que no existe o no ha sido espe ci-fi cado en la cláu sula SELECT de la sen ten cia SQL.

So lu ción rá pi daVeri fi que que el campo por el que está inten tando orde nar (uti li zando la cláu-sula ORDER BY) esté en alguna de las tablas espe ci fi cadas en la cláu sulaFROM de la sen ten cias SQL, que el campo esté incluido en la cláu sula

256 Los Tomos de Delphi: Delphi sin problemas

Page 291: Dsp

SELECT de la sen ten cia SQL, y que el nom bre del campo esté correc ta menteescrito.

Infor ma ción adi cio nalPara orde nar por un campo par ti cu lar, el campo debe de estar incluido en elcon junto resul tado que es pro du cido por la sen ten cia SQL. Por ejem plo, lassiguien tes sen ten cias SQL pro du ci rán este men saje de error:

SELECT Pea ches, Straw be rriesFROM Fruits tandORDER BY Ba na nas

El campo por el que esta sen ten cia intenta orde nar no apa rece en la cláu sulaSELECT. Puede rec ti fi car esto aña diendo explí cita o implí ci ta mente el campoBana nas a la cláu sula SELECT de la sen ten cia SQL.

Para aña dir explí ci ta mente el campo Bana nas a la cláu sula SELECT de la sen-ten cia SQL, haga esto:

SELECT Pea ches, Straw be rries, Ba na nasFROM Fruits tandORDER BY Ba na nas

Para aña dir implí ci ta mente el campo Bana nas (así como los demás cam pos dela tabla) a la cláu sula SELECT de la sen ten cia SQL, haga esto:

SELECT *FROM Fruits tandORDER BY Ba na nas

No tiene que limi tar su cri te rio de selec ción a una única tabla, siem pre ycuando las tablas que selec cione estén rela cio na das unas con otras por uncampo común. Por ejem plo, si quiere encon trar en qué año los equi pos de unamisma ciu dad gana ron el cam peo nato de rugby (SuperBowl) y de béis bol(World Series), podría hacer esto:

SELECT B.ThatC ham pions hip Sea sonFROM Ba se ball B, Foot ball FWHERE B.City = F.CityAND B.ThatC ham pions hip Sea son = F.ThatC ham pions hip Sea sonORDER BY B.ThatC ham pions hip Sea son

Field index out of rangePo si ble cau sa de error

1. Puede estar inten tando acce der al índice de una tabla uti li zando un valorde índice mayor que el índice más alto defi nido en la tabla. Por ejem plo, losiguiente gene rará este men saje de error:

Mensajes de error 257

Page 292: Dsp

with Ta ble1 do for i := 1 to Index Field Count do . . .

2. Puede estar uti li zando los méto dos Find Key o Find Nea rest de TTa ble contablas dBASE e índi ces de expre sión.

3. Puede estar inten tando indi zar una tabla por un campo cal cu lado cuya pro-pie dad Field Kind tiene el valor fkCal cu la ted.

4. Puede estar inten tando esta ble cer una rela ción Maes tro/Deta lle entre dostablas sin haber asig nado a la pro pie dad Index Name de la tabla de deta lleun índice que sea com pa ti ble con la tabla maestra.

So lu ción rá pi da1. Recuerde que en la VCL los ele men tos indiza dos se basan nor mal mente en

cero. El ejem plo de arriba debe ser modi fi cado, res tando 1 a la pro pie dadIndex Field Count si la varia ble de con trol del bucle For empieza con 0:

with Ta ble1 do for i := 0 to Index Field Count-1 do . . .

2. Uti lice el método GoTo Nea rest del com po nente TTa ble si está tra tando contablas dBASE e índi ces de expre sio nes.

3. Si quiere orde nar por un campo cal cu lado, cam bie el valor de la pro pie dadField Kind del campo de fkCal cu la ted a fkInter nal Calc.

4. Asigne a la pro pie dad Index Name de la tabla de deta lle la clave forá neaque con cuerda con la clave pri ma ria de la tabla maes tra.

Infor ma ción adi cio nal1. Recuerde que los índi ces, como todas las pro pie da des de tipo array, se indi-

zan a par tir de cero.3. Los cam pos cal cu la dos no se alma ce nan real mente en la base de datos, a

menos que se asigne fkInter nal Calc a la pro pie dad Field Kind.

Field name already exists. Rename one of the fieldsPo si ble cau sa de error

Puede haber asig nado el mismo nom bre a dos cam pos en el Data base Desk top.Por ejem plo, puede tener dos cam pos con el nom bre Address.

So lu ción rá pi daCam bie el nom bre de uno de los cam pos dupli ca dos. En el ejem plo de arriba,cam bie el nom bre del segundo campo de Address a Address2 (o cam bie el pri-mero a Address1 y el segundo a Address2).

258 Los Tomos de Delphi: Delphi sin problemas

Page 293: Dsp

Infor ma ción adi cio nalLos atri bu tos Type, Size y Key de los cam pos no tie nen que coin ci dir para quese pro duzca este men saje de error — siem pre que los dos nom bres sean igua-les, este men saje de error se gene rará.

Field not found in tablePo si ble cau sa de error

1. Puede estar inten tando aña dir un índice a una tabla, pero ha espe ci fi cadoun campo que no existe en el método AddIndex de TTa ble. Por ejem plo, losiguiente gene rará este men saje de error si ha escrito mal el campo Geekocomo Gecko:

with Ta ble1 AddIndex('Chip heads', 'Gec ko', []);

2. Puede estar inten tando aña dir un índice de expre sión a una tabla dBASE,pero no ha espe ci fi cado ixExpres sion en el pará me tro Options de AddIndex.Por ejem plo, lo siguiente gene rará este men saje de error:

with Ta ble1 AddIndex('City Sta te',' city+sta te', []);

So lu ción rá pi da1. Verifique que el campo que espe ci ficó existe en la tabla.2. Añada la cons tante ixExpres sion de tipo TIndexOption en el ter cer pará-

me tro (Options) del método AddIndex de TTa ble, así:

with Ta ble1 AddIndex('City Sta te', 'city+sta te', [ixExpres sion]);

Infor ma ción adi cio nalEl pri mer pará me tro que se pasa al método Addin dex de TTa ble es el nom bredel índice, el segundo es el nom bre de los cam pos que com po nen el índice, y elter cero es un con junto de valo res TIndexO ptions. Los valo res válidos depen dendel tipo de tabla que esté indi zando. Para más infor ma ción, con sulte“AddIndex” en la ayuda de Del phi.

Field or method identifier expectedPo si ble cau sa de error

1. Puede haber espe ci fi cado un iden ti fi ca dor que no es un campo o métodocomo iden ti fi ca dor de acceso de escri tura o lec tura de una pro pie dad. Por

Mensajes de error 259

Page 294: Dsp

ejem plo, lo siguiente gene rará este men saje de error (a menos quefajdlskdfajlsk sea un campo o nom bre de método):

pro perty Rates: string read fajdlskdfajlsk wri te FRa tes;

2. Puede haber decla rado un método de escri tura o lec tura para una pro pie-dad sin haber decla rado el método. Por ejem plo, lo siguiente gene rará estemen saje de error si no ha decla rado GetS tart Date:

pro perty Start Da te: String read GetS tart Da te;

So lu ción rá pi da1. Uti lice un campo o método que haya sido pre via mente decla rado como

parte de la clase. Por ejem plo, esto fun cio nará:

...pri va te FRa tes;pu blic ...pu blis hed pro perty Ra tes: string read FRa tes wri te FRa tes;

2. Declare el método en la clase antes de hacer una refe ren cia a él a tra vés dela pro pie dad:

pri va te func tion GetS tart Da te: TDa te Ti me; . . . pu blic pro perty Start Da te: TDa te Ti me read GetS tart Da te; . . .

Infor ma ción adi cio nal1. Por con ve nio, los cam pos uti li za dos en las pro pie da des empie zan con la

letra ‘F’, y los méto dos uti li za dos en las pro pie da des comien zan por ‘Get’para los méto dos de lec tura y ‘Set’ para los de escri tura.Es común uti li zar un campo en el espe ci fi ca dor de acceso de lec tura y unmétodo en el espe ci fi ca dor de acceso de escri tura. Sin embargo, puede espe-ci fi car un campo o un método en ambas par tes de una decla ra ción depro pie dad. Por ejem plo, una pro pie dad típica puede ser decla rada así:

pro perty RealE sta te: Cu rrency read FRealE sta te wri te Set RealE sta te;

aun que es per mi tido uti li zar el mismo campo para ambas cláu su las de lec-tura y escri tura, así:

pro perty RealE sta te: Cu rrency read FRealE sta te wri te FRealE sta te;

o uti li zar méto dos (dife ren tes) para el acceso de lec tura y el de escri tura,así:

260 Los Tomos de Delphi: Delphi sin problemas

Page 295: Dsp

pro perty RealE sta te: Cu rrency read Get RealE sta te wri te Set RealE sta te;

2. Recuerde que tam bién hay que defi nir el método en la sec ciónImple men ta tion.

Field out of rangePo si ble cau sa de error

Puede estar inten tando orde nar por un campo cal cu lado que no es del tipofkInter nal Calc.

So lu ción rá pi daPara orde nar por un campo cal cu lado, asigne fkInter nal Calc a la pro pie dadField Kind del corres pon diente TField.

Infor ma ción adi cio nalSi asigna fkInter nal Calc a la pro pie dad Field Kind del objeto TField, el valordel campo es alma ce nado en la base de datos. Para deta lles más espe cí fi cossobre los tipos de cam pos dis po ni bles y sus posibilidades, con sulte “Field Kind”en la ayuda de Del phi. Vea el artículo “Client Data set: MIDAS on the Cheap”en la edi ción de abril de 1998 de The Del phi Infor mant para más infor ma ciónsobre el uso de cam pos cal cu la dos en el com po nente TClient Da ta Set.

Field types do not matchPo si ble cau sa de error

Puede haber selec cio nado Table Loo kup (Bús queda en Tabla) en el Data baseDesk top y haber inten tado enla zar dos cam pos que no son del mismo tamaño.

So lu ción rá pi daPara poder enla zar dos tablas con capa ci dad de bús queda (loo kup), debe selec-cio nar dos cam pos (uno de cada tabla) que sean idén ti cos en cuanto a tipo dedatos y tamaño (si es apli ca ble).

Infor ma ción adi cio nalLos nom bres de los dos cam pos no impor tan, siem pre que sean com pa ti blesdesde la pers pec tiva del Data base Desk top (el mismo tipo de datos, y el mismotamaño, si éste es apli ca ble al tipo de datos). Por ejem plo, puede enla zar cual-quier campo de tipo Num ber de la tabla A con cual quier campo de tipo Num berde la tabla B, no importa cuá les sean los nom bres de los cam pos. Si quiere

Mensajes de error 261

Page 296: Dsp

enla zar dos tablas mediante cam pos Alpha, no obs tante, los cam pos no sola-mente deben ser cam pos Alpha sino que deben tener asig nado el mismotamaño. Por ejem plo, dos cam pos Alpha con una lon gi tud de 12 carac te res pue-den ser uti li za dos para enla zar dos tablas para la bús queda. Sin embargo,inten tar uti li zar para este pro pó sito dos cam pos Alpha, uno de lon gi tud 12 yotro con una lon gi tud de 15, pro du ci ría este men saje de error.

Field value requiredPo si ble cau sa de error

Puede haber fallado la asig na ción de un valor a un campo obligatorio. Porejem plo, si el pri mer campo en una tabla es obligatorio, lo siguiente gene raráeste men saje de error:

Ta ble1.Insert Re cord([Null, Now, 'Fi let Mig non', 'Me dium', 'Ita lian', 'Zin fan del', 'Chee se ca ke', 'Ken ya AA']);

No pro por cio nar valo res obli ga to rios cuando se intro du cen datos manual menteen tiempo de eje cu ción pro duce tam bién este error.

So lu ción rá pi daAse gú rese de asig nar valo res a todos los cam pos obligatorios.

Infor ma ción adi cio nalCon sulte en la des crip ción del mensaje “Field <> must have a value” las téc-ni cas para ase gu rarse de que toda la infor ma ción nece sa ria sea pro por cio nada.

File <> not foundPo si ble cau sa de error

Puede haber intro du cido el nom bre de un archivo no exis tente en un cua dro dediá logo que pre gunta por el nom bre de un archivo.

So lu ción rá pi daIntro duzca el nom bre de un archivo que exista y sea apro piado para cual quiertipo de acción que vaya a rea li zar con él o sobre él.

Infor ma ción adi cio nalUn ejem plo de los muchos que podrían pro vo car este men saje de error es siintenta ins ta lar un com po nente, y luego intro duce el nom bre de una uni dad noexis tente en el cua dro de edi ción Unit File Name.

262 Los Tomos de Delphi: Delphi sin problemas

Page 297: Dsp

Puede ser con ve niente uti li zar boto nes de bús queda, cuando estén dis po ni bles,para hacer posi ble nave gar hasta el archivo que se quiera uti li zar. De estamanera sola mente se selec cio narán archi vos váli dos, eli mi nando la nece si dadde adivinación, los nom bres mal escri tos, etc.

File access deniedPo si ble cau sa de error

1. El archivo al que está inten tando acce der puede haber sido con fi gu radocomo de sólo lec tura a tra vés del Explo ra dor de Win dows u otro pro grama.

2. Puede estar inten tando abrir para escri tura un archivo cuya pro pie dadFile Mode es igual a 0 (sólo lec tura).

So lu ción rá pi da1. Com pruebe que esté auto ri zado para acce der al archivo. Cam bie el atri buto

de sólo lec tura del archivo de True a False en el Explo ra dor de Win dowssiguiendo estos pasos:a. Localice el archivo y luego pulse con el botón derecho del ratón sobre él.b. Seleccione Prop iedades del menú de contexto.

c. Si la casilla Sólo Lectura está seleccionada, desmárquela.2. Cam bie el valor de File Mode a 2 antes de acce der al archivo, si es nece sa-

rio, así:

var tF: Text Fi le;be gin Fi le Mo de := 2; Assign Fi le(tF, 'AchtDrei.txt'); . . .

Infor ma ción adi cio nalPara más infor ma ción, con sulte “File Mode” en la ayuda de Del phi.

File extension <> is not valid. Expecting <>Po si ble cau sa de error

Está inten tando uti li zar un archivo para algo para lo que (se supone) no estádes ti nado (o la exten sión del archivo ha sido modi fi cada inad ver ti da mente deforma tal que el archivo parece ina de cuado para la acción actual).

Mensajes de error 263

Page 298: Dsp

So lu ción rá pi daSelec cione sola mente archi vos del tipo apro piado para cada tipo de operación.Por ejem plo, selec cione únicamente archi vos con exten sión .DPK cuando creeun nuevo paquete.

Infor ma ción adi cio nalLa exten sión del archivo indica al mundo qué tipo de archivo es, y por tantoqué se puede hacer con él. Por ejem plo, un archivo .DPK no puede pro du cirsoni dos, y una exten sión .WAV no puede ser uti li zada para un archivo depaquete.

File is Locked. Table: <> User: <>Po si ble cau sa de error

Puede estar inten tando abrir una tabla que otro usua rio ha abierto en modoexclu sivo.

So lu ción rá pi daPuede veri fi car el estado de la tabla antes de acce der a ella, así:

if not Ta ble1.Exclu si ve then . . .

Infor ma ción adi cio nalEs nece sa rio colo car una tabla en modo exclu sivo antes de se que puedan eje-cu tar cier tas ope ra cio nes, como crear índi ces. Ase gú rese siem pre de qui tar elmodo exclu sivo cuando haya ter mi nado, para no impe dir inne ce sa ria mente queotros usua rios pue dan acce der a la tabla.

Si trata de abrir la tabla en modo exclu sivo, y alguien tiene ya la tabla abierta,reci birá el men saje de error “Table is busy”. Con sulte dicha entrada para másinfor ma ción sobre cómo tra tar ese inci dente.

Para más infor ma ción, con sulte “exclu sive lock” en la ayuda de Del phi.

File not assignedPo si ble cau sa de error

Puede haber olvi dado lla mar a Assign File antes de lla mar a Rew rite, Reset,Append, Rename o Erase. Por ejem plo, lo siguiente gene rará este men saje deerror:

264 Los Tomos de Delphi: Delphi sin problemas

Page 299: Dsp

var tex: Text Fi le;be gin Rew ri te(tex); Wri teln(tex, 'I think I for got something'); Clo se Fi le(tex);end;

So lu ción rá pi daTenga pre sente lla mar siem pre a Assign File antes de inten tar uti li zar Rew rite,Reset, Append, Rename o Erase sobre un archivo:

var tex: Text Fi le;be gin Assign Fi le(tex, 'McMurtry.txt'); try Rew ri te(tex);

Wri teln(tex, 'Lo ne so me Dove'); . . . fi nally Clo se Fi le(tex); end;end;

Infor ma ción adi cio nalEste es el error de Entrada/Salida número 102.

File not found <>Po si ble cau sa de error

1. Puede tener una uni dad en la sec ción Uses cuyo nom bre no coin cide con elde la ver da dera uni dad, la uni dad no existe en su sis tema o no puede serencon trada debido a que no está ubi cada en la ruta de bús queda de Del phi(o a su vez hace refe ren cia a una uni dad que cum ple lo ante rior).

2. Puede estar inten tando ins ta lar un com po nente den tro de un paquete, yuna uni dad a la que se hace refe ren cia en la uni dad del com po nente no seencuen tra en la ruta. Esto puede pasar con una uni dad de regis tro (unauni dad que con tiene el pro ce di miento Regis ter para varios com po nen tesque se lis tan en la cláu sula Uses) cuando una de las uni da des a la quehace refe ren cia no está en la ruta de bús queda de Del phi.

3. En Del phi 3, puede estar inten tando uti li zar un com po nente TRe port(Report Smith), pero no ha aña dido toda vía el camino de Report.DCU en laruta de bús queda de Del phi.

4. Un archivo de recursos puede estar ausente.5. Puede estar inten tando abrir un archivo de texto que no existe, uti li zando

el pro ce di miento Append o Reset.

Mensajes de error 265

Page 300: Dsp

6. Puede estar inten tando ins ta lar un com po nente uti li zando el archivo .DCUen lugar del archivo .PAS.

7. Puede haber incluido un archivo .DPK en la sec ción Con tains de otroarchivo .DPK (archivo de paquete).

8. Puede estar inten tando uti li zar el enlace tem prano de con tro les Acti veXsin impor tar pri mero el archivo apro piado en Del phi.

So lu ción rá pi da1. Veri fi que que ha escrito correc ta mente el nom bre de la uni dad, si lo

introdujo manual mente. Si no está uti li zando la uni dad, bórrela de la listade la cláu sula Uses. De lo con tra rio, veri fi que que el direc to rio en el quereside el archivo .DCU corres pon diente a la uni dad está en la ruta de bús-queda de Del phi (vea la Solu ción rápida #2 más abajo).

2. Añada el camino donde reside el archivo a la ruta de bús queda de Del phi(que puede ser con sul tada en Tools | Envi ron ment Options, selec cio-nando la pes taña Library), o mueva el archivo a un direc to rio de la rutade búsqueda.

3. En una ins ta la ción por defecto de Del phi 2, el archivo Report.DCU quedasituado en las siguien tes loca li za cio nes:C:\Archi vos de pro gra ma\Bor land\Del phi X\LIB\DELPHI2C:\Archi vos de pro gra ma\Bor land\Del phi X\SlibEl com po nente TRe port no se ins tala por defecto. Está incluido toda vía enDel phi 3 (pero no en Del phi 4 y supe rio res), y puede ins ta larlo siguiendoestos pasos:a. Seleccione Com po nent | Con fig ure Pal ette. . . .

b. Seleccione Data Access de la lista Pages.c. Navegue hasta localizar el componente TReport.d. Seleccione el componente TReport.e. Pulse el botón Add. El componente TReport será añadido a la página

Data Access de la Paleta de Componentes.4. Loca lice los recur sos y mué va los al direc to rio del pro yecto.5. No uti lice el pro ce di miento Reset sobre archi vos que no exis tan en el

momento de la llamada.6. La uti li za ción de un archivo .DCU para ins ta lar un com po nente nor mal-

mente fun ciona bien, pero si el archivo .DCU fue com pi lado uti li zando unaver sión ante rior de Del phi, usted nece si tará ins ta larlo uti li zando el archivo.PAS.

7. Si ha incluido el nom bre de una uni dad de paquete (.DPK) en la sec ciónCon tains de otro archivo de paquete, elimínelo.

8. Importe el archivo en Del phi selec cio nando Pro ject | Import TypeLibrary.

266 Los Tomos de Delphi: Delphi sin problemas

Page 301: Dsp

Infor ma ción adi cio nal1. En este caso, Del phi bus cará un archivo con el nom bre que apa rece en la

sec ción Uses con una exten sión .DCU.Si desea abrir un archivo para escri tura uti li zando el pro ce di mientoAppend, es reco men da ble pre pa rarse para la no exis ten cia del archivo en elmomento de la lla mada mediante pro gra ma ción defen siva. Por ejem plo,podría uti li zar un código simi lar al siguiente para evi tar erro res oca sio na-dos por archi vos ine xis ten tes:

pro ce du re TForm1.btnWri te To Text Fi leC lick(Sen der: TObject);var tF: Text Fi le;be gin Assign Fi le(tF, 'sex ye xe.txt'); if Fi leE xists(Chan ge Fi leExt(Pa ramstr(0),'.txt')) then Append(tF)

else Rew ri te(tF); Wri teLn(tF, Da te Ti me ToStr(Now)); Clo se Fi le(tF);end;

8. Los archivos de biblio te cas de tipos pue den tener las siguien tes exten sio-nes: OLB, TLB, OCX, DLL y EXE.

File not openPo si ble cau sa de error

1. Puede estar inten tando eje cu tar alguna ope ra ción de lec tura o de escri turasobre un archivo que no está abierto. Por ejem plo, el siguiente código oca-sio nará este men saje de error:

var Tex ti le fi le: Text Fi le;be gin Assign Fi le(Tex ti le fi le, 'bell bot toms.txt'); Wri teln(Tex ti le fi le, 'The hip pies in the sixties’); Clo se Fi le(Tex ti le fi le);end;

2. Puede estar inten tando escri bir en un archivo que no existe o que existepero es de sólo lec tura. Por ejem plo, uti li zar el pro ce di miento Append paraescri bir en un archivo que no existe, o inten tar escri bir en un archivo detexto abierto con el pro ce di miento Reset gene rará este men saje de error. Amodo de ejem plo, el siguiente código gene rará este error cuando intenteescri bir en un archivo de sólo lec tura (debido a que ha sido abierto con elpro ce di miento Reset):

Mensajes de error 267

Page 302: Dsp

var JSBach: Text Fi le;be gin Assign Fi le(JSBach,'Meis ters tuec ke.txt'); try

Re set(JSBach); Wri teln(JSBach, 'Wa chet auf, ruft uns die Stim me');

Wri teln(JSBach, 'Je su, Joy of Man''s De si ring'); . . .

fi nally Clo se Fi le(JSBach); end;end;

3. Si ha creado algún pro ce di miento que direc ta mente inter cepta men sa jes deWin dows (méto dos de manejo de men sa jes), puede que esté inten tandoacce der a un archivo de texto den tro de un men saje de Win dows que esdes pa chado antes de que el archivo de texto pueda ser creado (por ejem ploWM_CREATE) o des pués que el archivo de texto haya sido cerrado (porejem plo WM_DESTROY). Para ilus trar esto, podría mos rede fi nir el ges tordel men saje de Win dows WM_KEYDOWN decla rando un pro ce di mientouti li zando esta sin ta xis:

pro ce du re wmkey down(var Mes sa ge: TMes sa ge); mes sa ge WM_KEYDOWN;

Luego debe mos defi nir el pro ce di miento en la parte Imple men ta tion de launi dad así:

pro ce du re TForm1.wmkey down(var Mes sa ge: TMessage);be gin in he ri ted; { para ejecutar la fun cio na li dad pre de fi ni da } {Cual quier cosa que que ramos ha cer cuan do el men sa je WM_KEYDOWN sea des pa cha do}end;

Por ejem plo, para seguir la pista a los even tos que se están produciendo,podría mos hacer algo así:

Wri teln(tf, ‘Envia do men sa je Key Down’);end;

Inten tar escri bir en un archivo de texto durante ciertos even tos (comoWM_CREATE y WM_DESTROY, entre otros) pro du ci ría este men saje deerror.

4. Puede haber inten tado escri bir una línea en blanco en un archivo de textodel sis tema que ha sido asig nado a la impre sora. Por ejem plo, lo siguientegene rará este error:

pro ce du re TBadI dea.SetT heS ta ge; be gin Screen.Cur sor := crHour glass; AssignPrn(Print Text); Rew ri te(Print Text); Prin ter.Can vas.Font.Name := 'Arial';

268 Los Tomos de Delphi: Delphi sin problemas

Page 303: Dsp

Prin ter.Can vas.Font.Size := 16; Prin ter.Can vas.Font.Style := [fsBold]; Wri teln(Print Text,'Don’‘t lea ve me, oh my dar ling'); Wri teln; // Esto ge ne ra el error

So lu ción rá pi da1. Debe lla mar a Rew rite, Reset o Append antes de poder escri bir en el

archivo, de la siguiente forma:

var Tex ti le fi le: Text Fi le;be gin Assign Fi le(Tex ti le fi le, 'cor du roy.txt'); try if Fi leE xists('cor du roy.txt') then

Append(Tex ti le fi le) else Rew ri te(Tex ti le fi le); Wri teln(Tex ti le fi le, 'The hip pies of the sixties'); fi nally Clo se Fi le(Tex ti le fi le);

end;end;

2. Veri fi que que el archivo existe antes de inten tar escri bir en él, y uti liceAppend o Rew rite en lugar de Reset, de ésta forma:

var JSBach: Text fi le;be gin Assign Fi le(JSBach,'Meis ters tueck.txt'); try if Fi leE xists('Meis ters tueck.txt') then Append(JSBach) else Rew ri te(JSBach); Wri teln(JSBach, 'Air on a G string'); Wri teln(JSBach, 'Je su, Joy of Man''s De si ring'); fi nally Clo se Fi le(JSBach); end;end;

3. No intente escri bir en un archivo den tro de un evento que ocu rra antes deque el archivo de texto haya sido creado. Si desea tener un archivo de textodis po ni ble (diga mos, por ejem plo, como un archivo de regis tro o erro resdurante la depu ra ción), debe asig narlo y abrirlo en el evento OnCreate delfor mu la rio prin ci pal, y cerrarlo en el evento OnDes troy del for mu la rioprin ci pal.

4. Añada el nom bre del archivo de texto del sis tema como pará me tro de lasen ten cia Wri teln, así:

Mensajes de error 269

Page 304: Dsp

pro ce du re TGoodI dea.SetT heS ta ge; be gin Screen.Cur sor := crHour glass; AssignPrn(Print Text); Rew ri te(Print Text); Prin ter.Can vas.Font.Name := 'Arial'; Prin ter.Can vas.Font.Size := 16; Prin ter.Can vas.Font.Style := [fsBold]; Wri teln(Print Text,'For I know I must be bra ve’); Wri teln(Print Text);

Infor ma ción adi cio nal1. Uti lice el pro ce di miento Append para aña dir datos a un archivo. Uti lice el

pro ce di miento Rew rite para sobres cri bir y reem pla zar un archivo exis tente.Uti lice Reset para abrir un archivo para lec tura.

4. Cuando escriba en un archivo de texto que no haya sido asig nado a laimpre sora, no nece sita aña dir el pará me tro; un sim ple Wri teln será sufi-ciente para aña dir una línea en blanco.

File not open for inputPo si ble cau sa de error

1. Puede estar inten tando leer de un archivo de texto que no ha sido abiertopara lec tura. Por ejem plo, el siguiente código gene rará este error, ya que elpro ce di miento Reset no ha sido lla mado:

var coo kie: Text Fi le; s : String; i : Inte ger;be gin i:=0;

Assign Fi le(coo kie,'his tory.txt'); try

whi le not eof(coo kie) do be gin readln(coo kie, s); cbxSi tes Vi si ted.items[i]:= s; inc(i); end; fi nally Clo se Fi le(coo kie); end;end;

2. Puede haber uti li zado una sen ten cia Read o Readln sin pro por cio nar elnom bre de la varia ble del archivo de texto para leer. Por ejem plo, losiguiente gene rará este men saje de error:

270 Los Tomos de Delphi: Delphi sin problemas

Page 305: Dsp

Readln(s);

So lu ción rá pi da1. Antes de inten tar leer desde un archivo, llame al pro ce di miento Reset.

Para arre glar el ejem plo de arriba, añada la lla mada antes del bucle While,así:

. . .Assign Fi le(coo kie,'his tory.txt');try Re set(coo kie); whi le not eof(coo kie) do . . .

2. Añada el nom bre de la varia ble del archivo de texto, así:

Readln(So me Text Fi le, s);

Infor ma ción adi cio nal1. Uti lice el pro ce di miento Append para aña dir datos a un archivo. Uti lice el

pro ce di miento Rew rite para sobres cri bir y reem pla zar un archivo exis tente.Uti lice Reset para abrir un archivo para lec tura.

2. Los pro gra mas de Win dows requie ren la varia ble de archivo, así como lavaria ble de cadena en la que se leerá la línea.

File not open for outputPo si ble cau sa de error

1. Puede estar uti li zando Del phi 1 y el pro ce di miento Wri teln sin haber aña-dido la uni dad WinCRT a la cláu sula Uses.

2. Puede estar inten tando escri bir en un archivo de texto que ha sido abiertocon el pro ce di miento Reset.

So lu ción rá pi da1. Añada WinCRT a la cláu sula Uses de la uni dad.2. Abra los archi vos para escri tura con Append o Rew rite, no con Reset. No se

puede abrir un archivo que no existe, por lo que debe uti li zar la siguientelógica para escri bir en un archivo la pri mera vez o para pre pa rarse ante laeven tua li dad de que el archivo no exista:

. . .Assign Fi le(Sing Sing,'nail.txt');if Fi leE xists('nail.txt') then Append(Sing Sing)else

Mensajes de error 271

Page 306: Dsp

Rew ri te(Sing Sing);

Infor ma ción adi cio nal2. Uti lice el pro ce di miento Append para aña dir datos a un archivo. Uti lice el

pro ce di miento Rew rite para sobres cri bir y reem pla zar un archivo exis tente.Uti lice Reset para abrir un archivo para lec tura.

Este es el error de Entrada/Salida número 105.

File or directory does not existPo si ble cau sa de error

Puede haber espe ci fi cado una tabla que no existe en una sen ten cia SQL. Porejem plo, con la pro pie dad Data ba se Name de un TQuery asig nada aDBDEMOS, la siguiente sen ten cia SQL gene rará este men saje de error:

SELECT *FROM ANIMULES

So lu ción rá pi daAse gú rese que la tabla espe ci fi cada realmente existe en la ubi ca ción que haespecificado. Puede ser un sim ple pro blema de orto gra fía, que puede ser solu-cio nado en este caso con:

SELECT *FROM ANIMALS

Infor ma ción adi cio nalSi está tra ba jando con alias loca les (están dar) y no ha espe ci fi cado el tipo detabla a la que está inten tando acce der, Del phi pri mero bus cará una tabla Para-dox, luego dBASE y por último un archivo ASCII (texto).

File type not allowed herePo si ble cau sa de error

1. Puede haber inten tado decla rar una varia ble de tipo File of File, File ofText, o File of Tex tFile.

2. Puede haber inten tado pasar un tipo de archivo como pará me tro por valor.Por ejem plo, lo siguiente gene rará este error:

pro ce du re Le go Ma nia(Tech nik: file);

272 Los Tomos de Delphi: Delphi sin problemas

Page 307: Dsp

So lu ción rá pi da1. No intente decla rar varia bles de esos tipos.2. No pase tipos de archi vos como pará me tros por valor. Hágalo así:

pro ce du re Le go Ma nia(VAR Tech nik: file);

Infor ma ción adi cio nalPuede pasar un tipo de archivo como pará me tro Var o Const. Para más infor-ma ción, con sulte “para me ters” en la ayuda de Del phi. Por defecto, los pará me-tros son pasa dos por valor.

Fixed column count must be less than column countPo si ble cau sa de error

Puede haber asig nado a la pro pie dad Fixed Cols de un con trol TString Grid oTDraw Grid un número mayor que la can ti dad de colum nas de la reji lla.

So lu ción rá pi daNo asigne a la pro pie dad Fixed Cols un valor mayor o igual que la can ti dad decolum nas que la reji lla con tiene. Si per mite que el usua rio asigne el número decolum nas, ase gú rese que éste no sobre pase el máximo valor válido. Por ejem-plo, podría hacer algo así:

pro ce du re TForm1.But ton14Click(Sen der: TObject);const crlf = #13#10; {o há ga lo una cons tan te glo bal} // pro ce du re What che ma co lumn(Col Num: Inte ger); be gin if Col Num < String Grid1.Col Count then String Grid1.Fi xed Cols := Col Num else Mes sa geDlg('El nú me ro de co lum nas fi jas debe ser menor’ + crlf + ‘que la can ti dad to tal de co lum nas’, mtInfor ma tion, [mbOK], 0); end;be gin What che ma co lumn(StrToInt(Edit1.Text));end;

Infor ma ción adi cio nalDebe tener al menos una columna que no sea fija.

Mensajes de error 273

Page 308: Dsp

Fixed row count must be less than row countPo si ble cau sa de error

Puede haber asig nado a la pro pie dad Fixed Rows de un con trol TString Grid oTDrawG rid un número mayor que la can ti dad de filas de la reji lla.

So lu ción rá pi daNo asigne a la pro pie dad Fixed Rows un valor mayor o igual que la can ti dad dede filas que con tiene la reji lla. Si per mite que el usua rio asigne el número defilas, ase gú rese de que éste no sobre pase el máximo valor válido. Por ejem plo,podría hacer algo así:

pro ce du re TForm1.But ton14Click(Sen der: TObject);const crlf = #13#10; {o há ga lo una cons tan te glo bal} // pro ce du re Prett yMaidsAllInARow(Row Num: Inte ger); be gin if Row Num < String Grid1.Row Count then String Grid1.Fi xed Rows := Row Num else Mes sa geDlg('El nú me ro de fi las fi jas debe ser me nor’ + crlf + ‘que la can ti dad to tal de fi las', mtInfor ma tion, [mbOK], 0); end;be gin Prett yMaidsAllInARow(StrToInt(Edit1.Text));end;

Infor ma ción adi cio nalDebe tener al menos una fila que no sea fija.

For Loop control variable must be simple local variablePo si ble cau sa de error

Puede haber uti li zado un campo de un regis tro o de una clase como varia ble decon trol en un bucle For. Por ejem plo, lo siguiente gene rará este men saje deerror:

type TDa te Rec = re cord Year: Inte ger; Month: 1..12; Day: 1..31; end;

274 Los Tomos de Delphi: Delphi sin problemas

Page 309: Dsp

var Date: TDa te Rec;be gin for Date.Year := 1984 to 2001 do Orwe llian(Su per man);

So lu ción rá pi daUti lice una “varia ble local sim ple” para los bucles, como la apre ciada i:

var i: Inte ger;be gin for i := 0 to Pred(AmountOfWoodT hatA Wood chuck CanC huck) do ...

Infor ma ción adi cio nalEs legal uti li zar una varia ble glo bal como varia ble de con trol de un bucle For(por com pa ti bi li dad hacía atrás), pero el uso de una varia ble local pro duce uncódigo más efi ciente.

For Loop control variable must have ordinal typePo si ble cau sa de error

Puede haber inten tado uti li zar como varia ble de con trol de un bucle For unavaria ble de un tipo de datos que no es un tipo ordi nal (Boo lean, Char,WideChar, Inte ger, enu meración, sub rango). Por ejem plo, lo siguiente gene raráeste men saje de error:

var flcv, Win nieT he Pooh: String;be gin Win nieT he Pooh := ''; for flcv := 'a' to 'z' do Win nieT he Pooh := Win nieT he Pooh+flcv;

So lu ción rá pi daUti lice un tipo ordi nal como varia ble de con trol de los bucles For. Es habi tualuti li zar un entero decla rado como i. Para eje cu tar el bucle For intentadoarriba, podría hacer esto:

var i: in te ger; s: string;be gin s:=''; for i := Ord('a') to Ord('z') do s := s+Chr(i);

Mensajes de error 275

Page 310: Dsp

Infor ma ción adi cio nalLa fun ción Chr realmente recibe un valor de tipo Byte en lugar de un Inte ger,pero siem pre que se le pase un valor posi tivo menor que 256, un valor Inte gerfun cio nará. Para ase gu rar que no se asigna un valor erróneo, puede pri merouti li zar la fun ción Ord, como se mues tra arriba. Lo mismo podría lle varse acabo con:

for i := 97 to 122 do

Pero esto hace que el código sea menos legi ble y la posi bi li dad de equi vo ca ciónmayor. Para más infor ma ción, con sulte “Ord” y “Chr” en la ayuda de Del phi.

For-Loop variable <> cannot be passed as var parameterPo si ble cau sa de error

Puede haber inten tado pasar una varia ble de con trol de un bucle For a un pro-ce di miento o fun ción como pará me tro Var (por refe ren cia). Por ejem plo, losiguiente gene rará este men saje de error:

pro ce du re Fruit Loops;const Ca li for nia Coun ties = 58;var i : Inte ger; // pro ce du re Co lo red Mars hma llows(var LuckyStars: Inte ger); be gin . . . end;be gin for i := 1 to Ca li for nia Coun ties do Co lo red Mars hma llows(i);end;

So lu ción rá pi daModi fi que el pro ce di miento lla mado de tal forma que el pará me tro no se pasepor refe ren cia (pará me tro Var):

pro ce du re Co lo red Mars hma llows(LuckyStars: Inte ger);

o uti lice un bucle While en lugar de un bucle For:

whi le i <= Ca li for nia Coun ties do Co lo red Mars hma llows (i);

276 Los Tomos de Delphi: Delphi sin problemas

Page 311: Dsp

Infor ma ción adi cio nalEsto es realmente una adver ten cia, no un error. El com pi la dor está inten tandodecirle, no obs tante, que ese tipo de cons truc ción es peli grosa (lógi ca mente). Lavaria ble de con trol del bucle For podría teó ri ca mente ser cam biada a cual quiervalor, inclu yendo uno que esté fuera de los lími tes del bucle.

Form <> links to form <> which cannot be found in the currentproject. Do you wish to remove/redirect the links to another form?

Po si ble cau sa de error1. Puede haber aña dido un for mu la rio exis tente que depende de otro for mu la-

rio que no está incluido en el pro yecto. Si el pri mer for mu la rio men cio nadoen el men saje de error (el que per te nece al pro yecto) con tiene con tro lesconec ta dos a datos, el segundo for mu la rio men cio nado en el men saje deerror (el que no forma parte del pro yecto) puede ser un módulo de datosque con tiene los com po nen tes de datos no visi bles corres pon dien tes al pri-mer for mu la rio (TDa ta base, TTa ble, TQuery, TSto redP roc, TDa ta Source,etc.).

2. Puede haber inten tado guar dar un for mu la rio que está enla zado a un for-mu la rio que no está car gado.

So lu ción rá pi da1,2.Si no nece sita man te ner el enlace entre los dos for mu la rios, selec cione Yes

y luego selec cione Remove Link. Si nece sita man te ner el enlace, car gue elsegundo for mu la rio men cio nado en el men saje.

Infor ma ción adi cio nalCon sulte “Form <> refe ren ces anot her form and can not be saved until<> is loa ded”. Para más infor ma cion, con sulte tam bién “data modu les” en laayuda de Del phi.

Form <> references another form and cannot be saved until <> isloaded

Po si ble cau sa de errorPuede haber obte nido el men saje de error “Form <> links to form <> whichcan not be found in the current pro ject. Do you wish to remove/redi-rect the links to anot her form?” y res pon dió No o Can cel (no eli minó niredi ri gió el enlace).

Mensajes de error 277

Page 312: Dsp

So lu ción rá pi daCar gue el segundo for mu la rio men cio nado en el men saje de error den tro delpro yecto actual.

Infor ma ción adi cio nalCon sulte “Form <> links to form <> which can not be found in thecurrent pro ject. Do you wish to remove/redi rect the links to anot herform?”

Format “<>” invalid or incompatible with argumentPo si ble cau sa de error

Puede haber uti li zado una opción de for mato que no está en corres pon den ciacon su argu mento corres pon diente. Por ejemplo, lo siguiente gene rará estemen saje de error:

Add(For mat('Thou Se pa ra tor = %c', [SysUtils.Thou sand Se pa ra tor]));

So lu ción rá pi daCam bie el espe ci fi ca dor de for mato por uno apro piado para el argu mento. En elejem plo de arriba, cambie la “c” por una “s”:

Add(For mat('Thou Se pa ra tor = %s', [SysUtils.Thou sand Se pa ra tor]));

Infor ma ción adi cio nalPara más infor ma ción, con sulte “Format” en la ayuda de Del phi.

Function needs result typePo si ble cau sa de error

Puede haber omi tido el tipo del resul tado (o los dos pun tos entre el nom bre dela fun ción y el tipo del resul tado) en una decla ra ción de fun ción. Por ejem plo,lo siguiente gene rará este men saje de error:

func tion junc tion(s: string);

Tam bién esto:

func tion Calc(x,y: in te ger); in te ger;

278 Los Tomos de Delphi: Delphi sin problemas

Page 313: Dsp

So lu ción rá pi daAñada el tipo del resul tado a la decla ra ción de la fun ción. Por ejem plo, si lafun ción devuelve un resul tado Boo lean, declá rela así:

func tion junc tion(s: string): boo lean;

Infor ma ción adi cio nalLos pro ce di mientos eje cu tan una acción (o accio nes). Las fun cio nes nor mal-mente hacen lo mismo, pero ellas tam bién devuel ven un resul tado. Si enseña asu perro a hacer un giro y a traerle cosas, podría com pa rar la acción de girarcon un pro ce di miento y la acción de traerle cosas con una fun ción (el perro letrae sus zapa ti llas o el perió dico).

General SQL Error—connection does not existPo si ble cau sa de error

Puede estar inten tando eje cu tar un ope ra ción de base de datos en un hilo alque no ha asig nado un com po nente TSes sion.

So lu ción rá pi daAsigne un com po nente TSes sion a cada hilo que acceda a com po nen tes de basede datos.

Infor ma ción adi cio nalCon sulte “Ses sion name mis sing” y “Can not ena ble Auto Ses sion Namepro perty with more than one ses sion on a form or data module”.

General SQL Error—FROM keyword not found where expectedPo si ble cau sa de error

Puede haber olvi dado aña dir una o más comas como sepa ra do res entre losnom bres de cam pos en una lista SELECT. Por ejem plo, lo siguiente gene raráeste men saje de error:

SELECT First, Se cond, Third FourthFROM ORDINALS

So lu ción rá pi daAñada una coma des pués de todos los cam pos excepto el último en la lista.

Mensajes de error 279

Page 314: Dsp

Infor ma ción adi cio nalCon sulte “<> expec ted but <> found”.

General SQL Error: Missing Left ParenthesisPo si ble cau sa de error

Puede haber olvi dado incluir entre parén te sis los cam pos a los que se asig na-rán los valo res o el grupo de valo res que serán inser ta dos. Por ejem plo, losiguiente gene rará este men saje 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');. . .

So lu ción rá pi daInserte un par de parén te sis alre de dor del grupo de valo res, 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');. . .

Infor ma ción adi cio nalPor supuesto, tam bién obten dría este error si el grupo de valo res no inclu yerael par de parén te sis (que apa re ce rían direc ta mente des pués de los frag men tosde código mos tra dos arriba).

General SQL Error: SQL Command not properly endedPo si ble cau sa de error

Puede haber olvi dado borrar el con te nido de la pro pie dad SQL antes de aña-dirle una sen ten cia SQL, y como con se cuen cia se han mez clado varias sen ten-cias, resul tando en algo que no puede ser inter pre tado correc ta mente en lapró xima eje cu ción de la sen ten cia SQL. Por ejem plo, la siguiente sen ten ciaSQL:

SQL.Add('Se lect * from Fort Knox');

fun cio nará bien la pri mera vez, pero la segunda vez será doble:

'Se lect * from Fort Knox Se lect * from Fort Knox'

280 Los Tomos de Delphi: Delphi sin problemas

Page 315: Dsp

So lu ción rá pi daAñada una lla mada al método Clear, de tal manera que el texto SQL no sevaya acu mu lando:

SQL.Clear;SQL.Add('Se lect * from Fort Knox');

Infor ma ción adi cio nalPara ver qué es lo que exac ta mente está siendo enviado como sen ten cia SQL,selec cione Eva luate/Modify del menú, intro duzca <Nom bre Query>.SQL.Text,y pulse el botón Eva luate.

General SQL Error: SQL is too complexCon sulte “SQL is too com plex”.

General SQL error. The [Commit,Rollback] Transaction request hasno corresponding begin transaction

Po si ble cau sa de error1. Puede estar lla mando a Com mit o Roll back, pero no ha ini ciado explí ci ta-

mente una tran sac ción mediante una lla mada a Start Tran sac tion. Porejem plo, podría estar haciendo esto:

be gin with Da ta ba se1 do be gin Con nec ted := True; try Query1.Acti ve := True; Com mit; ex cept Roll back; end; end;end;

2. Puede estar tra ba jando con MS SQL Ser ver y estar expe ri men tando uninter blo queo (dead lock).

So lu ción rá pi da1. Ini cie cada tran sac ción con una lla mada a Start Tran sac tion, y fina lí cela

con una lla mada a Roll back (para retro ce derla si hay algún pro blema) oCom mit (para con fir marla). Por ejem plo, podría hacerlo de esta manera:

Mensajes de error 281

Page 316: Dsp

be gin with Da ta ba se1 do be gin Con nec ted := True; Start Tran sac tion; try Query1.Acti ve := True; Com mit; ex cept Roll back; end; end;end;

2. Des pués de dese char el men saje de error, intén telo de nuevo y grabe suscam bios.

Infor ma ción adi cio nal2. MS SQL Ser ver retro cede las tran sac cio nes que expe ri men ten

interbloqueos.

GOTO <> leads into or out of TRY statementPo si ble cau sa de error

Puede tener una sen ten cia GoTo que está con te nida o salta den tro de un blo-que de código pro te gido (un blo que Try. . . Finally o Try. . . Except).

So lu ción rá pi daEli mine la sen ten cia GoTo del blo que pro te gido o no salte den tro de un blo quede código pro te gido.

Infor ma ción adi cio nalLas sen ten cias GoTo son con si de ra das una mala prác tica de pro gra ma ción. Nouti lice sen ten cias GoTo, a menos que no pueda encon trar otro recurso.

Grid Index Out of RangePo si ble cau sa de error

1. Puede estar ite rando a tra vés de un con junto de datos y está alcan zando elfinal del archivo (EOF) mien tras está mos trando el con junto de datos en uncon trol TDBGrid.

282 Los Tomos de Delphi: Delphi sin problemas

Page 317: Dsp

2. Puede estar inten tando acce der a una columna que no existe en una reji llade cade nas (TString Grid). Por ejem plo, si está tra ba jando con una reji lla decade nas con tres colum nas, lo siguiente gene rará este men saje de error:

Col Widths[3] := 100;

So lu ción rá pi da1. Llame al método Disa ble Con trols del objeto TDa ta set mien tras esté ite-

rando a tra vés del con junto de datos, así:

with Re gret Ta ble dobe gin Di sa ble Con trols; try First; whi le not EOF do be gin . . . Next; end; fi nally Ena ble Con trols;end;

2. Si está tra ba jando con una reji lla de cade nas con tres colum nas, por ejem-plo, haga refe ren cia al ter cer ele mento así:

Col Widths[2] := 100;

Infor ma ción adi cio nal1. Si lla mar a Disa ble Con trols no fun ciona en su situa ción, añada el siguiente

código en el evento OnCreate del for mu la rio, si la tabla está abierta en elentorno inte grado de Del phi, o inme dia ta mente des pués de abrir la tablacuyo con te nido está mos trando en el DBGrid:

DBGrid1.Hand le Nee ded;

2. Las reji llas de cade nas uti li zan índi ces basa dos en cero. La pri meracolumna es el ele mento 0, y así suce si va mente.

GROUP BY is required when both aggregate and non-aggregatefields are used in result set

Po si ble cau sa de errorPuede estar inten tando uti li zar una o más fun cio nes de agre ga ción en una sen-ten cia SQL, pero ha olvi dado aña dir una sec ción GROUP BY. Por ejem plo, losiguiente gene rará este men saje de error:

SELECT DIM, SUM(TSINGTAO)

Mensajes de error 283

Page 318: Dsp

FROM CHINESEFOOD

So lu ción rá pi daSi uti liza una fun ción de agre ga ción de SQL, como SUM, AVG, MIN, MAX oCOUNT, debe agru par por todos los demás cam pos (no agre ga dos). Por ejem-plo, la sen ten cia SQL de arriba sería :

SELECT DIM, SUM(TSINGTAO)FROM CHINESEFOODGROUP BY DIM

Infor ma ción adi cio nalLa sin ta xis y carac te rís ti cas de SQL difie ren de un sis tema a otro. Con sulte ladocu men ta ción de su base de datos para obte ner la infor ma ción per ti nente dela base de datos que esté uti li zando. Si está uti li zando tablas loca les, con sulteLOCALSQL.HLP, que viene con Del phi (se ins tala por defecto en C:\Archi vosde pro grama\Bor land\Com mon files\BDE).

Heap Overflow ErrorPo si ble cau sa de error

Este error es infor mado por New o Get Mem cuando no hay sufi ciente espa ciodis po ni ble en el heap para reservar un blo que del tamaño reque rido.

So lu ción rá pi daLibere espa cio del disco duro y/o incre mente el tamaño de la memo ria vir tual, oreduzca el tamaño del blo que de memo ria que está tra tando de reser var.

Infor ma ción adi cio nalEste es el error 203.

High cannot be applied to a long stringPo si ble cau sa de error

Puede estar por tando de Del phi 1 a Del phi de 32 bits una apli ca ción que uti-liza la fun ción High sobre una cadena. Por ejem plo, lo siguiente gene rará estemen saje de error en Del phi de 32 bits:

var i: in te ger; s: string;be gin

284 Los Tomos de Delphi: Delphi sin problemas

Page 319: Dsp

s := 'ess zet'; i := High(s);

So lu ción rá pi daNo se puede apli car la fun ción High a cade nas lar gas. Sí se puede, sinembargo, uti li zarla con cade nas cor tas, que están toda vía dis po ni bles en Del phide 32 bits. Puede crear una cadena corta en Del phi de 32 bits asig nando unalon gi tud (hasta 255) en la decla ra ción de la cadena o uti li zando el tipoShortString. El ejem plo de arriba fun cio nará sim ple mente aña diendo la lon gi-tud que se quiere uti li zar en la decla ra ción de la cadena o decla rando la cadenacomo un tipo ShortString. En otras pala bras, cual quiera de los dos ejem plossiguien tes fun cio nará:

s: string[24]; { o cual quier otro en te ro po si ti vo has ta 255 }s: shortString;

Alter na ti va mente, si quiere dejar su código como está, puede desac ti var la uti-li za ción de cade nas lar gas como tipo de cade nas por defecto en Del phi de 32bits selec cio nando Pro ject | Options | Com pi ler | Syntax Options, y des-mar cando la casi lla de veri fi ca ción Huge Strings. Otra manera de hacer lomismo es inclu yendo la direc tiva de com pi la dor {$H-} en la parte supe rior de launi dad.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “open string para me ters” y “High func tion” enla ayuda de Del phi.

Higher table level requiredPo si ble cau sa de error

Está inten tando aña dir o uti li zar alguna fun cio na li dad dis po ni ble sola mentecon tablas Para dox de nivel superior. Una o más de las siguien tes posi bi li da dessiguien tes puede cum plirse:1. Puede haber inten tado aña dir un índice único en el código a una tabla

Para dox de nivel infe rior a 7. Por ejem plo, la siguiente línea pro duce estemen saje de error con una tabla Para dox de nivel 4 ó 5:

Ta ble1.AddIndex('NewI ndex','Na me_Last',[ixU ni que]);

2. Puede haber inten tado aña dir un índice des cen diente en el código a unatabla Para dox de nivel infe rior a 7. Por ejem plo, la siguiente línea pro duceeste men saje de error con una tabla Para dox de nivel 4 ó 5:

Ta ble1.AddIndex('Wf','Wa ter fall',[ix Des cen ding]);

3. Puede estar haciendo refe ren cia a una tabla Para dox cuya ruta con tienenom bres de archivo lar gos.

Mensajes de error 285

Page 320: Dsp

4. Puede estar inten tando aña dir un campo Long Inte ger, BCD, Time,Timestamp, Logi cal, Autoin cre ment o Bytes a una tabla Para dox de nivelinfe rior a 7. Estos tipos de datos son nue vos para Para dox 7. Por ejem plo,si es una tabla ante rior al nivel 7, lo siguiente gene rará este men saje deerror:

Field Defs.Add('OttoIn que', ftAu toInc, 0, True);

So lu ción rá pi da1, 2Para las dos primeras posibles causas, una opción es aña dir el índice en el

Data base Desk top en lugar de hacerlo en el código (cuando modi fi que laestruc tura de la tabla, Data base Desk top auto má ti ca mente ele vará el nivelal nivel más bajo nece sa rio para satis fa cer los requi si tos). Si no desea rees-truc tu rar la tabla, asigne el nivel de la tabla por defecto al nivel más altodis po ni ble en la uti li dad de Con fi gu ra ción o Admi nis tra ción del BDE. Paraello, siga estos pasos:

Delphi 1 o 2a. Seleccione Tools | BDE Config.b. Seleccione Par a dox en el cuadro de lista Driver Name.c. Cambie el valor del parámetro LEVEL al deseado (por ejemplo, de 4 ó 5

hasta 7).

d. Seleccione File | Exit.e. Seleccione Yes para grabar los cambios.

Delphi 3 y 4a. Seleccione Inicio | Pro gramas | Borland Delphi X | BDE

[Con fig u ra tion, Admin is tra tion].b. Seleccione la pestaña Con fig u ra tion en la sección Drivers/Sys tem.c. Expanda el nodo Drivers en vista de árbol.d. Expanda el nodo Native en la vista de árbol.

e. Seleccione Par a dox o dBASE, según sea apropiado.f. Seleccione el nivel más alto de la lista desplegable LEVEL en la sección

Def i ni tion.g. Seleccione Object | Exit.h. Seleccione Yes para grabar los cambios.

Todas las tablas siguien tes serán crea das con el nivel que haya esco gido.3. Vuelva atrás al con ve nio 8.3 para los nom bres de archi vos y los nom bres de

direc to rios cor tos sin espa cios, o incre mente el nivel de la tabla Para dox a7. Siga los pasos de arriba para incre men tar el nivel de la tabla.

4. Deberá asig nar el nivel de la tabla Para dox a 7. Para lle var a cabo esto,siga los pasos des cri tos arriba.

286 Los Tomos de Delphi: Delphi sin problemas

Page 321: Dsp

Infor ma ción adi cio nalUna manera rápida de ele var el nivel de una tabla Para dox al nivel 7 desde elData base Desk top es aña dir un índice des cen dente. Ya que los índi ces des cen-den tes no esta ban sopor ta dos en Para dox hasta la ver sión 7, al gra bar la basede datos des pués de aña dir el índice des cen dente ésta se guar dará como unabase de datos de Para dox 7.

Sin embargo, a menos que el índice nece site ser aña dido en el código (es decir,no se sabe cuál es el campo para el que se creará el índice en tiempo dediseño), no tiene sen tido aña dir un índice que no será nece sa rio con Data baseDesk top para luego poder crear uno que sí se nece si tará mediante código.

Por con si guiente, hay dos esce na rios en los que encon trará nece sa rio aña dir uníndice a una tabla con el Data base Desk top:1. Quiere aña dir un índice, pero está uti li zando una tabla Para dox 3.5, 4, ó 5

(no se puede aña dir un índice en el código con estas tablas).2. Nece sita aña dir un índice en el código, pero su tabla es de una ver sión

ante rior a la 7 y por lo tanto nece si tar pro mo verla al nivel 7 aña diendo uníndice des cen diente.

Para aña dir un índice en el Data base Desk top, siga estos pasos:a. Seleccione Tools | Data base Desk top.b. Seleccione File | Open | Table. . . .

c. Navegue hasta la tabla a la que quiere añadir el índice y ábrala.d. Seleccione Tools | Util ities | Restruc ture. . . (o pulse sobre el icono

correspondiente).e. Seleccione Sec ond ary Indexes del cuadro de combinación Table

Prop erties.f. Pulse el botón Define.g. Seleccione el campo que quiere añadir al índice en el cuadro de lista

Fields.

h. Pulse la flecha que apunta a la derecha entre las cajas de lista Fields eIndexed Fields.

i. Marque las casillas de verificación de la sección Index Options quedesee aplicar al índice. Estas opciones de índice son Unique (Unico),Case Sen si tive (Distingue entre mayúsculas y minúsculas), Descending(Descendente) y Main tained (Mantenido automáticamente). Main tainedestá seleccionado por defecto (aquí es donde podría seleccionarDescending para forzar que una tabla de Par a dox 4 ó 5 sea promovidaa una tabla de Par a dox 7).

j. Pulse el botón OK.k. Proporcione un nombre para el índice en el cuadro de diálogo Save

Index As. A partir de ese momento podrá asignarle ese índice a lapropiedad IndexName de la tabla en el código.

Mensajes de error 287

Page 322: Dsp

l. Pulse el botón Save en la ventana Restruc ture.m. Seleccione File | Close.

Ahora podrá acti var el índice que agregó en el código:

Ta ble1.Exclu si ve := True;Ta ble1.Index Na me := 'Sub7Index';

Tam bién podrá crear nue vos índi ces en el código a la tabla de Para dox 7:

Ta ble1.Exclu si ve := True;Ta ble1.AddIndex('Pa ra dox7Index', 'City', [ixU ni que]);

Por supuesto, si desea crear los índi ces en el código, puede espe rar hasta eltiempo de eje cu ción para espe ci fi car el campo a indizar y posi ble mente tam biénel nom bre del índice:

Ta ble1.Exclu si ve := True;Ta ble1.AddIndex(Edit1.Text,Edit2.Text,[]);

Los índi ces que asigne en código de esta manera son per sis ten tes.

I/O Error 102Con sulte “File not assig ned”.

I/O Error 103Con sulte “File not open”.

I/O Error 104Con sulte “File not open for input”.

I/O Error 105Con sulte “File not open for out put”.

288 Los Tomos de Delphi: Delphi sin problemas

Page 323: Dsp

I/O error found for file “<Current directory>\Database.GDB”.Error while trying to open file. The system cannot find the filespecified.

Po si ble cau sa de errorPuede haber inten tado selec cio nar un valor para la pro pie dad Table Name deun com po nente TSQLTa ble de DBExpress sin pri mero asig nar un valor válidoa la pro pie dad Params del com po nente TSQLCon nec tion rela cio nado.

So lu ción rá pi daAsigne el nom bre de la base de datos a la que se desea conec tar en la pro pie-dad Params.Data base de TSQLCon nec tion.

Infor ma ción adi cio nalDBExpress apa re ció por pri mera vez en Del phi 6.

Identifier expected but <> foundPo si ble cau sa de error

1. Puede haber codificado una sec ción Type, Var o Const sin decla rar nada enella.

2. Puede haber inten tado uti li zar una pala bra reser vada como iden ti fi ca dor.3. Puede haber ante puesto el ope ra dor de ámbito ‘punto’ (.) al nom bre de una

pro pie dad de tipo array (antes de los cor che tes). Por ejem plo:

La bel1.Cap tion := List Box1.Items.[0];

So lu ción rá pi da1. Eli mine la sec ción vacía o añada una o más decla ra cio nes válidas en ella.2. No uti lice pala bras reser va das para nin gún otro pro pó sito que no sea aquel

para el que éstas están dise ña das.3. Eli mine el ope ra dor de ámbito de la sen ten cia.

Infor ma ción adi cio nalLos iden ti fi ca do res son los nom bres que se asig nan a los tipos, varia bles, cons-tan tes, pro ce di mien tos, fun cio nes, uni da des, pro gra mas y cam pos de regis tros.

Con sulte “Iden ti fier expec ted but array found” e “Iden ti fier expec tedbut num ber found”. Para más infor ma ción, con sulte tam bién “iden ti fiers” enla ayuda de Del phi.

Mensajes de error 289

Page 324: Dsp

Identifier expected but array foundPo si ble cau sa de error

Puede haber decla rado un array como valor de retorno de una fun ción. Porejem plo, lo siguiente gene rará este men saje de error:

func tion Three41(i: in te ger): array[0..3] of char;

So lu ción rá pi daDeclare un tipo para el array que desea uti li zar, y luego uti lice el nuevo tipo dearray como tipo de retorno de la fun ción. Por ejem plo, para resol ver el pro-blema de arriba, haga lo siguiente:

type Three ForO ne = array[0..3] of char;. . .func tion Three41(i: in te ger): Three ForO ne;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “arrays” en la ayuda de Del phi.

Identifier expected but number foundPo si ble cau sa de error

Puede haber uti li zado un parén te sis mien tras inten taba decla rar un tipo sub-rango. Por ejem plo, lo siguiente gene rará este men saje de error:

type TSill ySu bran ge = (4 * 8)..255;

So lu ción rá pi daEvite ini ciar una decla ra ción de un sub rango con un parén te sis. El com pi la dorpen sará que usted intenta decla rar un tipo enu me rado. En lugar de ello,hágalo de esta manera:

type TSo ber Su bran ge = 32..255;

Infor ma ción adi cio nalPuede uti li zar expre sio nes en la decla ra ción de tipos sub rango, siem pre queevite ini ciar la decla ra ción con un parén te sis. Por ejem plo, lo siguiente es acep-ta ble para el com pi la dor:

290 Los Tomos de Delphi: Delphi sin problemas

Page 325: Dsp

type TSe rious Su bran ge = 32..255;type TSua ve Su bran ge = 32..((32 * 8) -1);

Identifier redeclared: <>Po si ble cau sa de error

1. Puede estar inten tando uti li zar un nom bre que ya está siendo uti li zado enel mismo ámbito. Puede ser una varia ble, cons tante, tipo, campo (miem brode una clase), método, o una uni dad redun dante en una sec ción Uses. Porejem plo, lo siguiente gene rará este men saje de error, debido a que la varia-ble Thirty está decla rada dos veces:

func tion Brick Hou se(Thirty, Ten, Thirty: in te ger): in te ger;

2. Puede haber aña dido la uni dad System den tro de la sec ción Uses de unauni dad. En este caso, el men saje de error será “Iden ti fier rede cla red:System”.

So lu ción rá pi da1. Eli mine o renom bre el ele mento decla rado dos veces.2. Eli mine la refe ren cia a System de la cláu sula Uses, ya que es ésta es

impor tada implí ci ta mente por todas las uni da des.

Infor ma ción adi cio nal1. No se puede tener dos varia bles glo ba les con el mismo nom bre. Tam poco se

puede tener dos varia ble loca les (en un mismo ámbito) con el mismonom bre.Puede tener una varia ble glo bal y tan tas loca les como nece site (siem preque cada una sea única den tro de su ámbito) con el mismo nom bre. Porejem plo, podría tener una varia ble glo bal nom brada Expen da bleIn come ysimul tá nea mente declarar una varia ble con el mismo nom bre den tro de unpro ce di miento o fun ción (en cuyo caso, la varia ble glo bal sería ocul tadaden tro del pro ce di miento por la varia ble local).

Illegal character in input file: <> (<>)Po si ble cau sa de error

1. Puede haber ini ciado una decla ra ción con uno de los sím bo los &, /, \, tilde,etc. Por ejem plo, lo siguiente gene rará este men saje de error:

type Pro to = &

Mensajes de error 291

Page 326: Dsp

2. Puede haber aña dido algo a la sec ción {$R *.RES} en el archivo fuente delpro yecto (.DPR).

3. Puede haberse dejado una llave ( } ) al final de una línea.

So lu ción rá pi da1. Asigne a la varia ble, tipo, etc. un nom bre válido de Object Pas cal (que

comience con un guión bajo o carac ter alfa bé tico, y a con ti nua ción con tengasola mente guio nes bajos, carac te res alfa bé ti cos y dígitos).

2. Veri fi que que la sen ten cia {$R *.RES} del archivo fuente del pro yecto no hasido alte rada.

3. Eli mine cual quier llave ( } ) que pueda tener al final de una línea.

Infor ma ción adi cio nalEste men saje de error se encuen tra prin ci pal mente en cone xión con las cons-tan tes de cadena y los comen ta rios.

Illegal message method indexPo si ble cau sa de error

Puede haber decla rado un método de men saje con un valor menor que 1. Porejem plo, lo siguiente gene rará este men saje de error:

pro ce du re WMChar(var Mes sa ge: TWMChar); mes sa ge -34;

So lu ción rá pi daNo uti lice un número nega tivo (ni cero) como índice de un método de men saje.Si está cap tu rando un men saje de Win dows, uti lice su cons tante corres pon-diente, tal como está decla rada en la uni dad Mes sa ges.PAS. Por ejem plo, ladecla ra ción de arriba sería:

pro ce du re WMChar(var Mes sa ge: TWMChar); mes sa ge WM_CHAR;

Infor ma ción adi cio nalPuede tam bién refe rirse al men saje WM_CHAR por su valor hexa de ci mal:

pro ce du re WMChar(var Mes sa ge: TWMChar); mes sa ge $0102;

o por su valor deci mal:

pro ce du re WMChar(var Mes sa ge: TWMChar); mes sa ge 34;

Para más infor ma ción, con sulte “mes sage hand lers” en la ayuda de Del phi y launi dad MESSAGES.PAS.

292 Los Tomos de Delphi: Delphi sin problemas

Page 327: Dsp

Illegal type in OLE automation section: <>Po si ble cau sa de error

Puede haber aña dido algo a la sec ción Auto ma ted de una clase que con tiene untipo que no está per mi tido en una sec ción Auto ma ted. Por ejem plo, el siguientecódigo genera este men saje de error:

au to ma ted pro ce du re WMVScroll Clip board(var Mes sa ge: TMes sa ge); mes sa ge WM_VSCROLLCLIPBOARD;

So lu ción rá pi daUti lice sola mente tipos váli dos para la sec ción Auto ma ted. Con sulte “auto ma-ta ble types” en la ayuda de Del phi para más infor ma ción.

Infor ma ción adi cio nalEn este ejem plo par ti cu lar, el men saje de error se pro duce por que el tipoTMes sage es ile gal.

La sec ción Auto ma ted está obso leta y se man tiene por com pa ti bi li dad.

Illegal type in Read/Readln statementPo si ble cau sa de error

Este error ocu rre cuando se intenta escri bir una varia ble de un tipo que no esválido en una lla mada a Read o Readln. Por ejem plo, lo siguiente gene rará estemen saje de error:

var f: Text Fi le; sl: TStrings;be gin sl := TString List.Crea te; try Assign Fi le(f, 'gon zo'); Re set(f); Readln(f, sl);

So lu ción rá pi daUti lice sola mente los tipos están dar de Pas cal con Readln.

Infor ma ción adi cio nalSi quiere leer una lista de cade nas de un archivo, puede hacer esto:

Mensajes de error 293

Page 328: Dsp

for i := 0 to Pred(sl.Count) do be gin s := sl[i]; Readln(f,s);end;

Illegal type in Write/Writeln statementPo si ble cau sa de error

Este error ocu rre cuando trata impri mir una varia ble de un tipo que no esválido en una lla mada a Write o Wri teln. Por ejem plo, este código gene raráeste men saje de error:

var f: Text Fi le; sl: TStrings;be gin sl := TString List.Crea te; try Assign Fi le(f, 'Fis herL Gatt ling'); Re set(f); Wri teln(f, sl);

So lu ción rá pi daWri teln acepta sola mente varia bles de los tipos están dar de Pas cal.

Infor ma ción adi cio nalSi quiere escri bir el con te nido de una lista de cade nas en un archivo, uti lice elmétodo Save To File.

IMPLEMENTATION part is missing or incorrectPo si ble cau sa de error

Puede haber alte rado, borrado o puesto entre comen ta rios la pala bra reser vadaImple men ta tion de la uni dad.

So lu ción rá pi daAse gú rese que la pala bra reser vada Imple men ta tion exista entre la sec ciónInter face y la parte de imple men ta ción de la unidad.

294 Los Tomos de Delphi: Delphi sin problemas

Page 329: Dsp

Infor ma ción adi cio nalPara más infor ma ción, con sulte “imple men ta tion reser ved word | posi tio ning apro ce dure or func tion in your code” y “imple men ta tion reser ved word | thestruc ture of a unit” en la ayuda de Del phi.

Implementation part USES clause incorrectPo si ble cau sa de error

Puede tener un error de sin ta xis en la cláu sula Uses de la parteImple men ta tion.

So lu ción rá pi daVeri fi que que hay una coma entre todas las uni da des a las que se hace refe ren-cia en la cláu sula Uses y un punto y coma al final.

Infor ma ción adi cio nalPuede tener una o dos cláu su las Uses en una uni dad. Ten drá una en la sec ciónInter face de la uni dad, como aquí:

unit EdSta tes;in ter fa ceuses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Con trols, Forms, Dia logs;type TForm1 = class(TForm). . .

Puede tam bién tener una cláu sula Uses en la sec ción Imple men ta tion de launi dad:

. . .im ple men ta tionuses EdArabEm;{$R *.DFM}. . .

Implements clause only allowed for properties of class or interfacetype

Po si ble cau sa de errorPuede haber uti li zado un tipo que no es una clase o una inter faz en la cláu sulaImple ments. Por ejem plo, lo siguiente gene rará este men saje de error:

Mensajes de error 295

Page 330: Dsp

type TMyClass = class(TInter fa cedO bject) . . . pro perty TryToIm ple mentAnInt: Inte ger read FInte ger im ple ments Inte ger;end;

So lu ción rá pi daEli mine la cláu sula Imple ments <tipo_erró neo>, o sus ti tuya el <tipo_erróneo>(en este caso, Inte ger) por un tipo de clase o inter faz, así:

type TMyClass = class(Tin ter fa cedO bject, IOfTheS torm) . . . pro perty TryToIm ple mentAnInt: Inte ger read FInte ger im ple ments IOfTheS torm;end;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “imple men ting inter fa ces by dele ga tion” en laayuda de Del phi.

Implements clause only allowed for readable propertyPo si ble cau sa de error

Puede haber uti li zado una pro pie dad que es de sólo escri tura en una cláu sulaImple ments. Por ejem plo, lo siguiente gene rará este men saje de error:

TIta lianS ta llion = class(TInter fa cedO bject, IOfThe Ti ger) FRock yRead: IOfThe Ti ger; pro perty MyInter fa ce: IOfThe Ti ger im ple ments IOfThe Ti ger;end;

So lu ción rá pi daAñada la direc tiva de lec tura a la decla ra ción de la propiedad, así:

TIta lianS ta llion = class(TInter fa cedO bject, IOfThe Ti ger) FRock yRead: IOfThe Ti ger; pro perty MyInter fa ce: IOfThe Ti ger read FRock yRead im ple ments IOfThe Ti ger;end;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “imple men ting inter fa ces by dele ga tion” en laayuda de Del phi.

296 Los Tomos de Delphi: Delphi sin problemas

Page 331: Dsp

Implements clause only allowed within class typesPo si ble cau sa de error

Puede haber uti li zado la cláu sula Imple ments en una decla ra ción de inter faz.Por ejem plo, lo siguiente gene rará este men saje de error:

type IMPei = in ter fa ce func tion Acces sor: IMPei; pro perty IMPei: IMPei read Acces sor im ple ments IWhatF la vor; end;

So lu ción rá pi daEli mine la cláu sula Imple ments. Las cla ses pueden imple men tar inter fa ces.Las inter fa ces no pueden imple men tar inter fa ces, ya que ellas no tie nen imple-men ta ción. Son simi la res a las cla ses abs trac tas en Del phi (aun que las cla sesabs trac tas fre cuen te mente imple men tan algu nos de sus méto dos y sola mentedejan un sub con junto de sus méto dos abs trac tos, mien tras que las inter fa cesson com ple ta mente “abs trac tas”).

Infor ma ción adi cio nalPara más infor ma ción, con sulte “imple men ting inter fa ces by dele ga tion” en laayuda de Del phi.

Implements getter must be register calling conventionPo si ble cau sa de error

Puede haber espe ci fi cado un con ve nio de lla mada dis tinto del con ve nio pordefecto Regis ter para el método de acceso (get ter) de una pro pie dad de inter fazdele gada. Por ejem plo, lo siguiente gene rará este men saje de error:

type ISo meIn ter fa ce = in ter fa ce pro ce du re Roll Over; func tion FetchMySlip pers: Boo lean; end; TSo meC lass = class(TObject, ISo meIn ter fa ce) FSo meIn ter fa ce: ISo meIn ter fa ce; func tion ReadItAndWeep: ISo meIn ter fa ce; stdcall;

pro perty So meIn ter fa ce: ISo meIn ter fa ce read ReadItAndWeep im ple ments ISo meIn ter fa ce; end;

Mensajes de error 297

Page 332: Dsp

So lu ción rá pi daEli mine el con ve nio de lla mada Stdcall (o el que fuera) que haya espe ci fi cadopara el método de acceso.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “imple men ting inter fa ces by dele ga tion” en laayuda de Del phi.

Improper GUID syntaxPo si ble cau sa de error

Puede haber modi fi cado el for mato de un GUID aña dién dole o borrán dolecarac te res o reor ga ni zando sus gru pos.

So lu ción rá pi daCam bie nue va mente el GUID a su estado original.

Infor ma ción adi cio nalUn GUID debe tener el for mato: 00000000-0000-0000-0000-000000000000. Losceros repre sen tan carac te res alfa nu mé ri cos (pue den ser reem pla za dos por dígi-tos o carac te res).

Incompatible Record StructuresPo si ble cau sa de error

Puede haber uti li zado un com po nente TBat chMove para mover los regis tros deun con junto de datos a una tabla, pero los cam pos del con junto de datos fuenteno coin ci den con los cam pos de la tabla de des tino, o puede incluso que lastablas sean de tipos dife rentes (por ejem plo, una tabla es de dBASE y la otrade Para dox).

So lu ción rá pi daCom pruebe que el con junto de datos fuente y la tabla de des tino ten gan estruc-tu ras com pa ti bles.

Infor ma ción adi cio nalLos con jun tos fuente y des tino no tie nen que coin ci dir exactamente. Por ejem-plo, los nom bres de las colum nas pue den dife rir, siem pre que sean del mismotipo de datos y tamaño.

298 Los Tomos de Delphi: Delphi sin problemas

Page 333: Dsp

Incompatible TypesPo si ble cau sa de error

Puede haber indi cado un método como “sobre car gado”, y luego haber llamado aInhe ri ted en su imple men ta ción.

So lu ción rá pi daCam bie la direc tiva Over load por Override, o eli mine la lla mada a Inhe ri ted.

Infor ma ción adi cio nalLos méto dos decla ra dos como vir tua les pue den ser rede fi ni dos en las cla sesdes cen dien tes. Esto se hace aña diendo la direc tiva Ove rride a la decla ra cióndel método. Nor mal mente, en la imple men ta ción del método rede fi nido se lla-ma ría a Inhe ri ted, así:

pro ce du re Do Po pup(Sen der: TObject); ove rri de;. . .pro ce du re TForT he Ti ller man Po pup Me nu.Do Po pup(Sen der:TObject);be gin in he ri ted; . . .

Se puede sobre car gar un método aña diendo la direc tiva Ove rload a la decla ra-ción del método, lo cual le per mite tener múl ti ples méto dos con un mismo nom-bre (pero dife ren tes signaturas). Por ejem plo:

pro ce du re GetA Wi fe(Bait: Cu rrency); over load;pro ce du re GetA Wi fe(Bait: String); over load;pro ce du re GetA Wi fe(Bait: TDa te Ti me); over load;

Incompatible types: <> and <>Po si ble cau sa de error

1. Puede estar inten tando asig nar a una pro pie dad o varia ble de un tipo unvalor de un tipo incom pa ti ble. Por ejem plo, podría estar inten tando asig naruna cadena a una variable entera o un mapa de bits a una varia ble de tipoBoo lean.

2. Puede estar inten tando asig nar un des cen diente de TField (como TString-Field, TFloat Field, etc., que Del phi crea cuando se crean los cam posper sis ten tes de un con junto de datos) a una varia ble de un tipo de datosdife rente. No se puede (direc ta mente) asig nar un TString Field a una varia-ble de tipo String. A modo de ilus tra ción, nin guna de las siguien tesasig na cio nes es per mi tida (aquí Capi tal es un TString Field y Area es un

Mensajes de error 299

Page 334: Dsp

TFloat Field. Ambos per ten ecen a la tabla Country de Para dox que vienecon Del phi):

{Esto ge ne ra rá "Incom pa ti ble types: String and TString Field"}String Grid1.Cells[0,0] := Ta ble1 Ca pi tal;{Esto ge ne ra rá "Incom pa ti ble types: Exten ded and TFloat Field"}String Grid1.Cells[0,0] := Float ToStr(Ta ble1A rea);

3. Puede estar pasando a un pro ce di miento o fun ción un valor que no es com-pa ti ble con el pará me tro decla rado en el pro ce di miento o fun ción. Porejem plo, lo siguiente gene rará este men saje de error:

pro ce du re Type Con fu sion(i: in te ger);. . .pro ce du re SendString;var s: string;be gin Type Con fu sion(s); {¡pase un en te ro, no un string!}

4. Puede haber decla rado que una fun ción devuelve un tipo de resul tado yestar inten tando devol ver un resul tado de un tipo de datos dife rente. Porejem plo, lo siguiente gene rará este men saje de error:

func tion mpd(var i: in te ger): boo lean;be gin i := i+1; Re sult := IntToStr(i); {¡El re sul ta do debe ser boo lean!}end;

5. Puede haber uti li zado un ope ra dor que pro duce un resul tado de un tipo dedatos que no es ade cuado en un con texto dado. Por ejem plo, lo siguientegene rará este men saje de error, ya que el ope ra dor / pro duce un númeroreal (punto flo tante), no un entero:

i := 3 / 2;

6. Puede haber inten tado asig nar un con trol grá fico (un des cen diente deTGrap hic Con trol) a una pro pie dad que requiere un con trol de ven tana (uncon trol que tiene un mane ja dor de ven tana y puede reci bir el foco; un des-cen diente de TWin Con trol). Por ejem plo, lo siguiente pro du cirá este error(”Incom pa ti ble types: TWin Con trol and TLa bel”):

Acti ve Con trol := La bel1;

7. Puede ser tam bién que una cláu sula Write o Read de una pro pie dad hagarefe ren cia a un campo o método cuyo tipo difiere del de la pro pie dad. Porejem plo, lo siguiente gene rará el men saje de error “Incom pa ti ble Types”,ya que para escri bir el valor de una pro pie dad Boo lean se ha inten tado uti-li zar un pro ce di miento que recibe una cadena:

pri va te FEmUpJoe: boo lean; pro ce du re SetEmUpJoe(s: string);pu blic { De cla ra cio nes pú bli cas }

300 Los Tomos de Delphi: Delphi sin problemas

Page 335: Dsp

pu blis hed pro perty EmUpJoe: Boo lean read FEmUpJoe wri te SetEmUpJoe;end;

8. Puede haber uti li zado el pro ce di miento Text Out sin ante po ner Can vas a él.Por ejem plo, esto gene rará el men saje de error bajo dis cu sión:

pro ce du re TForm1.Form Mou se Down(Sen der: TObject; But ton: TMou se But ton; Shift: TShift Sta te; X, Y: Inte ger);be gin Text Out(X, Y, IntToStr(X)+' '+IntToStr(Y));end;

9. Puede estar inten tando asig nar un pro ce di miento o fun ción regu lar (unoque no es miem bro de una clase, sino un pro ce di miento o fun ción glo bal olocal) a un pun tero a método. Por ejem plo, lo siguiente gene rará este men-saje de error:

pro ce du re TForm1.But ton2 Click(Sen der: TObject); pro ce du re Re gu lar Guy(Sen der: TObject); be gin La bel1.Cap tion := ‘¡Ha pul sa do el bo tón 1!'; end;be gin But ton1.OnClick := Re gu lar Guy;end;

10. Puede haber inten tado asig nar un valor de tipo enu me rado a un tipo con-junto así:

type TFro zen Cus tard Fla vors = (fcfHeath, fcfPis ta chio, fcfAbsint he); TFro zen Cus tard Fla vors = set of TFro zen Cus tard Fla vor;. . .case radgrpFro zen Cus tard.ItemI ndex of0: Fro zen Cus tardObj.Fla vors := fcfHeath;

So lu ción rá pi da1. Asigne el valor a una varia ble del mismo tipo de datos o con vierta el valor

a ser alma ce nado antes de hacer la asig na ción.2. Hay dos mane ras para asig nar el valor de un des cen diente de TField a una

varia ble. Puede aña dir la pro pie dad Value al nom bre del campo del queestá obte niendo el valor; alter na ti va mente, puede con ver tir el valor al tipode datos ade cuado uti li zando una de las pro pie dades AsX. He aquí algu nosejem plos de sen ten cias de asig na ción váli das:

{Esto fun cio na}String Grid1.Cells[1,1] := Ta ble1 Ca pi tal.Va lue;{Esto tam bién}String Grid1.Cells[0,0] := Ta ble1 Ca pi tal.AsString;

Algu nas veces, la pro pie dad de con ver sión AsX no fun ciona, en depen den-cia de la varia ble a la que esté asig nando el valor y al des cen diente de

Mensajes de error 301

Page 336: Dsp

TField cuyo valor está tra tando de obte ner. Por ejem plo, la siguiente asig-na ción pro duce el men saje de error bajo dis cu sión:

{"Incom pa ti ble types: String and Dou ble"}String Grid1.Cells[1,1] := Ta ble1A rea.AsFloat;

En cual quier caso, uti li zar la pro pie dad de con ver sión AsVa riant (sobrecual quier des cen diente de TField) fun cio nará adecuadamente:

String Grid1.Cells[1,1] := Ta ble1 Ca pi tal.AsVa riant;

3. Ase gú rese de que el tipo de datos de la varia ble que pasa a un pro ce di-miento o fun ción está acorde con la decla ra ción de ese pro ce di miento ofun ción.

4. Ase gú rese de que el resul tado que devuelve la fun ción coin cida con el tipode resul tado decla rado por la fun ción.

5. Uti lice Div para pro du cir un resul tado entero, y / para pro du cir un resul-tado real (de punto flo tante).

6. No intente hacer con trol activo del for mu la rio a un con trol grá fico.7. Ase gú rese de que los tipos de las pro pie da des y sus cam pos o méto dos de

escri tura o lec tura sean igua les. En el ejem plo mos trado arriba, cam bie eltipo del campo pri vado o pro pie dad de Boo lean a String, o cam bie el tipodel pará me tro del método de escri tura de String a Boo lean.

8. Ante ponga Can vas a la lla mada a Text Out, así:

pro ce du re TForm1.Form Mou se Down(Sen der: TObject; But ton: TMou se But ton; Shift: TShift Sta te; X, Y: Inte ger);be gin Can vas.Text Out(X, Y, IntToStr(X)+' '+IntToStr(Y));end;

9. Sola mente asigne méto dos (un pro ce di miento o fun ción que es miem bro deuna clase) a pun te ros a méto dos. Podría lle var a cabo esto reor ga ni zando elcódigo de esta manera:

type TForm1 = class(TForm) But ton1: TBut ton; La bel1: TLa bel;

But ton2: TBut ton; pro ce du re But ton1 Click(Sen der: TObject); pro ce du re But ton2 Click(Sen der: TObject); . . . pu blic pro ce du re Hand Co ded Met hod(Sen der: TObject); end;. . .pro ce du re TForm1.Hand Co ded Met hod(Sen der: TObject);be gin La bel1.Cap tion := '¡Ha pul sado el bo tón 1!';end;

302 Los Tomos de Delphi: Delphi sin problemas

Page 337: Dsp

pro ce du re TForm1.But ton2 Click(Sen der: TObject);be gin But ton1.OnClick := Hand Co ded Met hod;end;

10. Asigne el valor de tipo enu me rado al con junto den tro de cor che tes, así:

case radgrpSa les Reps.ItemI ndex of0: Fro zen Cus tardObj.Fla vors := [fcfHeath];

Infor ma ción adi cio nal1. Del phi/Object Pas cal ofrece muchas fun cio nes pre de fi ni das que per mi ten la

con ver sión entre tipos de datos, como de Inte ger a String y vice versa, etc.Por ejem plo, puede asig nar una varia ble de cadena a una entera uti li zandola fun ción de con ver sión StrToInt, así:

So meIn te ger Va ria ble := StrToInt(Edit1.Text);

Pero el intento de asig nar la cadena con te nida en un cua dro de edi cióndirec ta mente a una varia ble entera, así:

So meIn te ger Va ria ble := Edit1.Text;

cau sa ría el men saje de error de arriba. Para más infor ma ción sobre otrascon ver sio nes, con sulte “con ver sions” en la ayuda de Del phi.

2. Cuando la tabla de Para dox Country incluida en Del phi fue creada, alcampo Capi tal le fue asig nado el tipo de datos Alpha, y al campo Area lefue asig nado el tipo de datos Num ber. Si en Del phi se ins tan cian esos cam-pos uti li zando el Editor de Cam pos (con sulte “Fields Edi tor” en la ayuda deDel phi), estos cam pos serán con ver ti dos de sus tipos de datos nati vos dePara dox a los tipos de datos TString Field y TFloat Field de Object Pas cal,res pec ti va mente.A con ti nua ción se ofrece una tabla de los tipos de datos Para dox y suscorres pon diente des cen dien tes de TField de Del phi:

Tipo de datos Paradox Descendiente TField de Delphi

Alpha TStringField

Autoincrement TAutoIncField

BCD TBCDField

Binary TBlobField

Byte TBytesField

Date TDateField

Formatted Memo TBlobField

Graphic TGraphicField

Logical TBooleanField

Mensajes de error 303

Page 338: Dsp

Long Integer TIntegerField

Memo TMemoField

Money TCurrencyField

Number TFloatField

OLE TBlobField

Short TSmallIntField

Time TTimeField

Timestamp TDateTimeField

9. El men saje de error espe cí fico en este caso será “Incom pa ti ble types:met hod poin ter and regu lar pro ce dure”.

10. Otra manera de lle var a cabo esto sería:

TFro zen Cus tard Fla vors = (fcfHeath, fcfSnic kers, fcfCa ra mel);

Si opta por hacerlo de esta manera, no obten dría este men saje de error. Enotra pala bras, está asig na ción com pi la ría:

case radgrpFro zen Cus tard.ItemI ndex of0: Fro zen Cus tardObj.Fla vors := fcfHeath;1: Fro zen Cus tardObj.Fla vors := fcfSnic kers;2: Fro zen Cus tardObj.Fla vors := fcfCa ra mel;else ; //Aña da aquí có di go de pro tec ción con tra erro resend;

Incompatible types: Parameter lists differPo si ble cau sa de error

1. Puede haber asig nado una fun ción a un tipo fun ción (o un pro ce di miento aun tipo pro ce di miento) y sus sig na tu ras no son igua les. Por ejem plo, losiguiente gene rará este men saje de error:

pro ce du re Cream(Clap ton, Bru ce, Ba ker: in te ger);type TYearsAfter = pro ce du re(Lee, Alvin: in te ger);const De sert Ro se Band: TYearsAfter = Cream;

2. Puede haber asig nado a un ges tor de even tos de un com po nente un métodoper so na li zado que no tiene una sig na tura idén tica. Por ejem plo, podríahaber hecho algo así:

TCom bo box(Com po nents[I]).OnKeyP ress := Lo wer Ca se;

donde el método per so na li zado Lower Case está decla rado así:

304 Los Tomos de Delphi: Delphi sin problemas

Page 339: Dsp

pro ce du re Lo wer Ca se;

So lu ción rá pi da1. Para asig nar una fun ción o pro ce di miento a un tipo fun ción o pro ce di-

miento, sus signa tu ras (can ti dad, tipos de datos y secuen cia de lospará me tros) deben ser idén ti cas (aun que los nom bres de los pará me trospue den dife rir). Por ejem plo, lo siguiente fun cio na ría bien:

func tion Kool(a,b,c: in te ger): in te ger;type TAndTheMGs = func tion(x,y,z: in te ger): in te ger;const Stylis tics: TAndTheMGs = Kool;

2. Modi fi que el método per so na li zado para que tenga la misma sig na tura queel ges tor de even tos que está imple men tando. Uti li zando el ejem plo dearriba, la decla ra ción de Lower Case debe ría ser:

pro ce du re Lo wer Ca se(Sen der: TObject; var Key: Char);

que está en corres pon den cia con la decla ra ción del ges tor de eventosOnKeyP ress.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “pro ce du ral values” en la ayuda de Del phi.

Incorrect field declaration: class <>Po si ble cau sa de error

Puede haber modi fi cado la decla ra ción de la clase de un campo por un iden ti fi-ca dor de Pas cal invá lido. Por ejem plo, en una uni dad que ori gi nal mentecon te nía:

type TForm1 = class(TForm) But ton1: TBut ton;

puede haber modi fi cado la decla ra ción de la clase (la parte corres pon diente aTBut ton) de tal forma que ha que dado algo como:

type TForm1 = class(TForm) But ton1: TZip^per;

So lu ción rá pi daGene ral mente, no es una buena idea modi fi car el código que Del phi generaauto má ti ca mente.

Mensajes de error 305

Page 340: Dsp

Infor ma ción adi cio nalSi modi fica la decla ra ción de la clase, pero uti liza un iden ti fi ca dor válido,obten drá el men saje de error “Field <> should be of type <> but is decla-red as <>. Correct the decla ra tion?” Con sulte la entrada corres pon diente aeste men saje de error para más infor ma ción.

Incorrect method declaration in class <>Po si ble cau sa de error

Puede haber aña dido una direc tiva de alma ce na miento a un método. Por ejem-plo, lo siguiente gene rará este men saje de error:

pro ce du re But ton607Click(Sen der: TObject); sto red;

So lu ción rá pi daLas direc ti vas de alma ce na miento se uti li zan para las pro pie da des decla ra dasen la sec ción Publis hed de un com po nente. No uti lice direc ti vas de alma ce na-miento en méto dos o fuera de la sec ción Publis hed.

Infor ma ción adi cio nalSi recibe este men saje de error, y no hay razón apa rente para ello, intenterecons truirlo todo (selec cione Pro ject | Build All).

Si el men saje de error per siste, borre los archi vos que Del phi genera auto má ti-ca mente, espe cial mente si ha movido el pro yecto de una máquina a otra o deuna ver sión de Del phi a otra. Entre estos archi vos están, en depen dien cia desu ver sión de Del phi y de las opcio nes que haya selec cio nado, <pro yecto>.OPT,<pro yecto>.DSK, <pro yecto>.DSM, <proyecto>.RES y <proyecto>.DOF.

Para más infor ma ción, con sulte “sto rage spe ci fiers” en la ayuda de Del phi.

Incorrect syntax near ':'Po si ble cau sa de error

Puede haber inten tado eje cu tar una con sulta para me tri zada en SQL Explo rer.Por ejem plo, puede tener una con sulta de estruc tura simi lar a esta:

se lect SCRIPT_ID, SCRIPT_DESC, BUILD_NO, SCRIPT_TYPEfrom SCRIPTMAIN

306 Los Tomos de Delphi: Delphi sin problemas

Page 341: Dsp

whe re SCRIPT_TYPE = :SCRIPT_TYPE

So lu ción rá pi daEl pará me tro no es reco no cido por el SQL Explo rer. Para pro pó si tos de prueba,sus ti tú yalo por un valor válido. Por ejem plo:

se lect SCRIPT_ID, SCRIPT_DESC, BUILD_NO, SCRIPT_TYPEfrom SCRIPTMAINwhe re SCRIPT_TYPE = 2

Infor ma ción adi cio nalCon sulte la entrada “Field <> is of an unk nown type” en este libro.

Index already existsPo si ble cau sa de error

Puede estar inten tando aña dir en el código un índice a una tabla que ya tieneun índice con ese nom bre.

So lu ción rá pi daCom pruebe que el índice que desea crear no exista. Por ejem plo, podría pro ce-der de esta manera:

if not Ta ble1.FieldByNa me('City').IsIndex Field then Ta ble1.AddIndex('sit tee','City',[]);

Infor ma ción adi cio nalSi intenta aña dir un índice del mismo nom bre que uno ya exis tente en el Data-base Desk top, obten drá el men saje: “An index named named <> alreadyexists. Overw rite?” Si intenta crear un índice sobre un campo que ya tieneun índice, pero le da al índice un nom bre dife rente, reci birá el men saje de error“An index of this type already exists”. En ese caso, Data base Desk top no leper mi tirá crear el índice.

Mensajes de error 307

Page 342: Dsp

INDEX clause not allowed in OLE automation sectionPo si ble cau sa de error

Puede haber uti li zado la cláu sula Index en una sec ción Auto ma ted.

So lu ción rá pi daLa cláu sula Index no es per mi tida en la sec ción Auto ma ted. Eli mine lacláu sula.

Infor ma ción adi cio nalDel phi 2 y supe rio res tie nen cinco direc ti vas de visi bi li dad : Pri vate, Pro tec ted,Public, Publis hed y Auto ma ted. Una pro pie dad de una clase puede incluir unadirec tiva de alma ce na miento Stored, Default o Node fault. Estas direc ti vas dealma ce na miento, sin embargo, no están per mi ti das en la sec ción Auto ma ted.

Index does not existPo si ble cau sa de error

1. Puede haber inten tado acti var un índice (en tiempo de diseño, edi tando lapro pie dad Index Name de un objeto TTa ble, o en tiempo de eje cu ciónmediante código) que no ha sido creado para la tabla. Por ejem plo, elsiguiente código:

Ta ble1.Index Na me := 'Cus to merC re dit';

pro vo cará este men saje de error si no se ha defi nido un índice de nom breCus to merC re dit para la tabla.

2. Puede haber cam biado la pro pie dad Table Name de un com po nente TTa ble,y la pro pie dad Index Name toda vía se refiere a un índice de la tablaante rior.

3. Puede estar uti li zando una tabla de Ora cle y se ha olvi dado de ante po nerel nom bre de la tabla a la pro pie dad Index Name del com po nente TQuery.Por ejem plo, podría haber pro por cio nado el valor siguiente:

Mo lehill

So lu ción rá pi da1. Cree el índice antes de inten tar activarlo. Puede lle var a cabo esto uti li-

zando el Data base Desk top o el Len guaje de Defi ni ción de Datos (DDL - unsub con junto de SQL uti li zado en las bases de datos SQL como Inter Base,Ora cle y MS SQL Ser ver) o en el código.

2. Borre el valor de la pro pie dad Index Name o cám bielo a un valor apro piadopara la tabla actual.

308 Los Tomos de Delphi: Delphi sin problemas

Page 343: Dsp

3. Puede nece si tar espe ci fi car un nom bre com ple ta mente cua li fi cado para elíndice en la pro pie dad Index Name del com po nente TQuery. Por ejem plo, sitiene una tabla deno mi nada Moun tain y un índice lla mado Molehill, asignea la pro pie dad el valor:

Moun tain.Mo lehill

Infor ma ción adi cio nalEl código que oca siona este error com pi lará, debido a que hasta donde el com-pi la dor puede saber, el índice podría ser creado mediante código antes deinten tar acti varlo.

Para crear un índice en el código (lo con tra rio a hacerlo en tiempo de diseño),uti lice el pro ce di miento AddIndex. Para más infor ma ción, con sulte “AddIndex”en la ayuda de Del phi.

Index is out of datePo si ble cau sa de error

Pro ba ble mente ten drá una incon sis ten cia entre una tabla de Para dox (.DB) yuno de sus archi vos de índice. Uno o más archivos de índice están dañado ofuera de sin cro ni za ción con su corres pon diente tabla. Un usua rio puede habercerrado la apli ca ción ina pro pia mente o haber expe ri men tado una caída del sis-tema con el pro grama activo.

El archivo de índice pri ma rio de una tabla Para dox tiene el nom bre del archivoy una exten sión .PX . Los archi vos de índice secun da rios tie nen el mismo nom-bre de la tabla, seguido por la exten sión .Xnn y .Ynn (donde nn es un númerohexa de ci mal).

Esto puede haber ocu rrido debido a una de las siguien tes razo nes:1. Modi ficó la tabla (aña dió o editó regis tros) mien tra la tabla en sí (*.DB)

estaba situada en un direc to rio dife rente que los archi vos de índice.2. Modi ficó el con te nido de la tabla uti li zando otra apli ca ción.3. Su sis tema se cayó mien tras estaba aña diendo o edi tando un regis tro.4. Puede haber acce dido a tablas de Para dox sobre una red desde una

máquina cliente que eje cuta Win dows 95 y tiene una ver sión del archivoVREDIR.VXD (Vir tual Net work Redi rec tor) de Micro soft entre 4.00.1111 y4.00.1114.

5. Puede haber inten tado edi tar o inser tar un regis tro en una tabla cuyoíndice no es man te nido automáticamente.

6. Puede estar expe ri men tando pro ble mas de red.7. Puede estar uti li zando Win dows NT y blo queos opor tu nistas.

Mensajes de error 309

Page 344: Dsp

So lu ción rá pi da1. Eli mine los archi vos de índice exis tentes, y luego vuelva a crear los (en el

Data base Desk top o en el código). Para más infor ma ción sobre cómo crearíndi ces por código, con sulte “AddIndex” en la ayuda de Del phi.Siem pre ase gú rese de que los archivos de índice están en el mismo direc to-rio que la tabla cuando añada o edite la tabla.

2. Eli mine los archi vos de índice exis ten tes, y luego vuelva a crear los (en elData base Desk top o en el código). Para más infor ma ción sobre cómo crearíndi ces por código, con sulte “AddIndex” en la ayuda de Del phi.

Para redu cir la pro ba bi li dad de que lo mismo suceda de nuevo, siga estospasos:

Delphi 1a. Seleccione Tools | BDE Config.b. Seleccione Par a dox en el cuadro de lista Driver Name.

c. Asegúrese de que el parámetro Strict Integ rity tiene el valor True.d. Seleccione File | Exit.e. Seleccione Yes para grabar los cambios.

Delphi de 32 bitsa. Seleccione Tools | BDE Admin is tra tor.b. Seleccione la pestaña Con fig u ra tion.c. Expanda el nodo Drivers en la vista de árbol.d. Expanda el nodo Native en la vista de árbol.

e. Seleccione PARADOX.f. Asigne True a Strict Integ rity.g. Seleccione Object | Exit.h. Seleccione Yes para guardar los cambios.

3. Eli mine los archi vos de índice exis ten tes, y luego vuelva a crear los (en elData base Desk top o en el código). Para más infor ma ción sobre cómo crearíndi ces por código, con sulte “AddIndex” en la ayuda de Del phi.

4. Reem place la ver sión dañada de VREDIR.VXD. La ver sión ori gi nal(4.00.955) y la 4.00.1116 fun cio nan correc ta mente. VREDIR.VXD debe ríaestar ubi cado en C:\Win dows\System. Puede bajar una ver sión actua li-zada del archivo desde el sitio web de Micro soft.

5. Si va a edi tar o inser tar regis tros en una tabla, no uti lice índi ces no man te-ni dos. Para con fi gu rar un índice de una tabla Para dox como man te nido,siga estos pasos:a. Abra el Data base Desk top.b. Abra la tabla con la que quiere trabajar (File | Open | Table).

310 Los Tomos de Delphi: Delphi sin problemas

Page 345: Dsp

c. Seleccione Tools | Util ities | Restruc ture (o pulse sobre el iconoRestruc ture).

d. Seleccione Sec ond ary Indexes en la lista desplegable Prop erties de latabla.

e. Pulse el botón Define. Aparecerá el cuadro de diálogo DefineSec ond ary Index.

f. Seleccione el índice que se desea convertir en mantenido.

g. Marque la casilla de verificación Main tained en la sección IndexOptions del diálogo.

h. Seleccione OK para grabar las modificaciones.6. Con sulte a su admi nis tra dor de red.7. Nece sita edi tar (o crear, si es nece sa rio) dos entra das del Regis tro del sis-

tema siguiendo estos pasos:a. Seleccione Inicio | Ejecutar en el escritorio.b. Introduzca regedit en el cuadro de combinación Abrir y pulse el botón

Aceptar.

c. Navegue hasta HKEY_LOCAL_MACHINE\Sys tem\CurrentControlSet\Ser vices\LanmanServer\Param e ters.

d. Edite o añada la clave EnableOplock y asígnele el valor 0.e. Edite o añada la clave UseOpportunisticLocking y asígnele el valor 0.f. Reinicie el sistema para que la configuración surta efecto.

Infor ma ción adi cio nalLos archi vos de índice (.PX, .Xnn y .Ynn) deben estar pre sen tes con la tablacuando se aña dan regis tros, de forma que los archi vos de índice puedan seractua li za dos. Si no están, la fecha/hora de última actua li za ción de la tabla y delos archi vos de índice no serán igua les, indi cando que sus datos no estánsin cro ni za dos.

Una des crip ción de los archi vos de índice auxi lia res que uti liza Para dox es lasiguiente:

<Nom bre Ta bla>.PX

El archivo .PX con tiene la infor ma ción de la clave pri ma ria de la tabla. Sidesigna un campo o grupo de cam pos como clave pri ma ria, este archivo escreado.

<Nom bre Ta bla>.Xnn

Los archi vos con exten sión .Xnn (donde nn es un número hexa de ci mal) con tie-nen infor ma ción de un índice secun da rio.

<Nom bre Ta bla>.Ynn

Mensajes de error 311

Page 346: Dsp

Los archi vos con exten sión .Ynn (donde nn es un número hexa de ci mal) con tie-nen infor ma ción de un índice secun da rio.5. Los índi ces no-man te ni dos están obso le tos— son una remi nes cen cia de

Para dox 1.0 para DOS.

Para más infor ma ción, con sulte http://www.bor land.com/dev su pport/bde/ti_list/TI3342.html.

Index is out of rangePo si ble cau sa de error

Puede haber uti li zado un ele mento de un TList Box cuya pro pie dad Mul ti Se lecttiene el valor False. Por ejem plo, lo siguiente gene rará este men saje de error:

List Box1.Items.Add('Pe ter, Bugs, and Ro ger');List Box1.Se lec ted[0] := True;

So lu ción rá pi daAsigne True a Mul ti Se lect.

Infor ma ción adi cio nalAún cuando Mul ti Se lect tenga asig nado True, puede que no vea la línea aña-dida al cua dro de lista, a menos que llame a Appli ca tion.Pro cess Mes sa ges.

Index is read onlyPo si ble cau sa de error

Puede estar inten tando edi tar una tabla que tiene uno o mas índi ces secun da-rios, pero esos índi ces secun da rios son no-man te ni dos.

So lu ción rá pi daCon fi gure los índi ces como man te ni dos si quiere edi tar o inser tar regis tros enuna tabla. Para con fi gu rar un índice de una tabla Para dox como man te nido,siga estos pasos:

a. Abra el Data base Desk top.b. Abra la tabla con la que quiere trabajar (File | Open | Table).c. Seleccione Tools | Util ities | Restruc ture (o pulse sobre el icono

Restruc ture).d. Seleccione Sec ond ary Indexes en la lista desplegable Prop erties de la

tabla.

312 Los Tomos de Delphi: Delphi sin problemas

Page 347: Dsp

e. Pulse el botón Define. Aparecerá el cuadro de diálogo DefineSec ond ary Index.

f. Seleccione el índice que se desea convertir en mantenido.

g. Marque la casilla de verificación Main tained en la sección IndexOptions del diálogo.

h. Selec cione OK para gra bar las modi fi ca cio nes.

Infor ma ción adi cio nalSi nunca nece si tará edi tar o aña dir regis tros a una tabla (en otras pala bras, setrata de una tabla de sólo lec tura), puede mejo rar el ren di miento haciendo losíndi ces no-man te ni dos.

Index not foundPo si ble cau sa de error

Puede estar inten tando abrir una tabla dBASE, y su archivo de índices de pro-duc ción (.MDX) no está presente.

So lu ción rá pi daMueva el archivo de índi ces de pro duc ción (.MDX) al mismo direc to rio que latabla, o eli mine la depen den cia de la tabla de ese archivo. Para esto último,con sulte el docu mento TI #2711 en el CD-ROM de Del phi o en el sitio web deBor land.

Infor ma ción adi cio nalTI es la abre via tura de Tech ni cal Infor ma tion. Si no tiene acceso al CD-ROM,puede encon trar este docu mento en el sitio web de Bor land (www.bor land.com).

Index or Primary Key cannot contain a Null valuePo si ble cau sa de error

Puede estar gra bando un regis tro en una tabla, pero ha olvi dado pro por cio narun valor para la clave pri ma ria, una columna indi zada, o una de las colum nasde una clave pri ma ria com puesta.

So lu ción rá pi daAsigne valores a todos los cam pos de la clave pri ma ria y a los cam pos indiza-dos antes de gra bar. Puede hacer esto, si lo desea, en el evento Befo re Post delcon junto de datos.

Mensajes de error 313

Page 348: Dsp

Infor ma ción adi cio nalTodas las tablas debe rían tener una clave pri ma ria. Con sulte la docu men ta ciónde Inter Base para más infor ma ción sobre el diseño de bases de datos.

INDEX, READ, OR WRITE clause expected but ‘;’ foundPo si ble cau sa de error

Puede estar inten tando decla rar una pro pie dad, pero ha omi tido los méto dos deescri tura y lec tura (o la pala bra reser vada opcio nal Index).

So lu ción rá pi daAse gú rese de pro por cio nar los méto dos de escri tura y lec tura para laspro pie da des.

La sin ta xis correcta cuando se declara una varia ble sin la direc tiva Index es:

pro perty Zeit geist: Lon gint read Get WithIt wri te SetEmUpJoe;

La sin ta xis correcta cuando se uti liza la direc tiva Index es:

pro perty Zeit geist: Lon gint in dex 0 read Get WithIt wri te SetEmUpJoe;

Infor ma ción adi cio nalCon sulte “index spe ci fiers” en la ayuda de Del phi para más infor ma ción sobrecuándo uti li zar estos ele men tos.

INSERT and UPDATE operations are not supported onautoincrement field type

Po si ble cau sa de errorPuede estar inten tando asig nar un valor a un campo de tipo Autoin cre mentuti li zando las ope ra cio nes Insert o Update de SQL. Por ejem plo, puede habertra tado de hacer algo así:

up da te "MACABRE.DB"set OttoIn crea se = :So me Num, DrOcto pus = :Vi llain, Eigh tHead = :Dis tin guis hing Fea tu rewhe re Name = :OLD_Name

314 Los Tomos de Delphi: Delphi sin problemas

Page 349: Dsp

-O-

in sert into "MACABRE.DB" (OttoIn crea se, DrOcto pus, Eigh tHead)va lues (:So me Num, :Vi llain, :Dis tin guis hing Fea tu re)

So lu ción rá pi daNo inten tente edi tar (mediante Update) o asig nar (mediante Insert) valo res acam pos de tipo Autoin cre ment.

Infor ma ción adi cio nalLos cam pos Autoin cre ment son de sólo lec tura, y por lo tanto no pue den seredi ta dos. Un campo Autoin cre ment, por su pro pia natu ra leza, no debe ría seredi tado manual mente. Al ser incre men tado auto má ti ca mente, cada valor seráúnico. Si pudiera cam biarse manual mente el valor, al final podrían obte nersevarios valo res idén ti cos, lo que resul ta ría en una vio la ción de clave. Por estarazón, los cam pos Autoin cre ment son de sólo lec tura.

Puede espe ci fi car el valor ini cial para los cam pos Autoin cre ment uti li zando lapro pie dad Mini mum en el Data base Desk top. En caso con tra rio, el valor siem-pre comen zará a par tir de 1 y se incre men tará en 1 para cada regis tro. Loscam pos Autoin cre ment son muy pare cidos a los núme ros de los che ques queusted recibe de su ins ti tu ción finan ciera.

Installation error –113Po si ble cau sa de error

Puede estar inten tando ins ta lar Del phi sobre un orde na dor que tiene ins ta ladoun con tro la dor de CD-ROM de 16 bits.

So lu ción rá pi daCon tacte con el ven de dor o el fabri cante del orde na dor para obte ner un con tro-la dor actua li zado de 32 bits del CD-ROM.

Infor ma ción adi cio nalEl con tro la dor de 16 bits no reco noce nom bres de archivo lar gos; por esa razón,no puede encon trar algu nos de los archi vos nece sa rios para la ins ta la ción.

Mensajes de error 315

Page 350: Dsp

Instance variable <> inaccessible herePo si ble cau sa de error

1. Puede estar inten tando hacer refe ren cia a una varia ble de ins tan cia desdeun pro ce di miento de clase.

2. Puede haber inten tado hacer refe ren cia a una clase miem bro de un for mu-la rio (por ejem plo, un com po nente) en un método de clase sin ante po ner elnom bre de la varia ble del for mu la rio al com po nente. Por ejem plo, losiguiente gene ra ría este men saje de error:

if Mode = psSin gle then be gin frmSin gle.Cap tion := SEnterOrdNum; Group Box1.Cap tion := SPrint Sin gleIn voi ce //aquí!end;

So lu ción rá pi da1. Evite hacer refe ren cia a varia bles de ins tan cia en el método de clase, o con-

vierta el método de clase en un método nor mal.2. Ante ponga el nom bre de la varia ble del for mu la rio al nom bre del com po-

nente, así:

if Mode = psSin gle then be gin frmSin gle.Cap tion := SEnterOrdNum; frmSin gle.Group Box1.Cap tion := 0end;

Infor ma ción adi cio nal2. Puede tam bién ence rrar el blo que de código entero en una sen ten cia With,

si nece sita hacer refe ren cia a com po nen tes muchas veces, así:

with frmSin gle do be gin edit VendOrd.Text:=De faultOrdNum; if Mode = psSin gle then be gin Cap tion := SEnterOrdNum; Group Box1.Cap tion := Sprint Sin gleIn voi ce end;end;

Con sulte “Pro perty <> inac ces si ble here” en este libro.

Insufficient disk spacePo si ble cau sa de error

1. Puede no tener sufi ciente espa cio en el disco duro para que Del phi creearchi vos.

316 Los Tomos de Delphi: Delphi sin problemas

Page 351: Dsp

2. Puede estar uti li zando el BDE en una red punto-a-punto sin asig nar elvalor True al pará me tro Local Share del BDE.

So lu ción rá pi da1. Borre archi vos y pro gra mas inne ce sa rios para libe rar espe cio en el disco

duro. Para borrar pro gra mas, siga estos pasos:a. Pulse el botón Inicio en el escritorio de Win dows.b. Seleccione Configuración | Panel de Con trol.

c. Seleccione Añadir/borrar Programas.

d. Seleccione el programa que quiere desinstalar.e. Pulse el botón Añadir/Quitar.

2. Asigne True al pará me tro Local Share del BDE. Para ello, siga estos pasos:a. Abra la utilidad BDE Admin is tra tor.b. Seleccione la pestaña Con fig u ra tion en la sección Drivers & Sys tem

(izquierda).c. Seleccione Sys tem | Init.d. Asigne el valor True a Local Share en la pestaña Def i ni tion (a la

derecha).

Infor ma ción adi cio nal1. Es una buena idea siem pre tener al menos varias docenas de megaby tes

libres en el disco duro. En caso con tra rio, sufrirá nume ro sos y varia dosmen sa jes de error “extra ños”, caí das del sis tema y pér di das de tra bajo.

Insufficient memory for this operationPo si ble cau sa de error

Puede haber eje cu tado varias ope ra cio nes de con sulta, espe cial mente con lapro pie dad Request Live asig nada a True, pero puede haber olvi dado libe rar lamemo ria que éstas requie ren lla mando al método Unpre pare.

So lu ción rá pi daLlame a Pre pare antes de abrir una con sulta, y a Unpre pare al ter mi nar detra ba jar con ella. Por ejem plo, podría hacer algo como esto:

with Query1 dobe gin SQL.Add('Se lect * from Ba kery'); Pre pa re; try Open;

Mensajes de error 317

Page 352: Dsp

{Lo que haya que ha cer} fi nally Unpre pa re; end; end;

Infor ma ción adi cio nalSi obtiene este men saje de error durante las ope ra cio nes de base de datos,podría ser ven ta joso dupli car el valor del pará me tro SHAREDMEMSIZE con lauti li dad BDE Con fi gu ra tion de su valor por defecto 2048 a 4096, o cua dri pli-carlo, si es nece sa rio, a 8192.

Con si dere la crea ción de con jun tos de datos mediante pro gra ma ción en tiempode eje cu ción. Espe rar hasta que los recur sos se nece si ten para crear los (espe-cial mente si ellos pue den no ser uti li za dos durante cier tos momen tos en laapli ca ción), y luego libe rar los lo antes posi ble puede mejo rar el uso de memo riay el desem peño de la apli ca ción.

Con sulte “BDE Ini tia li za tion Error $2501”.

Insufficient SQL rights for operationPo si ble cau sa de error

Puede estar inten tando eje cu tar una acción sobre una tabla que reside en unser vi dor SQL para la cual no han sido otor ga dos los corres pon dien tes dere chos.Por ejem plo, puede estar inten tando edi tar un regis tro de una tabla para laque sola mente tiene per miso de lec tura (no de escri tura).

So lu ción rá pi daCon sulte al admi nis tra dor del ser vi dor SQL para obte ner los dere chos nece sa-rios. Si es usted mismo el admi nis tra dor, con sulte la docu men ta ción para elser vi dor par ti cu lar (Inter Base, MS SQL Ser ver, Ora cle, etc.) que estéuti li zando.

Infor ma ción adi cio nalSi usted va a admi nis trar la segu ri dad, con si dere crear ini cial mente gru pos,asig nar los dere chos a esos gru pos, y luego asig nar los indi vi duos (usua rios) alos gru pos. Podría tam bién per mi tir a los usua rios úni ca mente acce der a lasvis tas y los pro ce di mien tos alma ce na dos (evitando comple ta mente el acceso alas tablas).

318 Los Tomos de Delphi: Delphi sin problemas

Page 353: Dsp

Insufficient table rights for operationPo si ble cau sa de error

Puede estar inten tando asig nar True a la pro pie dad Active de una tabla conpro tec ción de con tra seña, sin pri mero haber pro por cio nado la contraseña.

So lu ción rá pi daPro por cione la con tra seña antes de inten tar asig nar el valor True a la pro pie-dad Active.

Infor ma ción adi cio nalSi nece sita pro te ger por con tra seña una tabla de Para dox para pre ve nir elacceso no auto ri zado a ella, puede lle varlo a cabo uti li zando el Data baseDesktop, o puede hacerlo en el código. Para pro te ger por con tra seña una tablade Para dox en el Data base Desk top, siga estos pasos:1. Selec cione Tools | Uti li ties | Res truc ture (o pulse el icono Struc ture).2. Selec cione Pass word Secu rity de la lista des ple ga ble Table Pro per ties.3. Pulse el botón Define.4. Intro duzca la con tra seña dos veces.5. Selec cione OK.

La tabla estará ahora encrip tada. La tabla podrá ser abierta, pero la infor ma-ción no será legi ble. Por ejem plo, si antes de pro te ger con con tra seña o encrip-tar una tabla, puede abrirla y ver la infor ma ción que con tiene en este for mato:

DE Whi te QB Fav re

des pués de encrip tarla, la misma infor ma ción apa re cerá de esta manera:

__(c_.jy*+8f�_VG|_L::5!Ya_R2M_9=,]x_&k*-_$A__S<cT@`c~

Para evi tar que el cua dro de diá logo de soli ci tud de con tra seña apa rezca entiempo de eje cu ción, puede pro por cio nar la con tra seña mediante código (porsupuesto, alguien con acceso a su código fuente podrá ver la contraseña, peropuede hacer esto durante el desa rro llo para aho rrar tiempo, y luego borrar elcódigo antes de dis tri buir). Puede pro por cio nar la con tra seña mediante códigoasí:

Ses sion.AddPass word('Kenn wort58');Ta ble1.Acti ve := True;

Mensajes de error 319

Page 354: Dsp

Integer constant too largePo si ble cau sa de error

1. Puede haber espe ci fi cado una cons tante entera que requiere más de 32 bitspara ser repre sen tada (en otras pala bras, un número mayor que2.147.483.647) en Del phi 1, 2 ó 3. Por ejem plo, lo siguiente gene rará esteerror:

pro ce du re OnKeyP ress(var Key: Sma llint); dis pid 2147483648;

De manera simi lar, lo siguiente tam bién oca sio nará este error en una .DLL(uni dad de biblioteca):

pro ce du re Jerr yJeff Wal ker;be gin { Wha te ver }end;ex ports Jerr yJeff Wal ker in dex 2800000000;

2. Puede haber asig nado un valor entero a un tipo de datos real o de puntoflo tante (Dou ble, Exten ded, Comp, etc.) Por ejem plo, lo siguiente gene raráeste error:

var r: dou ble;. . .r := 2222222222;

So lu ción rá pi da1. Man tén gase en el rango entre –2.147.483.648 y 2.147.483.647 (ambos

inclu sive) en las asig na cio nes de ente ros antes de Del phi 4. Lo siguientefun ciona bien:

pro ce du re OnKeyP ress(var Key: Sma llint); dis pid 2147483647;

2. Esto com pi lará tam bién:

var r: dou ble;. . .r := 2222222222.22;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “inte gers | inte ger types” en la ayuda deDel phi.

320 Los Tomos de Delphi: Delphi sin problemas

Page 355: Dsp

InterBase install DLL ibinstall.dll not found in path. Please installInterBase 6 to use this functionality.

Po si ble cau sa de errorPuede haber inten tado sol tar sobre un for mu la rio un com po nente TIBInstall oTIBUnins tall, de la eti queta Inter Base Admin de la Paleta de Com po nen tes, yno tiene Inter Base 6 ins ta lado o nece sita mover IBINSTALL.DLL a un lugardonde Del phi puede encon trarlo.

So lu ción rá pi daNece sita ins ta lar Inter Base 6, como el men saje indica, o si lo ha hecho ya, debemover IBINSTALL.DLL a la ruta del sis tema.

Infor ma ción adi cio nalPara des car gar Inter Base, visite el sitio web de Inter Base (www.inter base.com).

Interface <> already implemented by <>Po si ble cau sa de error

Puede haber inten tado imple men tar la misma inter faz más de una vez. Porejem plo, lo siguiente gene rará este men saje de error:

TPas si veC lass = class(TInter fa cedO bject, IWat ched, IWai ted, IPi ned, IWat ched) . . .

So lu ción rá pi daBorre la inter faz redun dante (IWat ched, en este caso) de la sig na tura de laclase.

Infor ma ción adi cio nalPuede imple men tar una misma inter faz de dife ren tes mane ras en múl ti plescla ses. Por ejem plo, podría hacer esto:

TPost man = class(TInter fa cedO bject, IWalk). . .THi ker = class(TInter fa cedO bject, IWalk). . .

Y luego imple men tar las fun cio nes y pro ce di mien tos miem bros de la inter fazIWalk de manera dife rente en cada clase.

Mensajes de error 321

Page 356: Dsp

Interface <> has no interface identificationPo si ble cau sa de error

Ha inten tado asig nar una inter faz a un tipo GUID, pero la inter faz no fue defi-nida con un GUID. Por ejem plo, lo siguiente gene rará este men saje de error:

IPo ta to = in ter fa ce(IUnknown) func tion IdahoS pud(Chips: BOOL): HRe sult; stdcall; func tion Wis con sinW hi te(Chips: BOOL): HRe sult; stdcall; func tion Mai ne Rus set(Chips: BOOL): HRe sult; stdcall;end;pro ce du re TForm1.But ton1 Click(Sen der: TObject);var sguid: TGUID;be gin sguid := IPo ta to;

So lu ción rá pi daAñada un GUID a la decla ra ción de la inter faz, pul sando Ctrl+May+G.

Infor ma ción adi cio nalEs legal decla rar un tipo inter faz sin un GUID, pero es reco men da ble uti li zarun GUID; así evi tará pro ble mas como éste.

Interface <> not mentioned in interface listPo si ble cau sa de error

Puede haber inten tado imple men tar una inter faz en una clase que no tieneespe ci fi cado a tra vés de su sig na tura que imple men tará la inter faz en cues tión.Por ejem plo, lo siguiente gene rará este men saje de error:

TOop sa dai sa cal = class(TInter fa cedO bject, IMPei) func tion Acces sor: IMPei; pro perty Oopsy: IMPei read Acces sor im ple ments IMCa ke;end;

So lu ción rá pi daSus ti tuya la inter faz por alguna de las que apa rece en la sig na tura de la clase,o añada la inter faz en cues tión a la sig na tura de la clase, así:

TOop sa dai sa cal = class(TInter fa cedO bject, IMPei, IMCa ke) . . .

322 Los Tomos de Delphi: Delphi sin problemas

Page 357: Dsp

Infor ma ción adi cio nalSi no ha decla rado la inter faz, obten drá el men saje de error “Unde cla redIden ti fier: <>”. Puede imple men tar en una clase tan tas inter fa ces como desee.

Interface mismatch. Engine version differentPo si ble cau sa de error

Puede estar inten tando eje cu tar un pro grama de base de datos creado con unaver sión de Del phi (y por lo tanto, del BDE) más reciente que la ver sión ins ta-lada en el sis tema en el que se está pro du ciendo este men saje de error.

So lu ción rá pi daCuando dis tri buya una apli ca ción de base de datos de Del phi, incluya la ver-sión de BDE con la cual la apli ca ción fue desa rro llada, ya que es posi ble que elusua rio no la tenga ins ta lada.

En rea li dad, es una buena idea tener siem pre la ver sión más actual del BDEen su sis tema, ya que man ten drá así la com pa ti bi li dad hacia atrás y tam biénincluirá tanto las nue vas carac te rís ti cas y fun cio na li da des como los par ches delos erro res ante rio res que hayan sido solu cio na dos.

Infor ma ción adi cio nalInsta lar la ver sión actua li zada del BDE resol verá el pro blema en el caso de lospro gra mas crea dos con la ver sión más actual de Del phi, así como con ver sio nesmás anti guas de Del phi de 32 bits*. Por ejem plo, la ver sión del BDE que vienecon Del phi 2 (3.5) no es com pa ti ble con los pro gra mas crea dos en Del phi 3. Laver sión del BDE que viene con Del phi 3, sin embargo, es com pa ti ble con Del phi2 y 3 (o sea, es com pa ti ble hacia atrás).

Si nece sita ins ta lar la ver sión más reciente del BDE en las máqui nas de losusua rios, puede uti li zar Install Shield Express, que viene con Del phi de 32 bits,para crear dis que tes de ins ta la ción con este pro pó sito.

* Las ver sio nes 2-6 de Del phi son todas de 32 bits. Sola mente Del phi (Del phi 1)era de 16 bits. Posi ble mente Del phi 7 será de 64 bits.

Interface type requiredPo si ble cau sa de error

Puede haber uti li zado dos tipos de clase en la decla ra ción de un tipo de claseActi ve Form, así:

TActi ve FormX = class(TActi ve Form, TActi ve Form)

Mensajes de error 323

Page 358: Dsp

So lu ción rá pi daDebe uti li zar un tipo de clase seguido por un tipo de inter faz en la decla ra ciónde un tipo de clase Acti ve Form, así:

TActi ve FormX = class(TActi ve Form, IActi ve FormX)

Infor ma ción adi cio nalCon sulte “Class type requi red” para ver el men saje opuesto a éste (este esun ejem plo de cómo mantener ocu pado a un pro gra ma dor).

Internal error: <>Po si ble cau sa de error

Estos tipos de erro res son extre ma da mente raros en Del phi. Son nor mal menteoca sio na dos por erro res en la pro gra ma ción del com pi la dor mismo.1. Si el código de error es L1317, es espe cí fico de Del phi 3. Este error puede

estar rela cio nado con las carac te rís ti cas de Code Insight de Del phi 3.2. Si el código de error es URW337 con Del phi 2 o L1086 con Del phi 3, puede

obte nerlo mien tras com pila. Si intenta com pi lar de nuevo, podrá reci bir elmen saje “Fatal Error: Unit SysUtils was com pi led with a dif fe rentver sion of System”.

3. Si el código de error es C3254, es apa ren te mente espe cí fico de Del phi 2.Puede haber hecho una asig na ción a una varia ble Result implí cita en elcódigo Asm.

4. Si el código de error es L721, esto es apa ren te mente espe cí fico de Del phi 5.5. Si el código de error es R938, puede estar gene rando archi vos .MAP

deta lla dos.6. Puede haber cam biado el código de un paquete, y luego haber eje cu tado un

pro grama que uti liza el paquete sin pri mero recom pi larlo.

So lu ción rá pi da1. Haga una cons truc ción com pleta (Pro ject | Build All) en vez de una sim-

ple com pi la ción (Pro ject | Com pile).2. Haga una cons truc ción com pleta, como se indicó en el punto 1, o pri mero

borre todos los archi vos de uni da des com pi la das del pro yecto (.DCU) y losarchi vos de paquete (.DCP) y luego recom pile. Si esto no resuelve el pro-blema, cie rre Del phi y rei ní cielo, para rea jus tarlo de tal forma que nopiense que está tra tando con una ver sión modi fi cada de la uni dad System.

3. Actua lí cese a Del phi 3 o supe rio res (en donde este pro blema estásolu cio nado).

4. Haga un Build All.

324 Los Tomos de Delphi: Delphi sin problemas

Page 359: Dsp

5. Eli mine la opción de obte ner archi vos .MAP deta lla dos, des mar cando lacasi lla Pro ject | Options | Lin ker | Map File | Detai led. La opción delínea de comandos corres pon diente es -GD.

6. Recom pile el paquete, des pués de hacer los cam bios a cual quier uni dad quecon tenga.

Infor ma ción adi cio nalLa culpa no debe ría echár sele úni ca mente a Del phi en el caso de los erro resinter nos. Estos muchas veces pue den ser evi ta dos siguiendo prác ti cas de codi fi-ca ción están dar. Es usual mente el código “extraño” el que pro voca esos men sa-jes de error. Fami lia riícese con las prác ti cas de pro gra ma ción “están dar”, yverá pocos erro res de este tipo. De otro modo (si el error no es par cial mentedebido a prác ti cas de codi fi ca ción inu sua les), el error muchas veces puede sereli mi nado saliendo de Del phi y reini cián dolo de nuevo.2. Este error nor mal mente apa rece cuando el com pi la dor no puede deter mi-

nar si un archivo de uni dad com pi lada (.DCU) o de paquete (.DCP) nece sitaser recom pi lado. Si está uti li zando paque tes (de tiempo de eje cu ción o detiempo de diseño), puede encon trar con ve niente crear expre sa mente undirec to rio para los archi vos de paquete (.DCP). Puede hacer esto selec cio-nando Tools | Envi ron ment y la pes taña Library, e intro du ciendo laentrada apro piada en el cua dro de com bi na ción DCP Out put Direc tory.Esto ayu dará a ase gu rar que el com pi la dor siem pre uti lice el archivo depaquete más reciente (.DCP). Si está uti li zando paque tes, podría encon trarcon ve niente veri fi car que todos los paque tes ten gan la opción del com pi la-dor {$IMPLICITBUILD ON} habi li tada.

Internal Error; Near: query shellmgrPo si ble cau sa de error

Puede estar uti li zando el ser vi dor Local de Inter Base, y tiene un equipo DellPen tium Pro con Win dows NT 4 preins ta lado.

So lu ción rá pi daSiga estos pasos para modi fi car la con fi gu ra ción del Regis tro del sis tema:1. Selec cione Ini cio | Eje cu tar desde el escri to rio de Win dows.2. Intro duzca rege dit en el cua dro de com bi na ción Abrir y pulse el botón

Acep tar.3. Nave gue hasta HKEY_LOCAL_MACHINE\Soft ware\Micro soft\Win dows

NT\Current Ver sion\Win Lo gon\Shell.4. Cam bie el valor del pará me tro Shell de ‘Explo rer.EXE user hook’ a ‘Explo-

rer.EXE’.5. Rei ni cie el equipo para que la con fi gu ra ción tome efecto.

Mensajes de error 325

Page 360: Dsp

Infor ma ción adi cio nalEsa máquina en cues tión hace una con fi gu ra ción espe cial del Regis tro paracar gar una exten sión del Explo rer. ¿No son tales alter na ti vas un engorro? Sonsim ple mente otra opor tu ni dad para con fun dir a Joe Six pack (y oca sio narincom pa ti bi li da des de soft ware).

Internal Error 500. Interface not supportedPo si ble cau sa de error

Puede estar haciendo refe ren cia a un método de la inter faz Weblib, pero labiblio teca de tipos de esta inter faz no ha sido regis trada.

So lu ción rá pi daRegis tre la biblio teca de tipos Weblib.

Infor ma ción adi cio nalPuede regis trar WEB.TLB selec cio nando el menú Ini cio de Win dows y luegointro du ciendo tregsvr WEBLIB.TLB.

Site Express apa re ció por pri mera vez en Del phi 6.

Internal Server Error 500Con sulte “COINITIALIZE has not been called”.

Invalid address value. Must be a hexadecimal value in the range00000000-FFFFFFFF

Po si ble cau sa de errorPuede haber intro du cido en el cua dro de diá logo Find Error un valor de direc-ción que no está den tro de los lími tes acep ta dos.

So lu ción rá pi daIntro duzca una direc ción válida (entre 00000000 y FFFFFFFF).

Infor ma ción adi cio nalPuede acce der al cua dro de diá logo Find Error selec cio nando Search | FindError....

326 Los Tomos de Delphi: Delphi sin problemas

Page 361: Dsp

Invalid argument to date encodePo si ble cau sa de error

Puede haber pro por cio nado a la fun ción Enco de Date un con junto de valoresque no con for man una fecha válida. Por ejem plo, lo siguiente gene rará estemen saje de error, ya que Febrero 29 de 2100 no es una fecha válida (2100 no esun año bisiesto):

var MyDa te: TDa te Ti me;be gin MyDa te := Enco de Da te(2100, 2, 29); La bel1.Cap tion := Da te ToStr(MyDa te);

So lu ción rá pi daVerifique que los valo res que están siendo pasa dos a los pará me tros Year,Month y Day sean váli dos (toma dos como un todo) antes de hacer la asig na-ción. Por ejem plo, puede vali dar la entrada del usua rio inten tando hacer unacon ver sión de tipos den tro de una sen ten cia Try. . . Except así:

pro ce du re Enco deT his Da te(Year Va lue, Mont hVa lue, Day Va lue: Word);var CoddAndDa te: TDa te Ti me;be gin try CoddAndDa te:= Enco de Da te(Year Va lue,Mont hVa lue,Day Va lue); ex cept on ECon vertError do {Ges tio nar la ex cep ción} end;

Infor ma ción adi cio nalLa fun ción Enco de Date recibe tres parámetros: Year (año), Month (mes) y Day(día). El rango de valo res váli dos para el pará me tro Year es de 1 hasta 9999.El rango de valo res váli dos para el pará me tro Month va de 1 a 12. El rango devalo res váli dos para el pará me tro Day es de 1 hasta 28, 29, 30 ó 31, en depen-den cia de los valo res del mes y el año.

Invalid argument to time encodePo si ble cau sa de error

Puede haber pasado a la fun ción Enco de Time un con junto de valores que tienefuera del rango de valo res váli dos al menos uno de sus cua tro pará me tros.

Mensajes de error 327

Page 362: Dsp

So lu ción rá pi daVeri fi que que todos los valo res que se pasan a tra vés de los pará me tros Hour,Min, Sec y MSec sean váli dos antes de una asig na ción. Por ejem plo, valide laentrada del usua rio inten tando hacer una con ver sión de tipos en una sen ten ciaTry. . . Except así:

pro ce du re Enco deT his Ti me(Hour Val, Mi nu te Val, Se cond Val, Mi lli se cond Val: Word);var Enco ded Ti me: TDa te Ti me;be gin try Enco ded Ti me := Enco de Ti me(Hour Val,Mi nu te Val,Se cond Val, Mi lli se cond Val); ex cept on ECon vertError do {ges tio nar la excepción} end;

Infor ma ción adi cio nalLa fun ción Enco de Time acepta cua tro pará me tros: Hour (hora), Min (minuto),Sec (segundos) y MSec (mili se gun dos). El rango de valo res váli dos para elpará me tro Hour es de 0 hasta 23. El rango de valo res váli dos para los pará me-tros Min y Sec va de 0 a 59. El rango de valo res váli dos para el pará me troMSec es de 0 hasta 999.

Invalid Batch Move ParametersPo si ble cau sa de error

Puede haber uti li zado la misma tabla en las pro pie dades Source y Des ti na tionde un com po nente TBat chMove, y luego haber inten tado eje cu tar el métodoExe cute en tiempo de diseño (pul sando con el botón dere cho sobre el com po-nente TBat chMove y selec cio nando Exe cute del menú de con texto) o en elcódigo. Por ejem plo, asu miendo que el com po nente Bat chMove se deno minaBat chMo ve1, el siguiente código gene ra ría este men saje de error:

Bat chMo ve1.Exe cu te;

So lu ción rá pi daSelec cione dife ren tes tablas para las pro pie da des Des ti na tion y Source.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “TBat chMove” en la ayuda de Del phi.

328 Los Tomos de Delphi: Delphi sin problemas

Page 363: Dsp

Invalid Bind TypeCon sulte “Unknown SQL Error”.

Invalid BLOb handle [in record buffer]Po si ble cau sa de error

Puede estar acce diendo a una gran can ti dad de cam pos BLOb, y el valor delpará me tro BLOB SIZE del BDE es muy pequeño.

So lu ción rá pi daIncre mente el pará me tro BLOB SIZE con la uti li dad BDE Con fi gu ra tion.Para ello, abra la uti li dad BDE Con fi gu ra tion/Admi nis tra tor y nave gue hastaCon fi gu ra tion | Dri vers | <Su base de datos>. Por ejem plo, si está uti li zandoInter Base, nave gue hasta Con fi gu ra tion | Dri vers | Native | INTRBASE |BLOB SIZE.

Puede que tam bién sea con ve niente aumen tar el valor de SHAREDMEMSIZEcon el BDE Admi nis tra tor. Para ello, abra la uti li dad BDE Admi nis tra tor ysiga estos pasos:1. Selec cione la eti queta Con fi gu ra tion en la sec ción Dri vers & System

(izquierda).2. Selec cione System | Init.3. Incre mente el valor de SHAREDMEMSIZE.

Si está uti li zando un objeto TQuery, sería con ve niente redu cir la can ti dad deregis tros en el con junto resul tado.

Infor ma ción adi cio nal

Nota: Si está utilizando conjuntos de resultados vivos, los parámetros BLOBS TOCACHE y BLOB SIZE del BDE no tendrán efecto.

Este es el error del BDE número 10030.

Invalid BLOb SizePo si ble cau sa de error

A pesar de lo que dice el men saje de error, el pro blema puede ser que la tablano tenga un índice único en clus ter.

Mensajes de error 329

Page 364: Dsp

So lu ción rá pi daCree un índice único en clus ter para la tabla.

Infor ma ción adi cio nalUn índice en clus ter está alma ce nado físi ca mente en el disco según el orden delíndice. Por esta razón, sola mente se puede tener un índice en clus ter para unatabla.

Invalid class stringPo si ble cau sa de error

1. Puede haber intro du cido en la pro pie dad Ser verGUID de un com po nenteTDCOMCon nec tion, TMIDASCon nec tion, TOLEEnter pri se Con nec tion oTRe mo te Ser ver un valor que no se ajusta al for mato espe rado.

2. Puede haber intro du cido un valor para la pro pie dad Ser ver Name de uncom po nente TRe mo te Ser ver, pero olvidó espe ci fi car el Ser verGUID.

So lu ción rá pi da1. Utilice el for mato:

{00000000-0000-0000-0000-000000000000}

2. Pro por cione un Ser verGUID válido (vea el punto ante rior).

Infor ma ción adi cio nal1. Debe pro por cio nar las lla ves al ini cio y al final del GUID, como se mues tra

arriba. Con sulte “GUIDs”, “Ser verGUID” y “GUIDToS tring func tion” en laayuda de Del phi para más infor ma ción.

2. La pro pie dad Ser ver Name de TRe mo te Ser ver es opcio nal; el Ser verGUIDno lo es.

Invalid class typecastPo si ble cau sa de error

Puede estar inten tando con ver tir una varia ble a un tipo de objeto con el cualno es com pa ti ble.

So lu ción rá pi daCon vierta la varia ble a un objeto de su mismo tipo o de un ances tro de aqueltipo.

330 Los Tomos de Delphi: Delphi sin problemas

Page 365: Dsp

Infor ma ción adi cio nalHe aquí un ejem plo de código que pro duce el men saje de error bajo dis cu sión:

pro ce du re Bran doAs Tough Guy;var b: TObject;be gin b := TBut ton.Crea te(nil); {fun cio na, ya que TBut ton des cien de de TObject} with B as TMe mo do {esto pro du ce el men sa je de error, ya que TMe mo no es des cen dien te de TBut ton} ...end;

Invalid compiler directive: <>Po si ble cau sa de error

1. Puede tener una direc tiva de com pilación $ELSE o $ENDIF que no estápre ce dida por una direc tiva $IFDEF, $IFNDEF o $IFOPT. Por ejem plo, losiguiente gene rará este men saje de error:

uses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Re gistry, {$ELSE} Ini Fi les, {$ENDIF} Con trols;

Lo siguiente tam bién oca sio nará el mismo error, ya que hay un espa cioentre la llave ( { ) y el signo de dólar ( $ ), lo que con vierte el texto en uncomen ta rio en lugar de una direc tiva de com pilación:

uses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, { $IFDEF WIN32} Re gistry, {$ELSE} Ini Fi les, {$ENDIF} Con trols;

2. Puede haber espe ci fi cado una direc tiva de com pi la dor $IFOPT sin unaopción de com pilación pos te rior; o sin un signo mas (+) o menos (–) pos te-rior para indi car si se está compro bando si la opción del com pi la dor estáactiva o inactiva; o ha uti li zado la forma larga de la direc tiva de com-pilación. Por ejem plo, lo siguiente gene rará este men saje de error:

{$IFOPT} //fal ta la op ción del com pi la dor{$IFOPT I} //fal ta el + o –

Y tam bién lo siguiente:

{$IFOPT IOCHECKSON} //no se pue de uti li zar la for ma lar ga de las op cio nes //de com pi la ción con la di rec ti va IFOPT

Mensajes de error 331

Page 366: Dsp

So lu ción rá pi da1. La forma correcta de uti li zar las direc ti vas de com pi la ción mos tra das

arriba es:

uses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, {$IFDEF WIN32} Re gistry, {$ELSE} Ini Fi les, {$ENDIF} Con trols;

2. La forma correcta de uti li zar las direc tivas de com pi la ción mos tradasarriba es:

{$IFOPT I+}. . .{$ENDIF}

Infor ma ción adi cio nalPara más infor ma ción, con sulte “com pi ler direc ti ves” en la ayuda de Del phi.

Invalid directoryPo si ble cau sa de error

Puede estar uti li zando una ver sión anti gua de Del phi y haber intro du cido algocomo C:\Archi vos de pro grama\Borland\Data base Desk top en la pro pie dadData ba se Name de un objeto TTa ble.

So lu ción rá pi daNece sita intro du cir algo como: c:\pro gra~1\bor land\databa~1 si la ruta con-tiene nom bres de direc to rio de más de ocho carac te res.

Infor ma ción adi cio nalEl método pre fe rido es crear un alias que haga refe ren cia a la ubi ca ción de labase de datos. Con sulte “Inva lid file name” en este libro.

Invalid field namePo si ble cau sa de error

1. Puede haber espe ci fi cado en la pro pie dad SQL de un TQuery un nom bre decampo que no existe en la tabla. Por ejem plo, lo siguiente gene rará esteerror si no existe un campo Films en la tabla Docu men ta ries:

SELECT FilmsFROM Do cu men ta ries

332 Los Tomos de Delphi: Delphi sin problemas

Page 367: Dsp

WHERE Di rec tor = 'Say les' OR 'Mo rris'

2. Puede no haber espe ci fi cado la sen ten cia SQL de la forma pre cisa (sin tác ti-ca mente) en la que Del phi espera verla. Por ejem plo, la siguiente sen ten ciapuede gene rar este men saje de error:

SELECT *FROM Cus to mersWHERE Sta te = 'ID'

So lu ción rá pi da1. Com pruebe que sola mente intenta acce der a cam pos que exis ten realmente

en la base de datos.2. Puede nece si tar poner el nom bre de la tabla en mayús cu las y ence rrar el

nom bre del campo entre comi llas dobles. Dada la sen ten cia SQL de arriba,puede tener que modi fi carla así:

SELECT *FROM CUSTOMERSWHERE CUSTOMERS."Sta te = 'ID'

Infor ma ción adi cio nalSi está conectá ndose a una base de datos de ser vi dor SQL, fami lia rí cese con lasin ta xis SQL par ti cu lar del ser vi dor que esté uti li zando, así como con lascarac te rís ti cas que soporta (que cam bian de un fabri cante a otro).

Invalid field sizePo si ble cau sa de error

Puede haber inten tado crear un campo de cadena de carac te res en el código,pero olvidó asig narle un tamaño. Por ejem plo, lo siguiente gene rará este men-saje de error:

Add('DIVISIONNAME', ftString, 0, Fal se);

So lu ción rá pi daAsigne siem pre un tamaño a los cam pos de tipo ftString, ftBCD, ftBytes,ftVarB ytes, ftBlob, ftMemo o ftGrap hic.

Infor ma ción adi cio nalNo sola mente el tamaño no es apli ca ble a cier tos tipos de cam pos; aún entreaque llos a los que es aplicable, puede sig ni fi car dife ren tes cosas. En el caso delos cam pos de tipo cadena y Byte, Size se refiere a la can ti dad de bytes que elcampo reservará para cada ins tan cia. Cuando se aplica a un campo BCD, Sizees la can ti dad de dígi tos des pués de la coma deci mal. Para un campo BLOb,

Mensajes de error 333

Page 368: Dsp

Memo o Grap hic, el pará me tro Size deter mina la can ti dad de bytes que sonreal mente alma ce na dos en la pro pia tabla de base de datos (los demás sonalma ce na dos en un archivo .MB).

Invalid field typePo si ble cau sa de error

Puede estar inten tando selec cio nar un campo Autoin cre ment de una tabla uti-li zando la pro pie dad SQL de un com po nente TQuery mien tras está uti li zandoactua li za cio nes en caché.

So lu ción rá pi daAun que es cierto que no se puede edi tar un campo Autoin cre ment, puede selec-cio narlo incluso bajo las cir cuns tan cias ante rio res actua li zando la ver sión delBDE a la 4.01 o supe rior.

Infor ma ción adi cio nalPodría no ser bueno per mi tir que los cam pos autoin cre men ta les sean actua li za-dos, ya que son nor mal mente uti li za dos como cla ves pri ma rias gene radasauto má ti ca mente.

Invalid file namePo si ble cau sa de error

1. Puede estar uti li zando la ver sión 3.5 del BDE y Win dows 95B (4.00.950b,tam bién cono cida como Win95 OSR2) mien tras accede a tablas cuya rutacon tiene nom bres de archi vos lar gos y/o espa cios en los nom bres de direc to-rio o de archivo.

2. Puede estar exce diendo la máxima lon gi tud de una ruta, si su sis tema ope-ra tivo de red es Novell.

3. Puede tener un após trofe en un nom bre de direc to rio al que ha asig nado unalias. Por ejem plo, si crea un direc to rio deno mi nado What’sUpDoc, y luegocrea un alias como Bugs Bunny que apunta a él, obten drá este men saje deerror.

4. Puede estar inten tando acce der a un archivo al que no tiene acceso. Porejem plo, puede estar intentando abrir un archivo de esta forma:

Assign Fi le(No Rou te Fi le, Spool Path+Fi le Na me);Rew ri te(No Rou te Fi le);

334 Los Tomos de Delphi: Delphi sin problemas

Page 369: Dsp

y el archivo es inac ce si ble debido a que Spool path = 'G:\data\spool\' y lamáquina en la que el pro grama está eje cu tán dose no tiene mapeada la uni-dad G.

So lu ción rá pi da1. Si está uti li zando la ver sión 3.5 del BDE (que viene con Del phi 2) y Win-

dows 95B con la opción de nom bres de archivo largos habi li tada (FAT32),nece sita ins ta lar la ver sión 3.5f del BDE para poder acce der a las tablascuyas rutas inclu yen nom bres de archivo lar gos o espa cios.Una alter na tiva es colo car las tablas en una ruta que no incluya nom breslar gos o espa cios.

2. Con sulte la docu men ta ción de Novell para ver cuál es la máxima lon gi tudde las rutas en su ver sión de Net ware.

3. Renom bre el direc to rio, eli mi nando el após trofe.4. Vuelva a mapear la uni dad G: de su orde na dor, de forma que pueda “ver”

el archivo que supues ta mente está abriendo.

Infor ma ción adi cio nal1. Des car gue la ver sión más reciente del BDE desde el sitio web de Bor land.

Puede bajar la ver sión 3.5 del BDE desde el sitio web de Bor land enwww.bor land.com/tech sup port/bde/uti li ties.html.El nom bre del par che es ‘BDE v3.5 32-Bit core DLLs inclu ding FAT32enhan ce ment’.

2. Si pos te rior mente obtiene un men saje de error “Path too long”, actua licelas tablas de Para dox al nivel 7. Vea las ins truc cio nes para hacer esto en“Hig her table level requi red” .Puede com pro bar qué ver sión de Win dows uti liza pul sando con el botóndere cho del ratón sobre el icono Mi PC en el escri to rio y selec cio nando Pro-pie da des en el menú de con texto. El número de ver sión del sis temaope ra tivo se mues tra en la página Gene ral.

3. No es una buena prác tica uti li zar sím bo los espe cia les (como apóstrofes) enlos nom bres de direc to rios o archivos.

Invalid floating point operationPo si ble cau sa de error

1. Puede haber inten tado asig nar un número dema siado grande a un tipo dedatos de punto flo tante. Por ejem plo, lo siguiente gene rará este error:

var Ga tes, Tur ner, McCart ney: Currency;be gin

Mensajes de error 335

Page 370: Dsp

Tur ner := 922337203685477.5807; McCart ney := 922337203685477.5807; Ga tes := Tur ner + McCart ney; {el error ocu rre aquí}

2. Puede haber tra tado de con ver tir un número real a un entero uti li zando lasfun cio nes Round o Trunc, y el número era dema siado grande para seralma ce nado en un entero. Cual quiera de los siguien tes ejem plos generaeste error:

var Roly Poly: Inte ger; hyper: Exten ded;be gin hyper := 2222222222.22; Roly Poly := Round(hyper);

var Line: Inte ger; Work mans: Comp;be gin Work mans := 2222222222.22; Line := Trunc(Work mans);

3. Puede que la máquina no dis ponga de copro ce sa dor mate má tico.

So lu ción rá pi da1. Ase gú rese de que no asigna núme ros dema siado gran des, pre vi nién dolo

explí ci ta mente en el código o ence rrando las asig na cio nes en un blo queT r y . . . Except.

2. Encie rre la lla mada a Round o Trunc en un blo que Try. . . Except:

const crlf = #13#10;. . .var What GoesA round Co mesA: Inte ger; bent: dou ble;try What GoesA round Co mesA:= Round(bent);ex cept on EInva lidOp do Mes sa geDlg('El nú me ro real es muy gran de’ + crlf + ‘pa ra ca ber en un tipo en te ro’, mtError, [mbOK], 0);end;

3. Actua lí cese a una máquina que tenga copro ce sa dor mate má tico (que eje-cuta las ope ra cio nes de punto flo tante por hard ware) o añada la direc tivade com pi la dor {$N-} en la parte supe rior de la uni dad.

Infor ma ción adi cio nal1. Para más infor ma ción, con sulte “real types” en la ayuda de Del phi.

336 Los Tomos de Delphi: Delphi sin problemas

Page 371: Dsp

2. En los ejem plos dados arriba, el men saje de error espe cí fico que acom pañaa EInva lidOp es “Inva lid floa ting point ope ra tion”.

Con sulte “Inte ger cons tant too large”.

Invalid function result typePo si ble cau sa de error

Puede haber decla rado una fun ción con un resul tado de tipo File. Por ejem plo,lo siguiente generará este men saje de error:

func tion GetF rom Ca bi net: file;

So lu ción rá pi daNo uti lice File como resul tado devuelto por una fun ción.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “func tion decla ra tions” y “func tion calls” en laayuda de Del phi.

Invalid GUID formatPo si ble cau sa de error

Puede haber modi fi cado manual mente un GUID. Por ejem plo, puede habereliminado uno de los dígitos de un GUID en una biblio teca de tipos.

So lu ción rá pi daNo modi fi que los GUIDs. Son núme ros espe cia les que se gene ranauto má ti ca mente.

Infor ma ción adi cio nalGUID sig ni fica Glo bally Uni que Iden ti fier (Iden ti fi ca dor Glo bal Unico). Paramás infor ma ción, con sulte “GUIDs” en la ayuda de Del phi.

Invalid index descriptorPo si ble cau sa de error

Puede haber inten tado crear un índice en una tabla dBASE uti li zando elmétodo AddIndex e indicó una opción de índice invá lida. Por ejem plo, la opción

Mensajes de error 337

Page 372: Dsp

ixCa seIn sen si tive no es válida para tablas dBASE, por eso el siguiente códigogenera este men saje de error:

Ta ble1.AddIndex('Area','Area',[ix Ca seIn Sen si ti ve]);

So lu ción rá pi daUti lice sola mente tipos de índi ces apro pia dos para la tabla con la que estátra ba jando.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “AddIndex” en la ayuda de Del phi.

Invalid index expressionPo si ble cau sa de error

Puede estar inten tando crear un índice com puesto sobre una tabla dBASE,pero no ha pasado la cons tante de opción de índice ixExpres sion al métodoAddIndex. Por ejem plo, lo siguiente gene rará este men saje de error:

Ta ble1.AddIndex('ndxCity Sta te','City+Sta te', []);

So lu ción rá pi daPase ixExpres sion en el pará me tro IndexO ptions del método AddIndex:

Ta ble1.AddIndex('ndxCity Sta te','City+Sta te', [ixExpres sion]);

Infor ma ción adi cio nalPara más infor ma ción, con sulte “AddIndex” en la ayuda de Del phi.

Invalid index/tag namePo si ble cau sa de error

1. Puede estar inten tando aña dir un nom bre de índice que ya está siendo uti-li zado. Por ejem plo, lo siguiente gene rará este men saje de error, ya que elmismo nom bre está siendo uti li zado por los dos índi ces:

AddIndex('Ver zeich nis', 'Stadt', []);AddIndex('Ver zeich nis', 'Land', []);

2. Puede estar inten tando asig nar a un índice com puesto por un único campoun nom bre dis tinto del campo al que hace refe ren cia y no ha pro por cio nadola opción de índice ixCa seIn sen si tive. Por ejem plo, lo siguiente gene rará

338 Los Tomos de Delphi: Delphi sin problemas

Page 373: Dsp

este men saje de error, ya que el nom bre pro por cio nado para el índice nocoin cide con el nom bre del campo:

AddIndex('ndxStadt', 'Stadt', []);

3. Puede estar inten tando pasar en el pará me tro TIndexO ptions del métodoAddIndex un valor que no es apro piado para el tipo de la tabla. Por ejem-plo, puede estar pro por cio nando para una tabla Para dox el valorixExpres sion, que sólo puede ser uti li zado con tablas dBASE.

4. Puede estar inten tando crear más de un índice pri ma rio (clave pri ma ria).Por ejem plo, si ya tiene un índice pri ma rio sobre un campo, lo siguientegene rará este men saje de error:

AddIndex('Stadt', 'Stadt', [ixP ri mary]);

So lu ción rá pi da1. Com pruebe que no asigna el mismo nom bre de índice más de una vez.

Puede veri fi car si un índice ya existe de esta manera:

if not Ta ble1S tadt.IsIndex Field then AddIndex('ndxStadt', 'Stadt', []);

2. Asigne el mismo nom bre del campo al nom bre del índice, así:

AddIndex('Stadt', 'Stadt', []);

o añada la opción de índice ixCa seIn sen si tive, así:

AddIndex('ndxStadt', 'Stadt', [ix Ca seIn sen si ti ve]);

3. Asigne las opcio nes de índice apro pia das para la tabla con la que estétra ba jando.

4. No asigne más de una clave pri maria (ixP ri mary) por tabla.

Infor ma ción adi cio nal2. A los índi ces com pues tos de múl ti ples colum nas se les puede dar nom bres

dis tin tos de las colum nas sin pro por cio nar el pará me tro de opción de índiceixCa seIn sen si tive.Si asigna a un índice el mismo nom bre del campo, no incluya el pará me trode opción de índice ixCa seIn sen si tive. Por ejem plo, un índice com puestosobre las colum nas City y State podría ser defi nido así:

AddIndex('City Sta te','Stadt;Land',[]);

3. Para más infor ma ción, con sulte “TTa ble.AddIndex” en la ayuda de Del phi.4. Si tiene un índice pri ma rio sobre la tabla (reco men da ble) que con siste de

una única columna, ésta debe ser la pri mera columna de la tabla. Si tieneun índice pri ma rio com puesto, debe empe zar por la pri mera columna yestar com puesto de ahí en ade lante por las colum nas con se cu ti vas. Enotras pala bras, un índice pri ma rio com puesto puede ser esta ble cido sobrelas colum nas 1, 2 y 3, pero no sobre las colum nas 1 y 3 (ó 1, 2 y 4, etc.).

Mensajes de error 339

Page 374: Dsp

Invalid message parameter listPo si ble cau sa de error

1. Puede haber decla rado un método de ges tión de men sa jes y pro por cionómás de un pará me tro. Por ejem plo, lo siguiente gene rará este men saje deerror:

pro ce du re WMChar(var Mes sa ge: TWMChar; n: Word); mes sa ge WM_CHAR;

2. Puede haber eliminado, o le faltó añadir, la pala bra reser vada Var en ladecla ra ción del mane ja dor de men saje:

pro ce du re WMChar(Mes sa ge: TWMChar); mes sa ge WM_CHAR;

So lu ción rá pi da1. Eli mine los pará me tros adi cio na les de la decla ra ción.2. Añada la pala bra reser vada Var a la decla ra ción.

Infor ma ción adi cio nalUn pro ce di miento de ges tión de men sa jes de Win dows acepta un único pará me-tro. Debe ser un pará me tro Var.

El método de manejo de men saje de arriba debe ría ser:

pro ce du re WMChar(var Mes sa ge: TWMChar); mes sa ge WM_CHAR;

Para más infor ma ción, con sulte “mes sage hand lers” en la ayuda de Del phi.

Invalid package file <>Po si ble cau sa de error

1. Pro ba ble mente intenta car gar un archivo que tiene una exten sión dis tintade .DPL o .DPC en la página Pac ka ges del cua dro de diá logo Pro jectOptions, des pués de haber selec cio nado Install Pac ka ges del menú Com-po nent, haber pul sado el botón Add, y luego selec cio nar un archivo en elcua dro de diá logo Add Design Pac kage.

2. Si el archivo tiene una de las exten sio nes apro pia das, no es real mente unarchivo de paquete o se ha dañado.

So lu ción rá pi da1. Selec cione un archivo con exten sión .DPL (biblio teca de paque tes de Del-

phi) o una exten sión .DPK (paquete de Del phi).2. Vuelva a crear el archivo de paquete, si es nece sa rio.

340 Los Tomos de Delphi: Delphi sin problemas

Page 375: Dsp

Infor ma ción adi cio nalPuede obte ner este error si ins taló un paquete y luego movió o borró algu nosde los archi vos que lo com po nen. Selec cio nar la casi lla de veri fi ca ción parainten tar aña dir de nuevo el paquete (y su página sobre la Paleta de Com po nen-tes) puede oca sio nar este error. Eli mine el paquete (pul sando el botónRemove), colo que los archi vos reque ri dos en uno de los direc to rios de la rutade bús queda de Del phi, y luego añada de nuevo el paquete uti li zando el botónAdd.

Invalid ParameterPo si ble cau sa de error

Puede haber olvi dado espe ci fi car el valor de Table Name en el objeto TTa ble dedes tino mien tras eje cuta una ope ra ción de movi miento en lote uti li zando elcom po nente TBat chMove.

So lu ción rá pi daDebe espe ci fi car tanto las tablas fuente como de des tino al utilizar el com po-nente TBat chMove.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “TBat chMove” en la ayuda de Del phi.

Invalid parameter type: <>Po si ble cau sa de error

Puede haber intro du cido un tipo no per mi tido en una biblio teca de tipos, comocuando se añade un miem bro a una inter faz. Por ejem plo, aña dir la siguientepro pie dad gene rará este men saje de error:

pro perty FFroggy: String;

So lu ción rá pi daUti lice WideS tring como el tipo de la pro pie dad; String no es un tipo de auto-ma ti za ción OLE.

Infor ma ción adi cio nalTodos los tipos de auto ma ti za ción OLE deben ser com pa ti bles con las varian-tes. Los siguien tes tipos de Del phi pue den ser uti li za dos en pro yec tos de auto-ma ti za ción: Byte, Currency, Dou ble, IDis patch, Inte ger, IUnknown,

Mensajes de error 341

Page 376: Dsp

OLEVa riant, SmallInt, Sin gle, TDa te Time, WideS tring, Word Bool, SCode,TCo lor y TSa feA rray.

Invalid pathCon sulte “Inva lid file name”.

Invalid pointer operationPo si ble cau sa de error

Puede estar inten tando libe rar memo ria que ya ha sido libe rada. Por ejem plo,pasar a Dis pose o Free Mem un pun tero con valor Nil genera este men saje deerror. El siguiente código poten cial mente pro duce el men saje de error bajo dis-cu sión. La razón es que la memo ria siem pre es libe rada en la parte Finally,pero en el caso de una excep ción, es libe rada pri mero en la parte Except. Estooca siona que la eje cu ción pos te rior de la parte Finally (que siem pre se eje cuta,con o sin excep ción) intente libe rar la memo ria de nuevo, pro du ciendo el error:

pro ce du re Fi nallyFree;var Ho me work: Poin ter;be gin

Get Mem(Ho me work, 32); try

try {Acciones...} ex cept Free Mem(Ho me work, 32); end; //ex cept fi nally {Lo si guien te fun cio na bien, a me nos que haya ocu rri do una ex cep ción, en cuyo caso se in ten tará li be rar la me mo ria por se gun da vez} Free Mem(Ho me work, 32); end; //fi nallyend;

So lu ción rá pi daAse gú rese de que no trata de libe rar la memo ria que ya ha sido libe rada. Porejem plo, para garan ti zar que no se libere de nuevo la memo ria que ya ha sidolibe rada en el ejem plo de arriba, haga esto:

pro ce du re Fi nallyFree;var Ho me work: Poin ter;be gin

342 Los Tomos de Delphi: Delphi sin problemas

Page 377: Dsp

Get Mem(Ho me work, 32); try try {Acciones...} ex cept Free Mem(Ho me work, 32); end; //ex cept fi nally {Lo si guien te fun cio na bien SIEMPRE} if not Assig ned(Ho me work) then Free Mem(Ho me work, 32); end; //fi nallyend;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “New”, “Dis pose”, “Free Mem” y “Get Mem” enla ayuda de Del phi.

Invalid property pathPo si ble cau sa de error

Puede estar escri biendo un com po nente e intentando alma ce nar sus pro pie da-des Publis hed manual mente uti li zando el método Defi neP ro per ties (y posi ble-mente otros méto dos rela cio na dos, como Read Data y Wri te Data).

So lu ción rá pi daEli mine el tratamiento de pro pie da des Publis hed que esté haciendo en elmétodo Defi neP ro per ties (y otros méto dos rela cio na dos, como Read Data yWri te Data).

Infor ma ción adi cio nalLas pro pie da des que se defi nen como Publis hed son seria li za das auto má ti ca-mente por Del phi.

En oca sio nes puede que nece site uti li zar el método Defi neP ro per ties, comocuando quiera alma ce nar el estado de pro pie da des no publi ca das.

Invalid property valuePo si ble cau sa de error

1. Puede haber asig nado un valor que no es válido a una pro pie dad. Por ejem-plo, intro du cir el nom bre de un com po nente no exis tente en la pro pie dadActi ve Con trol de un for mu la rio, o “Maybe” den tro de la pro pie dad Ena bled

Mensajes de error 343

Page 378: Dsp

(una pro pie dad de tipo Boo lean, que acepta sola mente los valo res True oFalse) de un com po nente gene rará este men saje.

2. Un archivo de for mu la rio (.DFM) puede con te ner una refe ren cia a unmétodo para el que no hay asig nado actual mente nin gún mane ja dor deeven tos.

So lu ción rá pi da1. Intro duzca un valor que sea válido para la pro pie dad en cues tión. Siempre

que se pro por cione un cua dro de com bi na ción para esco ger un valor de unalista, utilícelo.

2. Eli mine la línea en el archivo .DFM o eli mine la refe ren cia al método en lapágina Events del Inspec tor de Obje tos.

Infor ma ción adi cio nal1. Todos los con tro les situa dos sobre el for mu la rio se mos tra rán en la lista

des ple ga ble para la pro pie dad Acti ve Con trol (como los obje tos TBut ton,TEdit, etc.), pero los com po nen tes grá fi cos (como TLa bel, TImage), así comolos cua dros de diá logo, relo jes del sis tema (timers), etc., no se mos tra rán,ya que no son capa ces de reci bir el foco y por lo tanto no pue den ser el con-trol activo.

2. Para reci bir este men saje, puede haber res pon dido al men saje “The <>[met hod,pro perty] refe ren ced by <> does not exist. Remove therefe rence?” pul sando el botón No. Si selec ciona Yes, la refe ren cia seráborrada del archivo de for mu la rio (.DFM), y el men saje de error bajo dis cu-sión no será gene rado.

Invalid property value on line <>Po si ble cau sa de error

Puede tener un error de sin ta xis en un archivo .DFM.

So lu ción rá pi daVisua lice el archivo .DFM en el número de línea indi cado en el men saje deerror para ver qué es lo que está cau sando el pro blema (Search | Go to LineNum ber. . . ).

Infor ma ción adi cio nalLos archi vos .DFM son la repre sen ta ción tex tual de los for mu la rios. Ellos des-cri ben qué obje tos están sobre el for mu la rio, dónde son mos tra dos sobre el for-mu la rio y su con fi gu ra ción de pro pie da des.

344 Los Tomos de Delphi: Delphi sin problemas

Page 379: Dsp

Puede edi tar el archivo .DFM pul sando con el botón dere cho del ratón sobre elfor mu la rio y selec cio nando View As Text del menú de con texto. Los cam biosque haga en el .DFM se refle ja rán sobre el pro pio for mu la rio, de la mismaforma que los cam bios que haga direc ta mente sobre el for mu la rio, como colo carcom po nen tes sobre él y con fi gu rar sus pro pie da des, se refle ja rán en el archivo.DFM. Esto se conoce como edi ción bidi rec cio nal (two-way edi ting).

En el siguiente frag mento de archivo .DFM apa rece una coma inco rrecta. Estogene ra ría el men saje de error bajo discusión, indi cando la línea 5 como ubi ca-ción del pro blema.

ob ject Form1: Tform1 Left = 200 Top = 106 Width = 544 Height = ,375 {aquí está el pro ble ma} Cap tion = 'Form1' Font.Char set = DEFAULT_CHARSET Font.Co lor = clWin dow Text Font.Height = -11 Font.Name = 'MS Sans Se rif' Font.Style = [] Pi xels PerInch = 96 Text Height = 13end

Invalid resource formatPo si ble cau sa de error

Puede estar inten tando car gar un recurso de 16 bits en Del phi de 32 bits.

So lu ción rá pi daCar gue el recurso en un edi tor de recur sos de 32 bits, como el Image Edi tor (enDel phi de 32 bits), y luego guár delo.

Infor ma ción adi cio nalAbrir y luego guardar el recurso en un edi tor de 32 bits lo gra bará como unrecurso de 32 bits.

Invalid Stream FormatPo si ble cau sa de error

Un archivo que Del phi está tra tando de car gar, qui zás un archivo de for mu la-rio o paquete, puede estar dañado.

Mensajes de error 345

Page 380: Dsp

1. Si Del phi está ini ciándose con un pro yecto car gado (ha optado por guar darla con fi gu ra ción del escri to rio, y dejó el pro yecto abierto en el entorno inte-grado la última vez que cerró Del phi), un archivo del pro yecto puede ser elcau sante.

2. Si Del phi está ini ciándose sin un pro yecto car gado, un paquete es el prin ci-pal sos pe choso.

So lu ción rá pi da1. Puede que tenga que copiar el código del pro yecto, ini ciar un pro yecto

nuevo, y pegar el código del pro yecto viejo al pro yecto nuevo.2. Para deter mi nar cuál es el paquete cul pa ble, eli mine los paque tes

siguiendo estos pasos:

a. Seleccione Com po nents | Install Pack ages.b. Localice un paquete de terceros fabricantes y desmarque su casilla de

verificación.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.

Infor ma ción adi cio nalSea cau te loso al uti li zar com po nen tes de ter ce ros pro ve nien tes de fuen tes enlas que no tenga con fianza plena. Vea los estu dios de Del phi Infor mant paraobte ner infor ma ción sobre qué com po nen tes de ter ce ros tie nen mejor cali dad.Con tacte con el equipo Dany soft para cono cer cua les son los que mejor se adap-ta rán a sus nece si da des. Podría tam bién ser bene fi cioso revi sar el grupo denoti cias bor land.public.del phi.third party y el sis tema e-com merce del GrupoDany soft: www.dany shop.com.

Invalid typePo si ble cau sa de error

1. Puede estar inten tando aña dir un método o pro pie dad miem bro a unainter faz en Del phi 6 o supe rior, y espe ci ficó un tipo de datos no com pa ti blecon COM. Por ejem plo, intro ducir

pro perty Orwe llian: String;

Gene rará este men saje de error, ya que String no es un tipo de datos válidopara inter fa ces.

2. Con sulte “Unknown SQL Error”.

346 Los Tomos de Delphi: Delphi sin problemas

Page 381: Dsp

So lu ción rá pi da1. Uti lice tipos que sean per mi ti dos en COM, como WideS tring.2. Con sulte “Unknown SQL Error”.

Infor ma ción adi cio nalEl menú Edit | Add to Inter face apa re ció en Del phi 6.

Invalid Type ConversionCon sulte “Unknown SQL Error”.

Invalid typecastPo si ble cau sa de error

1. Puede estar inten tando hacer una con ver sión de tipos de un objeto o tipo aun objeto o tipo con el que aquél no es com pa ti ble.

2. Puede estar inten tando com pa rar tipos a tra vés de fron te ras de módu los(.EXE a .DLL o .DLL a .DLL).

So lu ción rá pi da1. Haga con ver sio nes de tipos sola mente entre tipos com pa ti bles. Puede

compro bar la com pa ti bi li dad uti li zando los ope ra do res Is y/o As. Por ejem-plo, para eje cu tar una ope ra ción sobre un com po nente sola mente si se tratade un TTa ble, puede hacer algo como esto:

for i := 0 to Com po nent Count-1 do if Com po nents[i] is TTa ble then TTa ble(Com po nents[i]).Clo se;

2. Evite hacer con ver sio nes de tipos entre fron te ras de módu los. En talescasos, uti lice fun cio nes de res puesta (call back), de forma que todas las veri-fi ca cio nes/con ver sio nes ocu rran en el mismo módulo.

Infor ma ción adi cio nalEstos son los tipos de con ver sión que son per mi ti dos: Un tipo ordi nal o puntero a un tipo ordi nal o puntero Un carácter, cadena, array de char, o PChar a String Un ordi nal, real, cadena o vari ante a vari ante Una vari ante a ordi nal, real, string o vari ante Una referencia a una vari able a cualquier tipo con el mismo tamaño

Mensajes de error 347

Page 382: Dsp

Lo siguiente (ordi nal a ordi nal) fun ciona:

Chica go := Boo lean(0);

Pero esto (cadena a ordi nal) no:

Memp his := Boo lean('Fal se');

Invalid use of keywordPo si ble cau sa de error

1. Puede haber un error de sin ta xis en la sen ten cia SQL aso ciada a un com-po nente TQuery. Por ejem plo, puede estar inten tando uti li zar unpará me tro en la cláu sula FROM, o puede haber obviado la cláu sula FROMcom ple ta mente. Por ejem plo, esto gene rará el men saje de error bajodis cu sión:

SELECT *FROM :Re bel

Y tam bién esto:

SELECT *WHERE Re bel = 'Wit hout a clau se'

2. Puede que no tenga nin gún nom bre de columna en la cláu sula SELECT y/onin gún nom bre de tabla en la cláu sula FROM.

3. Puede haber uti li zado la pala bra reser vada GROUP BY sin haber uti li zadoalguna fun ción de agre ga ción en la cláu sula SELECT (como COUNT, SUM,MIN, MAX, AVG, etc.).

4. Puede estar uti li zando Ora cle y no haber uti li zado mayús cu las en la sen-ten cia SQL.

5. Puede tener un nom bre de campo con espa cios en la parte SELECT de susen ten cia SQL y no haberle ante puesto el nom bre de la tabla o el alias alcampo.

6. Puede haber olvi dado aña dir un “AND” en una sen ten cia SQL. Por ejem-plo, lo siguiente gene rará este men saje de error:

SQL.Add('SELECT Ma te rial.Week Be gin, Ma te rial.TalkIndi ca tor');SQL.Add('FROM Ma te rial, Week WHERE');SQL.Add('Ma te rial.Week Be gin >= :Firs tDa te');SQL.Add('AND Ma te rial.Week Be gin <= :Last Da te');SQL.Add('AND Ma te rial.Week Be gin = Week.Week Be gin');SQL.Add('Week.WeekT ype = "Reg"');

7. Puede haber uti li zado una sen ten cia SQL que hace refe ren cia a un campoque uti liza una pala bra reser vada de SQL, y no ha ante puesto al nom brede campo el nom bre de la tabla, ni ence rrado el nom bre de campo entrecomi llas. Por ejem plo, lo siguiente gene rará este men saje de error:

348 Los Tomos de Delphi: Delphi sin problemas

Page 383: Dsp

with qryActi veS tu dents do be gin SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM Stu dents'); SQL.Add('WHERE Acti ve = True'); // Aquí el error SQL.Add('ORDER BY Da teOf Last Talk'); Open; First;end;

So lu ción rá pi da1. Inserte la cláu sula FROM junto con el nom bre de la(s) tabla(s) de la(s) que

desea selec cio nar regis tros. No puede uti li zar pará me tros (con la sin ta xis:<pará me tro>) en la parte SELECT o FROM de una sen ten cia SQL. VeaInfor ma ción adi cio nal más abajo para más infor ma ción sobre cómo per mi tirque el usua rio selec cione las tablas y/o cam pos en tiempo de eje cu ción uti li-zando la fun ción For mat.

2. Pro por cione al menos un nom bre de columna a con ti nua ción de la pala brareser vada SELECT, y al menos un nom bre de tabla des pués de FROM.

3. Si uti liza una sen ten cia GROUP BY, pro por cione al menos una fun ción deagre ga ción en la cláu sula SELECT, y agrupe por todas las colum nas noagre ga das que espe ci ficó en la cláu sula SELECT. Por ejem plo:

SELECT Fruit, Ve ge ta ble, Spi ce, Count(Des sert)FROM Spei se kar teWHERE Ca lo ries > 1000GROUP BY Fruit, Ve ge ta ble, Spi ce

4. Escriba todo en mayús cu las en el SQL de Ora cle. Por ejem plo:

SELECT SOMEFIELDFROM 'SOMEALIAS.SOMETABLE'WHERE SOMEFIELD < 0

5. Si hace refe ren cia a un nom bre de campo que con tiene espa cios, debe nosola mente ence rrarlo entre comi llas (“ ”), sino tam bién ante po ner el nom-bre de tabla o alias. Por ejem plo, si el nom bre de campo es:

One Flew Over The Co ders Desk

debe hacer refe ren cia a él así:

SELECT TABLENAME."One Flew Over The Co ders Desk". . .

6. Añada el “AND” olvi dado:

SQL.Add('SELECT Ma te rial.Week Be gin, Ma te rial.TalkIndi ca tor');SQL.Add('FROM Ma te rial, Week WHERE');SQL.Add('Ma te rial.Week Be gin >= :Firs tDa te');

Mensajes de error 349

Page 384: Dsp

SQL.Add('AND Ma te rial.Week Be gin <= :Last Da te');SQL.Add('AND Ma te rial.Week Be gin = Week.Week Be gin');SQL.Add('AND Week.WeekT ype = "Reg" '); //aquí

7. Ante ponga el nom bre de la tabla al nom bre de campo “pro ble má tico”, yencie rre el nom bre de campo entre comi llas, así:

with qryActi veS tu dents do be gin SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM Stu dents'); SQL.Add('WHERE Stu dents."Acti ve" = True'); //todo OK SQL.Add('ORDER BY Da teOf Last Talk'); Open; First; end;

Infor ma ción adi cio nalLas sen ten cias SQL que devuel ven un con junto resul tado requie ren una cláu-sula SELECT (que espe ci fica las colum nas que se retor na rán en el con juntoresul tado; puede nom brar las indi vi dual mente o uti li zar * para indi car todaslas colum nas). Adi cio nal mente, tales sen ten cias SQL nece si tan una cláu sulaFROM (que espe ci fica la tabla o tablas de las que se obten drán las colum nas).

La sen ten cia ORDER BY de SQL se uti liza para orde nar el con junto resul tado.Por ejem plo, puede orde nar por el ape llido ascen den te mente (de la ‘A’ a la ‘Z’).

Por ejemplo, si tuviera una tabla con varios valo res en sus colum nas City yState, orde nar las por el campo City y luego con ca te nar las (City + ', ' + State)podría pro du cir algo así:Anchor age, AlaskaAngels Camp, Cal i for niaArcata, Cal i for niaBethany, OklahomaBrookfield, Wis con sinBrook lyn, New YorkCoeur d’Alene, IdahoEureka, Cal i for niaFort Bragg, Cal i for niaHel ena, MontanaJenny Lind, Cal i for niaLoleta, Cal i for niaMokelumne Hill, Cal i for niaSan Andreas, Cal i for niaZenia, Cal i for nia

La sen ten cia GROUP BY se uti liza para eje cu tar ope ra cio nes de agre ga ción(como SUM, COUNT, AVG, MIN, MAX) sobre gru pos de regis tros con un valorde columna en común. Por ejem plo, si tuvié ra mos una tabla con nom bres dejuga do res de la NBA, el equipo en el que jue gan y su sala rio, podría mos

350 Los Tomos de Delphi: Delphi sin problemas

Page 385: Dsp

agru par los por equipo y eje cu tar una ope ra ción SUM sobre la columna Salary,lo que pro du ci ría una tabla en la que habría un regis tro para cada equipo queinclui ría el sala rio total de los juga do res del equipo.6. Esto puede ocu rrir si ha eli mi nado una sec ción de una sen ten cia SQL que

no fun ciona bien durante la depu ra ción y luego olvidó aña dir el “AND” denuevo.

Invalid variable referencePo si ble cau sa de error

Puede estar pasando una pro pie dad a un pro ce di miento o fun ción que esperareci bir un pará me tro varia ble. Por ejem plo, lo siguiente gene rará el men saje deerror bajo dis cu sión (Eye Co lor es una pro pie dad de tipo String de la claseWoman):

Insert(Sour ce, Wo man.Eye Co lor, 3);

So lu ción rá pi daCree una varia ble local para alma ce nar el valor de la pro pie dad, y luego páselacomo pará me tro. Por ejem plo:

var s: String;be gin s := Wo man.Eye Co lor; Insert(Sour ce, s, 3);

Infor ma ción adi cio nalLas pro pie da des no pue den ser pasa das como pará me tros varia bles, debido aque sola mente se per mite su modi fi ca ción a tra vés del método de acceso deescri tura (y si no tienen un método de escritura, se trata de pro pie da des desólo lec tura). Las pro pie da des son sim ple mente una inter faz de acceso a unaloca li za ción de memo ria, nor mal mente un campo de la sec ción Private de laclase. Por lo tanto, al modi fi car una pro pie dad, se esta ría modi fi cando el campopri vado, y sola mente la pro pia clase puede hacer eso; por esta razón, las pro-pie da des (un “envol to rio” alre de dor de los campos) no pue den ser modi fi ca das.

Invalid variant type conversionPo si ble cau sa de error

1. Puede haber inten tado con ver tir de un tipo de datos a otro en una ope ra-ción que no parece lógica (al menos para el com pi la dor). Por ejem plo, losdos siguien tes frag men tos de código gene ra rán este men saje de error:

Mensajes de error 351

Page 386: Dsp

pro ce du re Di vi de Va riants;var v1,v2: va riant;be gin v1 := 100; v2 := 'Ciao, ba by'; v1 := v1 div v2; {error ge ne ra do aquí}end;...{Ta ble1A rea es de tipo TFloat Field}String Grid1.Cells[1,1] := Ta ble1A rea.AsVa riant + 'goo';

2. Puede haber inten tado asig nar el nom bre Null a un índice uti li zando elmétodo AddIndex. Por ejem plo, lo siguiente gene rará este men saje deerror:

be gin with Ta ble1 do be gin Clo se; Exclu si ve := True; AddIndex(null, 'Mo demA dap ter', []);

So lu ción rá pi da1. Uti lice con ver sio nes entre variantes sola mente de una manera que sea

lógica y pueda ser enten dida por el com pi la dor. He aquí un ejem plo de unacon ver sión de tipos variantes que es per mi tida:

pro ce du re Di vi de Va riants;var v1,v2: va riant;be gin v1 := 100; v2 := '3'; v1 := v1 div v2; //pro du ce como re sul ta do 33end

2. Los índi ces basa dos en una única columna de la tabla implí cita deben tenerel mismo nom bre que la columna. Los índi ces basa dos en múl ti ples colum-nas (índi ces com pues tos) pue den tener nom bres des crip ti vos de los cam posque con tie nen. No asigne a un índice el nom bre Null.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “variants: assig ning values” en la ayuda deDel phi.

352 Los Tomos de Delphi: Delphi sin problemas

Page 387: Dsp

Key ViolationPo si ble cau sa de error

1. Puede estar inten tando aña dir un regis tro con un valor de clave pri ma riaque ya existe en la tabla.

2. Puede haber inten tado añadir regis tros de una tabla con una clave pri ma-ria a una tabla sin clave pri ma ria uti li zando el com po nente TBat chMoveen el modo batA ppendUpdate.

So lu ción rá pi da1. Evite que se intro duz can valo res pri ma rios dupli ca dos. Puede pro te gerse de

esta posi bi li dad ence rrando el código en un blo que Try. . . Except si quierepre sen tar al usua rio un men saje per so na li zado, y qui zás mover el cur sor denuevo al con trol en el que se mues tra la clave pri ma ria. Por ejem plo, en elcódigo que res ponde a la vio la ción de clave, podría hacer algo así:

const crlf = #13#10;. . .try Ta ble1.Post;ex cept on E: Excep tion do if E.Mes sa ge = 'Key vio la tion' then be gin Mes sa geDlg('El va lor ya exis te en la ta bla.' + crlf + ‘Por fa vor, in tén te lo de nue vo.', mtError, [mbOK], 0); Edit1.Co lor := clRed; Edit1.Set Fo cus; end;end;. . .

2. Intén telo de nuevo des pués de crear la misma clave pri ma ria en la tablaDes ti na tion, o uti lice el modo batA ppend de TBat chMove para mover losregis tros.

Infor ma ción adi cio nalObte ner una vio la ción de clave es mejor que la alter na tiva — tener múl ti plesregis tros con un mismo valor en una columna pri ma ria. Esta es defi ni ti va-mente una de las áreas en donde los men sa jes de error son sus ami gos.

Mensajes de error 353

Page 388: Dsp

Label <> is not declared in current procedurePo si ble cau sa de error

Puede estar inten tando uti li zar la sen ten cia GoTo para sal tar a una eti quetaque no está decla rada en el mismo pro ce di miento que sen ten cia GoTo.

So lu ción rá pi daSi uti liza eti que tas y sen ten cias GoTo, éstas deben apa re cer en el mismopro ce di miento.

Infor ma ción adi cio nalBor land Object Pas cal no per mite que las sen ten cias GoTo atra vie sen las fron-te ras de pro ce di miento, aun que Pas cal están dar si. Las eti que tas y sus corres-pon dien tes sen ten cias GoTo son nor mal mente uti li za das para el manejo deerro res, y Del phi pro por ciona un meca nismo mucho mejor para esto: la ges tiónde excep cio nes. Para más infor ma ción, con sulte “excep tions” en la ayuda deDel phi.

En cual quier caso, los ver da de ros pro gra ma do res nunca uti li zan sen ten ciasGoTo ;-)

Label already defined: <>Po si ble cau sa de error

Puede haber defi nido una eti queta más de una vez. Por ejem plo, lo siguientegene rará este men saje de error:

pro ce du re Eti kett;la bel 1;be gin1: if (Jor da che or Nike) then goto 1;1:end;

So lu ción rá pi daDefina las eti que tas una y sola mente una vez.

Infor ma ción adi cio nalLas eti que tas y sus corres pon dien tes sen ten cias GoTo son nor mal mente uti li-za das para el manejo de erro res, y Del phi pro por ciona un meca nismo mucho

354 Los Tomos de Delphi: Delphi sin problemas

Page 389: Dsp

mejor para esto: la ges tión de excep cio nes. Para más infor ma ción, con sulte“excep tions” en la ayuda de Del phi.

En cual quier caso, los ver da de ros pro gra ma do res nunca uti li zan sen ten ciasGoTo ;-)

Label declaration not allowed in interface partPo si ble cau sa de error

Puede haber inten tado decla rar una eti queta en la parte Inter face de una uni-dad. Por ejem plo, lo siguiente gene rará este men saje de error:

var Form1: Tform1;la bel GypsiesT rampsAndThie ves;im ple men ta tion

So lu ción rá pi daNo declare eti que tas en la parte Inter face de una uni dad (antes de la pala brareser vada Imple men ta tion).

Infor ma ción adi cio nalLas eti que tas y sus corres pon dien tes sen ten cias GoTo son nor mal mente uti li-za das para el manejo de erro res, y Del phi pro por ciona un meca nismo muchomejor para esto: la ges tión de excep cio nes. Para más infor ma ción, con sulte“excep tions” en la ayuda de Del phi.

En cual quier caso, los ver da de ros pro gra ma do res nunca uti li zan sen ten ciasGoTo ;-)

Label declared and referenced, but not setPo si ble cau sa de error

Puede haber decla rado y hecho refe ren cia a una eti queta (en una sen ten ciaGoTo), pero la eti queta no está defi nida. Por ejem plo, lo siguiente gene raráeste men saje de error:

pro ce du re Ala mo;la bel Spurs That Jin gle Jan gle Jin gle; be gin goto Spurs That Jin gle Jan gle Jin gle; end;

Mensajes de error 355

Page 390: Dsp

So lu ción rá pi daDebe defi nir el lugar de la eti queta:

pro ce du re Ala mo;la bel Spurs That Jin gle Jan gle Jin gle; be gin if { con di cion } then goto Spurs That Jin gle Jan gle Jin gle; . . . Spurs That Jin gle Jan gle Jin gle: . . . end;

Infor ma ción adi cio nalLas eti que tas y sus corres pon dien tes sen ten cias GoTo son nor mal mente uti li-za das para el manejo de erro res, y Del phi pro por ciona un meca nismo muchomejor para esto: la ges tión de excep cio nes. Para más infor ma ción, con sulte“excep tions” en la ayuda de Del phi.

En cual quier caso, los ver da de ros pro gra ma do res nunca uti li zan sen ten ciasGoTo ;-)

Label expectedPo si ble cau sa de error

Puede haber hecho refe ren cia a una eti queta en una sen ten cia GoTo e inclusohaberla defi nido, pero no la ha decla rado. Por ejem plo, lo siguiente gene raráeste men saje de error:

func tion Junc tion: va riant;be gin if TankIsEmpty then goto Shell; { ... }Shell: { ... }end;

So lu ción rá pi daDeclare y defina la eti queta antes de hacer refe ren cia a ella:

func tion Junc tion: va riant;la bel Shell;be gin if TankIsEmpty then goto Shell; { ... }

356 Los Tomos de Delphi: Delphi sin problemas

Page 391: Dsp

Shell: { ... }end;

Infor ma ción adi cio nalLas eti que tas y sus corres pon dien tes sen ten cias GoTo son nor mal mente uti li-za das para el manejo de erro res, y Del phi pro por ciona un meca nismo muchomejor para esto: la ges tión de excep cio nes. Para más infor ma ción, con sulte“excep tions” en la ayuda de Del phi.

En cual quier caso, los ver da de ros pro gra ma do res nunca uti li zan sen ten ciasGoTo ;-)

Left side cannot be assigned toPo si ble cau sa de error

1. Puede estar inten tando asig nar una valor a una cons tante. Por ejem plo, elsiguiente código pro duce el men saje de error bajo dis cu sión:

const crlf = #13#10;. . .crlf := #8#8#8#8#8#8#8#8;

2. Puede estar inten tando asig nar un valor a un pará me tro cons tante (unpará me tro for mal que está ante ce dido por la pala bra reser vada Const). Porejem plo, lo siguiente pro duce el men saje de error bajo dis cu sión:

pro ce du re Po pe ye(const IYamW hatI Yam: string);var s: string;be gin s := IYamW hatI Yam; {nin gún pro ble ma aquí} IYamW hatI Yam := 'et 2, Bru tus?'; {no per mi ti do}end;

ya que está inten tando asig nar un valor al pará me tro cons tanteIYamW hatI Yam.

3. Puede estar inten tando asig nar un valor al valor de retorno de una fun ciónfuera de la fun ción. Por ejem plo, lo siguiente pro duce el men saje de errorbajo dis cu sión:

func tion Gi ve MeAnH: char;be gin Re sult := 'H' { Asig nar a 'Re sult' es lo mis mo que asig nar a Gi ve MeAnH }end;be gin Gi ve MeAnH := 'H'; { esto no }end.

Mensajes de error 357

Page 392: Dsp

4. Puede estar inten tando incre men tar o dis mi nuir un valor no ordi nal uti li-zando la fun ción Inc o Dec. Por ejem plo, lo siguiente gene rará este men sajede error:

inc('or po ra ted');dec('10.0');

5. Puede haber inten tado asig nar un valor a un pun tero uti li zando una sin ta-xis inco rrecta (tipo “pun tero a pun tero”). Por ejem plo, lo siguiente gene raráeste men saje de error:

pro ce du re Dysfunc tio nal Poyn ter;type iptr = ^Inte ger;var i:in te ger; q:iptr;be gin ^q := @i;end;

6. Puede haber inten tado eje cu tar la fun ción Inc sobre una pro pie dad de unaclase. Por ejem plo, lo siguiente gene rará este men saje de error:

inc(ZipObj.Cu rrent Dis ket te Num ber);

7. Puede haber olvi dado aña dir una con ver sión de tipos a un campo. Porejem plo, lo siguiente gene rará este men saje de error:

with nvcmod.cds do be gin FieldByNa me('ID') := edtAddFNa me.Text;

So lu ción rá pi da1. No haga asig na cio nes a cons tan tes. Borre la sen ten cia de asig na ción o cam-

bie la cons tante por una varia ble ini cia li zada.2. No haga asig na cio nes a pará me tros cons tan tes. Borre la sen ten cia de asig-

na ción o cam bie el pará me tro cons tante por un pará me tro pasado por valoro por refe ren cia.

3. No haga asig na cio nes al resul tado de una fun ción fuera de la pro piafun ción.

4. Incre mente o decre mente sola mente varia bles ordi na les:

inc(i); { don de i es un va ria ble Inte ger }dec(n);

5. La manera correcta de tra ba jar con el pun tero es:

q := @i; // q apun ta a la va ria ble iq^:= 5; // asig na 5 a i a tra vés de q

6. Puede lograr lo mismo de esta manera:

ZipObj.Cu rrent Dis ket te Num ber := ZipObj.Cu rrent Dis ket te Num ber + 1;

358 Los Tomos de Delphi: Delphi sin problemas

Page 393: Dsp

7. Añada la fun ción de con ver sión AsX al nom bre de campo:

with nvcmod.cds do be gin FieldByNa me('ID').AsString := edtAddFNa me.Text;

Infor ma ción adi cio nal4. Inc y Dec tie nen un segundo pará me tro opcio nal, que espe ci fica en cuánto

incre men tar o decre men tar la varia ble que está siendo mani pu lada. Paramás infor ma ción, con sulte “assign ment sta te ments” en la ayuda de Del phi.

6. Para más infor ma ción, con sulte “Inva lid varia ble refe rence”.

Line number must be between 1 and <>Po si ble cau sa de error

En el edi tor de Del phi está inten tando ir a una línea que no existe en la uni-dad actual.

So lu ción rá pi daIntro duzca un número que no sea mayor que la can ti dad total de líneas que launi dad actual con tiene.

Infor ma ción adi cio nalPuede ir direc ta mente a un número de línea en la uni dad activa selec cio nandoSearch | Go To Line Num ber.. y luego intro du ciendo un número en el cua-dro de diá logo Go To Line Num ber y pul sando OK.

Line too long [more than 255 characters]Con sulte “String [lite ral]s may have at most 255 ele ments”.

List capacity out of bounds (<>)Po si ble cau sa de error

Puede haber asig nado a la pro pie dad Capa city de una lista un valor mayor queMax List Size. En Del phi 1, Max List Size es 16.380. En Del phi de 32 bits, es134.217.727. Por ejem plo, lo siguiente gene rará este men saje de error (Liszt esuna varia ble TList):

Liszt.Ca pa city := 2222222222;

Mensajes de error 359

Page 394: Dsp

So lu ción rá pi daAsigne a la pro pie dad Capa city un valor menor o igual que 16.380 en Del phi 1ó 134.217.727 en Del phi de 32 bits.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “Capa city” en la ayuda de Del phi.

List index out of bounds (<>)Po si ble cau sa de error

1. (A) Puede haber inten tado hacer refe ren cia a un ele mento de una lista queno existe. Por ejem plo, lo siguiente pro du cirá este men saje de error, ya queel ele mento 1 no ha sido asig nado (ya que los índi ces de una lista comien-zan en cero):

pro ce du revar sl: TString List; s: String;be gin sl := TString List.Crea te; sl.Add('Sa muel Lang hor ne Cle mens'); s := sl.Strings[1]; {no se pue de ac ce der a algo si tua do más allá de Strings[0], ya que no exis te}end;

1. (B) Una de las mucha mane ras de pro vo car este men saje de error es lla maral método Move de TString, pro por cio nando un pará me tro invá lido parauno o los dos argu men tos:

var No neAt ta ched: TStrings;be gin No neAt ta ched := TString List.Crea te; No neAt ta ched.Move(0, 1);

2. Puede tam bién obte ner este error al eli mi nar los ele men tos de una listaden tro de un bucle For. . . To que uti liza la can ti dad de ele men tos de la listacomo valor final, ya que ésta irá dis mi nu yendo diná mi ca mente (pero elbucle For inten tará con ti nuar hasta el valor Count-1). Por ejem plo, losiguiente oca sio nará este error:

var i: in te ger;be gin with List Box1 do be gin Items := List Box2.Items;

360 Los Tomos de Delphi: Delphi sin problemas

Page 395: Dsp

for i := 0 to Items.Count-1 do if Items[i]='' then Items.De le te(i); end;end;

3. Puede haber borrado uno o más cam pos de un índice de una tabla de basede datos y no ha actua li zado toda vía las lla ma das a Find Key que hacenrefe ren cia a su anti guo for mato (donde el índice estaba com puesto de máscam pos). Por ejem plo, si modi fica los cam pos de un índice lla mado Dude deFirs tName;Nick name;Last Name a sim ple mente Firs tName;Last Name, yluego llama a Find Key de la siguiente manera mien tras el índice estáactivo, obten drá este men saje de error:

Find Key('Cla ren ce','Ga te mouth','Brown');

4. Puede estar conec tán dose a una base de datos uti li zando una cone xiónODBC, y una o más .DLLs de ODBC no se encuen tran.

5. Puede estar inten tando acce der a un ele mento de una lista antes de que elele mento haya sido inser tado.

6. Puede estar lla mando a ExecSQL en lugar de Open en una sen ten ciaSELECT de SQL y está inten tando acce der a un ele mento en el array decam pos del con junto resultado. Por ejem plo, lo siguiente gene rará estemen saje de error:

func tion TAndCrum pets.MaxSrlNum: Byte;var aQuery: TQuery;be gin aQuery := TQuery.Crea te(nil); try with aQuery do be gin Da ta ba se Na me := So meDB.Da ta ba se Na me; SQL.Add('SELECT MAX(EXCEPTION_LOG_SRLNUM)’ SQL.Add('FROM EXCEPTION_LOG'); SQL.Add('WHERE BAKED_ID = :ba ked_id'); Pa ramB yNa me('ba ked_id').AsFloat := Crum pet Num; ExecSQL; Re sult := Fields[0].Va lue; end; fi nally aQuery.Free; end;end;

So lu ción rá pi da1. (A) Ase gú rese de hacer una asig na ción al ele mento de la lista que quiere

acce der antes de hacer refe ren cia a él. Uti li zando el ejem plo de arriba,podría hacer refe ren cia al ele mento 0:

. . .

Mensajes de error 361

Page 396: Dsp

s := sl.Strings[0];. . .

o aña dir el ele mento 1 a la lista antes de inten tar acce der a él:

sl.Add('Sa muel Lang hor ne Cle mens'); {ele men to 0}sl.Add('John Grif fith Lon don'); {ele men to 1}s := sl.Strings[1]; {s = 'John Grif fith Lon don'}

1. (B) Asigne valo res a los ele mentos que desea intercam biar antes de lla maral método Move:

var No neAt ta ched: TStrings;be gin No neAt ta ched := TString List.Crea te; try No neAt ta ched.Add('mo ve me'); No neAt ta ched.Add('me too'); No neAt ta ched.Move(0, 1); . . .

2. Intercambie los valo res ini cial y final de la varia ble de con trol del bucle Fory uti lice una cons truc ción For. . . Downto:

var i: in te ger;be gin with List Box1 do be gin Items:=List Box2.Items; for i := Items.Count-1 down to 0 do if Items[i]='' then Items.De le te(i); end;end;

3. Com pruebe que el índice actual (en el momento de la lla mada a Find Key)no con tiene menos cam pos de los que está pasando a Find Key. En el ejem-plo de arriba, ten dría que alte rar la sen ten cia Find Key para que fuera:

Find Key('Cla ren ce','Brown');

4. Ase gú rese que todos los archi vos de ODBC nece sa rios estén pre sen tes.5. Espere hasta que el ele mento haya sido almacenado antes de acce der a su

valor.6. Sus ti tuya la lla mada a ExecSQL por una lla mada a Open.

Infor ma ción adi cio nalEl número entre parén te sis (en el men saje de error) indica el índice que noexiste y al que se intentó acce der.6. Uti lice Open con las sen ten cias SQL que devuel ven un con junto de resul-

tados (como las sen ten cias SELECT). Uti lice ExecSQL con las sen ten ciasINSERT, DELETE y UPDATE.

362 Los Tomos de Delphi: Delphi sin problemas

Page 397: Dsp

Local class, interface or object types not allowedPo si ble cau sa de error

Puede haber inten tado decla rar una clase local. Por ejem plo, lo siguiente gene-rará este men saje de error:

pro ce du re TForm1.But ton8 Click(Sen der: TObject);type ELOCALError = class(Excep tion);. . .

So lu ción rá pi daDeclare todos los tipos de cla ses como glo ba les, y no loca les (den tro de una fun-ción o pro ce di miento).

Infor ma ción adi cio nalPara más infor ma ción, con sulte “class types” en la ayuda de Del phi.

Local class or object types not allowedCon sulte más arriba “Local class, inter face or object types not allo wed”.

Local procedure/function <> assigned to procedure variablePo si ble cau sa de error

1. Puede haber inten tado asig nar un pro ce di miento o fun ción local a unavaria ble de tipo pro ce di miento.

2. Puede haber inten tado pasar como pará me tro un pro ce di miento o fun ciónlocal.

So lu ción rá pi da1,2.No asigne pro ce di mientos o fun cio nes loca les a varia bles de tipo pro ce di-

miento ni los pase como parámetros.

Infor ma ción adi cio nalLa razón para que esto no sea per mi tido es que la fun ción o pro ce di mientolocal podría ser lla mado cuando el pro ce di miento o fun ción al que per te nece noesté activo, cau sando poten cial mente vio la cio nes de acceso.

Mensajes de error 363

Page 398: Dsp

Lock file [has grown] too largePo si ble cau sa de error

Puede estar uti li zando tablas de Para dox y pre sen tarse una de las siguien tessitua cio nes:1. Múl ti ples usua rios están acce diendo al mismo direc to rio pri vado.2. El eje cu ta ble y las tablas están en el mismo direc to rio.3. El valor del pará me tro Local Share del BDE es True.4. Está eje cu tando múl ti ples ope ra cio nes de con sulta simul tá neas con tra un

mismo TTa ble.5. Puede estar uti li zando actua li za cio nes en caché y lla mando al método

ApplyUpda tes de un objeto TDa ta set, pero se ha olvi dado de lla mar des-pués a Com mitU pda tes. Si este es el caso, puede que no se haya dadocuenta de que está uti li zando tablas Para dox — real mente puede estar uti-li zando Ora cle o MS SQL Ser ver o alguna otra gran base de datos SQL (aluti li zar actua li za cio nes en caché, las tablas Para dox son crea das de formatrans pa rente por el BDE).

6. El direc to rio pri vado ha sido asig nado a un direc to rio raíz.

So lu ción rá pi da1. Con fi gure el Direc to rio Pri vado para que apunte a un direc to rio sobre el

disco duro de cada usua rio (como C:\Temp\{ Nom bre_eje cu ta ble }). Podríahacerlo de esta manera:

var Exten sion, Exec Na me, Priv Dir : String; Exten sion Pos: Inte ger;. . .Exec Na me := Extract Fi le Na me(Appli ca tion.Exe Na me);Exten sion := Extract Fi leExt(Appli ca tion.Exe Na me);Exten sion Pos := Pos(Exten sion, Exec Na me);De le te(Exec Na me,Exten sion Pos,4);Priv Dir := 'C:\Temp\' + Exec Na me;if not Di rec tory Exists(Priv Dir) then Crea te Dir(Priv Dir);if Di rec tory Exists(Priv Dir) then Ses sion.Pri va te Dir := Priv Direlse rai se Excep tion.Crea te('El di rec to rio pri va do no fue crea do!');end;

2,4.Colo que el eje cu ta ble y las tablas en direc to rios sepa ra dos.3. Si no tiene múl ti ples eje cu ta bles que acce dan simul tá nea mente a las mis-

mas tablas, asigne False a Local Share (en la página System de la uti li dadBDE Con fi gu ra tion/Admi nis tra tion). Asíg nele True si las máqui nas de una

364 Los Tomos de Delphi: Delphi sin problemas

Page 399: Dsp

red punto-a-punto están acce diendo a las tablas a tra vés de su pro pia copiadel eje cu ta ble.

5. Llame siem pre a Com mitU pda tes des pués de ApplyUpda tes.6. Asigne el Direc to rio Pri vado a un sub di rec to rio, nunca al direc to rio raíz de

una unidad.

Infor ma ción adi cio nal2,4.Si deja en blanco la con fi gu ra ción de Pri va te Dir, el direc to rio pri vado será

por defecto el direc to rio actual (muy pro ba ble mente el direc to rio en el quela apli ca ción reside). TSes sion con tiene una pro pie dad Pri va te Dir a la quese puede asig nar un valor. Una sesión se crea auto má ti ca mente “de formaoculta” para cada apli ca ción de BDE. Para más infor ma ción, con sulte“TSes sion.Pri va te Dir”.

5. ApplyUpda tes envía la actua li za ción a la base de datos. Com mitU pda teslim pia la caché local.

Es pre fe ri ble uti li zar un com po nente TDa ta base y lla mar a su métodoApplyUpda tes (en lugar de lla mar al método ApplyUpda tes de un TDa ta set).El método ApplyUpda tes de TDa ta base acepta como pará me tro un array deobje tos TDa ta set (el método ApplyUpda tes de TDa ta sets no tiene parámetros).El método ApplyUpda tes de TDa ta base llama a Com mitU pda tes para cada unode los con jun tos de datos que se le pro por ciona.

Si el eje cu ta ble y las tablas com par ten el mismo direc to rio, el archivo de blo-queos (.LCK) aumen tará de tamaño cada vez que una con sulta sea eje cu tada.

Tam bién debe asig nar True a Local Share en caso de que las tablas tam biénestán siendo acce di das por moto res de base de datos dis tin tos del BDE, comoJET u ODBC.

Si Local Share tiene asig nado False, nin gún archivo de blo queo (.LCK) serácreado.

Lock time outPo si ble cau sa de error

Puede ser que una apli ca ción que está inten tando acce der a una tabla hayacolo cado un blo queo de escri tura sobre el archivo de blo queos (.LCK) mien trashace una bús queda para ase gu rarse de que no hay nin gún blo queo exclu sivosobre la tabla (que le impe di ría el acceso a la tabla). Al mismo tiempo, otraapli ca ción que ya tiene un blo queo sobre la tabla está inten tando acce der alarchivo de blo queos para libe rarlo, pero no puede debido al blo queo de escri-tura que la otra apli ca ción ha apli cado. La apli ca ción que ha colo cado el blo-queo de escri tura (y que quiere acce der a la tabla) loca liza el blo queo que laotra apli ca ción asignó, y con ti núa comprobando el archivo de blo queos. Esto no

Mensajes de error 365

Page 400: Dsp

per mite que la otra apli ca ción tenga una opor tu ni dad para acce der al archivode blo queos y libe rar el blo queo que ha colo cado. Des pués de un inter valo detiempo espe ci fi cado (el período de timeout) durante el que este inter blo queo seman tiene, el men saje de error bajo dis cu sión se mos trará.

So lu ción rá pi daCie rre las apli ca cio nes que están enfren ta das y borre todos los archi vos .LCK.

Infor ma ción adi cio nalSi no ha codi fi cado espe cí fi ca mente lógica de blo queos en la apli ca ción (si per-mite que el BDE maneje estas situaciones), este men saje de error puede habersido oca sio nado por un pro blema de red (o sea, esto no es nece sa ria mente unpro blema de Del phi/BDE).

Lock ViolationPo si ble cau sa de error

1. Puede estar eje cu tando un pro grama de base de datos creado en Del phi 1sobre una máquina eje cu tando Win dows 95 que tam bién con tiene lastablas de base de datos.

2. Puede estar uti li zando el BDE de 16 bits en una red mixta (en la que secom bi nan máqui nas con Win dows 3.x y Win dows 95/98/NT).

So lu ción rá pi da1. En este caso hay dos mane ras de resol ver el pro blema:

Recom pi lar la apli ca ción en una ver sión de 32 bits de Del phi (ver sión 2 osuperior).-O-Mover las tablas a un máquina que esté eje cu tando Win dows 3.x.

2. Siga estos pasos sobre cada máquina de Win dows 95:a. Seleccione Inicio | Configuración | Panel de Con trol.

b. Haga doble clic sobre el icono Sis tema.c. Seleccione la página Rendimiento.d. Pulse el botón Sistema de Archivos.

e. Seleccione la página Solución de problemas.

f. Seleccione Deshabilitar la nueva semántica de bloqueos y usocompartido de archivos.

g. Reinicie el sistema.

366 Los Tomos de Delphi: Delphi sin problemas

Page 401: Dsp

Infor ma ción adi cio nal1. Si quiere mantener la con fi gu ra ción tal como está, puede ser útil inten tar

uno o ambas de estas secuen cias:

Deshabilitar la nueva semántica de bloqueos1. En la máquina Win dows 95, selec cione Ini cio | Con fi gu ra ción | Panel

de Con trol.

2. Haga doble clic sobre el icono Sis tema.3. Selec cione la página Ren di miento.4. Pulse el botón Sis tema de Archi vos.5. Selec cione la página Solu ción de Pro ble mas.6. Selec cione Des ha bi li tar la nueva semán tica de blo queos y uso com-

par tido de archi vos.

Deshabilitar la caché de escritura en segundo plano1. Siga los pasos 1-6 de arriba.2. Selec cione Des ha bi li tar la caché de escri tura en segundo plano para

todas las uni da des.

Lookup information for field <> is incompletePo si ble cau sa de error

Puede estar inten tando hacer refe ren cia a un campo de bús queda (loo kup)cuya tabla ha sido eliminada del for mu la rio o pro yecto. Por ejem plo, puedehaber creado un campo cal cu lado basado en un campo de una tabla rela cio naday pos te rior mente haber borrado la tabla (eli mi nando por lo tanto la refe ren ciaa ella). Si pos te rior mente hace refe ren cia al campo, obten drá este men saje deerror.

So lu ción rá pi daNo borre com po nen tes o ele men tos de los cua les depen dan otros miem bros desu for mu la rio o pro yecto.

Infor ma ción adi cio nalLos cam pos cal cu la dos y de bús queda puede ser úti les para mos trar infor ma-ción que puede ser dedu cida de otras colum nas. Esto aho rra espa cio en lastablas y es una manera fle xi ble de mos trar los datos per ti nen tes. Un ejem plocomún es crear un campo cal cu lado que mul ti plica la can ti dad ven dida por elpre cio de cada ítem.

Mensajes de error 367

Page 402: Dsp

Low bound exceeds High boundPo si ble cau sa de error

Puede haber decla rado un sub rango cuyo límite infe rior es mayor que el límitesuperior. Por ejem plo, las dos siguien tes decla ra cio nes pro du cen este men sajede error:

type Ye llow Sub ma ran ge = 12..1; Ho me Ho meOn The Ran ge = 'w'..'c';

-o-

Puede haber decla rado un rango de valo res en una sen ten cia Case donde el ele-mento mayor apa rece pri mero. Por ejem plo, lo siguiente gene rará este men sajede error:

case Vehi cles of 0: Show Mes sa ge('Hoo fin'' it'); 2..1: Show Mes sa ge('Mo to rin''); {debe ser 1..2} . . .

So lu ción rá pi daDeclare los tipos sub rango y los ran gos de eti que tas Case lineal mente (delvalor más pequeño al más grande).

Infor ma ción adi cio nalPara más infor ma ción, con sulte “sub range types” y “case sta te ments” en laayuda de Del phi.

Master has detail records. Cannot delete or modifyPo si ble cau sa de error

El regis tro maes tro que está inten tando borrar tiene regis tros de deta lle quehacen refe ren cia a él.

So lu ción rá pi daSi quiere borrar un regis tro maes tro que tenga aso cia dos regis tros hijos en unatabla de deta lle, pri mero deberá borrar los regis tros hijos de la tabla Deta lle.

Puede hacer esto mediante pro gra ma ción, uti li zando una sen ten cia DELETEde SQL en el evento Befo re De lete de la tabla maestra. Por ejem plo, si quiereborrar todas las refe ren cias a un atleta espe cí fico de una base de datos, podríaborrar pri mero los regis tros de deta lle así:

368 Los Tomos de Delphi: Delphi sin problemas

Page 403: Dsp

pro ce du re TForm1.Ta ble1 Be fo re De le te(Da ta Set: TDa ta Set);be gin with Query1 do be gin SQL.Clear; SQL.Add('DELETE FROM STATS'); SQL.Add('WHERE STATS."NO" = 32'); Pre pa re; try ExecSQL; fi nally Unpre pa re; end; end;end;

Colo car este tipo de código en el evento Befo re De lete per mite que el regis tromaes tro (que no ten drá más hijos en la tabla de deta lles una vez que la sen ten-cia SQL sea eje cu tada) sea borrado.

Infor ma ción adi cio nalLos regis tros de deta lle son aque llos rela cio na dos con el maes tro a tra vés de uncampo de clave forá nea (que es nor mal mente la clave pri ma ria de la tablamaestra).

Al uti li zar tablas Para dox, puede asig nar la regla de actua li za ción a Cas cade(en cas cada) o Prohi bit (prohi bir) cuando con fi gure la inte gri dad refe ren cial.(La inte gri dad refe ren cial es la cau sante del men saje de error — evita que seborren regis tros que deja rían regis tros huér fa nos en la tabla de deta lle). Lacon fi gu ra ción Cas cade cam biará el valor rela cio nado en la tabla de deta llecuando cam bie el valor de la clave pri ma ria en la tabla maes tra. La con fi gu ra-ción Prohi bit impide que se modi fi quen o borren los valo res pri ma rios en latabla maes tra si exis ten hijos en la tabla de deta lle.

Master has detail records. Cannot empty itPo si ble cau sa de error

Puede estar inten tando borrar todo el con te nido de una tabla maes tra para laque se cum plen las siguien tes dos con di cio nes: Update tiene asignado Pro hibit. La tabla contiene registros que tienen registros hijos en una tabla de

detalle.

Mensajes de error 369

Page 404: Dsp

So lu ción rá pi daBorre pri mero los regis tros hijos en la tabla de deta lle, y luego borre todo elcon te nido de la tabla maestra.

Infor ma ción adi cio nalCon sulte “Mas ter has detail records. Can not delete or modify”.

Master record missingPo si ble cau sa de error

Puede haber intro du cido un valor en un campo de clave forá nea de una tablade deta lle para el que no existe un valor en la clave pri ma ria de la tablamaes tra.

So lu ción rá pi daSi está intro du ciendo regis tros en la tabla de deta lle (y no en la tabla maes tra),debe ase gu rarse de selec cio nar un valor que exista en la clave pri ma ria de latabla maes tra uti li zando un control TDBLoo kup Com bo Box conectado al campode clave pri ma ria de la tabla maes tra.

Si está intro du ciendo simul tá nea mente regis tros tanto en la tabla maes tracomo en la de deta lle, ase gú rese de que está gra bando pri mero el regis tromaes tro uti li zando el evento Befo reIn sert del com po nente TTa ble que repre-senta a la tabla de deta lle, así:

pro ce du re TOrder Form.TblDe tail Be fo reIn sert(Da ta Set: TDa ta set);be gin if TblMas ter.Sta te = dsInsert then be gin TblMas ter.Post; TblMas ter.Edit; end;end;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “mas ter tables” en la ayuda de Del phi.

Maximum Validity Check FailedPo si ble cau sa de error

Puede haber inten tado asig nar a un campo de tipo TBCDField, TFloat Field,TCu rrenc yField o TInte ger Field un valor que es mayor que el valor del

370 Los Tomos de Delphi: Delphi sin problemas

Page 405: Dsp

pará me tro Max Va lue que se le ha asig nado al campo en el Data base Desk top.Por ejem plo, puede haber asig nado un valor de 1.000.000 a Max Va lue para elcampo Salary de tipo TCu rrenc yField y luego haber inten tado asig nar un valormayor que éste al campo:

TblEmplo yees Sa lary.Va lue := 112000;

So lu ción rá pi daIncre mente el valor de Max Va lue en el Data base Desk top o asigne un valormenor o igual que el pará me tro con fi gu rado al campo. Alter na ti va mente, puedeasig nar un valor a la pro pie dad Max Va lue del objeto TField den tro del entornointe grado de Del phi.

Infor ma ción adi cio nalCon fi gu rar la pro pie dad Max Va lue den tro del entorno inte grado de Del phi oca-sio nará un men saje más infor ma tivo si pos te rior mente asigna un valor dema-siado grande: “<> is not a valid value for field <>. The allo wed range is<> to <>”.

Para más infor ma ción, con sulte “Max Va lue” en la ayuda de Del phi.

Memo too largePo si ble cau sa de error

Puede estar eje cu tando Del phi 2/BDE 3.5/MS SQL Ser ver 6.5 bajo Win dowsNT 4, y uti li zando una tabla con un índice único.

So lu ción rá pi daDes car gue el último par che/actua li za ción para MS SQL Ser ver.

Infor ma ción adi cio nalUna solu ción que ha sido suge rida es asig nar 1 al pará me tro Dri vers Flag enla uti li dad BDE Con fi gu ra tion (Dri vers | MS SQL | Dri vers Flag).

Metafile is not validPo si ble cau sa de error

Puede estar car gando un archivo en la pro pie dad Pic ture de TImage que, aun-que tenga una exten sión .WMF o .EMF, no es realmente un metaarchivo.

Mensajes de error 371

Page 406: Dsp

So lu ción rá pi daAse gú rese que cual quier archivo que intente car gar en la pro pie dad Pic ture deun com po nente TImage sea un archivo grá fico válido.

Infor ma ción adi cio nalDel phi pro por ciona soporte para cua tro for ma tos grá fi cos, deno mi na dos .BMP(mapas de bits), .ICO (iconos), .WMF (Win dows Meta file), y .EMF (Enhan cedMeta file).

Puede ser que la exten sión del archivo fuera cam biada de tal forma que pareceun metaar chivo por su exten sión (pero no lo es real mente).

Con sulte “Unknown pic ture file exten sion: <>”.

Method <> hides virtual method of base class <>Po si ble cau sa de error

1. Puede haber inten tado rede cla rar un método vir tual here dado con la direc-tiva Virtual. Por ejem plo, la clase ances tro puede pare cerse a esto:

type TBass = class pro ce du re WalkAndRock; vir tual; end;

Y la clase des cen diente:

type TGui tar = class pro ce du re WalkAndRock; vir tual; end;

2. Puede haber decla rado un método que tiene el mismo nom bre que elmétodo vir tual en la clase base, pero olvidó (o deli be ra da mente no lo hizo)uti li zar la direc tiva Override. Por ejem plo, lo siguiente pro du cirá este men-saje de error:

type TAndCrum pets(TCom po nent) . . . pu blic cons truc tor Crea te(AOwner: TCom po nent);

So lu ción rá pi da1,2.Añada la direc tiva Override a un método vir tual rede fi nido una clase

descendiente, así:

type . . .

372 Los Tomos de Delphi: Delphi sin problemas

Page 407: Dsp

pu blic cons truc tor Crea te(AOwner: TCom po nent); ove rri de;

Después, uti lice la pala bra reser vada Inhe ri ted para imple men tar la fun-cio na li dad de la clase ances tro antes de aña dir la nueva fun cio na li dad.

cons truc tor TForT wo.Crea te(AOwner: TCom po nent);be gin in he ri ted Crea te(AOwner); FGuest := 'Ti ller man'; . . .

Infor ma ción adi cio nalPuede pro mo ver un método o pro pie dad here dado rede cla rán dolo en la sec ciónen la que quiere que apa rezca en la clase des cen diente. Cuando pro mueva unapro pie dad here dada de una clase ances tro, no nece sita espe ci fi car el tipo depro pie dad o los méto dos de escri tura y lec tura — sim ple mente pro por cione elnom bre de la pro pie dad en la sec ción Public o Publis hed, así:

pu blis hed pro perty OfAlca traz;

Method <> not found in base classPo si ble cau sa de error

Puede haber aña dido la direc tiva Override a un método, pero el método noexiste en la clase ances tro.

So lu ción rá pi daAse gú rese de que cual quier método que intente rede fi nir exista en la claseances tro. Si no existe, eli mine la direc tiva Override.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “vir tual met hods” en la ayuda de Del phi.

Method “<>” not supported by automation objectPo si ble cau sa de error

Puede haber inten tado lla mar a un método no exis tente para un objeto deAuto ma ti za ción OLE. Por ejem plo, lo siguiente gene rará este men saje de error:

var ExcelObj: Va riant;be gin

Mensajes de error 373

Page 408: Dsp

ExcelObj := Crea teOLEObject('Excel.Appli ca tion'); . . . ExcelObj.Sa veAll; //error: met hod Sa veAll not sup por ted by au to ma tion ob ject

Ya que Excel no expone un método “SaveAll”.

So lu ción rá pi daAse gú rese de que cual quier método al que llame esté realmente imple men tadopor el objeto OLE que usted ha ins tan ciado. Puede impor tar la biblio teca detipos (lo que en el caso de Excel producirá el archivo Excel_TLB.PAS) y ver quéméto dos con tiene. Para impor tar la biblio teca de tipos, siga estos pasos:1. Loca lice el archivo .OLB (Object LiB rary) (o el archivo *.TLB, *.OCX,

*.DLL, o *.EXE) que desea impor tar.2. Selec cione Pro ject | Import Type Library.3. Pulse el botón Add, nave gue hasta el direc to rio apro piado, y selec cione el

archivo.4. Selec cione Install para ins ta larlo den tro de un paquete o Create Unit

para crear una uni dad y aña dirla al pro yecto actual.

Infor ma ción adi cio nalSi uti liza enlace tem prano (early bin ding), el com pi la dor puede cap tu rar estostipos de erro res. Si uti liza enlace tar dío (late bin ding), no notará el pro blemahasta que el código sea lla mado en tiempo de eje cu ción. Si importa la biblio tecade tipos del objeto OLE, puede uti li zar el archivo .PAS creado (enlace tem-prano). Del phi 5 y supe rio res pro por cio nan muchos ser vi do res OLE en lapágina Ser vers de la Paleta de Com po nen tes. Puede tam bién eva luar la suitede com po nen tes para Micro soft Office Offi ce Part ner, dis tri buida por Dany soft.

Method <> with identical parameters exists alreadyPo si ble cau sa de error

Puede haber decla rado dos méto dos con la misma sig na tura (nom bre, cantidad,tipos y orden de los pará me tros). Por ejem plo, lo siguiente gene rará este men-saje de error:

cons truc tor Crea te(AOwner: TCom po nent); over load; ove rri de;cons truc tor Crea te(AOwner: TCom po nent); over load;

So lu ción rá pi daAse gú rese de que cual quier método que intente sobre car gar difiera en cuanto asig na tura de los demás méto dos a los que tam bién ha aso ciado la direc tivaOver load. Por ejem plo, en el caso de arriba puede hacer algo así:

374 Los Tomos de Delphi: Delphi sin problemas

Page 409: Dsp

cons truc tor Crea te(AOwner: TCom po nent); over load; ove rri de;cons truc tor Crea te(AOwner: TCom po nent; i:in te ger); over load;

Infor ma ción adi cio nalNote que no es válido aña dir la direc tiva Ove rride a más de uno de los méto dossobre car ga dos, ya que el método rede fi nido puede sola mente com par tir unalista de pará me tros idén ti cos con sólo uno de los méto dos sobre car ga dos que sedecla ren. Si se hubiera aña dido la direc tiva Ove rride a ambos méto dos, seobten dría el men saje de error “Decla ra tion of <> dif fers from pre viousdecla ra tion”.

Method identifier expectedPo si ble cau sa de error

1. Puede haber reci bido pri mero el error “Unde cla red Iden ti fier:<>” den trode un pro ce di miento o fun ción que no es miem bro de la decla ra ción de tiposde la uni dad, y luego intentó rec ti fi car este error ante po niendo el nom brede la clase (por ejem plo TForm1) al iden ti fi ca dor. Por ejem plo, si tiene unpro ce di miento pare cido a éste:

pro ce du re loop de loop;be gin La bel1.Cap tion := IntToStr(Si zeOf(Byte));end;

Obten drá el error “Unde cla red Iden ti fier:<>”. Si luego añade el nom bredel tipo de la clase así:

pro ce du re loop de loop;be gin TForm1.La bel1.Cap tion := IntToStr(Si zeOf(Byte));end;

reci birá el men saje de error bajo dis cu sión.2. Puede haber decla rado un campo pri vado en una cláu sula Read o Write de

una pro pie dad en la sec ción Auto ma ted de un tipo.3. Puede haber uti li zado la pala bra reser vada Inhe ri ted en Del phi 1 sin espe-

ci fi car el método o pro pie dad que está siendo here dado. Por ejem plo, losiguiente oca sio nará este error en Del phi 1:

pro ce du re TascY2KDBCom bo Box.DoE xit;be gin try if length(Self.Text)<10 then be gin Se lectAll; Set Fo cus; rai se EFull Da te Not Sup plied.Crea te(SEnterA Four Di git Year); end;

Mensajes de error 375

Page 410: Dsp

ex cept Se lectAll; Set Fo cus; rai se; end; in he ri ted; //aquí está el pro ble maend;

So lu ción rá pi da1. Borre la ‘T’ del nom bre del tipo. Por ejem plo, esto com pi la ría bien (asu-

miendo que la varia ble de for mu la rio es Form1):

pro ce du re loop de loop;be gin Form1.La bel1.Cap tion := IntToStr(Si zeOf(Byte));end;

2. Las pro pie da des en las sec cio nes Auto ma ted deben hacer refe ren cia améto dos, y no a cam pos, en sus cláu su las Read y Write.

3. Añada el nom bre del método a la lla mada, así:

pro ce du re TascY2KDBCom bo Box.DoE xit;be gin try if length(Self.Text)<10 then be gin Se lectAll; Set Fo cus; rai se EFull Da te Not Sup plied.Crea te(SEnterA Four Di git Year); end; ex cept Se lectAll; Set Fo cus; rai se; end; in he ri ted DoE xit;end;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “object-orien ted pro gram ming | pro gram mingwith Del phi objects” en la ayuda de Del phi.

Microsoft Transaction Server is not installedPo si ble cau sa de error

Puede haber incluido una direc tiva en un tipo de disp-inter faz. Por ejem plo, losiguiente gene rará este men saje de error:

376 Los Tomos de Delphi: Delphi sin problemas

Page 411: Dsp

type IDe la wa reIg no res Sour Patch = dis pin ter fa ce ['{00000000-0000-0000-0000-000000000000}'] pro ce du re Ro ver Do ver; re gis ter; end;

So lu ción rá pi daEli mine la direc tiva.

Infor ma ción adi cio nalEste ele mento de menú está dis po ni ble sola mente en Del phi 4. Está des ha bi li-tado, a menos que haya aña dido un Módulo de Datos MTS a su pro yecto. Pre-su mi ble mente, usted no selec cio nará el ele mento de menú Run | Install MTSObjects. . . a menos que haya ins ta lado MTS. En otras pala bras, pro ba ble-mente sólo obten drá este men saje de error si está haciendo expe ri men tos.

Minimum Validity Check failedPo si ble cau sa de error

Puede haber tra tado de asig nar a un campo de tipo TBCDField, TFloat Field,TCu rrenc yField o TInte ger Field un valor que es menor que el valor asig nado alpará me tro Min Va lue para el campo en el Data base Desk top. Por ejem plo,puede haber asig nado un valor de 20.000 al pará me tro Min Va lue para elcampo Salary de tipo TCu rrenc yField, y luego haber inten tado asig nar unvalor más pequeño que ese al campo:

TblEmplo yees Sa lary.Va lue := 19000;

So lu ción rá pi daDis mi nuya el valor del pará me tro Min Va lue en el Data base Desk top, o asigneun valor mayor o igual que el pará me tro Min Va lue al campo. Alter na ti va-mente, puede asig nar un valor a la pro pie dad Min Va lue de un objeto TField enel entorno inte grado de Del phi.

Infor ma ción adi cio nalCon fi gu rar la pro pie dad Min Va lue en el entorno inte grado de Del phi pro du ciráun men saje de error más infor ma tivo si pos te rior mente se asigna un valormenor que el mínimo: “<> is not a valid value for field <>. The allo wedrange is <> to <>”.

Para más infor ma ción, con sulte “Min Va lue” en la ayuda de Del phi.

Mensajes de error 377

Page 412: Dsp

Mismatch in datapacketPo si ble cau sa de error

Puede estar inten tando leer de un flujo (stream) sin haberse posi cio nado al ini-cio antes de leer. Por ejem plo, lo siguiente gene rará este men saje de error:

var Cons cious ness: TMe moryStream;be gin Cons cious ness := TMe moryStream.Crea te; try Client Da ta Set1.Sa ve ToS tream(Cons cious ness); Client Da ta Set1.LoadF romS tream(Cons cious ness); fi nally Cons cious ness.Free; end;end;

So lu ción rá pi daAsigne 0 a la posi ción actual del flujo antes de inten tar leer de él:

var Cons cious ness: TMe moryStream;be gin Cons cious ness:= TMe moryStream.Crea te; try Client Da ta Set1.Sa ve ToS tream(Cons cious ness); Cons cious ness.Po si tion := 0; { aña da esta lí nea } Client Da ta Set1.LoadF romS tream(Cons cious ness); fi nally Cons cious ness.Free; end;end;

Infor ma ción adi cio nalCon sulte “TClient Da ta set” en la ayuda de Del phi para infor ma ción rela cio nadasobre el alma ce na miento de datos en memo ria.

Missing commaPo si ble cau sa de error

Puede estar uti li zando Del phi 1 y haber pro por cio nado varios pará me tros a lapro pie dad SQL de un TQuery.

378 Los Tomos de Delphi: Delphi sin problemas

Page 413: Dsp

So lu ción rá pi daObtenga el par che 1.02 de Del phi 1 del sitio Web de Bor land.

Infor ma ción adi cio nalApli que siem pre la última ver sión de los par ches de Del phi y del BDE (asícomo de la base de datos de ser vi dor SQL, si puede) para un mejorfuncionamiento.

Para más infor ma ción, con sulte “que ries” en la ayuda de Del phi.

Missing Connection or Connection StringPo si ble cau sa de error

1. Puede haber des ple gado el Editor de Campos (Fields Edi tor) para un com-po nente TADODa ta Set, TADOTa ble o TADOQuery (selec cio nando FieldsEdi tor del menú de con texto o haciendo doble clic sobre él), y luego selec-cionó Add Fields o Add All Fields del menú de con texto del Edi tor deCam pos sin tener una entrada válida en la pro pie dad Con nec tion oCon nec tionS tring.

2. Puede haber inten tado eje cu tar una sen ten cia SQL sin espe ci fi car un com-po nente TADOCon nec tion para un com po nente TADOQuery oTADODa ta set. Por ejem plo, lo siguiente gene rará este men saje de error:

with TADOQuery.Crea te(nil) do be gin try SQL.Add('ALTER TABLE SCRIPTURES'); SQL.Add('ADD ORDER_SEQUENCE VARCHAR(3)'); ExecSQL; fi nally Free; end;end;

So lu ción rá pi da1,2.Conecte el com po nente TADOQuery o TADODa ta set a un com po nente

TADOCon nec tion a tra vés de su pro pie dad Con nec tion, así:

Con nec tion := ADOCon nec tion1;

Infor ma ción adi cio nalAlter na ti va mente, puede espe ci fi car una cadena de cone xión para el com po-nente TADOQuery o TADODa ta Set. Si lo hace, pulse sobre el botón … a ladere cha de la pro pie dad Con nec tionS tring para des ple gar su edi tor de pro pie-da des. Es pre fe ri ble uti li zar un com po nente TADOCon nec tion para toda la

Mensajes de error 379

Page 414: Dsp

apli ca ción, asig nando su pro pie dad Con nec tionS tring, y tener todos los con jun-tos de datos aso cia dos al com po nente TADOCon nec tion. TADOCon nec tion essimi lar a TDa ta base en las apli ca cio nes de BDE, y a TIBDa ta base en las apli-ca cio nes Inter Base Express. Los com po nen tes ADO apa re cie ron en Del phi 5.

Missing Data Provider or Data PacketPo si ble cau sa de error

1. Puede haber inten tado asig nar True a la pro pie dad Active de un com po-nente TClient Da ta Set sin haber espe ci fi cado un com po nente TPro vi der enla pro pie dad Pro vi der Name (el pro vee dor de datos no se encuen tra).

2. El pro vee dor puede no haber devuelto regis tros (el paquete de datos se haper dido).

3. Puede estar uti li zando un TClient Da ta Set en una apli ca ción de una capa yhaber olvi dado asig nar un valor a la pro pie dad File Name.

4. Puede estar inten tando uti li zar sen ten cias SQL con tra un con junto dedatos local (una capa). Por ejem plo, lo siguiente gene rará este error sicdsDin ner Guests es un con junto de datos de una sola capa (la pro pie dadPro vi der Name no está asig nada a un TDa ta SetP ro vi der que apunte a datosSQL o a otra capa lógica o lógica y física):

cdsDin ner Guests.Com mand Text := 'DELETE FROM cdsDin ner Guests WHERE FNa me = ''Jef frey'' AND‘ + ‘ LNa me = ''Dah mer''';cdsStu dents.Exe cu te;

So lu ción rá pi da1. Pro por cione un com po nente TPro vi der en la pro pie dad Pro vi der Name del

com po nente TClient Da ta Set.2. Pro por cione código que valide y res ponda a la posi bi li dad de no obte ner

datos del ser vi dor de apli ca ción. Por ejem plo, podría inten tar algo como losiguiente:

if Client Da ta Set1.Re cord Count = 0 then { ... }if Client Da ta Set1.IsEmpty then { ... }if (cds.BOF) and (cds.BOF) then { ... }

3. Asigne un archivo .CDS (bina rio) o .XML a la pro pie dad File Name del com-po nente Client Da ta Set.

4. No se puede uti li zar SQL sobre con jun tos loca les (de una capa), que sonalma ce na dos en disco en lugar de una base de datos. O sea, la pro pie dadCom mand Text no está dis po ni ble en este con texto. Para inser tar, actua li-zar y borrar datos, puede uti li zar los méto dos Insert Re cord y Delete de

380 Los Tomos de Delphi: Delphi sin problemas

Page 415: Dsp

TClient Da ta Set. Por ejem plo, para borrar un regis tro, puede pri mero loca li-zar el regis tro, y luego lla mar al método Delete, así:

CdsDin ner Guests.Lo ca te(’FNa me;LNa me’, VarA rrayOf(['Jef frey', 'Dah mer']), [lo Par tial Key]);cdsStu dents.De le te;

Infor ma ción adi cio nal2. Para más infor ma ción, con sulte “Record Count”, “BOF”, “EOF” y “IsEmpty”

en la ayuda de Del phi.3. Vea los méto dos Save To File y Save ToS tream de TClient Da ta Set, los cua les

(a par tir de Del phi 6) tie nen un segundo pará me tro, que puede ser dfBi-nary, dfXML o dfXMLUTF8.

Missing ENDIF directivePo si ble cau sa de error

Puede tener una direc tiva de com pi la ción $IFDEF, $IFNDEF o $IFOPT sin lacorres pon diente direc tiva $ENDIF. Por ejem plo, lo siguiente gene rará estemen saje de error:

uses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Re gistry, {$IFDEF Lep pard} Ini Fi les, {$IFNDEF DumbAndBlind Kid} Con trols;

So lu ción rá pi daAse gú rese de que cada sen ten cia {$IFDEF} tenga un sen ten cia {$ENDIF}corres pon diente.

Infor ma ción adi cio nalCon sulte “Inva lid com pi ler direc tive: <>”.

Missing operator or semicolonPo si ble cau sa de error

1. Puede haber olvi dado poner un punto y coma al final de una línea.2. Puede haber omi tido un ope ra dor o pala bra reser vada entre los ope ran dos.

Por ejem plo, en una sen ten cia With... Do, puede haber olvi dado el Do:

with Ta ble1be gin

Mensajes de error 381

Page 416: Dsp

3. Puede haber omi tido el ope ra dor de con ca te na ción (+) entre cade nas defi ni-das una detrás de otra.

4. Puede haber tenido un único após trofe (') en su pro pia línea y luego haberinten tado com pi lar. Enton ces habrá obte nido el men saje de error “Unter-mi na ted string”, seguido por el men saje de error bajo dis cu sión.

5. Puede estar lla mando a un pro ce di miento o fun ción que no está en ámbito,pero otro pro ce di miento o fun ción que tiene el mismo nom bre pero una sig-na tura dife rente sí lo está. Por ejem plo, puede estar inten tando lla mar alpro ce di miento están dar Delete decla rado en la uni dad System, pero estálla mando en su lugar (inad ver ti da mente) al método Delete de TString List.

So lu ción rá pi da1. Siem pre añada un punto y coma al final de cada línea, a menos que esté

par tiendo una sen ten cia If en muchas líneas.2. Añada el ope ra dor o pala bra reser vada que falta (Do en este caso):

with Ta ble1 dobe gin

3. Si tiene una cadena divi dida a lo largo de varias líneas, con ca té ne las uti li-zando el ope ra dor de con ca te na ción (+).

4. Borre la comi lla sim ple sobrante.5. Cuali fi que la lla mada, ante po niendo el nom bre de la uni dad en la que el

pro ce di miento que quiere uti li zar está decla rado. Por ejem plo, para resol-ver la situa ción antes des crita, uti lice System.Delete. Alter na ti va mente,mueva la uni dad que con tiene el iden ti fi ca dor al que quiere acce der paraque quede detrás de la uni dad que con tiene un iden ti fi ca dor con el mismonom bre en la cláu sula Uses. Por ejem plo, si está inten tando uti li zar el pro-ce di miento Dele te File de la uni dad SysUtils, sitúe esa uni dad detrás de launi dad Win dows en la cláu sula Uses, ya que la uni dad Win dows en Del phide 32 bits tam bién con tiene un pro ce di miento Dele te File.

Infor ma ción adi cio nal1. Note que es nece sa rio aña dir un punto y coma al final de cada sen ten cia.

Nor mal mente, es lo mismo que aña dir un punto y coma al final de cadalínea; sin embargo, esto no es siem pre cierto. Una sen ten cia If, por ejem plo,puede exten derse a lo largo de varias líneas. Debe espe rar hasta el final dela sen ten cia para aña dir un punto y coma.

3. Esta es la forma de con ca te nar una cadena en varias líneas (no aña dir elope ra dor de con ca te na ción (+) genera el men saje de error bajo dis cu sión):

s := 'What would you rat her eat: the fat from ' + 'Behind a ca ri bou’‘s eye ball or a fros ted ' + 'por tart. (McFee)';

Puede tam bién con ca te nar las cade nas en la misma línea y mos trar las enmúl ti ples líneas, o con ca te nar valo res de pro pie da des con cade nas

382 Los Tomos de Delphi: Delphi sin problemas

Page 417: Dsp

lite ra les. Por ejem plo, para mos trar un men saje par tién dolo en variaslíneas en un cua dro de diá logo (en una línea de código), puede hacer esto:

Show Mes sa ge('I re mem ber you used to pick the git-fidd le’ + #13#10 + ‘fairly to le ra ble, Andy!');

Tam bién puede incor po rar y con ca te nar varia bles, valo res de pro pie da des,y lite ra les de cadena en una sim ple línea de texto, así:

Show Mes sa ge('Listen: ' + Edit1.Text + ' ' + s + '!')

5. Con sulte “Cons tant or type iden ti fier expec ted” y “Unde cla red Iden-ti fier: <>”. Si iden ti fi ca do res idén ti cos apa re cen en múl ti ples unidades, ladecla ra ción situada en la uni dad que apa rece en último lugar en la cláu-sula Uses es la que recordará el com pi la dor.

Missing or invalid conditional symbol in <$> directivePo si ble cau sa de error

Puede haber aña dido las direc ti vas $IFDEF, $IFNDEF, $DEFINE o $UNDEFsin espe ci fi car qué sím bolo con di cio nal pre tende veri fi car, defi nir o indefi nir.Por ejem plo, lo siguiente gene rará este men saje de error:

uses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, {$IFDEF} Re gistry, { ... }

So lu ción rá pi daDebe espe ci fi car qué símbolo está veri fi cando, defi niendo o indefi niendo, así:

uses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, {$IFDEF WIN32} Re gistry, {$ELSE} Ini Fi les, {$ENDIF}

Infor ma ción adi cio nalPara más infor ma ción, con sulte “con di tio nal direc ti ves” en la ayuda de Del phi.

Missing parameter typePo si ble cau sa de error

Puede haber decla rado un pro ce di miento o fun ción que recibe uno o más pará-me tros por valor cuyos tipos no se han espe ci fi cado. Por ejem plo, lo siguientegene rará este men saje de error:

pro ce du re fudg si cle(a);

Mensajes de error 383

Page 418: Dsp

So lu ción rá pi daDebe espe ci fi car el tipo de datos cuando declare pro ce di mientos o fun cio nes queacep ten pará me tros por valor. Por ejem plo, para solu cio nar la decla ra ción dearriba, podría hacer esto:

pro ce du re fudg si cle(a: byte);

Infor ma ción adi cio nalPuede decla rar pro ce di mien tos y fun cio nes que acep ten pará me tros varia bles(Var) o cons tan tes (Const) sin espe ci fi car los tipos de datos. Las siguien tes dosdecla ra cio nes son lega les:

pro ce du re fudg si cle2(var a);pro ce du re fudg si cle3(const a);

Missing right quotePo si ble cau sa de error

Puede tener un após trofe sin empa rejar en una sen ten cia SQL.

So lu ción rá pi daBorre el após trofe soli tario o añádale su pareja.

Infor ma ción adi cio nalCon sulte “Quo tedStr” en la ayuda de Del phi.

Missing TableName propertyPo si ble cau sa de error

1. Puede haber inten tado eje cu tar una acción sobre una tabla para la cual nose ha pro por cio nado un valor a la pro pie dad Data ba se Name.

2. Puede haber inten tado crear los cam pos per sis ten tes de una tabla entiempo de diseño pul sando dos veces sobre el com po nente TTa ble y luegoselec cio nando Add Fields del menú de con texto sin haber asignado a la pro-pie dad Table Name del objeto TTa ble una tabla válida.

3. Puede haber inten tado asig nar True a la pro pie dad Active de un com po-nente TTa ble sin haberle asig nado valor a su pro pie dad Table Name.

384 Los Tomos de Delphi: Delphi sin problemas

Page 419: Dsp

So lu ción rá pi da1. Selec cione uno de los alias del BDE que han sido creados en su sis tema de

la lista des ple ga ble de la pro pie dad Data ba se Name.Alter na ti va mente, pro por cione la ruta com pleta del direc to rio en el que lastablas resi den. Por ejem plo, en una ins ta la ción por defecto de Del phi,podría asig nar el alias DBDEMOS, selec cionán dolo de la lista des ple ga ble,o intro du cir direc ta mente una ruta como: C:\Archi vos de pro grama\Bor-land\Del phi X\Demos\Data.

2,3.Selec cione una tabla del cua dro de com bi na ción que ofrece la pro pie dadTable Name del com po nente TTa ble y luego rein tente la ope ra ción. Si noapa rece nin guna tabla en la lista, pri mero ten drá que asig nar la pro pie dadData ba se Name. Para hacer esto, selec cione un alias del cua dro de com bi na-ción de la pro pie dad Data ba se Name o intro duzca la ruta (si uti liza tablasloca les en lugar de tablas SQL). Ahora ten drá una lista de las tablas queper te necen al alias (o están situadas en el direc to rio indicado). Selec cioneuna de ellas.

Infor ma ción adi cio nalPuede configurar la pro pie dad Data ba se Name para que bus que en las tablassitua das en el mismo direc to rio donde reside el eje cu ta ble intro du ciendo “/.”(una barra seguida de un punto) como valor de la pro pie dad Data ba se Name.Esto es un com pro miso entre uti li zar un alias y una ruta indi cada explí ci ta-mente. No es tan rígido como una ruta fija, ni tan fle xi ble como un alias.

Module <>s time/date changed. Reload?Po si ble cau sa de error

1. Puede haber (inad ver ti da mente) ini ciado varias ins tan cias de Del phi.2. Puede haber mar cado para guar dar (check-out) mediante un sis tema de

con trol de ver sio nes (como PVCS) una ver sión de un archivo que es ante-rior o pos te rior a la del archivo car gado en el pro yecto (es una ver sióndife rente del archivo, en otras pala bras).

So lu ción rá pi da1. Cie rre todas las ins tan cias inne ce sa rias de Del phi.2. Si era su inten ción hacerlo (gra bar una ver sión dife rente del archivo), pulse

el botón Yes para dese char el diá logo y reem pla zar el archivo exis tente porel que se ha marcado.

Mensajes de error 385

Page 420: Dsp

Infor ma ción adi cio nalPodría ver este men saje de error si selec ciona varios archi vos de Del phi en elExplo ra dor y luego acci den tal mente pulsa dos veces suce si va mente sobre unode ellos. Esto eje cuta una acción de doble clic sobre todos los archi vos selec cio-na dos, y una ins tan cia de Del phi es ini ciada para cada archivo indi vi dual. Siesto ocu rre, puede obte ner este men saje de error “One or more lines weretoo long and have been trun ca ted”.

Module header is missing or incorrectPo si ble cau sa de error

1. Puede haber cam biado el nom bre del archivo fuente fuera del entorno inte-grado (por ejem plo, en el Explo ra dor de Win dows).

2. Puede haber omi tido la cláu sula Uses de la sec ción Inter face de unauni dad.

3. Puede haber copiado los archi vos .DSK y/o .DOF junto con los archi vosfuente de un pro yecto de un direc to rio a otro.

So lu ción rá pi da1. Cam bie el nom bre del archivo de nuevo a su nom bre ori gi nal, o cám bielo en

el entorno inte grado al nom bre que le asignó fuera.2. Rein cor pore la cláu sula Uses e incluya al menos una uni dad en ella.3. Borre los archi vos .DSK y/o .DOF, ya que pue den hacer refe ren cia a archi-

vos en el direc to rio ante rior.

Infor ma ción adi cio nal1. Si cam bia un nom bre de uni dad fuera de Del phi, este cam bio no es auto má-

ti ca mente trans mi tido al resto del pro yecto, que lo conoce por el nom breante rior. Por lo tanto, no haga esto.

2. Puede incluir una uni dad pequeña para satis fa cer la nece si dad de uti li zaral menos una uni dad. Podría crear una uni dad falsa que sim ple mente con-tenga lo mínimo indis pen sa ble para ser sin tác ti ca mente correcta, pero queno pro por cione nin guna fun cio na li dad. Por ejem plo, si sim ple mente añadeuna uni dad a su pro yecto, éste se verá así:

unit Unit2;in ter fa ceim ple men ta tionend.

Puede enton ces cam biar su nom bre a “Wha te ver” (o el nom bre que desee) yuti li zarla en la otra uni dad.

386 Los Tomos de Delphi: Delphi sin problemas

Page 421: Dsp

3. En las pri me ras ver sio nes de Del phi, los archi vos .DOF tenían la exten sión.OPT.

Multiple Net Files foundPo si ble cau sa de error

1. Dos o más usua rios pue den estar inten tando acce der a la misma tabla dela base de datos, pero no com par ten la misma con fi gu ra ción de NET DIR.

2. Si todos los usua rios tienen la misma con fi gu ra ción de NET DIR, puede serque haya un archivo .LCK viejo que apunte a una ruta dis tinta del direc to-rio al que apunta Net Dir.

3. Puede tener un archivo PDOXUSRS.NET o PDOXUSRS.LCK dañado.

So lu ción rá pi da1. Con fi gure cada máquina de usua rio de tal manera que todas utilicen el

mismo archivo de con trol de red (PDOXUSRS.NET). Puede hacer estosiguiendo los pasos apro pia dos según la ver sión de Del phi que tenga:

Delphi 1

Si cada usua rio tiene su pro pia copia de BDE en su máquina, puede uti li zar lauti li dad BDE Con fi gu ra tion para asig nar el direc to rio del archivo de con trol dered. Para hacer esto, siga estos pasos:

a. Abra la utilidad de configuración de BDE.b. Con la entrada Par a dox seleccionada en el cuadro de lista Driver

Name, introduzca la ruta completa del directorio de red compartido endonde se almacena el archivo de control de red (PDOXUSRS.NET) enel parámetro NET DIR.

c. Seleccione File | Exit para grabar los cambios.

Si algún usua rio no tiene una copia de la uti li dad BDE Con fi gu ra tion, ase gú-rese de que la ubi ca ción actual del archivo IDAPI.CFG (C:\IDAPI por defecto)coin cide con la que está alma ce nada para la entrada CONFIGFILE01 en lasec ción [IDAPI] de WIN.INI.

Si es nece sa rio, mueva el archivo para que cum pla con lo indi cado en laentrada de WIN.INI, o modi fi que la entrada en WIN.INI para que apunte a laubi ca ción actual del archivo.

Delphi 2

Si cada usua rio tiene su pro pia copia del BDE, puede uti li zar la uti li dad BDECon fi gu ra tion para asig nar el direc to rio del archivo de con trol de red de Para-dox. Para hacer esto, siga estos pasos:

Mensajes de error 387

Page 422: Dsp

a. Abra la utilidad de configuración del BDE (BDECFG32.EXE)seleccionando Inicio | Pro gramas | Delphi | BDE Config.

b. Con la entrada de Par a dox seleccionada en el cuadro de lista DriverName, introduzca la ruta completa del directorio de red compartido endonde se almacena el archivo de control de red (PDOXUSRS.NET) enel parámetro NET DIR.

c. Seleccione File | Exit para grabar los cambios.

Con sulte “Del phi de 32 bits” más abajo.

Delphi 3 y 4

Si cada usua rio tiene su pro pia copia del BDE, puede uti li zar la uti li dad BDEAdmi nis tra tor para asig nar el direc to rio del archivo de con trol de red de Para-dox. Para hacer esto, siga estos pasos:

a. Abra la utilidad de configuración del BDE (Inicio | Pro gramas |Borland Delphi X | BDE [Con fig u ra tion, Admin is tra tion]).

b. Seleccione Object | Open Con fig u ra tion. . . .c. Abra IDAPI32.CFG.d. Nav egue hasta Con fig u ra tion\Drivers\Native\Par a dox en la vista de

árbol en la parte Con fig u ra tion, en el panel izquierdo del BDEAdmin is tra tor.

e. Introduzca la ruta completa del directorio en donde quiere que resida elarchivo de control de red. Seleccione un directorio de red compartidopara el que todos los usuarios de las tablas Par a dox tengan derechos delectura, escritura y borrado.

f. Seleccione Object | Exit y luego Yes para grabar los cambiosrealizados.

Delphi de 32 bits

Si algún usua rio no tiene una copia de la uti li dad BDE Con fi gu ra tion/Admi nis-tra tion, puede con sul tar su con fi gu ra ción del Regis tro de Win dows para ase gu-rarse de que la ubi ca ción física real de IDAPI32.CFG (por defecto C:\Archi vosde pro grama\Bor land\Com mon files\BDE) coin cide con la que se indica en elRegis tro.

Si es nece sa rio, mueva el archivo para que su loca li za ción sea igual a la indi-cada en la entrada del Regis tro, o modi fi que la entrada en el Regis tro para quecoin cida con la ubi ca ción del archivo.

2. Ase gú rese que nin gún usua rio esté conec tado a las tablas del direc to rio enel que el archivo .LCK está ubi cado, y bórrelo.

3. Veri fi que que no haya usua rios del BDE sobre la red uti li zando las tablas yluego borre los archi vos PDOXUSRS.NET y/o PDOXUSRS.LCK daña dos.Los archi vos serán rege ne ra dos auto má ti ca mente cuando se nece si ten.

388 Los Tomos de Delphi: Delphi sin problemas

Page 423: Dsp

Infor ma ción adi cio nal1. Esto puede suce der cuando se pone una base de datos a dis po si ción de múl-

ti ples usua rios que antes sola mente acce dían a tablas de BDE loca les (ensu disco duro). En este caso, el pará me tro NET DIR de cada usua rio podríaestar apuntando a su pro pio direc to rio raíz (C:\). Esto resul ta ría en losiguiente:a. El primer usuario accedió a las tablas, y proporcionó su propia unidad

de disco duro como directorio NetDir. Ningún problema.b. El segundo usuario intenta acceder a las tablas, y también proporciona

su propia unidad de disco duro como directorio NetDir. Hay dosarchivos diferentes PDOXUSRS.NET intentando controlar el acceso alas tablas, y el mensaje de error bajo discusión es generado.

3. Los archivos PDOXUSR.NET y PDOXUSRS.LCK pueden dañarse si unpro grama que uti liza el BDE ter mina anor mal mente (como en el caso deuna caída del sistema).

El BDE puede detec tar si las tablas están en una uni dad de red, pero no puededetec tar si las tablas están en una máquina que sirve como ser vi dor dedi cado osi la máquina es un cliente a la vez que un ser vi dor (en otras pala bras, es un‘punto’ de una red punto-a-punto).

Los ser vi do res dedi ca dos noti fi can a las apli ca cio nes cliente cuando un archivoes blo queado o ha sido modi fi cado. Las redes punto-a-punto no ofre cen nor mal-mente esta fun cio na li dad (incluso una máquina ser vi dora en una redpunto-a-punto no es un ser vi dor dedi cado ver da dero). Para lograr este tipo defun cio na li dad en una red de punto-a-punto, asigne el valor True a Local Sharecon la uti li dad BDE Con fi gu ra tion (página/nodo System) en todas las máqui nasclien tes que acce den a las tablas.

Para más infor ma ción, con sulte “Direc tory is con tro lled by other .NETfile”.

Multiple Paradox Net files found/in usePara más infor ma ción, con sulte “Direc tory is con tro lled by other .NETfile” y “Mul ti ple Net Files found”.

Must apply updates before refreshing dataPo si ble cau sa de error

Puede haber lla mado al método Refresh de un TClient Da ta Set, o ha pul sado elbotón Refresh de un TDBNa vi ga tor aso ciado a él mien tras hay actua li za cio nespen dien tes.

Mensajes de error 389

Page 424: Dsp

So lu ción rá pi daSi las actua li za cio nes están pen dien tes, no hay nada que refres car. Llame aApplyUpda tes y luego, si es nece sa rio, a Refresh.

Infor ma ción adi cio nalCon sulte “TClient Da ta Set’s Upda teS ta tus pro perty” y “Save Point met hods” enla ayuda de Del phi.

Name conflictingPo si ble cau sa de error

Puede estar conectándose a un ser vi dor DCOM de múl ti ples ins tan cias y uti-lizando un com po nente TDa ta base cuya pro pie dad Hand leS ha red tiene el valorFalse.

So lu ción rá pi daAsigne True a la pro pie dad Hand leS ha red del com po nente TDa ta base.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “COM” en la ayuda de Del phi.

Name not unique in this contextPo si ble cau sa de error

Puede estar uti li zando un objeto TDa ta base cuya pro pie dad Hand leS ha redtiene asig nado el valor False.

So lu ción rá pi daAsigne True a la pro pie dad Hand leS ha red del com po nente TDa ta base.

Infor ma ción adi cio nalHand leS ha red es una pro pie dad de tipo Boo lean que indica si un com po nenteTDa ta base puede com par tir su mane ja dor (handle) de BDE en una sesión.

Con fi gu rando Hand leS ha red a True, evita con flic tos de espa cios de nom bres.Hay dos situa cio nes donde esto es poten cial mente un pro blema: El componente TDatabase está situado en un módulo de datos remoto. El componente TDatabase está situado en un módulo de datos que ha

heredado del Almacén de Objetos.

390 Los Tomos de Delphi: Delphi sin problemas

Page 425: Dsp

Nota: Si está utilizando un servidor de aplicación multi-hilos, asegúrese de colocarun objeto TSession en el Módulo de Datos Remoto, y de asignar True a su propiedadAutoSessionName.

Need to specify at least one dimension for SetLength of dynamicarray

Po si ble cau sa de errorPuede haber lla mado a Set Length sobre un array, pero olvidó espe ci fi car unvalor para la lon gi tud del array. Por ejem plo, lo siguiente gene rará este men-saje de error:

pro ce du re Shor test Pro ce du re Na meK nown To Wes tern Ci vi li za tion;var ABunchOfInte gers: array of in te ger;be gin Set Length(ABunchOfInte gers);end.

So lu ción rá pi daAñada el argu mento que indica el tamaño a Set Length, así:

pro ce du re Shor test Pro ce du re Na meK nown To Wes tern Ci vi li za tion;var ABunchOfInte gers: array of in te ger;be gin Set Length(ABunchOfInte gers, 52);end.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “Set Length” en la ayuda de Del phi.

Never-build package <> must be recompiledPo si ble cau sa de error

Puede haber hecho modi fi ca cio nes a otro paquete que es reque rido por elpaquete al que se hace refe ren cia en el men saje de error.

So lu ción rá pi daRecom pile manual mente el paquete al que se hace refe ren cia en el mensaje.

Mensajes de error 391

Page 426: Dsp

Infor ma ción adi cio nalPara más infor ma ción, con sulte “pac ka ges” en la ayuda de Del phi.

Never-build package <> requires always-build package <>Po si ble cau sa de error

Puede estar inten tando crear un paquete de “no cons truir” (never-build) querequiere un paquete “cons truir siem pre” (always-build).

So lu ción rá pi daCam bie la direc tiva de no cons truir en el paquete que requiere o la direc tiva decons truir siem pre en el paquete reque rido.

Infor ma ción adi cio nalYa que la inter faz de un paquete “cons truir siem pre” puede cam biar en cual-quier momento, y puesto que la ban dera de “no cons truir” indica al com pi la dorque asuma que el paquete está total mente actua li zado, cada paquete de tipo“no cons truir” puede sola mente reque rir otro paquete que tam bién esté mar-cado como “no cons truir”. Para más infor ma ción, con sulte “weak pac ka ging” y“impli cit build” en la ayuda de Del phi.

New not supported for dynamic arrays—use SetLengthPo si ble cau sa de error

Puede estar inten tado espe ci fi car el tamaño de un array diná mico uti li zando elpro ce di miento New. Por ejem plo, lo siguiente gene rará este men saje de error:

pro ce du re Newby;var ArrayOfSco res: array of in te ger;be gin New(ArrayOfSco res, StrToInt(edt Num berO fGa mes));end.

So lu ción rá pi daUti lice Set Length en lugar de New:

pro ce du re Newby;var ArrayOfSco res: array of in te ger;be gin Set Length(ArrayOfSco res, StrToInt(edt Num berO fGa mes));

392 Los Tomos de Delphi: Delphi sin problemas

Page 427: Dsp

end.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “Set Length” en la ayuda de Del phi.

No address specifiedPo si ble cau sa de error

Puede haber inten tado asig nar True a la pro pie dad Con nec ted de un objetoTSoc ket Con nec tion sin haber pro por cio nado un valor para la pro pie dadAddress.

So lu ción rá pi daEspe ci fi que la direc ción apro piada en la nota ción de punto están dar de Inter-net (cua tro valo res de un byte). Puede pro por cio nar el valor en el Inspec tor deObje tos o en el código; por ejem plo, pro por cione la direc ción en el código:

Soc ket Con nec tion1.Address := ‘131.228.6.1’;

Infor ma ción adi cio nalLa pro pie dad Address de TSoc ket Con nec tion se refiere a la direc ción IP delser vi dor en el que el objeto DCOM reside. Si no sabe la direc ción, puede pro-por cio nar el nom bre del ser vi dor en la pro pie dad Host. Esto, sin embargo, esmás lento que con fi gu rar direc ta mente la pro pie dad Address, ya que la direc-ción del ser vi dor deberá ser bus cada.

No argument for format <>Po si ble cau sa de error

Puede no haber pro por cio nado la misma can ti dad de argu men tos que los espe-ci fi ca dores de for mato indi ca dos en una lla mada a la fun ción For mat. Por ejem-plo, lo siguiente gene rará este men saje de error, debido a que hay tresespe ci fi ca do res de for mato, pero sola mente dos argu men tos han sidopro por cio na dos:

La bel1.Cap tion := For mat('Los %s de %s ga na rán la %s’, ['Bal ti mo re', ‘Se rie Mun dial']);

So lu ción rá pi daPro por cione un argu mento para cada espe ci fi ca dor de for mato que uti lice. Porejem plo, para solu cio nar el ejem plo de arriba, hágalo de esta manera:

Mensajes de error 393

Page 428: Dsp

La bel1.Cap tion := For mat('Los %s de %s ga na rán la %s’, [' Orioles', 'Bal ti mo re', ‘Se rie Mundial']);

Infor ma ción adi cio nalPara más infor ma ción, con sulte “For mat func tion”, “for mat spe ci fier”, y “for matstrings” en la ayuda de Del phi.

No code was generated for the current linePo si ble cau sa de error

1. Puede estar inten tando eje cu tar hasta la ubi ca ción del cur sor, pero selec-cionó Run | Run To Cur sor o pulsó F4 sobre una línea para la que no segeneró código. Por ejem plo, puede ser un enca be za miento de un pro ce di-miento (en lugar de una sen ten cia de asig na ción).

2. La línea en cues tión puede no haber gene rado código debido a que noestaba enla zada al pro yecto. Si el código no es lla mado, el enla za dor inte li-gente de Del phi lo dejará fuera para redu cir el tamaño del ejecutable. Porejem plo, si incluye el siguiente pro ce di miento en la uni dad:

pro ce du re TForm1.Dont CallUs;. . .

pero éste nunca es lla mado por otro pro ce di miento o fun ción, no será enla-zado al ejecutable, y nin gún código será gene rado para él.

3. Puede estar situado sobre una línea que de hecho genera código, pero launi dad no es parte del pro yecto actual. Puede ser que la uni dad en cues tiónno se encuen tre en la cláu sula Uses de nin guna de las uni da des que sonparte del pro yecto.

4. Puede ser que tenga una copia de una uni dad que está alma ce nada en unaubi ca ción dife rente que la copia de la uni dad que es parte del pro yecto. Porejem plo, puede tener una uni dad nom brada Usee que está alma ce nada enel direc to rio del pro yecto (por ejem plo, C:\User), pero ha abierto una copiade la uni dad Usee que está alma ce nada en un direc to rio dife rente (porejem plo, C:\UserB kup).

So lu ción rá pi da1,2.Borre el punto de rup tura (break point). Si lo desea, colo que el cur sor sobre

una línea de código en el pro yecto actual que genere código, como una sen-ten cia de asig na ción den tro de un pro ce di miento o fun ción que sea lla madaen el pro yecto.

3. Añada la uni dad a la cláu sula Uses de al menos una de las uni da des queson parte del pro yecto. Para aña dir una uni dad que exista en otra ubi ca-ción/direc to rio al pro yecto, selec cione Pro ject | Add to Pro ject. . . ,nave gue hasta la uni dad, selec ció nela y pulse el botón Open.

394 Los Tomos de Delphi: Delphi sin problemas

Page 429: Dsp

4. Cie rre la uni dad que está alma ce nada en una ubi ca ción dis tinta de la quese ha desig nado en el Ges tor de Pro yec tos (Pro ject Mana ger), y abra lacopia de la uni dad que reside en el direc to rio/loca li za ción correcto. Selec-cione View | Pro ject Mana ger para ver las uni da des inclui das en elpro yecto y su ubi ca ción.

Infor ma ción adi cio nal2. El enla za dor inte li gente de Del phi eli mina los pro ce di mien tos que no son

uti li za dos por el pro grama (a menos que sean méto dos vir tua les de unobjeto que es enla zado).

3,4.Para más infor ma ción, con sulte “Pro ject Mana ger” en la ayuda de Del phi.

No Databases Are Listed In Transaction ComponentPo si ble cau sa de error

Puede haber lla mado al método Start Tran sac tion de un com po nenteTIBTransac tion sin pri mero haber con fi gurado su pro pie dad Default Da ta base.

So lu ción rá pi daAsigne una base de datos por defecto al com po nente TIBTran sac tion antes della mar a cual quiera de sus méto dos, así:

IBTrans.De fault Da ta ba se := dm.IBDB;IBTrans.Start Tran sac tion;

Infor ma ción adi cio nalEn el código de arriba, IBTrans es un com po nente IBTran sac tion al que se leha asig nado en su pro pie dad Default Da ta base un com po nente TIBDa ta basedeno mi nado IBDB que reside sobre un módulo de datos llamado dm.

TIBTran sac tion y TIBDa ta base son com po nen tes IBX que apa re cen en lapágina Inter base de la Paleta de Compo nen tes y son uti li za dos en las apli ca cio-nes que acce den a la infor ma ción alma ce nada en bases de datos Inter Base (sinnece si dad del BDE). A par tir de Del phi 6, tam bién se tiene la opción de uti li zarlos com po nen tes DBExpress para acce der a Inter Base sin nece si dad del BDE.

No definition for abstract method <> allowedPo si ble cau sa de error

Puede haber defi nido un método que fue decla rado ante rior mente como abs-tracto en la misma uni dad. Por ejem plo, lo siguiente gene rará este men saje deerror:

Mensajes de error 395

Page 430: Dsp

pro ce du re VAndA; vir tual; abs tract;. . .pro ce du re TForm1.VAndA;var Spud Lo vers: string;be gin Spud Lo vers := 'Ben doc chi, Christy, Ro gers, Shan non';end;

So lu ción rá pi daBorre la defi ni ción de la fun ción o la direc tiva Abstract de la decla ra ción delmétodo.

Infor ma ción adi cio nalNo se puede defi nir un método abs tracto en la misma clase donde ha sido defi-nido. Abstracto sig ni fica que debe ser redefinido. Ya que debe ser rede fi nido,no puede haber una imple men ta ción en la clase base de un método abstractopara que un des cen diente la herede.

No fields defined—cannot create datasetPo si ble cau sa de error

Puede haber inten tado lla mar al método Crea te Da ta Set de TClient Da ta Set sinpri mero pro por cio nar el con junto de datos que debe crear — es decir, no haasig nado valo res a las pro pie da des Field Defs o Fields del TClient Da ta Set.

So lu ción rá pi daEspe ci fi que qué cam pos quiere que el con junto de datos con tenga antes deinten tar crearlo. Por ejem plo, puede seguir el patrón mos trado en el frag mentode código de abajo para defi nir los cam pos y luego crear el con junto de datos apar tir de esos cam pos. Un con junto de datos vacío será enton ces creadoexi to sa mente.

with Client Da ta Set1 do be gin with Field Defs.AddField Def do be gin Da taTy pe := ftString; Size := 58; Name := 'Cap tain Hum boldtEpi so de'; end; with Field Defs.AddField Def do be gin Da taTy pe := ftInte ger; Name := 'Capt Pabs tBa rrels';

396 Los Tomos de Delphi: Delphi sin problemas

Page 431: Dsp

end; with Index Defs.AddIndex Def do be gin Fields := 'Cap tain Hum boldtEpi so de'; Name := 'Cap tain Hum boldtEpi so deIn dex'; end; Crea te Da ta Set; end;

Infor ma ción adi cio nalComo se puede ver en el ejem plo de arriba, puede tam bién aña dir defi ni cio nesde índi ces al con junto de datos.

Ante rior mente el des cen diente TDa ta set “olvi dado”, TClient Da ta Set es indu da-ble mente (a par tir de Del phi 6) el más impor tante de todos.

No frames in projectPo si ble cau sa de error

Puede haber inten tado colo car un com po nente TFrame sobre un for mu la rioantes de crear un marco para el pro yecto.

So lu ción rá pi daSelec cione File | New Frame, y añada los com po nen tes que quiere uti li zar.Des pués podrá sol tar un com po nente TFrame sobre el for mu la rio.

Infor ma ción adi cio nalCuando colo que un com po nente TFrame sobre un for mu la rio (asu miendo que elpro yecto tenía al menos un marco creado), el diá logo Select Frame to Insertapa re cerá, mos trando una lista de los mar cos dis po ni bles.

No index currently activePo si ble cau sa de error

Puede haber inten tado lla mar a uno de los méto dos Find Key o Locate de uncon junto de datos sin espe ci fi car un índice por el que bus car.

So lu ción rá pi daAsigne un valor apro piado a la pro pie dad Index Name o Index Field Na mes delconjunto.

Mensajes de error 397

Page 432: Dsp

Infor ma ción adi cio nalSi está creando un con junto de datos mediante pro gra ma ción, uti lice el métodoAddIndex Def.

No MDI forms are currently activeCon sulte “Can not create form. No MDI forms are currently active”.

No MDI Parent ActivePo si ble cau sa de error

1. Puede haber olvi dado desig nar al for mu la rio prin ci pal de la apli ca ción MDIcomo el for mu la rio padre MDI.

2. Puede estar creando diná mi ca mente el for mu la rio MDI prin ci pal.

So lu ción rá pi da1. Asigne a la pro pie dad FormStyle del for mu la rio prin ci pal el valor

fsMDIForm.2. Per mita que Del phi cree auto má ti ca mente el for mu la rio prin ci pal. Este

debe ser creado antes que los for mu la rios hijos.

Infor ma ción adi cio nalLos pro gra mas de Inter faz de Múlti ples Docu men tos (MDI) son con si de ra dospasa dos de moda en Win dows de 32 bits. Por supuesto, no hay ninguna ley encon tra de lo pasado de moda.

No overloaded method of <> with this parameter list existsPo si ble cau sa de error

Puede haber inten tado lla mar a un método sobre car gado con un pará me tro ocon junto de pará me tros para los cuales no hay un método sobre car gado com pa-ti ble. Por ejem plo, lo siguiente gene rará este men saje de error:

func tion BTOSong(ANa me: String): Inte ger; over load;func tion BTOSong (ALengthInSe conds: Inte ger): String; over load;. . .s := BTOSong(3.36);

398 Los Tomos de Delphi: Delphi sin problemas

Page 433: Dsp

So lu ción rá pi daVeri fi que que los tipos de datos uti li zados cuando se hace una lla mada a unmétodo sobre car gado corres pon dan a alguna de las sig na tu ras del método.

Infor ma ción adi cio nalPuede decla rar cual quier número de méto dos sobre car ga dos, siem pre que todosten gan sig na tu ras úni cas. Por supuesto, pue den tener can ti da des dife ren tes depará me tros, así:

func tion BTOSong(ANa me: String): Inte ger; over load;func tion BTOSong (ALengthInSe conds: Inte ger): String; over load;func tion BTOSong(ANa me: String; ALength: Integer): Boo lean; over load;func tion BTOSong (ANa me: String; ALength: Dou ble): Boo lean; over load;

No Provider AvailablePo si ble cau sa de error

Puede haber asig nado la pro pie dad Data de una pro pie dad Pro vi der de unTDa ta Set a la pro pie dad Data de un TClient Da ta Set sin aña dir BDEProv a lasec ción Uses. Por ejem plo, lo siguiente gene rará este men saje de error (siBDEProv no está en la sec ción Uses):

pro ce du re TForm1.Form Crea te(Sen der: TObject);be gin Client Da ta Set1.Data := Table1.Pro vi der.Data;end;

So lu ción rá pi daAñada BDEProv a la sec ción Uses.

Infor ma ción adi cio nalLos pro vee do res son aso cia dos generalmente con MIDAS y apa re cie ron conDel phi 3. Si está uti li zando Del phi 3, ase gú rese que tenga la última actua li za-ción y/o par che para una fun cio na li dad plena y un mejor rendimiento. En par-ti cu lar y entre otras cosas, el archivo DBClient.DLL fue actua li zado ymejo rado a par tir de su ver sión 3.0.

Mensajes de error 399

Page 434: Dsp

No SQL statement availablePo si ble cau sa de error

1. Puede haber lla mado al método Pre pare de un TQuery, pero la pro pie dadSQL no tenía asig nada nin guna sen ten cia.

2. Puede haber inten tado aña dir cam pos a un com po nente TQuery uti li zandoel Edi tor de Cam pos sin pri mero haber asignado una sen ten cia SQL a lapro pie dad SQL del com po nente TQuery.

3. Puede haber lla mado al método Open o ExecSQL de un TQuery cuando lapro pie dad SQL estaba vacía.

4. Puede haber inten tado asig nar el valor True a la pro pie dad Active de uncom po nente TDe ci sion Query sin haber espe ci ficado pri mero una sen ten ciaSQL para la pro pie dad SQL.

5. Puede haber lla mado a Open o haber asig nado True a Active para un com-po nente TSQLQuery (DBExpress) que no tenía una sen ten cia SQLasig nada en su pro pie dad SQL.

So lu ción rá pi da1. Borre la lla mada a Pre pare o asigne una sen ten cia SQL al com po nente

TQuery en tiempo de diseño o en el código antes de lla mar a Pre pare.2. Asigne una sen ten cia SQL válida a la pro pie dad SQL del com po nente

TQuery antes de inten tar crear los cam pos en tiempo de diseño.3. Ase gú rese que sola mente llama al método ExecSQL de TQuery cuando la

pro pie dad SQL no está vacía. Por ejem plo, podría veri fi car esta con di cióncon el siguiente código:

pro ce du re TForm1.Exe cu teAndClearC lick(Sen der: TObject);be gin with Query1 do be gin

if SQL.Count <> 0 then be gin ExecSQL; SQL.Clear; end; end;end;

4. Pro por cione una sen ten cia SQL, en el entorno inte grado o en el código,para la pro pie dad SQL del objeto TDe ci sion Query.

5. Asigne una sen ten cia SQL a la pro pie dad SQL, en tiempo de diseño en elInspec tor de Obje tos o en tiempo de eje cu ción, antes de acti var el com po-nente TSQLQuery.

Infor ma ción adi cio nal1. Para aña dir una sen ten cia SQL a un com po nente TQuery en el código, siga

este ejem plo:

400 Los Tomos de Delphi: Delphi sin problemas

Page 435: Dsp

with Query1 do be gin SQL.Add('Se lect * from Round Ta ble Piz za');

SQL.Add('Whe re Kind = ‘'Ita lian Gar lic'’'); Pre pa re; {op cio nal} Open;

end;

Puede par tir la sen ten cia SQL en tan tas líneas como desee. Es reco men da-ble sepa rar la sen ten cia en las par tes lógi cas que la cons ti tu yen.

2. Las ven tajas de crear ins tan cias de los cam pos para un com po nenteTQuery son (a) que tiene acceso a las pro pie da des de los cam pos (inclu-yendo los ges to res de even tos, como OnVa li date) en tiempo de diseño, y (b)que puede crear cam pos cal cu la dos uti li zando el Edi tor de Cam pos. Paramás infor ma ción sobre la crea ción de cam pos cal cu la dos, con sulte “NewField dia log box” en la ayuda de Del phi.

No user transaction is currently in progressPo si ble cau sa de error

Puede haber lla mado al método Com mit de un com po nente TDa ta base sinhaber pri mero ini ciado una tran sac ción mediante una lla mada aStart Tran sac tion.

So lu ción rá pi daLlame a Start Tran sac tion antes de inten tar con fir mar las ope ra cio nes hechasdurante la tran sac ción.

Infor ma ción adi cio nalCon la uti li za ción de un com po nente TDa ta base, puede agru par un con junto deope ra cio nes sobre una base de datos en una tran sac ción, y luego con fir mar las orecha zar las como un todo. Ini cie una tran sac ción mediante Start Tran sac tion yluego llame a Com mit o Roll back en depen den cia de si quiere con ser var o des-car tar los cam bios o adi cio nes que rea lizó durante la tran sac ción.

He aquí un ejem plo sen ci llo de la uti li za ción de tran sac cio nes en bases dedatos:

be gin with Da ta ba se1 do be gin Start Tran sac tion;

try { Ha cer algo aquí } if { con di ción } then Com mit; else

Mensajes de error 401

Page 436: Dsp

Roll back; ex cept Roll back;

end; {blo que ex cept} end; {blo que with}end;

Para más infor ma ción sobre las tran sac cio nes de bases de datos, con sulte“hand ling tran sac tions” en la ayuda de Del phi.

No Web browser could be locatedPo si ble cau sa de error

Ha inten tado entrar a un sitio web o ver un docu mento .HTML, pero Del phi nopuede loca li zar un nave ga dor en el sis tema.

Por ejem plo, puede haber selec cio nado Bor land Home Page, Del phi Home Pageo Bor land Pro grams & Ser vi ces del menú Help de Delphi.

So lu ción rá pi daInstale un nave ga dor de Inte net. No lo mueva o borre del direc to rio en el queestá ins ta lado.

Infor ma ción adi cio nalEn algu nas ver sio nes de Del phi, Micro soft Inter net Explo rer es pro por cio nadoen el CD de Del phi. Si no tiene un nave ga dor y quiere uno, esta es una opción.El nave ga dor de Nets cape es otra opción atrac tiva. Adi cio nal mente, están dis-po ni bles otros nave ga do res, tanto comer cia les como free ware. Además, ustedpodría crear su pro pio nave ga dor uti li zando Del phi.

NODEFAULT clause not allowed in OLE automation sectionPo si ble cau sa de error

Puede haber uti li zado la cláu sula Node fault en una sec ción Auto ma ted.

So lu ción rá pi daLa cláu sula Node fault no es per mi tida en una sec ción Auto ma ted. Elimínela.

Infor ma ción adi cio nalDel phi 2 y pos te rio res tienen cinco direc ti vas de visi bi li dad: Pri vate, Pro tec ted,Public, Publis hed y Auto ma ted (la direc tiva Auto ma ted no estaba dis po ni ble enDel phi 1). A las pro pie da des de una clase se pueden aso ciar las cláu su las

402 Los Tomos de Delphi: Delphi sin problemas

Page 437: Dsp

Stored, Default o Node fault como direc ti vas de alma ce na miento. Estas direc ti-vas de alma ce na miento no están per mi ti das en la sec ción Auto ma ted.

Not enough actual parametersPo si ble cau sa de error

1. Puede haber lla mado a un pro ce di miento o fun ción sin pro por cio nar todoslos pará me tros nece sa rios. Por ejem plo, puede haber inten tado algo así:

Mes sa geDlg('Eat at Joe''s', mtCus tom, [mbOK]);{ Olvi dó aña dir el cuar to pa rá me tro (HelpCtx) }

2. Puede estar inten tando rede fi nir un método de la clase ances tro, pero noha pro por cio nado todos los pará me tros decla ra dos en el ances tro. Por ejem-plo, lo siguiente gene rará este men saje de error, ya que el cons truc tor queestá siendo rede fi nido declara un pará me tro como de tipo TCom po nent:

type TYoopdl = class(TCom po nent) pri va te FOuts tan ding: string;

pu blic cons truc tor Crea te; ove rri de; end;. . .cons truc tor TYoopdl.Crea te;be gin in he ri ted Crea te; {esta lí nea oca siona el error} FOuts tan ding := 'yow za-bop';end;

3. Puede estar inten tando revi sar si un ges tor de even tos está asig nado a unapro pie dad de evento compro bando si su valor es Nil, así:

if TrueI den tity.OnVa li da te = nil then

4. Puede haber uti li zado un punto y coma en una lla mada a un pro ce di mientoo fun ción. Por ejem plo:

rptMo du le.Print Re port(Pro gram Mo de, sOut Fi le Na me; sStart Da te, sEndDa te, sDays Pre vious, iUp da teOp tion);

So lu ción rá pi da1. Pro por cione los pará me tros que fal tan. Por ejem plo, para solu cio nar el pro-

blema de arriba, añada el pará me tro final, así:

{Debe propor cio nar el pa rá me tro, aun que no haya un tema de ayu da}Mes sa geDlg('Eat at Joe''s’, mtCus tom, [mbOK], 0);{Si hay un ID de con tex to de ayu da, por ejem plo #11, po dría ha cer esto:}

Mensajes de error 403

Page 438: Dsp

Mes sa geDlg('Eat at Joe''s’, mtCus tom, [mbOK, mbHelp], 11);

2. Borre la lla mada a Inhe ri ted de la defi ni ción del cons truc tor si lo que deseaes crear un nuevo cons truc tor, en lugar de rede fi nir el cons truc tor deTCom po nent. Para rede fi nir el cons truc tor de TCom po nent, añada el pará-me tro a la decla ra ción, defi ni ción y lla mada, así:

cons truc tor Crea te(AOwner: TCom po nent);. . .cons truc tor TCmpntDes cen dent.Crea te(AOwner: TCom po nent);be gin in he ri ted Crea te(AOwner); . . .

3. Uti lice la fun ción Assig ned para hacer la comprobación, así:

if not Assig ned(TrueI den tity.OnVa li da te) then

4. Sus ti tuya el punto y coma por una coma:

rptMo du le.Print Re port(Pro gram Mo de, sOut Fi le Na me, sStart Da te, sEndDa te, sDays Pre vious, iUp da teOp tion);

Infor ma ción adi cio nal1. Selec cione el nom bre de la fun ción en el código y pulse <F1> para ver la

ayuda (en la que podrá ave ri guar la can ti dad, tipos y orden de los pará me-tros espe ra dos).

2. El cons truc tor de TObject no tiene pará me tros. Sin embargo, el cons truc torde TCom po nent sí tiene un pará me tro. Vea la decla ra ción de TObject en launi dad System y la decla ra ción de TCom po nent en la uni dad Clas ses paralos deta lles más espe cí fi cos.

Not enough file handlesPo si ble cau sa de error

Puede tener más apli ca cio nes/archi vos abier tos de los que el sis tema es capazde manejar.

So lu ción rá pi daIncre mente el pará me tro Files en el archivo CONFIG.SYS. Incre méntelo a unnúmero entre su valor actual y 255.

Incre men tar el pará me tro Max Fi le Hand les en el nodo/página System de la uti-li dad BDE Con fi gu ra tion a un número un poco menor del que asignó en Filesen el archivo CONFIG.SYS .

404 Los Tomos de Delphi: Delphi sin problemas

Page 439: Dsp

Infor ma ción adi cio nalLas tablas Para dox con stan de varios archi vos rela cio na dos, como .DB, .MB,.PX, .Xnn, .Ynn, etc. Varios de estos archi vos puede estar abier tos simul tá nea-mente, y cada uno nece sita su pro pio manejador.

Not exact read/write in <>.mb and <>.mbPo si ble cau sa de error

Puede tener una tabla dañada.

So lu ción rá pi daRecons truya la tabla uti li zando TUti lity.

Infor ma ción adi cio nalSi no tiene la uti li dad TUti lity, puede obte nerla en:

http://www.bor land.com/dev sup port/bde/files/tutil32d.zip

Not in cached update modePo si ble cau sa de error

Puede estar inten tando acce der a la pro pie dad OldVa lue de un regis tro, pero lapro pie dad CachedU pda tes del Data Set tiene asig nado el valor False.

So lu ción rá pi daAsigne True a la pro pie dad CachedU pda tes del con junto de datos antes deinten tar acce der a la pro pie dad OldVa lue de un regis tro.

Infor ma ción adi cio nalPuede ase gu rarse mediante pro gra ma ción de que CachedU pda tes tiene el valorTrue de esta manera:

if Ta ble1.Ca chedU pda tes = True then Clas sic Val := OldVa lue;

Podría tam bién si lo desea veri fi car que el regis tro no es nuevo, en cuyo casono ten dría un valor ante rior:

if (Ta ble1.Ca chedU pda tes = True) and (Ta ble1.Sta te <> dsInser ting) then Le gacy Val := OldVa lue;

Mensajes de error 405

Page 440: Dsp

Con sulte “At End of Table” para más infor ma ción.

Not initialized for accessing network filesPo si ble cau sa de error

1. Puede tener una con fi gu ra ción invá lida en el archivo IDAPI.CFG en rela-ción con la ubi ca ción del direc to rio del archivo de con trol de red.

2. Puede tener una con fi gu ra ción invá lida en WIN.INI o en el Regis tro delsis tema en rela ción con la ubi ca ción del archivo de con fi gu ra ción del BDE(IDAPI.CFG).

So lu ción rá pi da1. Asigne al pará me tro Net Dir en la sec ción Dri vers | Para dox de la uti li dad

BDE Con fi gu ra tion un direc to rio de red com par tido sobre el que todos losusua rios que acce de rán a las tablas ten gan dere chos de lec tura, escri tura ycrea ción.

2. Siga las ins truc cio nes espe cí fi cas para su ver sión de Del phi:

Delphi 1

Com pruebe que la línea CONFIGFILE01= de la sec ción [IDAPI] del archivoWIN.INI apunte a la ubi ca ción correcta. Por ejem plo, si el archivo de con fi gu-ra ción del BDE IDAPI.CFG está ubi cado en C:\IDAPI (el valor por defecto), lasec ción se lee ría:

[IDAPI]Con fig Fi le01=C:\IDAPI

Si es nece sa rio, mueva el archivo para que su ubi ca ción coin cida con lo indi-cado por la entrada en WIN.INI, o modi fi que la entrada de WIN.INI para queapunte a la ubi ca ción actual del archivo.

Delphi de 32 bits

Veri fi que que la ubi ca ción de IDAPI32.CFG (por defecto C:\Archi vos de pro-grama\Bor land\Com mon files\BDE) coin cida con la que se indica en el Regis-tro del sis tema.

Si es nece sa rio, mueva el archivo para que su ubi ca ción coin cida con lo indi-cado por la entrada del Regis tro, o modi fi que la entrada del Regis tro para queapunte a la ubi ca ción actual del archivo.

Infor ma ción adi cio nalEl direc to rio de red con tiene el archivo PDOXUSRS.NET, que con trola elacceso a las tablas y admi nis tra los blo queos.

406 Los Tomos de Delphi: Delphi sin problemas

Page 441: Dsp

Para asig nar un valor a NET DIR con la uti li dad BDE Con fi gu ra tion/Admi nis-tra tion, siga estos pasos:1. Cree un direc to rio sobre una uni dad de red com par tida al que todos los

usua rios que acce de rán a las tablas de bases de datos ten gan dere chos delec tura, escri tura y crea ción.

2. Asigne el direc to rio creado en el paso 1 como valor del pará me tro Net Diren cada archivo de con fi gu ra ción del BDE de los usua rios, mediante la uti-li dad BDE Con fi gu ra tion o direc ta mente en el Regis tro del sis tema).

Cómo crear un Alias utilizando la herramienta de Configuración del BDE

En Del phi 1, la herra mienta de con fi gu ra ción de BDE es BDECFG.EXE. EnDel phi 2, es BDECFG32.EXE. En Del phi 3 y 4 es BDEADMIN.EXE. En Del phi5 y 6 es DBEXPLOR.EXE. En Win dows 95 y pos te rio res, está dis po ni ble selec-cio nando Ini cio | Pro gra mas | Bor land Del phi X | BDE Admi nis tra tor.

Para crear un alias con la herra mienta BDE Con fi gu ra tion/Admi nis tra tion,siga estos pasos:1. Selec cione Ini cio | Pro gra mas | Bor land Del phi X | BDE [Con fi gu ra-

tion, Admi nis tra tion].2. Con la pes taña Data ba ses activa, selec cione Object | New. . . y luego indi-

que el tipo de alias que desea crear (por ejem plo, Stan dard para una basede datos Para dox).

3. Veri fi que que el pará me tro Type se corres ponda con el tipo de base dedatos que quiere crear o creará (Stan dard para Para dox, dBASE, y ASCII,Access para MS Access, etc.).

4. Si selec ciona el con tro la dor Stan dard (para crear una base de datos Para-dox, por ejem plo), asigne al pará me tro Path la ubi ca ción de la base dedatos (Ser ver Name para Inter Base y Ora cle; Data ba se Name para MS SQLSer ver y MS Access, Sybase, e Infor mix; DB2 DS2 para DB2). Si uti lizaPath, puede intro du cir una ruta DOS, así:

I:\Less Ta ken\Diff

5. Asigne a Path la ubi ca ción de la base de datos. Puede intro du cir una rutaDOS, así:

K:\HallOfFa me\Ba se ball

o, en Del phi de 32 bits, puede uti li zar el con ve nio de nom bres UNC (Uni-ver sal Naming Con ven tion), que tiene este for mato:

\\Ser vi dor\Re cur so\Directorio

Mensajes de error 407

Page 442: Dsp

Number is out of rangePo si ble cau sa de error

1. Puede haber inten tado aña dir un índice pri ma rio a una tabla que ya tieneuna clave pri ma ria defi nida.

2. Puede estar inten tando crear un índice pri ma rio sobre un campo que no esel pri mer campo de la tabla.

So lu ción rá pi da1. Sola mente puede tener un índice pri ma rio por tabla. Puede aña dir índi ces

secun da rios en el código a las tablas dBASE y Para dox 7, pero no a lastablas Para dox 3.5, 4 ó 5.

2. Uti lice como índice pri ma rio sola mente el pri mer campo de la tabla. En elcaso de un índice/clave pri ma ria com puesta, los cam pos deben ser los pri-me ros de la tabla (con se cu ti vos, empe zando por el pri mer campo).

Infor ma ción adi cio nalEste es un error de tipo EDa ta ba seEn gine. Si una tabla ya tiene una clave pri-ma ria (reque rida para una tabla Para dox), lo siguiente pro du cirá este men sajede error:

Ta ble1.AddIndex('P2','RedG reenB lue',[ixP ri mary]);

Si está uti li zando una tabla de Para dox 7, puede, sin embargo, crear índi cesúni cos adi cio na les, así:

Ta ble1.AddIndex('U2','Irish Roc kers',[ixU ni que]);

Si no está uti li zando una tabla de Para dox 7 y prueba lo ante rior, obten drá elmen saje de error “Hig her table level requi red”. Con sulte esta entrada paramás infor ma ción.

Las opcio nes de índice que puede asig nar en el pará me tro final son ixP ri mary,ixU ni que, ixDes cen ding, ixCa seIn sen si tive y ixExpres sion. No puede uti li zarixP ri mary o ixCa seIn sen si tive en el caso de una tabla dBASE. No puede uti li-zar ixExpres sion para una tabla Para dox.

Number of elements differs from declarationPo si ble cau sa de error

Puede haber decla rado un array de cons tan tes con tipo, pero ha pro por cio nadouna can ti dad de ele men tos dife rente de los decla ra dos. Por ejem plo, lassiguien tes dos decla ra cio nes gene ra rán este men saje de error:

{No se pro por cio nan su fi cien tes ele men tos}

408 Los Tomos de Delphi: Delphi sin problemas

Page 443: Dsp

const Lea ding Lea ding Men: array[0..4] of string = ('Bran do','Bo gart','De Ni ro','Du vall');{ De ma sia dos ele men tos pro por cio na dos }const Lea ding Lea ding Men: array[0..4] of string = ('Bran do', 'Bo gart', 'De Ni ro', 'Du vall', 'Peck', 'Si ni se');

So lu ción rá pi daCam bie el tamaño del array que está decla rando, o añada o eli mine la can ti dadnece saria de ele men tos.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “arrays” en la ayuda de Del phi.

Object Factory for TwebResponse MissingPo si ble cau sa de error

Puede estar haciendo refe ren cia a un método de la inter faz Web bro kers cript,pero su biblio teca de tipos no ha sido regis trada.

So lu ción rá pi daRegis tre la biblio teca de tipos de Webbro kers cript. Detenga y rei nicieSRVINFO.EXE.

Infor ma ción adi cio nalPuede regis trar WEBBROKERSCRIPT.TLB selec cio nando la opción Ini cio |Ejecutar de Win dows y luego intro du ciendo el comado tregsvrWEBBROKERSCRIPT.TLB.

Site Express apa re ció por pri mera vez con Del phi 6.

Object or class type requiredPo si ble cau sa de error

Puede estar inten tando lla mar a un método de un tipo que no es un objeto oclase. Por ejem plo, lo siguiente gene rará este men saje de error:

type TNum ber Wit hout De ci mal Points = Inte ger;. . .pro ce du re TForm1.Wha te ver Du de(Sen der: TObject);

Mensajes de error 409

Page 444: Dsp

var s: String; tnwdp: TNum ber Wit hout De ci mal Points;be gin tnwdp := 8; s := TNum ber Wit hout De ci mal Points.AsString;

So lu ción rá pi daSus ti tuya el tipo pro ble má tico por un objeto o tipo de clase.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “objects”, “clas ses”, y “types” en la ayuda deDel phi.

OLE error 800A03ECPo si ble cau sa de error

Puede estar uti li zando Micro soft Excel y ha inten tado asig nar un valor a lascel das de una hoja de Excel antes de aña dir una hoja de tra bajo. Por ejem plo,lo siguiente gene rará este men saje de error:

pro ce du re TForm1.But ton1 Click(Sen der: TObject);var xl: Ole Va riant; pro ce du re Set Co lumn Tit les; be gin xl.Cells[1,1].Va lue := 'ORDER NUM'; xl.Cells[1,2].Va lue := 'VENDOR'; end;be gin xl := Crea teOLEObject('Excel.Appli ca tion'); Set Co lumn Tit les; xl.Work books.Add;end;

So lu ción rá pi daAñada el cua derno (work book) antes de inten tar aña dir valo res a las cel das:

. . . be gin xl.Work books.Add; Set Co lumn Tit les; xl.Vi si ble := True; end;

410 Los Tomos de Delphi: Delphi sin problemas

Page 445: Dsp

Infor ma ción adi cio nalDel phi 5 y supe rio res hacen más fácil el uso de los ser vi do res COM como Word,Excel, Access, Power Point y Out look a tra vés de los com po nen tes de la páginaSer vers. Los obje tos de Auto ma ti za ción no serán visi bles por defecto, por lotanto deberá asig nar True a la pro pie dad Visi ble si quiere que apa rez can enpantalla.

One or more lines were too long and have been truncatedPo si ble cau sa de error

1. Puede haber ini ciado, qui zás inad ver ti da mente, varias ins tan cias deDel phi.

2. Puede haber inten tado abrir un archivo que no es de Del phi en el entornointe grado. Por ejem plo, puede haber selec cio nado File | Open..., luegohaber selec cio nado Any File (*.*) en el cua dro de com bi na ción de tipos defichero, y luego haber inten tado abrir un archivo .DOC (Micro soft Word).

So lu ción rá pi da1. Cie rre todas las ins tan cias inne ce sa rias de Del phi.2. Abra el archivo que no es de Del phi con el pro grama apro piado o desde el

Explo ra dor de Win dows.

Infor ma ción adi cio nalPodría ver este men saje de error si selec ciona muchos archi vos de Del phi en elExplo ra dor y luego acci den tal mente pulsa dos veces en rápida suce sión sobreuno de los archi vos. Esto, en efecto, eje cuta la acción de doble clic sobre todoslos archi vos resal ta dos, y una ins tan cia de Del phi indi vi dual es ini ciada paracada archivo.

Puede tam bién obte ner el men saje de error “Module <>s time/date chan ged.Reload?” con jun ta mente con el men saje de error bajo dis cu sión.

Only one of a set of overloaded methods can be publishedPo si ble cau sa de error

Puede haber decla rado varios métodos sobre car gados en una sec ción Publis hed.Por ejem plo, lo siguiente gene rará este men saje de error:

. . .pu blis hed pro ce du re yoopdl(tl: TThread List); over load; pro ce du re yoopdl(tl: TList; ol: TObject List); over load;

Mensajes de error 411

Page 446: Dsp

So lu ción rá pi daMueva uno a ambos méto dos sobre car ga dos a un alcance de visi bi li dad menor(Public, Protec ted o Private).

Infor ma ción adi cio nalLa direc tiva Over load per mite crear múl ti ples méto dos con un mismo nom bre ycan ti dad o tipos de pará me tros dife ren tes. Estos pue den ser espe cial menteútiles cuando uno o más de los pará me tros es inne ce sa rio en situa cio nes par ti-cu la res: puede crear una ver sión “com pleta” del método, y una o más quepuedan ser lla madas con un número de pará me tros menor. Un ejem plo de estosería:

func tion GetS crip tu re(ABook, AChap ter, Aver se: String): String; over load;func tion GetS crip tu re(ABook, Aver se: String): String; over load;

Only one TIDAntiFreeze can exist per applicationPo si ble cau sa de error

Puede haber aña dido múl ti ples com po nen tes TIDAntiF reeze a una apli ca ción,o puede haber colo cado uno sobre un for mu la rio y haber creado una segundains tan cia del for mu la rio en tiempo de eje cu ción.

So lu ción rá pi daUti lice a lo sumo un com po nente TIDAntiF reeze por apli ca ción. No colo que unosobre un for mu la rio que pueda ser creado varias veces.

Infor ma ción adi cio nalUn buen lugar para un com po nente TIDAntiF reeze es un módulo de datos.Aún si la apli ca ción no es una apli ca ción de base de datos, los módu los de datosson úti les como alma ce nes de com po nen tes no visi bles com par ti dos. Podríaencon trar con ve niente pen sar en los módu los de datos, por lo tanto, comomódu los de com po nen tes “no visua les”.

TIDAntiF reeze es parte del juego de com po nen tes Inter net Direct (Indy), cono-cido como Wins hoes en una ver sión ante rior. Inter net Direct se ha con ver tidoen parte tanto de Del phi 6 como de Kylix.

La carac te rís tica prin ci pal en la que Inter net Direct difiere de AsyncPro (dis-tri buido por Dany soft) es que, como su nom bre implica, AsyncPro tra bajaasín cron ca mente (sin blo queo), mien tras Inter net Direct es sín crono (con blo-queo). El modelo de sin cro nismo o de blo queo tiene poten cial mente un aspectonega tivo, ya que nor mal mente una ope ra ción aca para todo el tiempo de CPUhasta que ter mina, haciendo que la inter faz de usua rio no responda. El

412 Los Tomos de Delphi: Delphi sin problemas

Page 447: Dsp

pro pó sito de TIDAntiF reeze es resol ver ese pro blema — que su apli ca ción no se“con gele”.

Los pro gra ma do res de Inter net Direct se lla man a sí mis mos “la tri pu la ción deIndy”, y por lo tanto el tér mino “Anti con ge lante” se ajusta bien al tema gene raldel pro ducto.

Only register calling convention allowed in OLE automation sectionPo si ble cau sa de error

Puede haber espe ci fi cado un con ve nio de lla mada dis tinto de Regis ter en lasec ción Auto ma ted de la clase. Por ejem plo, lo siguiente gene rará este men sajede error:

au to ma ted pro ce du re Blip; stdcall;

So lu ción rá pi daNo espe ci fi que un con ve nio de lla mada dife rente de Regis ter (el con ve nio pordefecto) en una sec ción Auto ma ted.

Infor ma ción adi cio nalLa sec ción Auto ma ted apa re ció por pri mera vez con Del phi 2 y per dió apoyo enlas ver sio nes pos te rio res de Del phi. Se man tiene prin ci pal mente porcom pa ti bi li dad.

Operation not allowed on a unidirectional datasetPo si ble cau sa de error

1. Puede haber conec tado un con junto de datos de DBExpress direc ta mente aun DBGrid a tra vés de la pro pie dad Data Source del DBGrid, y luegointentó des pla zarse hacia atrás por el con junto resul tado en la rejilla.

2. Puede haber inten tado moverse hacia atrás por un con junto de datos cuyapro pie dad Uni di rec tio nal tiene asig nado True.

So lu ción rá pi da1. Conecte el DBGrid a un Client Da ta Set conec tado a un Data SetP ro vi der

que a su vez esté conec tado al con junto de datos de DBExpress.2. Asigne False a la pro pie dad Uni di rec tio nal.

Mensajes de error 413

Page 448: Dsp

Infor ma ción adi cio nal1. Si se conecta al con junto de datos DBExpress indi rec ta mente (a tra vés del

Client Da ta Set), podrá des pla zarse por el con junto resul tado en cual quierdirec ción. La tec no lo gía MIDAS está “por doquier” en DBExpress.DBExpress fue intro du cido en Del phi 6.

2. Si está relle nando una reji lla de base de datos, puede que desee asig narFalse a la pro pie dad Uni di rec tio nal del con junto de datos. De otra manera,si es posi ble, es una opti mi za ción asig nar el valor True a Uni di rec tio nal.

Operation not allowed on sorted string listPo si ble cau sa de error

1. Puede haber inten tado un ope ra ción de fil tro invá lida sobre un campo detipo String. Por ejem plo, puede haber asig nado a la pro pie dad Fil ter de unTDa ta set algo así:

com mon_name > grap hic

2. Puede haber inten tado asig nar un valor a una lista de cade nas orde nada.Por ejem plo, lo siguiente gene rará este men saje de error:

slTemp := TString List.Crea te; try TString List(slTemp).Sor ted := True; { Crear una lis ta de li mi ta da por pun tos y co mas (cam pos) y tildes (re gis tros)} i := 0; whi le i < Pred(sl.Count) do be gin slTemp.Add(For mat('%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 con te ni do de sl ha sido mo vi do a slTemp. Va ciar sl para que pue da re ci bir de nue vo el con te ni do or de na do. } sl.Clear; { Ana li zar las lí neas or de na das de slTemp y de vol ver las a sl } for j := 0 to Pred(slTemp.Count) do whi le (Pos('~',slTemp[j]) > Pos(';',slTemp[j])) do if Pos(';',slTemp[j]) > 0 then be gin 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])));

414 Los Tomos de Delphi: Delphi sin problemas

Page 449: Dsp

So lu ción rá pi da1. Sola mente uti lice expre sio nes de fil tros lógi cas (como es razo na ble). En el

ejem plo de arriba, un valor de cadena es com pa rado con un grá fico. Esto esiló gico (no tiene sen tido).

2. Asigne False a la pro pie dad Sor ted antes de inten tar esta ope ra ción:

TString List(slTemp).Sor ted := Fal se;

Infor ma ción adi cio nalSi la lista orde nada de cade nas real mente nece sita una ope ra ción, llévela alHos pi tal Gene ral de Bit buc ket ;-)

Operation not applicablePo si ble cau sa de error

1. Puede estar desa rro llando una apli ca ción mul ti capa y está uti li zando unacopia anti gua de DBClient.DLL.

2. Puede estar inten tando acce der a la pro pie dad Record Count sin haber pri-mero lla mado al pro ce di miento Last del TQuery.

3. Puede haber incluido un campo memo en una con sulta, por ejem plo:

SELECT STRINGFIELD, INTEGERFIELD, AMEMOFIELDFROM SIMTABLE

4. Puede haber cons truido una apli ca ción CGI que uti liza el BDE y hay dema-sia dos usua rios con cu rren tes.

5. Puede haber asig nado una cadena nula a un pará me tro de con sulta. Porejem plo, si la varia ble HungryFor en el código siguiente con tiene unacadena vacía, podría obte ner este error en la línea Open:

Pa rams.Pa ramB yNa me('Food').AsString := HungryFor;Open;

So lu ción rá pi da1. Actua lí cese a la última ver sión dis po ni ble del BDE para su ver sión de

Del phi.2. Llame a Query.Last antes de acce der a la pro pie dad Record Count. Por

ejem plo:

. . .var Re trie ved: Inte ger;be gin

Mensajes de error 415

Page 450: Dsp

with qryQuarry do be gin Open; Last; Re trie ved := Re cord Count; . . . Clo se; end;end;

3. Eli mine el campo memo de la sen ten cia SELECT de SQL.4. Con vierta la apli ca ción CGI en una apli ca ción ISAPI.5. Asigne un valor válido al pará me tro. De otra manera, veri fi que esta con di-

ción y evite el fallo del pro ce di miento, así:

Pa rams.Pa ramB yNa me('Food').AsString := HungryFor;if HungryFor = '' then be gin Exit; Show Mes sa ge(‘You must not be hungry’);end;

Infor ma ción adi cio nalLas apli ca cio nes cliente mul ti capa (lige ras) requie ren que DBClient.DLL seadis tri buido a todas las máquinas que estén eje cu tando la apli ca ción cliente. Alo que antes se lla maba DBClient.DLL se le cam bió el nom bre a MIDAS.DLL aa par tir de Del phi 5.4. Del phi 6 tiene una ter cera opción dis po ni ble— las apli ca cio nes Web de

Apa che.

Operation not supportedPo si ble cau sa de error

1. Si obtiene este men saje de error en rela ción con una con sulta, eso nor mal-mente indica algún error en la sin ta xis de la sen ten cia SQL.

2. Puede estar uti li zando parén te sis en lugar de cor che tes al indizar unarray. Por ejem plo, lo siguiente gene rará este error si ha decla rado unarray lla mado Synergy:

i := Synergy(0);

3. Puede haber aña dido un nuevo alias al SQL Explo rer y ha inten tadoexpan dirlo antes de gra bar los cam bios.

416 Los Tomos de Delphi: Delphi sin problemas

Page 451: Dsp

So lu ción rá pi da1. Exa mine la sen ten cia SQL dete ni da mente. Con sulte la docu men ta ción de

la base de datos que esté uti li zando. La sin ta xis difiere entre las dis tin tasimple men ta cio nes.

2. Recuerde ence rrar los índi ces de arrays entre cor che tes, así:

i := Synergy[0];

3. Pulse con el botón dere cho sobre el alias y selec cione Apply; luego intenteexpan dir el alias de nuevo.

Infor ma ción adi cio nal1. Los erro res comu nes de sin ta xis SQL son:

Utilizar apóstrofes donde se necesitan comillas dobles (y viceversa). Olvidar colocar los nombres de las tablas en mayúsculas (donde esto

es requerido por el tipo particular del SQL que esté utilizando).

Operator not applicable to this operand typePo si ble cau sa de error

1. Puede haber inten tado uti li zar un ope ra dor apli ca ble sola mente a ente rossobre ope ran dos de punto flo tante, o vice versa. Por ejem plo, lo siguientegene rará este men saje de error:

pro ce du re TForm1.Ta ble1 Calc Fields(Da ta Set: TDa ta Set);{ los cam pos son cam pos TFloat; Per cen ta ge es un cam po cal cu la do}be gin Ta ble1 Per cen ta ge.Value := Ta ble1M ySa lary DIV Ta ble1AllThe Mo neyInThe World;end;

2. Puede haber rea li zado al revés la com pro ba ción de per te nen cia de un ele-mento a un con junto. Por ejem plo, obten drá este men saje de error sicodi fica lo siguiente:

if [dsEdit, dsInsert] in Sta te then . . .

3. Puede haber inad ver ti da mente uti li zado dos sig nos más (+) para con ca te-nar cadenas. Por ejem plo, lo siguiente gene rará este men saje de error:

var s:string;. . .s := 's'++'t';

4. Puede haber inten tado hacer una asig na ción a tra vés de un pun tero sintipo, así:

. . .

Mensajes de error 417

Page 452: Dsp

var p: poin ter;be gin p^ := 5;

-O-

type TParty = (Bos ton, Del Fue gos, JGeils);var Just Anot her Band: TParty; Brad ley Delp: poin ter;be gin Just Anot her Band := Bos ton; Brad ley Delp^ := Just Anot her Band;

5. Puede estar lla mando a un pro ce di miento como si fuera una fun ción quedevuelve un valor Boo lean. Por ejem plo, puede estar lla mando a un pro ce-di miento deno mi nado Vali da teS tate así:

if not Va li da teS ta te then

6. Puede haber inten tado uti li zar los ope ra do res Is o As sobre uno o más ope-ran dos de tipo Variant. Por ejem plo, si GoodE nough y WellAndGood sonvaria bles de tipo Variant, cual quiera de los siguien tes frag men tos de códigogene rará este men saje de error:

if GoodE nough is WellAndGood then . . .if GoodE nough is Inte ger then...with GoodE nough as WellAndGood do...with WellAndGood as Boo lean do...

7. Puede haber estado inten tando asig nar el resul tado de una expre sión detipo Boo lean que uti liza el ope ra dor Not a una varia ble o pro pie dad de tipoBoo lean, y olvidó ence rrar la expre sión que será eva luada entre parén te sis.Por ejem plo, lo siguiente gene rará este men saje de error:

btnNew.Ena bled := not Cu rrent Mo de = Res trict;

So lu ción rá pi da1. No uti lice Div sobre valo res de tipo float; utilice / en su lugar:

. . .Ta ble1 Per cen ta ge.Va lue := Ta ble1M ySa lary.Va lue / Ta ble1AllThe Mo neyInThe World.Va lue;. . .

2. Hágalo de esta manera:

if Sta te in [dsEdit, dsInsert] then . . .

3. Borre el signo (+) adi cio nal del código.4. Uti lice un tipo de pun tero con tipo, así:

pro ce du re That WasA Good;

418 Los Tomos de Delphi: Delphi sin problemas

Page 453: Dsp

type iptr = ^Inte ger;var i,j: in te ger; p: poin ter; q: iptr;be gin p := @i; q := p; q^ := j; i := q^;end;

-O-

type TParty = (Bos ton, Del Fue gos, JGeils);var Just Anot her Band: TParty; TomS cholz: ^TParty;be gin Just Anot her Band:=Bos ton; TomS cholz^ := Just Anot her Band;

5. Llame al pro ce di miento direc ta mente o cam bie el pro ce di miento por unafun ción que devuelva un valor Boo lean.

6. No uti lice los ope ra do res Is o As sobre ope ran dos Variant.7. Encie rre la expre sión Boo lean a negar entre parén te sis, así:

btnNew.Ena bled := not (Cu rrent Mo de = Res trict);

Infor ma ción adi cio nal3. Dos sig nos más con se cu ti vos (++) son uti li za dos en el len guaje de pro gra-

ma ción C como ope ra dor de incre mento. Qui zás C++ debe ría ser leído como“C incre men tado” (en lugar de “C más más”).

6. Es tam bién ile gal uti li zar el ope ra dor ^ sobre ope ran dos Variant.Para más infor ma ción, con sulte “ope ra tors” en la ayuda de Del phi.

ORA-1001 invalid cursorPo si ble cau sa de error

Lo siguiente podría 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 más de un parámetro.

Mensajes de error 419

Page 454: Dsp

Uno de los parámetros es un REF CURSOR.

So lu ción rá pi daEn el edi tor de pará me tros, asíg nele al REF CURSOR un valor por defecto de0.

Infor ma ción adi cio nalSi el único pará me tro del pro ce di miento alma ce nado es un REF CURSOR, esteerror no es gene rado.

Order of fields in record constant differs from declarationPo si ble cau sa de error

Puede haber decla rado una cons tante con tipo (varia ble ini cia li zada) que ini-cia liza a los miem bros de un regis tro en un orden dis tinto del de la decla ra cióndel regis tro. Por ejem plo, lo siguiente gene rará este men saje de error.

Type TTres Hom bres = re cord Z: String; Zee: String; Top: String; end;var Tres Hom bres : TTres Hom bres = (Zee: 'Billy'; Z: 'Dusty'; Top: 'Frank');

So lu ción rá pi daIni cia lice los valo res en el mismo orden en que apa re cen en la decla ra ción Type(regis tro):

var Tres Hom bres : TTres Hom bres = (Z: 'Dusty'; Zee: 'Billy'; Top: 'Frank');

Infor ma ción adi cio nalComo se sobreen tiende, las cons tan tes con tipo son real mente varia bles ini cia-li za das, aun que sean decla ra das en sec cio nes Const.

420 Los Tomos de Delphi: Delphi sin problemas

Page 455: Dsp

Ordinal type requiredPo si ble cau sa de error

Puede haber uti li zado un tipo no ordi nal en un lugar o situa ción donde un tipoordi nal es reque rido. Cual quiera de los siguien tes ejem plos gene rará este men-saje de error:

{ a }type Gi lli gansIsland = 'Gin ger'..'MaryAnne';{ b }var i: Inte ger; s: String;be gin for i := 0 to Col Count-1 do strgrd.Cells[i,s];{ c }Type Good Vie wing = set of string;{ d }var Six Pack: string;be gin case Six Pack of 'Pils ner Urquell':'Czech Re pu blic'; 'Lam bic':'Bel gium'; 'Becks':'Ger many'; 'Guin ness Stout':'Ire land'; 'Spre chers': 'USA';

So lu ción rá pi daUti lice úni ca mente tipos ordi na les en las situa cio nes de arriba. Por ejem plo,todo lo siguiente es legal:

{ a }type TGi lli gansIsland = (Gin ger, MaryAnne, Pro fes sor, Gi lli gan, Skip, MrHo well, MrsHo well);{ b }var i,j: Inte ger;be gin for i := 0 to Col Count-1 do strgrd.Cells[i,j];{ c }Type TChop pers = set of byte;{ d }pro ce du re Get La bel(Wi neC hoi ce: TDryRed Wi ne);

Mensajes de error 421

Page 456: Dsp

var Eti kett: String;be gin case Wi neC hoi ce of Zin fan del: Eti kett := 'Ste ve not'; Ca ber net Sau vig non:Eti kett := 'Sut ter Ho me'; Bur gundy: Eti kett := 'Alma den';end;

Infor ma ción adi cio nalHay cua tro tipos ordi na les pre de fi ni dos en Object Pas cal: Inte ger, Char,WideC har y Boo lean. Object Pas cal tam bién per mite al usua rio (pro gra ma dor)decla rar y crear tipos enu me ra dos defi ni dos por el usua rio, que son otro tipoordi nal.

Out of memoryPo si ble cau sa de error

1. Puede haberse que dado sin memo ria.2. Puede haber pro por cio nado a la fun ción For mat dema sia dos argu men tos

para que ges tione.3. Puede estar uti li zando una com bi na ción de Del phi 3 ó 4, cier tos con tro la do-

res de vídeo (como Dia mond Fire GL 1000 Pro o STB Velo city 4400) ypuede tener una gran can ti dad de com po nen tes adi cio na les en su Paleta deCompo nen tes.

So lu ción rá pi da1. Veri fi que que tiene sufi ciente memo ria RAM, que el archivo de inter cam bio

de Win dows tenga el tamaño sufi ciente, y que tenga al menos el 10 porciento de espa cio libre en el disco duro.

2. Parta la cadena que quiere for ma tear en varias cade nas, y luego con ca teneel resul tado al finalizar.

3. Qui zás la manera más fácil de solu cio nar esto es redu cir el número depaque tes/com po nen tes ins ta la dos o actua li zarse a Del phi 5 o supe rior (pre-fe rido). Otras posi bles opcio nes son: Obtener la última versión del controlador (www.s3.com, www.stb.com, o

su fabricante). Iniciar Delphi con la opción -ns. Debajo de la sección [display] del archivo SYSTEM.INI añadir la

siguiente línea:

BusT hrott le=1 (rei ni ciar des pués)

Reducir la aceleración de hardware de la tarjeta de vídeo.

422 Los Tomos de Delphi: Delphi sin problemas

Page 457: Dsp

Experimentar con la intensidad/resolución de color; 1024x768 encolores de 16 bits parece ser lo peor.

Obtener la última versión de los controladores de DirectX(probablemente no los necesite para sistemas Win98).

No utilizar fondos de escritorio o utilizar un fondo que consuma pocamemoria.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “memory” y “for mat strings” en la ayuda deDel phi.3. El entorno inte grado de Del phi uti liza una lista de imá ge nes para los ico-

nos que se mues tran en la Paleta de Compo nen tes. Cuando Del phi escar gado, esta lista de imá ge nes crece en tamaño. Si el tamaño de la lista deimá ge nes es supe rior a la capa ci dad sopor tada por la memo ria de la tar jetade vídeo, se uti liza memo ria prin ci pal para alma ce nar el resto de la lista deimá ge nes. Durante esta ope ra ción, el con tro la dor de vídeo algu nas vecesfalla.

Out of system resourcesPo si ble cau sa de error

Puede tener muchas ven ta nas abier tas.

So lu ción rá pi daSiem pre que sea posi ble, cree diná mi ca mente los for mu la rios para mini mi zarla can ti dad de recur sos uti li za dos en un momento dado. Por ejem plo, cree uncua dro de diá logo ‘Acerca de...’ sola mente cuando sea nece sa rio, aña diendocódigo simi lar a éste al evento que se uti liza para crear el cuadro:

Form1 := TForm1.Crea te(Self);try Form1.Show Mo dal;fi nally Form1.Free;end;

Infor ma ción adi cio nalRecuerde que todos los con tro les de Win dows que tie nen aso ciado un mane ja-dor (handle) son con si de ra dos ven ta nas por Win dows. Podría obte ner este men-saje de error por tener un mon tón de boto nes, etc. acti vos al mismo tiempo.

Mensajes de error 423

Page 458: Dsp

Overflow in conversion or arithmetic operationPo si ble cau sa de error

Puede tener un archivo .DCU dañado.

So lu ción rá pi daSiga estos pasos para deter mi nar qué archivo .DCU está dañado y luegorecons truirlo:1. Haga copias de sus archi vos .DCU.2. Borre un .DCU del direc to rio del pro yecto.3. Recom pile el pro yecto.4. Repita los pasos 2 y 3 (borrando un .DCU dife rente cada vez) hasta que no

obtenga el men saje de error.

Infor ma ción adi cio nalEl archivo .DCU que borró inme dia ta mente antes de que el pro yecto com pi larasin errores es el cau sante del problema.

Overloaded procedure <> must be marked with the overloaddirective

Po si ble cau sa de errorPuede haber inten tado sobre car gar un método, pero olvidó pro por cio nar ladirec tiva Over load a uno o ambos méto dos. Por ejem plo, lo siguiente gene raráeste men saje de error:

cons truc tor Crea te(AOwner: TCom po nent); over load; ove rri de;cons truc tor Crea te(AOwner: TCom po nent; i:in te ger);

So lu ción rá pi daAñada la direc tiva Over load a ambos méto dos, así:

cons truc tor Crea te(AOwner: TCom po nent); over load; ove rri de;cons truc tor Crea te(AOwner: TCom po nent; i:in te ger); over load;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “over load” en la ayuda de Del phi.

424 Los Tomos de Delphi: Delphi sin problemas

Page 459: Dsp

Overriding automated virtual method <> cannot specify a dispidPo si ble cau sa de error

Puede estar inten tando decla rar un nuevo disp-id para un pro ce di miento detipo Auto ma ted que está redefiniendo.

So lu ción rá pi daUti lice el disp-id asig nado ori gi nalmente al pro ce di miento en todos losdes cen dien tes.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “auto ma ted com po nents” en la ayuda deDel phi.

Package <> already contains unit <>Po si ble cau sa de error

Puede estar inten tando com pi lar un paquete que requiere (a tra vés de la cláu-sula Requi res o de la lista de paque tes) otro paquete, y ambos paque tes (el queestá inten tando com pi lar y el reque rido, que se men ciona en el men saje deerror) con tie nen la uni dad espe ci fi cada en el men saje.

So lu ción rá pi daEli mine la uni dad men cio nada en el men saje de error de uno de los paque tes, oeli mine el paquete men cio nado en el men saje de error de la cláu sula Requi resdel paquete que está inten tando com pi lar.

Infor ma ción adi cio nalDos paque tes que se uti li zan entre sí no pueden con te ner la misma uni dad.

Package <> can’t be installed because another package with thesame base name is already loaded (<>)

Po si ble cau sa de error1. Puede haber inten tado reins ta lar un paquete que ya ha sido ins ta lado en

su sis tema.2. Puede haber inten tado ins ta lar un com po nente den tro de un paquete

siguiendo estos pasos:

Mensajes de error 425

Page 460: Dsp

a. Seleccionó Com po nent | Install Com po nent.b. Seleccionó la página New Pack age.

c. En el cuadro de combinación Pack age File Name, proporcionó elnombre de un paquete existente dentro del cual instalar el componente.

So lu ción rá pi da1. Evite ins ta lar el mismo paquete varias veces.2. Para ins ta lar un com po nente den tro de un paquete exis tente, selec cione la

página Into Exis ting Pac kage en el cua dro de diá logo Install Com po nent.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “pac ka ges | about pac ka ges” en la ayuda deDel phi.

Package <> can’t be installed because it is not a design timepackage

Po si ble cau sa de errorPuede haber inten tado ins ta lar un paquete de tiempo de eje cu ción en la Paletade Compo nen tes.

So lu ción rá pi daLoca lice el paquete de tiempo de diseño corres pon diente e ins tá lelo.

Infor ma ción adi cio nalPuede fácil mente deter mi nar si un paquete es de tiempo de diseño o de tiempode eje cu ción abrién dolo, selec cio nando el botón Options, y com pro bando elvalor en las opcio nes Des crip tion | Usage.

Los paque tes de tiempo de eje cu ción con tie nen el código nece sa rio para que lasapli ca cio nes puede ser cons trui das “con paque tes”, y los paque tes se dis tri-buyan una sola vez (de modo que múl ti ples apli ca cio nes com partan unpaquete). Los paque tes de tiempo de eje cu ción (.DPL en Del phi 3, .BPL en lasver sio nes pos te rio res) debe rían resi dir en \Win dows\System (Win dows 9X) o\Winnt\System32 (Win dows NT, 2000 y XP). Los paque tes de tiempo dediseño con tie nen código espe cí fico para tiempo de diseño para su uti li za ciónden tro del entorno inte grado de Del phi, como ico nos de com po nen tes, edi toresde pro pie da des y edi to res de com po nen tes.

Es una buena prác tica que los desa rro lla do res de com po nen tes esta blez can uncon ve nio de nom bres que haga que los paque tes de tiempo de diseño y detiempo de eje cu ción sean fácil mente dis tin gui bles. Una manera están dar de

426 Los Tomos de Delphi: Delphi sin problemas

Page 461: Dsp

hacerlo es aña dir una “D” a los paque tes de tiempo de diseño; para pro pó si tosde con trol de ver sión, la base de código del com pi la dor se añade al final delnom bre del archivo (por ejem plo, DCLIB60.BPL para el paquete de tiempo dediseño de Inter Base).

Package <> is recursively requiredPo si ble cau sa de error

Puede haber colo cado un paquete en su pro pia sec ción Requi red.

So lu ción rá pi daNo tiene sen tido, y ade más es ile gal, que un paquete se requiera a sí mismo.Eli mine el nom bre del paquete de su pro pia cláu sula Requi res.

Infor ma ción adi cio nalNor mal mente, los paque tes de tiempo de eje cu ción con tienen las uni da des queimple men tan la fun cio na li dad prin ci pal del paquete, y requie ren la VCL de labase de código actual de Del phi (por ejem plo, VCL60.DCP para los paque tes deDel phi 6). Los paque tes de tiempo de diseño con tie nen posi ble mente una uni-dad de regis tro, los recursos de iconos de componentes, y requie ren el paquetede tiempo de eje cu ción.

Package unit <> cannot appear in contains or uses clausesPo si ble cau sa de error

Puede haber inten tado aña dir un paquete a la cláu sula Con tains o Uses de unpaquete.

So lu ción rá pi daLos paque tes pue den con te ner y uti li zar uni da des, pero no otros paque tes(colec cio nes de uni da des).

Infor ma ción adi cio nalPuede ser que haya una uni dad y un paquete con el mismo nom bre, y el com pi-la dor encon tró el paquete antes que la uni dad. Si es así, mueva el paquete conel mismo nom bre que la uni dad que quiere uti li zar o con te ner fuera de la rutade bús queda de Delphi.

Mensajes de error 427

Page 462: Dsp

Packages <> and <> both contain unit <>Po si ble cau sa de error

Puede estar inten tando com pi lar un pro yecto que uti liza los dos paque tes men-cio na dos en el men saje de error, y cada uno con tiene una uni dad del mismonom bre (qui zás la misma uni dad, qui zás dos uni da des que por coin ci den cia tie-nen el mismo nom bre).

So lu ción rá pi daEvite uti li zar uno de los paque tes, o cam bie el nom bre a una de las uni da desque tie nen el mismo nom bre.

Infor ma ción adi cio nalTener dos paque tes en el mismo pro yecto que con tie nen ambos una uni dad conel mismo nom bre oca siona ambi güe dad al com pi la dor. Es una buen prác ticauti li zar un con ve nio de nom bres per so na li zado para sus com po nen tes y uni da-des, para evi tar que este error se produzca.

PACKED not allowed herePo si ble cau sa de error

Puede estar inten tando aplicar la pala bra reser vada Pac ked a un tipo que noes un con junto (set), array, regis tro (record), clase (class) o archivo (file). Porejem plo, lo siguiente gene rará este men saje de error:

type Hou se = Exten ded; Cam den Yards = pac ked Hou se;

So lu ción rá pi daUti lice sola mente la pala bra reser vada Packed sobre los tipos antesmen cio na dos.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “pac ked key word” en la ayuda de Del phi.

428 Los Tomos de Delphi: Delphi sin problemas

Page 463: Dsp

Page Fault in module <> at <>Po si ble cau sa de error

Puede estar inten tando mos trar un for mu la rio que ya ha sido libe rado.Cualquiera de los dos ejem plos siguien tes gene rará este men saje de error si elfor mu la rio ha sido creado y luego libe rado:

Form1.Show;Form1.Show Mo dal;

So lu ción rá pi daBus que un for mu la rio abierto del tipo que desee para crearlo mediante códigode la siguiente manera:

var i, Chihuahua: Inte ger;be gin Chihuahua := -1; for i := 0 to Screen.Form Count-1 do if Screen.Forms[i] is TForm1 then Chihuahua := I; if Chihuahua >= 0 then Screen.Forms[Chihuahua].Show else be gin Form1 := TForm1.Crea te(Self); Form1.Show; end;end;

Infor ma ción adi cio nalCon sulte “Access Vio la tion”.

Page name cannot be blankPo si ble cau sa de error

Puede estar inten tando uti li zar el Asis tente de Com po nen tes (Com po nentWizard) para crear un nuevo com po nente, pero borró el texto del cuadro decom bi na ción Palette Page.

So lu ción rá pi daIntro duzca un nom bre en el cua dro de combinación Palette Page, o selec cioneuno de la lista des ple ga ble.

Mensajes de error 429

Page 464: Dsp

Infor ma ción adi cio nalPalette Page es la página de la Paleta de Com po nen tes en la que el nuevo com-po nente será ins ta lado.

Param <> not foundPo si ble cau sa de error

Puede haber borrado un pará me tro de una lista, pero olvidó actua li zar elcódigo que hace refe ren cia al pará me tro. Por ejem plo, puede haber tenido unasen ten cia SQL como:

INSERT INTO ABC.Alpha bet (SQU_ID, Let ter Co de, Re por tedOn, Effec ti ve Da te)VALUES (:squid, :ltrco de, :sysDa te, :eff Da te)

Y luego eliminó el campo Repor tedOn y el pará me tro :sysDate, que dando lasen ten cia como:

INSERT INTO ABC.Alpha bet (SQU_ID, Let ter Co de, Effec ti ve Da te)VALUES (:squid, :ltrco de, :eff Da te)

Pero aún se hace refe ren cia al pará me tro :sysDate en algún lugar del código,por ejemplo:

Pa rams.Pa ramB yNa me('sysDa te').AsDa te Ti me := Now;

So lu ción rá pi daElimine (o comente) la refe ren cia al pará me tro.

Infor ma ción adi cio nalAlter na ti va mente, puede man te ner el pará me tro pero sumi nis trarle un valorNull. Dado el ejem plo de arriba, podría hacerlo de esta manera:

INSERT INTO ABC.Alpha bet (SQU_ID, Let ter Co de, Re por tedOn, Effec ti ve Da te)VALUES (:squid, :ltrco de, NULL, :eff Da te')

Parameter <> not allowed here due to default valuePo si ble cau sa de error

Puede haber inten tando com bi nar dos varia bles con un mismo valor pordefecto en la decla ra ción de un método, así:

pro ce du re PTBoat(i: Inte ger; j, k: Inte ger = 0);

430 Los Tomos de Delphi: Delphi sin problemas

Page 465: Dsp

So lu ción rá pi daColo que la segunda varia ble (k, en el caso de arriba) en su pro pia sec ción deli-mi tada, así:

pro ce du re PTBoat(i: Inte ger; j: Inte ger = 0; k: Inte ger = 0);

Infor ma ción adi cio nalLos pará me tros por defecto apa re cie ron por pri mera vez en Del phi 4.

Parameter <> not foundPo si ble cau sa de error

Puede haber lla mado al método Params.ParamB yName de un com po nenteTSQLQuery (DBExpress) sin haber con fi gu rado antes su pro pie dadSQLCon nec tion.

So lu ción rá pi daCon fi gure la pro pie dad SQLCon nec tion del objeto TSQLQuery, asig nán dole uncom po nente TSQLCon nec tion apro piado.

Infor ma ción adi cio nalDBExpress apa re ció por pri mera vez en Del phi 6.

Parameters of this type cannot have default valuesPo si ble cau sa de error

Puede haber inten tado pro por cio nar un valor o valo res por defecto a un pará-me tro de un método, pero esta carac te rís tica no está sopor tada para el tipo dedatos del pará me tro para el que está pro por cio nando el valor por defecto.

type AI2 = array [0..2] of in te ger;. . .pro ce du re Bra veAt tempt(a: AI2 = [1, 2, 3]);

So lu ción rá pi daEli mine los valo res por defecto.

Mensajes de error 431

Page 466: Dsp

Infor ma ción adi cio nalPara más infor ma ción, con sulte “default pro perty values” en la ayuda deDel phi.

Parent Interface must be Dispatchable for dual interfacePo si ble cau sa de error

Puede estar inten tando car gar una biblio teca de tipos con Del phi 3.

So lu ción rá pi daDes car gue e ins tale el par che de Del phi 3.02, e importe la biblio teca de tiposuti li zando Tli bimp.EXE.

Infor ma ción adi cio nalVea el artículo de Dan Miser “The Upgrade Game” en la edi ción de Abril de1998 de The Del phi Infor mant o en la direc ción http://www.delp hi zine.com/opi-nion/1998/04/di199804ft_o/di199804ft_o.asp, o visite http://www.dany shop.compara cono cer las razo nes por las que es con ve niente actua li zarse.

Passthrough SQL connection must be sharedPo si ble cau sa de error

Puede estar uti li zando Micro soft Access e intentó actua li zar los resul ta dos deuna con sulta.

So lu ción rá pi daAsigne el valor SHARED AUTOCOMMIT (Dri vers | Access | SHAREDAUTOCOMMIT) al pará me tro SQLPASSTHRU MODE para el con tro la dor deAccess uti li zando la uti li dad BDE Con fi gu ra tion.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “using Passthru SQL” en la ayuda de Del phi.

Path not found. File <>Po si ble cau sa de error

Puede estar inten tando abrir o acti var un com po nente TTa ble cuya pro pie dadData ba se Name apunta a una ubi ca ción de la tabla indi cada en la pro pie dad

432 Los Tomos de Delphi: Delphi sin problemas

Page 467: Dsp

Table Name que difiere de la ubi ca ción real de la tabla. La tabla puede habersido movida o borrada, o el alias no ha sido con fi gu rado apro pia da mente.

So lu ción rá pi daMueva la tabla a la ubi ca ción espe ci fi cada en el men saje de error (es decir, adonde Del phi está bus cán dola).

Alter na ti va mente, si la tabla está ubi cada en el lugar que usted desea queesté, pero el alias está apun tando a algún otro lugar (como indica el men sajede error y la ruta indicada), modi fi que la con fi gu ra ción del alias con la herra-mienta BDE Con fi gu ra tion/Admi nis tra tion, para que apunte a la ruta correcta.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “TTa ble” en la ayuda de Del phi.

Path too longPo si ble cau sa de error

Puede estar uti li zando tablas Para dox ante rio res al nivel 7.

So lu ción rá pi daAumente el nivel de la tabla a 7 uti li zando la uti li dad BDE Con fi gu ra tion.Con sulte “Hig her table level requi red” para ver las ins truc cio nes con cre tasde cómo hacer esto.

Infor ma ción adi cio nalCon sulte “Hig her table level requi red” e “Inva lid file name”.

Pointer type requiredPo si ble cau sa de error

Puede estar inten tando apli car un ope ra dor de derre fe ren cia ción (^) a un iden-ti fi ca dor que no es un pun tero. Los dos ejem plos siguien tes gene ra rán estemen saje de error:

{ Ejem plo A }pro ce du re ItsNot Po li te To;var i, j: Inte ger; p: Poin ter;be gin p := @i;

Mensajes de error 433

Page 468: Dsp

i^ := j; //esto provoca el error, ya que i no es un puntero //y no pue de apli cár se le el ope ra dor ^

{ Ejem plo B }pro ce du re ItsNot Po li te To;var i, j: Inte ger; p, q: Poin ter;be gin p := @i; q := i^; //esto provoca el error, ya que i no es un puntero //y no pue de apli cár se le el ope ra dor ^

So lu ción rá pi daUti lice úni ca mente el ope ra dor de derre fe ren cia ción (^) con pun te ros. He aquíun ejem plo correcto de la uti li za ción del ope ra dor:

pro ce du re Thank sForT he;type iptr = ^Inte ger;var i, j: Inte ger; p: Poin ter; q: iptr;be gin p := @i; q := p; q^ := j; i := q^;end;

Infor ma ción adi cio nalCon sulte “poin ter types” en la ayuda de Del phi para más infor ma ción sobre lospun te ros.

Preparation of default expression failed with error “Type mismatchin expression”

Po si ble cau sa de errorPuede haber asig nado a la pro pie dad DefaultExpres sion de un TField un valorque no es un entero o no está ence rrado entre apóstrofes. Por ejem plo, siasigna True o False como DefaultExpres sion para un campo TBoo leanField,obten drá este men saje de error.

434 Los Tomos de Delphi: Delphi sin problemas

Page 469: Dsp

So lu ción rá pi daEncie rre el valor de DefaultExpres sion entre apóstrofes. Por ejem plo, parahacer que True sea el valor por defecto de un campo Boo lean, intro duzca‘True’.

Infor ma ción adi cio nalCon sulte “TField” en la ayuda de Del phi para los deta lles más espe cí fi cos sobrelas pro pie dades, méto dos y even tos de esta impor tante clase de obje tos.

Previous declaration of <> was not marked with the ‘overload’directive

Po si ble cau sa de error1. Puede estar inten tando crear una segunda ver sión de un método con una

lista de pará me tros dife rente del pri mero (esto es lo que el men saje deerror indica).

2. Puede tener lis tas de pará me tros dife ren tes en la sec ción Imple men ta tion yen la sec ción Inter face para un mismo método, pro ce di miento o fun ción.Por ejem plo, puede tener en la inter faz una decla ra ción simi lar a ésta:

pro ce du re Be low Ze roE rror(Sen der: TObject);

y en la imple men ta ción una defi ni ción como ésta:

pro ce du re Be low Ze roE rror(Per cen ta geTy pe: String; Sen der: TObject);

So lu ción rá pi da1. Añada la direc tiva Over load a la decla ra ción del método en la sec ción

Inter face.2. Corrija la defi ni ción o decla ra ción para que ambas sean igua les.

Infor ma ción adi cio nalEste men saje de error es único para Del phi 4 y supe rio res, ya que la direc tivaOver load fue intro du cida en Del phi 4.

Printing in ProgressPo si ble cau sa de error

Puede estar inten tando impri mir un archivo de texto, pero ha olvidado cerrarel archivo. Por ejem plo, puede estar haciendo algo así:

pro ce du re TfmRSXL.btnPrint Click(Sen der: TObject);

Mensajes de error 435

Page 470: Dsp

var Pa lin dro me: System.Text;be gin AssignPrn(Pa lin dro me); Rew ri te(Pa lin dro me); Wri teln(Pa lin dro me,'SIT ON A POTATO PAN OTIS');

So lu ción rá pi daCie rre el archivo de texto cuando haya ter mi nado de tra ba jar con él, así:

pro ce du re TfmRSXL.btnPrint Click(Sen der: TObject);var Pa lin dro me: System.Text;be gin AssignPrn(Pa lin dro me); try Rew ri te(Pa lin dro me); Wri teln(Pa lin dro me,'SIT ON A POTATO PAN OTIS'); . . . fi nally Clo se Fi le(Pa lin dro me); end;end;

Infor ma ción adi cio nalAde más del pro ce di miento están dar Wri teln, puede tam bién uti li zar el métodoText Out de Prin ter.Can vas de la uni dad TPrin ters para impri mir texto. Paramás infor ma ción, con sulte “Text Out met hod” y “Prin ters unit” en la ayuda deDel phi.

Procedure cannot have a result typePo si ble cau sa de error

Puede haber decla rado un pro ce di miento, pero le aso ció un tipo de resul tado.Por ejem plo, lo siguiente gene rará este men saje de error:

pro ce du re FetchMySlip pers Fi do: TSlip pers;

So lu ción rá pi daReem place la pala bra reser vada Pro ce dure por la pala bra reser vada Func tion,o borre el tipo de resul tado.

Infor ma ción adi cio nalSi nece sita o pre fiere uti li zar un pro ce di miento, pero tam bién desea que el pro-ce di miento devuelva un valor, puede pasar un pará me tro Var al pro ce di miento:

436 Los Tomos de Delphi: Delphi sin problemas

Page 471: Dsp

pro ce du re HotE nough For Ya(var glo bal War ming: Boo lean);var Cen ti gra de: in te ger;be gin Cen ti gra de := StrToInt(Edit1.Text); if Cen ti gra de > 77 then glo bal War ming := True;end;

Procedure FAIL only allowed in constructorPo si ble cau sa de error

Puede haber lla mado a Fail en algún lugar que no es un cons truc tor. Por ejem-plo, lo siguiente gene rará este men saje de error:

if Gra de in ['D','F'] then Fail;

So lu ción rá pi daLlame a Fail sola mente desde un cons truc tor.

Infor ma ción adi cio nalIncluso den tro de un cons truc tor, no es buena cos tum bre lla mar a Fail.

Procedure, function or property expectedPo si ble cau sa de error

Puede haber selec cio nado Edit | Add to Inter face en un pro yecto que tieneuna biblio teca de tipos, pero olvidó espe ci fi car el tipo del ele mento que quiereaña dir a la inter faz. Por ejem plo, si escribe “Con dem ned” en el cua dro de edi-ción, obten drá este men saje de error.

So lu ción rá pi daEspe ci fi que el tipo del ele mento si está aña diendo un pro ce di miento, fun ción opro pie dad. Por ejem plo, podría intro du cir “pro perty Con dem ned: WideS tring”.

Infor ma ción adi cio nalLa posi bi li dad de aña dir méto dos y pro pie da des a las inter fa ces a tra vés deEdit | Add to Inter face apa re ció por pri mera vez en Del phi 6.

Si va a aña dir un pro ce di miento a la interfaz, todo lo que nece sita aña dir es:pro ce dure <nombre>. Si añade una fun ción, tam bién deberá espe ci fi car un tipo

Mensajes de error 437

Page 472: Dsp

de resul tado: func tion <nom bre>: <tipo_resul tado>. Si añade una pro pie dad,debe espe ci fi car un tipo: pro perty <nom bre>: <tipo>.

Procedure or Function expectedPo si ble cau sa de error

Puede estar inten tando crear un método de clase, pero olvidó aña dir la pala brareser vada Func tion o Pro cedure. Por ejem plo, lo siguiente gene rará este men-saje de error:

pu blic func tion Bill yCan You Lend MeA: Cu rrency; class a;

So lu ción rá pi daAñada Proce dure o Func tion a la pala bra reser vada Class, así:

class pro ce du re a;

Infor ma ción adi cio nalLos pro ce di miento de clase actúan sobre la pro pia clase, y no sobre una ins tan-cia con creta de la clase. Un uso común para un pro ce di miento de clase esimple men tar un for mu la rio modal, así:

type TfrmTMSExpress Ma te rial = class(TForm) Sta tus Bar1: TSta tus Bar; pri va te { Pri va te de cla ra tions } pu blic class pro ce du re Cre8Thyself; end;// OJO! No hay una va ria ble dis po ni ble, como://var// frmTMSExpress Ma te rial: TfrmTMSExpress Ma te rial;im ple men ta tion{$R *.DFM}class pro ce du re TfrmTMSExpress Ma te rial.Cre8Thyself;be gin with Self.Crea te(nil) do try Show Mo dal; fi nally Free; end;end;

Los cons truc to res y destruc to res son tipos espe cia les de métodos de clase.

438 Los Tomos de Delphi: Delphi sin problemas

Page 473: Dsp

Procedure or Function name expectedPo si ble cau sa de error

Puede haber espe ci fi cado un iden ti fi ca dor que no es un pro ce di miento o fun ciónen una cláu sula Exports. Por ejem plo, si Yoopdl es el nom bre de una varia blede tipo Inte ger, lo siguiente en un archivo de biblio teca (.DLL) gene rará estemen saje de error:

ex ports yoopdl;

So lu ción rá pi daSola mente los pro ce di mien tos y fun cio nes de la uni dad actual pue den serexpor ta dos. Por ejem plo, si Duty Free es el nom bre de un pro ce di miento o fun-ción en la .DLL, lo siguiente es un uso válido de la pala bra reser vada Exports:

ex ports Duty Free;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “DLLs” en la ayuda de Del phi.

Program or unit <> recursively uses itselfPo si ble cau sa de error

Puede haber aña dido el nom bre de la uni dad actual a su pro pia cláu sula Uses(en la sec ción Inter face o Imple men ta tion). Por ejem plo, lo siguiente gene raráeste men saje de error:

unit The Gooch;in ter fa ceuses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Con trols, Forms, Dia logs, StdCtrls, The Gooch;

So lu ción rá pi daEli mine la refe ren cia a sí misma de la cláu sula Uses.

Infor ma ción adi cio nalCon sulte “Cir cu lar Unit Refe rence [to <>]”.

Mensajes de error 439

Page 474: Dsp

Project <> raised exception class <> with message <>. Processstopped. Use Step or Run to continue.

Po si ble cau sa de errorEste men saje de error es bas tante gené rico. Sim ple mente dice el nom bre delpro yecto que estaba activo cuando se pro dujo el men saje de error (que debe ríaser obvio en cual quier caso), la clase de excep ción invo lu crada (que será bas-tante gene ral, como ERan geE rror, EInva lid Cast, EInva lid Poin ter, EString-ListError) y el men saje exacto que la clase de excep ción pro por ciona para esteerror espe cí fico.

So lu ción rá pi daEl men saje de error debe ría darle una buena pista sobre cuál es el pro blemareal. Por ejem plo, el texto com pleto del men saje de error puede ser algo como“Pro ject Man hat tan rai sed excep tion class ERan geE rror with mes sageRange Check Error. Pro cess stop ped. Use Step or Run to con ti nue”.Asi mismo, podrá ver exac ta mente cuál es la sen ten cia en la que se ha pro du-cido el error, puesto que el depu ra dor inte grado nor mal mente se detiene en lalínea siguiente a la que oca sionó el error (si tiene habi li tada la opción Breakon Excep tions).

Infor ma ción adi cio nalPara con ti nuar tra zando la eje cu ción o eje cu tando, como el men saje invita ahacer, pulse F8 para tra zar o F9 para eje cu tar. Cual quiera de estas accio nespasará por la línea en la que ocu rrió el error y mos trará el error que el usua riofinal vería en esta situa ción en un cua dro de men saje (el error bajo dis cu siónno es visto por el usua rio final, sino sola mente por el desa rro lla dor; de hecho,el pro pio desa rro lla dor no lo vería si la opción Break On Excep tions no estu-viera acti vada)*.

Para vol ver al entorno de tiempo de diseño para tra ba jar con el pro blema:

Pulse Ctrl+F2.

-O-

Pulse Alt+R, E.

-O-

Selec cione Run | Pro gram Reset.

* Para acti var la opción Break on Excep tions, siga estos pasos:1. Selec cione Tools | Envi ron ment Options.2. Selec cione la página Pre fe ren ces.

440 Los Tomos de Delphi: Delphi sin problemas

Page 475: Dsp

3. En la sec ción Debug ging, mar que la casi lla de veri fi ca ción Break onExcep tions.

Property <> does not exist in base classPo si ble cau sa de error

Puede haber decla rado una pro pie dad sin decla rar su tipo. Por ejem plo, puedehaber hecho algo así:

pu blis hed pro perty Va lues KeepSkyroc ke ting;

So lu ción rá pi daSi la pro pie dad es nueva para la clase, debe aña dir el tipo de datos de la pro-pie dad, así como los cam pos o méto dos de lec tura (read) y escri tura (write). Porejem plo, la decla ra ción de arriba debe ría ser algo así:

pu blis hed pro perty Va lues KeepSkyroc ke ting: Integer read FOrbes wri te SetSkyroc ke ting Va lues;

Infor ma ción adi cio nalPara pro mo ver una pro pie dad defi nida en la clase ances tro a una sec ción demayor visi bi li dad (de Pri vate o Pro tec ted a Public o Publis hed, o de Public aPublis hed), todo lo que hay que hacer es intro du cir su nom bre en la sec ción ala que se quiere pro mo verla — no es nece sa rio aña dir la decla ra ción com pleta(esta es la razón de por qué el com pi la dor está espe rando encon trar esta pro-pie dad en la clase base cuando no se ha pro por cio nado una decla ra cióncom pleta).

Decla rar una pro pie dad por su nom bre sola mente (omi tiendo el tipo de datos ylos méto dos de lec tura y escri tura) es la manera correcta de rede cla rar unapro pie dad de una clase ances tro. Esta es la razón de por qué el men saje deerror indica que el com pi la dor trata de loca li zar la pro pie dad en la clase base(ances tro). Haga esto cuando quiera pro mo ver la pro pie dad para que sea másvisi ble (por ejem plo, de Pri vate a Public). Por ejem plo, si en un des cen diente deTNo te book quiere aumen tar la visi bi li dad de la pro pie dad Brush here dada dePublic a Publis hed, podría hacer esto:

pu blis hed Brush;

Si está decla rando una nueva pro pie dad, sin embargo, debe espe ci fi car su tipode datos y las claú su las de acceso de lec tura y escri tura como se mues tra a con-ti nua ción, donde se está uti li zando acceso directo a un campo para obte ner yasig nar el valor de la propiedad:

Mensajes de error 441

Page 476: Dsp

pri va te FRealE sta te: Cu rrency;pro tec ted { }pu blic { }pu blis hed pro perty RealE sta te: Cu rrency read FRealE sta te wri te FRealE sta te;

Si está uti li zando acceso directo para leer el valor, pero uti liza un método paraasig nar el valor de la pro pie dad (lo más ade cuado en la mayo ría de los casos),uti lice la siguiente meto do lo gía:

pri va te FRealE sta te: Cu rrency; pro ce du re Set RealE sta te(Va lue: Cu rrency);pro tec ted { }pu blic { }pu blis hed pro perty RealE sta te: Cu rrency read FRealE sta te wri te Set RealE sta te;

Property <> inaccessible herePo si ble cau sa de error

Puede haber inten tado acce der a una pro pie dad den tro de un pro ce di miento ofun ción. Por ejem plo, lo siguiente gene rará este men saje de error:

class pro ce du re TWha te ver.Cre8 Your self;be gin with TWha te ver.Crea te(Appli ca tion) do Show; So meP ro perty := 1;end;

So lu ción rá pi daNo haga refe ren cia a los miem bros de una clase den tro de un método de clase.Los méto dos de clase actúan sobre la pro pia clase, no sobre ins tan cias con cre-tas de la clase.

Infor ma ción adi cio nalCon sulte “Instance varia ble <> inac ces si ble here” en este libro.

442 Los Tomos de Delphi: Delphi sin problemas

Page 477: Dsp

Property does not existPo si ble cau sa de error

Puede estar abriendo un pro yecto creado en Del phi 4 o supe rior con Del phi 3 ouna ver sión infe rior.

So lu ción rá pi daAbra el pro yecto con la ver sión más nueva de Del phi, pulse con el botón dere-cho del ratón sobre el for mu la rio del pro yecto, selec cione View as Text, yluego borre la línea en la que se declara la pro pie dad OldCrea teOr der delarchivo .DFM. ¡No selec cione View as Form! Cie rre el pro yecto. Podrá abrir elpro yecto en una ver sión ante rior de Del phi.

Infor ma ción adi cio nalLa pro pie dad OldCrea teOr der fue intro du cida en Del phi 4.

Property getters and setters cannot be overloadedPo si ble cau sa de error

Puede haber aña dido méto dos de acceso de lec tura (get ters) o de escri tura (set-ters) sobre car ga dos a una decla ra ción de la clase. Por ejem plo, lo siguientegene rará este men saje de error:

type TGoI rish = class func tion Go Get ter: Inte ger; over load; func tion Go Get ter: String; over load; pro ce du re Irish Set ter(Va lue: Inte ger); over load; pro ce du re Irish Set ter(Va lue: String); over load;

So lu ción rá pi daBorre la direc tiva Over load de todos los méto dos de acceso y eli mine una ver-sión de cada uno de los méto dos sobre car ga dos.

Infor ma ción adi cio nalLamento pare cer pre ten sioso, pero “get ters” y “set ters” suena un poco infan tilpara mis oídos. Pre fiero “método de acceso” (acces sor) y “método de modi fi ca-ción” (muta tor). Tam poco me gusta nada la ten den cia a nom brarlo todo con elpre fijo “Mi”: “Mi” esto y “Mi” aque llo, que se ve mucho en los ejem plos depro gra ma ción.

Mensajes de error 443

Page 478: Dsp

Property overrides not allowed in interface typePo si ble cau sa de error

Puede haber deri vado un tipo de inter faz de otro, y uti lizó la misma pro pie daden la inter faz deri vada. Por ejem plo, lo siguiente gene rará este men saje deerror:

type Big Dog = in ter fa ce func tion Fetch: Inte ger; pro ce du re Dig(ADepth : Inte ger); pro perty Pa persAndHo les: Inte ger read Fetch wri te Dig; end;

Puppy = in ter fa ce (Big Dog) func tion Fet chQuic ker: Inte ger; pro perty Pa persAndHo les: Inte ger read Fet chQuic ker; end;

So lu ción rá pi daBorre o renom bre la pro pie dad en la inter faz deri vada.

Infor ma ción adi cio nalSi sim ple mente quiere que la pro pie dad esté dis po ni ble en la inter faz deri vada,no nece sita hacer nada — la heren cia de inter faz hace que la pro pie dad estéauto má ti ca mente dis po ni ble.

Provider name was not recognized by the serverPo si ble cau sa de error

Puede haber hecho cam bios a la apli ca ción ser vi dora sin recons truir todo elpro yecto.

So lu ción rá pi daSelec cione Pro ject |Build All.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “multi-tie red aplications” en la ayuda deDel phi.

444 Los Tomos de Delphi: Delphi sin problemas

Page 479: Dsp

Published field <> not a class nor interface typePo si ble cau sa de error

1. Puede haber inten tado decla rar un campo que no es de un tipo de clase enuna sec ción Publis hed. Por ejem plo, lo siguiente gene rará este men saje deerror:

type TScantyClass = class pu blis hed eye : Inte ger; end;

2. Puede haber olvi dado espe ci fi car la visi bi li dad para un campo que declaróen una clase. Por ejem plo, lo siguiente gene rará este men saje de error:

type TMyClass = class(TCom po nent) FInte ger: Inte ger; . . . end;

So lu ción rá pi da1. Declare sola mente pro pie da des en la sec ción Publis hed. Por ejem plo, lo

siguiente com pi lará, ya que la clase tiene un miem bro Inte ger (Feye):

type TScantyClass = class pu blic Feye: Inte ger; pu blis hed pro perty eye: Inte ger read Feye;

2. Pro por cione un espe ci fi ca dor de visi bi li dad, así:

type TMyClass = class(TCom po nent) pri va te FInte ger: Inte ger; . . . end;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “class types” y “class type com pa ti bi lity rules”en la ayuda de Del phi.

Mensajes de error 445

Page 480: Dsp

Published property <> cannot be of type <>Po si ble cau sa de error

Puede haber decla rado una pro pie dad de un tipo que no es ordi nal, Sin gle,Dou ble, Exten ded, Comp, String, Set (hasta 16 ele men tos en Del phi 1; hasta32 ele men tos en Del phi de 32 bits), o pun tero a método.

So lu ción rá pi daDeclare úni ca mente pro pie da des con los siguien tes tipos: ordi nales, Sin gle,Dou ble, Exten ded, Comp, String, Set (hasta 16 ele men tos en Del phi 1; hasta32 ele men tos en Del phi de 32 bits), o pun te ros a méto dos.

Infor ma ción adi cio nalEntre los tipos más popu la res que no se per mi ten para las pro pie da des estánlos arrays y Real.

Para más infor ma ción, con sulte “class types” y “class type com pa ti bi lity rules”en la ayuda de Del phi.

Published real[48] property <> must be Single, Double, orExtended

Po si ble cau sa de errorPuede haber inten tado publi car una pro pie dad de tipo Real en Del phi 1, 2 ó 3.Por ejem plo, lo siguiente gene rará este men saje de error:

. . . pri va te FElCa mi no: Real; pu blic { Pu blic de cla ra tions } pu blis hed pro perty ElCa mi no: real read FElCa mi no wri te SetE lCa mi no;

So lu ción rá pi daCam bie la decla ra ción de Real a Sin gle, Dou ble o Exten ded. Por ejem plo, cam-biar lo ante rior a:

. . . pri va te FElCa mi no: Sin gle; pu blic { Pu blic de cla ra tions }

446 Los Tomos de Delphi: Delphi sin problemas

Page 481: Dsp

pu blis hed pro perty ElCa mi no: Sin gle read FElCa mi no wri te SetE lCa mi no;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “class types” y “class type com pa ti bi lity rules”en la ayuda de Del phi.

PutObject to undefined itemPo si ble cau sa de error

Puede estar inten tando inser tar en una lista de cade nas un objeto que no tieneuna cadena corres pon diente.

So lu ción rá pi daAsigne una cadena antes de inten tar asig nar un objeto corres pon diente. Puedeuti li zar una cadena vacía, si quiere.

Infor ma ción adi cio nalSi no nece sita una cadena corres pon diente, uti lice la clase TList en lugar deTString List para alma ce nar los obje tos.

Query Is Too Com plexPo si ble cau sa de error

Puede que la pro pie dad Upda te Mode de un TQuery tenga el valor UpWhe reAll.

So lu ción rá pi daCam biar la pro pie dad Upda te Mode del TQuery a UpWhe re KeyOnly oUpWhe reC han ged.

Infor ma ción adi cio nalUpda te Mode loca liza el regis tro que usted ha modi fi cado para veri fi car que noha sido cam biado desde la pri mera vez que usted lo leyó hasta que intentó gra-bar la nueva ver sión. Se puede loca li zar el regis tro en base a la veri fi ca ción delos siguien tes campos: El campo(s) clave solamente (si UpdateMode es igual a UpWhereKeyOnly). El campo(s) clave más lo que se ha modificado (si UpdateMode es igual a

UpWhereChanged).

Mensajes de error 447

Page 482: Dsp

Todos los campos (si UpdateMode es igual a UpWhereAll). Comparar todoslos campos puede resultar en un duro golpe para el rendimiento; enconsecuencia, el mensaje de error.

Query makes no sensePo si ble cau sa de error

Puede estar inten tando una inserción, pero ha espe ci fi cado nom bres de colum-nas en lugar de los valo res a insertar. Por ejem plo, lo siguiente gene rará estemen saje de error:

INSERT INTO TEAM VALUES(Cat cher, Pit cher, Short stop, Cen ter field)

So lu ción rá pi daEspe ci fi que los pará me tros o valo res lite ra les en la sen ten cia INSERT de SQL.Por ejem plo, para uti li zar los pará me tros, hágalo de esta manera:

with qryUpThe Midd le dobe gin if Acti ve then Clo se; SQL.Clear; SQL.Add('INSERT INTO TEAM VALUES(:Cat cher,:Pit cher,’ + ‘:Short stop,:Cen ter field)'); Pa ramB yNa me('Cat cher').AsString := edt Cat cher.Text; Pa ramB yNa me('Pit cher').AsString := edt Pit cher.Text; Pa ramB yNa me('Short stop').AsString := edt Short stop.Text; Pa ramB yNa me('Cen ter field').AsString := edt Cen ter field.Text; ExecSQL;end;

Para espe ci fi car valo res lite ra les, sus ti tuya la línea SQL.Add por:

SQL.Add('INSERT INTO TEAM VALUES(’ + Quo tedStr(‘Hoi les’) + Quo tedStr(‘Mus si na') + Quo tedStr('Bor dick') + Quo tedStr('Ander son') + ‘)’);

Infor ma ción adi cio nalCon sulte la docu men ta ción de su base de datos para cono cer los deta lles espe cí-fi cos de SQL y su sin ta xis.

448 Los Tomos de Delphi: Delphi sin problemas

Page 483: Dsp

Query may take a long time to processPo si ble cau sa de error

Puede estar uti li zando una sen ten cia SQL que devuelve un con junto de resul-tados muy grande, por ejem plo

SELECT * FROM TEXAS WHERE FAVORITE_EXPRESSION = 'YEE-HAH!'

So lu ción rá pi daIntente redu cir la sen ten cia SQL para que incluya sólo los regis tros de inte rés,como:

SELECT * FROM TEXASWHERE FAVORITE_EXPRESSION = 'Go Pac kers! Beat the Cow boys!'

Infor ma ción adi cio nalLas con sul tas fun cio nan mejor cuando se res trin gen no sólo los regis tros adevolver, sino tam bién las colum nas, como en:

SELECT EMAILADDRESS, PHONE_NO FROM TEXAS WHERE FAVORITE_EXPRESSION = 'Go Bucks! Beat the Spurs!'

Range check errorPo si ble cau sa de error

1. Puede haber inten tado acce der mediante un índice a un ele mento de unarray pro por cio nando un número que es mayor que el tamaño del array.Por ejem plo, lo siguiente pro du ci ría este men saje de error:

pro ce du re TForm1.But ton2 Click(Sen der: TObject);var i: in te ger; a: array[1..16] of in te ger;be gin i := 17; a[i] := 1; {se in ten ta asig nar al ele men to 17, que no exis te}end;

2. Puede haber inten tado asig nar a una varia ble un valor muy grande para eltipo de datos de la varia ble. Por ejem plo, un intento de asig nar un númeronega tivo o un número posi tivo mayor que 255 a una varia ble Byte gene ra-ría este men saje de error.

Mensajes de error 449

Page 484: Dsp

So lu ción rá pi da1. Cuando haga refe ren cia a un ele mento de un array, veri fi que que el índice

del ele mento del array al que está inten tando acce der esté den tro de lasdimen sio nes decla ra das del array.

2. Declare las varia bles con tipos de datos que inclu yan todo el rango de valo-res que la varia ble puede nece si tar mane jar.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “range chec king” en la ayuda de Del phi.

Read failure. File: <>.valPo si ble cau sa de error

Puede haber inten tado asig nar True a la pro pie dad Active de un com po nenteTTa ble que repre senta una tabla Para dox, y la tabla con tiene un archivo .VALdañado.

So lu ción rá pi daBorre el archivo .VAL corres pon diente de la tabla. Por ejem plo, si la tabla sellama AGNES, el archivo que debe borrar y vol ver a crear se lla ma ríaAGNES.VAL.

Infor ma ción adi cio nalLos archi vos .VAL son crea dos cuando se espe ci fican valo res mínimos,máximos y por defecto para los cam pos de una tabla Para dox uti li zando Data-base Desk top.

En lugar de espe ci fi car estos pará me tros en el Data base Desk top, puedehacerlo direc ta mente en Del phi, creando los cam pos per sis ten tes en tiempo dediseño uti li zando el Edi tor de Cam pos (Fields Edi tor), y luego con fi gu rando laspro pie da des Default Va lue, Max Va lue y Min Va lue de éstos. Con sulte “FieldsEdi tor” en la ayuda de Del phi para deta lles más espe cí fi cos.

Read or Write clause expected but identifier <> foundPo si ble cau sa de error

Puede haber olvi dado pro por cio nar un espe ci fi ca dor Read o Write en la decla-ra ción de una pro pie dad que lo requiere . Por ejem plo, debido a que las pro pie-da des que son uti li za das para imple men tar inter fa ces por dele ga ción requie renun espe ci fi ca dor Read, lo siguiente gene rará este men saje de error:

450 Los Tomos de Delphi: Delphi sin problemas

Page 485: Dsp

pro perty So meIn ter fa ce: ISo meIn ter fa ce im ple ments ISo meIn ter fa ce;

So lu ción rá pi daAñada un espe ci fi ca dor Read junto con el campo o fun ción corres pon diente ala decla ra ción, así:

FSo meIn ter fa ce: ISo meIn ter fa ce;pro perty So meIn ter fa ce: ISo meIn ter fa ce read FSomeInterface im ple ments ISo meIn ter fa ce;

Infor ma ción adi cio nalCon sulte “Imple ments get ter must be regis ter calling con ven tion” eneste libro, e “Imple men ting Inter fa ces by dele ga tion” en la ayuda de Del phi (4 osupe rior) para más infor ma ción.

Record already locked by this sessionPo si ble cau sa de error

1. Puede estar uti li zando Para dox y tener un archivo .LCK o .NET dañado.2. Puede haber asig nado True a la pro pie dad Active de un con junto de datos

en tiempo de diseño.

So lu ción rá pi da1. Borre uno u otro o ambos archi vos.2. Asigne False a la pro pie dad Active del con junto de datos en tiempo de

diseño, o eje cute la apli ca ción fuera del entorno inte grado de Del phi (cie rreDel phi pri mero).

Infor ma ción adi cio nal1. Usted, el testeador, y usted, el pro gra ma dor, pue den estar peleán dose por

un mismo regis tro del con junto de datos (una ins tan cia abierta en elentorno inte grado/tiempo de diseño, y una ins tan cia en eje cu ción).

Record changed by another userPo si ble cau sa de error

Puede estar uti li zando MS SQL Ser ver, y el regis tro en cues tión con tiene unacolumna Date Time.

Mensajes de error 451

Page 486: Dsp

So lu ción rá pi daCambie el tipo de datos a Short Da te Time o trun que el último dígito en la partede los mili se gun dos antes de que el regis tro sea gra bado.

Infor ma ción adi cio nalEntre el momento en que se reci ben los datos para que sean tra du cidos y luegoactua li zados por el BDE, el valor Date Time puede cam biar.

Record Key deletedPo si ble cau sa de error

Puede estar uti li zando MS Access y un con tro la dor ODBC.

So lu ción rá pi daUti lice una ver sión ante rior del con tro la dor ODBC, o uti lice los com po nen tesADO Express para acce der a las tablas de Access.

Infor ma ción adi cio nalMicro soft cam bió el tamaño de los cam pos en uno de sus controladores, peroDel phi toda vía está espe rando el tamaño de campo publi cado ante rior mente.

Record/Key DeletedPo si ble cau sa de error

1. Puede haber asig nado una marca (book mark), haber cam biado de índice, yluego haber inten tado vol ver a la posición espe ci fi cada por la marca.

2. Puede haber colo cado un fil tro sobre un con junto resul tado y luego haberalte rado la defi ni ción del fil tro aña diendo o borrando un campo o cam posdel fil tro.

So lu ción rá pi da1. No cam bie de índi ces mien tras una marca esté activa.2. Des ha bi lite el fil tro, rea lice la edi ción, y luego vuelva a habi li tar el fil tro.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “book marks”, “inde xes” y “fil ters” en la ayudade Del phi.

452 Los Tomos de Delphi: Delphi sin problemas

Page 487: Dsp

Record Locked by another UserPo si ble cau sa de error

Puede estar inten tando edi tar un regis tro mien tras otro usua rio lo tieneblo queado.

So lu ción rá pi daIntente edi tar de nuevo el regis tro, veri fi cando pri mero si el cam bio que estáinten tando hacer no fue hecho ya por otro usua rio.

Infor ma ción adi cio nalSola mente un usua rio puede colo car un blo queo de escri tura sobre un regis tro.Muchos usua rios pue den simul tá nea mente ver el mismo regis tro (cada uno deellos colo cando un blo queo de lec tura en el pro ceso), pero sola mente uno puedeedi tarlo (para lo que debe obte ner un blo queo de escri tura).

Record, object or class type requiredPo si ble cau sa de error

Puede haber inten tado uti li zar la pala bra reser vada With sobre una varia ble.Por ejem plo, lo siguiente gene rará este men saje de error:

var JAndJWentUpThe Ver ti callyCha llen ged Moun tain: Boo lean;. . .with JAndJWentUpThe Ver ti callyCha llen ged Moun tain do if True then Fal se;

So lu ción rá pi daEspe ci fi que la varia ble explí ci ta mente, así:

if JAndJWentUpThe Ver ti callyCha llen ged Moun tain = True then JAndJWentUpThe Ver ti callyCha llen ged Moun tain := Fal se;

Infor ma ción adi cio nalUti lice la pala bra reser vada With sola mente en com bi na ción con los tipos men-cio na dos en el men saje de error, como com po nen tes TQuery, etc.

Mensajes de error 453

Page 488: Dsp

Recursive include file <>Po si ble cau sa de error

Puede haber uti li zado la direc tiva de com pi la dor {$I <archivo>}, y el archivoque incluyó tam bién con tiene la misma direc tiva {$I <archivo>} (es decir, elarchivo incluido está tra tando de incluirse a sí mismo). Por ejem plo, si aña dió:

{$I Mur der.inc}

a una uni dad, y el archivo con te nía esta línea:

{$I Mur der.inc}

obten drá este men saje de error.

So lu ción rá pi daBorre la direc tiva de com pi la ción que hace refe ren cia a sí misma en el archivoincluido.

Infor ma ción adi cio nalPuede incluir en un archivo el con te nido de un archivo dife rente a tra vés deuna refe ren cia a un archivo incluido. El com pi la dor trata el archivo incluidocomo si su con te nido estu viera situado direc ta mente en la uni dad. Por ejem plo,si aña dió:

{$I Mur der.inc}

a una uni dad, y el archivo Mur der.inc incluyó esto:

{ El idio ma fran cés, con su gran can ti dad de le tras mu das, ha oca sio na do el des per di cio de mu chos ga lo nes de tin ta. ¿no es cierto, Phydeaux? }

Este comen ta rio será aña dido al código fuente.

Redeclaration of <> hides a member in the base classPo si ble cau sa de error

1. Puede haber creado un des cen diente de una clase y declaró un método quetiene el mismo nom bre de alguno situado en la clase de la cual heredó, perono ha uti li zado la direc tiva Override.

2. Puede haber sido ins ta lada una nueva ver sión de una clase base, a la quese han añadido nue vas pro pie da des y/o méto dos que tienen el mismo nom-bre que otras pro pie da des y/o méto dos en la clase des cen diente.

454 Los Tomos de Delphi: Delphi sin problemas

Page 489: Dsp

So lu ción rá pi da1. Si quiere here dar la fun cio na li dad del método ori gi nal, uti lice la pala bra

reser vada Override cuando lo declare. Si quiere decla rar un método nuevo,asíg nele un nom bre dife rente de los que ya se uti lizan en la clase base.

2. Renom bre la pro pie dad o método en la clase des cen diente.

Infor ma ción adi cio nal1. Si quiere ocul tar un método de una clase base, puede hacerlo decla rando

deli be ra da mente un método con el mismo nom bre. Con sulte “Met hod <>hides vir tual met hod of base class <>”.

Redeclaration of property not allowed in OLE automation sectionPo si ble cau sa de error

Puede haber inten tado pro mo ver una pro pie dad here dada a la sec ción Auto ma-ted de una clase des cen diente.

So lu ción rá pi daQuite la pro pie dad de la sec ción Auto ma ted. Promuévala a otra sec ción (comoPublic o Publis hed), si lo desea.

Infor ma ción adi cio nalEl espe ci fi ca dor de visi bi li dad Auto ma ted apa re ció por pri mera vez en Del phi2. Se man tiene en Del phi 3 y pos te rio res prin ci pal mente por razo nes decom pa ti bi li dad.

Required package <> not foundPo si ble cau sa de error

Puede estar inten tando com pi lar un paquete que con tiene en su cláu sulaRequi res una uni dad (explí ci ta mente por su nom bre o implí ci ta mente a tra vésde una uni dad uti li zada por la uni dad nom brada) que no existe o no está en laruta de bús queda de Del phi.

So lu ción rá pi daAse gú rese de que ha escrito correc ta mente el nom bre del archivo de paquetereque rido, y que cual quier uni dad a la que se hace refe ren cia reside en undirec to rio que está en la ruta de bús queda de Del phi.

Mensajes de error 455

Page 490: Dsp

Infor ma ción adi cio nalPara veri fi car y/o modi fi car la ruta de bús queda de Del phi, selec cione Tools |Envi ron ment Options, luego la pes taña Library y el cua dro de com bi na ciónLibrary Path. Gene ral mente, los paque tes deben estar ins ta la dos en el direc to-rio \Win dows\System.

REQUIRES clause is incorrectPo si ble cau sa de error

Puede haber omi tido el punto y coma final en la cláu sula Requi res del archivofuente de paquete, o aña dió alguna exten sión de archivo a la decla ra ción.

So lu ción rá pi daAse gú rese de que los archi vos de paquete lis tados no con ten gan exten sio nes dearchi vos y que la lista esté ter mi nada con un punto y coma.

Infor ma ción adi cio nalCual quiera de las siguien tes decla ra cio nes pro du cirá este men saje de error:

re qui res Vcl30 { fal ta el pun to y coma fi nal }re qui res Vcl30, { coma in co rrec ta; fal ta pun to y coma }re qui res vcl30.dpk; { ex ten sión no per mi ti da }

Ase gú rese de que la cláu sula Requi res sea pare cida a ésta (aun que puede quese lis ten múl ti ples paque tes):

re qui res Vcl30;

Re-raising an exception only allowed in exception handlerPo si ble cau sa de error

1. Puede haber inten tado relan zar una excep ción fuera de un blo que deexcep ción.

2. Puede haber rea sig nado el ges tor de even tos OnExcep tion del objeto Appli-ca tion así:

Appli ca tion.OnExcep tion := Fil terE xcep tions;

y luego uti lizó la pala bra reser vada Raise en el ges tor de excep ción per so-na li zado, así:

456 Los Tomos de Delphi: Delphi sin problemas

Page 491: Dsp

if Re portObj.Pro gram Mo de = pmBatch then be gin Re portObj.Wri te To Log Fi le( SRe port Na me, SDelp hiE rror Mes sa ge+E.Mes sa ge, SWin dowsError Co de+IntToStr(Get LastError), Da te ToStr(Now), Ti me ToStr(Now)); Abort; end else rai se;

So lu ción rá pi da1. Sola mente relance las excep cio nes den tro de un blo que de excep ción.2. Sus ti tuya la pala bra reser vada Raise por una lla mada al método

ShowExcep tion del objeto Appli ca tion, pasán dole el objeto E de tipo Excep-tion, así:

if Re portObj.Pro gram Mo de = pmBatch then be gin Re portObj.Wri te To Log Fi le( SRe port Na me, SDelp hiE rror Mes sa ge+E.Mes sa ge, SWin dowsError Co de+IntToStr(Get LastError), Da te ToStr(Now), Ti me ToStr(Now)); Abort; end else Appli ca tion.ShowE xcep tion(E);

Infor ma ción adi cio nalEl ges tor OnExcep tion “sustituto” debe tener la siguiente sig na tura:

pro ce du re Fil terE xcep tions(Sen der: TObject; E: Excep tion);

Los blo ques Try. . . Except tien den a ser sobreu ti li za dos por muchos desa rro lla-do res. Una regla gene ral empí rica es que los blo ques Try. . . Finally debe ríanexce der en número a los blo ques Try. . . Except en una razón de 10:1. Del phimane jará las excep cio nes que no maneje usted espe cí fi ca mente a tra vés de supro pio meca nismo de detec ción y ges tión de erro res. Si no se hace un manejoante rior, el ges tor de excep cio nes por defecto de Del phi ges tio nará las excep cio-nes que lle guen a ese punto. Sin embargo, no libe rará los recur sos por símismo — eso es res pon sa bi li dad del desa rro lla dor.

Resource <> not foundPo si ble cau sa de error

Puede haber aña dido su pro pio recurso a un pro yecto, pero éste no puede serencon trado por el com pi la dor debido a que está mal escrito el nom bre delrecurso o no está en el mismo direc to rio que el archivo de pro yecto (.DPR).

Mensajes de error 457

Page 492: Dsp

So lu ción rá pi daVeri fi que la orto gra fía, o mueva el archivo .RES al mismo direc to rio que el.DPR que lo nece sita.

Infor ma ción adi cio nalNo colo que recur sos per so na li za dos den tro del archivo .RES que tiene el mismonom bre del pro yecto (es decir, si el pro yecto se llama Pro ject1.DPR, habrá unarchivo .RES lla mado Pro ject1.RES). Per mita que Del phi tenga total con trolsobre este archivo.

Segment/Offset pairs not supported in Borland 32-bit PascalPo si ble cau sa de error

Puede estar uti li zando una ver sión de Del phi dife rente de Del phi 1 y haberespe ci fi cado una direc ción de memo ria con un seg mento y un desplazamiento.Por ejem plo, la siguiente decla ra ción de varia ble gene rará este men saje deerror en Del phi de 32 bits:

type Vod ka = Inte ger;var Abso lut: Vod ka ab so lu te $00:40;

So lu ción rá pi daSi real mente nece sita espe ci fi car una direc ción, uti lice una direc ción de memo-ria “plana”, como $0040.

Infor ma ción adi cio nalLas direc cio nes abso lu tas no debe rían ser uti li za das en pro gra mas de modopro te gido de 32 bits. La pala bra reser vada Abso lute es nor mal mente uti li zadaen la pro gra ma ción a bajo nivel, por ejem plo cuando se escri ben con tro la do resde dis po si ti vos.

Selection contains a component introduced in an ancestor formwhich cannot be deleted

Po si ble cau sa de errorPuede haber inten tado borrar un com po nente here dado de un for mu la riodes cen diente.

458 Los Tomos de Delphi: Delphi sin problemas

Page 493: Dsp

So lu ción rá pi daNo intente eli mi nar cual quier com po nente que haya sido here dado delances tro.

Infor ma ción adi cio nalEste men saje de error apunta a la nece si dad de evi tar here dar de cla ses quecon ten gan más de lo que quiera que tenga el des cen diente. Al mismo tiempo, siestá creando una clase ances tro de la que va a here dar posteriormente, comopuede ser un for mu la rio que podría ser here dado uti li zando la heren cia visualde for mu la rios (dis po ni ble en Del phi de 32 bits), man tén gala tan gené rica comosea posi ble para per mi tir que sea uti li zada en su tota li dad por los for mu la riosdes cen dientes.

Cuando hereda de una clase o com po nente, puede sola mente aña dir, pero noqui tar nada del ances tro. Una mirada al código fuente que sub yace a un for mu-la rio ances tro sim ple y su des cen diente (creado uti li zando heren cia visual),mues tra cómo esto fun ciona en segundo plano.

Este es el código fuente para un for mu la rio ances tro sim ple:

unit Unit1;in ter fa ceuses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Con trols, Forms, Dia logs;type TForm1 = class(TForm) But ton1: TBut ton; pri va te { De cla ra cio nes Pri va te } pu blic { De cla ra cio nes Pu blic } end;var Form1: TForm1;im ple men ta tion{$R *.DFM}end.

Como se puede ver, el único objeto que ha sido aña dido al for mu la rio es unTBut ton, decla rado como But ton1: TBut ton.

Cuando se hereda de este for mu la rio (selec cio nando File | New, y luego selec-cio nando el for mu la rio de la página que tiene el mismo nom bre del pro yecto), elcódigo fuente es:

unit Unit2;in ter fa ceuses Win dows, Mes sa ges, SysUtils, Clas ses,

Mensajes de error 459

Page 494: Dsp

Grap hics, Con trols, Forms, Dia logs;type TForm2 = class(TForm1) pri va te { De cla ra cio nes Pri va te } pu blic { De cla ra cio nes Pu blic } end;var Form2: TForm2;im ple men ta tion{$R *.DFM}end.

Como se pue de ver, no hay una de cla ra ción ex plí ci ta de un objeto TBut ton enla cla se des cen dien te. Sin em bar go, esto está implí cito en la de cla ra ciónTForm2 = class (TForm1), que dice, en efec to, que TForm2 hereda todo deTForm1 (in clu yen do el bo tón). Si se per mi tiera borrar cual quier cosa deTForm2 que fue ra he re da da de TForm1, la de cla ra ción de arri ba no se ría vá li-da, y el en la ce de he ren cia que da ría roto.

Ser ver Exe cu tion Fai ledPo si ble cau sa de error

Pue de ha ber in ten ta do asig nar True a la pro pie dad Con nect de un com po nen teTDCOMCon nec tion, TOLEEnter pri se o TRe mo te Ser ver sin ha ber es pe ci fi ca douna valor válido para la pro pie dad Ser ver Na me o Ser verGUID.

So lu ción rá pi daPro por cione en la pro pie dad Ser ver Na me o Ser verGUID un valor corres pon-diente a un ser vi dor que haya sido re gis tra do en su má qui na.

Infor ma ción adi cio nalLos com po nen tes MIDAS sólo se pro por cio nan con la ver sión Cliente/Ser vi dorde Del phi 3 o supe rio res.

Ses sion name mis singPo si ble cau sa de error

Pue de es tar in ten tan do asig nar True a la pro pie dad Acti ve de un com po nen teTSes sion sin pri me ro pro veer un va lor para su pro pie dad Ses sion Na me.

460 Los Tomos de Delphi: Delphi sin problemas

Page 495: Dsp

So lu ción rá pi daPro por cione un va lor para la pro pie dad Ses sion Na me del com po nen te TSes siono asigne True a su pro pie dad Auto Ses sion Name.

Infor ma ción adi cio nalNo con funda las pro pie da des Name y Ses sion Name del com po nente TSes sion.La pro pie dad Name, que tie nen todos los com po nen tes, se refiere al nom bre delobjeto en sí. La pro pie dad Ses sion Name de un com po nente TSes sion es el nom-bre de la sesión a la que los com po nentes TDa ta base y TDa ta set (TTa ble,TQuery y TSto redP roc en todas las ver sio nes de Del phi; TClient Da ta Set en laver sión de Del phi Cliente/Ser vi dor 3, 4 y superio res; TNes ted Ta ble en Del phi 4y superiores) se refieren a tra vés de su pro pie dad Ses sion Name para indi car aqué sesión están conec ta dos (útil en apli ca cio nes mul tihilo, que pue den con te-ner muchas sesio nes).

Por lo tanto, el com po nente TSes sion pro por ciona un nom bre de sesión biendirec ta mente (cuando intro duce el nom bre en tiempo de diseño o se pro por-ciona uno en el código) o indi rec ta mente (cuando se asigna True a la pro pie dadAuto Ses sion Name), y los com po nen tes TDa ta base y TDa ta set selec cio nan unode los nom bres de sesión dis po ni bles de un cua dro de com bi na ción.

Sets may have at most 256 ele mentsPo si ble cau sa de error

Pue de ha ber in ten ta do de cla rar un tipo con junto (set) uti li zando un tipo baseque con tie ne más de 255 ele men tos. Por ejem plo, los si guien tes ti pos gene ra ráneste men sa je de error:

typesow = set of Word;sos = set of String;

So lu ción rá pi daEl tipo de datos base del con jun to no debe con te ner más de 255 ele men tos. Lassi guien tes de cla ra cio nes fun cio nan bien:

type sob = set of Byte; soc = set of Char;

Infor ma ción adi cio nalEl tipo base no puede te ner más de 256 po si bles va lo res, y sus or di na les de benes tar en tre 0 y 255. De bi do a es tas li mi ta cio nes, los ti pos con junto nor mal-mente se defi nen sobre sub ran gos, así:

Mensajes de error 461

Page 496: Dsp

type TAWho le MessOfInte gers = 2..243; TInte ger Set = set of TAWho le MessOfInte gers;var Set Top Box, Set tee: TInte ger Set;be gin Set Top Box := [1, 3, 5, 7, 9];

Recuerde, sin em bar go, que no pue de ex ce der el lí mi te infe rior de 0 ni el lí mi tesupe rior de 255. Nin gu na de las de cla ra cio nes si guien tes com pi la rá:

type TAWho le MessOfInte gers = -2..243; TAWho le MessOfInte gers = 23..263;

Sha re not loa ded. It is re qui red to sha re lo cal fi lesPo si ble cau sa de error

Al ar chi vo SYSTEM.INI o AUTOEXEC.BAT le pue de fal tar una lí nea que esre que ri da por el BDE (el módulo Share no está car ga do).

So lu ción rá pi daAñada DEVICE=*vsha re a la sec ción [386Enh] del ar chi vo SYSTEM.INI, oañada SHARE.EXE al ar chi vo AUTOEXEC.BAT, y lue go rei nicie.

Infor ma ción adi cio nalPara edi tar el ar chi vo SYSTEM.INI des de el Explo ra dor de Win dows, siga es-tos pa sos:1. Loca lice SYSTEM.INI. De be ría es tar situado en el di rec to rio de Win dows.

Pul se dos ve ces so bre él para abrir lo.2. Loca lice la sec ción [386Enh].3. Añada DEVICE=*vsha re si no está ya en la sec ción [386Enh].4. Cie rre SYSTEM.INI y guarde los cam bios.5. Rei nicie.

Para edi tar el ar chi vo AUTOEXEC.BAT desde el Explo ra dor de Win dows, sigaes tos pa sos:1. Loca lice y pulse con el bo tón de re cho so bre AUTOEXEC.BAT. De be ría es-

tar situado en el di rec to rio raíz (C:\).2. Selec cione Edit del menú de con tex to.3. Al final del archivo, intro duzca SET SHARE=C:\dos\sha re /F:4096

/L:40.4. Rei nicie.

462 Los Tomos de Delphi: Delphi sin problemas

Page 497: Dsp

Para edi tar AUTOEXEC.BAT en una ven ta na DOS, siga es tos pa sos:1. Teclee Edit au toe xec.bat y pulse la te cla Enter.2. Añada SET SHARE=C:\dos\sha re /F:4096 /L:40 al final del archivo.3. Guarde el archivo, selec cio nando File | Exit y lue go Yes para gra bar los

cam bios.4. Escriba au toe xec y pulse la te cla Enter.

Size mis match errorCon sul te “Re cord Key de le ted”.

Size of published set <> is greater than [4 bytes, 32 bits]Po si ble cau sa de error

Puede haber inten tado decla rar un pro pie dad de un tipo con junto que tienemás de 32 ele men tos. Por ejem plo, lo siguiente gene rará este men saje de error:

TGridI ro nMen = set of (TQuar ter back, THalf back, TFull back, TTail back, TFlan ker, TLWi de Re cei ver, TRWi de Re cei ver, TTightEnd, TLTac kle, TRTac kle, TRGuard, TLGuard, TCen ter, TMidd le Li ne bac ker, TNo seguard, TLDe fen si ve Tac kle, TRDe fen si ve Tac kle, TLDe fen si veEnd, TRDe fen si veEnd, TLLi ne bac ker, TRLi ne bac ker, TLSa fety, TLCor ner back, TRCor ner back, TRSa fety, TKic ker, TPun ter, TPunt Re tur ner, TKick Re tur ner, TSpe cial Teams De mon, TGe ne ral Ma na ger, TCoach, TWa ter boy);type pri va te FGridI ro nMen: TGridI ro nMen; pu blic {} pu blis hed pro perty GridI ron Men: TGridI ron Men read FGridI ro nMen wri te FGridI ro nMen;

So lu ción rá pi daReduzca el tamaño del con junto a una can ti dad menor o igual que 32 ele men-tos. Por ejem plo, en el con junto de arriba, podría eli mi nar TWa ter boy (o podríaborrar TQuar ter back, pero…).

Infor ma ción adi cio nalLos con jun tos se uti li zan fre cuen te mente para incluir múl ti ples ele men tos deun tipo enu me rado. Un ejem plo es el tipo TFontStyle:

Mensajes de error 463

Page 498: Dsp

TFontStyle = (fsBold, fsIta lic, fsUnder li ne, fsStri ke Out);TFontStyles = set of TFontStyle;

La clase TFont luego declara una pro pie dad Style:

pro perty Style: TFontStyles read GetStyle wri te SetStyle;

Puede luego asig nar valo res a la pro pie dad así:

Font.Style := [fsBold, fsIta lic];

Puede borrar todos los esti los asig nán dole a la pro pie dad el con junto vacío:

Font.Style := [];

Para más infor ma ción, con sulte “sets (set types)” en la ayuda de Del phi.

Slice standard function is only allowed as open array argumentPo si ble cau sa de error

Puede haber lla mado a la fun ción Slice, pero no está enviando el resul tado aun pro ce di miento o fun ción que espera un argu mento de array abierto. Porejem plo, lo siguiente gene rará este men saje de error:

pro ce du re Chop;be gin Sli ce(Dice,2);

So lu ción rá pi daSlice puede ser uti li zado úni ca mente para enviar un sub con junto de un arrayabierto a un pro ce di miento o un array que espera un argu mento de arrayabierto. He aquí un ejem plo de cómo puede ser uti li zado Slice:

var Form1: TForm1; pare: array[0..11] of in te ger;. . .func tion Dice(Eigh tWill Suf fi ce: array of in te ger): in te ger;var i,sum: Inte ger;be gin sum := 0; for i := low(Eigh tWill Suf fi ce) to High(Eigh tWill Suf fi ce) do sum := sum + Eigh tWill Suf fi ce[i]; Re sult := sum;end;pro ce du re Peel;be gin Dice(Sli ce(pare,3));end;

464 Los Tomos de Delphi: Delphi sin problemas

Page 499: Dsp

Infor ma ción adi cio nalPara más infor ma ción, con sulte “Slice” en la ayuda de Del phi.

Socket Error # 10061 – Connection RefusedPo si ble cau sa de error

1. Puede estar inten tando conec tarse a un soc ket (repre sen tado por un com-po nente TIdTCPSer ver) con un com po nente TIdTCPClient, y el ser vi dor noestá en eje cu ción.

2. Puede haber espe ci fi cado un soc ket invá lido o ine xis tente al intentar conec-tarse a un soc ket con un com po nente TIdTCPClient.

So lu ción rá pi da1. Ini cie el ser vi dor antes de inten tar conec tarse a él.2. Com pruebe que la pro pie dad Host de TIdTCPClient espe cifica una

máquina que es acce si ble, y la pro pie dad Port se refiere a un ser vi cio queestá dis po ni ble en la máquina Host.

Infor ma ción adi cio nalUn soc ket es una com bi na ción de un servi dor (host) y un puerto. El ser vi dor esuna máquina, y el puerto es un ser vi cio que esa máquina eje cuta. Con sulte losarchi vos Hosts y Servi ces en su orde na dor para ver ejem plos de máqui nas yser vi cios dis po ni bles.

Los com po nen tes TIdTCPClient y TIdTCPSer ver son parte del con junto decom po nen tes Indy, inclui dos en Del phi por pri mera vez en la ver sión 6.

Socket Error # 10065 – No route to hostPo si ble cau sa de error

Puede estar inten tando conec tarse a un com po nente TIdTCPSer ver con uncom po nente TIdTCPClient, pero ha intro du cido un valor erró neo en la pro pie-dad Host de TIdTCPClient.

So lu ción rá pi daCom pruebe que el valor que intro duzca en la pro pie dad Host de TIdTCPClientrepre sente un máquina que sea acce si ble desde el orde na dor cliente.

Mensajes de error 465

Page 500: Dsp

Infor ma ción adi cio nalUn soc ket es una com bi na ción de un servi dor (host) y un puerto. El ser vi dor esuna máquina, y el puerto es un ser vi cio que esa máquina eje cuta. Con sulte losarchi vos Hosts y Ser vi ces en su orde na dor para ver ejem plos de máqui nas yser vi cios dis po ni bles.

Los com po nen tes TIdTCPClient y TIdTCPSer ver son parte del con junto decom po nen tes Indy, inclui dos en Del phi por pri mera vez en la ver sión 6.

Socket Error # 11001 – Host not foundPo si ble cau sa de error

Puede estar inten tando conec tarse a un com po nente TIdTCPSer ver, pero no esposi ble esta ble cer una cone xión con la máquina a la cual está inten tandoconec tarse. Por ejem plo, puede estar inten tando conec tarse a un ser vi dorHTTP, pero no tiene una cone xión a Inter net activa.

So lu ción rá pi daConéc tese a Inter net o la red nece sa ria para loca li zar la máquina en cues tión.

Infor ma ción adi cio nalLos erro res de soc kets pro vie nen de los com po nen tes Indy, inclui dos en Del phipor pri mera vez en la ver sión 6.

SQL Connection timed outPo si ble cau sa de error

1. Puede estar expe ri men tando un bajo ren di miento de la red.2. Puede estar inten tando obte ner un con junto resul tado muy grande.3. Puede que nece site cam biar el valor de un pará me tro del con tro la dor del

BDE o de su sis tema de base de datos.

So lu ción rá pi da1. Llé vele un donuts al admi nis tra dor de su red y comén tele el pro blema.2. Vea si puede redu cir la can ti dad de filas y/o colum nas que está obte niendo

del ser vi dor. Si está uti li zando com po nen tes TTable para acce der a gran descan ti da des de datos, con si dere el uso de un TQuery o TSto redP roc.

3. Si está uti li zando el BDE, eje cute la uti li dad BDE Con fi gu ration y estu dielos valo res de los pará me tros del con tro la dor para su sis tema de base de

466 Los Tomos de Delphi: Delphi sin problemas

Page 501: Dsp

datos. Si no es tan obvio, trate de pre gun tar en los gru pos de noti cias rela-co na dos con su base de datos.

Infor ma ción adi cio nalMS SQL Ser ver y Sybase (su madre) tie nen una pro pie dad del con tro la dorMAXQUERYTIME que puede ser con fi gu rada a tra vés de BDE Con fi gu ratoion.

SQL Dialect InvalidPo si ble cau sa de error

Puede haber cam biado el valor de la pro pie dad SQLDia lect de un com po nenteTIBDa ta base a algo dife rente de 1 mien tras uti li zaba una ver sión de Inter Baseante rior a Inter Base 6.

So lu ción rá pi daMan tenga el valor de la pro pie dad SQLDia lect en 1, o actua lí cese a Inter Base6.

Infor ma ción adi cio nalInter Base 6 añade algu nas mejo ras fun da men ta les sobre las ver sio nes ante rio-res. Para hacer uso de ellas, sin embargo, debe asig nar 3 a SQLDia lect. Elvalor 1 de SQLDia lect se ha creado para las ver sio nes de Inter Base ante rio resa la 6. El valor 2 de SQLDia lect se uti liza para pro bar la com pa ti bi li dad de lasapli ca cio nes anti guas crea das con Inter Base. Para más infor ma ción, con sultela docu men ta ción de Inter Base (www.inter base.com).

SQL is too complexPo si ble cau sa de error

Puede haber inten tado gra bar regis tros mien tras la pro pie dad Upda te Mode delobjeto TTa ble o TQuery tiene asig nado el valor UpWhe reAll.

So lu ción rá pi daUti lice UpWhe reC han ged o UpWhe re KeyOnly como valor para Upda te Mode enlugar de UpWhe reAll.

Infor ma ción adi cio nalEl valor UpWhe reAll del pará me tro Upda te Mode puede (inter na mente) crearuna sen ten cia SQL muy com pleja. Aun que de por sí no está mal uti li zar el

Mensajes de error 467

Page 502: Dsp

valor UpWhe reAll en el pará me tro Upda te Mode, algu nos con tro la do res debases de datos no son lo sufi cien te mente robus tos para mane jarlo. Para másinfor ma ción, con sulte “Upda te Mode” en la ayuda de Del phi.

Stack overflowPo si ble cau sa de error

1. Puede haber decla rado muchas varia bles (o unas pocas varia bles muygran des, como arrays) en un pro ce di miento o fun ción situado en una uni-dad com pi lada con la direc tiva de com pi la dor {$S+} (veri fi ca ción de pilaacti vada).

2. Puede haber decla rado muchas varia bles glo ba les (o unas pocas varia blesglo ba les muy gran des).

3. Puede estar uti li zando recur sión pro funda (inten cio nal) o tener una recur-sión infi nita (no inten cio nal) en el pro grama.

4. Puede estar pasando un regis tro muy grande como parámetro.5. Puede estar uti li zando muchos pro ce di mien tos o fun cio nes muy gran des

que se lla man mutua mente.6. Puede estar pasando pará me tros muy gran des por valor.

So lu ción rá pi da1. Reduzca el número de varia bles que esté uti li zando o aumente el tamaño

de la pila. Puede incre men tar el tamaño de la pila uti li zando la direc tivade com pi la ción {$M}. La sin ta xis para uti li zarla es:

{$M mins tack si ze, maxs tack si ze}

Los valo res por defecto son 16.384 y 1.048.576. El pri mero es el tamaño ini-cial con fir mado de la pila; el segundo es el tamaño total reser vado para lapila. Para dupli car el tamaño ini cial con fir mado, así como el tamaño totalreser vado, añada lo siguiente en el archivo .DPR del pro grama:

{$M 32768, 209752}

2. Reduzca el tamaño y can ti dad de las varia bles glo ba les.3. Si no está uti li zando deli be ra da mente la recur sión, veri fi que el código de

ges to res de even tos como OnChange, donde puede estar pro vo cando uncam bio que dis para el evento de nuevo, que pro voca el cam bio de nuevo,que dis para el evento de nuevo, etc.

4. Pase pun te ros a regis tros en lugar de pasar los pro pios regis tros.5. Divida los pro ce di mien tos y/o fun cio nes gran des en otros más pequeños.6. Pase las varia bles gran des como pará me tros varia bles o cons tan tes.

468 Los Tomos de Delphi: Delphi sin problemas

Page 503: Dsp

Infor ma ción adi cio nalEste es el error de tiempo de eje cu ción 202.3. Obte ner este error cuando se uti liza deli be ra da mente la recur sión es más

un pro blema de Del phi 1 que de Del phi de 32 bits, aun que la recur sión infi-nita (como la des crita antes en rela ción con el evento OnChange) será unpro blema tam bién en Del phi/Win dows de 32 bits.

5. Si un pro ce di miento o fun ción ocupa más de una pan ta lla de texto, seríacon ve niente divi dirlo en varios pro ce di mien tos más peque ños.

6. Los pará me tros pasa dos como Var o Const ocu pan cua tro bytes cada uno,ya que son pun te ros.

Para más infor ma ción, con sulte “stack over flow” en la ayuda de Del phi.

Statement expected, but expression of type <> foundPo si ble cau sa de error

Puede estar inten tando lla mar al pro ce di miento Abort de la uni dad SysUtils,pero tam bién tiene la uni dad DbiP rocs o BDE en la sec ción Uses.

So lu ción rá pi daCua li fi que la lla mada a Abort ante po niéndole el nom bre de la uni dad:

SysUtils.Abort;

Infor ma ción adi cio nalAmbas uni da des, SysUtils y DbiP rocs (Del phi 1) o BDE (Del phi de 32 bits) con-tie nen un pro ce di miento lla mado Abort. En este tipo de situa cio nes, sea explí-cito sobre cuál desea uti li zar, anteponiendo el nom bre de la uni dad en la quereside el pro ce di miento o fun ción, al nom bre del pro ce di miento o fun ción quedesea uti li zar.

Statements not allowed in interface partPo si ble cau sa de error

Puede haber aña dido una sen ten cia a la parte Inter face de una uni dad. Porejem plo, lo siguiente gene rará este men saje de error:

unit Unit4;in ter fa cepro ce du re Co lor Form Whi te(Sen der: TObject);be gin TForm(Sen der).Co lor := clWhi te;

Mensajes de error 469

Page 504: Dsp

end;im ple men ta tion

So lu ción rá pi daMueva el cuerpo del pro ce di miento a la parte Imple men ta tion de la uni dad.

Infor ma ción adi cio nalLa parte Inter face de una uni dad puede sola mente con te ner decla ra cio nes, nosen ten cias. Mueva los cuer pos de pro ce di mientos a la parte Imple men ta tion.

STORED clause not allowed in OLE automation sectionPo si ble cau sa de error

Puede estar inten tando uti li zar la cláu sula Sto red en la sec ción Auto ma ted.

So lu ción rá pi daEli mine la cláu sula Sto red de la sec ción Auto ma ted.

Infor ma ción adi cio nalDel phi 2 y supe rio res ofre cen cinco direc ti vas de visi bi li dad: Pri vate, Pro tec ted,Public, Publis hed y Auto ma ted (Del phi 1 no tiene la direc tiva Auto ma ted). Laspro pie da des de una clase pue den uti li zar una de las direc tiva de alma ce na-miento Stored, Default o Node fault. No obs tante, estas direc ti vas de alma ce na-miento no están per mi ti das en la sec ción Auto ma ted.

Stream Read ErrorPo si ble cau sa de error

Puede estar inten tando car gar un for mu la rio creado en Del phi de 32 bits enDel phi 1.

So lu ción rá pi daSi es fac ti ble, actua lí cese a una ver sión de Del phi de 32 bits, pre fe ri ble mentela ver sión más reciente. Si per siste en uti li zar en Del phi 1 el for mu la rio creadocon Del phi de 32 bits, borre todas las carac te rís ti cas espe cí fi cas de Del phi de32 bits del archivo de for mu la rio (.DFM). Car gue el archivo en un edi tor detexto corriente, como el Bloc de Notas, para hacer eso.

470 Los Tomos de Delphi: Delphi sin problemas

Page 505: Dsp

Infor ma ción adi cio nalAlgu nas de las cosas que hacen que los archi vos de for mu la rio (.DFM) de Del-phi de 32 bits no pue dan ser uti li za dos en Del phi 1 son las cade nas lar gas, eltipo TCo llec tion, y la heren cia de for mu la rios.

String constant truncated to fit STRING[ ]Po si ble cau sa de error

Puede haber asig nado una cadena a una varia ble cuyo tamaño es menor que elde la cadena que está inten tando asig nar. Por ejem plo, lo siguiente gene raráeste men saje de error:

var s: String[3];be gin s := ’string’;

So lu ción rá pi daModi fi que el tamaño de la cadena, o asigne una cadena que quepa en la varia-ble. Por ejem plo, cual quier de las siguien tes solu cio nes fun cio nará:

var s: String[6];be gin s := ’string’;

-O-

var s: String[3];be gin s := ’str’;

Infor ma ción adi cio nalPara más infor ma ción, con sulte “strings” en la ayuda de Del phi.

String [literal]s may have at most 255 elementsPo si ble cau sa de error

1. Puede haber decla rado una cadena corta de más de 255 caracteres. Porejem plo, la siguiente decla ra ción gene rará este men saje de error:

var s: string[256];

Mensajes de error 471

Page 506: Dsp

2. Puede haber asig nado una cadena de más de 255 carac te res a una cadenacorta. Por ejem plo, si declara una varia ble ShortString:

var s: ShortString;

y luego intenta asig narle una cadena de más de 255 caracteres, obten dráeste men saje de error.

3. Puede haber asig nado una cadena con más de 255 carac te res en una únicalínea del edi tor de código (en esta situa ción, el error se pro du cirá incluso sise tra baja con cade nas lar gas).

4. Puede haber decla rado una cons tante de cadena con más de 255 carac te res.Por ejem plo, si asignara el texto de la direc ción com pleta de Gettysburg auna cons tante de cadena, obten dría este men saje de error.

So lu ción rá pi da1. Ase gú rese de que el tamaño que declara cuando uti liza un ShortString es

menor que 256.2. No asigne una cadena de más de 255 carac te res a una varia ble de tipo

ShortString.3. Divida la cadena en varias líneas, y uti lice el ope ra dor de con ca te na ción

(+).4. Reduzca el tamaño de la cons tante de cadena o declare varias cons tan tes y

con ca té ne las, así:

const So mew hat Long = ’{Ca de na de has ta 255}’; KindOfLong = ’{Ca de na de has ta 255}’; SortOfLong = ’{Ca de na de has ta 255}’; Work Around Very LongString = So mew hat Long + KindOfLong + SortOfLong;

Infor ma ción adi cio nalPara más info ma ción, con sulte “string types” en la ayuda de Del phi.

Syntax Error in Field DefinitionPo si ble cau sa de error

Pro ba ble mente tiene un error de sin ta xis en una sen ten cia SQL. Por ejem plo,lo siguiente gene rará este men saje de error:

with TADOQuery.Crea te(nil) do be gin try Con nec tion := ADOCon nec tion1; SQL.Add(’ALTER TABLE SCRIPTURES’); SQL.Add(’ADD INDEX ORD_SEQ ON ORDER_SEQUENCE’);

472 Los Tomos de Delphi: Delphi sin problemas

Page 507: Dsp

ExecSQL; fi nally Free; end;end;

debido a que esa no es la sin ta xis apro piada para aña dir un índice a una tabla.ADO cree que usted está inten tando crear una nueva columna para la tabla,pero esa tam poco es la sin ta xis ade cuada para ello.

So lu ción rá pi daUti lice la sin ta xis apro piada. En el caso de arriba, sería:

with TADOQuery.Crea te(nil) do be gin try Con nec tion := ADOCon nec tion1; SQL.Add(’CREATE INDEX ORD_SEQ ON SCRIPTURES(ORDER_SEQUENCE)’); ExecSQL; fi nally Free; end;end;

En otras pala bras, la sin ta xis SQL correcta en este caso es:

CREATE INDEX <NombreIndice> ON <Nom bre Ta bla>(<Nom breCampo>)

Infor ma ción adi cio nalUti lice la refe ren cia de SQL de la base de datos que esté uti li zando para deter-mi nar la sin ta xis correcta. La sin ta xis es generalmente la misma entre lasdife ren tes bases de datos, pero hay lige ras variaciones. Si no tiene o no puedeencon trar la docu men ta ción de SQL de la base de datos, puede encon trar unejem plo bus cando en el disco duro, y segu ra mente podrá encon trar un ejem plobus cando en sitios de Inter net como www.tama racka.com o www.deja news.com.Por ejem plo, en el caso de arriba busque “CREATE INDEX”.

Syntax error in query. Incomplete query clausePo si ble cau sa de error

Puede estar inten tando acce der a una tabla de Access que tiene espa cios en sunom bre, pero ha olvi dado ence rrar el nom bre de la tabla entre cor che tes. Porejem plo, puede haber hecho algo así:

SELECT *FROM "ROUND TABLE"

Mensajes de error 473

Page 508: Dsp

So lu ción rá pi daEncie rre el nom bre de la tabla entre cor che tes, así:

SELECT *FROM [ROUND TABLE]

Infor ma ción adi cio nalCon sulte el archivo LOCALSQL.HLP de Del phi, así como la docu men ta ción delSQL de la base de datos que esté uti li zando, para cono cer la sin ta xis de SQLespe cí fica del fabri cante.

Syntax error in real numberPo si ble cau sa de error

Puede haber aña dido un fac tor de escala a un número de punto flo tante sinsegui da mente haber escrito el exponente. Por ejem plo, lo siguiente gene raráeste men saje de error:

var Mint: Dou ble;be gin Mint := 123.E;

So lu ción rá pi daAñada un número al fac tor de escala (E):

var Mint: Dou ble;be gin Mint := 123.E7;

Infor ma ción adi cio nalE sig ni fica “diez ele vado a”.

System unit out of date or corruptedPo si ble cau sa de error

La ruta de bús queda de biblio tecas puede estar apun tando a una ver sión obso-leta de SYSTEM.DCU, o SYSTEM.DCU puede haberse dañado.

474 Los Tomos de Delphi: Delphi sin problemas

Page 509: Dsp

So lu ción rá pi daCom pruebe que la ruta de bús queda de biblio te cas no apunte a una ver sión“erró nea” de SYSTEM.DCU, por ejem plo a una uni dad de ter ce ros lla madaSystem. Selec cione Tools | Envi ron ment Options | Library | LibraryPath. Una manera “rápida” de bus car uni da des “rene ga das” es uti li zar la bús-queda de archi vos y car pe tas del Explo ra dor de Win dows. Si no encuen tra nin-guna ano ma lía de esta natu ra leza, reins tale SYSTEM.DCU del CD.

Infor ma ción adi cio nalNunca dé a una uni dad suya el mismo nom bre que una uni dad de Del phi. Noasuma que conoce los nom bres de todas las uni da des de Del phi. Ya no esta mosen el terreno de Del phi 1 (al menos la mayo ría de noso tros). A menos que hayapres tado aten ción a los nom bres de las uni da des y tenga una memo ria foto grá-fica, lo más pro ba ble es que las olvide. El método pre fe rido es uti li zar un con-ve nio de nom bres para sus pro pias uni da des, del mismo modo que debenhacerlo los desa rol lla do res de com po nen tes. Puede ante po ner sus ini cia les, olas ini cia les de su com pa ñía, y podrá estar bas tante seguro que no tra tará connom bres de uni da des dupli ca dos. Por ejem plo, si tra baja para una com pa ñíadeno mi nada Drywall Roo fing & Insu la tion Supply, podría asig nar a sus uni da-des nom bres como DRISStrUtils, DRISConsts, DRISGlo bal, etc.

Table cannot be opened for exclusive usePo si ble cau sa de error

Puede estar inten tando lle var a cabo sobre una tabla abierta una acción querequiere que la tabla esté cerrada para poder ser lle vada a cabo. Por ejem plo,no puede vaciar una tabla (lla mando al método EmptyTa ble de TTa ble) o aña-dir índi ces a una tabla que esté abierta.

So lu ción rá pi daCie rre pri mero la tabla lla mando al método Close de TTa ble, o asigne False asu pro pie dad Active. Luego puede lle var a cabo la acción, des pués de la cualpodrá lla mar al método Open de TTa ble o asig nar True a la pro pie dad Active.

Infor ma ción adi cio nalOpen es un método de TTa ble, que puede lla marse así:

Ta ble1.Open;

Active es una pro pie dad de TTa ble, que puede ser asig nada así:

Ta ble1.Acti ve := True;

Mensajes de error 475

Page 510: Dsp

Si trata de aña dir un segundo índice por un mismo campo mediante código,tam bién se gene rará este men saje de error.

Por ejem plo, la segunda línea en el siguiente frag mento de código pro duce esteerror:

Ta ble1.AddIndex('Last Na meAsc', 'Last Na me', []);Ta ble1.AddIndex('Last Na me Desc', 'Last Na me', [ix Des cen ding]);

Table corrupt—other than headerPo si ble cau sa de error

Puede estar uti li zando tablas de Para dox sobre una red Win dows NT y no haasig nado True a Local Share en cada uno de los clien tes y/o tiene habi li ta doslos blo queos opor tu nistas.

So lu ción rá pi daAsig nar True al pará me tro Local Share (en la página System de la uti li dadBDE Con fi gu ra tion) en todos los clien tes y des ha bi lite los blo queosopor tu nistas.

Infor ma ción adi cio nalPara des ha bi li tar los blo queos opor tu nis tas, debe edi tar (o crear, si es nece sa-rio) dos valo res en el Regis tro del sis tema siguiendo estos pasos:1. Selec cione Ini cio | Eje cu tar en el escri to rio de Win dows.2. Intro duzca rege dit en el cua dro de com bi na ción Abrir y pulse el botón

Acep tar.3. Navegue hasta HKEY_LOCAL_MACHINE\System\Current Con trol Set\

Ser vi ces\Lan man Ser ver\Para me ters.4. Edite o cree la clave Ena bleO plock y asíg nele el valor 0.5. Edite o cree la clave UseOp por tu nis tic Loc king y asíg nele el valor 0.6. Rei nicie para que la con fi gu ra ción tenga efecto.

Table does not existPo si ble cau sa de error

1. Puede tener un error en la sen ten cia SQL. Veri fi que la orto gra fía en la pro-pie dad SQL del objeto TQuery, ya que puede fal tar el nom bre de la tabla.

2. Puede haber inten tado asig nar True a la pro pie dad Active de un objetoTTa ble sin pro por cio nar un valor válido a la pro pie dad Data ba se Name.

476 Los Tomos de Delphi: Delphi sin problemas

Page 511: Dsp

3. Puede estar inten tando uti li zar un com po nente TBat chMove, habiendoasig nado a su pro pie dad Upda te Mode un valor dis tinto de batCopy, y latabla de des tino no corres ponde a una tabla exis tente en la ubi ca ción espe-ci fi cada por la pro pie dad Data ba se Name.

4. Puede estar inten tando acce der a tablas Ora cle a tra vés de una sen ten ciaSQL uti li zando un objeto TQuery con la pro pie dad Request Live asig nada aTrue, pero ha olvi dado escri bir en mayús cu las los nom bres de las tablas.

5. Puede estar inten tando acce der a tablas de MS SQL Ser ver, y ha olvi dadoante po ner dbo. al nom bre de la tabla. Por ejem plo, puede estar uti li zandoel siguiente tipo de sen ten cia SQL:

SELECT * FROM Coo per

6. Puede estar inten tando acce der a una tabla que está activa en otro hilo ocone xión.

So lu ción rá pi da1. Si falta el nom bre de la tabla, modi fi que la sen ten cia SQL.2. Pro por cione el nom bre de un alias válido en la pro pie dad Data ba se Name

del objeto TTa ble.3. Com pruebe que el con junto de datos que ha espe ci fi cado como fuente

(TQuery, TSto redP roc o TTa ble) exista y que el TTa ble que ha espe ci fi cadocomo des tino exista.

4. Escriba en mayús cu las los nom bres de las tablas cuando acceda a Ora cle.5. Ante ponga dbo. al nom bre de la tabla. Por ejem plo:

SELECT * FROM dbo.Coo per

6. Com pruebe que la tabla a la que está inten tando acce der está abierta en elhilo actual (si su apli ca ción es una apli ca ción mul tihilo). Com pruebe elvalor del pará me tro SQLPASSTHRU MODE para el con tro la dor de su basede datos con la uti li dad BDE Con fi gu ra tion. Si está asig nada a NOTSHARED, puede estar inten tando leer los datos de una tabla tem po ral queestá dis po ni ble a tra vés de otra cone xión.

Infor ma ción adi cio nal5. dbo sig ni fica “data base owner” (pro pie ta rio de la base de datos).

Table does not support this operationPo si ble cau sa de error

1. Puede estar uti li zando SQL Anywhere y lla mando al método Record Countde un objeto TTa ble aso ciado a una tabla que con tiene cam pos memo.

Mensajes de error 477

Page 512: Dsp

2. Puede estar acce diendo a tablas de MS SQL Ser ver y olvidó ante po ner dbo.al nom bre de la tabla. Por ejem plo, puede tener un sen ten cia SQL como:

SEECT * FROM UHF

3. Puede estar inten tando lla mar a Refresh sobre un TQuery aso ciado a unabase de datos SQL Ser ver (Ora cle, MS SQL Ser ver, Inter Base, etc.) quetiene asociada una con sulta com pleja o que invo lu cra pro duc toscartesianos.

So lu ción rá pi da1. Si está lla mando a Record Count para deter mi nar si la can ti dad de regis-

tros es 0, podría veri fi car en su lugar si la tabla está simul tá nea mente alcomienzo y al final del archivo, así:

if (tblHo llow.bof) and (tblHo llow.eof) then

Si quiere saber cuán tos regis tros tiene la tabla, puede uti li zar una sen ten-cia SQL como:

SELECT COUNT(*) FROM MONTECRISTO

2. Ante ponga dbo. al nom bre de la tabla. Por ejem plo:

SELECT * FROM dbo.UHF

3. Llame al método Close del objeto TDa ta set y luego al método Open enlugar de lla mar a Refresh si tiene este pro blema con Refresh.

Infor ma ción adi cio nalCon sulte la docu men ta ción espe cí fica de su base de datos para cono cer las par-ti cu la ri da des del SQL que soporta.

Table is busyPo si ble cau sa de error

1. Puede haber inten tado aña dir un índice en el código (uti li zando el métodoAddIndex de TTa ble) sin tener acceso exclu sivo a la tabla.

2. Puede haber inten tado copiar regis tros de una tabla a otra uti li zando elcom po nente TBat chMove en modo bat Copy mien tras la tabla de des tinoestaba abierta.

3. Puede haber inten tado abrir una tabla en modo Exclu sive cuando otrousua rio tenía la tabla abierta.

4. Puede tener una tabla abierta en el entorno inte grado (o en el Data baseDesk top), y está inten tando pos te rior mente abrirla en tiempo de eje cu ciónen su pro yecto.

5. Puede estar lla mando al método EmptyTa ble de TTa ble y la tabla estáactiva o abierta.

478 Los Tomos de Delphi: Delphi sin problemas

Page 513: Dsp

So lu ción rá pi da1. Cie rre pri mero el TTa ble y asigne True a la pro pie dad Exclu sive.2. Cie rre la tabla de des tino antes de copiar los regis tros a ella. Puede hacer

esto lla mando al método Close de TTa ble o asig nán dole False a la pro pie-dad Active del com po nente.

3. Encie rre la sen ten cia que asigna True a la pro pie dad Exclu sive en un blo-que Try. . . Except, para pro por cio narle al usua rio un men saje infor ma tivodel pro blema si es impo si ble uti li zar la tabla en modo exclu sivo debido aque otro usua rio la tiene abierta.

4. Asigne False a la pro pie dad Active del TTa ble en el entorno inte grado.5. Llame al método Close de TTa ble o asigne False a su pro pie dad Active

antes de inten tar lla mar a EmptyTa ble.

Infor ma ción adi cio nalVarios usua rios pue den ver la misma infor ma ción simul tá nea mente, pero nopue den edi tar la misma infor ma ción al mismo tiempo.5. Debe tener uso exclu sivo de la tabla antes de lla mar a EmptyTa ble.

Inten tar asig nar True a la pro pie dad Exclu sive de la tabla mien tras la pro-pie dad Active tiene el valor True pro duce el men saje de error “Can notper form this ope ra tion on an open data set”. Con sulte esa entradapara más infor ma ción.Si otro usua rio tiene una tabla abierta en modo exclu sivo y usted la intentaabrir, reci birá el men saje de error “File is Loc ked. Table: <> User: <>”.Con sulte esa entrada para infor ma ción más espe ci fica.

Table is fullPo si ble cau sa de error

Puede estar exce diendo la capa ci dad máxima de una tabla Para dox.

So lu ción rá pi daTen drá que incre men tar el tamaño del blo que con la uti li dad BDE Con fi gu ra-tion/Admi nis tra tion, o eva luar el paso a una base de datos de ser vi dor SQLcomo Inter Base (u Ora cle, MS SQL Ser ver, etc.).

Para incre men tar el tamaño de blo que en la uti li dad BDE Con fi gu ra tion, modi-fi que el valor del pará me tro Block Size en la página/nodo Dri vers | Para doxde la uti li dad BDE Con fi gu ra tion. Todas la tablas de Para dox que cree a par tirde ese momento refle ja rán la nueva con fi gu ra ción. Para apli car la con fi gu ra-ción a una tabla ya exis tente, cree una nueva tabla uti li zando la estruc tura dela tabla exis tente, y luego copie los datos de la tabla ori gi nal a la nueva tabla.

Mensajes de error 479

Page 514: Dsp

Infor ma ción adi cio nalLas tablas Para dox pue den dis po ner de un máximo de 65.536 (64 K) blo ques.El tamaño por defecto del blo que es de 2.048 bytes (2 KB), y por lo tanto eltamaño máximo por defecto de una tabla Para dox es de 128 MB. Incre men tarel tamaño del blo que a 32.768 (32 KB) le per mi tirá crear tablas de hasta 2 GB.

La siguiente tabla mues tra el tamaño máximo de una tabla en base a la con fi-gu ra ción del pará me tro Block Size en la con fi gu ra ción del BDE:

Tamaño bloque Tamaño máximo de tabla

2 KB 128 MB

4 KB 256 MB

8 KB 512 MB

16 KB 1.024 MB

32 KB 2.048 MB

Table is not indexedPo si ble cau sa de error

Puede estar inten tando crear un índice secun da rio sobre una tabla Para doxque no tiene un índice pri ma rio.

So lu ción rá pi daCree un índice pri ma rio para la tabla antes de crear un índice secun da rio.Puede hacer esto uti li zando el Data base Desk top o en el código. Para crear elíndice pri ma rio uti li zando el Data base Desk top, mar que la columna Key (opulse la barra espa cia dora) de las n pri me ras colum nas de la tabla.

Para crear un índice pri ma rio mediante código, siga el siguiente ejem plo:

AddIndex('Stadt', 'Stadt', [ixP ri mary]);

Infor ma ción adi cio nalSi la clave pri ma ria consta de sola mente una columna, ésta debe ser la pri-mera columna de la tabla. Si es una clave com puesta, debe comen zar con lapri mera columna y luego incluir todas las colum nas con se cu ti vas siguien tes,hasta la última columna que quiera uti li zar (por ejem plo, si quiere uti li zar lapri mera y ter cera colum nas en la clave com puesta, deberá uti li zar tam bién lasegunda). Si está aña diendo el índice mediante código, separe los nom bres delas colum nas que com po nen la clave pri ma ria com puesta con pun tos y comas,así:

480 Los Tomos de Delphi: Delphi sin problemas

Page 515: Dsp

AddIndex('Dog fa ceIn dex', 'Na me;Rank;Se rial Num ber', [ixP ri mary]);

Para más infor ma ción, con sulte “secon dary inde xes” en la ayuda de Del phi.

Table is read onlyPo si ble cau sa de error

1. Puede haber inten tado lla mar al método Edit o Delete de un objeto TTa blecuya pro pie dad ReadOnly tiene asig nado el valor True.

2. Puede estar inten tando edi tar el resul tado de una con sulta que conectavarias tablas.

3. Puede estar inten tando edi tar el resul tado de una con sulta sobre una únicatabla, y el pará me tro Request Live del objeto TQuery tiene asig nado False.

So lu ción rá pi da1. Asigne pri mero False a la pro pie dad ReadOnly, y luego llame al método

Edit o Delete. Ase gú rese de que la pro pie dad Active del objeto TTa bletenga asig nado False antes de inten tar asig nar valor a la pro pie dadReadOnly.

2. Uti lice actua li za cio nes en caché (cached upda tes) para edi tar el con juntoresul tado de una con sulta sobre varias tablas.

3. Asigne True a Request Live.

Infor ma ción adi cio nalEl método Delete de TTa ble borra el regis tro actual úni ca mente. Para borrartodos los regis tros de una tabla, uti lice el método EmptyTa ble. Para borrar nosólo todos los regis tros, sino tam bién la pro pia tabla (la estruc tura), uti lice elmétodo Dele te Ta ble. La tabla debe estar cerrada antes de la lla mada aDele te Ta ble.

Para borrar selec ti va mente regis tros que cum plan cierto cri te rio, uti lice uncom po nente TQuery y asigne su pro pie dad SQL según los siguien tes patro nes:

DELETE FROM Expen da ble {para bo rrar to dos los re gis tros}DELETE FROM Outs tan ding Debts WHERE Amount > 10 {para bo rrar to dos los re gis tros que ten gan un va lor ma yor que 10 en el cam po Amount}

Mensajes de error 481

Page 516: Dsp

Table or View does not existPo si ble cau sa de error

1. Puede no tener dere chos para ver la tabla o vista a la que está inten tandoacce der.

2. Puede estar uti li zando una con sulta “viva” (con valor True en su pro pie dadRequest Live) y no haber uti li zado las mayús cu las para espe ci fi car el nom-bre de la tabla. Por ejem plo, lo siguiente gene rará este men saje de error:

SELECT * FROM Round

So lu ción rá pi da1. Si tiene dere chos para asig nar dere chos, asíg ne se los para que pueda ver la

tabla o vista. Si no tiene dere chos para asig nar dere chos, con sulte al admi-nis tra dor de la base de datos.

2. Si asigna True a la pro pie dad Request Live de un com po nente TQuery, uti-lice letras mayús cu las para espe ci fi car el nom bre de la tabla. Por ejem plo:

SELECT * FROM ROUND

Infor ma ción adi cio nalCon sulte la docu men ta ción espe cí fica de la base de datos que esté uti li zando enrela ción con las par ti cu la ri da des de la ver sión de SQL que ésta soporta. Porejem plo, Ora cle uti liza PL/SQL, Micro soft MS SQL Ser ver uti liza Tran sactSQL, etc.

TActiveFormX declaration missing or incorrectPo si ble cau sa de error

Puede haber cam biado el nom bre de una CoC lass antes de cam biar el nom bredel for mu la rio.

So lu ción rá pi daEdite el archivo de for mu la rio (.DFM) pul sando con el botón dere cho del ratónsobre el for mu la rio y selec cio nando View As Text del menú de con texto.Encuen tre la línea:

ob ject Acti ve FormX: TActi ve FormX

y modi fí quela para que con tenga el nom bre su varia ble de ins tan cia y su tipode clase, por ejem plo:

ob ject Wha te ver: TWha te ver

482 Los Tomos de Delphi: Delphi sin problemas

Page 517: Dsp

Luego pulse el botón dere cho del ratón sobre el archivo .DFM y selec cioneView As Form del menú de con texto.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “Acti veX appli ca tions” en la ayuda de Del phi.

Text after final ENDPo si ble cau sa de error

Puede tener algún texto des pués del End final. (El End final va seguido de unpunto en lugar de un punto y coma).

So lu ción rá pi daBorre las líneas que sobran.

Infor ma ción adi cio nalEste error muchas veces con ti núa aún des pués de borrar el texto que está des-pués del End final, pero no impide la com pi la ción. En este caso, la frase “igno-red by com pi ler” se añade al men saje de error.

The <>.EXE file is linked to missing export <>.DPL:<>Po si ble cau sa de error

Puede haber creado una apli ca ción que uti liza paque tes, y actua lizó uno o másde los paque tes que usa sin actua li zar el .EXE.

So lu ción rá pi daActua lice el eje cu ta ble si actua liza uno o más de los paque tes que éste uti liza.Alter na ti va mente, renom bre el paquete cuando lo actua lice para ase gu rarse deque la ver sión anti gua del eje cu ta ble toda vía puede ser eje cu tada (uti li zando laver sión anti gua del paquete).

Infor ma ción adi cio nalSi renom bra los paque tes que actua liza, la ver sión anti gua del eje cu ta ble bus-cará la ver sión anti gua del paquete. El nuevo paquete sola mente será encon-trado por una nueva ver sión del eje cu ta ble.

Puede tam bién reci bir el men saje de error “A device atta ched to the systemis not func tio ning” des pués de este men saje de error.

Mensajes de error 483

Page 518: Dsp

The <> method referenced by <>.<> does not exist. Remove thereference?

Po si ble cau sa de errorPuede haber borrado un método del código, pero el for mu la rio man tiene unarefe ren cia a él en la página de even tos.

Alter na ti va mente, puede estar inten tando asig nar un ges tor de even tos a unevento que puede que exista (a pesar del men saje de error), pero el ges tor deeven tos no está decla rado en la parte Publis hed de la decla ra ción del tipo.

So lu ción rá pi daSelec cione Yes para borrar la refe ren cia al código que no existe.

Infor ma ción adi cio nalSi selec ciona Yes, la refe ren cia al método será borrada de la página de even tosdel for mu la rio (éste no que dará aso ciado a nin gún evento en par ti cu lar).

Si borra un método de la parte Imple men ta tion sin borrar su decla ra ción en laparte Inter face, obten drá un men saje de error de refe ren cia no resuelta. Siborra la decla ra ción de la parte Inter face sin borrar el método de la parteImple men ta tion, obten drá un men saje de error de iden ti fi ca dor no decla rado.Si borra los dos (pero ha aso ciado el método a un evento en el Inspec tor deObje tos), el men saje bajo dis cu sión se mos trará cuando intente com pi lar.

En un for mu la rio nor mal o archivo de uni dad .PAS, no hay nin guna decla ra-ción Publis hed explí cita. Todos los méto dos que usted añade son auto má ti ca-mente colocados en la sec ción ini cial de la decla ra ción del for mu la rio, que esPublis hed aun que no se designe explí ci ta mente como tal. Cual quier miem broque no se designe explí ci ta mente de otra manera (por ejem plo, Pri vate oPublic) es Publis hed. Los méto dos que uti lice como ges to res de even tos debenser decla ra dos en la sec ción Publis hed para que pro duz can RTTI (Run-TimeType Infor ma tion - infor ma ción de tipos en tiempo de eje cu ción) y por lo tantoestén dis po ni bles como méto dos apro pia dos para ser aso cia dos a un evento. Elesque leto de este tipo de archivo que es pro du cido por Del phi cuando añade supri mer for mu la rio a un pro yecto es simi lar a esto:

unit Unit1;in ter fa ceuses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Con trols, Forms, Dia logs;type TForm1 = class(TForm) {ésta es la sec ción Pu blis hed} pri va te { De cla ra cio nes Pri va te }

484 Los Tomos de Delphi: Delphi sin problemas

Page 519: Dsp

pu blic { De cla ra cio nes Pu blic } end;var Form1: TForm1;im ple men ta tion{$R *.DFM}end.

Des pués de crear un botón y aso ciarle un ges tor de even tos, el archivo .PASten drá la siguiente apa rien cia:

unit Unit1;in ter fa ceuses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Con trols, Forms, Dia logs;type TForm1 = class(TForm) {ésta es la sec ción Pu blis hed} But ton1: Tbut ton; {Los com po nen tes que co lo que so bre el for mu la rio se rán co lo ca dos en la sec ción Pu blis hed} pro ce du re But ton1 Click(Sen der: TObject); {Los ges to res de even tos que cree se rán co lo ca dos en la sec ción Pu blis hed} pri va te { De cla ra cio nes Pri va te } pu blic { De cla ra cio nes Pu blic } end;var Form1: TForm1;im ple men ta tion{$R *.DFM}end.

Esto es dife rente a lo que ocu rre en el caso de un archivo de com po nente .PAS,que con tiene explí ci ta mente sec cio nes Pri vate, Pro tec ted, Public y Publis hed.El siguiente código es del que usted deberá par tir si uti liza el Asis tente deCom po nen tes (Com po nent Wizard) para crear un nuevo com po nente basado enel com po nente TString Grid:

unit String Grid1;in ter fa ceuses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Con trols, Forms, Dia logs, Grids;type TString Grid1 = class(TString Grid) pri va te { De cla ra cio nes Pri va te } pro tec ted

Mensajes de error 485

Page 520: Dsp

{ De cla ra cio nes Pro tec ted } pu blic { De cla ra cio nes Pu blic } pu blis hed { De cla ra cio nes Pu blis hed } end;pro ce du re Re gis ter;

im ple men ta tionpro ce du re Re gis ter;be gin

Re gis ter Com po nents('Sam ples', [TString Grid1]);end;end.

The <> method referenced by <>.<> has an incompatibleparameter list. Remove the reference?

Po si ble cau sa de errorPuede haber cam biado la lista de pará me tros ori gi nal del método (la que estáen la parte Inter face).

So lu ción rá pi daModi fi que la lista de pará me tros del método en la parte Inter face para que secorres ponda con la defi ni ción en la parte Imple men ta tion.

Infor ma ción adi cio nalSi selec ciona Yes, la refe ren cia al método será borrada de la página de even tosdel for mu la rio (éste no que dará aso ciado a nin gún evento en par ti cu lar).

The application or DLL <> is not a valid Windows image. Pleasecheck this against your installation diskette.

Po si ble cau sa de errorPuede haber inten tado regis trar un ser vi dor de auto ma ti za ción de Del phiantes de com pi larlo. Por ejem plo, si escribe <Pro yecto>.DPR /reg ser ver enla línea de coman dos, obten drá este men saje de error.

So lu ción rá pi daSelec cione Run | Para me ters, intro duzca <Pro yecto> /reg ser ver, y pulseF9 (eje cu tar).

486 Los Tomos de Delphi: Delphi sin problemas

Page 521: Dsp

Infor ma ción adi cio nalSi escribe <Pro yecto> /reg ser ver en la línea de coman dos, Win dows le avi-sará que debe espe ci fi car una exten sión. Puede tam bién uti li zar la uti li dadTRegSvr de Bor land. Con sulte el pro yecto de demos tra ción “\Demos\Acti veX\TRegSvr”.

The changes you requested to the table were not successful becausethey would create duplicate values in the index, primary key, orrelationship. Change the data in the field or fields that containduplicate data, remove the index, or redefine the index to permitduplicate entries and try again.

Po si ble cau sa de errorPuede estar inten tando gra bar a tra vés de ADO un regis tro que oca sio na ríauna vio la ción de clave.

So lu ción rá pi daEl men saje de error dice todo lo que nece sita usted saber: “Modi fi que el valordel campo o cam pos que con tie nen datos dupli ca dos, borre el índice o rede fí nalopara per mi tir entra das dupli ca das e intén telo de nuevo”.

Infor ma ción adi cio nalEste men saje de error es inu sual, en el sen tido de que es muy explí cito sobre loque puede ser la causa del error y explica cómo rec ti fi car la situa ción. Tam biénes, indu da ble mente, el men saje de error más largo en este libro.

The Edit Buffer of <> is marked read-onlyPo si ble cau sa de error

Puede estar inten tando edi tar un archivo blo queado. Por ejem plo, puede estarinten tando hacer cam bios a un archivo que ha sido mar cado como de sólo lec-tura desde un sis tema de con trol de ver sio nes como PVCS.

So lu ción rá pi daMar que el archivo como apto para escri tura, y luego haga los cam bios.

Mensajes de error 487

Page 522: Dsp

Infor ma ción adi cio nalPuede estar indi rec ta mente inten tando edi tar el archivo. Por ejem plo, puedehaber inten tado colo car un com po nente sobre un for mu la rio, lo cual pro ducemodi fi ca cio nes tanto en la uni dad (.PAS) como en el archivo de for mu la rio(.DFM) corres pon diente.

The Master Source property of <> must be linked to a DataSourcePo si ble cau sa de error

Puede haber inten tado asig nar la pro pie dad Mas ter Fields de un com po nenteTTa ble sin pri mero haber asig nado la pro pie dad Mas ter Source.

So lu ción rá pi daSelec cione un com po nente TDa ta Source como la pro pie dad Mas ter Source delobjeto TTa ble, y luego asigne la pro pie dad Mas ter Fields.

Infor ma ción adi cio nalPara más infor ma ción, con sulte “Mas ter/Detail forms” en la ayuda de Del phi.

The OLE control may possibly require support libraries that are noton the current search path or are not present on your system

Po si ble cau sa de errorPuede estar inten tando ins ta lar un VBX de 16 bits (con trol de Visual Basic) enDel phi de 32 bits.

So lu ción rá pi daInstale los con tro les VBX de 16 bits en Del phi 1 sola mente (no en Del phi de 32bits).

Infor ma ción adi cio nalPara Del phi de 32 bits (y Win dows en gene ral), nece si tará OCXs de 32 bits (enlugar de VBXs).

488 Los Tomos de Delphi: Delphi sin problemas

Page 523: Dsp

The package already contains unit named <>Po si ble cau sa de error

Está inten tando ins ta lar un com po nente den tro de un paquete que ya con tieneun com po nente con el mismo nom bre.

So lu ción rá pi daCom pruebe si la uni dad que está tra tando de ins ta lar ya existe en el paquete(es con tra po si ción a un com po nente con una fun cio na li dad dis tinta pero con elmismo nom bre).

Si la uni dad es real mente la misma, sim ple mente desista de tra tar de ins ta-larla otra vez. Si es dife rente en fun cio na li dad pero no en el nom bre, renom brela uni dad que está inten tando ins ta lar e intén telo de nuevo.

Infor ma ción adi cio nalComo la mayo ría de las cosas, los paque tes tie nen ven ta jas y des ven ta jas. Pri-mero las malas noti cias: los paque tes aña den com ple ji dad al pro ceso de desa-rro llo y dis tri bu ción e intro du cen más pro ble mas poten cia les. Una de lasprin ci pa les ven ta jas de Del phi 1 (sobre Visual Basic, en par ti cu lar) era queper mi tía crear una solu ción de un archivo: todo lo que se nece sita dis tri buir esun sim ple .EXE (por supuesto, esto no tiene en cuenta las apli ca cio nes de basesde datos, donde otros archi vos nece si tan ser dis tri bui dos). El uso de paque tesobliga a dis tri buir varios archi vos al usua rio.

Las bue nas noti cias en rela ción con los paque tes es que pue den aho rrar espa ciode RAM y disco duro si la máquina de des tino tiene ins ta la das varias apli ca cio-nes escri tas en Del phi. En lugar de tener el núcleo de la fun cio na li dad de Del-phi embe bida cada eje cu ta ble, los paque tes per mi ten dis tri buir un eje cu ta bleredu cido que llama a los paque tes (.DLLs espe cí fi cas de Del phi) cuando nece-sita cierta fun cio na li dad.

The package already requires a package named <>Po si ble cau sa de error

Puede haber inten tado aña dir un paquete a la sec ción Requi red de otropaquete que ya ha sido espe ci fi cado en la sec ción Requi red del pri mer paquete.

So lu ción rá pi daSelec cione OK. El paquete no es aña dido por segunda vez.

Mensajes de error 489

Page 524: Dsp

Infor ma ción adi cio nalPara más infor ma ción, con sulte “pac ka ges” en la ayuda de Del phi.

The page cannot be displayedPo si ble cau sa de error

Puede haber espe ci fi cado inco rrec ta mente el puerto en el URL, o nin gúnpuerto, o está escu chando por el puerto equi vo cado en su apli ca ción SiteExpress.

So lu ción rá pi daCom pruebe que la apli ca ción ser vi dora está con fi gu rada para escu char por elpuerto correcto, y que la apli ca ción cliente está inten tando conec tarse al mismopuerto.

Infor ma ción adi cio nalSi está pro bando una apli ca ción Site Express, puede uti li zar el siguiente tipode URL: http://local host:1024/Svrinfo.exe

Local host es su máquina (IP # 127.0.0.1); está inten tando conec tarse al puerto1024 y eje cu tar la apli ca ción Svrinfo.

Site Express apa re ció por pri mera vez en Del phi 6.

The path entered does not existPo si ble cau sa de error

Puede haber selec cio nado el botón Finish en el Asis tente de Apli ca cio nes(Appli ca tion Wizard) sin haber espe ci fi cado una ruta válida en el cua dro deedi ción donde se debe indi car dónde la apli ca ción se alma cena.

So lu ción rá pi daIntro duzca direc ta mente o nave gue hasta (uti li zando el botón Browse) unaruta válida en donde guar dar la apli ca ción.

Infor ma ción adi cio nalLa ruta no sola mente debe ser una uni dad y un nom bre válido, sino que debeexis tir — Del phi no creará el direc to rio si no existe.

490 Los Tomos de Delphi: Delphi sin problemas

Page 525: Dsp

The procedure entry point <> cannot be found in the dynamic linklibrary <>.DLL

Po si ble cau sa de error1. Puede haber escrito mal o no haber uti li zado la com bi na ción ade cuada de

mayús cu las/minús cu las en el nom bre de un pro ce di miento o fun ción en laapli ca ción que hace la lla mada.

2. Puede haber olvi dado colo car el pro ce di miento o fun ción en la sec ciónExports de la .DLL.

So lu ción rá pi da1. Com pruebe que el nom bre del pro ce di miento o fun ción esté escrito

correc ta mente.2. Colo que el pro ce di miento o fun ción en la sec ción Exports de la .DLL.

Infor ma ción adi cio nalAun que .DLL sig ni fica “Libre ría de Enlace Diná mico” (Dyna mic Link Library),puede ser real mente enla zada está ti ca mente (en cuyo caso el pro grama no sepodrá eje cu tar si hay un pro blema con la .DLL) o diná mi ca mente, uti li zandolas fun cio nes Load Li brary y GetP rocAddress.

The project already contains a form or module named <>Po si ble cau sa de error

Puede estar inten tando darle a un for mu la rio o uni dad el mismo nom bre deotro ya exis tente en el pro yecto. Puede ser que esté tra tando de asig narle a unfor mu la rio el mismo nom bre de archivo que el nom bre de com po nente que le haasig nado en el Inspec tor de Obje tos (o el nom bre que Del phi asigna por defecto)— por ejem plo, Form1.

So lu ción rá pi daEspe ci fi que un nom bre único para el for mu la rio o uni dad.

Infor ma ción adi cio nalEl nom bre que asigne a un for mu la rio en el Inspec tor de Obje tos será el nom-bre de la clase (Form1 por defecto). La clase se con vierte en un objeto entiempo de eje cu ción, cuando se crea su ins tan cia.

Mensajes de error 491

Page 526: Dsp

El nom bre bajo el que grabe la uni dad será el nom bre del archivo (Unit1 pordefecto). Este es el nom bre que verá en los cua dros de diá logo Open y Save, enel Explo ra dor de Win dows, etc.

En el código, haga refe ren cia al for mu la rio por su nom bre de objeto/clase,excepto en la sec ción Uses. Por ejem plo, ésta es una decla ra ción de for mu la riosen ci lla:

unit Unit1; {nom bre por de fec to del pri mer for mu la rio o uni dad del pro yec to}in ter fa ceuses Win dows, Mes sa ges, SysUtils, Clas ses, Grap hics, Con trols, Forms, Dia logs;type TForm1 = class(TForm) {nom bre por de fec to de la cla se del pri mer for mu la rio del pro yec to} pri va te { De cla ra cio nes Pri va te } pu blic { De cla ra cio nes Pu blic } end;var Form1: TForm1; {va ria ble de ob je to por de fec to y nom bre de cla se del pri mer for mu la rio del pro yec to}im ple men ta tionuses {sec ción Uses au xi liar op cio nal; útil para evi tar erro res de re fe ren cia cir cu lar en tre uni da des} Unit2; {se hace re fe ren cia a otros for mu la rios del pro yec to por sus nom bres de ar chi vos (y no por sus nom bres de com po nen tes)}{$R *.DFM}end.

The Resource DLL Wizard requires a project to be openPo si ble cau sa de error

Puede haber selec cio nado el Asis tente de .DLLs (File | New | DLL Wizard)sin tener un pro yecto abierto.

So lu ción rá pi daAbra un pro yecto antes de eje cu tar el Asis tente para crear .DLLs de recur sos.

Infor ma ción adi cio nalLas .DLLs de recur sos son uti li za das por los pro yec tos — los pro yec tos uti li zanlos recur sos alma ce na dos en las .DLLs. El uso más común de esta carac te rís ti-cas está pro ba ble mente rela cio nado con el Entorno de Tra duc ción Inte grado de

492 Los Tomos de Delphi: Delphi sin problemas

Page 527: Dsp

Del phi, que hace posi ble crear varias .DLLs de recur sos para cada uno de losidio mas que desea sopor tar.

The search string cannot be blankPo si ble cau sa de error

Puede haber inten tado bus car una cadena en el entorno inte grado de Del phiuti li zando Search | Find, pero olvidó intro du cir una cadena para bus car en elcua dro de com bi na ción corres pon diente.

So lu ción rá pi daIntro duzca la cadena a bus car.

Infor ma ción adi cio nalPara que el texto situado bajo el cur sor sea intro du cido auto má ti ca mente en elcua dro de com bi na ción ‘Text to Find’ del cua dro de diá logo Find Text una vezse active el diá logo, siga estos pasos:1. Selec cione Tools | Envi ron ment Options.2. Selec cione la página Edi tor.3. Mar que la casi lla de veri fi ca ción Find Text at Cur sor.

El diá logo Find Text per mite con fi gu rar muchas carac te rís ti cas. Pulse el botónHelp para apren der más sobre éstas.

The selected bitmap is larger than 24x24Po si ble cau sa de error

Mien tras creaba una plan ti lla de com po nente, puede haber inten tado gra barun mapa de bits para el icono del com po nente que es dema siado grande paraser mos trado en el espa cio reser vado para ello en la página corres pon diente dela Paleta de Com po nen tes.

So lu ción rá pi daSelec cione un mapa de bits que sea como máximo un cua drado de 24 píxe lescomo mapa de bits del icono de la paleta para repre sen tar la plan ti lla decom po nente.

Infor ma ción adi cio nalEl icono por defecto para una plan ti lla de com po nente es a) el del pri mer com-po nente selec cio nado, si selec cionó los com po nen tes uti li zando el ratón y la

Mensajes de error 493

Page 528: Dsp

tecla May, o b) el del com po nente situado más a la izquierda o más arriba, siselec cionó los com po nen tes mar cando un área con el ratón.

Si no desea uti li zar el icono por defecto, puede crear uno (recuerde que no debeser mayor de 24 x 24 píxe les) con el Image Edi tor o cual quier otro pro grama deedi ción de mapas de bits, como Micro soft Paint.

Para crear un icono con el Image Edi tor, siga estos pasos:1. Selec cione Tools | Image Edi tor.2. Selec cione File | New. . . | Bit map file (OJO: no Icon file, aun que el

cua dro de diá logo Com po nent Tem plate Infor ma tion lo llama ‘Pa letteIcon’).

3. Asigne 24 a Width (ancho) y Height (altura).4. Selec cione View | Zoom In hasta cua tro veces (depen diendo de su

pre fe ren cia).5. Cree el mapa de bits que desee uti li zar como su icono de la paleta.6. Guarde el archivo de mapa de bits.

The server returned an invalid responsePo si ble cau sa de error

Puede estar haciendo refe ren cia a un método de la inter faz Web bro kers cript,pero su biblio teca de tipos no ha sido regis trada.

So lu ción rá pi daRegis tre la biblio teca de tipos Web bro kers cript. Pare y rei ni cie SRVINFO.EXE.

Infor ma ción adi cio nalPuede regis trar WEBBROKERSCRIPT.TLB selec cio nando la opción Eje cu tardel menú de Ini cio de Win dows e intro du ciendo el comando tregsvrWEBBROKERSCRIPT.TLB.

Site Express apa re ció por pri mera vez en Del phi 6.

The transaction isolation level must be dirty read for local databasesPo si ble cau sa de error

Puede haber asig nado uno de los valo res tiRead Com mit ted o tiRe pea ta ble Reada la pro pie dad Trans Iso la tion de un com po nente TDa ta base mien tras uti lizauna base de datos local o de escri to rio, como Para dox o dBASE.

494 Los Tomos de Delphi: Delphi sin problemas

Page 529: Dsp

So lu ción rá pi daCam bie el valor de Trans Iso la tion a tiDirt yRead si el objeto TDa ta base hacerefe ren cia a tablas loca les (como Para dox y dBASE).

Infor ma ción adi cio naltiDirt yRead (”lec tura sucia”) hace que se mues tren todos los cam bios que sepro du cen sobre la base de datos (aún si se trata de cam bios rea li za dos por otrousua rio que luego no lle guen a ser con fir ma dos). La mayo ría de las bases dedatos de ser vi dor SQL, como Inter Base, Ora cle, MS SQL Ser ver, etc., no sopor-tan el modo tiDirt yRead. Si asigna tiDirt yRead a la pro pie dad Trans Iso la tioncuando uti liza estas bases de datos, ellas pro mo ve rán esta con fi gu ra ción a lapró xima dis po ni ble (la menos res tric tiva dis po ni ble para la pla ta formapar ti cu lar).

tiRe pea ta ble Read (”lec tura repe ti ble”) garan tiza que la vista que tiene unusua rio de un regis tro no cam bie mien tras lo está con sul tando. Aún si otrousua rio edita el regis tro (e incluso con firma los cam bios), la ins tan tá nea delregis tro con ti nuará siendo visi ble a este usua rio.

tiRead Com mit ted (”lec tura con fir mada”) sólo mues tras los cam bios hechos a losregis tros des pués de que la tran sac ción que los modi fica haya sido con fir mada.

Para más infor ma ción, con sulte “Trans Iso la tion” en la ayuda de Del phi.

The type library has syntax errorsPo si ble cau sa de error

Pro ba ble mente ha omi tido algo nece sa rio de la biblio teca de tipos, como unainter faz para una CoC lass.

So lu ción rá pi daApo yán dose en el men saje de error más espe ci fico que se mues tra en la barrade estado en la parte infe rior del Edi tor de Biblio te cas de Tipos, corrija el errorde sin ta xis.

Infor ma ción adi cio nalUn error que puede apa re cer en la barra de estado del Edi tor de Biblio te cas deTipos des pués del men saje de error bajo dis cu sión (que apa rece en un cua drode men saje) es “A CoC lass must imple ment at least one inter face”. Con-sulte la dis cu sión sobre este men saje de error para deta lles más espe cí fi cos.

Mensajes de error 495

Page 530: Dsp

There is currently no active projectPo si ble cau sa de error

Puede haber selec cio nado File | New | Con trol Panel Applet sin teneractivo un pro yecto de apli ca ción del Panel de Con trol.

So lu ción rá pi daAbra pri mero una apli ca ción del Panel de Con trol, selec cio nando File | New |Con trol Panel Appli ca tion.

Po si ble cau sa de errorLas apli ca cio nes del Panel de Con trol pue den ser crea das con la ver sio nes Pro-fes sio nal y Enter prise de Del phi.

There is no default printer currently selectedPo si ble cau sa de error

Puede estar eje cu tando Citrix Win frame sobre Win dows NT y no haestablecido una impre sora por defecto.

So lu ción rá pi daEsta blezca una impre sora por defecto para NT.

Infor ma ción adi cio nalCitrix Win frame es una tec no lo gía que envía las pul sa cio nes de teclas y ratónde la máquina cliente al ser vi dor, y la pan ta lla se actua liza desde el ser vi dor alcliente.

There is no overloaded version of <> that can be called with thesearguments

Po si ble cau sa de error1. Puede estar lla mando a una fun ción de con ver sión ina pro piada. Por ejem-

plo, lo siguiente gene rará este men saje de error:

Holl ywoodS qua re := IntToStr(Sqr(StrToInt(edt Num2 Squa re.Text)));

496 Los Tomos de Delphi: Delphi sin problemas

Page 531: Dsp

2. Puede estar pasando un pará me tro de un tipo dife rente al indi cado en lasig na tura del método al que está lla mando. Por ejem plo, el siguiente códigogene rará este men saje de error:

if Se lect Di rec tory(Tax Sol ver.Fi le Lo ca tion, [sdAllowC rea te, sdPer form Crea te, sdPrompt], 0) then

debido a que Tax Sol ver.File Lo ca tion es una pro pie dad, y Select Di rec toryespera un pará me tro Var como pri mer argu mento.

So lu ción rá pi da1. Uti lice la fun ción de con ver sión correcta:

Holl ywoodS qua re := Float ToStr(Sqr(StrToInt(edt Num2 Squa re.Text)));

2. Asigne el valor de la pro pie dad a una varia ble de tipo String, y luego pasela cadena a la fun ción:

New Pay roll Fi le Lo ca tion := Tax Sol ver.Fi le Lo ca tion;. . .if Se lect Di rec tory(New Pay roll Fi le Lo ca tion, [sdAllowC rea te, sdPer form Crea te, sdPrompt], 0) then

Infor ma ción adi cio nal1. Como el pará me tro de la fun ción Sqr debe ser un número real (Exten ded),

la con ver sión debe ser Float ToStr, y no IntToStr, aún en el caso de que elargu mento que envíe y el valor que espere reci bir sean ente ros. La fun ciónStrToInt fun cio nará siem pre que se intro duzca real mente un entero en elcua dro de edi ción. Para mayor segu ri dad, (¡prac ti que la pro gra ma cióndefen siva!) cam bie tam bién la lla mada a StrToInt por StrToFloat, así:

Holl ywoodS qua re := Float ToStr( Sqr(StrToF loat(edt Num2 Squa re.Text)));

2. Las pro pie da des no pue den ser uti li za das como pará me tros Var.

This form of method call only allowed for class methodsPo si ble cau sa de error

1. Puede haber estado inten tando lla mar a un método nor mal uti li zando eltipo de clase en lugar de una ins tan cia (varia ble) del tipo. Esto es sola-mente per mi tido para los méto dos de clase — no para méto dos nor ma les.

2. Puede haber olvi dado ante po ner el tipo de la clase al nom bre del método.3. Puede estar inten tando lla mar a un método abs tracto desde la uni dad en la

que éste ha sido decla rado.

Mensajes de error 497

Page 532: Dsp

So lu ción rá pi da1. Cuando sea nece sa rio, ase gú rese de que uti liza una ins tan cia, o varia ble,

del tipo, en lugar del pro pio tipo.2. Com pruebe que está ante po niendo el tipo de la clase al nom bre del método.

Por ejem plo, si ha decla rado un método ToMy Mad ness como parte de unadecla ra ción de tipo de un for mu la rio, la siguiente defi ni ción en la parteImple men ta tion pro du cirá el men saje de error bajo dis cu sión:

pro ce du re ToMy Mad ness(var Dog weight: Byte);be gin if dog weight < 100 then Kick(hard) else Run;end;

Lo siguiente com pi lará bien (ante po niendo el nom bre de la clase al nom bredel método):

pro ce du re TForm1.ToMy Mad ness(var Dog weight: Byte);be gin if dog weight < 100 then Kick(hard) else Run;end;

La solu ción puede ser tan sim ple como borrar la ‘T’ ini cial del nom bre deltipo de clase. Por ejem plo, si intenta esto (crear diná mi ca mente un cua drode diá logo ‘Acerca de’):

TAbout Box := TAbout Box.Crea te(nil);try TAbout Box.Show Mo dal;fi nally TAbout Box.Free;end;

reci birá el men saje de error bajo dis cu sión. Debe hacerlo de esta manera:

About Box := TAbout Box.Crea te(nil);try About Box.Show Mo dal;fi nally About Box.Free;end;

3. No llame a méto dos abs trac tos den tro de la uni dad en la que est andecla ra dos.

Infor ma ción adi cio nal3. Para rede fi nir un método abs tracto, debe crear una clase que des cienda de

la clase en la que el método abs tracto está decla rado y luego uti li zar ladirec tiva Override. Por ejem plo, si la decla ra ción de tipo de la clase base separece a ésta:

type TBas sist = class pro ce du re Walk; vir tual; abs tract;

498 Los Tomos de Delphi: Delphi sin problemas

Page 533: Dsp

pro ce du re Rock; vir tual; abs tract; pro ce du re Thump; dyna mic; abs tract; end;

sus méto dos puede ser rede fi ni dos en una clase des cen diente así:

type TGarr yTa llent = class(TBas sist) pro ce du re Walk; ove rri de; pro ce du re Rock; ove rri de; pro ce du re Thump; ove rri de; end;

This form of method call only allowed in methods of derived typesPo si ble cau sa de error

Este men saje de error se pro duce si se intenta hacer una lla mada a un métodode un tipo ances tro, pero no se hace desde un método. Puede sim ple mentehaber olvi dado ante po ner el nom bre del tipo al nom bre del método. Por ejem-plo, lo siguiente gene rará este men saje de error:

pro ce du re KeyP ress(var Key: Char);var Text Length, i: Inte ger;be gin in he ri ted KeyP ress;

So lu ción rá pi daAnte ponga el nom bre del tipo al nom bre del método:

pro ce du re TascY2KCom bo Box.KeyP ress(var Key: Char);var Text Length, i: Inte ger;be gin in he ri ted KeyP ress; //TWin Con trol

Infor ma ción adi cio nalPara poder here dar algo, se debe estar en una clase des cen diente. El código decada método es visto por el com pi la dor como si estuviera incluido den tro de unblo que un With Self Do invi si ble. Por esta razón, en el segundo caso la lla madaInhe ri ted KeyP ress se inter preta como Inhe ri ted TascY3KCom bo Box.KeyP ress,y esta clase sí hereda un evento KeyP ress de TWin Con trol.

Mensajes de error 499

Page 534: Dsp

This package already contains unit named <>Po si ble cau sa de error

Está inten tando ins ta lar una uni dad den tro de un paquete que ya con tiene unauni dad con el mismo nom bre.

So lu ción rá pi daSi la uni dad de hecho es la misma uni dad, sim ple mente evite ins ta larla porsegunda vez. Si se trata de uni da des dife ren tes pero con el mismo nom bre,renom bre la segunda uni dad y luego añada el com po nente.

Infor ma ción adi cio nalA par tir de Del phi 3, cuando se ins tala un com po nente, éste es colo cado den trode un paquete. Puede colo car un com po nente en un paquete exis tente o en unonuevo. Lo nor mal es colo car cual quier com po nente que se añada den tro delarchivo DCLUSR[30,40,50,60].DPK (Com po nentes de Usua rio de Del phi).

This type cannot be initializedPo si ble cau sa de error

Puede estar inten tando decla rar una cons tante con tipo (varia ble ini cia li zada)del tipo File, Text, Text file o Variant. Por ejem plo, lo siguiente gene rará estemen saje de error:

arg yle: array[0..1] of va riant = ('zig','zag');

El men saje de error tam bién será gene rado si en lugar de Variant se hubierauti li zado Text, File o Text file.

So lu ción rá pi daSus ti tuya el tipo invá lido por uno per mi tido, como:

arg yle: array[0..1] of string = ('zig','zag');

Infor ma ción adi cio nalPara más infor ma ción, con sulte “ini tia li zed varia bles” en la ayuda de Del phi.

500 Los Tomos de Delphi: Delphi sin problemas

Page 535: Dsp

Thread local variables cannot be ABSOLUTEPo si ble cau sa de error

Puede haber apli cado la pala bra reser vada Abso lute a una varia ble local de unhilo (Thread var).

So lu ción rá pi daBorre la pala bra reser vada Abso lute. El com pi la dor debe poder asig nar ladirec ción que sea nece sa ria a la varia ble local de hilo.

Infor ma ción adi cio nal¡Ah, los hilos! Hablando de ellos, si quiere ver un ejem plo ele gante de la uti li-za ción de hilos, estu die Con nectThread.pas en \Indy\Demos\News rea der. JonShe mitz des cribe una apro xi ma ción simi lar en un artículo que puede serencon trado en www.mid nigh tbeach.com.

Thread local variables cannot be local to a functionPo si ble cau sa de error

Puede haber inten tado decla rar una varia ble local de hilo, mediante la pala brareser vada Thread var, en un método de un objeto TThread o des cen diente. Porejem plo, lo siguiente gene rará este men saje de error:

pro ce du re TFancyThread.Exe cu te;thread var ILost TheTh read: Inte ger;be gin { Co lo que el có di go del hilo aquí}end;

So lu ción rá pi daMueva la decla ra ción Thread var a una sec ción glo bal.

Infor ma ción adi cio nalLas varia bles loca les de hilo son glo ba les al hilo (pue den ser acce di das desdecual quier lugar del código del hilo), pero son loca les a cual quier ins tan cia delhilo. Esto quiere decir que si dos ins tan cias del hilo están en eje cu ción, cadauna ten drá su pro pia copia de la varia ble. Si la pri mera ins tan cia cam bia elvalor de la varia ble local del hilo, y luego la segunda ins tan cia del hilo cam biael valor de la varia ble del hilo para hacer algo, la pri mera ins tan cia no verá elcam bio que la segunda ins tan cia ha hecho (y vice versa).

Mensajes de error 501

Page 536: Dsp

Token not foundPosible causa de error

Puede haber omitido una parte necesaria de una sentencia SQL. Por ejemplo,puede haber introducido:

FROM Cus to merWHERE Amount Owed > 0

Solución rápidaIntro duzca el elemento necesario que falta. En el caso de arriba, se trata de laparte SELECT <Lis ta Cam pos>.

Información adicionalUna sentencia SELECT básica de SQL tiene el formato:

SELECT * { lis ta de cam pos }FROM Cus to mer { lis ta de ta blas }WHERE { cláu su la whe re op cio nal} Amount Owed > 0

Token not found. Token :dbo. line number:1Posible causa de error

Puede estar uti li zando un com po nente TQuery con su pro pie dad Request Liveasig nada a True y no ha ence rrado el pro pie ta rio/nom bre de la tabla entredobles comi llas. Por ejem plo, la sen ten cia SQL podría ser simi lar a ésta:

SELECT *FROM dbo.COOPER

Solución rápidaEncie rre el nombre del propietario (dbo) y el nombre de la tabla entre comillasdobles:

SELECT *FROM “dbo.COOPER”

Infor ma ción adi cio nalPara más información, consulte “RequestLive” en la ayuda de Delphi.

502 Los Tomos de Delphi: Delphi sin problemas

Page 537: Dsp

Too many actual parametersPosible causa de error

1. Puede haber proporcionado más parámetros a un procedimiento o funciónque la can ti dad de pará me tros con la que éste ha sido decla rado.

2. Puede estar intentando pasar más de 255 parámetros individuales a unprocedimiento o función de auto ma ti za ción OLE.

3. Puede estar llamando a un procedimiento o función del que hay dos ver sio-nes, y el compilador piensa que está intentando llamar a una ver sióndis tinta de la que usted tiene en mente.

Solución rápida1. Con sulte la declaración del procedimiento o función para ver la cantidad,

tipo y orden de los argumentos que espera.2. No pase más de 255 argumentos a un procedimiento o función de auto ma ti-

za ción OLE.3. Ante ponga el nombre de la unidad en donde está definido el procedimiento

o función que intenta llamar al nom bre de pro ce di miento o fun ción.

Información adicional3. Un par de casos fre cuen tes donde esto ocu rre es con los procedimientos

Append y Abort. El procedimiento Append está declarado en la unidadSystem; el método Append de TDa ta Set está en la unidad DB (dbiProcs enDelphi 1). La clase TStrings también tiene un método Append, en launidad Classes. Abort está definido como un procedimiento en SysUtils yes ade más un método de la clase TPrinter, defi nida en la unidad Printers.

Para más información, consulte “open-array parameters” en la ayuda deDelphi.

Too many connectionsPosible causa de error

Puede estar utilizando dema sia das cone xio nes a bases de datos aso ciandodirec ta mente cada componente TTable, TQuery y TStoredProc a un alias delBDE a través de su propiedad DatabaseName.

Solución rápidaUti lice un com po nente TDa ta base. Asigne a la pro pie dad Alias del com po nenteTDa ta base el alias del BDE (o nom bre de ruta). Asigne el valor de la pro pie dad

Mensajes de error 503

Page 538: Dsp

Name del com po nente TData base a la pro pie dad Data ba se Name de todos loscom po nen tes TTa ble, TQuery y TSto redP roc.

Información adicionalAl uti li zar un componente TDatabase, se reduce el número de conexiones quela aplicación utiliza a una sola (todos los obje tos com par ten la cone xión que seesta blece en el componente TDatabase). Los componentes TTable, TQuery yTStoredProc utilizan un alias local para hacer referencia al componenteTDatabase en su pro pie dad DatabaseName.

Too many files openPosible causa de error

1. Puede estar intentando escribir en un CD-ROM.2. Puede estar olvidando cerrar los archivos después de abrirlos.3. Puede tener un valor muy pequeño en el parámetro Files en CONFIG.SYS.4. Puede tener su proyecto en un directorio con un nombre de ruta muy largo.

Solución rápida1. CD-ROM significa Compact Disc-Read Only Memory (Memo ria de sólo lec-

tura en disco com pacto); ya que de hecho es un dispositivo de sólo lectura,no se puede escribir en un CD-ROM.

2. Ase gú rese siem pre de llamar a CloseFile cuando ter mine de uti li zar unarchivo. Por ejemplo:

var te xan: Text Fi le;be gin Assign Fi le(te xans, 'Lo ne Do ve.txt'); Rew ri te(te xans); Wri teln(te xans, 'L. McMurtry wro te about the catt le dri ve to Mon ta na’); Clo se Fi le(te xan);end;

3. Con fi gure la línea Files= en CONFIG.SYS a un valor mayor que el actual,por ejemplo a 100 o aún a 255, si es necesario.

4. Mueva su proyecto a una ubicación que tenga una ruta más corta, comoC:\MeFeelMe.

Información adicional2. Olvi darse de lla mar a Clo se File para un archivo puede ocasionar la pér dida

de algunos o todos los datos escritos en el archivo.

504 Los Tomos de Delphi: Delphi sin problemas

Page 539: Dsp

3. Cuando mueva un proyecto de un directorio a otro, no mueva el archivo.DSM del proyecto, ya que contiene información de directorio (y por lo tantoapuntará al directorio anterior).

Too many locks on tablePosible causa de error

Puede haber modi fi cado más de 255 regis tros de una tabla Para dox duranteuna tran sac ción sobre una base de datos local.

Solución rápidaLimite la can ti dad de ediciones realizadas den tro de una misma tran sac ción.

Información adicionalSi utiliza un componente TDatabase, puede utilizar su métodoStartTransaction (terminado por un Commit o Rollback) para tratar un grupode operaciones como una tran sac ción — todas ellas fracasarán como grupo(Rollback) o serán con fir ma das como grupo (Commit).

Cada registro que es modificado consume un bloqueo. El máximo número debloqueos por tabla es de 255, así que esa es la can ti dad máxima de registrosque se pueden modificar en una tran sac ción.

Too many open cursorsPosible causa de error

Puede tener muchas tablas abiertas.

Solución rápidaCie rre las tablas cuando ter mine de uti li zar las. Si uti liza una can ti dad rela ti-va mente pequeña de tablas (hasta varias doce nas), pro ba ble mente podrá espe-rar hasta que se cie rre el pro grama para cerrar las tablas. Si uti liza más decien tablas, deberá cerrar las tablas tan pronto como ter mine de utilizarlas.

Información adicionalNo es posi ble incre men tar la can ti dad de cursores disponibles al BDE. Elnúmero de tablas que se puede tener abiertas a la vez es de 127. Si recibe esteerror mientras tiene menos de 127 tablas abiertas, puede haber encon tradouna limitación de su base de datos par ti cu lar, y no del BDE. Por ejemplo, enOracle el número máximo de cursores abiertos simultáneamente puede ser

Mensajes de error 505

Page 540: Dsp

configurado a un valor inde pen diente, dis tinto del configurado para el BDE.Con sulte la documentación de su base de datos para más detalles.

Too many open filesPosible causa de error

1. Puede tener más archivos abiertos de los que Windows puede manejar.2. Puede tener más archivos abiertos que el límite impuesto por el pará me tro

MAXFILEHANDLES del BDE.

Solución rápida1. Con fi gure la línea Files= en CONFIG.SYS a un valor más alto que el

actual, por ejemplo a 100 o aún a 255, si es necesario.2. Incre mente el valor del pará me tro MAXFILEHANDLES en la página

System de la utilidad BDE Configuration/Administration o en el nodoSystem | Init.

Información adicionalConsulte “Too many files open”.

Too many parametersPosible causa de error

1. Puede estar pro por cio nando a un pro ce di miento o fun ción más pará me trosde los espe ci fi ca dos en su decla ra ción. Por ejem plo, si llama al pro ce di-miento están dar Release (que no tiene pará me tros) y le pasa un pará me tro,reci birá este men saje de error:

Re lea se(Me Let Me Go);

2. Puede estar inten tando lla mar en una clase des cen diente a un métodoestá tico que tiene el mismo nom bre que un método de una clase ances tro,pero el tipo de la varia ble es del tipo ances tro (aun que se haya ins tan ciadoel tipo des cen diente). Por ejem plo, lo siguiente gene rará este men saje deerror, ya que los méto dos está ti cos son resuel tos de acuerdo al tipo de lavaria ble (TGramps en este caso), y no al tipo de la ins tan cia (que en estecaso es TYoung Whip perS nap per):

type TGramps = class pro ce du re No teOr Triad(note: string); . . . TYoung Whip perS nap per = class(TGramps) pro ce du re No teOr Triad(no te1, no te2, no te3: string);

506 Los Tomos de Delphi: Delphi sin problemas

Page 541: Dsp

. . .var Git fidd le: TGramps;be gin Git fidd le:= TYoung Whip perS nap per.Crea te; Git fidd le.No teOr Triad(1, 2, 3)

Solución rápida1. Con sulte la definición del procedimiento o método que esté llamando para

determinar la signatura (número, tipo, y secuencia de parámetros) quenecesita.

2. Para llamar al método NoteOrTriad de TYoungWhipperSnapper, declareGit fiddle como TYoung Whip perS nap per, o declare NoteOr Triad comovirtual en TGramps y rede fí nalo en TYoungWhipperSnapper.

Información adicionalConsulte “Not enough actual parameters”.

Transaction Is ActivePosible causa de error

Puede haber llamado a StartTransaction sobre un componente IBTransactionque ya estaba activo. Por ejemplo, lo siguiente generaría este mensaje de error:

. . .IBTrans.Acti ve := True; try with IBQry do be gin Uni di rec tio nal := True; Da ta ba se := dm.IBDB; Tran sac tion := IBTrans; SQL.Add('INSERT INTO LIABILITY ('); SQL.Add('AGENCY_ID,EMPLOYER_ID,PAYROLL_DATE,’ + ‘LIABILITY_AMOUNT,DUE_DATE)'); SQL.Add('VALUES ('); SQL.Add(':AgencyID,:Emplo yerID,:Pay roll Da te,’ + ‘:Lia bi lity Amount,:Due Da te)'); Pa rams.Pa ramB yNa me('AgencyID').AsString := AAgencyID; Pa rams.Pa ramB yNa me('Emplo yerID').AsString := AEmplo yerID; Pa rams.Pa ramB yNa me('Pay roll Da te').AsDa te := APay roll Da te; Pa rams.Pa ramB yNa me('Lia bi lity Amount').AsCu rrency := ALia bi lity Amount; Pa rams.Pa ramB yNa me('Due Da te').AsDa te := dDue Da te; IBTrans.De fault Da ta ba se := dm.IBDB;

Mensajes de error 507

Page 542: Dsp

IBTrans.Start Tran sac tion;. . .

Solución rápidaActive la transacción sola mente una vez. Para el ejemplo mostrado arriba,simplemente borre la línea:

IBTrans.Acti ve := True;

Información adicionalSi en un punto particular del programa la transacción puede o no puede estaractiva, puede com pro barlo del siguiente modo:

if not IBTrans.Acti ve then IBTrans.Start Tran sac tion;

Transaction not AssignedPosible causa de error

Puede tener algunos con jun tos de datos abier tos en tiempo de diseño o que sehan dejado abiertos al salir del programa en una aplicación de InterBaseExpress.

Solución rápidaCierre explícitamente todos los con jun tos de datos antes de que la aplicacióntermine. Por ejemplo:

pro ce du re TViewE dit Ta bles.Form Des troy(Sen der: TObject);be gin IBtbl.Acti ve := Fal se;end;

Información adicionalEsto realmente no debería ser absolutamente necesario, aunque es una buenapráctica cerrar todos los con jun tos de datos antes de terminar.

Translate error, value out of boundsPosible causa de error

1. Puede estar copiando datos de una máquina a otra (por ejem plo, de uncliente a un servidor) donde los formatos de fecha son diferentes.

508 Los Tomos de Delphi: Delphi sin problemas

Page 543: Dsp

2. Puede estar copiando datos de un tipo de base de datos a otro, y los for-matos de fechas no son iguales.

3. Puede estar trabajando con una tabla dBASE y estar utilizando un con tro-la dor de lenguaje distinto al uti li zado ori gi nal mente (con el que se creó latabla y/o se aña die ron datos pos te rior mente).

Solución rápida1. Uti lice el mismo formato de fecha en ambas máquinas.2. Con vierta el formato de fecha al de la máquina destino antes o durante la

copia.3. Con la uti li dad BDE Con fi gu ra tion (Dri vers | dBASE | Lang Dri ver),

cam bie el pará me tro ‘Lan guage Dri ver’ al que ori gi nal mente uti lizó.

Información adicionalLas fechas nulas o vacías en Delphi de 32 bits no están real mente ‘en blanco’,sino que con tie nen el valor Diciem bre 31 de 1899. En Delphi 1, la fecha deinicio era 01/01/01. Este valor inicial fue cambiado para garan ti zar la com pa ti-bi li dad con la auto ma ti za ción OLE.

Tried to search marked block but it is invalidPosible causa de error

Puede tener el entorno integrado configurado para buscar en el bloquemarcado (en lugar de ejecutar un búsqueda global), pero no hay un bloquemarcado.

Solución rápidaMar que un bloque para bus car, o cam bie la opción de bús queda a glo bal, mar-cando la casilla de verificación Global en la sección Scope del diálogo Find.

Información adicionalEstu die las demás opcio nes de búsqueda que están disponibles en el diálogoFind.

Type <> has no type infoPosible causa de error

Puede estar intentando obtener un pun tero a la información de tipos para untipo que no puede ser utilizado en una propiedad Publis hed y por lo tanto no

Mensajes de error 509

Page 544: Dsp

tiene información de tipos en tiempo de ejecución asociada a él. Por ejemplo, losiguiente generará este mensaje de error:

var Bird Dog: Poin ter;be gin Bird Dog := TypeIn fo(file);

Solución rápidaPuede utilizar TypeInfo solamente para los tipos que pueden ser utilizados enpro pie da des Publis hed, como Inte ger, Extended, String, TMethod y Variant.

Información adicionalPara más información, consulte “TypeInfo” en la ayuda de Delphi.

Type <> is not yet completely definedPosible causa de error

Puede tener asignada como clase ancestro a la misma clase descendiente enuna sección Type. Por ejemplo, lo siguiente generará este mensaje de error:

type TForm3 = class(TForm3)

Solución rápidaCam bie la clase de la que desea here dar (la clase ancestro) por una válida. Porejemplo, en el caso de arriba, lo siguiente evitaría que el error ocurriera denuevo:

type TForm3 = class(TForm)

Información adicionalPara más información, consulte “forms” en la ayuda de Delphi.

Type <> must be a class to have a PUBLISHED sectionPosible causa de error

Puede haber decla rado un objeto uti li zando el viejo estilo (Turbo Pas cal conObje tos) y haber intentado proporcionarle una sección Published. Por ejemplo,lo siguiente generará este mensaje de error:

510 Los Tomos de Delphi: Delphi sin problemas

Page 545: Dsp

type TSten dahl = Object RedAndBlack: TMe mo; pu blis hed Lan gua ges: Inte ger;

Solución rápidaCam bie el tipo a una clase o borre la sección Published.

type TSten dahl = class { he re da de TObject si no se es pe ci fi ca } . . .

Información adicionalPara más información, consulte “class declarations” en la ayuda de Delphi.

Type <> must be a class to have OLE automationPosible causa de error

Puede haber decla rado un objeto uti li zando el viejo estilo (Turbo Pas cal conObje tos) y haber inten tado pro por cio narle una sec ción Auto ma ted. Por ejem plo,lo siguiente gene rará este men saje de error:

type TMo del = ob ject Black: TCo lor; au to ma ted AssemblyLi nes: Inte ger;

Solución rápidaCam bie el tipo a una clase o borre la sección Automated.

type TMo del = class { he re da de TObject si no se es pe ci fi ca } . . .

Información adicionalPara más informacion, consulte “Automation” en la ayuda de Delphi.

Mensajes de error 511

Page 546: Dsp

Type <> needs finalization—not allowed in file typePosible causa de error

Puede estar declarando cadenas largas en un tipo File of Record. Por ejemplo,lo siguiente generará este mensaje de error:

type TDa te Rec = File of re cord FlowS na kes, Snirt: Inte ger; Boul ders ha des: String; end;

Solución rápidaEli mine la cadena del registro o declá rela como una cadena cortaexplícitamente (declarándola como de tipo ShortString) o implícitamente(proporcionándole una longitud, como String[20]). Por ejemplo, para solucionarel pro blema de arriba, uti lice esto:

type TDa te Rec = File of re cord FlowS na kes, Snirt: Inte ger; Boul ders ha des: string[20]; end;

Información adicionalNo se per mite uti li zar cadenas largas en un fichero de regis tros, debido a quelas pro pias cade nas (y no pun te ros a ellas) se debe rán alma ce nar en los regis-tros, y en este caso el tamaño del registro no podría ser determinado poradelantado.

Type expected but <> foundPosible causa de error

Puede haber introducido un carác ter ilegal en un identificador de tipo. Porejemplo, lo siguiente generará este mensaje de error:

type Shes NotMy = @

Solución rápidaUti lice iden ti fi ca do res de tipo válidos. A con ti nua ción se mues tran ejem plos dedeclaraciones de un tipo de clase, un tipo enumerado y un tipo subrango:

{cla se}type

512 Los Tomos de Delphi: Delphi sin problemas

Page 547: Dsp

TForm1 = class(TForm) . . .{enu me ra do}type Cart wrights = (Dunn, Nel son, Owen, Shan nonC, Shan nonJ, StSu re, Szaj ki);{sub ran go}type Ra tings = 1..4;

Información adicionalEste mensaje de error es normalmente el resultado de un error tipo grá fico uomi sión.

Type expected but real constant foundPosible causa de error

Puede haber omi tido uno de los dos puntos requeridos en la declaración de untipo array. Por ejemplo, lo siguiente producirá el mensaje de error bajodiscusión:

type gross = array[0.143] of in te ger;

Para evitar el error, debe teclear el segundo punto entre los límites inferior ysuperior del array (0 y 143 en el ejemplo):

type gross = array[0..143] of in te ger;

Solución rápidaPro por cione el segundo punto en la declaración del tipo array, entre los límitesinferior y superior del array.

Información adicionalAsí es como se declara y utiliza un array:

type gross = array[0..143] of in te ger;...var grody: gross;... grody[0] := StrToInt(Edit1.Text); grody[1] := StrToInt(Edit2.Text);...

Mensajes de error 513

Page 548: Dsp

Puede inicializar todos los valores del array en el evento OnCreate delformulario así:

pro ce du re TForm1.Form Crea te(Sen der: TObject);var w: word;be gin for w:=0 to si zeof(gross)-1 do grody[w]:=0;end;

Type mismatch for field <FieldName>, expecting: <Field type>,actual: <Field type>

Posible causa de errorPuede estar utilizando un TClientDataSet para alma ce nar datos, y ha grabadodatos para una columna en particular en un formato (por ejemplo, AsMemo);luego ha creado un des cen diente de TFieldType de otro tipo de datos (comoTStringField), e inten tado asig nar los datos en el archivo actual al campo delClientDataSet.

Solución rápidaUti lice el mismo tipo de datos para almacenamiento en disco y procesamientoen memoria. Por ejemplo, si graba datos uti li zando AsString, cree un tipo decampo corres pon diente de tipo String en el Client Da ta Set.

Información adicionalTClientDataSet puede leer y escri bir datos tanto en for mato bina rio (.CDS)como en XML.

Type mismatch [in expression]Posible causa de error

Puede haber inten tado eje cu tar una ope ra ción de agre ga ción sobre un campono numé rico en una sen ten cia SQL. Por ejem plo, lo siguiente gene rará estemen saje de error si el campo State no es numé rico:

SELECT AVG(Sta te) FROM CUSTOMER

Solución rápidaEje cute ope ra cio nes matemáticas sólo sobre campos numé ri cos, por ejemplo:

SELECT AVG(Sa lary) FROM NFLQBacks

514 Los Tomos de Delphi: Delphi sin problemas

Page 549: Dsp

Información adicionalPara más información, consulte “types” en la ayuda de Delphi.

Type not allowed in OLE Automation callPosible causa de error

Puede haber uti li zado en una lla mada de auto ma ti za ción OLE un tipo que nopuede ser con ver tido en un Variant. Por ejem plo, lo siguiente gene rará estaexcep ción, ya que el argu mento aquí es una clase (TThread), y las cla ses nopue den ser con ver ti das a varian tes:

pro ce du re TFancyThread.Exe cu te;var v: Va riant;be gin v.Wont Work(Self);end;

Solución rápidaUtilice úni ca mente tipos de automatización cuando haga llamadas de auto ma-ti za ción OLE.

Información adicionalTodos los tipos de auto ma ti za ción OLE deben ser compatibles con Variant. Lossiguientes tipos de Delphi pueden ser utilizados en la auto ma ti za ción: Byte,Currency, Double, IDispatch, Integer, IUnknown, OLEVariant, SmallInt,Single, TDateTime, WideString, WordBool, SCode, TColor y TSafeArray.

Type of expression must be BOOLEANPosible causa de error

1. Puede haber uti li zado en una sen ten cia con di cio nal If o un bucle While unaexpre sión que no pro duce un resul tado de tipo Boo lean (no puede ser eva-luada como True o False). Por ejem plo, lo siguiente gene rará este men sajede error:

if Form1.Name then

2. Algunas veces este mensaje de error es ocasionado por un error de sintaxiscuando se intenta convertir a otro tipo el parámetro Sender. Por ejemplo, losiguiente producirá el mensaje de error bajo discusión:

if (Sen der as TDBEdit)Tag = 8 then

Mensajes de error 515

Page 550: Dsp

Solución rápida1. Asegúrese de uti li zar con di cio nes Boolean donde el compilador espera un

valor que se eva lúe a True/False. Por ejemplo, esto compilará:

if Form1.Name = 'Sa ke' then

2. En este caso, necesita añadir el operador de alcance ‘.’ entre la conversiónde tipos Sen der As TDBEdit y la pro pie dad Tag:

if (Sen der as TDBEdit).Tag = 8 then

Información adicionalAlgunos lenguajes y entornos se refieren al tipo Boo lean como Logical(incluyendo Paradox).

Type of expression must be INTEGERPosible causa de error

Puede haber especificado la longitud de una cadena como algo distinto de unvalor entero. Por ejemplo, lo siguiente generará este mensaje de error:

Wis con sin: String['chee se'];

Y tam bién lo siguiente:

Huc kle berry: String[3.14];

Solución rápidaSi va a declarar implícitamente una cadena corta, proporciónele un valorentero entre 1 y 255 (si quiere una cadena de longitud 1, no obstante, puedeuti li zar en vez de String el tipo Char).

Información adicionalPara más información, consulte “integers” en la ayuda de Delphi.

TYPEINFO standard function expects a type identifierPosible causa de error

Puede haber intentado llamar a la función TypeInfo, pero proporcionó unargumento que no es un tipo. Por ejemplo, lo siguiente generará este mensajede error:

var Bird Dog: poin ter;. . .

516 Los Tomos de Delphi: Delphi sin problemas

Page 551: Dsp

Bird Dog := TypeIn fo('yow za-bop');

Solución rápidaProporcione a la función TypeInfo solamente tipos que puedan ser utilizados enlas propiedades Publis hed, como Inte ger, Extended, String, TMethod yVariant.

Información adicionalPara más información, consulte “TypeInfo” en la ayuda de Delphi.

TYPEOF can only be applied to object types with a VMTPosible causa de error

Puede haber llamado a TypeOf sobre un objeto que no tiene una Tabla deMéto dos Vir tua les (VMT). Por ejemplo, lo siguiente generará este mensaje deerror:

type TSim ple = class pro ce du re Ein fach; end;. . .var pWhat You Be: Poin ter;be gin pWhat You Be := TypeOf(TSim ple); . . .end.

Solución rápidaHaga vir tual como mínimo un método de la clase. Por ejemplo, podría añadir ladirectiva Virtual a un método existente, o añadir un método vir tual sin sentidopara que una VMT sea creada y TypeOf esté disponible.

Información adicionalVMT significa “virtual method table”. Para más información, consulte “virtualmethod table” y “dynamic methods” en la ayuda de Delphi.

Mensajes de error 517

Page 552: Dsp

Types of actual and formal var parameters must be identicalPosible causa de error

1. Puede estar intentando pasar un parámetro real que difiere en el tipo delparámetro formal definido para el procedimiento o función. Por ejemplo, losiguiente generará este mensaje de error:

pro ce du re TForm1.But ton1 Click(Sen der: TObject); pro ce du re Snow blind(var nish: Va riant); be gin nish := 'nash, I was ta kin'' a bash'; end;be gin Snow blind(Query1);end;

2. Puede estar intentando compilar un proyecto que contiene una llamada ala API de Windows y estaba originalmente desarrollado utilizando unaversión ante rior de Win dows. Por ejemplo, puede tener un pro ce di mientocomo éste:

func tion WinE xecAndWait32(Fi le Na me: String; Vi si bi lity: Inte ger; Do Wait : Boo lean): Inte ger;

cuyo resul tado es pasado así:

Re sult := WinE xecAndWait32('OPECDo nuts.txt', 2, True);GetE xit Co deP ro cess(Pro cessInfo.hPro cess, Re sult);

Solución rápida1. Com pruebe que todos los parámetros que pasa son del mismo tipo de datos

que el pará me tro formal corres pon diente del procedimiento o fun ción.2. Sus ti tuya Inte ger por DWord:

func tion WinE xecAndWait32(Fi le Na me: String; Vi si bi lity : Inte ger; Do Wait : Boo lean): DWord;

Información adicional1. Si el pará me tro for mal no es un pará me tro Var, el men saje de error es

“Incom pa ti ble Types: <> and <>”. En el caso de arriba, el men sajeexacto sería: “Incom pa ti ble Types: Variant and TQuery”.

518 Los Tomos de Delphi: Delphi sin problemas

Page 553: Dsp

Unable to Execute a QueryPosible causa de error

Puede haber llamado a Open o asig nado True a la propiedad Active de uncomponente TSQLQuery (DBExpress) que no tiene una sentencia SQLasignada en su propiedad SQL.

Solución rápidaAsigne una sentencia SQL a la propiedad SQL, bien en tiempo de diseño en elInspector de Objetos, o en tiempo de eje cu ción, antes de activar el componenteTSQLQuery.

Información adicionalLos componentes DBExpress apa re cie ron por pri mera vez en Del phi 6.

Unable to find both a form and a source filePosible causa de error

Puede haber movido o borrado al archivo .PAS y/o el archivo .DFM de unproyecto en el Alma cén de Objetos.

Solución rápidaSus ti tuya los archivos que faltan.

Información adicionalDelphi almacena los proyectos del Alma cén de Objetos en el directorio\DelphiX\Objre pos.

Unable to insert a linePosible causa de error

Puede estar intentando insertar una línea en una lista de cadenas uti li zandoun índice que todavía no contiene un valor. Por ejemplo, si hay solamente treslíneas en ListBox1 (en los índices 0, 1 y 2), lo siguiente generará este mensajede error:

List Box1.Items.Insert(3, 'DreiT resT rey');

Mensajes de error 519

Page 554: Dsp

Solución rápidaAñada los elementos necesarios a la lista de cadenas antes de intentar accederal correspondiente índice. Por ejemplo:

List Box1.Items.Add('AWop BopA Loo BopA Lop Bam Boom');List Box1.Items.Insert('Su per Ca li fra gi lis ti cex pea li do cious');List Box1.Items.Add('Anti di ses ta blish men ta ria nism');List Box1.Items.Insert('deoxy ri bo nu cleic acid');

Información adicionalLas listas de cadenas son utilizadas internamente por muchas clases ycontroles de Delphi.

Unable to load GDS[32].DLLPosible causa de error

Puede haber intentado arrastrar un componente IBEventAlerter sobre unformulario, pero la .DLL correspondiente de InterBase no está ins ta lada en susistema. Puede haber elegido no ins ta lar Inter Base cuando ins taló Del phi.

Solución rápidaSi no ins taló Inter Base cuando ins taló Del phi, ins tale la ver sión local de Inter-Base que viene con Del phi desde el CD-ROM.

Información adicionalPara más información, consulte la documentación de InterBase que recibió conDelphi.

Unable to load RPTSMITH.EXEPosible causa de error

La sección [ReportSmith] de DELPHI.INI puede haber sido borrada o norefleja la ubicación actual de ReportSmith.

Solución rápidaAbra DELPHI.INI (situado por defecto en el directorio de Win dows) y añada omodi fi que la entrada ReportSmith para que refleje la ubicación actual deReportSmith. Por defecto, la entrada será:

[Re port Smith]Exe Path=C:\RPTSMITH

520 Los Tomos de Delphi: Delphi sin problemas

Page 555: Dsp

Información adicionalDelphi 1 contiene ReportSmith. Delphi 2 contiene ReportSmith y QuickReports (aunque ReportSmith estaba en cierto modo escondido). Delphi 3 ysuperiores inclu yen sola mente Quick Re ports. Por supuesto, usted no está limi-tado a uti li zar una de esas dos herra mien tas de gene ra ción de infor mes. Puedeutilizar otras herra mien tas, como Report Buil der, Crystal Reports, o inclusocrear sus informes personalizados sin utilizar un motor de infor mes.

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á decla rada en el

ámbito del programa (en cuyo caso el error fue cau sado por la parteizquierda de la sentencia de asig na ción).

2. Puede haber asig nado a una pro pie dad un valor que no es apro piado paraella (en cuyo caso el error fue cau sado por la parte izquierda de la sen ten-cia de asig na ción genera el error).

3. Puede haber antepuesto el nombre de la clase a un método en la parteInterface de una unidad (esto es nece sario en la parte Implementation,pero inne ce sa rio y no per mi tido en la parte Interface).

4. Puede haber escrito mal un iden ti fi ca dor en el punto de la declaración o enel de la imple men ta ción.

5. Puede ser que esté refiriéndose a un objeto, procedimiento, tipo o funciónque reside en una unidad que no está incluida en la sección Uses. Porejemplo, puede estar llamando la función ShowMessage o MessageDlg sintener incluida la unidad Dialogs en la sección Uses, o puede haber hechorefe ren cia al objeto Clipboard sin haber incluido la unidad Clipbrd en lasección Uses.

6. Puede haber alterado el ancestro en la declaración de tipo del formulario.Por ejemplo, si cambia el tipo del for mu la rio base de Form a Application,así:

{ de be ría ser TForm1 = class(TForm) }TForm1 = class(TAppli ca tion)

obten drá el men saje de error bajo dis cu sión.7. Puede estar intentando acceder a un identificador que está declarado en la

sección 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 ILitt le Dog = in ter fa ce(IUnknown)

Mensajes de error 521

Page 556: Dsp

['{51DDE8C0-CBE2-11D1-9BDB-444553540000}'] func tion Fet ched Pa per: Boo lean; func tion get BarkType: string; pro ce du re set BarkType(Va lue: string); pro perty BarkType: string read get BarkType wri te set BarkType; end;TPood le = class(TInter fa cedO bject, ILitt le Dog) FBarkType: string; func tion Fet ched Pa per: Boo lean; func tion get BarkType: string; pro ce du re set BarkType(Va lue: string);. . .pro ce du re TForm1.But ton1 Click(Sen der: TObject);var Fifi: ILitt le Dog;be gin Fifi := TPood le.Crea te; try . . . fi nally Fifi.Free; end;end;

9. Puede haber aña dido un punto y coma a la decla ra ción de un objeto deinter faz, así:

type TClass ThatImple mentsAnInter fa ce = class(TGr8Oogl yMoogly, IChihuahua);

10. Puede estar haciendo una referencia a un valor Resour ces tring situado enla sección Implementation de otra unidad, por ejemplo:

unit NGCDia log Mes sa ges;in ter fa ceim ple men ta tionconst AppNa me = 'NGC';re sour ces tring SEntries Must Match = 'New pass word en tries did not match’; SEntries Do Not Match = 'New pass word en tries do not match. Plea se try again.'; SAppWill Clo se_LogO nWith New Pass word = AppNa me + ' will now close. Exe cu te ' + AppNa me + ' again to log on with the new pass word.';

11. Puede haber intentado asignar un valor a una variable Result en un pro ce-di miento. Esta varia ble está implícitamente disponible sólo en lasfunciones.

12. Puede estar haciendo una referencia a un miembro de un tipo Set oenumerado en el código, como por ejemplo:

522 Los Tomos de Delphi: Delphi sin problemas

Page 557: Dsp

if Inclu deAr chi ve Fi les then frmZips ter.lstbxROFi les.Fi leTy pe := frmZips ter.lstbxROFi les.Fi leTy pe + [ftArchi ve] // pro ble maelse . . .

13. Puede estar llamando a un método de clase en una sección Initialization oFinalization.

Solución rápida1. Com pruebe que cualquier variable a la que esté haciendo una asignación

esté declarada y en ámbito. Si se trata de una variable global, declá rela enla parte Interface de la unidad o en una unidad Globals des ti nada expre sa-mente a las varia bles a las que quiera hacer referencia desde variasuni da des. Si se supone que la variable es local, com pruebe que la hadeclarado. Si el identificador es un procedimiento o función, veri fi que quela unidad que lo contiene esté incluida en la sección Uses (de la parteInter face o Implementation).

2. Asigne a las varia bles o pro pie da des valo res que sean del tipo apro piado.3. Borre el nombre de la clase del método en la sección Interface. Ya es asig-

nado implí ci ta mente.4. Veri fi que que ha escrito bien el identificador en su declaración y definición,

así como en cualquier asignación relacionada con él.5. Añada la unidad necesaria a la sección Uses. Para determinar qué uni dad

necesita añadir cuando llama un procedimiento o función de Object Pascal,busque el procedimiento o función en la ayuda de Delphi y vea en quéunidad está defi nido (y luego añádala a la sección Uses).

6. Revierta la declaración del tipo a su estado anterior.7. No intente lla mar a un método declarado en la sección Private de otra

clase. No intente acceder directamente a un campo declarado en la secciónPrivate de otra clase. Acceda al valor, si es posible, a través de lapropiedad Public o Publis hed aso ciada al campo privado. Por ejemplo, laclase TSpeedButton, declarada en BUTTONS.PAS, contiene lo siguiente:

pri va te . . . FFlat: Boo lean;pu blis hed . . . pro perty Flat: Boo lean read Fflat wri te SetF lat de fault Fal se;

Puede acce der indi rec ta mente al campo pri vado FFlat asig nán dolo o leyén-dolo desde la pro pie dad Flat, pero no puede leer o escri bir direc ta mente enel campo FFlat. Depen diendo de su punto de vista, puede con si de rar estomejor o peor.

8. No llame a Free para ins tan cias de inter fa ces.

Mensajes de error 523

Page 558: Dsp

9. Borre el punto y coma.10. Mueva los ele men tos Resour ces tring a la sección Interface, así:

unit NGCDia log Mes sa ges;in ter fa ceconst AppNa me = 'NGC';re sour ces tring SEntries Must Match = 'New pass word en tries did not match’; SEntries Do Not Match = 'New pass word en tries do not match. Plea se try again.'; SAppWill Clo se_LogO nWith New Pass word = AppNa me + ' will now clo se. Exe cu te ' + AppNa me + ' again to log on with the new pass word.';im ple men ta tion

11. Borre la asignación a Result, o cam bie el procedimiento a una función (noolvide añadir un tipo de resultado, por ejem plo Boo lean).

12. Añada la uni dad en la que está defi nido el tipo Set o enu me rado a la cláu-sula Uses:

im ple men ta tionuses SysUtils, fmOKOpts, nvcmod, AbArcTyp, // ne ce sa ria para uti li zar soS trip Path fmDCmprs, fmZipstr Fi leCtrl; // ne ce sa ria para ha cer re fe ren cia al ti po // TFi leAttr (ftArchive, etc.)

13. Con vierta el método en un procedimiento o función, o mueva el código a lasección Initialization o Finalization.

Información adicional5. En Delphi 6, los pro ce di mien tos y funciones que dan soporte al tipo

Variant, incluyendo los procedimientos y funciones que mani pu lan arraysvarian tes, como VarArrayCreate y VarArrayOf, han sido movidos deSYSTEM.PAS a VARIANTS.PAS. Si porta una aplicación que utilizavariantes de una versión anterior de Delphi a Delphi 6 o superior,necesitará añadir Variants a la cláusula Uses. Consulte VARUTILS.PAS,que uti liza Variants, para ver la implementación específica (en depen den-cia de la plataforma bajo la cual esté desarrollando).En Del phi 6, TMo dal Re sult ha sido movido de FORMS.PAS aCONTROLS.PAS. Cuando porte una apli ca ción de una ver sión ante rior deDel phi a Del phi 6 o supe rior, puede que nece site aña dir Con trols a la cláu-sula Uses (pre fe ri ble mente a la cláu sula Uses de la sec ciónImple men ta tion) si recibe este men saje de error debido a que no se haencon trado TMo dal Re sult.

524 Los Tomos de Delphi: Delphi sin problemas

Page 559: Dsp

En Del phi 6, Curr ToBCD y BCDTo Curr han sido movi dos de DB.PAS a lanueva uni dad FMTBCD.PAS. Cuando porte una apli ca ción de una ver siónante rior de Del phi a Del phi 6 o supe rior, puede nece si tar aña dir FMTBCDa la cláu sula Uses (pre fe ri ble mente a la cláu sula Uses de la sec ción Imple-men ta tion) si recibe este men saje de error debido a una lla mada a una deaque llas fun cio nes que no puede ser resuelta.

7. Puede acceder a los métodos y propiedades Public y Publis hed de otra clasesiempre y cuando esté utilizando la unidad en la que esa clase estádeclarada. Puede tener también acceso a la sección Protected si estácreando una clase descendiente de la clase en cuestión. Sin embargo, nuncaten drá acceso a una sección Private en otra unidad.

8. Las instancias de inter fa ces son libe ra das automáticamente en lassiguientes 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.

Con sulte “<> is not a valid com po nent name”.9. El compilador no espera un punto y coma hasta el final de la declaración

de la primera clase.12. Un control puede tener una propiedad de tipo con junto cuyos posi bles valo-

res están defi nidos en otra uni dad, en la que se imple menta una clasesituada más arriba en el árbol de herencia. Por ejemplo, en el ejemplo, enel que se accede a la propiedad FileType de TFi le List Box, el tipo con junto ysu tipo enumerado asociado están definidos en la uni dad FileCtrl:

type TFi leAttr = (ftReadOnly, ftHid den, ftSystem, ftVo lu meID, ftDi rec tory, ftArchi ve, ftNor mal); TFi leTy pe = set of TFi leAttr;

Undeclared Identifier: 'EmptyParam'Posible causa de error

Puede haber olvidado añadir Variants a la cláusula Uses.

Solución rápidaAñada Variants a la cláusula Uses de la parte Imple men ta tion, o si esnecesario, a la cláusula Uses de la parte Inter face.

Mensajes de error 525

Page 560: Dsp

Información adicionalPuede obte ner este men saje de error cuando recom pile en Del phi 6 una apli ca-ción que com pila correc ta mente en ver sio nes ante rio res de Del phi. La decla ra-ción de EmptyPa ram ha sido movida a la uni dad Variants (Variants haexpe ri men tado extraor di na rias mejo ras, no sola mente rela cio na das con COM).

Undeclared Identifier: 'Result'Posible causa de error

Puede haber deshabilitado la sin ta xis exten dida y ha hecho una asignación ala variable local Result que está decla rada implí ci ta mente en las funciones.

Solución rápidaReha bi lite la sin ta xis exten dida (está habi li tada por defecto) mar cando la casi-lla Com pi ler | Syntax Options | Exten ded Syntax o intro du ciendo ladirec tiva {$X+} o {$EXTENDEDSYNTAX ON}.

Información adicionalPara más información, consulte “Extended Syntax” y “Result variable” en laayuda de Delphi.

Undeclared Identifier: 'Unassigned'Consulte “Undeclared Identifier: ‘EmptyParam’”.

Undeclared Identifier: 'VarToStr'Consulte “Undeclared Identifier: ‘EmptyParam’”.

Unexpected end of commandPosible causa de error

Puede no haber escrito parte de una sen ten cia SQL; por ejemplo, en lasiguiente sen ten cia SQL no se espe ci fica la columna que va a ser uti li zadacomo clave primaria:

ALTER TABLE Pla ce mats ADD CONSTRAINT pkSlo gan PRIMARY KEY

526 Los Tomos de Delphi: Delphi sin problemas

Page 561: Dsp

Solución rápidaPro por cione el elemento que falta en la sentencia, por ejemplo, el nombre de lacolumna primaria:

ALTER TABLE Pla ce mats ADD CONSTRAINT pkSlo gan PRIMARY KEY (Slo gan)

Información adicionalNo imponga una restricción de clave primaria sobre una columna que puedaser nula. Una clave primaria debe contener valores únicos, y por lo tanto podrácon te ner 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 queya existe en la ruta de búsqueda de las bibliotecas de Delphi.

2. Usted (o el autor de la unidad en cuestión) puede haber cambiado ladeclaración de un símbolo en la parte Interface de una unidad, y otraunidad que hacía referencia a esta unidad (modificada) en su cláusula Usesno puede ser recompilada debido a que el archivo fuente (.PAS) no estádisponible.

Solución rápida1. Renom bre la unidad.2. Escoja una de las siguientes soluciones:

a. Si es posible, localice la primera unidad mencionada en el mensaje deerror, muévala al mismo directorio en el que reside el archivo deunidad compilada correspondiente (.DCU) y recompile.

b. Utilice una versión anterior de la segunda unidad mencionada en elmensaje de error (una que sea anterior a la modificación).

Información adicional1. Adopte un con ve nio de nom bres que haga difícil que se pro duz can coli sio-

nes de nom bres. Por ejemplo, si su nombre es Rupert Pupkin, puede añadirrp a los nombres de sus unidades, como rpMain, rpGlobal, etc.

2. Es altamente recomendable que no cambie el con te nido de la secciónInterface del código fuente de Delphi. Es altamente recomendable quetampoco cambie la sección Implementation del código fuente de Delphi. Sisabe lo que está haciendo (es decir, si cree que sabe más que el equipo dedesarrollo de Delphi, y no puede espe rar a un parche), hágalo a su propio

Mensajes de error 527

Page 562: Dsp

riesgo. Los cambios tien den a afec tar imperceptiblemente a otras cosasapa ren te mente no relacionadas.

Unit File Format ErrorPosible causa de error

Puede haber abierto un proyecto en una versión de Delphi ante rior a la últimacon la que lo compiló.

Solución rápidaBorre los archivos .DCU y recom pile.

Información adicionalEl mensaje de error puede mostrar una línea del archivo de proyecto (.DPR).

Unit name mismatch: <>Posible causa de error

Puede haber alterado manualmente el nombre de una unidad sin actualizar lasreferencias a ella en otras unidades.

Solución rápidaCam bie los nom bres de las uni da des selec cio nando File | Save (si se llamaactual mente Unit1) o File | Save As.

Información adicionalAl cam biar indi rec ta mente el nom bre de la uni dad (cam bián dolo a tra vés deFile | Save [As] en lugar modif icar el anti guo nom bre en el código), Del phitam bién cam biará el nom bre del archivo, manteniendo la sin cro nización.

Por supuesto, si cam bia el nom bre de la uni dad a tra vés de File | Save [As]des pués de haber aña dido la uni dad a la cláu sula Uses de otras uni dades, ten-drá que actua li zar é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.

528 Los Tomos de Delphi: Delphi sin problemas

Page 563: Dsp

2. Puede haber alterado el código fuente de la VCL.

Solución rápida1. Uti lice nom bres únicos para sus unidades; trate de establecer un con ve nio

de nom bres que garantice la uni ci dad, como anteponer o añadir susiniciales, las iniciales de la compañía, etc.

2. No modi fi que el código fuente de la VCL a menos que tenga una muybuena razón para hacerlo, y esté dispuesto a proporcionar su propio soportetéc nico a par tir de ese momento.

Información adicional1. El compilador no le impedirá que nombre a su unidad de la misma forma

que una ya exis tente, por ejemplo, Buttons.2. El código fuente de la VCL está destinado principalmente para referencia;

no es reco men da ble modificarlo.

Unknown ColumnConsulte “Unknown SQL Error”.

Unknown databasePosible causa de error

1. Puede haber especificado un alias de base de datos o una ruta para lapropiedad 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 supe rio res de Delphi Cliente/Servidor;TNestedTable en Delphi 4 y superiores) que no ha sido reco no cido.

2. Puede haber intentado asignar el valor True a la propiedad Connected deun componente TDatabase sin proporcionar un valor para la propiedadAliasName.

3. El archivo de configuración del BDE (IDAPI32.CFG en Delphi de 32 bits,IDAPI.CFG en Delphi 1) puede haber sido movido o borrado.

Solución rápida1. Si proporciona una ruta para esta propiedad, la ruta debería ser

plenamente cualificada* y la base de datos utilizada debe ser Paradox odBASE. Si la propiedad DatabaseName corres ponde a un alias, asegúresede que el alias haya sido configurado apropiadamente.

Mensajes de error 529

Page 564: Dsp

2. Pro por cione un valor para la propiedad AliasName antes de asignar True ala pro pie dad Con nec ted.

3. Asegúrese de que la clave del Regis tro del sistema que apunta a laubicación de IDAPI32.CFG se corresponda con la ubicación actual delarchivo.

Información adicional1. * Plenamente cualificada significa que el nom bre de ruta es explí cito o

absoluto (a diferencia de un nombre de ruta rela tivo). Bor land\Delphi 3 esun ejemplo de un nombre de ruta relativa. C:\No\Evel\Hear\No\Kneveles un ejemplo de ruta absoluta.

Para crear un alias del BDE, siga estos pasos:a. Seleccione Data base | Explore.b. En SQL Explorer/Data base Explorer, seleccione Object | New.c. Seleccione el tipo de controlador deseado en el cuadro de combinación

(seleccione Stan dard si está trabajando con tablas Par a dox o dBASE)y pulse el botón OK.

d. El nuevo alias se mostrará en el panel izquierdo de la página Data basecon un nombre por defecto, como Standard1.

e. Pulse con el botón derecho sobre el nuevo alias, seleccione Rename delmenú de contexto, e introduzca el nombre que desee darle al alias.

f. En la página Def i ni tion del panel derecho, seleccione el controladorapropiado en el cuadro de combinación Default Driver.

g. Introduzca la ruta a la base de datos en el cuadro de edición Path.

h. Seleccione Object | Exit, y luego Yes para grabar los cambios quehaya hecho.

3. La ubicación por defecto para el archivo de configuración del motor(IDAPI32.CFG) es:

C:\Archi vos de pro gra ma\Bor land\Com mon fi les\BDE

Para veri fi car el valor que indica el Regis tro del sis tema para la ubi ca ciónde IDAPI32.CFG, siga estos pasos:a. Seleccione Inicio | Ejecutar.b. Introduzca regedit en el cuadro de combinación Abrir y pulse el botón

OK (o presione la tecla Enter).c. Nav egue hasta

HKEY_LOCAL_MACHINE\Soft ware\Borland\Data base Engine.

El dato CONFIGFILE01 mostrará la ruta donde está ubicado el archivo deconfiguración. Si difiere de la ubicación de su copia de IDAPI32.CFG, mueva elarchivo a la localización apuntada por la configuración del Regis tro (lo másreco mendable), o modi fi que la configuración del Regis tro para que apunte a laloca li za ción actual del archivo.

530 Los Tomos de Delphi: Delphi sin problemas

Page 565: Dsp

Si no tiene un archivo IDAPI32.CFG en el sis tema, cópielo a la ubi ca ción apro-piada del CD de Del phi.

Si va a distribuir una aplicación de base de datos en otras máquinas, deberáase gu rarse de que las máquinas de des tino ten gan configurados los alias quevaya a uti li zar para acceder a bases de datos. Puede hacer esto tanto conInstall Shield como mediante código. Consulte “AddAlias” en la ayuda deDelphi para ver un ejemplo de cómo crear un alias en el código. Consulte ladocumentación de InstallShield para ins truc cio nes sobre cómo proporcionar unalias durante la ins ta la ción.

Si está utilizando una ruta (en lugar de un alias), un método que puedeutilizar para garan ti zar que la base de datos siempre será encon trada es seguiruno de estos pasos: Indicar a los usuarios que mantengan todos los archivos en el mismo

directorio que la aplicación.

-O- Asignar /. a la propiedad DatabaseName.

Unknown directive: <>Posible causa de error

1. Puede estar utilizando una sintaxis incorrecta en una declaración deprocedimiento o función. El problema puede ser simplemente algo malescrito, o la falta de un punto y coma.

2. Puede estar intentando declarar un método como Virtual, Dyna mic,Abstract u Over load fuera de la declaración de una clase.

3. Puede estar intentando interceptar un mensaje de Win dows, pero olvidócolocar un punto y coma antes de la directiva Message. Esta no es reco no-cida por el com pi la dor, que espera un punto y coma.Por ejem plo, esto oca sio nará el error:

pro ce du re wmcom mand(var Mes sa ge: TMes sa ge) mes sa ge WM_COMMAND;

4. Puede haber añadido la directiva Stored a un procedimiento en una secciónPrivate, Protected o Public de una clase. Por ejemplo, lo siguiente generaráel mensaje de error bajo discusión

pro ce du re Se tuuuu(b: string) sto red;

Solución rápida1. Asegúrese de que la sintaxis que está utilizando es correcta y que lo que

está tratando de hacer es acep ta ble para el com pi la dor de Delphi.2. Declare todos los métodos Virtual, Dyna mic, Abstract u Over load dentro de

la declaración de un tipo de clase.

Mensajes de error 531

Page 566: Dsp

3. Cuando intercepte mensajes de Windows, recuerde incluir el punto y comaantes de la directiva Message.

pro ce du re wmcom mand(var Mes sa ge: TMes sa ge); mes sa ge WM_COMMAND;

4. No uti lice la directiva Stored en una sección Private, Protected o Public deuna clase.

Información adicional2. Para que sean de uti li dad, los métodos virtuales, dinámicos o abs trac tos

deben ser miembros de una clase, de modo que otra clase puede here dar deésta y rede fi nir los méto dos. Los métodos virtuales inclu yen la directivaVirtual; los métodos dinámicos - la directiva Dyna mic; y los métodosabstractos - la directiva Virtual o Dyna mic seguida de la directivaAbstract. Los métodos sobrecargados aña den la palabra reservadaOverload a su declaración.

3. Puede uti li zar los mensajes de Windows como una herramienta dedepuración o de educación. Por ejemplo, para determinar con quéfrecuencia y cuándo su programa recibe el mensaje WM_ACTIVATE deWindows, declare este procedimiento:

pro ce du re wmac ti va te(var Mes sa ge: TMes sa ge); mes sa ge WM_ACTIVATE;

y luego escriba un men saje en un archivo de texto cada vez que Win dowsenvíe este men saje a su apli ca ción:

var {Esto está en la sec ción Inter fa ce} TForm1: TForm; tf: Text Fi le; ...pro ce du re TForm1.Form Crea te(Sen der: TObject);be gin Assign Fi le(tF,'trakmsgs.txt'); if Fi leE xists('trakmsgs.txt') then Append(tF) else Rew ri te(tF); Wri teLn(tF, Da te Ti me ToStr(Now));end;...pro ce du re TForm1.wmac ti va te(var Mes sa ge: TMes sa ge);be gin {He re der la res pues ta de Del phi al mensaje} in he ri ted; Wri teln(tf,'Se ha re ci bi do el men sa je WM_Acti va te');end;...pro ce du re TForm1.Form Des troy(Sen der: TObject);be gin Clo se Fi le(tF);end;

532 Los Tomos de Delphi: Delphi sin problemas

Page 567: Dsp

Por supuesto, puede hacer esto para tan tos men sa jes de Win dows comodesee (busque “WM_” en la ayuda de Del phi para ver una lista de men sa jesde Win dows), y es aún más fácil crear un regis tro de men sa jes pare cidopara los ges to res de even tos de su apli ca ción. Sim ple mente pulse dos vecessobre el evento de su interés en la página Events para cual quiera de losfor mu la rios o com po nen tes e intro duzca una sen ten cia Wri teln simi lar a lamos trada arriba. Por ejem plo, se podría ras trear el evento OnPaint de unfor mu la rio así:

pro ce du re TForm1.Form Paint(Sen der: TObject);be gin Wri teln(tf,'Se ha dis pa ra do el even to Paint');end;

Unknown directive (already exists)Posible causa de error

Puede haber añadido la direc tiva Override a un método rede fi nido en la secciónImplementation.

Solución rápidaColo que la directiva Override sola mente en la sección Inter face.

Información adicionalPara que sea posi ble rede fi nir un método, el método debe haber sido decla radocomo vir tual en la clase base.

Unknown IdentifierPosible causa de error

Puede estar haciendo refe ren cia a algo que está declarado en una unidad queno ha sido aña dida a la cláusula Uses de su unidad.

Solución rápidaDeter mine la uni dad que falta basán dose en el iden ti fi ca dor con el que el com-pi la dor está tro pe zando. Si es un iden ti fi ca dor de Del phi, puede hacer estocolo cando el cur sor sobre el iden ti fi ca dor y pul sando la tecla F1. La pan ta lla deayuda rela tiva al iden ti fi ca dor mos trará la uni dad en la que éste está decla-rado. Si el iden ti fi ca dor no es un iden ti fi ca dor de Del phi, es de un ter cero osuyo pro pio. En cual quier caso, una vez deter mine la uni dad en la que el iden-ti fi ca dor está decla rado, añada esta uni dad a su cláu sula Uses.

Mensajes de error 533

Page 568: Dsp

Información adicionalPuede utilizar otra unidad añadiéndola a la cláusula Uses en la parte Interface(creada auto má ti ca mente por Delphi e inicialmente poblada con muchasunidades estándar), o añadiendo su propia cláusula Uses directamente bajo lapalabra reservada Imple men ta tion.

Unknown picture file extension: <>Posible causa de error

1. Puede estar intentando cargar un archivo con una extensión distinta a.BMP, .ICO, .EMF o .WMF en la propiedad Picture de un objeto TImage.Por ejemplo, la siguiente línea producirá el mensaje de error bajodiscusión:

Ima ge1.Pic tu re.LoadF rom Fi le('Sun flo wers.txt');

2. Puede haber omitido la extensión del archivo al hacer refe ren cia al archivo.

Solución rápida1. Solamente car gue archi vos de los tipos apro pia dos dentro de la propiedad

Picture de TImage.2. Incluya explí ci ta mente siempre la extensión del archivo gráfico (.BMP,

.ICO, .WMF o .EMF).

Información adicionalDebe especificar archi vos de imágenes en alguno de los formatos gráficosreconocidos por Delphi. Por ejemplo, cualquiera de los siguientes son válidos:

Ima ge1.Pic tu re.LoadF rom Fi le('C:\VG\Wheat Field With Crows.BMP');Ima ge2.Pic tu re.LoadF rom Fi le('C:\VG\TheS tarr yNight.ICO');Ima ge3.Pic tu re.LoadF rom Fi le('C:\VG\Self Por trait With Hat.WMF');Ima ge4.Pic tu re.LoadF rom Fi le('C:\VG\The Po ta to Ea ters.EMF');

Unknown SQL ErrorPosible causa de error

Puede estar accediendo a una base de datos de servidor SQL y ha añadido oborrado una columna o índice, o modi fi cado una descripción de campo nulo o nonulo mien tras el pará me tro del BDE ENABLE SCHEMA CACHE tenía asig-nado True.

534 Los Tomos de Delphi: Delphi sin problemas

Page 569: Dsp

Solución rápidaAsigne False a ENABLE SCHEMA CACHE con la utilidad BDE Configurationantes de hacer cualquier cam bio en la estruc tura de las tablas de la base dedatos.

Pulse el botón Help en la uti li dad BDE Con fi gu ra tion para infor ma ción espe cí-fica sobre estos pará me tros para el con tro la dor que está utilizando.

Información adicionalSi el esquema está en caché (ENABLE SCHEMA CACHE tiene asig nadoTrue), los cam bios hechos al esquema de base de datos durante el tiempo deeje cu ción no serán reco no ci dos por el BDE. El esquema de la base de datosdebe per ma ne cer está tico si desea tener la caché de esque mas en True. Ade-más de la opción ENABLE SCHEMA CACHE, para las bases de datos de ser vi-dor SQL (como Inter Base, MS SQL Ser ver, Sybase, Ora cle, etc.) tam biénexis ten los pará me tros SCHEMA CACHE DIR, SCHEMA CACHE SIZE ySCHEMA CACHE TIME en la página/nodo Dri ver de la uti li dad BDECon fi gu ra tion.

Unknown user name or passwordPosible causa de error

Puede haber introducido una con tra seña invá lida en el cuadro de diálogo decone xión a base de datos (Data base Login) des pués de lo siguiente:

a. Intentó asignar True a la propiedad Connected de un componenteTDatabase, en tiempo de diseño o en tiempo de ejecución (en el código).

b. Llamó al método Open de un componente TDatabase o TTable.c. Intentó asignar True a la propiedad Active de un objeto TTable, en

tiempo de diseño o en tiempo de ejecución (en el código).

Solución rápidaPro por cione la con tra seña correcta en el cua dro de diá logo Data base Login ypulse el botón OK.

Información adicionalPuede evi tar tener que intro du cir con ti nua mente una con tra seña mien tras estádesa rro llando su apli ca ción con fi gu rando la con tra seña en el código o a tra vésde la sec ción Para me ter Ove rri des del com po nente TDa ta base.

Para asignar la con tra seña en el código, añada una línea como la siguiente enalgún punto del código antes de intentar acceder a la base de datos (porejemplo, en el evento OnCreate del formulario):

Mensajes de error 535

Page 570: Dsp

Ses sion.AddPass word('Kenn wort');

Para asignar la con tra seña uti li zando la sección Parameter Overrides delcomponente TDatabase, siga estos pasos:1. Haga doble clic sobre el componente TDatabase.2. Veri fi que que se mues tren el nombre y alias correc tos.3. Quite la selección de la casilla de verificación Login Prompt.4. Pulse el botón Defaults.5. Añada la con tra seña a la línea Password= en el cuadro de lista Parameter

Overrides.

Alternativamente, puede proporcionar un gestor de eventos para el eventoOnLogin.

Unnamed arguments must precede named arguments in OLEAutomation call

Posible causa de errorPuede haber nombrado un argumento en una llamada OLE, y luego haberescrito un valor para un argu mento sin nombre. Por ejemplo, el siguientecódigo gene rará este mensaje de error si se intenta activar la base de datos:

pro ce du re Back ward sCo ding;var v: Va riant;be gin v.Tail(Bo nan za := 'Cart wrights', 'Beech');

Solución rápidaEli mine el argumento con nombre:

pro ce du re Back ward sCo ding;var v: Va riant;be gin v.Tail('Cart wrights', 'Beech');

O nom bre tam bién el argumento que le sigue:

pro ce du re Back ward sCo ding;var v: Va riant;be gin v.Tail(Bo nan za := 'Cart wrights', Ha rrietS to wer := 'Beech');

O invierta el orden de los argumentos:

pro ce du re Back ward sCo ding;

536 Los Tomos de Delphi: Delphi sin problemas

Page 571: Dsp

var v: Va riant;be gin v.Tail('Beech', Bo nan za := 'Cart wrights');

Información adicionalPara más información, consulte “named parameters” en la ayuda de Delphi.

Unrecognized database parameter blockPosible causa de error

Puede haber añadido una sentencia inválida a la propiedad Params de uncomponente IBDatabase. Por ejemplo, la siguiente entrada generará estemensaje de error si intenta activar la base de datos:

user na me=SYSDBApass word=mas ter key

Solución rápidaVeri fi que que los parámetros que haya introducido estén exactamente comoson requeridos. En el ejemplo de arriba, es necesario que sea añadido un guiónbajo al parámetro user_name:

user_name=SYSDBApass word=mas ter key

Información adicionalDurante el desarrollo, es con ve niente asignar False a la propiedad Login deIBDatabase, y proporcionar la información necesaria (nombre de usuario ycontraseña) en la propiedad Params. Antes de distribuir, sin embargo, puedeencontrar con ve niente for zar al usuario a introducir sus datos para acceder ala base de datos (dependiendo, por supuesto, del tipo de aplicación/datos queesté mane jando). En ese caso, es reco men da ble cam biar el nombre de usuario yla con tra seña a otros que no sean sus valo res por defecto SYSDBA ymas ter key.

Unsatisfied forward or external declaration: <>Posible causa de error

1. Este men saje de error apa rece cuando tiene una decla ra ción ade lan tada oexterna de un pro ce di miento o fun ción, o una decla ra ción de un método enuna clase o tipo de objeto, y no define el método, pro ce di miento o fun ciónen algún lugar. De hecho, puede ser que la defi ni ción haya sido omi tida o

Mensajes de error 537

Page 572: Dsp

qui zás sim ple mente su nom bre esté mal escrito. Note que una decla ra ciónde pro ce di miento o fun ción en la parte Inter face de una uni dad es equi va-lente a una decla ra ción ade lan tada — usted deberá pro por cio nar suimple men ta ción en la parte Imple men ta tion. De forma simi lar, la decla ra-ción de un método en una clase o tipo de objeto es equi va lente a unadecla ra ción ade lantada. Puede nece si tar ante po ner el nom bre de la clase alpro ce di miento. Por ejem plo, si ha decla rado en la parte Inter face unmétodo lla mado Play Ba se ball, su defi ni ción en la parte Imple men ta tiondebe ser la siguiente (asu miendo que la clase es TForm1):

TForm1.Play Ba se ball;

2. Puede haber olvidado añadir la palabra reservada Exter nal a ladeclaración formal de un procedimiento (o función) situado en una .DLL.

Solución rápida1. Defina el procedimiento o función declarado en la parte Interface de la

unidad en la parte Implementation de la unidad.2. Añadir la palabra reservada Exter nal.

Información adicionalDeclarar un método en la sección Interface equi vale a pro me ter que se pro por-cio nará el resto de la información más adelante (en la sección Implementationque sigue). Debe cumplir su pro mesa haciéndolo.

Unsupported 16bit resourcePosible causa de error

Puede estar inten tando ins ta lar en Del phi de 32 bits un com po nente que tieneaso ciado un archivo .DCR (recurso de icono de mapa de bits) que fue creado conuna herra mienta de 16 bits (como el Image Edi tor de Del phi 1).

Solución rápidaCar gue el archivo .DCR en el Image Editor de cualquier versión de 32 bits deDelphi y guárdelo (será grabado en formato de 32 bits). Intente de nuevo ins ta-lar el componente.

Información adicionalPuede necesitar editar el archivo .DCR en el Image Editor para que el cambioa 32 bits tenga efecto. Por ejemplo, puede cambiar un píxel, des ha cer el cambio(pul sando Ctrl+Z), y luego guar darlo.

538 Los Tomos de Delphi: Delphi sin problemas

Page 573: Dsp

Unterminated stringPosible causa de error

1. Puede haber olvi dado el após trofe (comi lla sim ple) de cie rre al final de unacadena.

2. Puede haber partido una cadena en varias líneas en el editor de código deDelphi, pero olvidó terminar cada línea con un apóstrofe.

Solución rápida1. Incluya un apóstrofe al final de cada cadena.2. Incluya un apóstrofe al final de cada línea en una cadena multilínea.

Información adicionalPara partir una cadena en varias líneas, uti lice el operador + para concatenarlas líneas. He aquí un ejemplo:

s := 'Das fes che Umhers tol zie ren des Hahns ' + 'ist ein be kann ter Anblick.' + 'Was fehlt dir, mein Jun ge?';

USES clause is missing or incorrectPosible causa de error

Puede tener un error de sintaxis en la cláusula Uses de la parte Inter face.

Solución rápidaVeri fi que que haya una coma entre todas las unidades que aparecenreferenciadas en la cláusula Uses y un punto y coma al final.

Información adicionalEn Delphi 1, puede también obtener este mensaje de error si no tiene una cláu-sula Uses en un archivo de biblioteca (.DLL).

Validation error for column <Column Name>, value <***Null***>Posible causa de error

Puede haber inten tado inser tar una fila en una tabla sin proporcionar un valorpara una columna no nula de esa tabla. Por ejemplo, puede tener un código

Mensajes de error 539

Page 574: Dsp

similar al siguiente para inser tar en una tabla que tiene una columna lla madaTAX_CODE defi nida 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,:Emplo yerID,:Pay roll Da te,’ + ‘:Lia bi lity Amount,:Due Da te)');Pa rams.Pa ramB yNa me('AgencyID').AsString := AAgencyID;Pa rams.Pa ramB yNa me('Emplo yerID').AsString := AEmplo yerID;Pa rams.Pa ramB yNa me('Pay roll Da te').Ada te := APay roll Da te;Pa rams.Pa ramB yNa me('Lia bi lity Amount').AsCu rrency := ALia bi lity Amount;Pa rams.Pa ramB yNa me('Due Da te').Ada te := dDue Da te;. . .

Solución rápidaAsegúrese de que la columna siempre tenga un valor, o eli mine la restricciónNOT NULL para esa columna. Si opta por lo primero, puede seguir estepatrón:

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,:Emplo yerID,:Tax Co de,:Pay roll Da te,’ + ‘:Lia bi lity Amount,:Due Da te)');Pa rams.Pa ramB yNa me('AgencyID').AsString := AAgencyID;Pa rams.Pa ramB yNa me('Emplo yerID').AsString := AEmplo yerID;Pa rams.Pa ramB yNa me('Tax Co de').AsString := ATax Co de;Pa rams.Pa ramB yNa me('Pay roll Da te').Ada te := APay roll Da te;Pa rams.Pa ramB yNa me('Lia bi lity Amount').AsCu rrency := ALia bi lity Amount;Pa rams.Pa ramB yNa me('Due Da te').Ada te := dDue Da te;. . .

Información adicionalEsto puede pasar fácilmente cuando modifica las estructuras de las tablasdespués que el código ha sido escrito. Hasta donde sea posible, evite cambiarlas estructuras de las tablas, rea li zando un análisis y diseño exhaustivos antesde iniciar la codificación.

540 Los Tomos de Delphi: Delphi sin problemas

Page 575: Dsp

Variable <> inaccessible here due to optimizationPosible causa de error

El valor de la variable o propiedad que está intentando ver o examinar ha sidooptimizado en este punto de la vida del programa.

Solución rápidaDesac tive la opción de opti mi za ción del com pi la dor, aña diendo una de lassiguientes directivas:

{$O-}{$OPTIMIZATION OFF}

Información adicionalPara más información, consulte “optimization” en la ayuda de Delphi.

Variable name expectedPosible causa de error

Puede haber intentado utilizar una dirección absoluta al declarar una variableen una versión de Delphi (Delphi 6 y superiores) que incluye la Biblio teca deCom po nen tes de Bor land (cono cida como CLX, que sig ni fica “ComponentLibrary X-Platform” o “Class Library X-Platform”). Por ejemplo, lo siguientegenerará este mensaje de error:

var x: Inte ger ab so lu te $1234;

Solución rápidaBorre la directiva Abso lute.

Información adicionalDelphi para Linux (cono cido como Kylix) ha hecho que este cambio seanecesario, ya que no se pue den decla rar varia bles con direc cio nes absolutas enLinux, porque esto no es soportado por el for mato PIC (Posi tion-Inde pen dentCode). C++ Builder también tiene sus efectos sobre Del phi. Por ejemplo, lapalabra reservada Register es la única sensible a mayús cu las/minús cu las enDelphi. Esto fue hecho para permitir la utilización de los componentes VCL deDelphi en C++ Builder. C++ dis tin gue entre mayús cu las y minúsculas, yregister (el con ve nio de lla mada) no es lo mismo que Register (el nom bre delmétodo uti li zado para la instalación de componentes en la Paleta deCompo nen tes).

Mensajes de error 541

Page 576: Dsp

Variable requiredPosible causa de error

Puede estar intentando pasar un array a un procedimiento o función, pero haolvidado encerrar el array entre corchetes. Por ejemplo, lo siguiente generaráeste mensaje de error:

pro ce du re Mein Va ter War Ein Wan ders mann(Sen der: TObject); pro ce du re Li li Mar le ne(four nums: array of in te ger); be gin . . . end;be gin Li li Mar le ne(StrToInt(Edit1.Text), StrToInt(Edit2.Text), StrToInt(Edit3.Text));end;

Solución rápidaEncie rre el array entre corchetes:

. . .Li li Mar le ne([StrToInt(Edit1.Text), StrToInt(Edit2.Text), StrToInt(Edit3.Text)]);

Información adicionalDelphi 4 introdujo los arrays dinámicos.

Variant does not reference an automation objectPosible causa de error

Puede haber olvidado crear un objeto OLE antes de acceder a la variable detipo Variant utilizada para hacer refe ren cia a él. Por ejemplo, lo siguientegenerará este mensaje de error:

pro ce du re TForm1.But ton1 Click(Sen der: TObject);var xl: Ole Va riant;

pro ce du re Set Co lumn Tit les; be gin xl.Cells[1,1].Va lue := 'ORDER NUM'; xl.Cells[1,2].Va lue := 'VENDOR'; end;

542 Los Tomos de Delphi: Delphi sin problemas

Page 577: Dsp

be gin xl.Work books.Add; Set Co lumn Tit les; xl.Vi si ble := True;end;

Solución rápidaAñada la llamada a CreateOLEObject, asignando el objeto de auto ma ti za ción ala variable OLEVariant antes de llamar a sus métodos:

pro ce du re TForm1.But ton1 Click(Sen der: TObject);var xl: Ole Va riant;

pro ce du re Set Co lumn Tit les; be gin xl.Cells[1,1].Va lue := 'ORDER NUM'; xl.Cells[1,2].Va lue := 'VENDOR'; end;be gin xl := Crea teOLEObject('Excel.Appli ca tion'); // Ne ce sa rio! xl.Work books.Add; Set Co lumn Tit les; xl.Vi si ble := True;end;

Información adicionalConsulte “Variant does not reference an OLE object” en este libro.

Variant does not reference an OLE objectPosible causa de error

Puede haber intentado acceder a un objeto OLE asignado a una variable detipo Variant que no ha sido registrado en su sistema.

Solución rápidaRegis tre el objeto OLE en todas las máquinas en las que se haga refe ren cia aél. Con sulte “Class not registered” para información más específica.

Información adicionalConsulte “Variant does not reference an automation object” en este libroy “Variant types” en la ayuda de Delphi para más información.

Mensajes de error 543

Page 578: Dsp

Variant errorPosible causa de error

Debe estar llamando al método ExecSQL de un objeto TQuery en lugar de sumétodo Open, cuando un conjunto resultado debería estar a disposición.

Solución rápidaLlame siem pre a Open en el caso de sen ten cias SELECT (que, al menos enteoría, devuelven un conjunto resultado). Llame a ExecSQL en el caso de lassentencias que manipulan los datos (INSERT, UPDATE y DELETE).

Información adicionalSi está trabajando con bases de datos SQL (a diferencia de las bases de datosde escritorio como Paradox o Access), estu die el componente TStoredProc.

Variant is not an arrayPosible causa de error

Puede haber intentado acceder a un ele mento de una variable de tipo Variant,como si fuera una cadena. Por ejemplo, puede haber intentado algo así:

var Co der Candy: Va riant;be gin Co der Candy := 'Melts In Your Mug, Not In Your Mitt'; {La si guien te lí nea ge ne ra rá el error} La bel1.Cap tion := Co der Candy[1] + '&' + Co der Candy[1]; {Lo mis mo esta línea} Co der Candy[4] := 'u';end;

Solución rápidaNo intente acceder a tra vés de un índice a un Variant al que se haya asignadoun valor de cadena.

Información adicionalPara más información, consulte “VarArrayCreate” y “VarIsArray” en la ayudade Delphi.

544 Los Tomos de Delphi: Delphi sin problemas

Page 579: Dsp

Vendor initialization failure: ORA[NT]7[1,2,3].DLLPosible causa de error

El BDE podría no estar encon trando la .DLL de Oracle que se ha especificadoen el parámetro Vendor Init de la utilidad de Administración/Configuración delBDE.

Solución rápidaDeter mine qué ver sión de ORA*.DLL está ins ta lada en la máquina. Utilizandola utilidad de Administración/Configuración del BDE, intro duzca el nombre deeste archivo en el parámetro Vendor Init. Este archivo debería estar situado enel subdirectorio \BIN del directorio de Oracle, por ejemploC:\ORAWIN95\BIN.

Información adicionalConsulte la documentación de Oracle para más información sobre las .DLLsrequeridas para su ver sión de Oracle.

Windows socket error: <> on API <>Posible causa de error

1. Si el primer parámetro de este mensaje de error es 10014, 10022 ó 10049,puede que esté uti li zando Delphi 4 Update Pack 2.

2. Si el primer pará me tro en este mensaje de error es 10049, puede haberintentado asignar True a la propiedad Active de un componenteTClientSocket mien tras el valor de su pro pie dad Address contenía un valorerróneo.

Solución rápida1. Actua lí cese a Delphi 5 o una versión superior, o al menos apli que el

Update Pack 3 de Del phi 4. Si no puede hacerlo, o por alguna razón no lodesea, uti lice la solu ción alter na tiva del pro blema que se des cribe en eldocu mento http://www.pbe.com/kudzu/Delphi/FAQ/402SConnect.html.

2. Veri fi que la dirección IP correcta de la máquina del servidor, e intro duzcaese valor en la propiedad Address del objeto TClientSocket.

Información adicional2. La propiedad Address especi fica la dirección IP del servidor con el que se

está intentando conectar.

Mensajes de error 545

Page 580: Dsp

Windows Socket Error: (10060), on API connectPosible causa de error

Puede haber intentado asignar True a la propiedad Connected de un objetoTRe mo te Ser ver mien tras la propiedad ConnectType tenía asig nado el valorctSoc kets, pero el servidor de aplicación no ha sido configurado.

Solución rápidaEje cute el programa Scktsrvr (SCKTSRVR.EXE) en la máquina del servidor deaplicación. Este pro grama se encuentra por defecto en C:\Archivos deprograma\Borland\Delphi X\Bin.

Información adicionalConsulte “MIDAS” en la ayuda de Delphi para más información.

Write error on <>Posible causa de error

El disco en el que el compilador está intentando gra bar un archivo puede estarlleno.

Solución rápidaBorre los archi vos inne ce sa rios de la unidad e intén telo de nuevo. Por ejemplo,los docu men tos gran des y archivos gráficos que no se necesiten pueden sercopia dos a un dis po si tivo inde pen diente y luego borrados.

Información adicionalUti lice perió di ca mente la utilidad de defragmentación de Windows parareorganizar el disco duro. Esto mejorará el rendimiento, ya que los archivosuti li za rán menos áreas sepa ra das (o pre fe ri ble mente un área contigua) en vezde estar esparcidos por todo el disco duro.

You cannot add a <> to the current project because it is not anActiveX library. Click OK to start a new ActiveX library project

Posible causa de errorPuede haber selec cio nado File | New... | Acti veX | Acti ve Form o Acti veXCon trol mien tras estaba abierto un pro yecto con ven cio nal (no Acti veX).

546 Los Tomos de Delphi: Delphi sin problemas

Page 581: Dsp

Si está uti li zando Del phi 4, puede haber selec cio nado File | New... | Acti veX| MTS Auto ma tion object mien tras estaba abierto un pro yecto con ven cio nal(no Acti veX).

Solución rápidaPulse OK para cerrar el pro yecto actual, abra un nuevo pro yecto Acti veXLibrary, y añada el ele mento que había selec cio nado.

Información adicionalConsulte “ActiveX applications” en la ayuda de Delphi para más información.

You cannot specify a size for a field of this typePosible causa de error

Puede estar intentando cambiar el tipo de datos de un campo en el Data baseDesk top, por ejemplo de ‘A’ (Alpha) a ‘N’ (Number), pero el valor anterior deltamaño (Size) está todavía especificado, y no es aplicable al tipo de datos alque se desea cam biar el campo.

Solución rápidaBorre pri mero el valor de la columna Size, y luego cam bie el tipo de datos en lacolumna Type.

Información adicionalAlgunos tipos de datos requieren un valor de tamaño, otros permiten un valorde tamaño que no es obligatorio, y otros no permiten un valor de tamaño.Consulte “Paradox field types and sizes” en la ayuda en línea del DatabaseDesktop para más información.

You must open a project before you can add an Automation ObjectPosible causa de error

Puede haber inten tado crear un objeto de auto ma ti za ción sin tener un pro yectoabierto. Por ejem plo, puede haber selec cionado File| New..., y luego haberselec cio nado Remote Data Module en la página New.

Solución rápidaAbra un proyecto existente o cree un nuevo pro yecto antes de intentar añadirun objeto de auto ma tización.

Mensajes de error 547

Page 582: Dsp

Información AdicionalUna vez que el pro yecto esté abierto, se puede crear un nuevo objeto de auto-ma ti za ción selec cio nando File | New. . . , pul sando la pes taña Acti veX, yenton ces pul sando dos veces sobre el icono Auto ma tion object.

You must select a VCL classPosible causa de error

Puede estar intentando crear un control ActiveX utilizando el Asistente deCon tro les Acti veX, pero no ha proporcionado la clase VCL en la que se basa elcontrol ActiveX en el cuadro de com bi na ción ‘VCL Class Name’.

Solución rápidaSelec cione un nom bre de com po nente en el cuadro de com bi na ción ‘VCL ClassName’ o teclee uno.

Información adicionalPara crear un control ActiveX uti li zando el Asistente de Con tro les Acti veX, sedebe par tir de un componente de Delphi y entonces convertirlo en un controlActiveX.

De esta manera se podrán uti li zar los componentes de Delphi en otros entornosque soporten controles ActiveX, como C++ Builder, Visual Basic, PowerBuilder,etc.

Your application is not enabled for use with this driverPosible causa de error

1. Puede estar intentando utilizar SQL Links con una versión de Delphi queno es la Cliente/Ser vi dor (Enter prise).

2. Puede estar intentando utilizar un con tro la dor ODBC con una ver sión deDel phi estándar o de evaluación.

3. Puede que ori gi nal mente tuviera una versión inferior de Delphi en su sis-tema, y luego ins taló Del phi Cliente/Servidor sin desinstalar antes laversión previa.

Solución rápida1. Actua lí cese a la ver sión Cliente/Servidor o uti lice tablas Para dox, dBASE u

ODBC.2. Actua lí cese a Del phi Pro fe sio nal o uti lice tablas Paradox o dBASE.

548 Los Tomos de Delphi: Delphi sin problemas

Page 583: Dsp

3. Desins tale la versión anterior de Delphi, y luego ins tale DelphiCliente/Servidor.

Información adicionalConsulte “Application is not licensed to use this feature”.

Your username and password are not defined. Ask your databaseadministrator to set up an InterBase login

Posible causa de errorPuede haber intentado activar un componente IBDatabase cuando la propiedadLogin tenía el valor False, pero la propiedad Params no contenía el nombre deusuario y la contraseña necesarias.

Solución rápidaAñada el nombre de usuario y la contraseña a la propiedad Params, o cambieel valor de la propiedad Login a True en tiempo de eje cu ción, y entonces sumi-nis tre los valores ade cua dos.

Información adicionalDurante el desarrollo, es conveniente asignar el valor False a la propiedadLogin del componente IBDatabase, y suministrar la información necesaria(nombre de usuario y contraseña) en la propiedad Params. Sin embargo, des-pués de la implan ta ción puede ser con ve niente for zar al usuario a intro du cir sunom bre y con tra seña para acce der a la base de datos (dependiendo, porsupuesto, del tipo de aplicación o datos de que se trate). En este caso, esrecomendable cambiar los valores de usuario y con tra seña por defecto,SYSDBA y masterkey.

Mensajes de error 549

Page 584: Dsp

550 Los Tomos de Delphi: Delphi sin problemas

Page 585: Dsp

Indice

Si está buscando un mensaje de error específico, consulte la Tabla de Contenido. Allí selistan los mensajes de error alfabéticamente, y por esa razón 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, 53410014, 54510022, 54510049, 54525, 175800A03EC, 410

AAbort, 469Abso lute, 458 ,501abstractas, clases, 149abstractos, métodos, 44 ,149 ,498Access, (Microsoft Access), 250Active, 106 ,110ActiveControl, 93ActiveForms, 89 ,216 ,235ActiveX

Asistente, 13 ,37 ,548biblioteca, 88 ,134 ,547controles, 29 ,37 ,89 ,133 ,162 ,216 ,235 ,548

Add, 41

i

Page 586: Dsp

AddIndex, 9 ,252AddIndexDef, 398address, 393ADO, 473ADO Express, 143Alias, 104alias del BDE, 159 ,503 ,530Apache, 416API, xxxivAppend, 264 ,503ApplyUpdates, 120 ,364arrays, 392 ,446 ,524Assert, 55AssignFile, 264AsyncPro, 412AUTOEXEC.BAT, 462Autoincrement, cam pos, 314 ,315automatización, 341AutoSessionName, 78 ,89 ,90 ,106 ,114 ,199 ,233

,279 ,391 ,461Avail able Forms, 48

BBDE, 1BDE Administración/configuración, 186BDEProv, 399BLOB SIZE, 329Boolean, 9 ,516Break, 67Break on Excep tions, 239 ,440

CC++ Builder, 89 ,541C0000006, 241C0000008, 242C0000012, 242C3254, 324CachedUpdates, 58Cam pos

calculado, 252calculados, 258obligatorios, 251

capac ity, 359case, 124 ,193CGI, 415Chr , 276Citrix Winframe, 496clases abstractas, 149class , 497Close, 115

CLX, 541CoClass, 28 ,482Code Insight, 137CoInitialize, 138COM, xxxiv ,29 ,138CommandText, 142Com mit, 401CommitUpdates, 364compilación condicional, 381Componentes

eliminación, 36 ,51 ,231instalación, 28 ,231

CONFIG.SYS, 404ConfigFile01, 100CONFIGFILE01, 91 ,161con nect, 83Con nect, 460Con nected, 111 ,112 ,133 ,168 ,173 ,393Con nec tion, 379ConnectionString, 22 ,379ConnectType, 173Const, 241ConstraintErrorMessage, 42constructores, 150Con tains, 151Con tinue, 67contraseña, 83 ,164 ,167 ,319 ,535conversiones, 347con vert (utilidad), 224CoUninitialize, 138CREATE INDEX, 227CreateDataSet, 396CreateOLEObject, 212 ,543CustomConstraint, 42

DData base Desk top, 287DatabaseName, 115 ,168 ,194 ,384 ,504 ,529DateTime, 451Datos

de Automatización, 341del Registro, 243en Par a dox, 298

dBASE, 167 ,337 ,338 ,494 ,509DBClient.DLL, 415 ,416DBCLIENT.DLL, 98DBExpress, 38 ,110 ,142 ,395 ,400 ,413 ,519DCOM, 173 ,393Dec, 359Default, 179 ,255

ii

Page 587: Dsp

DefaultExpression, 251 ,434DefineProperties, 343Delete, 114DeleteTable, 115Delphi 3, 422Delphi 4, 419 ,431Delphi 5, 75Delphi 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, 243destructores, 150dfBinary, 113 ,381dfXML, 113 ,381dfXMLUTF8, 381DisableControls, 283dispid, 190 ,425dispinterface, 33Dis pose, 191DLLPATH, 100 ,103duplicados

nombres, 196 ,198 ,258propiedades, 199 ,200recursos, 197valores, 196 ,199

EEditMask, 40EmptyTable, 115ENABLE SCHEMA CACHE, 535EncodeDate, 327EncodeTime, 327End, 209 ,483Entrada/Salida, error 100, 189Entrada/Salida, error 101, 190Entrada/Salida, error 102, 265Entrada/Salida, error 105, 272Erase, 264error, 205 ,272Error, 204Error de Protección Gen eral, 45Excel, 374 ,410excepciones, 457Except, 210Exclu sive, 264ExecSQL, 85 ,219 ,362 ,544Exit, 68Exports, 240 ,439

F

Fail, 437FetchAll, 141ficheros

conversión, 224localización, 85nombrado, 60

FieldDefs, 396FieldKind, 258 ,261Fields Edi tor, 172 ,379File of Record, 512FillChar, 49filtros, 415 ,452Final iza tion, 176Finally, 237FindKey, 258 ,361 ,397FindNearest, 258FixedCols, 273FixedRows, 274For , 56for mat, 58 ,60 ,393formularios

creación, 45 ,71 ,78 ,105herencia, 220visualización, 221

GGen eral Pro tec tion Fault GPF, 45GetLastError, 59 ,457GetMem, 49 ,284 ,342GetProcAddress, 230 ,240GExperts, 233GoTo, 282 ,354gráfico, API, xxxivgráficos, formatos, 63GROUP BY, 256 ,283 ,348GUID, 34

HHalt, 67HandleShared, 233 ,390High, 284Host, 393

Iibinstall.dll, 321IBX, 170 ,395icono, 493iconos, 80IDAPI.CFG, 91 ,121 ,160IDAPI.DLL, 100

iii

Page 588: Dsp

IDAPI01.DLL, 102IDAPI32.CFG, 91 ,121 ,160 ,186IDAPI32.DLL, 2 ,51 ,101 ,103IDataBroker, 157 ,158identificadores, 289IDPROV32.DLL, 98Image Edi tor, 494Imple men ta tion, 294Imple ments, 295ImportedConstraint, 42Inc , 358Index, 227 ,257 ,282 ,307IndexField, 247IndexFieldNames, 9 ,155 ,247 ,397IndexName, 9 ,155 ,245 ,248 ,308 ,309 ,397índices, 475

crear por código, 310mantenidos, 310 ,312primarios, 408secundarios, 408

Indy, 412 ,465Ini tial iza tion, 11 ,15 ,62 ,176 ,523InstallShield Express, 1 ,38 ,100 ,323InterBase, 73 ,104 ,169 ,170 ,321 ,520InterBase 6, 73 ,321 ,467InterBase Express, 110 ,143 ,380 ,508Inter face, 7 ,235 ,321inter faces, 7Internet Direct -Indy, 412Is, 347IsValidDateMonthWeek, 26IUnknown, 177

KKeepConnection, 112KeyPress, 19 ,21 ,499Kylix, 412 ,541

LL1086, 324L1317, 324L721, 324Label, 354Last, 141Length, 208Library Path, 60 ,151 ,456LoadFromFile, 86LoadLibrary, 230 ,240Local Share, 317 ,364Locate, 397

MMasterFields, 488MasterSource, 126 ,488MAXQUERYTIME, 467MaxValue, 23 ,371MDI, 87

formularios, 398hijos, 398

memoria, 77liberación, 342limitaciones, 422

metaarchivos, 136 ,207 ,371métodos abstractos, 44 ,149 ,498Microsoft Access, 250Microsoft Excel, 374 ,410MIDAS, 113 ,170 ,173 ,399 ,414 ,460MIDAS.DLL, 416MinValue, 23 ,377Miser, Dan, 250 ,432MTS, 377multi-hilos, 106 ,199 ,236 ,391 ,461 ,477MultiSelect, 312

NName , 460NetDir, 171

configuración, 185New, 392Nodefault, 255 ,402NOT NULL, 540Null, 237

OObject Pascal

directivas, 11palabras reservadas, 11tipos ordinales, 421

ODBC, 361 ,365 ,452 ,548OldCreateOrder, 232 ,242 ,443OldValue, 58 ,405OLEVariant, 543OnActivate, 80OnHide, 81OnShow, 81OnValidate, 42open, 107optimización, 109 ,541Ora cle .DLL, 545ORDER BY, 123 ,256 ,350ordi nal, 275

iv

Page 589: Dsp

over load, 299 ,374 ,411 ,412 ,424 ,435over ride, 109 ,149 ,372 ,375 ,444 ,533

PPacked, 428PageIndex, 13paquetes, 7 ,75 ,422 ,425 ,456 ,483

borrado, 341recompilación, 61

Par a dox, 240 ,479compartición, 171integridad referencial, 369limitaciones, 167Tipos de datos, 65 ,66 ,303

parámetros, 171 ,420 ,486Params, 245 ,289 ,537PDOXUSRS.LCK, 387PDOXUSRS.NET, 387Pre pare, 142 ,317propiedades, 343

declaración, 434tipos, 437

Pub lished, 509puertos, 57 ,465punteros, 45 ,143 ,164 ,165 ,180 ,301 ,342 ,347

,358 ,434 ,446 ,509 ,512

QQuery Builder, 163QuickReports, 232 ,521

RR938, 324Raise, 135 ,456Read, 11 ,79 ,450ReadBinaryData, 214Readln, 270ReadOnly, 106 ,116Real, 446recursión, 439 ,468recursos

conservación, 214DLLs, 492renombrar, 197

REF CURSOR, 420Referencial, integridad, 10Refresh, 389Reg is ter, 202 ,413RegisterClass, 72 ,204RegisterComponents, 28 ,72 ,202 ,486

Rename, 258ReportSmith, 140 ,265 ,520RequestLive, 249 ,317 ,477 ,481 ,502Required, 203 ,244 ,262Requires, 425 ,455Reset, 264 ,265resourcestring, 11Resourcestring, 165 ,522Rewrite, 264 ,265RLINK32.DLL, 161Round, 336RTTI, 484Run-time error 202, 469Runtime Error 215, 54

SSaveToFile, 85SDI, 87SELECT, 256 ,257 ,348ServerGUID, 83 ,330 ,460ServerName, 460SessionName, 90 ,106 ,116 ,199 ,233 ,460SetDatabaseName, 118SetFocus, 93SetLength, 208 ,391 ,393SHAREDMEMSIZE, 62 ,318 ,329ShortDateTime, 452ShowModal, 105Site Express, 32 ,92 ,326 ,490 ,494Slice, 464sock ets, 466SortFieldNames, 142SQL, 115 ,219SQLDialect, 467SQLPASSTHRU MODE, 432StartTransaction, 38 ,110 ,169 ,281 ,395 ,401

,505 ,507STDOLE.TLB, 161STDOLE2.TLB, 161Stored, 255 ,470StoredProcName, 219Syn chro nize, 236SYSTEM.DCU, 474SYSTEM.INI, 422

TTableName, 9 ,115 ,252 ,308 ,384TableType, 116TADOConnection, 22TBatchMove, 183 ,184 ,298

v

Page 590: Dsp

TBits, 64TClientDataSet, 514TClientDataSetGrid, 113TClientSocket, 57 ,72 ,545TDatabase, 168TDataSet, 112TDateTime, 16 ,22TDateTimePicker, 17Ter mi nate, 67TextOut, 301TField, descendientes para los tipos de Par a dox,

66 ,299TFileAttr, 525TFrame, 397Threadvar, 97 ,501TIBDatabase, 110TIBInstall, 321TIBTransaction, 110 ,395TIBUninstall, 321TIDAntiFreeze, 412tiDirtyRead, 495TModalResult, 524TObject, 179TObjectList, 411TPageControl, 221TQuery, 400 ,447TQueryClientDataSet, 170TransIsolation, 494TRegSvr, 157 ,158 ,230 ,326 ,409 ,487 ,494TReport, 140 ,265Trunc, 336Try, 237Try...Except, 237 ,457Try...Finally, 237 ,457TSession, 78 ,90 ,106 ,114 ,199 ,460TSQLConnection, 110TTabbedNotebook, 221TTable, 467TThread, 98TThreadList, 411TUtility, 405type, 131 ,229TypeInfo, 510 ,516

Uuni di rec tional, 413Unprepare, 116 ,141 ,317UpdateMode, 447 ,467UseBroker, 173Uses, 521

Vvalidación, 40 ,251Var, 131

parámetros, 497vari ables

declaración, 146inicialización, 95

variantes, 515 ,524VARIANTS.PAS, 524VBX, 488VCL, 30 ,139vir tual, 372VMT, 517

WWaitFor, 236Webbrokerscript, 409 ,494Weblib, 326WideString, 7 ,98 ,177 ,341 ,347 ,515WIN.INI, 91WinCRT, 271Win dows, 1 ,47 ,62 ,65 ,76 ,87 ,91 ,121 ,138 ,225

,309 ,325 ,334 ,366 ,371 ,407 ,426 ,476 ,496With , 453Write, 77 ,450Writeln, 269 ,294

XXML, 113 ,380 ,514

vi