Springen naar inhoud


- - - - -
VS 2008 SOLVED

Listbox Vullen Met Filenamen, Fout Multi Thread

vs2008

  • Log in a.u.b. om te beantwoorden
Er zijn 9 reacties in dit onderwerp

#1 fakie

fakie

    Junior Developer

  • Leden
  • PipPip
  • 87 berichten
    Laatst bezocht 22 mei 2017 20:45
  • Locatiede Flanders

Geplaatst op 14 mei 2017 - 17:46

Hallo,

Ik probeer een inputbox te maken voor een bestand te zoeken.
Teksbox voor de te zoeken tekst
En een listbox voor de lijst in weer te geven welke de gevonden bestanden zijn.
Via een form werkt dit prima.

Maar nu ben ik bezig met allemaal zelf gemaakte elementen.
Zodat ik die inputbox via een Function kan laten werken.
Zodat ik geen Public strings moet definiëren, waar die waarde inkomt.

Nu de bedoeling is als ik daar tekst intyp, dat niet na iedere toets aanslag de bestanden gezocht worden.
Dus dacht ik daar met een timer te werken.

Dus de textbox werkt met Tekst_Changed.
Waar ik een timer1 start voor na een bepaalde tijd de bestanden  1 X uit uitleest. (werkt met form)


Visual Basic Code:
	Private Sub InputTxtNaam_Changed(ByVal sender As System.Object, ByVal e As System.EventArgs)

	 StartTijd = DateTime.Now

		If Timer1.Enabled = False Then
			Timer1.Enabled = True
		End If

	End Sub


	Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)


		Dim tijdspanne As TimeSpan = DateTime.Now - StartTijd
		If tijdspanne.TotalSeconds.ToString() > 1 Then
			Timer1.Enabled = False
			ScanBestanden(InputTxtPath.Text, InputTxtNaam.Text)
		End If

	End Sub

Sub ScanBestanden(ByVal path As String, ByVal Bestand As String)
		cmdListBox.Items.Clear() ' Hier krijg ik die foutmelding
		For Each FileNaam As String In IO.Directory.GetFiles(path, Bestand & "*", IO.SearchOption.TopDirectoryOnly)
			cmdListBox.Items.Add(FileNaam)
		Next
	End Sub


In de Timer1_Tick functie zet ik onmiddellijk de timer stil bij de eerste X dat hij dit wil verwerken.
Maar toch krijg ik deze fout iedere keer

Foutmelding :
Geplaatste afbeelding

alhoewel ik maar 1 thread doorlaat.
indien ik zonder die Timer werk, werkt het wel.
Zou ik dat kunnen omzeilen dat dit wel gaat ?

Alvast bedankt.

#2 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 564 berichten
    Laatst bezocht gisteren, 06:38
  • LocatieMechelen (BE)

Geplaatst op 16 mei 2017 - 20:52

Werk je dan met andere threads?

Wil je live zoeken of als je enter drukt?

#3 fakie

fakie

    Junior Developer

  • Leden
  • PipPip
  • 87 berichten
    Laatst bezocht 22 mei 2017 20:45
  • Locatiede Flanders

Geplaatst op 17 mei 2017 - 07:23

Hey Damic,

neen geen andere threads, foutmelding komt van die timer,
alhoewel ik die beveilig tegen meerdere malen lopen

en ik werk nu met gedefinieerde objecten (dus niet drag and drop)
Timer
Textbox
Listbox .. enz

komt er op neer dat de bedoeling is als je een nummer of tekst aan het typen bent,
wanneer je stopt met typen dat na een vb 0.5 sec, dat dan de mogelijke bestanden gezocht worden.
zodoende dat niet bij iedere toetsaanslag de bestanden gescand worden.

ik had dat vroeger al eens geprogrammeerd  met drag and drop elementen in een form .
met daarop ook een timer en dat werkt perfect.

maar ik had liever een soort Function Inputbox gemaakt in een macro (maar uitgebreider).
zodoende je geen public string moet maken voor deze string door te kunnen geven.

Gr. Fakie

#4 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 564 berichten
    Laatst bezocht gisteren, 06:38
  • LocatieMechelen (BE)

