Public Class Form1 Dim fileName As String Dim fileName2 As String Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _ (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim T As New Threading.Thread(AddressOf MioThread) T.Start() End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click fileName = "C:\suoni\alba.wav" mciSendString("open " & fileName & " type mpegvideo alias SecondSound", String.Empty, 0, 0) mciSendString("play SecondSound", String.Empty, 0, 0) Threading.Thread.Sleep(100) End Sub Sub MioThread() fileName2 = "C:\suoni\fanculo.mp3" mciSendString("open " & fileName2 & " type mpegvideo alias FirstSound", String.Empty, 0, 0) mciSendString("play FirstSound", String.Empty, 0, 0) Threading.Thread.Sleep(100) End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load End Sub End Class
Gioco a programmare
Miei appunti liberi, senza pretesa di dire necessariamente sempre cose giuste o sensate, durante l'apprendimento e la pratica della programmazione
JavascriptProva
martedì 8 gennaio 2019
Due suoni contemporaneamente
Un problema di thread che non era di thread: files sonori di sottofondo
Creo il codice del thread:
Alla fine ho risolto il problema. I thread non c'entrano nulla, in questo caso:
Sub MioThread() My.Computer.Audio.Play("C:\suoni\accord.wav", AudioPlayMode.BackgroundLoop) End Sube gli faccio eseguire il codice del suonare la musica di sottofondo.
Alla fine ho risolto il problema. I thread non c'entrano nulla, in questo caso:
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click My.Computer.Audio.Play("C:\suoni\accord.wav", AudioPlayMode.BackgroundLoop) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If DirectCast(sender, Button).Text <> "PUGNO" Then DirectCast(sender, Button).Text = "PUGNO" Else DirectCast(sender, Button).Text = "SCORREGGIA" End If End Sub End Class
venerdì 23 novembre 2018
Aggiustamenti del foglio Excel dopo avervi incollato la tabella di Word
Una volta incollata la tabella da Word, si fanno due tipi di aggiustamenti:
Ora bisogna ridurre tutte le celle-firma.
Semplificando il risultato della registrazione della macro, dovrebbe restare questo:
In fondo, sono solo tre!
Sì, funzionano alla grande!
- il testo, che non va più messo a capo
- le celle, che vanno espanse a seconda del testo contenuto.
Sub aggiustamentipostincollaggio() ' ' aggiustamentipostincollaggio Macro ' Macro registrata il 24/11/2018 da Windows User ' ' Columns("D:D").Select With Selection .WrapText = False .Orientation = 0 .AddIndent = False .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Columns("D:D").EntireColumn.AutoFit End Sub
Ora bisogna ridurre tutte le celle-firma.
Semplificando il risultato della registrazione della macro, dovrebbe restare questo:
Sub formattacellefirma() ' ' formattacellefirma Macro ' Macro registrata il 24/11/2018 da Windows User ' ' Columns("E:AH").Select Selection.ColumnWidth = 2.43 End SubOra provo tutte le funzioni da capo.
In fondo, sono solo tre!
Sì, funzionano alla grande!
Impostiamo la pagina per copiare la tabella su Excel
Vado su Excel.
Incollo tutta la tabella di sana pianta.
Incollo tutta la tabella di sana pianta.
Sub impostapagina() ' ' impostapagina Macro ' Macro registrata il 24/11/2018 da Windows User ' ' With ActiveSheet.PageSetup .PrintTitleRows = "" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = "" With ActiveSheet.PageSetup .LeftHeader = "" .CenterHeader = "" .RightHeader = "" .LeftFooter = "" .CenterFooter = "" .RightFooter = "" .LeftMargin = Application.InchesToPoints(0.787401575) .RightMargin = Application.InchesToPoints(0.787401575) .TopMargin = Application.InchesToPoints(0.984251969) .BottomMargin = Application.InchesToPoints(0.984251969) .HeaderMargin = Application.InchesToPoints(0.5) .FooterMargin = Application.InchesToPoints(0.5) .PrintHeadings = False .PrintGridlines = False .PrintComments = xlPrintNoComments .CenterHorizontally = False .CenterVertically = False .Orientation = xlLandscape .Draft = False .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = False .FitToPagesWide = 1 .FitToPagesTall = 1 .PrintErrors = xlPrintErrorsDisplayed End With End SubUna quantità enorme di informazioni quando sarebbe sufficiente soltanto la parte marcata in rosso...
giovedì 22 novembre 2018
Codice delle macro per l'inserimento di tabelle in Word (Word 2003)
Ecco: questa la devo fare in tempi rapidi.
Creare una tabella di 35 colonne e 31 righe.
Questo comando dà al foglio un orientamento orizzontale.
Comunque il foglio mi serve Landscape.
Ora tracciamo la tabella tutta a celle uguali. Ne inizio la registrazione cercando di ricordare le modalità applicate prima a causa del "mouse invalido" che si crea durante la registrazione delle macro...
Ecco tutta la macro:
Ecco, ho individuato un codice minimo che aggiunge una tabella a un foglio:
Rivedo il codice completo:
Mi pare che avevo scelto "Adatta alla pagina", ma adesso ci vado in modo sistematico: andiamo con queste impostazioni di default:
Ora modifico la seconda voce: scelgo "Adatta al contenuto":
Schiacciando "Griglia tabella" si apre questa finestra:
...nella quale sono comprese queste istruzioni:
Creare una tabella di 35 colonne e 31 righe.
Questo comando dà al foglio un orientamento orizzontale.
ActiveDocument.PageSetup.Orientation = wdOrientLandscapee ho trovato anche l'inverso, quello che lo riporta verticale:
ActiveDocument.PageSetup.Orientation = wdOrientPortrait.
Comunque il foglio mi serve Landscape.
Ora tracciamo la tabella tutta a celle uguali. Ne inizio la registrazione cercando di ricordare le modalità applicate prima a causa del "mouse invalido" che si crea durante la registrazione delle macro...
Ecco tutta la macro:
Sub tabella() ' ' tabella Macro ' Macro registrata il 23/11/2018 da Windows User ' ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=31, NumColumns _ :=35, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _ wdAutoFitWindow With Selection.Tables(1) If .Style <> "Griglia tabella" Then .Style = "Griglia tabella" End If .ApplyStyleHeadingRows = True .ApplyStyleLastRow = True .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = True End With End SubCominciamo a spezzettarla...
Ecco, ho individuato un codice minimo che aggiunge una tabella a un foglio:
Sub tabella() ' ' tabella Macro ' Macro registrata il 23/11/2018 da Windows User ' ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=31, NumColumns _ :=35, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _ wdAutoFitWindow End SubDevo vedere cosa significa DefaultTableBehavior...
Rivedo il codice completo:
Sub tabella() ' ' tabella Macro ' Macro registrata il 23/11/2018 da Windows User ' ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=31, NumColumns _ :=35, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _ wdAutoFitWindow With Selection.Tables(1) If .Style <> "Griglia tabella" Then .Style = "Griglia tabella" End If .ApplyStyleHeadingRows = True .ApplyStyleLastRow = True .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = True End With End SubVediamo il form per la creazione della tabella dove c'è la scelta fra varie opzioni, alle quali sicuramente si riferisce gran parte del codice "non essenziale".
Mi pare che avevo scelto "Adatta alla pagina", ma adesso ci vado in modo sistematico: andiamo con queste impostazioni di default:
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _ 5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _ wdAutoFitFixed With Selection.Tables(1) If .Style <> "Griglia tabella" Then .Style = "Griglia tabella" End If .ApplyStyleHeadingRows = True .ApplyStyleLastRow = True .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = True End WithOra modifico "Larghezza fissa colonne" che porto da "Auto" a 1.5:
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _
5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed
With Selection.Tables(1)
.Columns.PreferredWidth = CentimetersToPoints(1.5)
If .Style <> "Griglia tabella" Then
.Style = "Griglia tabella"
End If
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = True
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = True
End With
Ora modifico la seconda voce: scelgo "Adatta al contenuto":
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _
5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitContent
With Selection.Tables(1)
If .Style <> "Griglia tabella" Then
.Style = "Griglia tabella"
End If
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = True
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = True
End With
Mentre in quelle precedenti era:
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _
5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed
Scegliendo l'opzione "Adatta alla pagina":
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _
5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitWindow
With Selection.Tables(1)
If .Style <> "Griglia tabella" Then
.Style = "Griglia tabella"
End If
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = True
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = True
End With
Ecco.
Schiacciando "Griglia tabella" si apre questa finestra:
...nella quale sono comprese queste istruzioni:
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _
5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed
With Selection.Tables(1)
If .Style <> "Tabella a colori 1" Then
.Style = "Tabella a colori 1"
End If
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = True
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = True
End With
Ormai è quasi tutto chiaro.
venerdì 9 novembre 2018
Salvataggio floatingView e removeView (immagini in overlay)
Le strade si dividono: da una parte, l'apprendimento teorico di tutto il sistema delle floatingViews, dall'altra le modifiche funzionali alla mia applicazione N-S.
Salvo la MainActivity, notevole specialmente per il "trucchetto" che evita di dover riavviare l'applicazione dopo i permessi a runtime:
Salvo il codice dello studio teorico:
Salvo i due xml che vengono "inflatati" per la floatingView e per la removeView:
floatingVIew:
removeView:
Salvo la MainActivity, notevole specialmente per il "trucchetto" che evita di dover riavviare l'applicazione dopo i permessi a runtime:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Runnable runnable = new Runnable() { @RequiresApi(api = Build.VERSION_CODES.M) @Override public void run() { if(Settings.canDrawOverlays(getApplicationContext())){ Intent i = new Intent(getApplicationContext(),MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(i); }else{ new Handler().postDelayed(this,1000); } } }; if(Build.VERSION.SDK_INT >= 23 ){ if(!Settings.canDrawOverlays(getApplicationContext())){ Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName())); startActivity(i); new Handler().postDelayed(runnable,1000); } } Intent intent=new Intent(getApplicationContext(),Servizio.class); startService(intent); } }
Salvo il codice dello studio teorico:
public class Servizio extends Service { int x_init_coord, y_init_coord, x_margin, y_margin; long time_start, time_end; private View mFloatingView; private View removeView; private WindowManager windowManager; private WindowManager.LayoutParams wParams; public Servizio() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); addFloatingWidgetView(); addRemoveWidgetView(); } private void addFloatingWidgetView() { mFloatingView = LayoutInflater.from(this).inflate(R.layout.widget, null); wParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ); wParams.gravity = Gravity.TOP | Gravity.LEFT; wParams.x = 0; wParams.y = 100; windowManager.addView(mFloatingView, wParams); mFloatingView.setOnTouchListener(new View.OnTouchListener() { int x_init_coord, y_init_coord; int x_margin, y_margin; @Override public boolean onTouch(View view, MotionEvent event) { WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) mFloatingView.getLayoutParams(); int x_coord = (int) event.getRawX(); int y_coord = (int) event.getRawY(); switch(event.getAction()){ case MotionEvent.ACTION_DOWN: time_start = System.currentTimeMillis(); x_margin = layoutParams.x; y_margin = layoutParams.y; x_init_coord = x_coord; y_init_coord = y_coord; return true; case MotionEvent.ACTION_MOVE: int x_diff = x_coord - x_init_coord; int y_diff = y_coord - y_init_coord; int x_destination = x_margin + x_diff; int y_destination = y_margin + y_diff; layoutParams.x = x_destination; layoutParams.y = y_destination; windowManager.updateViewLayout(view,layoutParams); return true; case MotionEvent.ACTION_UP: int x_diff_up = x_coord - x_init_coord; int y_diff_up = y_coord - y_init_coord; if(Math.abs(x_diff_up) < 5 && Math.abs(y_diff_up) < 5){ time_end = System.currentTimeMillis(); if(time_end - time_start < 300){ System.out.println("E' UN CLICK"); } } } return false; } }); } private void addRemoveWidgetView(){ LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); removeView = inflater.inflate(R.layout.removewidget,null); WindowManager.LayoutParams removeParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ); removeParams.gravity = Gravity.TOP | Gravity.LEFT; windowManager.addView(removeView,removeParams); } }
Salvo i due xml che vengono "inflatati" per la floatingView e per la removeView:
floatingVIew:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content"> <!--Root container--> <RelativeLayout android:id="@+id/root_container" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:ignore="UselessParent"> <ImageView android:adjustViewBounds="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src = "@drawable/facciadascemo"/> </RelativeLayout> </FrameLayout>
removeView:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content"> <!--Root container--> <RelativeLayout android:id="@+id/root_container" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:ignore="UselessParent"> <ImageView android:adjustViewBounds="true" android:layout_width="50dp" android:layout_height="50dp" android:src = "@drawable/removeimage"/> </RelativeLayout> </FrameLayout>
giovedì 8 novembre 2018
Codice essenziale per una floating image in overlay in android
Ecco ricostruito il codice per muovere una floating image in overlay:
mFloatingView.setOnTouchListener(new View.OnTouchListener() { int x_init_coord, y_init_coord; int x_margin, y_margin; @Override public boolean onTouch(View view, MotionEvent event) { WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) mFloatingView.getLayoutParams(); int x_coord = (int) event.getRawX(); int y_coord = (int) event.getRawY(); switch(event.getAction()){ case MotionEvent.ACTION_DOWN: x_margin = layoutParams.x; y_margin = layoutParams.y; x_init_coord = x_coord; y_init_coord = y_coord; return true; case MotionEvent.ACTION_MOVE: int x_diff = x_coord - x_init_coord; int y_diff = y_coord - y_init_coord; int x_destination = x_margin + x_diff; int y_destination = y_margin + y_diff; layoutParams.x = x_destination; layoutParams.y = y_destination; windowManager.updateViewLayout(view,layoutParams); return true; } return false; } });
Iscriviti a:
Post (Atom)