SMF - Just Installed!
30 Ott 2011 - Utilizzare Unità esterneIntroduzione
Buongiorno, oggi vi insegnerò come utilizzare al meglio tutte le unità esterne, tra le quali mouse, stampante, scanner... Inizio a dirvi subito che gli esempi e i termini che si utilizzeranno durante la guida saranno fedeli al free-pascal. Ecco le librerie: Keyboard Tastiera (funzioni avanzate)/Joystick (qualsiasi tipo) Mouse Mouse/Tavola grafica Printer Stampante/Plotter // Unità memoria esterne (PenDrive,Disco,Floppy ecc.) Cercando con Google si possono trovare link per lo scaricamento di queste appartenenti alla rtl (run time library) Keyboard Ovviamente, appiamo bene che per input pascal, si utilizza read(X:String)/readln(X:String), ma per delle funzioni avanzate della tastiera, usare la libreria Keyboard é fondamentale. Molti di voi sicuramente saranno perplessi e si chiederanno cosa si potrebbe fare con queste funzioni AVANZATE, ed é per questo che descriverò subito la loro utilità:
Per inizializzare il driver della tastiera o joystick utilizzare la procedura InitKeyboard, per disattivarlo DoneKeyboard, entrambe senza parametri. La maggior parte delle costanti della libreria son tasti particolari: KbdF1 F1 KbdF2 F2 KbdF3 F3 KbdF4 F4 ecc. KbdAlt Alt KbdCtrl Crtl KbdApps Menù principale KbdDown Freccetta Giù KbdUp Freccietta Sù KbdRight Freccetta Destra KbdLeft Freccetta Sinistra KbdPgDN Pagina Giù KbdPgUP Pagina Su KbdHome Home KbdShift Shift KbdDelete Nascondi carattere KbdInsert Fai apparire carattere Per maggiori dettagli: http://www.freepascal.org/docs-html/rtl/keyboard/index.html Mouse Come dice la libreria stessa, mouse serve per utilizzare in modo perfetto il mouse. Inizio subito con un esempio di codice: Codice: [Seleziona]
Ecco le funzioni: Resetmouse Restetta il mouse, lo inizializza o lo chiude, da usare all’inizio e alla fine per il corretto funzionamento della prossima funzione. Setmousewindows In collaborazione con resetmouse da le coordinate di un rettangolo limite delle operazioni col mouse. GetmouseX/Y Mi sembra abbastanza ovvio guardando il codice: Restituisce la posizione del mouse rispetto all’asse X o Y. Il programma è molto incompleto anche se funzionante, mancano: Left/Rightpressed Restituisce true se premuto il tasto sinistro o destro (left/right) del mouse. Mouseinstalled: Restituisce true se installato un mouse. Per concludere, la tavola grafica è molto semplice da usare, basta registrare in memoria la posizione del click del mouse e subito dopo rispondere cambiando il colore di quel pixel o di quei pixel. Infatti la maggior parte delle tavole grafiche sono corrispondenti ai driver dei mouse. Per maggiori dettagli: Siamo giunti finalmente alla libreria più attesa, printer che permette di stampare da stampante (o plotter) testi in/output. Ecco come fare, in maniera molto semplice: Initprinter: Inizializza driver stampante o plotter; Assinglst: stampa testo (parametro); IsLstAvaiable: controlla se c’è un driver stampante o plotter installato; Nulla di più semplice, ma per dettagli: http:// http://www.freepascal.org/docs-html/rtl/printer/index-5.html Altro Una volta inserita un’unità esterna, essa sarà parte di quella interna quindi per aprire unità esterne, basta inserirle nel computer e aprirle con una directory normale. Parlando in termini di windows, però, c’è un cambiamento: Il prefisso “C:” cambia e diventa E: Per le SD card D: Per i compact disk (DVD RW) Z: Per le memory card F: Per le pendrive Sempre con windows, si può determinare un prefisso di unità esterna, aprendo “computer” o “risorse del computer” (a seconda delle versioni) e vedendo il nome dell’unità appena inserita seguito dal prefisso tra parentesi. Per altri sistemi operativi, ci sono altri modi sempre semplici. Vi auguro un buon uso di queste funzioni nei vostri futuri programmi. 28 Ott 2011 - Lavorare con le directoryCapita spesso che si debba lavorare con le directory e i loro contenuti. Lazarus/Free Pascal permette queste operazioni in maniera facile ed intuitiva. Segue un piccolo esempio di una Form con un Button (Nome=Button1) e una ListBox(Nome=ListBox1), quando si preme sul button1 il programma legge tutto il contenuto delle cartella in cui si trova l'eseguibile rinomina tutti i file (di 21 caratteri, estensioni comprese) in esso contenuti togliendo i primi 4 caratteri partendo da sinista. Segue l'esempio, spero possa essere utile a qualcuno. unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var Info : TSearchRec; Count : Longint; fecha, fecha2:Tdate; fechatmp, fechatmp2:longint; Spazio: int64; filename:string; PercIncrem: double; Percorso, NuovoNome: string; k: integer; begin Percorso:=Application.Location; //se volessi leggere un altra cartella dovrei scrivere: If FindFirst (NomeAltraDirectory + '*',faAnyFile and faDirectory,Info)=0 then If FindFirst ('*',faAnyFile and faDirectory,Info)=0 then begin Repeat With Info do begin if ((Name='.') OR (Name='..')) then begin end else begin If (Attr and faDirectory) = faDirectory then begin //è una dir e la ignoro end else begin Spazio:=size; //salvo la dimensione del file (non la uso ma è per far vedere che c'è la possibilità) if Length(name)=21 then begin NuovoNome:=RightStr(Name,Length(Name)-4); ListBox1.Items.Add(filename + ' --> ' + NuovoNome); RenameFile(filename, NuovoNome); end; end; end; end; Until FindNext(info)<>0; end; FindClose(Info); ShowMessage('Terminato'); end; end. 24 Ott 2011 - Realizzare programmi multilinguaQuante volte è capitato di dirsi, però ora che ho fatto il programma se lo rendessi multilingua potrei distribuirlo in numero maggiore! Bene questo tutorial spiega i passi per rendere il vostro software multilingua in maniera semplice e multipiattaforma. Tutto questo con l'ausilio dei file INi.
Bene per prima cosa necessitiamo di un file ini che chiameremo lingue.ini (nella stessa cartella dell'eseguibile), così strutturato.
[Lingue] ; in questa zona dichiaro le lingue che andrò ad implementare nel mio programmaNumero=2 Lingua1=italiano Lingua2=inglese [italiano] ;notare che italiano è tutto minuscolo per essere uguale alla lingua dichiarata sopra nella sezione Lingue ;per non creare problematiche di alcun tipo in sistemi operativi case-sensitive Lbl_Nome=Nome Lbl_Cognome=Cognome [inglese] Lbl_Nome=Name Lbl_Cognome=Surname
Come seconda cosa andiamo ad analizzare un po di codice Free Pascal per interagire con tale file INI. Creiamo un nuovo progetto con una form che si chiama Form1 e aggiungete tre componenti, una TComboBox e due TLabel. Ecco come sarà il sorgente
unit Unit1;
{ In fase di caricamento delle form inserisco nella combobox le possibili lingue inserite nel file ini}
{ Al cambiamento del contenuto della ComboBox cambio i valori delle label } Il codice è abbastanza semplice, è facile dedurne il funzionamento compilandolo. Se avete soluzioni migliori o alternative (ma sempre il più possibile multipiattaforma) mandatemeli tramite messaggio, io provvederò a pubblicarli. Esempio: www.lazaruspascal.it/esempi/Multilingua.zip 21 Ott 2011 - Codice di attivazioneCosa succede quando avete finito un software e volete distribuirlo, previa vostra autorizzazione? Questo How To vi viene incontro e vi spiega come io ho affrontato il problema. La soluzione a tale problema è composta di due parti, un codice php posizionato nel sito dal quale distribuisco il software e dal quale faccio fare l'attivazione del prodotto.
Quella che segue è la classe PHP che mi genera il mio codice di attivazione nel formato: XXXX-XXXX-XXXX-XXXX
[code] /* { ?> [/code]
Usare tale classe è molto molto semplice basta usare il codice (sempre in php): $OggettoSN = new Serial_Number; Dove $IdCod equivale all'inizializzatore da cui mi ricavo il mio codice di attivazione e $CodSer è il nostro tanto agognato codice di serie. Per rendere la nostra classe unica e diversa da questo codice di esempio basta cambiare i parametri numerici nella funzione PKV_GetKeyByte $KeyBytes[0]=$this->PKV_GetKeyByte($Seed, 24, 3, 200); Ora questa parte scritta in PHP crea un codice che comunico (tramite mail automatica) all'interessato. Ora toccherà al programma (scritto in Lazarus) elaborare questa informazione, e io ho scritto una libreria per fare questo: [code] unit MySerialNumber;
[/code] Quello che è importante è che i valori numerici della funzione PKV_GetKeyByte siano valorizzati in maniera identica con quelli del codice PHP KeyBytes[0] := PKV_GetKeyByte(Seed, 24, 3, 200);
Per poter sfruttare questa libreria bastano poche linee di codice in free pascal if length(Codice)=24 then {CODICE DI ATTIVAZIONE VALIDO} Dove la variabile Codice è valorizzata con il codice che precedentemente avevamo comunicato al nostro cliente. Bene questa è la soluzione che avevo usato io in uno dei miei progetti. Se avete altre soluzioni non esitate a comunicarmele e vedrò di pubblicarle. Avverto che pubblicherò solo soluzioni che possono essere multipiattaforma. 20 Ott 2011 - File INISpesso può capitare che all'avvio di un software si necessiti di caricarsi dei dati, per esempio i dati di connessione ad un DB. Per fare questo ci vengono in aiuto i comodissimi file INI.
Un file ini è un semplice file di testo che finisce con estensione ini, ed è strutturato per sezioni, facciamo l'esempio di aver la necessità di caricare i dati per la connessione al database e i dati di altre configurazioni (lingua, versione, email,...).
Il file ini incriminato dovrebbe essere così strutturato [ConnDB] Host=localhost Nick=pippo Pwd=pluto DBFile=c:\appoggio.s3db [Altro] Lingua=italiano Ver=1.0 Questo file va salvato in C:\ con il nome Config.ini per poter essere coerente con l'esempio successivo. Il programma che andrebbe a leggere questi dati dovrebbe essere così strutturato:
Program Project1; {$mode objfpc}{$H+} Uses Classes,SysUtils ,INIFiles {libreria per usare i file ini} ; Var INI:TINIFile; Nick,Pwd,Host,DBFile, Lingua,Versione:String; begin INI := TINIFile.Create('C:\Config.ini'); Nick := INI.ReadString('ConnDB','Nick',''); Pwd := INI.ReadString('ConnDB','Pwd',''); Host := INI.ReadString('ConnDB','Host','');DBFile := INI.ReadString('ConnDB','DBFile',''); Lingua := INI.ReadString('Altro','Lingua',''); Versione:= INI.ReadString('Altro','Ver',''); Ini.Free; // After we used ini file, we must call the Free method of object {Faccio qualcosa con questi dati} ... end. Come vedete è parecchio semplice usare i file ini nei propri progetti. Ovviamente non è il massimo lasciare in chiaro le password nei file ini, ma l'esempio sopra voleva essere semplice. In un prossimo how to spieghero come usare le funzioni crittografiche di Lazarus/Free Pascal, e con quelle nozioni capirete come ovviare al problema delle password in chiaro nei file INI. |