PDA

Ver la Versión Completa : En D2010, mensaje de error...


mlara
17-03-2010, 21:14:50
Qué tal, estoy migrando a D2010 y de entrada obtengo este primer error en una pequeña aplicación.

Línea:


if Pos(Column.FieldName, QAkg.SQL[QAkg.SQL.Count-2]) <> 0 then
...


Mensaje de error:

[DCC Error] Historial.pas(51): E2251 Ambiguous overloaded call to 'Pos'
System.pas(16698): Related method: function Pos(const WideString; const WideString): Integer;
System.pas(18389): Related method: function Pos(const string; const string): Integer;

FieldName es de tipo System.WideString y SQL de tipo TStrings.

Tengo entendido que dentro de TStrings tengo Strings, no cadenas tipo C. Cómo puedo solucionar este inconveniente?

Lord Delfos
18-03-2010, 05:29:09
No sé cómo será la función Pos en D2010, pero si es como en D7...


function Pos(Substr: string; S: string): Integer;


Es decir que sólo acepta cadenas (sean Ansi o wide).

El error, sonspecho yo, viene de ahí.

Básicamente el mensaje de error significa:

1. No hay una función Pos que acepte una cadena y un TStrings.
2. El compilador encontró una función Pos que recibe dos WideStrings.
3. El compilador encontró una función Pos que recibe dos strings.

ElKurgan
18-03-2010, 09:03:03
Creo que el misterio se debe al tratamiento de cadenas UNICODE por Delphi 2010. LA función Pos ha sido sobreescrita para tratar los datos de los antiguos string (ahora AnsiString) y los nuevos Unicode (ahora String a secas).

Creo que puedes anular la ambigüedad haciendo un Casting al tipo deseado

Un saludo

defcon1_es
18-03-2010, 13:07:17
Como te han indicado ya, se debe al tratamiento de cadenas UNICODE por Delphi 2010.
Deberías hacer un casting de uno de los dos parámetros de la función.

Prueba esto:

if Pos(Column.FieldName, WideString(QAkg.SQL[QAkg.SQL.Count-2])) <> 0 then
...

mlara
04-04-2010, 23:23:01
Bueno, hacer cast al string contenido en el TStrings para convertirlo a WideString era la solución. Muchas gracias.

Por otra parte...

...Casting al tipo deseado

...me quedé pensando en si el tipo querría participar de un casting para saber si lo contratábamos o no... Je je

pabloloustau
05-04-2010, 00:51:34
a mi me pasa lo mismo. compilo una aplicacion aunque no tenga nada de codigo añadido y me sale este error. intente reinstalando el delphi 2010 y sigue el error. me quede sin programar.:( saben cual prodria ser el problema??

Checking project dependencies...
Compiling Project1.dproj (Debug configuration)
[DCC Fatal Error] Project1.dpr(1): F1027 Unit not found: 'System.pas' or binary equivalents (.dcu)

yapt
05-04-2010, 00:52:12
Hola,

efectivamente, la solución pasa por hacer un Cast al Variant (segundo parámetro) que pasabas a la función Pos en tu ejemplo.

Pero, por si alguien tiene interés, este problema (que aparece ya en Delphi 2009) no es por el tratamiento de las cadenas UNICODE.

De hecho, la llamada podría haberse realizado perfectamente de este modo:

if Pos(Column.FieldName, QAkg.SQL.Strings[QAkg.SQL.Count-2]) <> 0 then
El asunto, como bien explica Marco Cantú en su libro Delphi 2009 HandBook (pag. 213) es porque a partir de Delphi 2009 se controla, de forma más estricta, el paso de parámetros Variant a funciones que definen parámetros de un tipo concreto (no Variant).

En Delphi 2007 esta llamada podría haber dado un error en Runtime. Ahora, el error se produce en el momento de la compilación.

Si alguien tiene más interés, creo que lo justo es aconsejaos comprar el libro (que también está en castellano).

Saludos.

mlara
05-04-2010, 01:15:40
Interesante el aporte. Muchas gracias.

Ahh y para pabloloustau creo que deberías hacer tu pregunta en un nuevo hilo.