Geplaatst op 17 mei 2017 - 18:03

Raar werkt hier.Visual Basic Code:
Public Class Form1
	Private StartTijd As Date

	Private Sub InputTxtNaam_Changed(ByVal sender As Object, ByVal e As EventArgs) Handles InputTxtNaam.TextChanged
		StartTijd = DateTime.Now
		If Timer1.Enabled = False Then Timer1.Enabled = True
	End Sub


	Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
		Dim tijdspanne As TimeSpan = DateTime.Now - StartTijd
		If tijdspanne.TotalSeconds > 3 Then
			Timer1.Enabled = False
			ScanBestanden(InputTxtPath.Text, InputTxtNaam.Text)
		End If
	End Sub

	Private Sub ScanBestanden(ByVal path As String, ByVal Bestand As String)
		If Bestand = "" Then Exit Sub

		cmdListBox.Items.Clear()
		For Each FileNaam As String In IO.Directory.GetFiles(path, "*" & Bestand & "*", IO.SearchOption.TopDirectoryOnly)
			cmdListBox.Items.Add(FileNaam)
		Next
	End Sub
End Class

ik zou nog wel wat error afhandelingen in bouwen.

#5 fakie

fakie

    Junior Developer

  • Leden
  • PipPip
  • 87 berichten
    Laatst bezocht 22 mei 2017 20:45
  • Locatiede Flanders

Geplaatst op 18 mei 2017 - 01:29

ik gebruik versie 2008.
hmm ja .. ik zie dat je met een form werkt.
dan werkt het raar maar waar bij mij ook !

in mijn Form zet ik enkel zoiets, staat nu wel gewoon onder een knop
het Path zal je natuurlijk ergens moeten naar toe zetten waar enkele bestanden staan.


Visual Basic Code:
 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
	 Dim File As String
	 Dim Path As String
	 Path = "C:\temp\test.docx"
	 File = MyInputPathBox2(Path, "Titel")
End Sub

en dan mijne macro voor eens vollediger te zijn (wilde het niet te ingewikkeld maken)
staat dit allemaal.

en er nog es die error handling bijgezet maar krijg iedere keer de zelfde fout maar geen afhandeling van de listbox
Visual Basic Code:

Imports System.Timers
Module Mod_InputPathTest

	Dim StartTijd As DateTime

	Dim InputForm As Windows.Forms.Form
	Dim InputTxtPath, InputTxtNaam As TextBox
	Dim cmdBtnOK As Button
	Dim cmdBtnPath As Button
	Dim cmdListBox As ListBox

	Dim Timer1 As Timer
	Dim FolderBrowserDialog1 As FolderBrowserDialog

	Dim Bestand As String
	Public Function MyInputPathBox2(ByVal BestandLocatie As String, ByVal Title As String) As String

		Bestand = BestandLocatie
		InputForm = New Windows.Forms.Form
		InputTxtPath = New TextBox
		InputTxtNaam = New TextBox
		cmdBtnOK = New Button
		cmdBtnPath = New Button
		cmdListBox = New ListBox
		FolderBrowserDialog1 = New FolderBrowserDialog

		Timer1 = New Timer
		Timer1.Interval = 400
		AddHandler Timer1.Elapsed, AddressOf Timer1_Tick

		'OK button
		cmdBtnOK.Text = "OK"
		cmdBtnOK.Top = 230
		cmdBtnOK.Left = 210
		cmdBtnOK.Width = 70
		cmdBtnOK.Parent = InputForm
		cmdBtnOK.Anchor = AnchorStyles.Right
		cmdBtnOK.Visible = True
		InputTxtPath.TabIndex = 0
		AddHandler cmdBtnOK.Click, AddressOf cmdOK_Click

		'Input InputTxtNaam
		InputTxtNaam.Width = 360
		InputTxtNaam.Top = 38
		InputTxtNaam.Left = 12
		InputTxtNaam.Parent = InputForm
		InputTxtNaam.Text = FileNaamZonderPath(BestandLocatie)
		InputTxtNaam.Visible = True
		InputTxtNaam.TabIndex = 4
		AddHandler InputTxtNaam.TextChanged, AddressOf InputTxtNaam_Changed

		'Input InputTxtPath
		InputTxtPath.Width = 328
		InputTxtPath.Top = 12
		InputTxtPath.Left = 12
		InputTxtPath.Parent = InputForm
		InputTxtPath.Text = PathAlleen(BestandLocatie)
		InputTxtPath.Visible = True
		InputTxtPath.TabIndex = 2
		InputTxtPath.BorderStyle = BorderStyle.Fixed3D
		InputTxtPath.BackColor = Color.LightGray
		InputTxtPath.ReadOnly = True

		'Listbox
		cmdListBox.Top = 64
		cmdListBox.Left = 12
		cmdListBox.Width = 360
		cmdListBox.Height = 150
		cmdListBox.Parent = InputForm
		cmdListBox.Visible = True
		cmdListBox.TabIndex = 6
		'AddHandler cmdListBox.DoubleClick, AddressOf cmdListbox_DoubleClick

		'Form
		InputForm.Text = Title
		InputForm.StartPosition = FormStartPosition.CenterParent
		InputForm.AcceptButton = cmdBtnOK
		InputForm.ControlBox = False
		InputForm.Width = 400
		InputForm.Height = 300
		InputForm.ActiveControl = InputTxtNaam
		StartZoekgegevens()

		AddHandler InputForm.FormClosing, AddressOf InputForm_closing
		InputForm.ShowDialog()
		Return InputTxtPath.Text & InputTxtNaam.Text
		InputForm.Dispose()
	End Function

	Sub cmdOK_Click(ByVal sender As Object, ByVal e As EventArgs)
		InputForm.Close()
	End Sub

	Private Sub InputTxtNaam_Changed(ByVal sender As System.Object, ByVal e As System.EventArgs)

		StartZoekgegevens()

	End Sub

	Sub StartZoekgegevens()
		If Timer1.Enabled = False Then
			StartTijd = DateTime.Now
			'Timer1.Enabled = True
			Timer1.Start()
		End If
	End Sub

	Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)

		Dim tijdspanne As TimeSpan = DateTime.Now - StartTijd
		If tijdspanne.TotalSeconds.ToString() > 1 Then
			'Timer1.Enabled = False
			Timer1.Stop()
			ScanBestanden(InputTxtPath.Text, InputTxtNaam.Text)
		End If
	End Sub

	Sub ScanBestanden(ByVal path As String, ByVal NaamBestand As String)
		Try

			cmdListBox.Items.Clear()
			For Each FileNaam As String In IO.Directory.GetFiles(path, NaamBestand & "*", IO.SearchOption.TopDirectoryOnly)
				cmdListBox.Items.Add(FileNaamZonderPath(FileNaam))
			Next

		Catch ex As Exception
			MessageBox.Show(ex.ToString)
		End Try

	End Sub

	Function BestandenHoeveel(ByVal path As String, ByVal Zoekbestand As String) As Integer
		'zoekt het aantal bestanden met een beginnaam hoeveel er staan
		If path = "" Then Return 0
		BestandenHoeveel = IO.Directory.GetFiles(path, Zoekbestand & "*", IO.SearchOption.TopDirectoryOnly).Count

	End Function

