PDA

View Full Version : [VB.Net] Due domande veloci...


birmarco
16-11-2008, 15:17
1)In Visual Studio 2008 Professional non trovo il controllo flexGrid... ha cambiato nome? Se no, come faccio ad aggiungerlo ad un form??

2)Come faccio ad impostare i comandi da tastiera per i pulsanti? So che basta mettere una & prima della lettera che, premuta assieme ad Alt, attiva il cotrollo; non c'è un modo per usare un pulsante premendo direttamente A invece di ALt+A?


GRAZIE a tutti :)

MarcoGG
16-11-2008, 20:30
1)In Visual Studio 2008 Professional non trovo il controllo flexGrid... ha cambiato nome? Se no, come faccio ad aggiungerlo ad un form??


FlexGrid è un componente COM, e precisamente un Ocx ( C:\Windows\System32\MSFLXGRD.OCX ). In VB NET va ricercato nei componenti COM, anzichè in quelli .NET, aggiunto alla barra dei componenti e quindi utilizzato.


2)Come faccio ad impostare i comandi da tastiera per i pulsanti? So che basta mettere una & prima della lettera che, premuta assieme ad Alt, attiva il cotrollo; non c'è un modo per usare un pulsante premendo direttamente A invece di ALt+A?


La scelta migliore per intercettare gli eventi da tastiera da un qualsiasi punto dell'applicazione, a parte i vari eventi Key del Framework, che spesso sono insufficienti, a mio parere rimane l'uso di opportune chiamate alle API.
Questa la funzione da usare :
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer

birmarco
16-11-2008, 20:32
FlexGrid è un componente COM, e precisamente un Ocx ( C:\Windows\System32\MSFLXGRD.OCX ). In VB NET va ricercato nei componenti COM, anzichè in quelli .NET, aggiunto alla barra dei componenti e quindi utilizzato.



La scelta migliore per intercettare gli eventi da tastiera da un qualsiasi punto dell'applicazione, a parte i vari eventi Key del Framework, che spesso sono insufficienti, a mio parere rimane l'uso di opportune chiamate alle API.
Questa la funzione da usare :
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer

E dopo aver acquisito il valore numerico del tasto?
---------------------------------------------------------------------------------
Per la flexGrid ho risolto usando la DataGrid che mi sembra uguale...

EDIT. Come faccio ad impostare l'intestazione della riga?

Grazie... ;)

MarcoGG
16-11-2008, 20:59
E dopo aver acquisito il valore numerico del tasto?


Non è così semplice.
Devi fare in modo che ci sia una routine nell'applicazione che è sempre "in ascolto", pronta ad intercettare ogni azione su tastiera o mouse...
Ti faccio un esempio, che si fa prima.
Poniamo che voglia mappare i tasti A-B-C e che una semplice pressione di questi tasti, ( quindi niente Alt o Ctrl ecc... ), vada ad eseguire via codice il Click del pulsante associato.
Mi basterà intercettare i codici per i tasti A,B,C ossia rispettivamente 65, 66, 67, in questo modo :

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
Private valoreRitorno As Integer = 0

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Dim i As Integer = 0
For i = 65 To 67
valoreRitorno = GetAsyncKeyState(i)
If valoreRitorno = -32767 Then
ListBox1.Items.Add(i & " -> " & Chr(i))
Select Case i
Case 65 'A
ButtonA.PerformClick()
Case 66 'B
ButtonB.PerformClick()
Case 67 'C
ButtonC.PerformClick()
Case Else
'...
End Select
End If
Next i

End Sub

Il Timer, con un intervallo abbastanza basso, diciamo 10, risolve la questione del "sempre in ascolto".
La ListBox serve a scopo di debug, e a ricavare il codice da ogni tasto ! ;)

E il gioco è fatto. :cool:

birmarco
16-11-2008, 21:03
E dopo aver acquisito il valore numerico del tasto?
---------------------------------------------------------------------------------
Per la flexGrid ho risolto usando la DataGrid che mi sembra uguale...

