Scriere "unica" in listobx, event monitoring

#1
Posted 19 February 2019 - 16:46

Salutare,
Am urmatorul cod de la care astept sa scrie in listbox o singura data daca evenimentul s-a produs.Aceasta pina la restartarea aplicatiei. For t = 351 To 375 If Value(t) > "55" Then 'Prag Critic' Value(t).BackColor = &HFF& 'Rosu' Value(t).ForeColor = &HFFFF& 'Galben' FormBase.ListErrors.AddItem ("P-") & Value(t).Tag & (" Temperatura ulei ") & Now Else If Value(t) < "54.9" And Value(t) > "50" Then 'Prag Avertizare' Value(t).BackColor = &HFFFF& 'Rosu' Value(t).ForeColor = &H0& 'negru' Else Value(t).BackColor = &HC0FFC0 'culoare baza' Value(t).ForeColor = &H80000007 'Negru' End If End If Next t Din cauza ca il am intr-un timer scrie periodic in listbox cu frecventa ceasului.Am citit pe net ca o varianta ar fi sa folosesc o variabila booleana si sa o seteze True sau False daca mesajul a fost scris in Listbox.In timer l-am pus deoarece trebuie sa scaneze periodic in acel array(351-375) si daca a fost indeplinita conditia sa o posteze in listbox o singura data si apoi sa o ignore pina cand se restarteaza aplicatia. Aici e buba,nu stiu de unde sa incep,banuiesc ca trebuie un array boolean.dar nu stiu cum sa le atribui... Dati-mi un colt de unde sa o apuc... ![]()
Edited by MarianG, 19 February 2019 - 19:21.
|
#2
Posted 19 February 2019 - 18:22

Nu mă pricep la Visual Basic dar presupun că trebuie să adaugi o condiție pe care o evaluezi de fiecare dată la scanare. Sau 2, una pentru fiecare prag - dacă am înțeles bine.
Adică, declari la început și atribui valoarea 'False': Dim pragCriticAtins As Boolean = False Dim pragAvertizareAtins As Boolean = False Apoi, unde verifici valorile pentru 'Prag Critic' / 'Prag Avertizare', mai adaugi o condiție, ca valoarea booleană asociată să fie False. Dacă da, se execută blocul respectiv și imediat se atribuie 'True'. La următoarea verificare, fiindcă variabila va avea valoarea 'True', codul din If nu se va mai executa. Dim pragCriticAtins As Boolean = False Dim pragAvertizareAtins As Boolean = False For t = 351 To 375 If Value(t) > "55" And pragCriticAtins = False Then 'Prag Critic pragCriticAtins = True Value(t).BackColor = &HFF& 'Rosu Value(t).ForeColor = &HFFFF& 'Galben FormBase.ListErrors.AddItem ("P-") & Value(t).Tag & (" Temperatura ulei ") & Now Else If Value(t) < "54.9" And Value(t) > "50" And pragAvertizareAtins = False Then 'Prag Avertizare pragAvertizareAtins = True Value(t).BackColor = &HFFFF& 'Rosu Value(t).ForeColor = &H0& 'negru Else Value(t).BackColor = &HC0FFC0 'culoare baza Value(t).ForeColor = &H80000007 'Negru End If End If Next t Edited by pexCom, 19 February 2019 - 18:24. |
#3
Posted 19 February 2019 - 19:24

Ce inseamna eveniment, avand in vede limbajul avem o neintelegere.
https://docs.microso...event-statement ' Declare an event at module level.' Event LogonCompleted(ByVal UserName As String) Sub Logon(ByVal UserName As String) ' Raise the event.' RaiseEvent LogonCompleted(UserName) End Sub apoi lesi EventHandler-ul sa se ocupa de adaugare si eliminare din lista. situatie reala in care valoarea poate creste, se inregistreaza in lista, apoi scade, factori externi sau eroare de citire tie ti se modifica lista, se inregistreaza defectul dar cand situatia revine la normal nu-ti dispare din lista prin urmare cand se intampla a doua oara nu mai esti avertizat Edited by MarianG, 19 February 2019 - 19:41. |
#4
Posted 20 February 2019 - 11:43

