Focus vraagje? (VB)

Status
Niet open voor verdere reacties.

Clit13

Terugkerende gebruiker
Lid geworden
11 jan 2001
Berichten
1.075
Beste...,

Ik heb een klein programmaatje gemaakt.
Het werkt nu prima, maar ik wil graag iets meer functionaliteit er aan toevoegen.
Wat er bijvoorbeeld nu nog moet gebeuren is de servernaam intypen en het interne gehuegen van die server.
Bijvoorbeeld:
Servername: DAVESVR001
Memory: 512

Ik heb de code om te bepalen hoeveel geheugen er in een server zit.
Maar ik wil graag dat het programma kan zien dat het textveld Servername gevuld is.

Dus: servernaam invullen (en daarna tab of Enter), programma ziet dat het textveld "Servername" niet meer de focus heeft. Hij voert de code uit om te bepalen hoeveel intern geheugen er in die server zit.

Is dit mogelijk (iets met "SetFocus"?) en hoe?


groet,
Dave.
 
Laatst bewerkt:
Gebruik het KeyPress event voor een Enter optie.

Met de Lost- en GotFocus events van je Text control kan ook,
maar hieronder heb ik als voorbeeld het KeyPress event genomen.

Onderstaande is respectievelijk voor de controls
Textbox1 en Textbox2. Na elke invoer een Enter geven.
(Wil je de Tab-toets gebruiken, dan kun je de events
Lost- en GotFocus gebruiken)

Code:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If (KeyAscii = 13) Then
  If Text1.Text = "" Then
     Exit Sub
     Else
     If Text2.Text <> "" Then
         'Voer hier de berekening uit.
         'Opmerking: Gebruik de Val functie om
         'de waarde van je tekstveld numeriek
         'te maken.
         'Bijvoorbeeld: variabele = Val(text1.text) enz..
         Else
         Text2.SetFocus
     End If
  End If
End If
End Sub

Private Sub Text2_KeyPress(KeyAscii As Integer)
If (KeyAscii = 13) Then
  If Text2.Text = "" Then
     Exit Sub
     Else
     If Text1.Text <> "" Then
         'Voer hier de berekening uit.
         'Opmerking: Gebruik de Val functie om
         'de waarde van je tekstveld numeriek
         'te maken.
         'Bijvoorbeeld: variabele = Val(text2.text) enz..
         Else
         Text1.SetFocus
     End If
  End If
End If
End Sub
 
Hij pakt de code wel, maar hij diet er niets mee.
Ik heb de velden even aangepast naar mijn programma.

Ik had verwacht dat er ergens een code ingetypt kon worden die continue checkt of de focus van een object veranderd.
Maar waar zet ik iets dergleijks neer?
Als ik een dubbelklik geef op het textveld dan maakt VB een nieuw sub aan genaamd txt_Systemname_Changed().
Maar daar kan ik niets mee.
Er is toch een soort "overall" sub?

groet,
Dave.
 
Een Timer control misschien?

Hallo Dave,

Bij je allereerste vraag was er sprake van 2 tekstvelden t.b.v.
de servernaam en het geheugen. Bedoel je dat beide (of één ervan)
steeds wordt gerefreshed(ge-update)?
Als dit het geval is, dan zou je een Timer control moeten gebruiken.

Je mag nog meer speciefieker zijn, door bijvoorbeeld een deel van je
source openbaar te maken.
 
als het echt gaat om de focus van een tekstveld dan kan je dus zoals dennis al eerder zei gewoon gebruik maken van:

Private Sub Text1_GotFocus()

End Sub

Private Sub Text1_LostFocus()

End Sub
 
Ik heb de juiste versie niet meegenomen van het werk.
Ik heb helaas dan ook niet de code om het 2e textveld te vullen bij de hand.
Als ik morgen op het werk ben, dan zal ik de code hier plaatsen (in ZIP-formaat).
Er zitten misschien een paar onzinnige programeertechnieken in, maar programmeren is een hobby van me, en het gaat bij mij in de eerste plaats om de functionaliteit en daarna pas om de schoonheid.

Tot morgen!

groet,
Dave.
 
Een Timer control of DoEvent functie gebruiken.

Hallo Vaat,

Ik wacht zelf nog op een response van Dave. Ik ben nog niet
helemaal duidelijk, maar ik denk dat Dave de Tekstvelden
voor de servernaam en het geheugen met de regelmaat v.e.
klok wilt refreshen(updaten). Als dit zo is, dan kan hier
v.e. een Timer control en/of de functie DoEvents worden
gebruikt gemaakt.

