Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   En D2010, mensaje de error... (https://www.clubdelphi.com/foros/showthread.php?t=66895)

mlara 17-03-2010 21:14:50

En D2010, mensaje de error...
 
Qué tal, estoy migrando a D2010 y de entrada obtengo este primer error en una pequeña aplicación.

Línea:

Código:

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

Código Delphi [-]
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:
Código Delphi [-]
  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...

Cita:

Empezado por ElKurgan (Mensaje 357392)
...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:

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 22:27:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi