diteci di piu' al riguardo :)
Praticamente è un plug-in per Eclipse che permette di scrivere codice pascal invece del Java classico.
Se lo attivi (e lo metti in testa ai compilatori) verdrai che sarà presente una directory supplementare nel progetto chiamata pas e contenente i sorgenti pascal del progetto stesso.
Praticamente il sorgente classico Java
package com.example.test;
import com.prove.Test.R;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
verrà trasformato in
unit MainActivity;
{$mode delphi}
{$modeswitch unicodestrings}
{$namespace primo.Test}
interface
uses androidr14, Rjava;
type
MainActivity = class(AAActivity)
procedure onCreate(savedInstanceState: AOBundle); override;
function onCreateOptionsMenu(menu: AVMenu): jboolean; override;
end;
implementation
procedure MainActivity.onCreate(savedInstanceState: AOBundle);
begin
inherited onCreate(savedInstanceState);
setContentView(R.layout.me);
end;
function MainActivity.onCreateOptionsMenu(menu: AVMenu): jboolean;
begin
getMenuInflater().inflate(R.menu.me, menu);
Result := True;
end;
end.
Più semplice per noi no? ;)
Allora sto' andando avanti negli "studi" (cavolo senza documentazione è un casino). Comunque sono arrivato a poter adoperare i componenti messi sulla form principale (pardon attività principale in android)
Praticamente ho messo un bottone sulla form principale chiamato button1 ed ho inserito 3 stringhe (sempre in maniera visuale) chiamate:
titolo_main -> 'Questo è il titolo della finestra principale'
id_premuto -> 'Bottone premuto'
id_rilasciato -> 'Bottone rilasciato'
vabbè comunque onCreate dell'attività principale diventa
procedure MainActivity.onCreate(savedInstanceState: AOBundle);
begin
inherited onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Metto il titolo alla finestra
SetTitle(R.Strings.titolo_main);
// Prendo il bottone chiamato button1
Bottone := AWButton(findViewById(R.id.button1));
// Cambio il caption del bottone
Bottone.Settext(R.Strings.id_rilasciato);
end;
dove Button1 è una variabile della classe MainActivity di tipo AWButton (qui' aiuta il file android14.inc).
Quindi riesco tranquillamente a modificare i vari controlli
Ora ho la necessità di risponere all'evento onclick e qui' iniziano i casini.... sulla documentazione android una risposta si ha generando una procedura chiamata onClick sull'evento OnClickListener, girovagando sul file android14.inc ho trovato questa dichiarazione inglobata nella classe AVView che è la classe genitore di tutti i controlli visuali
InnerOnClickListener = interface external 'android.view' name 'OnClickListener'
procedure onClick(para1: AVView); overload;
end;
qundi ho dichiarato, all'interno dell'oggetto MainActivity un tipo derivante da InneronClickListner
TClicca = class (AVView.InnerOnClickListener)
public
Procedure onClick(para1: AVView); Overload;
end;
ho scritto la procedura OnClick in maniera da cambiare il testo al bottone, hoi dichiarato una variabile di tipo TClicca ed ho settato 'OnClickListener del bottone al mio ogggetto ma non succede nulla sul click.
Il codice completo è
unit MainActivity;
{$mode delphi}
{$modeswitch unicodestrings}
{$namespace com.example.test}
interface
uses androidr14, Rjava;
type
MainActivity = class(AAActivity)
Type
TClicca = class (AVView.InnerOnClickListener)
public
Procedure onClick(para1: AVView); Overload;
end;
Var
Clicca : TClicca;
Bottone : AWButton;
public
procedure onCreate(savedInstanceState: AOBundle); Override;
function onCreateOptionsMenu(menu: AVMenu): boolean; Override;
end;
implementation
procedure MainActivity.onCreate(savedInstanceState: AOBundle);
begin
inherited onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SetTitle(R.Strings.titolo_main);
Bottone := AWButton(findViewById(R.id.button1));
Bottone.Settext(R.Strings.id_rilasciato);
Bottone.setOnClickListener(Clicca);
end;
function MainActivity.onCreateOptionsMenu(menu: AVMenu): boolean;
begin
getMenuInflater().inflate(R.menu.activity_main, menu);
Result := True;
end;
procedure MainActivity.TClicca.OnClick(para1: AVView);
Begin
Bottone.SetText(R.Strings.id_premuto);
End;
end.
sinceramente non capisco dove possa essere l'errore dato che la compilazione va a buon fine e l'esecuzione non si incasina con errori vari.
Quanche anima pia mi puo' aiutare? Dai su che se si risolve questo il trinomio Eclipse-FreePascal-Android è praticamente fatto e saremmo i primi a scrivere qualcosa a riguardo
Wow! Ho trovato un altro avventore del famigerato compilatore pascal/java!!
L'ho scoperto anch'io da due giorni, e da due giorni mi sta facendo diventare matto.
Anch'io ho seguito tutto l'iter per la compilazione fpc-jvm, anch'io ho effettuato qualche modifica al pba, ecc
Premetto: ho scaricato i sorgenti dell'ultimo fpc e seguito le indicazioni per compilare l'ultimo grido del compilatore java, la build non va a buon fine, non compila nemmeno System.
Allora ho utilizzato i precompilati (da http://wiki.freepascal.org/FPC_JVM). Sembra funzionare qualcosa ma poi alla prima definizione di interfaccia (OnClickListener) per catturare un click va in crash.
Per trovare qualcosa che funziona son dovuto ricorrere al progetto di un tizio cinese (Pascal4Android) che ha impacchettato il tutto in una minimale ma funzionale IDE. Utilizza una versione di ppcjvm.exe precedente che però pare funzionare molto meglio.
La definizione corretta di un evento è questa se vuoi agganciarla all'attività corrente:
MyActivity = class(AAActivity, AVView.InnerOnClickListener)
...
procedure onClick(V: AVView);
...
end;
Button1.setOnClickListener(Self);
oppure più in generale...
TMyObject = class(JLObject, AVView.InnerOnClickListener)
...
procedure onClick(V: AVView);
...
end;
Button1.setOnClickListener(TMyObject.Create);