Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Info Coronavirus/Vaccinare vs Fake News

Compatibilitate Switch - Telefon ...

Alimentatoarele originale au prot...

Windows 11 22H2 isi da reset sing...
 C.E.R.F. '96

Sfat convertire mini caseta camer...

Overwatch2

Anul asta vinerea neagra chiar va...
 Izolare balcon deasupra camerei

banda alergat acasa

Quartier Azuga - str. Azuga - zon...

Reprezentanța B.B.C. (Brown, Bove...
 Analizele Medicale, intre fericir...

Recomandare carcasa si sursa cu pwm

Cum s-ar putea face plafonarea pr...

Preparing automatic repair diagno...
 

MsgBox in Timer,VB6

- - - - -
  • Please log in to reply
46 replies to this topic

#1
paull

paull

    Junior Member

  • Grup: Members
  • Posts: 47
  • Înscris: 26.01.2004
Va salut,

Am scris un programel care urmareste valorile din 3 textboxuri,verifica,daca sunt diferite fata de valoarea de la initializare(0),daca da, atunci se genereaza un event.
Eventul generat va apela un script care genereaza un sunet folosind buzzerul calculatorului,si afiseaza un mesaj personalizat pentru fiecare textbox.
Valorile care sunt afisate in textboxuri sunt primite via OCX de la un PLC.Problema la care m-am intepenit este ca atita timp cit  orice textbox are valoarea necesara pentru event atunci se emite sunet in permamenta si mesajele umplu ecranul.
E logic,doar am pus rutina intr-un timer...dar eu vreau sa se afiseze o singura data mesajul specific acelui textbox si sa se emita doar odata sunetul.
Desigur ca am incercat sa folosesc 3 timere pentru fiecare textbox,dar totusi,voi avea 200 de textboxuri,asta insemnind 800 de timere,deci va consuma ceva resurse aplicatia,nu mai spun la cum va arata codul si cit va dura sa-l setez.
Daca aveti vreo idee care sa ma ajute,va rog postati.
Multumesc.

Codul arata asa:

Public Sub TimerGeneral_Timer()
  If (Text0.Text > 55) Then
  Text0.BackColor = &HFFFF&   'galben
  Shell ("c:/byp.bat")
  MsgBox ("Eveniment nou, TempCPU!!!")
  Else
  If (Text1.Text > 0) Then
  Shell ("c:/byp.bat")   
  MsgBox ("Eveniment nou, CycleFault!!!")
  Frame1.BackColor = &HFF& 'rosu
  Text1.BackColor = &HFFFF&   'galben
  Label1.BackColor = &HFF& 'rosu
  Else
  If Text2.Text = 1 Then
  Frame1.BackColor = &HFF& 'rosu
  Label1.BackColor = &HFF& 'rosu
  Text2.BackColor = &HFFFF&   'galben
  Shell ("c:/byp.bat")
  MsgBox ("Eveniment nou,M2H!!!")
  Else
  If (Text0.Text = 0) Then
  Frame1.BackColor = &H80000004  ' gri  'Frame & Boxes in Grey, Communication with PC lost
  Label1.BackColor = &H80000004  ' gri
  Text0.BackColor = &H0& 'negru
  Text1.BackColor = &H0& 'negru
  Text2.BackColor = &H0& 'negru
  Text3.BackColor = &H0& 'negru
  Else
  Frame1.BackColor = &HC000& 'verde   'Frame & Boxes reset color
  Label1.BackColor = &HC000& 'verde
  Text0.BackColor = &H0& 'negru
  Text1.BackColor = &H0& 'negru
  Text2.BackColor = &H0& 'negru
  Text3.BackColor = &H0& 'negru
  End If
  End If
  End If
  End If
  Text0.Text = ReadByte(&H4020&, 1000)'adresa de unde vine valoarea in textbox0
  Text1.Text = ReadByte(&H4020&, 1001)
  Text2.Text = ReadByte(&H4020&, 1002)
  Text3.Text = ReadByte(&H4020&, 1003)
DoEvents
End Sub

#2
claz

claz

    Active Member

  • Grup: Members
  • Posts: 1,861
  • Înscris: 10.06.2005
Foloseste Select Case

#3
paull

paull

    Junior Member

  • Grup: Members
  • Posts: 47
  • Înscris: 26.01.2004
Select Case ca sa nu mai folosesc Ifurile,dar nu rezolva problema.

#4
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 19,213
  • Înscris: 24.02.2006
-folosesti o variabila globala pe care o initializezi cu 0
-cand apare event-ul intai verifici daca variabila e zero; daca este, pui in ea o valoare ( de exemplu 10) si apelezi scriptul pentru sunet; daca nu e zero, decrementezi variabila (avand grija sa nu-i dai valori negative) fara sa mai generezi sunetul

in felul asta sunetul (si mesajul) se vor afisa in cel mai rau caz din x in x secunde, unde x = valoarea (acel 10) * durata timer-ului

#5
real32

real32

    Active Member

  • Grup: Members
  • Posts: 1,747
  • Înscris: 02.07.2006
De ce ai nevoie de sute de timere si de ce nu folosesti evenimentele generate de OCX (Communications Control)?

#6
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 27,939
  • Înscris: 10.08.2005
de ce nu subclasezi textbox, si verifici chesti asta doar cand se schimba text-ul?


Quote

Problema la care m-am intepenit este ca atita timp cit  orice textbox are valoarea necesara pentru event atunci se emite sunet in permamenta si mesajele umplu ecranul.
fiecare eveniment are un atribut ACK (acknowledge)
mesajul de alarma apare o singura data
sunetul de alarma apare pana cand apesi (schimbi starea) lui ACK

Edited by MarianG, 08 March 2016 - 22:36.


#7
real32

real32

    Active Member

  • Grup: Members
  • Posts: 1,747
  • Înscris: 02.07.2006
Sau poti verifica daca s-a modificat o anumita caseta de text si doar atunci sa generezi semnalul sonor. Poti sa folosesti functii API pentru sunete (PlaySound, Beep, etc).

Private Const SND_ASYNC = &H1 '  play asynchronously
Private Const SND_FILENAME = &H20000 '  name is a file name
Private Const SND_SYNC = &H0 '  play synchronously (default)

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long

Private Sub Text1_Change()
PlaySound "C:\WINDOWS\MEDIA\SOUND.WAV", ByVal 0&, SND_FILENAME Or SND_ASYNC
End Sub

Daca datele vin prea repede poti folosi un timer pentru a intarzia generarea semnalului sonor. Spre exemplu sa nu sune daca nu au trecut cel putin cinci secunde de la ultimul semnal. Se poate face (aproape) orice.

Edited by real32, 08 March 2016 - 23:34.


#8
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,135
  • Înscris: 24.02.2007
E greu de explicat in cuvinte frumoase cat de gresita e arhitectura prezentata in primul post.

Eu as face asa:
  • Una bucata clasa responsabila de achizitia datelor din exterior.
  • Aceasta ofera un eveniment de genul Public Event onchange(ByVal key As String, ByVal value as Integer)
  • Intern clasa tine minte valoarea precedenta incat sa initieze evenimentul doar atunci cand noua valoare e diferita de cea veche
  • Pe form-ul tau declari o instanta a acelei clase si te abonezi la acel eveniment. Variabila key (poate fi orice, nu neaparat String) oferita o folosesti ca sa distingi ce reprezinta valoarea si in care textbox ar trebui s-o afisezi, iar value e noua valoare. Cand vrei, mai dai play si la cate un sunet, daca vrei (tot din VB6 desigur, nu te complici cu bat-uri, salvate si pe cai hard-coded).
Punct de plecare, fiindca probabil suna chineza ce am scris mai sus: http://www.developer...ual-Basic-6.htm

Edited by dani.user, 09 March 2016 - 15:16.


#9
real32

real32

    Active Member

  • Grup: Members
  • Posts: 1,747
  • Înscris: 02.07.2006

View Postdani.user, on 09 martie 2016 - 10:32, said:

  • Intern clasa tine minte valoarea precedenta incat sa initieze evenimentul doar atunci cand noua valoare e diferita de cea veche
Evident ca nu este nici necesar nici suficient sa retina valoarea precedenta. Chiar daca noua valoare nu este diferita de cea veche semnificatiile pot fi totusi diferite. Ar trebui doar sa initieze evenimentul cand se primeste ceva pe portul serial. In plus nu trebuie sa inventezi de fiecare data o roata noua. Exista OCX-ul respectiv (parca MSCOMM32.OCX) pentru comunicatia pe portul serial, sunt documentate toate metodele si o multime de evenimente, printre care si comEvReceive (Received RThreshold number of characters. This event is generated continuously until you use the Input property to remove the data from the receive buffer). Acum depinde de implementarea protocolului de comunicatie daca folosesti sau nu evenimentul respectiv.

#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,135
  • Înscris: 24.02.2007
N-am zis reinventeze nici o roata noua. Componentele gata facute pentru interatiune cu port serial n-are decat sa le foloseasca, doar sa le izoleze de UI. Daca n-are nevoie de valoarea precenta, cu atat mai simplu.

UI-ul trebuie doar sa stie ca a avut loc un eveniment (cu un nume semnificativ si o valoare care am inteles ca o afiseaza pe ecran).

#11
paull

paull

    Junior Member

  • Grup: Members
  • Posts: 47
  • Înscris: 26.01.2004
Va multumesc pentru indicatii,sunt foarte multe informatii noi pentru mine.Voi incerca sa implementez cele sugerate in functie de timpul liber.

#12
paull

paull

    Junior Member

  • Grup: Members
  • Posts: 47
  • Înscris: 26.01.2004
Va salut,am implementat un array de textbox,e foarte fain de lucrat asa.Am implementat si Select Case pentru 3 textboxuri unde ma intereseaza daca e 0 sau 1 valoarea folosind evenimentul Changed pe textbox.Programul este mult mai aerisit gratie sugestiilor voastre.Imi bat capul cu chestiunea asta:mai am un textbox si vreau sa generez un eveniment daca trece peste o anumita valoare,am incercat cu Case 0, is > 55  dar nu evalueaza conditia,o vede adevarata tot timpul.Dati-mi un exemplu va rog sa vad unde gresesc.

#13
paull

paull

    Junior Member

  • Grup: Members
  • Posts: 47
  • Înscris: 26.01.2004
Am rezolvat
Private Sub Text1_Change(Index as Integer)
Select Case Index
Case 1
Msgbox("bla bla")
.....
Case 8
Msgbox("bla bla")

Dim Numbers as integer
Numbers=Text1(0)
Case Is > 55
Msgbox(" bla bla > 55")
Case Is < 55
Msgbox("bla bla < 55")
End Select
End Sub

#14
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 27,939
  • Înscris: 10.08.2005
Case Select Index ( adica te intereseaza care casuta din array s-a schimbat )

Spune clar ce incerci sa faci cu acel array.

#15
paull

paull

    Junior Member

  • Grup: Members
  • Posts: 47
  • Înscris: 26.01.2004
Deci,voi avea 768 de textboxuri,TextBox1(0) la TextBox1(768).Cite 4 Textboxuri intr-un Frame,care si ele vor fi in array(192 bucati).In primul textbox al fiecarui Frame va fi afisata o variabila dintr-un array primit via Ads.Ocx.Variabila poate avea valoare 0 la 70.Daca e mai mare de 0 va schimba culoarea Frameului respectiv in verde altfel in gri,cu conditia ca celelalte 3 textboxuri sa fie 0.Daca primul textbox e mai mare de 55 atunci se afiseaza mesaj si culoarea trxtboxului se schimba in galben,Frame-ul se face rosu.Identic si pt celelalte 3 textboxuri.Daca oricare din ele > 0 atunci se schimba in galben textboxul respectiv,Frame-ul se face rosu,si se genereaza cite un mesaj personalizat tintit catre acel textbox.Avind 192 de Frameu-ri trebuie sa vad care are valori schimbate,chiar si dupa confirmarea mesageboxuri-lor.Cred ca m-am exprimat din topor,dar e destul de simplu,daca fac un Frame cu 4 textboxuri sa mearga ok,restul e doar copy/paste.

#16
paull

paull

    Junior Member

  • Grup: Members
  • Posts: 47
  • Înscris: 26.01.2004
Nu inteleg de ce evalueaza de 8 ori clauza text1(0).Afiseaza de 8 ori mesajul de dupa Case is > 55.

#17
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,135
  • Înscris: 24.02.2007
Ti-a scapat vreun break?

#18
paull

paull

    Junior Member

  • Grup: Members
  • Posts: 47
  • Înscris: 26.01.2004
Cite clause in Select Case pot avea fara sa "beneficiez" de scurt-circuit,avind in vedere ca trebuie sa evaluez 768 de textboxuri?Sa grupez cite 50 de textboxuri ?Pina acum am testat doar cu 8 textboxuri.Se poate face o monitorizare a clauzelor?

Am cautat pe net info insa nu se spune cite clauze maxim pot fi,doar atentioneaza ca poate aparea "scurt-circuit"

Anunturi

Neurochirurgie minim invazivă Neurochirurgie minim invazivă

"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv.

Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate