PDA

Ver la Versión Completa : Error al ejecutar aplicación en MacBook


defcon1_es
30-08-2012, 19:06:10
Hola a tod@s.
Casi que debería haber titulado el post como "Mis peripecias con Delphi XE2 + Firemonkey + XCode y la madre que los parió..."

Os cuento:

Estoy desarrollando una aplicación Firemonkey con la idea de que funcione en un iPad.
Para ello dispongo de Rad Studio XE2 (con la última actualización Update 4 HotFix 1) y
de un MacBook Pro (de segunda mano comprado en USA) con OS X 10.6.8 (Snow Leopard) y Xcode 3.2.6.

Asigno el perfil remoto en Delphi XE2 para la plataforma OSX para enviarlo al MacBook y va perfecto,
se muestran las fichas de los clientes (de una BD Sqlite usando un driver dbexpress para sqlite (http://www.devart.com/dbx/sqlite/)), puedo hacer pedidos, y todo para lo que está pensada la aplicación,
pero si ejecuto directamente el App que Delphi XE2 deja en el MacBook,
lo primero que me aparece es un mensaje en una ventana indicando el error "Exception in safecall method", pulso OK y me aparece mi formulario principal.
En cuanto pulso cualquier otro botón, da igual si tiene evento OnClick o no, me vuelve a salir la ventana con el error anterior y pulsando repetidas veces el botón OK,
se cierra el programa.

También he intentado compilar el proyecto con XCode, preparándolo con el ejecutable dpr2xcode.exe, y me sale el error:

Free Pascal Compiler version 2.6.0 [2012/08/29] for i386
Copyright (c) 1993-2011 by Florian Klaempfl and others
Target OS: Darwin/iPhoneSim for i386
Compiling /Users/User/Documents/DelphiXE2/../iPADTest.pas
Fatal: Can't open file "iPADTest.pas"
Fatal: Compilation aborted
Command /bin/sh failed with exit code 1

Bien, pues revisando el fichero .sh que (creo que) genera Delphi en el Mac, veo lo siguiente:
-XR$SDKROOT -FD$PLATFORM_DEVELOPER_BIN_DIR "$PROJECT_DIR/../$PROJECT.pas"
y pienso ¿por qué se pone /../?, y me voy a la opción del menú Xcode "Project / New Build Phase / New Run Script Build Phase",
y copio y pego el contenido del fichero .sh modificando "$PROJECT_DIR/../$PROJECT.pas" por "$PROJECT_DIR/$PROJECT.pas",
y ahora me salen un montón de mensajes de compilación, indicando que compila todas los .pas de firemonkey...
-casi me caigo de la silla de la emoción-

pero al final dió otro error...
"Compiling Principal.pas"
"Principal.pas(6,9) Error: Duplicate identifier "SYSTEM""

y pienso: -lo mismo es que hay que quitarle System. al código fuente en los uses-

lo corrijo eliminando System. de ese fichero .pas y luego dió otro error...

"Compiling ListaClientes.pas"
"Fatal: Can't find unit FMX used by unit ListaClientes"

joder... -pienso yo- ahora no me encuentra la unit FMX... un momento, ¿la unit FMX?, pero si he visto como compilaba los pas de Firemonkey !!!

Pues, si, los compila, pero se llaman FMX_Types.pas, FMX_Colors.pas, etc.

En principio si sustituyo FMX. por FMX_ (añadiendo la directiva de compilación {$IFDEF FPC} en cada caso,
debería compilar el proyecto con el XCode, pero ¿qué pasa con las demás units como Data.DB, Data.Bind.Scope, etc.?


Se agradece cualquier comentario/experiencia al respecto.

defcon1_es
31-08-2012, 13:06:16
Buscando en google, he visto más gente que le pasa lo mismo:

http://community.freepascal.org:8080/bboards/message?message_id=703396&forum_id=24111

https://forums.embarcadero.com/message.jspa?messageID=460283

defcon1_es
05-09-2012, 18:45:05
Pues resulta que para XCode sólo existen los .pas de Firemonkey, pero de dbexpress, nada de nada.

Así que si quieres crear una aplicación para iPad con Delphi XE2 + FireMonkey, puedes olvidarte de usar:

- dbexpress
- livebindings (no estoy seguro al 100%)
- DataSnap (no estoy seguro al 100%)

y de cualquier otro componente que no esté disponible para Free Pascal.

Voy a tener que hacer toda la presentación de los datos "a mano",
creando una instancia de la clase "TSQLite" (definida en SQLite3db.pas de Free Pascal)
y realizar la carga de los datos (sentencias SELECT) tal que así:

procedure TForm1.CargarDatos;
{$IFDEF FPC}
var SQL, Row: String;
DB: TSQLite;
SL: Classes.TStringList;
NewItem: TListBoxItem;
{$ENDIF}
begin
{$IFDEF FPC}
DB := TSQLite.Create(Varios.DBFileName); // Get the records back and list them in the memo
SL := Classes.TStringList.Create;
SQL := 'select * from basedatos';
DB.Query(SQL, SL);
// Eliminar el nombre de las columnas (primera fila)
SL.Delete(0);
for Row in SL do
begin
NewItem := TListBoxItem.Create(FishList);
NewItem.Text := UnQuoteStr(Row, '"');
NewItem.Font.Family := 'Arial';
NewItem.Font.Size := 24;
FishList.AddObject(NewItem);
end;
SL.Free;
DB.Free;
{$ENDIF}
end;


Ejemplo: http://www.youtube.com/watch?v=77HYR3m1cig&feature=relmfu

PD:Espero que esto oriente a todo aquel que tenga pensado hacer aplicaciones para iPad/iPhone con Delphi XE2 + FireMonkey + SQLIte