Salut,
@MarianG-ai dreptate,am folosit termenul de eveniment in loc de conditie indeplinita. Pina la urma,programul asta trebuie sa scaneze in intervalul 351 -375 si daca conditia este indeplinita pentru oricare pozitie sa arunce in ListBox mesajul cu indexul aferent(t) In continuare se scaneaza dupa alte conditii in acelasi interval. |
#5
Posted 20 February 2019 - 15:01

pai asta iti spun, programul tau scaneza starea unui sistem. (WatchDog)
Cand se modifica o conditie apare o pre-alarma sau o alarma intr-un Gestionarea alarmelor trebuie sa o faca altcineva, o alta parte din program. Ce element este "value"? |
#6
Posted 20 February 2019 - 15:32

value este un nume extrem de neinspirat, value poate fi o proprieate a unui element din fereastra
cand numeste in element value, se ajunge la value.value Private Sub value_Change(Index as integer) Select Case Index Case 351 To 375 If Value(Index) > "55" Then 'raiseEvent Prag Critic' Value(t).BackColor = &HFF& 'Rosu' Value(t).ForeColor = &HFFFF& 'Galben' ElseIf Value(t) < "54.9" And Value(t) > "50" Then 'raiseEvent pre-Avertizare' Value(t).BackColor = &HFFFF& 'Rosu' Value(t).ForeColor = &H0& 'negru' Else 'raiseEvent situatie normala' Value(t).BackColor = &HC0FFC0 ' culoare baza' Value(t).ForeColor = &H80000007 'Negru' End If End Select End SubCe alte conditii in acelasi interval ? Edited by MarianG, 20 February 2019 - 15:33. |
#7
Posted 20 February 2019 - 15:45

Salut,
In scurt timp voi posta tot programul. practic e un OPC server conectat la citeva sute de calculatoare si monitorizeaza niste praguri care daca sunt depasite arunca un mesaj in listbox. value este numele unui array de textboxuri in care sunt afisate datele culese. Nu am cum sa atasez fisierul. Edited by seichter, 20 February 2019 - 15:49. |
#8
Posted 20 February 2019 - 15:57

eu cred ca ar trebui sa angajezi pe cineva care sa-ti rezolve aceste programe, in fond pentru asta angajezi programatori. Sa stii ca nu ai voie sa faci public cod fara acordul propietarilor.
Daca cineva malefic iti citeste codul poate crea un tool ca sa profite de bugurile codului si sa iti distruga toata reteaua sa-ti acapere retea si apoi sa-ti ceara bani tot timpul ca sa te lase s-o folosesti. Angajaza-ti un programator sau echipa de programatori cu clauza NDA si lasa-i pe ei sa rezolve aceste probleme , si nu tu care nu esti in domeniul programarii. |
#10
Posted 20 February 2019 - 19:09

Cea mai neaosa varianta care imi vine si o voi testa maine:
Codul actual cu variabila t scaneaza dupa interval si arata in rosu unde conditia a fost indeplinita.<br> <br> Pentru fiecare conditie pentru care vreau mesaj :<br> Case Value(351).BackColor= rosu<br> ListBox.AddItem(P-1 Temperatura Ulei)<br> Case Value(352).BackColor=rosu<br> ListBox.AddItem(P-2 Temperatura Ulei) Edited by seichter, 20 February 2019 - 19:10. |
|
#11
Posted 20 February 2019 - 20:14

Case Value(351).BackColor= rosu ListBox.AddItem(P-1 Temperatura Ulei)ce vrea sa fie asta ? |
#12
Posted 20 February 2019 - 20:18

Codul,fara select,end case,etc.Ideea.....
Crezi ca nu va merge corect? Testeaza daca s-a schimbat culoarea textboxului care ma intereseaza si plaseaza mesajul aferent in listbox. Voi seta ca eveniment on_change la acel textbox .Aceasta inseamna ca testeaza conditia de fiecare data cand se schimba valoarea din acel textbox. Edited by seichter, 20 February 2019 - 20:25. |
#13
Posted 20 February 2019 - 20:32

datele iti modifica interfata, nu invers,
nu iei decizii de business cand se modifica interfata da, fix asta inseamna, testezi conditile de alarma doar cand se schimba valoarea, nu trebuie sa scanezi periodic |
#14
Posted 27 February 2019 - 13:17

Am reusit sa o rezolv.....ideea era sa verific daca in listbox s-a scris mesajul specific,cu ajutorul variabilelor booleene se permite sau nu scrierea mesajului.
Functioneaza asa cum am dorit. Multumesc pentru indrumari ![]() Dim ListaMsg(1 To 6) As String Dim Msg(1 To 6) As String Dim Valoare(1 To 6) As Variant Dim blndublura(1 To 6) As Boolean Public Sub StergereErori_Click() ListErrors.Clear blndublura(1) = False blndublura(2) = False blndublura(3) = False blndublura(4) = False blndublura(5) = False blndublura(6) = False End Sub Public Sub Timer1_Timer() P1 P2 P3 P4 P5 P6 valoare(1) = value(1) valoare(2) = value(2) valoare(3) = value(3) valoare(4) = value(4) valoare(5) = value(5) valoare(6) = value(6) msg(1) = "P-1 Temperatura ulei " & Now msg(2) = "P-2 Temperatura ulei " & Now msg(3) = "P-3 Temperatura ulei " & Now msg(4) = "P-4 Temperatura ulei " & Now msg(5) = "P-5 Temperatura ulei " & Now msg(6) = "P-6 Temperatura ulei " & Now End Sub Public Sub P1() For a = 1 To 5 If valoare(1) > "60" Then 'Prag Critic' Listamsg(1) = msg(1) For x = 0 To ListErrors.ListCount If ListErrors.List(x) = Listamsg(1) Then blndublura(1) = True Exit For End If Next x If blndublura(1) = False Then ListErrors.AddItem (msg(1)) End If End If Next a End Sub Public Sub P2() For a = 1 To 5 If valoare(2) > "60" Then 'Prag Critic' Listamsg(2) = msg(2) For x = 0 To ListErrors.ListCount If ListErrors.List(x) = Listamsg(2) Then blndublura(2) = True Exit For End If Next x If blndublura(2) = False Then ListErrors.AddItem (msg(2)) ' & Now' End If End If Next a End Subetc... ![]()
Edited by MarianG, 28 February 2019 - 12:11.
|
#16
Posted 28 February 2019 - 10:49

a este o variabila in care este stocata valoarea contorului din bucla for.
Este adevarat ca trebuia sa-l declar la inceputul programului. |
#17
Posted 28 February 2019 - 12:08

Public Sub P1() For a = 1 To 5 If valoare(1) > "60" Then 'Prag Critic' Listamsg(1) = msg(1) For x = 0 To ListErrors.ListCount If ListErrors.List(x) = Listamsg(1) Then blndublura(1) = True Exit For End If Next x If blndublura(1) = False Then ListErrors.AddItem (msg(1)) End If End If Next a End Subsi la ce ajuta? Edited by MarianG, 28 February 2019 - 12:09. |
#18
Posted 28 February 2019 - 15:23

Ai mare dreptate, nu are nici o noima acolo.Am scos liniile de cod respective.
Ce-i drept....este folosit in alta parte for a =1 to 200 if value(a) >"60" then bla bla bla else la la la end if next a Multumesc Edited by seichter, 28 February 2019 - 15:24. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users