Newsgroup: it.comp.lang.visual-basic
Titolo: E' possibile avere nella MSflexgrid oggetti listbox ?

Vorrei simulare la parte relativa all'introduzione delle proprieta' di  VB
per degli oggetti che ho creato.
In altre parole, avendo definito un'oggetto vorrei far impostare le
proprietą di questo tramite l'oggetto MSFlexGrid.
Il problema e che, se ho dei valori numerici tutto va bene  mentre se devo
far scegliere tra n valori predefiniti non riesco a farlo.
Quello che mi servirebbe sapere, quindi, e se posso creare un link ad un
oggetto listbox (o altri oggetti) nelle celle del componente FlexGrid
standard .
Ringrazio in anticipo chiunque risponda
Saluti
Marius


più che un link occorre "barare" un po con un controllo msflex e combobox;
come risposta al click su una determinata cella, si dovrà provvedere alla
visualizzazione della combobox sopra la opportuna cella della griglia;
a suo tempo avevo fatto qualcosa del genere per rendere una griglia
editabile (nel mio caso utilizzavo una textbox); se pensi che possa servirti
come spunto, potrei postarti il codice sorgente;
fammi sapere;
ciao

 come spunto, potrei postarti il codice sorgente;
posta posta diavoletto se e quando puoi, che poi jimi lo faqqa :) dato il
new look di w2000 (e suppongo me), la domanda si ripetera'... fosse
possibile non limitarsi alla griglia ma rendere l'esempio portabile su altri
contenitori: audiognome, il cugino bello di napster, per le preferenze ha
esattamente quel sistema, con un cbo o un txbox che viene visualizzato mi
sembra dentro un listview. nelle proprieta' di vb e' molto bello anche il
giochino del pulsante con i tre puntini...
grazie in anticipo da jimi e dal ng concorde :)))
_e da me_, ciao, a.

 celle degli oggetti.(gestione dinamica)
ok, il trucco sta infatti nel visualizzare una unica combo-box in
corrispondenza della cella "clickata";
in corrispondenza di un evento _Click(), sfruttando le properties
.CellWidth, .CellHeight, .CellTop e .CellLeft si dovrà posizionare una
combo-box sopra la griglia, avendo cura di riempirla con i valori opportuni;
in seguito alla selezione di un elemento basterà memorizzare l'opportuno
valore di .ListIndex nella .TextMatrix(x,y) opportuna; ti posto un breve ma
significativo esempio;
crea un nuovo progetto, nella Form1 inserisci una MSFlexGrid e una ComboBox,
avendo cura di:
1) impostare la property .Visible della ComboBox su False
2) impostare la property .Style su 2 - Dropdown List
quindi inserisci il seguente codice:
Option Explicit
Private m_lastRow As Integer
Private m_lastCol As Integer
Private Sub Form_Load()
    With MSFlexGrid1
        .Cols = 4
        .Rows = 10
        .FixedCols = 1
        .FixedRows = 1
        .ColWidth(0) = 200
        .ColWidth(1) = 1100
        .ColWidth(2) = 1300
        .ColWidth(3) = 1800
        .TextMatrix(0, 1) = "Colore"
        .TextMatrix(0, 2) = "Dimensione"
        .TextMatrix(0, 3) = "Posizione"
    End With
End Sub
Private Sub MSFlexGrid1_Click()
    With MSFlexGrid1
        m_lastRow = .Row
        m_lastCol = .Col
        Combo1.Clear
        Select Case .Col
            Case 1
                Combo1.AddItem "1 - Rosso"
                Combo1.AddItem "2 - Verde"
                Combo1.AddItem "3 - Blu"
            Case 2
                Combo1.AddItem "1 - Small"
                Combo1.AddItem "2 - Medium"
                Combo1.AddItem "3 - Large"
                Combo1.AddItem "4 - Extra Large"
            Case 3
                Combo1.AddItem "1 - Orizzontale"
                Combo1.AddItem "2 - Verticale"
        End Select
        Combo1.Move .CellLeft, .CellTop, .CellWidth
        Combo1.ListIndex = Val(.Text) - 1
        Combo1.Visible = True
        Combo1.ZOrder
        Combo1.SetFocus
    End With
End Sub
Private Sub MSFlexGrid1_Scroll()
    MSFlexGrid1.SetFocus
End Sub
Private Sub Combo1_LostFocus()
    With Combo1
        .Visible = False
        MSFlexGrid1.TextMatrix(m_lastRow, m_lastCol) = .List(.ListIndex)
    End With
End Sub
prova a fare un run e verifica il funzionamento del tutto;
il programma, così come è fatto, presenta un paio di difetti:
1) a causa del bordo della ComboBox (non eliminabile) l'allineamento con la
griglia risulta alquanto impreciso; vedremo tra un attimo come fare a
risolvere il problema;
2) la ComboBox di VB non può essere ridimensionata in verticale (Height) e
quindi se si ha a che fare con righe "fuori misura" l'effetto è tutt'altro
che bello a vedersi; in ogni caso se Maometto non va alla montagna.... in
altre parole, è sempre possibile regolare l'altezza delle righe della
MSFlexGrid
quindi, riassumendo, ecco la "patch" da applicare per rendere il tutto più
gradevole;
inserisci in testa al codice quanto segue
Private Const SM_CXBORDER = 5
Private Const SM_CYBORDER = 6
Private Const SM_CXEDGE = 45
Private Const SM_CYEDGE = 46
Private Declare Function GetSystemMetrics _
    Lib "user32" (ByVal nIndex As Long) As Long
Private m_offsetX As Long
Private m_offsetY As Long
quindi in fase di Form_Load aggiungi le seguenti linee
    m_offsetX = GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXEDGE)
    m_offsetX = ScaleX(m_offsetX, vbPixels, ScaleMode)
    m_offsetY = GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYEDGE)
    m_offsetY = ScaleY(m_offsetY, vbPixels, ScaleMode)
e quindi nell'evento MSFlexGrid1_Click() modifica la linea
Combo1.Move .CellLeft, .CellTop, .CellWidth
in
Combo1.Move m_offsetX + .CellLeft, m_offsetY + .CellTop, .CellWidth
ciao