JavascriptProva

mercoledì 24 ottobre 2018

Lettura delle tabelle di un database come recordset per mezzo delle librerie DAO da VB.NET

Ecco, anche l'apertura dei recordset e la loro rappresentazione presenta qualche differenza. I codici con il punto esclamativo non mi hanno funzionato.
E' comunque possibile fare ugualmente:
    Private Sub apri()
        Dim engine As DBEngine = New DBEngine
        Dim db As Database
        db = engine.OpenDatabase("C:\users\antonello\documents\anto.mdb")
        Dim rs As Recordset = db.OpenRecordset("pazienti")
        rs.MoveFirst()
        Do While Not rs.EOF

            MsgBox(rs.Fields("nome").Value)
            rs.MoveNext()
        Loop
    End Sub

Creazione di un database a runtime con le librerie DAO

Un bel ripasso dei database gestiti con le librerie DAO in VB.NET.
C'è qualche differenza con la sintassi che conoscevo dall'antico VB6, ma niente di insuperabile, almeno finora:
Imports DAO

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim engine = New DBEngine
        Dim db As Database
        db = engine.OpenDatabase("C:\users\antonello\bikongo.mdb")
        Dim tabella As TableDef = db.CreateTableDef("Tabella1")


        tabella.Fields.Append(tabella.CreateField("id", DAO.DataTypeEnum.dbInteger))
        tabella.Fields.Append(tabella.CreateField("nome", DAO.DataTypeEnum.dbText))
        tabella.Fields.Append(tabella.CreateField("cognome", DAO.DataTypeEnum.dbText))
        db.TableDefs.Append(tabella)

    End Sub
End Class
Questa è la creazione di una tabella con tre campi, uno numerico e due di testo.

lunedì 22 ottobre 2018

Creazione di una custom view in Android

Costruzione di una customview in android.
L'avevo vista e capita, e poi ho scordato praticamente tutto.

Ho un file xml che ho chiamato my_view.xml, e un file java che ho chiamato myView.java.
Analizziamo questo file.
public class MyView extends RelativeLayout {
    TextView testo1;
    TextView testo2;
    public MyView(Context context) {
        super(context);
        initView(context);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);

        initView(context);
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        initView(context);
    }

    private void initView(Context context){
        inflate(context,R.layout.my_view,this);

    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        testo1=(TextView)findViewById(R.id.testo1);
        testo2=(TextView)findViewById(R.id.testo2);
        this.setBackgroundColor(Color.CYAN);
    }

    public void saluta(){
        testo1.setText("BUONGIORNO");
        testo2.setText("BUONASERA");
    }
}
Le variaabili dichiarate a livello di classe sono due variabili oggetto per le due TextView che saranno contenute nella view, ossia testo1 e testo2.
public class MyView extends RelativeLayout {
    TextView testo1;
    TextView testo2;
Quindi vengono chiamati tutti i costruttori della classe genitore RelativeLayout.
    public MyView(Context context) {
        super(context);
        initView(context);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);

        initView(context);
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        initView(context);
    }
In tutti e tre i costruttori viene chiamato il metodo initView.

Il metodo initView è questo:
    private void initView(Context context){
        inflate(context,R.layout.my_view,this);

    }
in pratice quello che "inflata" il layout specificato in xml entro questo oggetto.
Quindi c'è onFinishInflate, che dovrebbe essere il metodo che entra in azione una volta che l'"inflatazione" sia terminata, in modo che alle variabili oggetto vengano attribuite le views presenti nell'xml.

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        testo1=(TextView)findViewById(R.id.testo1);
        testo2=(TextView)findViewById(R.id.testo2);
        this.setBackgroundColor(Color.CYAN);
    }

Una volta terminata l'inflatazione, si possono creare i metodi, come appunto questo:
    public void saluta(){
        testo1.setText("BUONGIORNO");
        testo2.setText("BUONASERA");
    }
Il file xml è così:
<?xml version="1.0" encoding="utf-8"?>
<merge
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/testo1"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="100dp"
        android:layout_marginStart="100dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/testo2"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="150dp"
        android:layout_marginStart="100dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</merge> 

Il tutto va poi inserito in un'applicazione:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.example.antonello.studiocustomview.MyView
        android:id="@+id/myView"
        android:layout_width="200dp"
        android:layout_height="200dp" />



</RelativeLayout> 
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyView myView = (MyView)findViewById(R.id.myView);
        myView.saluta();
    }
}
Ecco, adesso credo di aver rinfrescato a sufficienza il modo di creare delle CustomViews.