Een voorbeeld met DoEvent (Binnen een loop):

Benodigd: Op een form 2 TextBoxen en een Button(een beetje
grootmaken, vanwege de lange tekst)


Code:
Private Sub Command1_Click()
   Static blnCheckProces As Boolean
   Dim lngTeller As Long
   Dim int2OSTeller As Integer
   Dim dbFloatinGetal As Double
   'Check of het process actief is
   If blnCheckProces Then
      blnCheckProces = False
   Else
      Command1.Caption = "Stop Process (DoEvent deactiveren)"
      blnCheckProces = True
      lngTeller = 0
      ' De Cancel knop is op dit moment actief.
      ' Er wordt nu om de de zoveel tijd gecheckt of op deze
      ' knop wordt geklikt.
      Do While blnCheckProces And (lngTeller < 1000000)
         For int2OSTeller = 1 To 1000
            lngTeller = lngTeller + 1
            dbFloatinGetal = lngTeller * 2.65753 'Zomaar een getal
            'TextBoxen worden gerefreshed
            Text1 = dbFloatinGetal: Text2 = dbFloatinGetal
         Next int2OSTeller
         'TextBoxen worden gerefreshed
         ''Text1 = dbFloatinGetal: Text2 = dbFloatinGetal
         ' De DoEvents statement geeft de kans om
         ' de andere processen zijn werk te doen.
         ' Inclusief het klikken op de Cancel knop.
         DoEvents
      Loop
      blnCheckProces = False
      Command1.Caption = "Start Process (DoEvent activeren)"
      MsgBox " TextBoxen worden niet meer gerefreshed"
   End If
End Sub

Private Sub Form_Load()
   Command1.Caption = "Start Process (DoEvent activeren)"
End Sub

Na 22:00 uur ben ik niet meer present. Moet morgen vroeg op.
 
Was TV aan het kijken.

Alweer te laat gereageerd. Was wel aan het typen, maar moest even TV kijken.

Er zitten misschien een paar onzinnige programeertechnieken in, maar programmeren is een hobby van me, en het gaat bij mij in de eerste plaats om de functionaliteit en daarna pas om de schoonheid.

Gelijk heb je.

Niet altijd maak ik eerst een PSD alvorens te programmeren.

P.S. Je hoeft je source hier niet per sé te plaatsen. Het was maar een vraag. Misschien weet ik het probleem ook niet op te lossen. Je hebt Vaat nog, gelukkig. En natuurlijk ook anderen.
 
Was even iets vergeten te vermelden.

In de listing hierboven bij de For/Next-Statement, waar de
floating-point berekening staat, moet met jouw code worden
vervangen. Dan zal de weergave v.d. 2 tekstvelden niet de
uitkomst v.d. floating-point berekening zijn, maar de
weergave van een servernaam en zijn geheugen.

Verder moet " Do While blnCheckProces And (lngTeller < 1000000)" met "Do While blnCheckProces" worden vervangen.

Dus " And (lngTeller < 1000000)" komt te vervallen, het was immers voor het testen bedoeld.

(ik hoop, dat ik nu niet meer iets vergeet)



Mvg.
 
Laatst bewerkt:
Oookay, thanks!
Het is me nog niet helemaal duidelijk, maar ik kijk er straks op het werk naar.

Ik kan me nog steeds niet voorstellen dat er zoveel omheen geprogrammeerd moet worden om een textveld gevuld te krijgen als je een ander textveld gevuld hebt.

Ik hoop dat het duidelijker wordt als ik straks de code hier heb staan.

Later!

groet,
Dave.
 
Toch maar een voorbeeldje geven.

Hierbij een voorbeeld programmatje om te laten zien
dat 2 texboxen steeds de focus krijgen, terwij je in
dit zelfde programmatje een ander (klein) proces start.
Nog beter is dat je bijvoorbeeld iets brandt.

Als je het programmatje runt, klik dan eerst op de
onderste knop en hierna kun je op de middelste knop
enige malen blijven klikken. Je zult zien, dat de 2 textboxen
steeds de focus krijgen.

Het programmatje is opgebouwd uit de listing hierboven en
uit een eerder door mij gedeponeerde zip filetje (caption.zip)
m.b.t. de vraag "Label captions in externe file opslaan?".

