Newsgroup: it.comp.lang.visual-basic
Titolo: grid editabile while running

MESSAGGIO I TRE PARTI:
1. illustrazione del problema teorico;
2. hint trovato in rete ma che non mi serve;
3. codice scritto per almeno intestare le colonne e le righe di una grid.
****************************************************************************
**********************************
PAROLE CHIAVE
griglia editabile - dimensionabile - dim - input  - no database - analisi di
Scatchard -recettori ormonali - Visual Basic 5
SCOPO
realizzare un codice per gestire elaborazione di dati sperimentali derivati
dal dosaggio radiochimico dei recettori ormonali in neoplasie solide
BACK-GROUND
i risultati sperimentali sono numeri di tre tipi
          1. quantità di ormone radioattivo aggiunto
          2. quantità di ormone legato totale
          3. quantità di ormone legato aspecifico
i risultati sono espressi in numeri che vanno da 0 a 10.000.000 e sono i
valori derivati dalla conta della radioattività (dpm, disintegrazioni per
minuto)
sperimentalmente, le quantità vengono misurate a diversi "livelli", cioè a
diverse molarità; pertanto, i valori da elaborare riguardano diversi "punti"
di legame a diverse molarità (in genere 6 livelli da 0.01 nM a 4 nM, ma
possono essere 4 livelli come 20 livelli)
i risultati possono essere valori singoli, in duplicato o triplicato, per
ciascun livello (punto) della curva di legame
quindi, se sono state introdotte le seguenti variabili "generali" di
sistema: 6 livelli di curva di legame e valori in triplicato, la griglia
necessaria dovrebbe somigliare all'esempio seguente:
                                    ORMONE
LEGATO                           LEGATO
                                    AGGIUNTO
TOTALE                           ASPECIFICO
(triplicati)               1         2          3
1        2        3                     1        2       3
livello 1             2500       2700       2200                 222
333      444               50       70       50
livello2              4500       4700       4250                 425
555      666             100     125     140
livello 3             9000     10000     11000                 888
777      999             200     300     250
livello 4           18000     20000     21000               1500      1600
1700            555     666     777
livelllo 5          55555     66666     60000                3000     3500
3200            800     750     850
livello 6         120000   125000   130000                4000     4500
5000          1000   1100   1200
in base ai valori introdotti viene calcolata e visualizzata con grafico X,Y
la curva di legame: ascissa per i livelli di ormone aggiunto, ordinata per i
singoli valori di legame totale, legame aspecifico e legame specifico che
viene calcolato per sottrazione del legame aspecifico dal legato totale
in base ai valori di legato specifico ottenuti si può eseguire la analisi di
Scatchard che consiste nell'elaborazione grafica dei risultati con un
grafico X,Y con ascissa per i valori di legato specifico e ordinata con i
valori di legato specifico divisi per i valori di ormone non legato
("libero") (ormone aggiunto - legato specifico)
la retta di Scatchard è una regressione lineare a pendenza negativa (-b)
della quale si considerano: l'intercetta con l'asse X (quantità di recettore
ormonale legata in modo specifico), la pendenza (indice dell'affinità di
legame che serve a controllare che il legame evidenziato sia quello
recettoriale con elevata affinità) e il coefficiente di correlazione "r" che
indica l'attendibilità dei risultati
 PROBLEMA
già disponibile un codice in Quick Basic per DOS che esegue tutta la
elaborazione, anche grafica su schermo ma non su stampante
l'intento è quello di scrivere un codice che permetta di elaborare i dati
sotto Windows, con possibilità di gestire anche le elaborazioni grafiche
ho realizzato la parte generale del codice dove vengono registrati i dati
"comuni" ai diversi dosaggi, ma non riesco a realizzare la parte di "input"
dei dati sperimentali
in un form ho sistemato una "grid" dimensionabile (sensibile ai valori di
numero di livelli e numero di replicati impostati precedentemente) con tanto
di intestazione di colonne e righe, ma, come sapete, la "grid" non è
editabile (non posso "scriverci" dentro!)
ho trovato un sistema (vedere secondo allegato) per fare in modo che una
casella di testo funzioni da "input" per una "grid", ma può editare una
cella alla volta e non sembra utile al mio scopo
vorrei evitare di dover creare un database dimensionato sulle impostazioni
date (ma è proprio necessario?) perchè temo che sia troppo difficile per me;
se sarà inevitabile, tuttavia, cercherò di adattare questo strumento alle
mie necessità
STRUMENTI NECESSARI
quello che cerco, in definitiva, è:
1. sapere se è possibile scrivere un codice che in fase di applicazione crei
un determinato numero di caselle di testo in modo indicizzato (utile per
eseguirci dei calcoli) e disposte sulla form in modo ordinato;
2. in alternativa, sapere se esiste una qualche forma di "grid" editabile
una volta lanciata l'applicazione;
3. gli strumenti più adatti per realizzare i grafici X,Y derivati da questo
tipo di analisi;
****************************************************************************
***********************************************
DOCUMENTO DISPONIBILE IN RETE
Quello che segue permette di trasferire il testo di una casella testo in una
griglia.
[ About Ryan Heldt: In addition to writing The Usable Interface, Ryan also
maintains The Toolbox Visual Basic Home Page. He is also working on World
Writer, a HTML authoring tool for Windows. Ryan can be reached at
rhe...@netins.net
]
Adding Punch to the Grid Control
Microsoft's Grid control (GRID16.OCX and GRID32.OCX) is a very useful tool
for displaying data in a spread sheet or a table-like fashion. It does,
however, lack many features that are found in other, higher priced, grid
controls.
Why Bother?
That is a question many would ask. Why bother using a poorly designed,
poorly manageable control, such as Microsoft's Grid, when other, easier and
more powerful alternatives exsist? My question is why not? The Grid ships
with every available version of Visual Basic (from the 16-bit standard to
the 32-bit enterprise), so you already own it. You don't have to go out and
spend a couple hundred dollars on an alternative. Secondly, look at the size
of the control itself. The 32-bit version weighs only 88 KB, so it's quite
small. Finally, look at the potential. Much of the Grid's power is not in
the control itself, but lies in the events and procedures of the control --
things you make it do. Never be afraid to crank out a few lines of code to
save yourself some money.
Problems
One of the first things that stray people away from using the Grid is it's
inability to perform in-cell editing. In the past, there have several
attempts to overcome that disability. One of the most notable procedures has
been to place a text box over the Grid, to fit the size of the cell. While
the technique works, it should never be used, as it has two major flaws.
The first of these flaws show up when the user re-sizes the cell, while they
are editing. The size of the text box would remain the same, while the size
of the cell would be larger, or smaller. In that case, the text box would
overlap another cell -- very unprofessional.
The second flaw, probably the most major, occurs if the grid has scroll
bars. If the user moves a scroll bar, while editing, the text box stays put,
while the grid cells move behind it. Wouldn't that look nice? The people
that developed the text box method knew this, too, but they didn't tell you.
The example I saw in the Developer Network intentionally shut off the scroll
bars.
Taking a Different Approach
I recently ran across this problem while developing one of my own
applications. I needed a way for the user to enter information directly into
a grid, so that it could be used later by my application. At first, I tired
to use the above method, but I got hung-up on the flaws. I needed to be able
to use the scroll bars, and I wanted to let the user re-size the cells.
img src="demo0496.gif">
I then began looking at different applications that used grids. The answer
came to me while I was looking at the Microsoft Works 3.0 spread sheet. This
spread sheet has a text box positioned just above the "grid". The text box
acts as a source of input. When the text box has the focus, it transfers
it's Text property to the grid's Text property. If the grid itself, has the
focus, it transfers any key strokes directly to the grid's text property.
This method looks like in-cell editing, but really is not. I know this
sounds confusing, but the code is really quite simple. Here is how it's
done:
Note: The code used in this article is available in the Toolbox's CodeVault.
The file UI-0496.ZIP is a Visual Basic 4.0 (32-bit) project that contains a
sample application that fully demonstrates the techniques in this article.
1. Create a new project (we recommend that you try out this technique before
implementing it into an existing project). On Form1, place a text box and a
grid control (you will need to install the GRID16.OCX or GRID32.OCX
control). name them txtEdit and grdTable, respectively. In the KeyPress
event, place the following code:
Private Sub grdTable_KeyPress(KeyAscii As Integer)
Dim x As Integer
    'If you want line breaks in your text, then
    'disable this line, but
you will need to set the
    'MultiLine property of txtEdit to True
    If KeyAscii = 13 Then
Exit Sub 'Void ENTER key
    If KeyAscii = 8 Then 'BACKSPACE key, remove last character
        If grdTable.Text = "" Then Exit Sub
        x = Len(grdTable.Text) - 1
        grdTable.Text = Left$(grdTable.Text, x)
    Else
        grdTable.Text = grdTable.Text & Chr$(KeyAscii)
    End If
    txtEdit.Text = grdTable.Text 'update text box