Function FileNaamZonderPath(ByVal GeefPath As String) As String
	 FileNaamZonderPath = Microsoft.VisualBasic.Right(GeefPath, Len(GeefPath) - InStrRev(GeefPath, "\"))
End Function
Function PathJuistZetten(ByVal PathLocatie As String) As String
	 If PathLocatie = "" Then Return "" 'exit Function
	 PathJuistZetten = Trim(PathLocatie)
	 If Microsoft.VisualBasic.Right(PathJuistZetten, 1) <> "\" Then
		 PathJuistZetten += "\"
	 End If
End Function
Function PathAlleen(ByVal GeefPathEnBestandsnaam As String) As String
	 Dim Positie As Integer
	 Positie = InStrRev(GeefPathEnBestandsnaam, "\")
	 If Positie = 0 Then Return ""
	 PathAlleen = Microsoft.VisualBasic.Left(GeefPathEnBestandsnaam, Positie - 1)
End Function


End Module


bepaalde stukjes kunnen wel eenvoudiger.
maar probeer eerst de oplossing voor mijn probleem te vinden.

hopelijk niet te ver gezocht LOL

Gr. Fakie

#6 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 564 berichten
    Laatst bezocht gisteren, 06:38
  • LocatieMechelen (BE)

Geplaatst op 18 mei 2017 - 07:17

Simpele oplossing , zet alles in je form class

#7 fakie

fakie

    Junior Developer

  • Leden
  • PipPip
  • 87 berichten
    Laatst bezocht 22 mei 2017 20:45
  • Locatiede Flanders

Geplaatst op 18 mei 2017 - 08:55

bedoeling was van in een macro te zetten,
zodat ik dat in andere projecten kan importeren en gebruiken.
zonder veel te denken wat ik nog moet declareren bovenaan in de form class enzo.

maar toch wel bedankt voor de inzet hoor.

#8 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 907 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 18 mei 2017 - 15:05

Bericht bekijkenfakie, op 18 mei 2017 - 01:29, zei:

hmm ja .. ik zie dat je met een form werkt.
dan werkt het raar maar waar bij mij ook !
Ja, dat is logisch.
Want dan gebruik je de System.Windows.Forms.Timer klasse voor je timer.
Terwijl je in je andere code de System.Timers.Timer klasse gebruikt.

Dat is niet hetzelfde. Een System.Timers.Timer gebruikt een thread uit de threadpool.
Dat verklaart ook de problemen die je hebt.

Bericht bekijkenfakie, op 18 mei 2017 - 01:29, zei:

en dan mijne macro voor eens vollediger te zijn (wilde het niet te ingewikkeld maken)
Het is geen macro.
Dat is een vb.net module, dus een class met enkel class members.

Als je die code onmiddellijk had getoond, dan had ik je onmiddellijk kunnen vertellen waar het probleem lag.
Trust me, I have no idea what I'm talking about.

#9 fakie

fakie

    Junior Developer

  • Leden
  • PipPip
  • 87 berichten
    Laatst bezocht 22 mei 2017 20:45
  • Locatiede Flanders

Geplaatst op 19 mei 2017 - 05:35

Bedankt Dirk !

ja dat was mijn probleem.
ik weet te weinig van die imports en wat de mogelijkheden zijn.
zal ik nog eens mijn hoofd moeten op breken.

en ivm met die macor's, zat ik ergens met mijn hoofd in de wolken of in een ander soft pakket ... excel zekers.
het zijn natuurlijk module's.

alles wat ik weet van vb.net is van zelf studie
dus er zullen wel nog heel veel dingen zijn die ik niet weet.

Sorry voor het ongemak.


Gr. Fakie

#10 pascalbianca

pascalbianca

    Webmaster/Admin

  • Webmaster
  • 4312 berichten
    Laatst bezocht 20 jul 2017 05:32
  • LocatieSusteren, Nederland, Midden Limburg.
Inzender

Geplaatst op 25 mei 2017 - 07:35

Bericht bekijkenfakie, op 19 mei 2017 - 05:35, zei:

ik gebruik versie 2008.

Waarom vermeld je bij je titel dan VS2015?
Heb het maar even gecorrigeerd.

Wat is het gezegde in Ontwikkeling van software.: Er zijn vele wegen die naar Rome leiden, de kunst is de goede te vinden.
email : pascalbianca@vbib.be
of email : webmaster@vbib.be
MSN.:: pmhaschuffelers@hotmail.com
Volg ook mijn Raspberry Pi Blog.:: link


Geplaatste afbeelding


Huisregels - Tutorials - VS 2012 Express - Keybinding Posters - Code Tags gebruiken - LessThenDot - MSDN


*** If you like you're solution or appriciate the crew's effort, please click on the facebook like or the Google + button ***






Ook met taq VS 2008 SOLVED, vs2008 voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[VS 2008 SOLVED] Untitled 1

Met dank aan PascalBianca die tot op heden alles bijhoud sinds anno dec 2010)
Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
vbib.be - vbnet.be - vbdotnet.be - visualbasic.be