Hopelijk werkt het programmatje bij jou ook.

Groetjes,

Dennis.
 

Bijlagen

Okay, hier de code.
Ik hoop dat je er iets mee kunt.
Alles maar even ingepakt in Zip.

groet,
Dave.

PS. ik zal de code die je gestuurd hebt zo bekijken. Thanks!
 

Bijlagen

Even een toelichting op het bovenstaande.
Ik heb een knop "Check memory" gemaakt, maar die is puur voor de test.
Eigenlijk moet die knop dus weg.
Als ik het bovenste textveld (Systemname) invul, dan moet automatisch het textveld "Memory" ingevuld worden.
Ik heb in de code, achter de knop "Check memory" de code staan om het interne geheugen te bepalen.
Maar ik weet dus niet waar ik die code moet plaatsen.

De code die jij me gaf Dennis werkt in pincipe goed, maar het programma heeft alleen actie als je op een knop drukt en niet als een textveld de focus verliest.

Dus het is het bijna, maar net niet helemaal.

groet,
Dave.
 
Code in cmd_Test in LostFocus van txt_System plaatsen.

Hallo Dave,

Sorry zo laat. Was bij een kennis.

Een heel mooi programma trouwens. Ik heb je programma niet grondig bekeken,
maar alleen meer op de vraag die je stelde geconcentreed.

Ik geef dus alleen het antwoord wat je wilde weten.
Volgens mij was het antwoord al gegeven.

Je moet de code die bij de button Test hoort in het
LostFocus event van de TextBox txt_System plaatsen.

Dit is alles! Heb zelf al getest en het werkt.


Groetjes.

P.S. Ik hoor het wel. Vind jammer, dat ik om 22:00 uur er niet meer ben.
Misschien morgen weer.
 
Voor de zekerheid nog wat informatie.

1) txt_System verliest zijn focus als je na het invullen v.e. servernaam
op de Tab-toets drukt. Of als je na het invullen in een ander invoerveld
d.m.v. een muisklikt ga begeven.

2) txt_System verliest zijn focus als je na het invullen v.e. servernaam
op de Enter-toets drukt, maar dan met de voorwaarde dat in de code ook een
verwijzing naar een ander control middels .SetFocus wordt gedaan.


1)LostFocus voorbeeld:
(Als je na het invullen van txt_System op de Tab-Toets drukt
of na het invullen een muisklik op een ander invoerveld geeft)

Code:
Private Sub txt_System_LostFocus()
Dim Memory As Integer
Dim Inp As String

Inp = txt_System.Text
Set LoginProfiles = GetObject("winmgmts:\\" & Inp).InstancesOf("CIM_PhysicalMemory")
   For Each Profile In LoginProfiles
      Memory = CInt(Profile.Capacity / 1024 / 1024)
      Mem = Mem + Memory
      Next
   If Mem > 0 Then
     txt_MB.Text = Mem
   End If
End Sub


2)KeyPress voorbeeld:
(Als je na het invullen van txt_System op de Enter-toets drukt)

Code:
Private Sub txt_System_KeyPress(KeyAscii As Integer)
If (KeyAscii = 13) And (txt_System <> "") Then
   Dim Memory As Integer
   Dim Inp As String

   Inp = txt_System.Text
   Set LoginProfiles = GetObject("winmgmts:\\" & Inp).InstancesOf("CIM_PhysicalMemory")
      For Each Profile In LoginProfiles
         Memory = CInt(Profile.Capacity / 1024 / 1024)
         Mem = Mem + Memory
      Next
      If Mem > 0 Then
         txt_MB.Text = Mem
      End If
   txt_Title.SetFocus
End If
End Sub

Groetjes.
 
Neem mij niet kwalijk als ik jou niet goed begrepen heb.

De code die jij me gaf Dennis werkt in pincipe goed, maar het programma
heeft alleen actie als je op een knop drukt en niet als een textveld de
focus verliest.

Bedoel je met "op een knop drukt" een enter geven op het invoerveld
v.d. servernaam? Als dit het geval is, dan was mijn antwoord (zie
KeyPress listing hierboven) reeds conform jouw vraag beantwoord.
De listing laat zien, dat na een enter het invoerveld zijn focus
verliest.