End Sub
The code, first, does a series a checks to determine if either the ENTER or
BACKSPACE keys have been pressed. If ENTER is pressed (ASCII code 13), it
simply ignores it and exits. If BACKSPACE is pressed (ASCII code 8), it
takes the last character off of the Text property of the current cell, then
exits. If the Text property is empty, it exits, to avoid an error.
If neither key is pressed, KeyAscii is translated into a character, then is
added to the Text property of the current cell. The value of the text box is
also updated at this time.
Note: The Row and Col properties specify the current cell in a Grid. You can
specify the current cell in code, or a user can change it at run time using
the mouse or the arrow keys. The Text property references the contents of
the current cell. (Visual Basic Help, Microsoft Corp., 1995)
2. I soon realized that people also use the keyboard while navigating
through a grid, so the following is needed in the KeyDown event:
Private Sub grdTable_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case
KeyCode
        Case 46 'If DELETE is presses
            'If the user presses the DELETE
key, then erase
            'the contents of the cell
            grdTable.Text = ""
            txtEdit.Text = grdTable.Text
        Case 37, 38, 39, 40 'any arrow key
            'if the user chnages cells with keyboard,
            'clear out the text box.
            txtEdit.Tag = "SkipChange" 'required so contents of the grid
text isn't deleted
            txtEdit.Text = ""
    End Select
End Sub
A nice feature I added, allows the user to delete the entire contents of a
cell using the DELETE key. This is a feature of most spread sheets, and is
quite simple to implement - - if the DELETE key (keyboard code 46) is
pressed, blank out the Text properties of both the Grid and text box.
The next chunk of code determines if an arrow key was pressed. If an arrow
was pressed, the contents of the text box has to be deleted, but, before we
do that, we must tell the text box not to delete the contents of the grid
cell. This is done using the Tag property of the text box. You will see how
this used later.
3. To make sure that the contents of the Grid and the contents of the text
box a re kept in sync, the following must be placed in both the Click event
and the RowColChange event of the Grid:
Private Sub grdTable_Click() and
Private Sub grdTable_RowColChange()
    'Put the cell's text into txtEdit
txtEdit.Text = grdTable.Text
End Sub
4. Finally, the following is needed in the Change event of the text box:
Private Sub txtEdit_Change()
    If txtEdit.Tag =
"SkipChange" Then
        txtEdit.Tag = ""
        Exit Sub
    Else
        grdTable.Text =
txtEdit.Text
    End If
