Written by xinyimanposted in Lazarus 1.0 Novembre 07, 2011, 12:11:00 pm19525 ViewsRating: 0 (0 Rates)Print
Non vi è mai capitato di dover usare dei menù nei vostri programmi? Se la risposta è si allora sappiate che è possibile tabellare i menù (con le dovute premure) e visualizzare tali menù in una TTreeview in maniere tale da rendere il programma pulito ed efficente.
Per prima cosa vediamo il codice d'esempio che potete trovare in versione integrale all'indirizzo: www.lazaruspascal.it/esempi/MenuTabellato.zip
function TForm1.InserisciNodiFigli(NodoPadre: integer): boolean;
var
MyQuery2: TZQuery;
app: TTreeNode;
begin
if NodoPadre>1 then
app:=TreeView1.Items.GetLastSubNode;
MyQuery2:=TZQuery.Create(nil);
MyQuery2.Connection:=MyConn;
MyQuery2.SQL.Text:='select * FROM T_Menu WHERE NodoPadre=' + IntToStr(NodoPadre) + ' order by Posizione ASC;';
MyQuery2.Open;
if not MyQuery2.EOF then
begin
MyQuery2.First;
while not MyQuery2.EOF do
begin
if NodoPadre=0 then
begin
TreeView1.Items.Add(nil, MyQuery2.FieldByName('Descrizione').Text);
end
else if NodoPadre=1 then
begin
TreeView1.Items.AddChild(TreeView1.Items.GetLastNode, MyQuery2.FieldByName('Descrizione').Text);
end
else
begin
TreeView1.Items.AddChild(app , MyQuery2.FieldByName('Descrizione').Text);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MyConn.Disconnect;
end;
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
MyQuery.SQL.Text:='select NumTab FROM T_Menu WHERE Descrizione="' + StringReplace(TreeView1.Selected.Text,'''','''''', [rfReplaceAll]) + '";';
MyQuery.Open;
if not MyQuery.EOF then
begin
MyQuery.First;
PageControl1.TabIndex:=MyQuery.FieldByName('NumTab').AsInteger;
end;
MyQuery.Close;
end;
end.
Come potete notare la funzione ricorsiva InserisciNodiFigli crea il menù popolato con i dati tabellati, e nell'esempio che abbiamo appena visto i dati sono così espressi
Descrizione
NodoPadre
Posizione
NumTab
Clienti
0
1
0
Inserisci
1
2
0
Modifica
1
3
0
Ins1
3
4
1
Ins2
3
5
1
Elimina
1
6
2
Magazzino
0
7
0
Quello che bisogna capire è che il NodoPadre deve essere zero per tutte le righe che devono comparire come voci primarie del menù, mentre il campo Posizione identifica l'ordine assoluto con il quale vengono inseriti nel menù, quindi non ci devono essere voci duplicate e i valori devono essere incrementali da 1 a N.
Per capire meglio vi consiglio di scaricare l'esempio e analizzarlo, è più facile da farlo che dirlo. Buona programmazione.
Written by xinyimanposted in Lazarus 1.0 Novembre 02, 2011, 10:27:00 am19266 ViewsRating: 0 (0 Rates)Print
A volte può nascere l'esigenza di creare dei menù laterali, e il modo più semplice per crearli è attraverso l'oggetto TTreeView che contiene una struttura ad albero, segue un esempio e al fondo trovate il link all'esempio da scaricarvi per analizzarlo e giocarci.
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
s: string;
begin
// if there is no nodes, create a root node with a parent of Nil
if TreeView1.Items.Count = 0 then
begin
Treeview1.Items.Add (nil,'Root Node');
exit;
end;
// Set up a simple text for each new node - Node1 , Node2 etc
i := treeview1.Items.Count;
s := 'Node ' + inttostr(i);
//Add a new node to the currently selected node
if TreeView1.Selected <> nil then
Treeview1.Items.AddChild(Treeview1.Selected ,s);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if TreeView1.Selected = nil then exit;
//If selected node has child nodes, first ask for confirmation
If treeview1.Selected.HasChildren then
if messagedlg('Delete node and all children ?',mtConfirmation,
[mbYes,mbNo],0) <> mrYes then exit;
DeleteNode(TreeView1.Selected);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ShowMessage(TreeView1.Selected.GetTextPath);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
ShowMessage(TreeView1.Selected.Text);
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
ShowMessage('Indice assoluto: ' + IntToStr(TreeView1.Selected.AbsoluteIndex));
end;
//A procedure to recursively delete nodes
Procedure TForm1.DeleteNode(Node:TTreeNode);
begin
while Node.HasChildren do DeleteNode(node.GetLastChild);
TreeView1.Items.Delete(Node) ;
end;
Written by Loryeaposted in Lazarus 1.0 Ottobre 30, 2011, 09:27:00 pm20439 ViewsRating: 0 (0 Rates)Print
Introduzione 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.
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à:
Utilizzare tasti particolari (come F12 o pag. su o up (freccietta) senza l'utilizzo delle direttive
Utilizzare un qualsiasi tipo di joystick
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
Program EsmpioMouse; Uses Graph,Mouse; Var X,Y:integer;
Begin Gd:=detect; InitGraph(Gd,Gm,’C//:FPC’); RestetMouse; SetMouseWindow(0,0,1000,1000); {Ecco un bottone} Rectangle(0,0,100,100); {Diamogli il valore di bottone per il mouse} X:=GetmouseX; Y:=GetmouseY; If ((X>0) and (Y>0) and (X<100) and (Y<100) then Write(Fine programma); Readln; Resetmouse; End.
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;
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.
Written by xinyimanposted in Lazarus 1.0 Ottobre 28, 2011, 09:16:00 am19878 ViewsRating: 0 (0 Rates)Print
Capita 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.
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à)
filename:=Percorso + Name;
if Length(name)=21 then
begin
NuovoNome:=RightStr(Name,Length(Name)-4);
Premessa: molto semplicemente si può immaginare la
memoria come un insieme di celle di vari tipi, che rappresentano le
variabili, ed ognuna di queste celle per essere raggiunta deve avere
un indirizzo che rappresenta la sua posizione all'interno della
memoria. Una volta capito questo concetto si può capire che un
puntatore è semplicemente una variabile che contiene l'indirizzo di
un altra variabile. Questo rende i puntatori uno strumento molto
potente, ma anche molto pericoloso, perché se si commettono errori è
possibile modificare aree di memoria che non volevamo toccare. Per
dichiarare un puntatore è buona norma farlo tramite il costrutto
type che abbiamo già visto precedentemente (in un altro articolo). Facciamo un esempio:
type
PuntatoreAdIntero=^integer;
var
Puntatore:
PuntatoreAdIntero;
oppure si può banalmene scrivere
var
Puntatore:^integer;
Nel primo caso ho definito un tipo di variabile con nome
PuntatoreAdIntero che corrisponde a un puntatore ad integer, poi ho
dichiarato una variabile di nome Puntatore e del tipo appena
dichiarato PuntatoreAdIntero. Nel secondo caso ho dichiarato una
variabile di tipo puntatore ad integer. Quindi come si può dedurre
da i due modi di dichiarare un puntatore per dire che si tratta
effettivamente di un puntatore bisogna usare il simbolo ^ prima del
tipo della variabile da puntare.
Ora che abbiamo dichiarato il puntatore vediamo un po di
codice per capire meglio come utilizzare un puntatore.
{
Dichiaro il tipo di dato PuntatoreAdIntero }
type
PuntatoreAdIntero=^integer;
.
.
.
{
Dichiaro le variabili che mi servono }
var
MiaVariabile: integer;
MioPuntatore: PuntatoreAdIntero;
.
.
.
{
Codice vero e proprio che andremo ad analizzare }
MiaVariabile:=60; { Inizializzo la variabile }
MioPuntatore:=@MiaVariabile; { Il puntatore ora lo
punto alla variabile }
writeln('Il valore puntato è: ', MioPuntatore^); {
Stampo il valore puntato da puntatore }
MiaVariabile:=50;
writeln('Il valore puntato è: ', MioPuntatore^); {
Stampo il valore puntato da puntatore }
Per prima cosa inizializzo la variabile di nome
MiaVariabile a 60, dopodichè dico a MioPuntatore di puntare
all'indirizzo di MiaVariabile, dopodiché stampo a video il contenuto
della variabile puntata, il risultato sarà 60. In seconda battuta
modifico il contenuto di MiaVariabile e ristampo nuovamente il dato
contenuto nella variabile puntata, il risultato sarà 50.
I puntatori possono essere utilizzati su qualsiasi tipo
di variabile, anche sulle variabili realizzate da noi attraverso il
type.
Ad esempio se si realizzasse il tipo di dato animale in
questo modo
type
Animale=record
Anni:
integer;
Tipo:
string;
end;
sarebbe possibile dichiarare un puntatore a tale
variabile e le variabili Var1 e Var2 tramite questo codice
var
MioPuntatore:
^Animale;
Var1:
Animale;
Var2:
Animale;
Poi valorizzerei le due variabili
Var1.Anni:=5;
Var1.Tipo:='cane';
Var2.Anni:=6;
Var2.Tipo:='gatto';
E stamperei a video tramite il puntatore i dati delle
due variabili:
Una volta compilato ed eseguito questo programma il
risultato ottenuto sarà:
Ho un cane di anni: 5
Ho un gatto di anni: 6
Non bisogna lasciarsi trarre in inganno dagli esempi
visti fino ad ora, i puntatori sono molto utili e flessibili come
strumenti, soprattutto se si affrontano tematiche come liste ed
alberi.
Questo blog non rappresenta una testata giornalistica poiché viene
aggiornato senza alcuna periodicità. Non può pertanto considerarsi un
prodotto editoriale ai sensi della legge n. 62/2001.
Questo sito utilizza cookie, anche di terze parti, per offriti servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina, cliccando su un link o proseguendo la navigazione in altra maniera, acconsenti all’uso dei cookie.