EDIT. Come faccio ad impostare l'intestazione della riga?

Grazie... ;)

Mi autoquoto... la DataGrid non va bene per quello che voglio fare... e non riesco a inserire la FlexGrid anche perchè in System32 non c'è nessun MSFLXGRD.OCX (nella guida di VB lo indicava come MSHFLXGD.OCX). Mi puoi aiutare? Il mio progetto si basa sulla flexgrid, senza posso anche evitare di continuare...

PS. Grazie per la cosa dei tasti :)

MarcoGG
16-11-2008, 21:11
e non riesco a inserire la FlexGrid anche perchè in System32 non c'è nessun MSFLXGRD.OCX (nella guida di VB lo indicava come MSHFLXGD.OCX). Mi puoi aiutare? Il mio progetto si basa sulla flexgrid, senza posso anche evitare di continuare...


Se usavi le FlexGrid significa che usavi VB6. La soluzione migliore mi sembra installare VB6, che probabilmente non è più presente nel sistema che stai usando...
Ovviamente poi dovrai "copiare localmente" l'Ocx e ridistribuirlo con l'applicazione ;) .

birmarco
16-11-2008, 21:50
Se usavi le FlexGrid significa che usavi VB6. La soluzione migliore mi sembra installare VB6, che probabilmente non è più presente nel sistema che stai usando...
Ovviamente poi dovrai "copiare localmente" l'Ocx e ridistribuirlo con l'applicazione ;) .

Non ho mai usato VB6 ma per quello che devo fare mi serve proprio la flexgrid... :( Se riesco a reperire il file della flexgrid poi come posso aggiungerlo?

-------------------------------------------------------------------------------

Ora vedrò di sfruttare la funzione dei tasti che mi hai scritto... se ti può interessare, la userò per questo (http://www.momentinfo.altervista.org/software/calcolatrice/calcolatrice.htm) ;)

MarcoGG
16-11-2008, 22:16
Non ho mai usato VB6 ma per quello che devo fare mi serve proprio la flexgrid... :( Se riesco a reperire il file della flexgrid poi come posso aggiungerlo?


Confermo che si tratta del Microsoft FlexGrid Control, version 6.0. Il controllo è OCX e corrisponde al file che ti ho detto.
Se non puoi installare VB6, puoi googlare in giro... Ci sono molti siti che mettono a disposizione praticamente ogni DLL / OCX di Windows.
Quando ce l'hai, click destro sulla colonna dei componenti di VS2008 ( quella a sinistra ) / scegli elementi / componenti COM.

birmarco
17-11-2008, 19:39
Confermo che si tratta del Microsoft FlexGrid Control, version 6.0. Il controllo è OCX e corrisponde al file che ti ho detto.
Se non puoi installare VB6, puoi googlare in giro... Ci sono molti siti che mettono a disposizione praticamente ogni DLL / OCX di Windows.
Quando ce l'hai, click destro sulla colonna dei componenti di VS2008 ( quella a sinistra ) / scegli elementi / componenti COM.

Non si fa tempo a risolvere un problema che se ne creano altri... :mad: Ho scaricato la FlexGrid, l'ho copiata in system32 e eseguendo VS2008 com amministratore ho installato il controllo. Una volta aggiunto alla Casella degli strumenti l'ho aggiunto anche al form principale del progetto... Mi sono accorto che manca una proprieta fondamentale...

Delle seguenti manca quella rossa:

mainGrid.rows = 10 'Numero righe tabella
mainGrid.cols = 10 'Numero colonne tabella

mainGrid.row = 3 'Posizionamento su una riga specifica
mainGrid.col = 4 'Posizionamento su una colonna specifica

(Posto mainGrid il nome del controllo FlexGrid)

Potrebbe essere il file OCX della FlexGrid danneggiato?? Anche perchè non ho trovato una proprietà sostitutiva a "cols"... Che manchi di proposito sembra assurdo in quanto le proprietà "col" e "rows" ci sono... Consigli? Idee?

A me serve un controllo tabella che abbia un numero preciso di righe e colonne intestate (generate anche a priori). Le celle devono poter contenere dati string, essere ridimensionabili anche durante l'esecuzione del programma ed essere selezionabili (tramite cordinate, per esempio col e row) per eseguire l'elaborazione dei dati (principalmente numeri) scritti dall'utente...
Se tu o qualcun'altro conosce un controllo che faccia questo... mi sarebbe molto utile: sto cercando di creare un semplice foglio di calcolo :sofico: ed è evidente che senza tabella non posso farlo... se solo la DataGrid permettesse di creare righe! :mad:

Grazie! :help:

MarcoGG
17-11-2008, 22:07
Stranissimo problema.
Ma sto FlexGrid lo usavi con che linguaggio ? Visual C ?
Potrebbe essere che l'Ocx che hai scaricato è vecchio.
Insomma se hai Visual Studio 6 ( sennò non so con che linguaggio lo usavi... )
installalo, e ti ritroverai la versione giusta di FlexGrid.
Io da VB 2008, se faccio Click destro sul FlexGrid mi da la classica finestrella Proprietà tipica di molti controlli ActiveX, e posso impostare numero righe, numero colonne e parecchia altra roba... :mbe:

birmarco
18-11-2008, 14:05
Stranissimo problema.
Ma sto FlexGrid lo usavi con che linguaggio ? Visual C ?
Potrebbe essere che l'Ocx che hai scaricato è vecchio.
Insomma se hai Visual Studio 6 ( sennò non so con che linguaggio lo usavi... )
installalo, e ti ritroverai la versione giusta di FlexGrid.
Io da VB 2008, se faccio Click destro sul FlexGrid mi da la classica finestrella Proprietà tipica di molti controlli ActiveX, e posso impostare numero righe, numero colonne e parecchia altra roba... :mbe:

Non l'ho mai usato... e VB2008 è il primo ed unico VB che ho... Proverò a scaricare un'altra versione della flexgrid(quella che ho scaricato era la 6.qualcosa).

tu come fai ad avere la flexgrid in vb 2008?

MarcoGG
18-11-2008, 14:22
Non l'ho mai usato... e VB2008 è il primo ed unico VB che ho... Proverò a scaricare un'altra versione della flexgrid(quella che ho scaricato era la 6.qualcosa).

tu come fai ad avere la flexgrid in vb 2008?


FlexGrid è un OCX che normalmente sta in Windows\System32\
Posso dirti al 99% che venga messa lì dall'installazione di VS6.

Al tuo primo post dicevi che "non riuscivi a trovarla" in VB 2008, perciò pensavo che avessi già sviluppato su FlexGrid in un qualche linguaggio precedente, e cercassi di migrare a VB2008.

Io non ce l'ho "in VB 2008", perchè non è un componente Framework, ma COM. La importo in VB 2008, come ti ho già spiegato.
Cmq, quella che vedo io è "Microsoft FlexGrid Control 6.0".

birmarco
18-11-2008, 14:23
FlexGrid è un OCX che normalmente sta in Windows\System32\
Posso dirti al 99% che venga messa lì dall'installazione di VS6.

Al tuo primo post dicevi che "non riuscivi a trovarla" in VB 2008, perciò pensavo che avessi già sviluppato su FlexGrid in un qualche linguaggio precedente, e cercassi di migrare a VB2008.

Io non ce l'ho "in VB 2008", perchè non è un componente Framework, ma COM. La importo in VB 2008, come ti ho già spiegato.
Cmq, quella che vedo io è "Microsoft FlexGrid Control 6.0".

La mia si chiama MS Hierarchical Flex Grid Control 6

Credo sia la stessa... ma se importo un progetto in VB6 dici che la flexgrid me la acquisisce da solo?

MarcoGG
18-11-2008, 14:33
La mia si chiama MS Hierarchical Flex Grid Control 6

Credo sia la stessa... ma se importo un progetto in VB6 dici che la flexgrid me la acquisisce da solo?


No. Sono 2 controlli diversi.
La Hierarchical corrisponde al componente COM :
Windows\System32\MSHFLXGD.OCX

Cmq, se la uso su un progetto VB ( 6 o 2008 ), anche questa mi permette di impostare moltissime proprietà a design, tra cui numero righe/colonne ecc...

Fatti prestare una copia di VB6... ;)

birmarco
18-11-2008, 14:40
No. Sono 2 controlli diversi.
La Hierarchical corrisponde al componente COM :
Windows\System32\MSHFLXGD.OCX

Cmq, se la uso su un progetto VB ( 6 o 2008 ), anche questa mi permette di impostare moltissime proprietà a design, tra cui numero righe/colonne ecc...

Fatti prestare una copia di VB6... ;)

Allora se scarico il file giusto... magari funziona... se no non so neance dove poter trovare VB6 che è vecchio... ma in VB.Net non hanno pensato di mettere un controllo così??! Mi pare strano... Se no come visualizzi le matrici? Bo... cmq alcune differenze tra il 6 e il 2008 sono discutibili...

MarcoGG
18-11-2008, 15:07
Allora se scarico il file giusto... magari funziona... se no non so neance dove poter trovare VB6 che è vecchio... ma in VB.Net non hanno pensato di mettere un controllo così??! Mi pare strano... Se no come visualizzi le matrici? Bo... cmq alcune differenze tra il 6 e il 2008 sono discutibili...

Ma VB6 non è affatto vecchio.
Ha molte funzioni interessanti ( e tu stesso sei qui in cerca di "vecchi" componenti OCX, mi pare :D ), che guarda caso sono state incluse anche in VB2008.
In molti progetti tu potresti perfino sviluppare dentro VB2008 scrivendo codice VB6 senza accorgertene.
D'accordo con te che certe scelte di VB 2008 possano non piacere (io con VB 2008 mi trovo benone).
In VB 2008 ci sono diversi validi controlli Griglia, ma certo meno "immediati" nell'utilizzo dei buoni vecchi Ocx...

birmarco
18-11-2008, 15:14
Ma VB6 non è affatto vecchio.
Ha molte funzioni interessanti ( e tu stesso sei qui in cerca di "vecchi" componenti OCX, mi pare :D ), che guarda caso sono state incluse anche in VB2008.
In molti progetti tu potresti perfino sviluppare dentro VB2008 scrivendo codice VB6 senza accorgertene.
D'accordo con te che certe scelte di VB 2008 possano non piacere (io con VB 2008 mi trovo benone).
In VB 2008 ci sono diversi validi controlli Griglia, ma certo meno "immediati" nell'utilizzo dei buoni vecchi Ocx...

Me ne sapresti indicare uno che ha le 4 proprietà che ho scritto qualche post sopra? Grazie :) Cmq la scelta di mettere alcune proprietà in sola lettura ha complicato un po' le cose... :D Poi io non sono affatto un esperto quindi... :mc:

MarcoGG
18-11-2008, 15:40
Proverei per primo il DataGridView.
Penso sia il più semplice da usare.
Meglio se tu facessi un rapido esempio di come lo vuoi utilizzare...

birmarco
18-11-2008, 15:49
Proverei per primo il DataGridView.
Penso sia il più semplice da usare.
Meglio se tu facessi un rapido esempio di come lo vuoi utilizzare...

La datagrid non mi fa impostare le righe.... (e l'intestazione delle righe...) :confused:

La voglo usare nello stesso modo della tabella di excel ;)

MarcoGG
18-11-2008, 15:57
La datagrid non mi fa impostare le righe.... (e l'intestazione delle righe...) :confused:

La voglo usare nello stesso modo della tabella di excel ;)


Eeeeh no. Ti devi impegnare di più però. :D
A parte che io ho detto "DataGridView" e non "DataGrid", e poi :

DataGridView1.Rows.Add(5)
DataGridView1.Rows(0).HeaderCell.Value = "Intestazione Riga 1"

... aggiunge 5 righe e imposta l'intestazione sulla prima. ;)

birmarco
18-11-2008, 16:20
Eeeeh no. Ti devi impegnare di più però. :D
A parte che io ho detto "DataGridView" e non "DataGrid", e poi :

DataGridView1.Rows.Add(5)
DataGridView1.Rows(0).HeaderCell.Value = "Intestazione Riga 1"

... aggiunge 5 righe e imposta l'intestazione sulla prima. ;)

Quanto sono stupido!! Io scrivevo così...

DataGridView1.Rows.Add = 5

:D Grazie 1000

PS. Certo che in questa sezione tutti chiedono e nessuno spiega... se nn ci fossi stato tu...

Ne approfitto un'ultima volta... sai come si personalizza il setup? magari con un progrmma esterno...

MarcoGG
19-11-2008, 09:09
sai come si personalizza il setup? magari con un progrmma esterno...


Pacchetti di installazione ?
Faccio di tutto per non usarli, e tendo sempre a distribuire le cose che faccio senza che richiedano alcuna installazione.
Se vuoi qualcosa di terze parti dai un'occhio a questi 2 :
1. InnoSetup : http://www.innosetup.com/isinfo.php
2. Setup Factory ( a pagamento ) : http://www.indigorose.com/setup-factory/

birmarco
20-11-2008, 16:37
Pacchetti di installazione ?
Faccio di tutto per non usarli, e tendo sempre a distribuire le cose che faccio senza che richiedano alcuna installazione.
Se vuoi qualcosa di terze parti dai un'occhio a questi 2 :
1. InnoSetup : http://www.innosetup.com/isinfo.php
2. Setup Factory ( a pagamento ) : http://www.indigorose.com/setup-factory/

Grazie... :)

birmarco
21-11-2008, 20:49
Ora sono riuscito a creare la tabella come voglio e a mettere anche tutte le intestazioni... Però ho un altro problema... come faccio a scrivere in una cella?? Ho cercato su google ma trovo riferimenti a versioni di VB più vecchie o cose che non centrano niente...

Riesco a posizionarmi sulla cella selezionata con:

mainGrid.CurrentCell.Selected = True

Però per scriveci dentro?? O anche acquisire in una variabile il contenuto della cella?? (numeri o caratteri)

Non c'è la proprietà text e tra le proprietà che mi propone non c'è n'è una che va bene... :cry:

MarcoGG
21-11-2008, 22:53
Selezionare la cella non è necessario. Non siamo in Excel ( e cmq, nemmeno in Excel è necessario ;) ).
Espandiamo un po' il mio esempio precedente :

'aggiungo righe :
DataGridView1.Rows.Add(5)

'intestazione colonna :
DataGridView1.Columns(0).Name = "A"
DataGridView1.Columns(0).HeaderText = "A"

'intestazione righe :
DataGridView1.Rows(0).HeaderCell.Value = "1"
DataGridView1.Rows(1).HeaderCell.Value = "2"

'scrivo nelle celle :
DataGridView1.Item(0, 0).Value = "Valore"
'oppure anche :
DataGridView1.Item("A", 1).Value = 100

'leggo la cella :
Dim val As Integer = DataGridView1.Item("A", 1).Value
MsgBox(val)

Prova... :)

birmarco
23-11-2008, 14:50
Selezionare la cella non è necessario. Non siamo in Excel ( e cmq, nemmeno in Excel è necessario ;) ).
Espandiamo un po' il mio esempio precedente :

'aggiungo righe :
DataGridView1.Rows.Add(5)

'intestazione colonna :
DataGridView1.Columns(0).Name = "A"
DataGridView1.Columns(0).HeaderText = "A"

'intestazione righe :
DataGridView1.Rows(0).HeaderCell.Value = "1"
DataGridView1.Rows(1).HeaderCell.Value = "2"