End Sub
The first thing that is tested is the Tag property. If it's value is
"SkipChange", it means that the user changed cells using the keyboard,
therefore, the change in the text box should be ignored, and the contents of
the current cell shouldn't be changed. The last item of business updates the
contents of the Grid with that of the text box.
The Finishing Touches
Of course, there are several features that can be added to this method. For
example, the code for this article (see above) has four command buttons that
allow the user to add and delete rows and columns on-the-fly. The escape key
could also be used as an "undo" option that restores the previous value of a
cell. The possibilities are endless.
The Microsoft Grid Control is a great tool for displaying data in a spread
sheet fashion, but it lacks several key features. In the past, several
attempts have been made to add more power to the Grid, but they have several
flaws. Hopefully, using the method described in this article you too can add
more punch to the Grid control!
****************************************************************************
*******************************************
Quello che segue è quello che ho fatto finora.
come dicevo, qui di seguito riporto un codice scritto per proporzionare
una grid con dimensioni dipendenti da input immessi in tre caselle di
testo differenti disposte nella stessa form;
quasi mentre lo portavo qui mi sono accorto che è scritto male e, a
volte, (mi pare quando si impostano il numero di colonne = 2) non scrive
le intestazioni di colonna; gli farò un fixing appena ho un po' di
tempo;
ma il problema di fondo resta quello della possibilità di editare la
grid e di recuperare i dati introdotti per fare delle operazioni;
da un punto di vista pratico, ho risolto il problema con Excell; ho
fatto un foglio che fa tutto, anche i grafici, e, penso, avrò la
possibilità di inserirlo in un form di visual basic solo per renderlo
più "appetibile"; by the way, ad excell non "gira" la funzione REGR.LIN
e ho dovuto ricorrere alla "retta di tendenza" del grafico per sgamare
la regressione lineare; è il colmo! ad excell manca qualche rotella!
MEMO: per due replicati non
mette le intestazioni di colonna!!! (to be fixed!)
Option Base 1
Dim NumCol
Dim NumRig
Dim NumRep
Dim TabellaCalcolo(3, 3, 20)
' ricordare numero replicati, numero colonne, numero righe
'Private Sub Frame3_DragDrop(Source As Control, X As Single, Y As
Single)
'End Sub
Private Sub txtNumCol_Change()
NumCol = txtNumCol.Text
End Sub
Private Sub txtNumRep_Change()
NumRep = txtNumRep.Text
End Sub
Private Sub txtNumRig_Change()
NumRig = txtNumRig.Text
End Sub
Private Sub Grid1_Click()
Grid1.Rows = NumRig + 1
Grid1.Cols = (NumCol * NumRep) + 1
    Grid1.Row = 0
    Grid1.Col = 0
            Grid1.Text = ""
    For i = 1 To NumRig
        Grid1.Row = i
        Grid1.Col = 0
            Grid1.Text = "LIV. " & i
    Next i
    If NumCol = 3 And NumRep = 1 Then
            Grid1.Row = 0
            Grid1.Col = 1
            Grid1.Text = "TOT."
            Grid1.Row = 0
            Grid1.Col = 2
            Grid1.Text = "L.TOT."
            Grid1.Row = 0
            Grid1.Col = 3
            Grid1.Text = "L.ASP."
    End If
        If NumCol = 3 And NumRep = 2 Then
            Grid1.Row = 0
            Grid1.Col = 1
            Grid1.Text = "TOT.1"
            Grid1.Row = 0
            Grid1.Col = 2
            Grid1.Text = "TOT.2"
            Grid1.Row = 0
            Grid1.Col = 3
            Grid1.Text = "L.T.1"
            Grid1.Row = 0
            Grid1.Col = 4
            Grid1.Text = "L.T.2"
            Grid1.Row = 0
            Grid1.Col = 5
            Grid1.Text = "L.A.1"
            Grid1.Row = 0
            Grid1.Col = 6
            Grid1.Text = "L.A.2"
    End If
    If NumCol = 3 And NumRep = 3 Then
            Grid1.Row = 0
            Grid1.Col = 1
            Grid1.Text = "TOT.1"
            Grid1.Row = 0
            Grid1.Col = 2
            Grid1.Text = "TOT.2"
            Grid1.Row = 0
            Grid1.Col = 3
            Grid1.Text = "TOT.3"
            Grid1.Row = 0
            Grid1.Col = 4
            Grid1.Text = "L.T.1"
            Grid1.Row = 0
            Grid1.Col = 5
            Grid1.Text = "L.T.2"
            Grid1.Row = 0
            Grid1.Col = 6
            Grid1.Text = "L.T.3"
            Grid1.Row = 0
            Grid1.Col = 7
            Grid1.Text = "L.A.1"
            Grid1.Row = 0
            Grid1.Col = 8
            Grid1.Text = "L.A.2"
            Grid1.Row = 0
            Grid1.Col = 9
            Grid1.Text = "L.A.3"
    End If
End Sub
strepitoso, no? ma funziona poco e male!
****************************************************************************
***************************************
Arnaldo

 wrote in message
813ru5$4ot$1...@suite03.caspur.it...


TXS to HellBoy! 8-) In effetti, il problema l'ho già risolto con un foglio
di Excell e funziona bene; two more little questions:
1. non so come fare a codificare in VBA: è difficile? da che parte comincio?
da VB5 o da Excell? Please, tell me the irst few steps!
2. in Excell sono anche riuscito a fare delle belle regressioni lineari! ma
con qualche piccolo problema:
            2.A. se si cerca di inserire in una o più celle
Funzione-Statistica-REGR.LIN, Excell non ritorna tutto quello che dovrebbe
ritornare (una matrice di dati relativi all'elaborazione della regressione,
compreso R^2), ma ritorna solo un valore che, suppongo, sia l'intercetta con
Y;
            2.B. in effetti la regressione l'ho fatta sfruttando la
possibilità di inserire sui dati una LINEA DI TENDENZA SEMPLICE, ma,
incredibile!, ritorna dei dati che non coincidono con una mini-matrice che
sono riuscito ad ottenere inserendo manualmente la formula di regressione in
un gruppo di celle di tre colonne per due righe, su consiglio di Andrea P.
sul newsgroup it.comp.win95.software; ti dirò di più: quando ho cercato di
"montare" in VB5 con Vis-Data-Manager di Add-In il foglio di Excell che ho
fatto, VB mi ha detto che il formato del foglio non era un formato valido
(forse xchè contiene grafici e funzioni complesse?)
Ho cominciato a pensare che veramente non si può avere tutto e subito! ma il
consiglio di usare VB for Applications è allettante; fammi sapere, please
Arnaldo
HellBoy ha scritto nel messaggio ...
