Ir al contenido


Foto

Error: Operator is not overloaded


  • Por favor identifícate para responder
1 respuesta en este tema

#1 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 05 mayo 2014 - 08:27

Recientemente estuve incursionando en Lazarus.
Una de las cosas que ví es que la LCL es altamente compatible con la VCL, hasta ahora según veo, a un nivel increible.
Me encuentro migrando un paquete que cambia los controles tales como botones y el mismo Form para agregar funcionalidades tales como pieles y formas no rectangulares (hecho completamente en D7 en el cual funciona de maravilla). Dichos controles capturan eventos para poder cambiar la cara del botón al momento de posicionarnos encima de él, etc.
Todo va bien hasta que me encuentro con el procedimiento de leer una máscara que permite dar forma a un control o a la misma ventana.
Aquí dejo el fragmento de código:



delphi
  1. procedure Crear;
  2. var
  3.   BitMask, BitTemp: TBitmap;
  4.   wBit, hBit: Integer;
  5.   MaskToo: array of array of Byte;
  6.   Arc: file of TPoint;
  7.  
  8. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  9. // Explora el bitmap en busca de contrastes en la imagen
  10.   procedure Explorar;
  11.     var
  12.     i, j : Integer;
  13.     P: PByteArray;
  14.     Mask: array of array of Byte;
  15.  
  16.     begin
  17. // Creación de los bitmaps y su correspondiente lectura o asignación
  18.     wBit:= BitMask.Width;
  19.     hBit:= BitMask.Height;
  20. // Asigna la longitud de las matrices dinámicas
  21.     SetLength(Mask, wBit, hBit);
  22.     SetLength(MaskToo, wBit, hBit);
  23. // Deja en negro plano al bitmap creado
  24.     for j:= 0 to hBit -1 do for i:= 0 to wBit * 3 -1 do
  25.       FillChar(PBytearray(BitTemp.ScanLine[j])[i], 1, 0);
  26. // Asigna 1 a los elementos de la matriz correspondientes a valores transparentes del bitmap
  27.     for j := 0 to hBit -1 do
  28.       begin
  29.       P:= BitMask.ScanLine[j];
  30.       for i:= 0 to wBit -1 do
  31.         if P[i * 3 + 0] + P[i * 3 + 1] + P[i * 3 + 2] <> 0 then Mask[i, j]:= 1;
  32.       end;
  33.       ...
  34.     end;
  35. ...
  36. continúa con otros procedimientos internos a Crear
  37. ...
  38.  
  39. begin
  40.   bla bla bla...
  41. end;



El código pertenece a una parte de una función que halla contrastes en la máscara y las transforma a una región.
Al compilar, la línea


delphi
  1.   if P[i * 3 + 0] + P[i * 3 + 1] + P[i * 3 + 2] <> 0 then Mask[i, j]:= 1;


(El 0 en i * 3 + 0 es solo a los efectos de mejorar la lectura de los tres términos)
arroja el error Operator is not Overloaded.
más arriba se puede ver una forma similar, que me indica que no es la llamada sino la construcción de la suma:


delphi
  1.   FillChar(PBytearray(BitTemp.ScanLine[j])[i], 1, 0);


El procedimiento es algo complicado para explicar, pero a lo que se refiere el error es que no puedo expresar: "TByteArray" + "TByteArray"

¿Alguien sabe como puedo producir el mismo resultado en esa expresión evitando ese error? (En D7 funciona)
  • 0

#2 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 06 mayo 2014 - 06:17

Para aquellos que hayan tenido el mismo error y no lo podieron solucionar:
Sólo basta con utilizar PByte en lugar de PByteArray.
O sea:



delphi
  1. procedure Crear;
  2. var
  3.   BitMask, BitTemp: TBitmap;
  4.   wBit, hBit: Integer;
  5.   MaskToo: array of array of Byte;
  6.   Arc: file of TPoint;
  7.  
  8. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  9. // Explora el bitmap en busca de contrastes en la imagen
  10.   procedure Explorar;
  11.     var
  12.     i, j : Integer;
  13.     P: PByteArray; // <--- línea ofensiva
  14.     Mask: array of array of Byte;



cambiar por:


delphi
  1. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2. // Explora el bitmap en busca de contrastes en la imagen
  3.   procedure Explorar;
  4.     var
  5.     i, j : Integer;
  6.     P: PByte; // <--- cambiada para Lazarus
  7.     Mask: array of array of Byte;


(h)
  • 0




IP.Board spam blocked by CleanTalk.