Newsgroup: it.comp.lang.visual-basic
Titolo: VB6 Problema con refresh form

Ciao a tutti,
ho una form grande quasi come lo schermo occupata quasi intgeramente da 
una flexgrid e giï¿œ in basso a destra una form molto piï¿œ piccola con 
delle textbox che si devono valorizzare con il contenuto delle celle 
della form sottostante quando ci faccio clik sopra.
 
Quindi io faccio clik sulla grid della finestra grande, leggo il 
contenuto e lo copio nella textbox della finestra piccola, che intanto 
ï¿œ sparita perchï¿œ ha perso il focus, allora concludo l'evento clik con 
un frm2.ZOrder 0 e la finestra piccola torna in piano con la textbox 
valorizzata come previsto.
Gira tutto bene tranne per un fastidiso sfarfallio della finestra 
piccola che scompare e riappare. C'ï¿œ un modo per renderla fissa e 
stabile in primo piano anche quando perde il focus?
Grazie
 
-- 
Greg
 
 

stabile in primo piano anche quando perde il focus?
 
Si pu� provare con le API, mi ricordo che la SetWindowPos lo consentiva, ma la
BringWindowToTop sembra fatta apposta, vedi qui:
 
http://allapi.mentalis.org/vbtutor/iapi3.shtml
 
 
 
--
ciao
  Stefano

E' sufficente che nel metodo .Show() della finestra secondaria tu specifichi come "owner" la finestra principale; a quel punto, pur essendo Modeless, la seconda finestra non passera' dietro la prima anche quando perde il focus.

 
http://allapi.mentalis.org/vbtutor/iapi3.shtml
 
 
Grazie Stefano, piu tardi guarda questa api :)
 
-- 
Greg
 
 

 seconda finestra non passera' dietro la prima anche quando perde il focus.
 
Grazie Luca, questa soluzione ï¿œ ancora piu semplice dell'Api. Non avevo 
mai provato questo parametro opzionale, mi ero sempre fermato a modale 
si o no. Questo vecchio VB6 riserva ancora delle picocle piacevoli 
sorprese :)
 
-- 
Greg
 
 

Il 19/08/14 17.24.33 Greg ha scritto:

Ho scoperto perï¿œ di avere un ulteriore problema.
Voglio anche che il focus vada sulla textbox appena valorizzata ma non 
mi funziona.
 
Evento clik della grid()
 frm2.Textbox2.text = flex.TextMatrix(x,y).text
 frm2.Rextbox2.Setfocus
End sub
 
Rimane sempre il focus sulla prima textbox, e fino adesso non ne 
comprendo il motivo :(
 
-- 
Greg
 
 

 End sub
 
Magari ricordo male, ma prova a metterlo nell'evento mouseup,
oppure, nell'evento frm2.Textbox2.change.

Franz_aRTiglio scriveva il 21/08/2014 :

Or che ci penso, forse volevi che il focus fosse sia sul form che
sulla textbox ?
 
frm2.Textbox2.text = flex.TextMatrix(x,y).text
frm2.Setfocus
frm2.Rextbox2.Setfocus
 
perï¿œ sono un po' arrugginito, quindi potrei starmi sbagliando
di brutto XD

Il 21/08/14 22.20.15 Franz_aRTiglio ha scritto:

Niente da fare. Il focus rimane sulla prima text che valorizzo, quando 
valorizzo la seconda il focus rimane ancora sulla prima.
 
Ho provato varie cose, e niente, sembra che quando la form ï¿œ aperta in 
questo modo (con parametro owner) poi non si riesca a controllare il 
setfocus.
 
La form2 ï¿œ aperta da form1 cosi:
    frm2.Show , frm1
 
Bon, vadopa dormire che son fuso, domani a fresco ci penserï¿œ ancora :(
 
-- 
Greg
 
 

 Bon, vadopa dormire che son fuso, domani a fresco ci penserï¿œ ancora :(
 
Ah mi viene in mente che potrei sfruttare l'ordine TaIndex per far 
scattare il focus, ma non saprei come mandare un Sendkeys(tab) al di 
fuori dell'evento Keypress
 
-- 
Greg
 
 

 comprendo il motivo :(
 
A me funziona correttamente; l'unico problema e' che torna un minimo di sfarfallio perchè dare il focus ad un textbox della seconda form, implicitamente da il focus anche alla form stessa.
 
Form2 ha semplicemente 3 textbox, Form1 una FlexGrid, e questo e' l'intero codice:
 
Private Sub Form_Load()
 
Dim i As Integer
 
flex.FixedRows = 1
flex.FixedCols = 1
flex.Cols = 3
 
For i = 1 To 50
    flex.AddItem vbTab _
                & "Item #" _
                & vbTab _
                & Format(i, "00"), i
Next
 
End Sub
 
Private Sub flex_Click()
 
Dim rowText As String
 
rowText = flex.TextMatrix(flex.Row, 1) _
    & flex.TextMatrix(flex.Row, 2)
 
showValue rowText, flex.Row
 
End Sub
 
Sub showValue(value As String, index As Integer)
 
If Not Form2.Visible Then
    Form2.Show , Me
End If
 
If index Mod 3 = 0 Then
    Form2.Text3.Text = value
    Form2.Text3.SetFocus
ElseIf index Mod 2 = 0 Then
    Form2.Text2.Text = value
    Form2.Text2.SetFocus
Else
    Form2.Text1.Text = value
    Form2.Text1.SetFocus
End If
 
End Sub
 
se vuoi evitare lo sfarfallio, un approccio alternativo puo' essere questo, che non da il focus al textbox fintanto che l'utente non da il focus intenzionalmente alla form secondaria, ma evidenzia comunque quello che hai fatto:
 
In Form2 questo codice:
Public Sub SetTextValue(txt As TextBox, value As String)
 
Dim c As Control
For Each c In Me.Controls
    If TypeOf c Is TextBox Then
        c.BackColor = SystemColorConstants.vbWindowBackground
    End If
Next
txt.Text = value
txt.BackColor = RGB(255, 255, 153)
 
End Sub
 
Private Sub Form_Activate()
 
Dim c As Control
For Each c In Me.Controls
    If TypeOf c Is TextBox Then
        If c.BackColor <> SystemColorConstants.vbWindowBackground Then
            c.SetFocus
        End If
    End If
Next
 
End Sub
 
In Form1 come sopra, cambiando showValue() con:
 
Sub showValue(value As String, index As Integer)
 
If Not Form2.Visible Then
    Form2.Show , Me
End If
 
If index Mod 3 = 0 Then
    Form2.SetTextValue Form2.Text3, value
ElseIf index Mod 2 = 0 Then
    Form2.SetTextValue Form2.Text2, value
Else
    Form2.SetTextValue Form2.Text1, value
End If
 
End Sub
 

Il 22/08/14 10:11:58 Luca D ha scritto:
 
Grazie a tutti per gli spunti utilissimi, sono riuscito a far 
funzionare il tutto. Il piccolissomo sfarfallio, ï¿œ trascurabile e non 
da fastidio.
 
-- 
Greg