кillall, много ти благодаря за идеята. За момента обаче реших въпроса по друг начин и засега изглежда, че работи. Просто извиквам допълнителни форми (правя ги прозрачни и точно припокривам началната), върху които кликвам и прхвърлям координатите получени там в основната форма.
Ти много ми помогна с обяснението по-горе относно прехвърлянето от една форма в друга. Това без твойта помощ нямаше да го разбера. Сега бих искал да те попитам във връзка с един друг, струва ми се, подобен проблем.
Искам да получа от устройство данни в компактен стринг, да речем “ OH 10.37kOhm”, за да мога след това да извлека от него substrig с цифровите данни и да си ги ползвам после в програмата. За съжаление, засега не мога да получа този компактен стринг. Получавам само една последователност от отделни знаци (14 на брой) и с появяването на всеки нов знак предишният изчезва. Не мога да ги събера нито в масив нито по някакъв друг начин. Единственото, което досега успях да направя е следното, ползвайки exception:
Imports System
Public Class Form1
Inherits System.Windows.Forms.Form
<Windows Form Designer generated code>
' @@@@@@@@@@@@@@@@@@@@
' MAIN PART OF CODE '
' @@@@@@@@@@@@@@@@@@@@
Private Sub rS232Comms1_DataRxEvent(ByVal sender As System.Object, ByVal e As RS232.RxEventArgs) Handles RS232Comms1.DataRxEvent
Dim LengthOfString As Integer
Dim oEncoder As New System.Text.ASCIIEncoding
Dim oEnc As System.Text.Encoding = oEncoder.GetEncoding(1252)
Dim millivolts0 As Double
Dim TheNumber As Double
Dim Units As String
Dim byteValueString As String
Dim Yvalue As Double ' This is the desired numerical value
'TextBox1.Clear()
' This transforms the bytes sent from the device into ASCII characters.
' See the Dims above to understand what happens
Dim ii As Integer
For ii = 0 To 13 ' The Byte received from the device consists of 14 symbols
RS232Comms1.SetDTR()
byteValueString += oEnc.GetChars(e.data)
Next ii
' This is where we parse the string byteValueString into two parts
' corresponding to the actual value (still as String) and the unit
Try
TheNumber = byteValueString.Substring(3, 6)
Units = byteValueString.Substring(9, 4)
Catch ex As Exception
Finally
End Try
' This is where we transform the above-parsed parts of the string byteValueString
' into actual numerical value and a unit
Try
' This gives the actual numerical VALUE
Yvalue = CDbl(TheNumber) '
' This places in the TextBox1 the actual numerical VALUE + the UNIT
TextBox1.AppendText(CStr(Yvalue) & Units & Chr(13) & Chr(10))
Catch ex As Exception
Finally
End Try
End Sub
' @@@@@@@@@@@@@@@@@@@@@@@@@@@
' INITIALIZE AND OPEN PORT '
' @@@@@@@@@@@@@@@@@@@@@@@@@@@
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
InitializeComponent()
RS232Comms1.CloseComms()
RS232Comms1.OpenComms()
RS232Comms1.WriteBlock(&H12)
End Sub
' @@@@@@@
' QUIT '
' @@@@@@@
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
RS232Comms1.CloseComms()
TextBox1.Clear()
TextBox1.AppendText("Cya ...")
Me.Dispose()
End Sub
End Class
Този код обаче е почти неизползваем защото само осигурява чрез толкова много усилия, представянето на данните на екрана. При това, програмата изминава някакъв много усукан път. Най-напрд тя прави една пълна For-Next примка, не получава смислен отговор, предизвиква exception и прави For-Next примката втори път. И това става всеки път, когато програмата се стартира. Доброто е, ако това може да е повод за радост, че всичко това го прави възпроизводимо.
Като резултат, следното се изписва на екрана за, да речем, оригиналния стринг “ OH 10.37kOhm”:
0
10.37kOhm
Както виждаш, има винаги една начална 0, която обърква работата и от която не мога да се отърва.
Понататък – четенето от устройството трябва да се повтаря в случайни моменти. Да не говорим, че получените данни трябва да са качествени и да се разчита, че винаги ще се получат, когато се обърнем към устройството. Горният код, въпреки че като че ли работи, изглежда безполезен за такава задача – началната нула, която се получава всеки път обръщайки се към устройството прави получените данни неизползваеми (не знам как да я parse-на тази нула). По-нататък – нито таймер може да накара горната програма да повтори обръщането си към устройството, нито горната sub може да бъде извикана като независима sub от дт страна на друга sub. Опитах се да поставя горния код в друга форма – Form2 – и да го извиквам от Form1, но началната 0 и някакви неизвестни за мен проблеми при затварянето на Form2 (да не забравяме, че Form2 трябва да се извиква многократно) направи този ми опит безуспешен.
Горното, е една илюстрация на по-общи проблеми, които имам с VB.NET – как се осъществява разклоняване във Visual Basic .NET? Някои subs могат да бъдат извиквани от страна на други subs, но други subs, подобно на тази в горния код, са някакси присъщи и не могат да бъдат извиквани от други събрутини. Също така, вътре в събрутината някои процедури изглежда, че работят последователно, други паралелно. Как е възможно, например, горната For-Next примка да не работи както се очаква и вместо да генерира в резултат на едно изпълнение компактен <byteValueString>, тя всъщност завършва със създаване на сума (14 долепени еднакви символа) от само последния символ от оригиналния “ OH 10.37kOhm” стринг?
|