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
procedure Crear; var BitMask, BitTemp: TBitmap; wBit, hBit: Integer; MaskToo: array of array of Byte; Arc: file of TPoint; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Explora el bitmap en busca de contrastes en la imagen procedure Explorar; var i, j : Integer; P: PByteArray; Mask: array of array of Byte; begin // Creación de los bitmaps y su correspondiente lectura o asignación wBit:= BitMask.Width; hBit:= BitMask.Height; // Asigna la longitud de las matrices dinámicas SetLength(Mask, wBit, hBit); SetLength(MaskToo, wBit, hBit); // Deja en negro plano al bitmap creado for j:= 0 to hBit -1 do for i:= 0 to wBit * 3 -1 do FillChar(PBytearray(BitTemp.ScanLine[j])[i], 1, 0); // Asigna 1 a los elementos de la matriz correspondientes a valores transparentes del bitmap for j := 0 to hBit -1 do begin P:= BitMask.ScanLine[j]; for i:= 0 to wBit -1 do if P[i * 3 + 0] + P[i * 3 + 1] + P[i * 3 + 2] <> 0 then Mask[i, j]:= 1; end; ... end; ... continúa con otros procedimientos internos a Crear ... begin bla bla bla... 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
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
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)