Bedoel je met "en niet als een textveld de focus verliest" wanneer
het invoerveld voor de servernaam reeds v.e. GELDIG servernaam is voorzien
het invoerveld automatisch zijn focus moet verliezen? Als dit het geval
is, dan moet de code met het Change event worden geprogrammeerd:
(Het .zip filetje die je gedownload hebt is in dit geval niet meer
van toepassing, omdat ik eerst dacht dat je één v.d. 2 invoervelden, servernaam
en geheugen, of beide steeds had willen refreshen. En aangezien hier sprake
zou zijn van meerdere actieve processen, is het gebruik van DoEvent
,of een timer, een must)

Onderstaande code heb ik getest en het werkt. Hopelijk is dit
wat je bedoelt.

Code:
Private Sub txt_System_Change()
  If txt_System = "DAVESVR001" Then
     Dim Memory As Integer
     Dim Inp As String

     Inp = txt_System.Text
     Set LoginProfiles = GetObject("winmgmts:\\" & Inp).InstancesOf("CIM_PhysicalMemory")
     For Each Profile In LoginProfiles
        Memory = CInt(Profile.Capacity / 1024 / 1024)
        Mem = Mem + Memory
     Next
     If Mem > 0 Then
        txt_MB.Text = Mem
     End If
     txt_Title.SetFocus 'Hier bepaal je zelf welk control de focus moet krijgen.
   Else
   MsgBox ("Servernaam " & txt_System & " bestaat niet"), vbCritical, _
   ("Ongeldige servernaam")

  End If
End Sub

Misschien ben ik wel hardleers hoor. Dus hoop ik toch dat je
dit bedoelt.

Groetjes.
 
Sorry.

Onderstaande weghalen a.u.b.

Code:
Else
   MsgBox ("Servernaam " & txt_System & " bestaat niet"), vbCritical, _
   ("Ongeldig servernaam")

Dus, zo moet het zijn:
Code:
Private Sub txt_System_Change()
  If txt_System = "DAVESVR001" Then
     Dim Memory As Integer
     Dim Inp As String

     Inp = txt_System.Text
     Set LoginProfiles = GetObject("winmgmts:\\" & Inp).InstancesOf("CIM_PhysicalMemory")
     For Each Profile In LoginProfiles
        Memory = CInt(Profile.Capacity / 1024 / 1024)
        Mem = Mem + Memory
     Next
     If Mem > 0 Then
        txt_MB.Text = Mem
     End If
     txt_Title.SetFocus 'Hier bepaal je zelf welk control de focus moet krijgen.
   End If
End Sub

P.S. Slechte nachtrust gehad.
 
Wow,
boel code ineens!

Goed man.

uuhm, even kijken.
Ik heb de code gebruikt met chr(13) voor de Enter toets: werkt prima.
Maar de tab toets doet het nog steeds niet.
En da's nu net de belangrijkste.

Het 2e stukje code dat je stuurde (met de change sub) zie ik nu pas staan (drukke dag gehad).
Ik heb de totale code maar weer eens naar huis gemaild, maar het is nog niet gearriveerd (wij hebben in Hengelo een heeeel snelle openbare vervoer :) )

Als het binnen is, dan zal ik de code implementeren.

BEDANKT !!!

groet,
Dave

PS. hardleers? Nee, behulpzaam is een beter woord!
 
Thanks voor je interpretatie van 'hardleers'

Het gebruik v.d. Tab-toets werkt wel. Heb de code hierboven
reeds gegeven. Te gebruiken event voor txt_System is LostFocus.

Hierbij nogmaals.

Code:
Private Sub txt_System_LostFocus()
Dim Memory As Integer
Dim Inp As String

Inp = txt_System.Text
Set LoginProfiles = GetObject("winmgmts:\\" & Inp).InstancesOf("CIM_PhysicalMemory")
   For Each Profile In LoginProfiles
      Memory = CInt(Profile.Capacity / 1024 / 1024)
      Mem = Mem + Memory
      Next
   If Mem > 0 Then
     txt_MB.Text = Mem
   End If
   txt_Title.SetFocus 'hoeft niet per sé, want de Tab-toets
                      'doet dit automatisch, omdat de Tab index 2 is.
                      '(Zie property venster voor txt_Title)
End Sub

Mvg.
 
Je hebt 2 omgevingen, vandaar.

Ik zie in je programma, dat men via het menu Options naar 2 verschillende
omgevingen kunt gaan, nl: Custom - en Standaard environment. In dit geval
moet bij bovenstaande listing "txt_Title.SetFocus" weggelaten worden, omdat
txt_Title in deze omgeving niet bestaat.

Groet.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan