Italian community of Lazarus and Free Pascal

Programmazione => Mobile => Topic aperto da: Microges2000 - Dicembre 18, 2012, 09:10:27 am

Titolo: Trinomio Eclipse-Pascal-Android
Inserito da: Microges2000 - Dicembre 18, 2012, 09:10:27 am
Ciao ragazzi...

Allora ho provato ad usare il plug-in freepascal per eclipse come spiegato qui http://www.tuicool.com/articles/vqQfq2 (http://www.tuicool.com/articles/vqQfq2) ma, dato che uso l'ultima versione di Eclipse ho dovuto modificare leggermente il parser pba.exe in maniera da generare i file esatti (lo potete trovare qui www.biotecnicainstruments.com/File/Temp/(Pascal builder).zip (http://www.biotecnicainstruments.com/File/Temp/(Pascal builder).zip) è sia in sorgente che precompilato).
Comunque la generazione del file va bene ma non capisco come accedere ai controlli inseriti con il designer (sia che siano bottoni che altro).
Qualcuno ci vuole provare e, magari, darmi qualche dritta? Credo che questo binomio (Eclipse-FreePascal) sia il migliore fin'ora
Titolo: Re:Trinomio Eclipse-Pascal-Android
Inserito da: nomorelogic - Dicembre 18, 2012, 09:40:10 am
io non ci ho ancora messo mano ma penso proprio che a breve dovrò provare anche questa soluzione
Titolo: Re:Trinomio Eclipse-Pascal-Android
Inserito da: xinyiman - Dicembre 18, 2012, 10:47:58 am
diteci di piu' al riguardo  :)
Titolo: Re:Trinomio Eclipse-Pascal-Android
Inserito da: Microges2000 - Dicembre 18, 2012, 11:42:11 am
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

Codice: [Seleziona]
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

Codice: [Seleziona]
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?  ;)
Titolo: Re:Trinomio Eclipse-Pascal-Android
Inserito da: Microges2000 - Dicembre 20, 2012, 02:06:04 pm
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

Codice: [Seleziona]
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

Codice: [Seleziona]
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

Codice: [Seleziona]
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 è
Codice: [Seleziona]
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


Titolo: Re:Trinomio Eclipse-Pascal-Android
Inserito da: acquario73 - Dicembre 29, 2012, 09:01:29 am
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:
Codice: [Seleziona]
  MyActivity = class(AAActivity, AVView.InnerOnClickListener)
    ...
    procedure onClick(V: AVView); 
    ...
  end;

  Button1.setOnClickListener(Self);

oppure più in generale...

Codice: [Seleziona]
  TMyObject = class(JLObject, AVView.InnerOnClickListener)
    ...
    procedure onClick(V: AVView); 
    ...
  end;

  Button1.setOnClickListener(TMyObject.Create);
Titolo: Re:Trinomio Eclipse-Pascal-Android
Inserito da: Microges2000 - Gennaio 03, 2013, 02:36:56 pm
Ho capito cosa non funzionava.

Il problema era tra le opzioni di compilazione impostate nel precompilatore pascal pba.pas

Se date un'occhiata al codice noterete (circa alla fine) che tra le varie opzioni che passa a freepascal c'e' -XP basta cambiarlo in -Xd, ricompilare pba.pas  e tutto funziona a meraviglia.... ora comincio a divertirmi ;)

Titolo: Re:Trinomio Eclipse-Pascal-Android
Inserito da: nomorelogic - Gennaio 03, 2013, 02:54:39 pm
la cosa si fa veramente interessante :)

che ne diresti di postare un articolo sull'installazione ed un progettino da compilare?

Edit:
tienici comunque aggiornati
Titolo: Re:Trinomio Eclipse-Pascal-Android
Inserito da: Microges2000 - Gennaio 03, 2013, 04:43:40 pm
Vabbè si puo fare ma sto' ancora studiando. Comunque è da tenere d'occhio anche pascal4android (vedi mio post in questa sezione) che stà evolvendo molto bene... manca ancora l'UI Designer e poi un bel l'help e sarà perfetto