PDA

View Full Version : حرفه ای: کمک در اجرای یک کد با Listbox1



karem2074
دوشنبه 24 مرداد 1390, 19:10 عصر
با سلام

دوستان من یک دانلود منیجر دارم.که اگه با textbox1 اجراش میکنی فایل رو دانلود میکنه.اما وقتی میخوام با انتخاب کردن یک ایتم در listbox1 اجراش کنم,فایل رو دانلود نمیکنه و این پیغام که من براش گذاشتم رو به من نشون میده.

در پروژه از BackgroundWorker1 استفاده کردم.که کد ویرایش شده برای هر دوتا رو گذاشتم.لطفا اونها رو هم چک کنین.

لطفا اگه میتونین ببینین مشکل از کجاش هست.با هر روشی تست کردم نشد.

توجه:نام textbox1 را به txtFileName تغییر دادم.

کد با Textbox1


If Me.txtFileName.Text <> "" AndAlso Me.txtFileName.Text.StartsWith("http://") Then


Me.SaveFileDialog1.FileName = Me.txtFileName.Text.Split("/"c)(Me.txtFileName.Text.Split("/"c).Length - 1)

If Me.SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then

Me.whereToSave = Me.SaveFileDialog1.FileName

Me.SaveFileDialog1.FileName = ""

Me.Label6.Text = "Save to: " & Me.whereToSave

Me.txtFileName.Enabled = False
Me.btnDownload.Enabled = False
Me.btnCancel.Enabled = True

Me.BackgroundWorker1.RunWorkerAsync() 'Start download

End If

Else

MessageBox.Show("Please insert valid URL for download", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)

End If


کد BackgroundWorker1 برای Textbox1

'Creating the request and getting the response
Dim theResponse As HttpWebResponse
Dim theRequest As HttpWebRequest
Try 'Checks if the file exist

theRequest = WebRequest.Create(Me.txtFileName.Text)
theResponse = theRequest.GetResponse
Catch ex As Exception

MessageBox.Show("An error occurred while downloading file. Possibe causes:" & ControlChars.CrLf & _
"1) File doesn't exist" & ControlChars.CrLf & _
"2) Remote server error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

Dim cancelDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(cancelDelegate, True)

Exit Sub
End Try
Dim length As Long = theResponse.ContentLength 'Size of the response (in bytes)

Dim safedelegate As New ChangeTextsSafe(AddressOf ChangeTexts)
Me.Invoke(safedelegate, length, 0, 0, 0) 'Invoke the TreadsafeDelegate

Dim writeStream As New IO.FileStream(Me.whereToSave, IO.FileMode.Create)

'Replacement for Stream.Position (webResponse stream doesn't support seek)
Dim nRead As Integer

'To calculate the download speed
Dim speedtimer As New Stopwatch
Dim currentspeed As Double = -1
Dim readings As Integer = 0

Do

If BackgroundWorker1.CancellationPending Then 'If user abort download
Exit Do
End If

speedtimer.Start()

Dim readBytes(4095) As Byte
Dim bytesread As Integer = theResponse.GetResponseStream.Read(readBytes, 0, 4096)

nRead += bytesread
Dim percent As Short = (nRead * 100) / length

Me.Invoke(safedelegate, length, nRead, percent, currentspeed)

If bytesread = 0 Then Exit Do

writeStream.Write(readBytes, 0, bytesread)

speedtimer.Stop()

readings += 1
If readings >= 5 Then 'For increase precision, the speed it's calculated only every five cicles
currentspeed = 20480 / (speedtimer.ElapsedMilliseconds / 1000)
speedtimer.Reset()
readings = 0
End If
Loop

'Close the streams
theResponse.GetResponseStream.Close()
writeStream.Close()

If Me.BackgroundWorker1.CancellationPending Then

IO.File.Delete(Me.whereToSave)

Dim cancelDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(cancelDelegate, True)

Exit Sub

End If

Dim completeDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(completeDelegate, False)

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

توجه:نام Listbox1 را به Listfile تغییر دادم.


کد با Listbox1

If Me.Listfile.GetItemText(Listfile.SelectedItem) <> "" AndAlso Me.Listfile.GetItemText(Listfile.SelectedItem).Sta rtsWith("http://") Then

Me.SaveFileDialog1.FileName = Me.Listfile.GetItemText(Listfile.SelectedItem).Spl it("/"c)(Me.Listfile.GetItemText(Listfile.SelectedItem). Split("/"c).Length - 1)

If Me.SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then

Me.whereToSave = Me.SaveFileDialog1.FileName

Me.SaveFileDialog1.FileName = ""

Me.btnDownload.Enabled = False
Me.btnCancel.Enabled = True

Me.BackgroundWorker1.RunWorkerAsync() 'Start download

End If

Else

MessageBox.Show("Please insert valid URL for download", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)

End If

کد BackgroundWorker1 برای ListBox

'Creating the request and getting the response
Dim theResponse As HttpWebResponse
Dim theRequest As HttpWebRequest
Try 'Checks if the file exist

theRequest = WebRequest.Create(Listfile.GetItemText(Listfile.Se lectedIndex))
theResponse = theRequest.GetResponse
Catch ex As Exception

MessageBox.Show("An error occurred while downloading file. Possibe causes:" & ControlChars.CrLf & _
"1) File doesn't exist" & ControlChars.CrLf & _
"2) Remote server error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

Dim cancelDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(cancelDelegate, True)

Exit Sub
End Try
Dim length As Long = theResponse.ContentLength 'Size of the response (in bytes)

Dim safedelegate As New ChangeTextsSafe(AddressOf ChangeTexts)
Me.Invoke(safedelegate, length, 0, 0, 0) 'Invoke the TreadsafeDelegate

Dim writeStream As New IO.FileStream(Me.whereToSave, IO.FileMode.Create)

'Replacement for Stream.Position (webResponse stream doesn't support seek)
Dim nRead As Integer

'To calculate the download speed
Dim speedtimer As New Stopwatch
Dim currentspeed As Double = -1
Dim readings As Integer = 0

Do

If BackgroundWorker1.CancellationPending Then 'If user abort download
Exit Do
End If

speedtimer.Start()

Dim readBytes(4095) As Byte
Dim bytesread As Integer = theResponse.GetResponseStream.Read(readBytes, 0, 4096)

nRead += bytesread
Dim percent As Short = (nRead * 100) / length

Me.Invoke(safedelegate, length, nRead, percent, currentspeed)

If bytesread = 0 Then Exit Do

writeStream.Write(readBytes, 0, bytesread)

speedtimer.Stop()

readings += 1
If readings >= 5 Then 'For increase precision, the speed it's calculated only every five cicles
currentspeed = 20480 / (speedtimer.ElapsedMilliseconds / 1000)
speedtimer.Reset()
readings = 0
End If
Loop

'Close the streams
theResponse.GetResponseStream.Close()
writeStream.Close()

If Me.BackgroundWorker1.CancellationPending Then

IO.File.Delete(Me.whereToSave)

Dim cancelDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(cancelDelegate, True)

Exit Sub

End If

Dim completeDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(completeDelegate, False)

omid-vbAuto
دوشنبه 24 مرداد 1390, 19:54 عصر
با سلام

دوستان من یک دانلود منیجر دارم.که اگه با textbox1 اجراش میکنی فایل رو دانلود میکنه.اما وقتی میخوام با انتخاب کردن یک ایتم در listbox1 اجراش کنم,فایل رو دانلود نمیکنه و این پیغام که من براش گذاشتم رو به من نشون میده.

در پروژه از BackgroundWorker1 استفاده کردم.که کد ویرایش شده برای هر دوتا رو گذاشتم.لطفا اونها رو هم چک کنین.

لطفا اگه میتونین ببینین مشکل از کجاش هست.با هر روشی تست کردم نشد.

توجه:نام textbox1 را به txtFileName تغییر دادم.

کد با Textbox1


If Me.txtFileName.Text <> "" AndAlso Me.txtFileName.Text.StartsWith("http://") Then


Me.SaveFileDialog1.FileName = Me.txtFileName.Text.Split("/"c)(Me.txtFileName.Text.Split("/"c).Length - 1)

If Me.SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then

Me.whereToSave = Me.SaveFileDialog1.FileName

Me.SaveFileDialog1.FileName = ""

Me.Label6.Text = "Save to: " & Me.whereToSave

Me.txtFileName.Enabled = False
Me.btnDownload.Enabled = False
Me.btnCancel.Enabled = True

Me.BackgroundWorker1.RunWorkerAsync() 'Start download

End If

Else

MessageBox.Show("Please insert valid URL for download", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)

End If


کد BackgroundWorker1 برای Textbox1

'Creating the request and getting the response
Dim theResponse As HttpWebResponse
Dim theRequest As HttpWebRequest
Try 'Checks if the file exist

theRequest = WebRequest.Create(Me.txtFileName.Text)
theResponse = theRequest.GetResponse
Catch ex As Exception

MessageBox.Show("An error occurred while downloading file. Possibe causes:" & ControlChars.CrLf & _
"1) File doesn't exist" & ControlChars.CrLf & _
"2) Remote server error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

Dim cancelDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(cancelDelegate, True)

Exit Sub
End Try
Dim length As Long = theResponse.ContentLength 'Size of the response (in bytes)

Dim safedelegate As New ChangeTextsSafe(AddressOf ChangeTexts)
Me.Invoke(safedelegate, length, 0, 0, 0) 'Invoke the TreadsafeDelegate

Dim writeStream As New IO.FileStream(Me.whereToSave, IO.FileMode.Create)

'Replacement for Stream.Position (webResponse stream doesn't support seek)
Dim nRead As Integer

'To calculate the download speed
Dim speedtimer As New Stopwatch
Dim currentspeed As Double = -1
Dim readings As Integer = 0

Do

If BackgroundWorker1.CancellationPending Then 'If user abort download
Exit Do
End If

speedtimer.Start()

Dim readBytes(4095) As Byte
Dim bytesread As Integer = theResponse.GetResponseStream.Read(readBytes, 0, 4096)

nRead += bytesread
Dim percent As Short = (nRead * 100) / length

Me.Invoke(safedelegate, length, nRead, percent, currentspeed)

If bytesread = 0 Then Exit Do

writeStream.Write(readBytes, 0, bytesread)

speedtimer.Stop()

readings += 1
If readings >= 5 Then 'For increase precision, the speed it's calculated only every five cicles
currentspeed = 20480 / (speedtimer.ElapsedMilliseconds / 1000)
speedtimer.Reset()
readings = 0
End If
Loop

'Close the streams
theResponse.GetResponseStream.Close()
writeStream.Close()

If Me.BackgroundWorker1.CancellationPending Then

IO.File.Delete(Me.whereToSave)

Dim cancelDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(cancelDelegate, True)

Exit Sub

End If

Dim completeDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(completeDelegate, False)

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

توجه:نام Listbox1 را به Listfile تغییر دادم.


کد با Listbox1

If Me.Listfile.GetItemText(Listfile.SelectedItem) <> "" AndAlso Me.Listfile.GetItemText(Listfile.SelectedItem).Sta rtsWith("http://") Then

Me.SaveFileDialog1.FileName = Me.Listfile.GetItemText(Listfile.SelectedItem).Spl it("/"c)(Me.Listfile.GetItemText(Listfile.SelectedItem). Split("/"c).Length - 1)

If Me.SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then

Me.whereToSave = Me.SaveFileDialog1.FileName

Me.SaveFileDialog1.FileName = ""

Me.btnDownload.Enabled = False
Me.btnCancel.Enabled = True

Me.BackgroundWorker1.RunWorkerAsync() 'Start download

End If

Else

MessageBox.Show("Please insert valid URL for download", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)

End If

کد BackgroundWorker1 برای ListBox

'Creating the request and getting the response
Dim theResponse As HttpWebResponse
Dim theRequest As HttpWebRequest
Try 'Checks if the file exist

theRequest = WebRequest.Create(Listfile.GetItemText(Listfile.Se lectedIndex))
theResponse = theRequest.GetResponse
Catch ex As Exception

MessageBox.Show("An error occurred while downloading file. Possibe causes:" & ControlChars.CrLf & _
"1) File doesn't exist" & ControlChars.CrLf & _
"2) Remote server error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

Dim cancelDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(cancelDelegate, True)

Exit Sub
End Try
Dim length As Long = theResponse.ContentLength 'Size of the response (in bytes)

Dim safedelegate As New ChangeTextsSafe(AddressOf ChangeTexts)
Me.Invoke(safedelegate, length, 0, 0, 0) 'Invoke the TreadsafeDelegate

Dim writeStream As New IO.FileStream(Me.whereToSave, IO.FileMode.Create)

'Replacement for Stream.Position (webResponse stream doesn't support seek)
Dim nRead As Integer

'To calculate the download speed
Dim speedtimer As New Stopwatch
Dim currentspeed As Double = -1
Dim readings As Integer = 0

Do

If BackgroundWorker1.CancellationPending Then 'If user abort download
Exit Do
End If

speedtimer.Start()

Dim readBytes(4095) As Byte
Dim bytesread As Integer = theResponse.GetResponseStream.Read(readBytes, 0, 4096)

nRead += bytesread
Dim percent As Short = (nRead * 100) / length

Me.Invoke(safedelegate, length, nRead, percent, currentspeed)

If bytesread = 0 Then Exit Do

writeStream.Write(readBytes, 0, bytesread)

speedtimer.Stop()

readings += 1
If readings >= 5 Then 'For increase precision, the speed it's calculated only every five cicles
currentspeed = 20480 / (speedtimer.ElapsedMilliseconds / 1000)
speedtimer.Reset()
readings = 0
End If
Loop

'Close the streams
theResponse.GetResponseStream.Close()
writeStream.Close()

If Me.BackgroundWorker1.CancellationPending Then

IO.File.Delete(Me.whereToSave)

Dim cancelDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(cancelDelegate, True)

Exit Sub

End If

Dim completeDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

Me.Invoke(completeDelegate, False)


دوست عزیز شما چرا خود برنامه رو نمیذارید؟

karem2074
سه شنبه 25 مرداد 1390, 00:44 صبح
بفرمایید.

هر دوتا رو آپلود کردم.

یکی که با Textbox کار میکنه.و دیگری هم که با Listbox کار نمیکنه.

Behzad_MCP
سه شنبه 25 مرداد 1390, 10:52 صبح
دوست عزیز تو برنامت یه اکسپشن CrossThread اتفاق میفته اینجا
theRequest = WebRequest.Create(Listfile.GetItemText(Listfile.Se lectedIndex))
ListFile روی Thread UI قرار داره و Backgroundworker روی Thread دیگه میشه این مشکل رو با یک متغیر دور زد