廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 3101 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
tk7545
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[Basic][求助] 利用 Timer 進行 data 的累加計算【尚未解決】
各位大大好:

       小弟有一個Timer的問題想要請教大家,直接切入主題

=======================================================

假設我有一.data檔(筆記本 ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容



獻花 x0 回到頂端 [樓 主] From:台灣教育部 | Posted:2010-01-26 10:05 |
ebolaman 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎

級別: 副版主 該用戶目前不上站
版區: 程式設計
推文 x38 鮮花 x458
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

這是我剛剛做的,參考一下吧 表情

我把檔案設定在同資料夾下的 Pos.txt 裡面

格式是  X,Y  例如

1,4
2,5
3,6

不過既然你給三個數值,那麼程式可能就會繪出兩條以上的線,取決於在 Pos.txt 的資料行數有幾個 - 1

先創建 一些元件在 Form1 ,以下格式是  元件:名稱

按鈕(CommandButton):CMD_OK
文字框(TextBox):Text_See
計時器(Timer):Timer_MoveLine
標籤(Label):Label_Slope
圖片(PictureBox):Pic

還有要一個模組

不過我有把專案上傳,可以直接下載專案來看

我是還有加幾個東西,例如斜率的顯示、座標的顯示,那些都可以刪除



以下在  MainForm 表單:

複製程式
 

Option Explicit 

Dim PtX As New Collection 
Dim PtY As New Collection 

Dim Dis As Long 
Dim DataCount As Long 
Dim TimeAddUp As Long 
Dim TimeSep As Long 

Dim OriX As Long 
Dim OriY As Long 

'Made By EbolaMan, 哪裡不懂就回復吧 

Private Sub CMD_OK_Click() 

ApplyPos 

Timer_MoveLine.Enabled = True 

RefreshStatus '@@@@ Test Sub 

End Sub 

Private Sub Form_Initialize() 

'-------------- Ini. Constant Obj -------------- 

Set fso = CreateObject("Scripting.FileSystemObject") 


End Sub 

Private Sub Form_Load() 

Dim tempS As String 
Dim txtpath As String 
Dim ArrText() As String 
Dim i As Long 

'-------------- Set Program-Local Array Data ------------- 


'## Way1 這是不用開啟資料夾下的檔案就可以直接繪圖的程式碼,與底下的擇一,不過依照你的方法,應該是要下面那種 

'PtX.Add 1 
'PtX.Add 2 
'PtX.Add 3 
' 
'PtY.Add 4 
'PtY.Add 5 
'PtY.Add 6 


'## Way2 開啟資料夾下的檔案讀取 POS 值 

txtpath = App.Path & "\Pos.txt" '讀取資料夾下的 Pos.txt ,可改 

tempS = LoadData(txtpath) 

ReDim Pt(0, 1) 
If tempS <> "" Then 
ArrText = Split(tempS, vbCrLf) 

For i = 0 To UBound(ArrText) 
LoadNewPos Trim(ArrText(i)) 
Next i 

End If 


'------------- Ori Pos --------------- 
If DataCount <> 0 Then 
OriX = PtX.Item(1) 
OriY = PtY.Item(1) 
End If 


'---------------- Ini. Variable --------------- 
Dis = 100 '為避免點的值太小,加入 Distance 來增加點與點的距離,此項設 1 則是原本的點值,越大點的距離越大 

'DataCount = 3 '與 Way1 連用,Way 1 失效此也失效 

TimeAddUp = 0 

TimeSep = 1000 '每次更新 LINE 時間的間隔 

'--------- Ini. Obj --------- 

With Pic 

.AutoRedraw = True 
.DrawWidth = 2 

End With 

Timer_MoveLine.Interval = TimeSep 


End Sub 

Public Sub ApplyPos() 

Dim i As Long 

Dim tempX As Double 
Dim tempY As Double 

Pic.Cls 
For i = 1 To DataCount - 1 
'畫出實線 
Pic.DrawWidth = 2 
Pic.DrawStyle = 0 
Pic.Line (PtX.Item(i) * Dis, PtY.Item(i) * Dis)-(PtX.Item(i + 1) * Dis, PtY.Item(i + 1) * Dis), RGB(0, 0, 0) 

'畫出原點到最近實線 
Pic.DrawWidth = 5 
Pic.PSet (OriX * Dis, OriY * Dis), RGB(10, 120, 240) 

'畫出原點 
Pic.DrawWidth = 1 
Pic.DrawStyle = 2 
Pic.Line (OriX * Dis, OriY * Dis)-(PtX.Item(i) * Dis, PtY.Item(i) * Dis) 

'計算斜率 
tempX = (PtX.Item(i + 1) - PtX.Item(i)) 
tempY = (PtY.Item(i + 1) - PtY.Item(i)) 
If tempY <> 0 Then 
Label_Slope = "Slope = [Selected] " & Format(tempX / tempY, "0.0##") 
Else 
Label_Slope = "Slope = [Selected] No " 
End If 

tempX = (PtX.Item(i) - OriX) 
tempY = (PtY.Item(i) - OriY) 
If tempY <> 0 Then 
Label_Slope = Label_Slope & " [From Ori] " & Format(tempX / tempY, "0.0##") 
Else 
Label_Slope = Label_Slope & " [From Ori] No " 
End If 

Next i 

End Sub 

Public Sub ApplyNewLinePos(ByVal Ind As Long, ByVal Value As Long) 

Dim i As Long 

For i = 1 To DataCount 
ResetValue Ind, i, IIf(Ind = 0, PtX.Item(i), PtY.Item(i)) + Value 
Next i 

End Sub 

Private Sub Timer_MoveLine_Timer() 

TimeAddUp = TimeAddUp + 1 'Before 

ApplyNewLinePos 0, 1 
ApplyNewLinePos 1, 1 


ApplyPos 

RefreshStatus '@@ Test Sub 


End Sub 

Public Sub LoadNewPos(ByVal S As String) 

Dim m As Long 
Dim Pos_X As Long 
Dim Pos_Y As Long 

On Error Resume Next 

If Trim(S) = "" Then Exit Sub 

m = InStr(1, S, ",") 

Pos_X = Trim(Left(S, m - 1)) 
Pos_Y = Trim(Right(S, Len(S) - m)) 


PtX.Add Pos_X 
PtY.Add Pos_Y 

DataCount = DataCount + 1 

End Sub 

Public Sub ResetValue(ByVal X_or_Y_0_or_1 As Integer, ByVal Floor As Long, ByVal Value As Long) 

On Error Resume Next 

If X_or_Y_0_or_1 = 0 Then 

PtX.Remove Floor 
If Floor - 1 >= PtX.Count Then 
PtX.Add Value 
Else 
PtX.Add Value, , Floor 
End If 

Else 

PtY.Remove Floor 
If Floor - 1 >= PtY.Count Then 
PtY.Add Value 
Else 
PtY.Add Value, , Floor 
End If 

End If 


End Sub 

Public Sub RefreshStatus() '@@@@ Test Sub 

Dim i As Long 

Text_See.Text = "" 
For i = 1 To 3 
Text_See.Text = Text_See.Text & "(" & PtX.Item(i) & ", " & PtY.Item(i) & ")" & vbCrLf 
Next i 

End Sub 





以下在 File 模組:

複製程式
 

Option Explicit 

Public fso As FileSystemObject '此模組最主要都是用這種 FileSystemObject 來使用寫入寫出功能,如果你不喜歡就把此模組砍了吧 
'如果啟用,請記得引用項目 Microsoft Script Runtime 

Public Function LoadData(ByVal FileName As String) As String 

'Dim f As New FileSystemObject 
Dim tempTextStream As TextStream 

On Error Resume Next 
Set tempTextStream = fso.OpenTextFile(FileName) 

LoadData = "" 
If Not tempTextStream.AtEndOfStream Then 
LoadData = tempTextStream.ReadAll 
tempTextStream.Close 
End If 

End Function 

Public Sub WriteData(ByVal FileName As String, ByVal WrittenMes As String) 

Dim fr As Long 
'Dim f As New FileSystemObject 
Dim tempTextStream As TextStream 

On Error Resume Next 

Set tempTextStream = fso.CreateTextFile(FileName) 
tempTextStream.Write WrittenMes 
tempTextStream.Close 

End Sub 

Public Sub WriteData_Add(ByVal FileName As String, ByVal WrittenMes As String) 

Dim f As Long 

f = FreeFile 
Open FileName For Append As #f 
Print #f, WrittenMes 
Close #f 

End Sub 

Public Function FileExt(ByVal FileN As String) As Boolean 

FileExt = IIf(Dir(FileN, vbNormal Or vbHidden Or vbReadOnly Or vbSystem) <> "", True, False) 

End Function 




本帖包含附件
zip MovingLine.rar   (2022-06-09 14:13 / 4 KB)   下載次數:8

此文章被評分,最近評分記錄
財富:50 (by 三仙) | 理由: ^^ 因為您的參與,讓程式設計更容易!!


My BOINC stats :

獻花 x2 回到頂端 [1 樓] From:台灣台灣寬頻 | Posted:2010-01-26 21:48 |
ebolaman 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎

級別: 副版主 該用戶目前不上站
版區: 程式設計
推文 x38 鮮花 x458
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

對了,剛剛看一下程式碼發現

表單程式碼裡面,有 ReDim Pt(0, 1) ,這是原本用來記錄點的 陣列

不過由於不好用,後來砍了,這行是殘存的,可以刪除

還有繪線的第二行註解 不是實線是虛線...

有點懶得重修改文章... 表情

AND,感謝版主~


[ 此文章被ebolaman在2010-01-26 22:21重新編輯 ]


My BOINC stats :

獻花 x0 回到頂端 [2 樓] From:台灣台灣寬頻 | Posted:2010-01-26 22:12 |
tk7545
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

謝謝大大:

       真的很感謝大大的幫助,程式可以寫成這樣真不簡單,這是我程式的初步構想

      不知道大大能不能利用你的程式,幫我想想看之後我的程式該怎麼改

======================================================================

其實我的data檔是一條弧線,也是由X跟Y軸組成

我希望讓這條弧線繞著原點(0.0)轉圈

唯一想到的辦法就是利用轉置矩陣來讓弧線旋轉

原本的
X   Y
1   4
2   5
3   6

程式是以TIMER一直加1上去,完成線條移動的感覺

現在是要將弧線繞圈,所以方程式的部份就要由原本的加1,換成轉置矩陣

X1=X*Cos(t)-Y*Sin(t)

Y1=X*Sin(t)-Y*Cos(t)

因為要繞一圈,所以(t)則是1 to 360

原理跟原本的應該一樣,想要請教大大,我有沒有可能利用大大的程式

辦到能讓一條弧線達到有轉圈的效果呢? 麻煩大大了!


獻花 x0 回到頂端 [3 樓] From:台灣教育部 | Posted:2010-01-27 13:38 |
ebolaman 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎

級別: 副版主 該用戶目前不上站
版區: 程式設計
推文 x38 鮮花 x458
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用 tk7545 於 2010-01-27 13:38 發表的 : 到引言文
謝謝大大:

       真的很感謝大大的幫助,程式可以寫成這樣真不簡單,這是我程式的初步構想

      不知道大大能不能利用你的程式,幫我想想看之後我的程式該怎麼改

======================================================================

其實我的data檔是一條弧線,也是由X跟Y軸組成

我希望讓這條弧線繞著原點(0.0)轉圈

唯一想到的辦法就是利用轉置矩陣來讓弧線旋轉

原本的
X   Y
1   4
2   5
3   6

程式是以TIMER一直加1上去,完成線條移動的感覺

現在是要將弧線繞圈,所以方程式的部份就要由原本的加1,換成轉置矩陣

X1=X*Cos(t)-Y*Sin(t)

Y1=X*Sin(t)-Y*Cos(t)

因為要繞一圈,所以(t)則是1 to 360

原理跟原本的應該一樣,想要請教大大,我有沒有可能利用大大的程式

辦到能讓一條弧線達到有轉圈的效果呢? 麻煩大大了!



我目前是做好了

今天群健一直不讓我上網,終於在 PM 8:00 修好了 表情

由於東西有點多,我打算打在新的一篇文章

在這裡:http://bbs-mychat.com/reads.php?tid=849871


[ 此文章被ebolaman在2010-01-28 10:38重新編輯 ]


My BOINC stats :

獻花 x0 回到頂端 [4 樓] From:台灣台灣寬頻 | Posted:2010-01-27 23:43 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.070109 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言