'scrivo nelle celle :
DataGridView1.Item(0, 0).Value = "Valore"
'oppure anche :
DataGridView1.Item("A", 1).Value = 100

'leggo la cella :
Dim val As Integer = DataGridView1.Item("A", 1).Value
MsgBox(val)

Prova... :)

Grazie... provo...

Ho provato anche innosetup che mi hai segnalato e funziona bene... ora devo vedere se propone anche opzioni più avanzate... Una domanda: quando il setup sceglie la lingua del software è la lingua del form (proprietà language)?

MarcoGG
24-11-2008, 09:03
Ho provato anche innosetup che mi hai segnalato e funziona bene... ora devo vedere se propone anche opzioni più avanzate... Una domanda: quando il setup sceglie la lingua del software è la lingua del form (proprietà language)?

InnoSetup l'ho usato molto tempo fa, ora non so esattamente come sia. Te l'ho consigliato perchè, per quanto mi ricordo, mi soddisfaceva, e inoltre ne parlano bene.
La lingua del setup credo si riferisca semplicemente ai menu/comandi del programma...

birmarco
25-11-2008, 16:32
InnoSetup l'ho usato molto tempo fa, ora non so esattamente come sia. Te l'ho consigliato perchè, per quanto mi ricordo, mi soddisfaceva, e inoltre ne parlano bene.
La lingua del setup credo si riferisca semplicemente ai menu/comandi del programma...

Ora cosa usi? Hai trovato di meglio?

MarcoGG
25-11-2008, 17:14
Ora cosa usi? Hai trovato di meglio?


Beh, come già scritto più su, più che altro evito proprio di farli, gli installer... :D
Non mi è mai capitato che il cliente mi abbia detto "Grazie, ma lo preferirei con l'installer !". Io ne trovo solo vantaggi, basti pensare alla possibilità di eseguire direttamente l'applicativo da una USB Key, un HD esterno, ecc...
Insomma, viva il software No-Install ! :D

birmarco
25-11-2008, 17:33
Beh, come già scritto più su, più che altro evito proprio di farli, gli installer... :D
Non mi è mai capitato che il cliente mi abbia detto "Grazie, ma lo preferirei con l'installer !". Io ne trovo solo vantaggi, basti pensare alla possibilità di eseguire direttamente l'applicativo da una USB Key, un HD esterno, ecc...
Insomma, viva il software No-Install ! :D

E come fai con VB? Fai compilare ad un software esterno il software in un unico EXE? So che è meglio come dici tu per vari motivi... però io preferisco il software che si installa... anche perchè quello che non necessita di installazione finisce che lo perdo nei mendri delle cartellle del pc :D

InnoSetup mi soddisfa ma se voglio fare Suite di più software non so se il programma me lo permette... :confused:

MarcoGG
25-11-2008, 17:51
E come fai con VB? Fai compilare ad un software esterno il software in un unico EXE?


Mai sentito parlare di "Assembly Merging" o "Resource Embedding" ?

Ci sono in giro applicativi molto intelligenti, che eseguono queste operazioni, inoltre offuscano il codice, rendendo più arduo il Reverse Engineering o la spudorata copia del sorgente... Inoltre comprimono l'Exe, e lo ottimizzano per un'esecuzione più veloce. Insomma fanno diverse cosucce interessanti.
Posso dirti che ho usato spesso ( e uso ) per progetti VB6 e .NET ( fino alla versione 2003 ) un Tool chiamato "Thinstall"... ;)
Alcuni possono virtualizzare l'intero ambiente di sviluppo, rendendo superflua l'installazione dello stesso Framework sulla macchina del cliente, mai provato questo, ( non so cosa venga fuori , come exe... :D e poi non mi piace, come concetto... ).

Lo stesso "ILMERGE" e "DotFuscator" sono inclusi in VS, ma forse non così immediati / intuitivi... Li ho usati pochissimo.