Las aplicaciones Delphi XE2 FireMonkey HD aumentan el error de tiempo de ejecución 231 en Mac OS X.

5 de octubre de 2011

Muchos usuarios se han encontrado con un problema al ejecutar aplicaciones FireMonkey HD en Mac OS X sin hardware 3D HAL. Cuando se ejecuta este programa, se congela o emite el siguiente error:

Runtime error 231 at 000169AD

Investigamos este problema y encontramos una solución desde Embarcadero.
Si su ordenador Mac OS X no tiene hardware 3D HAL, debe configurar una variable global FMX.Types.GlobalUseHWEffects a falso Ejemplo:

begin
  FMX.Types.GlobalUseHWEffects := False;

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run; 
end;

Sin embargo, esta decisión no es una panacea. A veces, las aplicaciones HD continúan congelándose o aumentando el error, incluso si FMX.Types.GlobalUseHWEffects está establecido en False. En este caso, debe cambiar el bloque FMX.Filter.pas. Haz lo siguiente:

  1. Dupdo FMX.Filter.pas y FMX.Defines.inc archivos de la carpeta $ (BDS) sourcefmx a la carpeta de su proyecto.
  2. En los archivos copiados en la carpeta de su proyecto, reemplace el código de archivo Filtrar por nombre y FiltrarClasePorNombre funciones con el siguiente código:
    function FilterByName(const AName: string): TFilter; 
    var
      i: Integer;
    begin
      Result := nil;
      if not GlobalUseHWEffects or (Filters = nil) then // <-- change this line
        Exit;
      for i := 0 to Filters.Count - 1 do
        if CompareText(TFilterClass(Filters.Objects[i]).FilterAttr.Name, AName) = 0
      then
      begin
        Result := TFilterClass(Filters.Objects[i]).Create;
        Exit;
      end;
    end;
    
    function FilterClassByName(const AName: string): TFilterClass; 
    var
      i: Integer;
    begin
      Result := nil;
      if not GlobalUseHWEffects or (Filters = nil) then // <-- change this line
        Exit;
      for i := 0 to Filters.Count - 1 do
        if CompareText(TFilterClass(Filters.Objects[i]).FilterAttr.Name, AName) = 0
        then
        begin
          Result := TFilterClass(Filters.Objects[i]);
          Exit;
        end;
    end;
  3. Agregar FMX.Filtro bloque en la sección USOS de su proyecto:
    program Project1;
    
    uses
      FMX.Forms,
      FMX.Types,
      FMX.Filter, // <-- add unit
      Unit1 in 'Unit1.pas' {Form1};

Después de tales modificaciones, sus aplicaciones se ejecutarán con éxito en Mac OS X sin HAL de hardware 3D; sin embargo, los efectos 3D no estarán disponibles para él.

Actualizado:
Esta técnica no es necesaria para la actualización 3 y posteriores de Rad Studio XE2.

Artículos de interés

Subir