'
' Erstellt mit SharpDevelop.
' Benutzer: Tobi
' Datum: 14.08.2019
' Zeit: 11:39
' 
' Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
'
Imports System.Net
Imports System.Management
Imports System
Imports System.Runtime.InteropServices
Imports System.Diagnostics
Imports System.Text.RegularExpressions
Imports System.Threading
Imports System.IO



Public Partial Class MainForm
	Dim ProgrammEntZippen As Process
	Dim mAppPath As String	
	Dim mListViewEintrag As ListViewItem	
	Dim mTextZeile As String
	Dim mText As String
	Dim mCmdText As String
	Dim mDownloadAngebotListe(99) As String
	Dim mAnzahlInstallierteProgramme As Integer
	Dim mZeilenText() As String 
	Dim mZeilenzaehler As Integer
	Dim mNr As String
	Dim mRubrik As String
	Dim mIconnummerString As String
	Dim mIconnummerInteger As Integer
	Dim mProgrammname As String
	Dim mVersion As String
	Dim mAktualisierungsdatum As String
	Dim mProgrammOrdner As String
	Dim mProgrammZipDatei As String
	Dim mURLLBS As String
	Dim mAbhaengigVon As String
	Dim mAbhaengigVonMerk As String
	Dim mAbhaengigVon1 As String
	Dim mAbhaengigVon2 As String
	Dim mAbhaengigMehrfach1 As String
	Dim mAbhaengigMehrfach2 As String
	Dim mAbhaengigMehrfach3 As String
	Dim mAbhaengigVonAusgewaehlt As Boolean
	Dim mZeilenTextLaenge As Integer
	Dim mProgrammPfad As String
	Dim mInstalVerzeichnisBackSlash As String
	Dim mFileName As String
	Dim mMessageText As String
	Dim mEigeneDateienVerzeichnis As String
	Dim mEigeneDateienLaufwerk As String
	Dim mSuchpfad As String
	Dim mEigeneDateienQuellpfad As String
	Dim mEigeneDateienZielpfad As String
	Dim mFolderSize As Long = 0
	Dim mEntscheidung As DialogResult
	Dim mProgressbarMax As Integer
	Dim mProgressbarWert As Integer
	Dim mStartVersion As String
	Dim mStartUpdate As String
	Dim mStartUpdateURL As String
	Dim mZaehler As Integer
	Dim mInstalliertProgrammordnerListe(99) As String
	Dim mInstalliertDatumListe(99) As String
	Dim mDownloadFertig As Boolean
	Dim mDownloadURLListe(99) As String
	Dim mDownloadDateiListe(99) As String
	Dim mDownloadDateiListeReihenfolge(99) As String
	Dim mAutomatischerDownloadURLListe(99) As String
	Dim mAutomatischerDownloadDateiListe(99) As String
	Dim mDownloadIconnummerListe(99) As String
	Dim mDownloadVersionListe(99) As String
	Dim mDownloadProgrammnameListe(99) As String
	Dim mDownloadProgrammordnerListe(99) As String
	Dim mDownloadRubrikListe(99) As String
	Dim mProgrammOrdnerLoeschen(99) As String
	Dim mZaehlerLoeschen As Integer
	Dim mDownloadzaehler As Integer
	Dim mStartDownload As Integer
	Dim mEndeDownload As Integer
	Dim mGesamtbyteszumHerunterladen As Integer
	Dim mStartProzessID As String
	Dim mInstallierteProgrammeZaehler As Integer
	Dim mNeu As String
	Dim mLetzteAkualisierungInstallierbareProgramme As String
	Dim mAktualisierungInstallierbareProgramme As String
	Dim mNeueProgramme As Boolean
	Dim mNeueStartEXE As Boolean
	Dim mVerwaltungVersion As String
	Dim mInstallUpdate As String
	Dim mFehlertext As String
	Dim mAutoUpdate As Boolean
	Dim mOnline As Boolean
	Dim mFlexibel As Boolean
	Dim mKeineNews As Boolean
	Dim nofkfinfo As String
	Dim mVerwaltungUpdate As String
	Dim mMehrInfo As Integer
	Dim mFundstelle As Integer
	Dim mFehlerzeile As String
	Dim mStacktrace As String
	Dim mEreignisanzeigeProzessID As String
	Dim mVariableninhalte As String
	Dim mFehlertextMsgBox As String
	Dim mVariableninhalteMsgBox As String
	Dim mUSBLaufwerksname As String
	Dim mUSBSeriennummer As String
	Dim mUSBModell As String
	Dim PID As String
	Dim mSerialNumber As String
	Dim mInstalLaufwerk As String
	Dim mFileNameDownloadbareProgramme As String
	Dim mUpdateControlURL As String
	Dim txt As String
	
	
	Public Const SWP_NOMOVE As Short = &H2
	Public Const SWP_NOSIZE As Short = 1
	Public Const SWP_NOZORDER As Short = &H4
	Public Const SWP_SHOWWINDOW As Short = &H40
	Shared ReadOnly HWND_BOTTOM As IntPtr = New IntPtr(1)
	
	
	Public Sub New()
		' The Me.InitializeComponent call is required for Windows Forms designer support.
		Me.InitializeComponent()
		
		'
		' TODO : Add constructor code after InitializeComponents
		'
	End Sub
	
	Sub MainFormLoad(sender As Object, e As EventArgs)
		Dim currentDomain As AppDomain = AppDomain.CurrentDomain
		AddHandler currentDomain.UnhandledException, AddressOf MYExceptionHandler
		AddHandler Application.ThreadException, AddressOf MYThreadHandler
		mAppPath = Application.StartupPath
		If Rechts(mAppPath, 1) = "\" Then
			mInstalVerzeichnisBackSlash = mAppPath
		Else
			mInstalVerzeichnisBackSlash = mAppPath & "\"
		End If
		mInstalVerzeichnisBackSlash = Links(mInstalVerzeichnisBackSlash, mInstalVerzeichnisBackSlash.Length - "Programme\PStart\".Length)
		
		'mInstalVerzeichnisBackSlash = "D:\Temp\s2025TestMueller\"
		
		mInstalLaufwerk = Links(mInstalVerzeichnisBackSlash, 3)
		mAutoUpdate = False
		mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\UpdateControlURL.txt"
		If System.IO.File.Exists(mFileName) = True Then
			mUpdateControlURL = IO.File.ReadAllText(mFileName)
			mUpdateControlURL = mUpdateControlURL.Trim
		End If
		
		mFileName = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\Startversion.txt"
		If System.IO.File.Exists(mFileName) = True Then
			mStartVersion = IO.File.ReadAllText(mFileName)
			mStartVersion = mStartVersion.Trim
			mFundstelle = mStartVersion.IndexOf("_")
			If mFundstelle = - 1 Then
				If mStartVersion.Substring(0,1) = "9" Then
					mStartVersion = mStartVersion.Substring(1, mStartVersion.Length - 1)
					mAutoUpdate = False
				Else
					mAutoUpdate = True
				End If
				Dim objWriter As New System.IO.StreamWriter(mFileName)
				If mAutoUpdate = True then
					objWriter.WriteLine("_" & mStartVersion.Trim)
				Else
					objWriter.WriteLine("n_" & mStartVersion.Trim)
				End If		
				objWriter.Close()
			End If
			nofkfinfo = ""
			mStartVersion = IO.File.ReadAllText(mFileName)
			mStartVersion = mStartVersion.Trim
			mFundstelle = mStartVersion.IndexOf("_")
			If mStartVersion.Substring(0,mFundstelle).IndexOf("n") > - 1 Then
				mAutoUpdate = False
				nofkfinfo = nofkfinfo & "n"
			Else
				mAutoUpdate = True
			End If
			If mStartVersion.Substring(0,mFundstelle).IndexOf("o") > - 1 Then
				mOnline = False		
				nofkfinfo = nofkfinfo & "o"
			Else
				mOnline = True
			End If
			If mStartVersion.Substring(0,mFundstelle).IndexOf("f") > - 1 Then
				mFlexibel = False
				nofkfinfo = nofkfinfo & "f"
			Else
				mFlexibel = True
			End If
			If mStartVersion.Substring(0,mFundstelle).IndexOf("k") > - 1 Then
				mKeineNews = True
				nofkfinfo = nofkfinfo & "k"
			Else
				mKeineNews = False
			End If
			mStartVersion = mStartVersion.Substring(mFundstelle + 1, mStartVersion.Length - (mFundstelle + 1))
		End If
		
		System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
		
		mFileName = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\VerwaltungVersion.txt"							
		mVerwaltungVersion = IO.File.ReadAllText(mFileName)
		mVerwaltungVersion = mVerwaltungVersion.Trim
		mFundstelle = mVerwaltungVersion.IndexOf("_")
		mVerwaltungVersion = mVerwaltungVersion.Substring(mFundstelle + 1, mVerwaltungVersion.Length - (mFundstelle + 1))
		If mAutoUpdate = True Then 
			chkAutoUpdate.Checked = True
			btStartUpdate.Enabled = False
			btVerwaltungsUpdate.Enabled = False
		Else
			chkAutoUpdate.Checked = False
			btStartUpdate.Enabled = True
			btVerwaltungsUpdate.Enabled = True
		End If
		If mOnline = True Then
			chkOnline.Checked = True
		Else
			chkOnline.Checked = False
		End If
		If mFlexibel = True Then
			chkFlexibel.Checked = True
		Else
			chkFlexibel.Checked = False
		End If
		If mKeineNews = True Then
			chkKeineNews.Checked = True
		Else
			chkKeineNews.Checked = False
		End If
		mFileName = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\aktuellesEigeneDateienVerzeichnis.txt"
		mEigeneDateienVerzeichnis = IO.File.ReadAllText(mFileName)
		mEigeneDateienVerzeichnis = mEigeneDateienVerzeichnis.Trim
		mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartEigen.txt" 
		If System.IO.File.Exists(mFileName) = True Then
			chkStartEigen.Checked = True
		Else
			chkStartEigen.Checked = False
		End If
		Me.Text = "Informatikstick Verwaltung Version " & mVerwaltungVersion
		lblPfadEigeneDateien.Text = mEigeneDateienVerzeichnis
		mFileName = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartProzessID.txt"
		mStartProzessID = IO.File.ReadAllText(mFileName)
		mStartProzessID = mStartProzessID.Trim
		Try
			System.Diagnostics.Process.GetProcessById(mStartProzessID).Kill
		Catch ex As Exception
		End Try
		
		mFileName = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\downloadbareprogramme.txt"
		If System.IO.File.Exists(mFileName) = true Then
			mFileName = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\downloadbareprogramme.txt.sic"
			If System.IO.File.Exists(mFileName) = False Then
				My.Computer.FileSystem.CopyFile(mInstalVerzeichnisBackSlash &"Programme\PStart\Settings\downloadbareprogramme.txt",	mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\downloadbareprogramme.txt.sic",True)
			End If
			My.Computer.FileSystem.CopyFile(mInstalVerzeichnisBackSlash &"Programme\PStart\Settings\downloadbareprogramme.txt.sic",	mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\downloadbareprogramme.txt",True)
		End If
	End Sub
	
	Private Sub MYExceptionHandler(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
		Dim EX As Exception = e.ExceptionObject ' eventuell löschen ?
		mStacktrace = EX.StackTrace
		mFundstelle = mStacktrace.IndexOf("MainForm.vb:Zeile ") + 18
		mStacktrace = mStacktrace.Substring(mFundstelle, mStacktrace.Length-mFundstelle)
		mFundstelle = mStacktrace.IndexOf(".")
		mFehlerzeile = "Zeile: " & mStacktrace.Substring(0, mFundstelle) & vbCrLf
		mFehlertext = EX.Message & vbCrLf
		przFehlerMeldungUndMail()
	End Sub	
	
	Private Sub przFehlerMeldungUndMail
		mFehlertext = mFehlertext & "Installierte Programme:" & vbCrLf
		Try
			Dim sPath As String
			sPath = mInstalVerzeichnisBackSlash & "Programme\"
			Dim oDir As New System.IO.DirectoryInfo(sPath)
			Dim oDirs As System.IO.DirectoryInfo() = oDir.GetDirectories
			For Each oDir In oDirs
				mFehlertext = mFehlertext & ". " & oDir.Name & vbCrLf
			Next
		Catch myEx As Exception
			mFehlertext = mFehlertext & "können nicht angezeigt werden" & vbCrLf
		End Try
		mFehlertext = mFehlertext & "Variablenwerte: " & vbCrLf
		mVariableninhalte = "mAppPath: " & mAppPath & vbCrLf
		mVariableninhalte = mVariableninhalte & "mTextZeile: " & mTextZeile & vbCrLf
		mVariableninhalte = mVariableninhalte & "mText: " & mText & vbCrLf
		mVariableninhalte = mVariableninhalte & "mCmdText: " & mCmdText & vbCrLf
		For mMeinZaehler  = 0 To 99
			If mDownloadAngebotListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mDownloadAngebotListe" & mMeinZaehler &": " & mDownloadAngebotListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		mVariableninhalte = mVariableninhalte & "mZeilenzaehler: " & mZeilenzaehler & vbCrLf
		mVariableninhalte = mVariableninhalte & "mRubrik: " & mRubrik & vbCrLf
		mVariableninhalte = mVariableninhalte & "mIconnummerString: " & mIconnummerString & vbCrLf
		mVariableninhalte = mVariableninhalte & "mIconnummerInteger: " & mIconnummerInteger & vbCrLf
		mVariableninhalte = mVariableninhalte & "mProgrammname: " & mProgrammname & vbCrLf
		mVariableninhalte = mVariableninhalte & "mVersion: " & mVersion & vbCrLf
		mVariableninhalte = mVariableninhalte & "mAktualisierungsdatum: " & mAktualisierungsdatum & vbCrLf
		mVariableninhalte = mVariableninhalte & "mProgrammOrdner: " & mProgrammOrdner & vbCrLf
		mVariableninhalte = mVariableninhalte & "mProgrammZipDatei: " & mProgrammZipDatei & vbCrLf
		mVariableninhalte = mVariableninhalte & "mURLLBS: " & mURLLBS & vbCrLf
		mVariableninhalte = mVariableninhalte & "mAbhaengigVon: " & mAbhaengigVon & vbCrLf
		mVariableninhalte = mVariableninhalte & "mAbhaengigVon1: " & mAbhaengigVon1 & vbCrLf
		mVariableninhalte = mVariableninhalte & "mAbhaengigVon2: " & mAbhaengigVon2 & vbCrLf
		mVariableninhalte = mVariableninhalte & "mAbhaengigVonAusgewaehlt: " & mAbhaengigVonAusgewaehlt & vbCrLf
		mVariableninhalte = mVariableninhalte & "mZeilenTextLaenge: " & mZeilenTextLaenge & vbCrLf
		mVariableninhalte = mVariableninhalte & "mProgrammPfad: " & mProgrammPfad & vbCrLf
		mVariableninhalte = mVariableninhalte & "mInstalVerzeichnisBackSlash: " & mInstalVerzeichnisBackSlash & vbCrLf
		mVariableninhalte = mVariableninhalte & "mFileName: " & mFileName & vbCrLf
		mVariableninhalte = mVariableninhalte & "mMessageText: " & mMessageText & vbCrLf
		mVariableninhalte = mVariableninhalte & "mEigeneDateienVerzeichnis: " & mEigeneDateienVerzeichnis & vbCrLf
		mVariableninhalte = mVariableninhalte & "mEigeneDateienLaufwerk: " & mEigeneDateienLaufwerk & vbCrLf
		mVariableninhalte = mVariableninhalte & "mSuchpfad: " & mSuchpfad & vbCrLf
		mVariableninhalte = mVariableninhalte & "mEigeneDateienQuellpfad: " & mEigeneDateienQuellpfad & vbCrLf
		mVariableninhalte = mVariableninhalte & "mEigeneDateienZielpfad: " & mEigeneDateienZielpfad & vbCrLf
		mVariableninhalte = mVariableninhalte & "mFolderSize: " & mFolderSize & vbCrLf
		mVariableninhalte = mVariableninhalte & "mEntscheidung: " & mEntscheidung & vbCrLf
		mVariableninhalte = mVariableninhalte & "mProgressbarMax: " & mProgressbarMax & vbCrLf
		mVariableninhalte = mVariableninhalte & "mProgressbarWert: " & mProgressbarWert & vbCrLf
		mVariableninhalte = mVariableninhalte & "mStartVersion: " & mStartVersion & vbCrLf
		mVariableninhalte = mVariableninhalte & "mStartUpdate: " & mStartUpdate & vbCrLf
		mVariableninhalte = mVariableninhalte & "mStartUpdateURL: " & mStartUpdateURL & vbCrLf
		mVariableninhalte = mVariableninhalte & "mZaehler: " & mZaehler & vbCrLf
		For mMeinZaehler  = 0 To 99
			If mInstalliertProgrammordnerListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mInstalliertProgrammordnerListe" & mMeinZaehler &": " & mInstalliertProgrammordnerListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		For mMeinZaehler  = 0 To 99
			If mInstalliertDatumListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mInstalliertDatumListe" & mMeinZaehler &": " & mInstalliertDatumListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		mVariableninhalte = mVariableninhalte & "mDownloadFertig: " & mDownloadFertig & vbCrLf
		For mMeinZaehler  = 0 To 99
			If mDownloadURLListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mDownloadURLListe" & mMeinZaehler &": " & mDownloadURLListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		For mMeinZaehler  = 0 To 99
			If mDownloadDateiListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mDownloadDateiListe" & mMeinZaehler &": " & mDownloadDateiListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		For mMeinZaehler  = 0 To 99
			If mAutomatischerDownloadURLListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mAutomatischerDownloadURLListe" & mMeinZaehler &": " & mAutomatischerDownloadURLListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		For mMeinZaehler  = 0 To 99
			If mAutomatischerDownloadDateiListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mAutomatischerDownloadDateiListe" & mMeinZaehler &": " & mAutomatischerDownloadDateiListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		For mMeinZaehler  = 0 To 99
			If mDownloadIconnummerListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mDownloadIconnummerListe" & mMeinZaehler &": " & mDownloadIconnummerListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		For mMeinZaehler  = 0 To 99
			If mDownloadVersionListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mDownloadVersionListe" & mMeinZaehler &": " & mDownloadVersionListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		For mMeinZaehler  = 0 To 99
			If mDownloadProgrammnameListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mDownloadProgrammnameListe" & mMeinZaehler &": " & mDownloadProgrammnameListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		For mMeinZaehler  = 0 To 99
			If mDownloadProgrammordnerListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mDownloadProgrammordnerListe" & mMeinZaehler &": " & mDownloadProgrammordnerListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		For mMeinZaehler  = 0 To 99
			If mDownloadRubrikListe(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mDownloadRubrikListe" & mMeinZaehler &": " & mDownloadRubrikListe(mMeinZaehler) & vbCrLf 
			End If
		Next
		For mMeinZaehler  = 0 To 99
			If mProgrammOrdnerLoeschen(mMeinZaehler) IsNot vbNullString Then
				mVariableninhalte = mVariableninhalte & "mProgrammOrdnerLoeschen" & mMeinZaehler &": " & mProgrammOrdnerLoeschen(mMeinZaehler) & vbCrLf 
			End If
		Next
		mVariableninhalte = mVariableninhalte & "mZaehlerLoeschen: " & mZaehlerLoeschen & vbCrLf
		mVariableninhalte = mVariableninhalte & "mDownloadzaehler: " & mDownloadzaehler & vbCrLf
		mVariableninhalte = mVariableninhalte & "mStartDownload: " & mStartDownload & vbCrLf
		mVariableninhalte = mVariableninhalte & "mEndeDownload: " & mEndeDownload & vbCrLf
		mVariableninhalte = mVariableninhalte & "mGesamtbyteszumHerunterladen: " & mGesamtbyteszumHerunterladen & vbCrLf
		mVariableninhalte = mVariableninhalte & "mStartProzessID: " & mStartProzessID & vbCrLf
		mVariableninhalte = mVariableninhalte & "mInstallierteProgrammeZaehler: " & mInstallierteProgrammeZaehler & vbCrLf
		mVariableninhalte = mVariableninhalte & "mNeu: " & mNeu & vbCrLf
		mVariableninhalte = mVariableninhalte & "mLetzteAkualisierungInstallierbareProgramme: " & mLetzteAkualisierungInstallierbareProgramme & vbCrLf
		mVariableninhalte = mVariableninhalte & "mAktualisierungInstallierbareProgramme: " & mAktualisierungInstallierbareProgramme & vbCrLf
		mVariableninhalte = mVariableninhalte & "mNeueProgramme: " & mNeueProgramme & vbCrLf
		mVariableninhalte = mVariableninhalte & "mNeueStartEXE: " & mNeueStartEXE & vbCrLf
		mVariableninhalte = mVariableninhalte & "mVerwaltungVersion: " & mVerwaltungVersion & vbCrLf
		mVariableninhalte = mVariableninhalte & "mInstallUpdate: " & mInstallUpdate & vbCrLf
		mVariableninhalte = mVariableninhalte & "mAutoUpdate: " & mAutoUpdate & vbCrLf
		mVariableninhalte = mVariableninhalte & "nofkfinfo: " & nofkfinfo & vbCrLf
		mVariableninhalte = mVariableninhalte & "mVerwaltungUpdate: " & mVerwaltungUpdate & vbCrLf
		mVariableninhalte = mVariableninhalte & "mMehrInfo: " & mMehrInfo & vbCrLf
		mVariableninhalte = mVariableninhalte & "mFundstelle: " & mFundstelle & vbCrLf
		mVariableninhalte = mVariableninhalte & "mEreignisanzeigeProzessID: " & mEreignisanzeigeProzessID & vbCrLf
		przUSBInfo()
		mVariableninhalte = mVariableninhalte & "mUSBLaufwerksname: " & mUSBLaufwerksname & vbCrLf
		mVariableninhalte = mVariableninhalte & "mUSBSeriennummer: " & mUSBSeriennummer & vbCrLf
		mVariableninhalte = mVariableninhalte & "mUSBModell: " & mUSBModell & vbCrLf
		mVariableninhalteMsgBox = mVariableninhalte.Replace(vbCrLf, " ** ")
		If mVariableninhalteMsgBox.Length > 10000 Then
			clsTopMostMessageBox.Show("Senden Sie bitte diese Fehlermeldung per eMail an " & vbCrLf & vbCrLf & "informatikstick@tobiasch.info" & vbCrLf  & vbCrLf & "gerne auch ergänzt durch Ihre eigene Fehlerbeschreibung!"  & vbCrLf & vbCrLf & mFehlerzeile & vbCrLf & mFehlertextMsgBox & mVariableninhalteMsgBox.Substring(0,10000), "Programm VERWALTUNG " & mVerwaltungVersion & " Abbruch - Fehlermeldung", MessageBoxButtons.OK, MessageBoxIcon.Error)
		Else
			clsTopMostMessageBox.Show("Senden Sie bitte diese Fehlermeldung per eMail an " & vbCrLf & vbCrLf & "informatikstick@tobiasch.info" & vbCrLf & vbCrLf & "gerne auch ergänzt durch Ihre eigene Fehlerbeschreibung!"  & vbCrLf & vbCrLf & mFehlerzeile & vbCrLf & mFehlertextMsgBox & mVariableninhalteMsgBox, "Programm VERWALTUNG " & mVerwaltungVersion & " Abbruch - Fehlermeldung", MessageBoxButtons.OK, MessageBoxIcon.Error)
		End If
		OpenEmail("support@schultasche-bw.de", "S2025 Start Version " & mStartVersion & " /  Verwaltung Version " & mVerwaltungVersion, CorrectMailSyntax("Hallo Support-Team," & vbCrLf & "bei mir ist beim Programm VERWALTUNG die folgende Fehlermeldung erschienen:" & vbCrLf & mFehlerzeile & mFehlertext & mVariableninhalte))
		End
	End Sub
	
	
	Private Sub MYThreadHandler(ByVal sender As Object, ByVal e As Threading.ThreadExceptionEventArgs)
		Dim EX As Exception = e.Exception
		mStacktrace = EX.StackTrace
		mFundstelle = mStacktrace.IndexOf("MainForm.vb:Zeile ") + 18
		mStacktrace = mStacktrace.Substring(mFundstelle, mStacktrace.Length-mFundstelle)
		mFundstelle = mStacktrace.IndexOf(".")
		mFehlerzeile = "Zeile: " & mStacktrace.Substring(0, mFundstelle) & vbCrLf
		mFehlertext = e.Exception.Message & vbCrLf
		przFehlerMeldungUndMail()
	End Sub	
	
	'	Public Sub przUSBInfo
	'		For Each Drive As IO.DriveInfo In IO.DriveInfo.GetDrives
	'			If Drive.DriveType = IO.DriveType.Removable Then 
	'				If Drive.Name = mInstalLaufwerk
	'					GetSerialNumber(Drive.Name)
	'					mUSBLaufwerksname = "Laufwerksname: " & Drive.VolumeLabel & "  ( "  & Drive.Name & " )"
	'					mUSBSeriennummer = "SerialID: " + mSerialNumber
	'					Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher("SELECT * FROM Win32_diskdrive where interfacetype = 'USB'")
	'					For Each mo As ManagementObject In mos.Get()
	'							For Each pd1 As PropertyData In mo.Properties
	'								If pd1.Value IsNot Nothing Then
	'									PID = Convert.ToString(pd1.Value)
	'									If Convert.ToString(pd1.Value) = mSerialNumber Then
	'										For Each pd2 As PropertyData In mo.Properties
	'											If pd2.Value IsNot Nothing Then
	'												PID = Convert.ToString(pd2.Value)
	'												If pd2.Name = "Model"  Then
	'													mUSBModell = PID
	'												End If
	'											End If
	'										Next
	'									End If
	'								End If
	'							Next
	'						Next
	'					End If
	'				End If
	'			Next
	'		End Sub
	
	Public Sub przUSBInfo()
		For Each Drive As DriveInfo In DriveInfo.GetDrives()
			If Drive.DriveType = DriveType.Removable Then
				If Drive.Name = mInstalLaufwerk Then
					' Seriennummer auslesen
					GetSerialNumber(Drive.Name)
					
					' Laufwerksname setzen
					mUSBLaufwerksname = "Laufwerksname: " & Drive.VolumeLabel & "  ( " & Drive.Name & " )"
					mUSBSeriennummer = "SerialID: " & mSerialNumber
					
					' WMI-Abfrage aller USB-Datenträger
					Dim mos As New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE InterfaceType = 'USB'")
					For Each mo As ManagementObject In mos.Get()
							' Alle Properties durchgehen
							For Each pd1 As PropertyData In mo.Properties
								If pd1.Value IsNot Nothing Then
									PID = Convert.ToString(pd1.Value)
									
									' Seriennummer vergleichen
									If PID = mSerialNumber Then
										' Modell auslesen
										For Each pd2 As PropertyData In mo.Properties
											If pd2.Value IsNot Nothing AndAlso pd2.Name = "Model" Then
												mUSBModell = Convert.ToString(pd2.Value)
											End If
										Next
									End If
								End If
							Next
						Next
					End If
				End If
			Next
		End Sub
		
		Public Sub GetSerialNumber(ByVal DriveLetter As String) 
			Dim mWin32LocalDisk, mWin32LDiskPartition, mWin32LDiskDrive As ManagementObject
			Try
				mText = ""
				mWin32LocalDisk = New ManagementObject("Win32_LogicalDisk.DeviceID='" & DriveLetter.TrimEnd("\"c) & "'")
				For Each mWin32LDiskPartition In mWin32LocalDisk.GetRelated("Win32_DiskPartition")
					For Each mWin32LDiskDrive In mWin32LDiskPartition.GetRelated("Win32_DiskDrive")
						Dim wmi As New ManagementClass("Win32_DiskDrive")
						For Each obj As ManagementObject In wmi.GetInstances
							If obj("DeviceID").ToString = mWin32LDiskDrive("DeviceID").ToString Then
								mtext = mWin32LDiskDrive("SerialNumber").ToString
								If mText.Length > 0 Then
									mSerialNumber = mText
								End If
							End If
						Next
					Next
				Next
			Catch ex As Exception
			End Try
		End Sub
		
		Public Function CorrectMailSyntax(strText As String) As String
			strText = Replace(strText, "%", "%25")
			strText = Replace(strText, vbCr, "%0A")
			strText = Replace(strText, vbLf, "%0A")
			strText = Replace(strText, vbCrLf, "%0A")
			strText = Replace(strText, " ", "%20")
			strText = Replace(strText, "!", "%21")
			strText = Replace(strText, "#", "%23")
			strText = Replace(strText, "*", "%2A")
			strText = Replace(strText, "/", "%2F")
			strText = Replace(strText, "?", "%3F")
			strText = Replace(strText, "Ä", "%C4")
			strText = Replace(strText, "Ö", "%D6")
			strText = Replace(strText, "Ü", "%DC")
			strText = Replace(strText, "ß", "%DF")
			strText = Replace(strText, "ä", "%E4")
			strText = Replace(strText, "ö", "%F6")
			strText = Replace(strText, "ü", "%FC")
			CorrectMailSyntax = strText
		End Function
		
		Public Sub DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
			progressDownload.Value = e.ProgressPercentage
			lblDownloadInfo.Text = e.BytesReceived & " / " & e.TotalBytesToReceive
		End Sub
		
		Sub MainFormShown(sender As Object, e As EventArgs)
			If System.IO.Directory.Exists(mEigeneDateienVerzeichnis) = False Then
				lblPfadEigeneDateien.ForeColor = Color.Red
				clsTopMostMessageBox.Show("Auf das bisherige 'EigeneDateien' - Verzeichnis " & mEigeneDateienVerzeichnis & " kann derzeit nicht zugegriffen werden! " &  CHR(10) & "Mögliche Ursache könnte sein: fehlendes Netzlaufwerk oder fehlender externer Datenträger !?" &  CHR(10)&  CHR(10) & "Deshalb wird der Standard-Pfad " & mInstalVerzeichnisBackSlash & "EigeneDateien verwendet !" , "Achtung", _
					MessageBoxButtons.OK, _
					MessageBoxIcon.Exclamation)
				
				mEigeneDateienVerzeichnis =  mInstalVerzeichnisBackSlash & "EigeneDateien"
				lblPfadEigeneDateien.Text = mEigeneDateienVerzeichnis
				lblPfadEigeneDateien.ForeColor = Color.Black
				IO.File.WriteAllText(mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\aktuellesEigeneDateienVerzeichnis.txt",lblPfadEigeneDateien.Text)
			End If
			mEigeneDateienLaufwerk = Links(mEigeneDateienVerzeichnis, 3)
			lblPfadEigeneDateien.Text = mEigeneDateienVerzeichnis
			mEigeneDateienQuellpfad = mEigeneDateienVerzeichnis	
			AutomatischerDownload()
		End Sub
		
		Sub AutomatischerDownload()
			If TestWebConnection() = 1 Then
				lblVerbindung.Text = "Verbindungsstatus: Verbunden"
				btDownloadInstal.Enabled = True
				For mZaehler = 0 To 99
					mAutomatischerDownloadURLListe(mZaehler) = Nothing
					mAutomatischerDownloadDateiListe(mZaehler) = Nothing
				Next
				mAutomatischerDownloadURLListe(0) = mUpdateControlURL & "/installupdate.txt"
				mAutomatischerDownloadURLListe(1) = mUpdateControlURL & "/startupdate.txt"
				mAutomatischerDownloadURLListe(2) = mUpdateControlURL & "/verwaltungupdate.txt"
				mAutomatischerDownloadURLListe(3) = mUpdateControlURL & "/downloadbareprogramme.txt"
				mAutomatischerDownloadURLListe(4) = mUpdateControlURL & "/start.zip"
				mFileName = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\Test.txt"
				If System.IO.File.Exists(mFileName) = True Then
					mAutomatischerDownloadURLListe(0) = mUpdateControlURL & "/test/installupdate.txt"
					mAutomatischerDownloadURLListe(1) = mUpdateControlURL & "/test/startupdate.txt"
					mAutomatischerDownloadURLListe(2) = mUpdateControlURL & "/test/verwaltungupdate.txt"
					mAutomatischerDownloadURLListe(3) = mUpdateControlURL & "/test/downloadbareprogramme.txt"
					mAutomatischerDownloadURLListe(4) = mUpdateControlURL & "/test/start.zip"
				End If
				mAutomatischerDownloadDateiListe(0) = "installupdate.txt"
				mAutomatischerDownloadDateiListe(1) = "startupdate.txt"
				mAutomatischerDownloadDateiListe(2) = "verwaltungupdate.txt"
				mAutomatischerDownloadDateiListe(3) = "downloadbareprogramme.txt"
				mAutomatischerDownloadDateiListe(4) = "start.zip"
				mStartDownload = -1
				mNeueStartEXE = False
				StartNextDownload()
				btDownloadInstal.Enabled = True
			Else
				lblVerbindung.Text = "Verbindungsstatus: Getrennt"
				btDownloadInstal.Enabled = False
				InstallierbareProgrammeAnzeigen()
			End If	
			InstallierteProgrammeAnzeigen()
		End Sub
		
		Sub StartNextDownload()
			ServicePointManager.Expect100Continue = True
			ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)
			
			mStartDownload = mStartDownload + 1
			If mStartDownload < 5 Then
				If mStartDownload = 0 Then
					Dim meinWebClientStart As WebClient = New WebClient
					meinWebClientStart.UseDefaultCredentials= True
					meinWebClientStart.Credentials = CredentialCache.DefaultCredentials
					meinWebClientStart.Proxy.Credentials = CredentialCache.DefaultCredentials
					AddHandler meinWebClientStart.DownloadFileCompleted, AddressOf meinWebClientStart_DownloadCompleted
					meinWebClientStart.Headers.Add("Cookie", "__test=3c020c18923605cf39e4292d69038f3a")
					meinWebClientStart.DownloadFileAsync(New Uri(mAutomatischerDownloadURLListe(mStartDownload)), mInstalVerzeichnisBackSlash & "\Download\" &  mAutomatischerDownloadDateiListe(mStartDownload))
				End If
				If mStartDownload = 1 Then
					Dim meinWebClientStart As WebClient = New WebClient
					meinWebClientStart.UseDefaultCredentials= True
					meinWebClientStart.Credentials = CredentialCache.DefaultCredentials
					meinWebClientStart.Proxy.Credentials = CredentialCache.DefaultCredentials
					AddHandler meinWebClientStart.DownloadFileCompleted, AddressOf meinWebClientStart_DownloadCompleted
					meinWebClientStart.Headers.Add("Cookie", "__test=3c020c18923605cf39e4292d69038f3a")
					meinWebClientStart.DownloadFileAsync(New Uri(mAutomatischerDownloadURLListe(mStartDownload)), mInstalVerzeichnisBackSlash & "\Download\" &  mAutomatischerDownloadDateiListe(mStartDownload))
				End If
				If mStartDownload = 2 Then
					Dim meinWebClientStart As WebClient = New WebClient
					meinWebClientStart.UseDefaultCredentials= True
					meinWebClientStart.Credentials = CredentialCache.DefaultCredentials
					meinWebClientStart.Proxy.Credentials = CredentialCache.DefaultCredentials
					AddHandler meinWebClientStart.DownloadFileCompleted, AddressOf meinWebClientStart_DownloadCompleted
					meinWebClientStart.Headers.Add("Cookie", "__test=3c020c18923605cf39e4292d69038f3a")
					meinWebClientStart.DownloadFileAsync(New Uri(mAutomatischerDownloadURLListe(mStartDownload)), mInstalVerzeichnisBackSlash & "\Download\" &  mAutomatischerDownloadDateiListe(mStartDownload))
				End If
				If mStartDownload = 3 Then
					Dim meinWebClientStart As WebClient = New WebClient
					meinWebClientStart.UseDefaultCredentials= True
					meinWebClientStart.Credentials = CredentialCache.DefaultCredentials
					meinWebClientStart.Proxy.Credentials = CredentialCache.DefaultCredentials
					AddHandler meinWebClientStart.DownloadFileCompleted, AddressOf meinWebClientStart_DownloadCompleted
					meinWebClientStart.Headers.Add("Cookie", "__test=3c020c18923605cf39e4292d69038f3a")
					meinWebClientStart.DownloadFileAsync(New Uri(mAutomatischerDownloadURLListe(mStartDownload)), mInstalVerzeichnisBackSlash & "\Download\" &  mAutomatischerDownloadDateiListe(mStartDownload))
				End If
				If mStartDownload = 4 And mNeueStartEXE = True Then
					Dim meinWebClientStart As WebClient = New WebClient
					meinWebClientStart.UseDefaultCredentials= True
					meinWebClientStart.Credentials = CredentialCache.DefaultCredentials
					meinWebClientStart.Proxy.Credentials = CredentialCache.DefaultCredentials
					AddHandler meinWebClientStart.DownloadFileCompleted, AddressOf meinWebClientStart_DownloadCompleted
					meinWebClientStart.Headers.Add("Cookie", "__test=3c020c18923605cf39e4292d69038f3a")
					meinWebClientStart.DownloadFileAsync(New Uri(mAutomatischerDownloadURLListe(mStartDownload)), mInstalVerzeichnisBackSlash & "\Download\" &  mAutomatischerDownloadDateiListe(mStartDownload))
				End If
			End If
			InstallierbareProgrammeAnzeigen()
		End Sub
		
		Sub meinWebClientStart_DownloadCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
			If mStartDownload = 0 Then
				mFileName = mInstalVerzeichnisBackSlash &"Download\installupdate.txt"
				If System.IO.File.Exists(mFileName) = True Then
					mInstallUpdate = IO.File.ReadAllText(mFileName)
					mInstallUpdate = mInstallUpdate.Trim
					mFileName = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\LetzteAkualisierungInstallierbareProgramme.txt"
					mLetzteAkualisierungInstallierbareProgramme = IO.File.ReadAllText(mFileName)
					mLetzteAkualisierungInstallierbareProgramme = mLetzteAkualisierungInstallierbareProgramme.Trim
					lblNeu.Visible = False
					If mLetzteAkualisierungInstallierbareProgramme < mInstallUpdate Then
						mNeueProgramme = True
						lblNeu.Visible = True
						mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\LetzteAkualisierungInstallierbareProgramme.txt"
						Dim objWriter As New System.IO.StreamWriter(mFileName)
						objWriter.WriteLine(mInstallUpdate.Trim)
						objWriter.Close()
					End If
				End If
				For Each gefundeneDateien As String In My.Computer.FileSystem.GetFiles(mInstalVerzeichnisBackSlash &"Download")
					My.Computer.FileSystem.DeleteFile(gefundeneDateien)
				Next
			End If
			
			If mStartDownload = 1 Then
				mFileName = mInstalVerzeichnisBackSlash &"Download\startupdate.txt"
				If System.IO.File.Exists(mFileName) = True Then
					mStartUpdate = IO.File.ReadAllText(mFileName)
					mStartUpdate = mStartUpdate.Trim
					If mStartVersion < mStartUpdate Then
						btStartUpdate.Text = "Start Vers. " & mStartUpdate & " installieren"	
					Else
						btStartUpdate.Text = "Die akuellste Start Vers. ist schon installiert"
						btStartUpdate.Enabled = false
					End If
					If mStartVersion < mStartUpdate And mAutoUpdate = True Then
						mNeueStartEXE = True
						prznofkInfoUpdate()
						mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
						Dim objWriter As New System.IO.StreamWriter(mFileName)
						objWriter.WriteLine(nofkfinfo & mStartUpdate.Trim)
						objWriter.Close()					
					End If
				End If
				For Each gefundeneDateien As String In My.Computer.FileSystem.GetFiles(mInstalVerzeichnisBackSlash &"Download")
					My.Computer.FileSystem.DeleteFile(gefundeneDateien)
				Next
			End If
			
			If mStartDownload = 2 Then
				mFileName = mInstalVerzeichnisBackSlash &"Download\verwaltungupdate.txt"
				If System.IO.File.Exists(mFileName) = True Then
					mVerwaltungUpdate = IO.File.ReadAllText(mFileName)
					mVerwaltungUpdate = mVerwaltungUpdate.Trim
					btVerwaltungsUpdate.Text = "Verwaltung Vers. " & mVerwaltungUpdate & " installieren"
					If mVerwaltungVersion < mVerwaltungUpdate Then
						btVerwaltungsUpdate.Text = "Verwaltung Vers. " & mVerwaltungUpdate & " installieren"	
					Else
						btVerwaltungsUpdate.Text = "Die akuellste Verwaltung Vers. ist schon installiert"
						btVerwaltungsUpdate.Enabled = False
					End If
				End If
				For Each gefundeneDateien As String In My.Computer.FileSystem.GetFiles(mInstalVerzeichnisBackSlash &"Download")
					My.Computer.FileSystem.DeleteFile(gefundeneDateien)
				Next
			End If
			
			If mStartDownload = 3 And mNeueProgramme = True Then
				mFileName = mInstalVerzeichnisBackSlash &"Download\downloadbareprogramme.txt"
				If System.IO.File.Exists(mFileName) = True Then
					My.Computer.FileSystem.CopyFile(mInstalVerzeichnisBackSlash &"Download\downloadbareprogramme.txt",	mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\downloadbareprogramme.txt",True)
					My.Computer.FileSystem.CopyFile(mInstalVerzeichnisBackSlash &"Download\downloadbareprogramme.txt",	mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\downloadbareprogramme.txt.sic",True)
					For Each gefundeneDateien As String In My.Computer.FileSystem.GetFiles(mInstalVerzeichnisBackSlash &"Download")
						My.Computer.FileSystem.DeleteFile(gefundeneDateien)
					Next
					InstallierbareProgrammeAnzeigen()
				End If
			End If
			
			If mStartDownload = 4 And mNeueStartEXE = True Then
				mNeueStartEXE = False
				mFileName = mInstalVerzeichnisBackSlash &"Download\start.zip"
				If System.IO.File.Exists(mFileName) = True Then
					mMessagetext = "Es wurde die neue Version " & mStartUpdate & " des Programms Start.exe installiert"
					If mMessagetext.Length > 0 Then
						mEreignisanzeigeProzessID = Shell (mInstalVerzeichnisBackSlash & "Programme\PStart\Ereignisanzeige.exe " & mMessagetext,vbNormalFocus)
						Try
							AppActivate(mEreignisanzeigeProzessID)
						Catch ex As Exception
						End Try
					End If
					mMessagetext = ""
					mTextZeile = ""
					For Each mProcess As Process In Process.GetProcesses
						If mProcess.ProcessName = "Start" Then 
							If mProcess.MainModule.FileName = mInstalVerzeichnisBackSlash & "Start.exe" Then
								mStartProzessID = mProcess.Id.ToString
							End If
						End If
					Next 
					Try
						System.Diagnostics.Process.GetProcessById(mStartProzessID).Kill	
					Catch ex As Exception
					End Try
					Dim ProgrammEntZippen As New System.Diagnostics.Process()
					ProgrammEntZippen.StartInfo.FileName = mInstalVerzeichnisBackSlash & "Programme\7-Zip\7z.exe"
					ProgrammEntZippen.StartInfo.Arguments = "x -aoa -y  " & mInstalVerzeichnisBackSlash & "Download\start.zip"  & " -o" & mInstalVerzeichnisBackSlash
					ProgrammEntZippen.StartInfo.WindowStyle = ProcessWindowStyle.Minimized	
					ProgrammEntZippen.Start()
					ProgrammEntZippen.WaitForExit()
					If ProgrammEntZippen.HasExited Then
						For Each gefundeneDateien As String In My.Computer.FileSystem.GetFiles(mInstalVerzeichnisBackSlash &"Download")
							My.Computer.FileSystem.DeleteFile(gefundeneDateien)
						Next
					End If
				End If
			End If
			StartNextDownload()
		End Sub
		
		Sub InstallierbareProgrammeAnzeigen()
			lvDownloadAngebot.Items.Clear
			mFileName = mInstalVerzeichnisBackSlash &"Programme\PStart\Settings\downloadbareprogramme.txt"
			mFileNameDownloadbareProgramme = mFileName
			If System.IO.File.Exists(mFileName) = True Then
				mZeilenText = IO.File.ReadAllLines(mInstalVerzeichnisBackSlash &"Programme\PStart\Settings\downloadbareprogramme.txt")
				mZeilenTextLaenge = mZeilenText.Length
				For mZeilenzaehler  = 0 To mZeilenTextLaenge - 1
					mTextZeile = mZeilenText(mZeilenzaehler)
					mDownloadAngebotListe(mZeilenzaehler) = mTextZeile
					TextzeileZerlegen()
					mDownloadDateiListeReihenfolge(mZeilenzaehler)= Rechts("00"& mZeilenzaehler,3)
					mDownloadDateiListe(mZeilenzaehler) = mProgrammZipDatei
					mDownloadProgrammordnerListe(mZeilenzaehler) = mProgrammOrdner
					mDownloadIconnummerListe(mZeilenzaehler)  = mIconnummerString
					mDownloadVersionListe(mZeilenzaehler) = mVersion
					mDownloadProgrammnameListe(mZeilenzaehler) = mProgrammname 
					mDownloadRubrikListe(mZeilenzaehler) = mRubrik
					mListViewEintrag=lvDownloadAngebot.Items.Add("", mIconnummerInteger)
					mListViewEintrag.SubItems.Add(mProgrammname)
					mListViewEintrag.SubItems.Add(mVersion)
					mListViewEintrag.SubItems.Add(mRubrik)
					mListViewEintrag.SubItems.Add(Datumumwandlung(mAktualisierungsdatum))
					lblNeu.Visible = True
					If mNeu = "Neu"  And lblNeu.Visible = True Then
						lvDownloadAngebot.Items.Item(mZeilenzaehler).ForeColor = Color.Red 
						lvDownloadAngebot.Items.Item(mZeilenzaehler).Font = new Font(lvDownloadAngebot.Font, FontStyle.Bold)
					Else
						lvDownloadAngebot.Items.Item(mZeilenzaehler).ForeColor = Color.Black
					End If
				Next
				lbVerfuegbareProgramme.Text = "Liste der auf dem Downloadserver verfügbaren " & lvDownloadAngebot.Items.Count.ToString & " Programme"
			End If
		End Sub
		
		Sub TextzeileZerlegen()
			mRubrik = ""
			mIconnummerString = ""
			mIconnummerInteger = -1
			mProgrammname = ""
			mVersion = ""
			mAktualisierungsdatum =  ""
			mProgrammOrdner = ""
			mProgrammZipDatei = ""
			mAbhaengigVon = ""
			mAbhaengigVon1 = ""
			mAbhaengigVon2 = ""
			mAbhaengigMehrfach1 = ""
			mAbhaengigMehrfach2 = ""
			mAbhaengigMehrfach3 = ""
			mNeu = ""
			mNr = mTextZeile.Substring(0,mTextZeile.IndexOf("**"))
			mTextZeile= mTextZeile.Substring(mRubrik.Length + 5, mTextZeile.Length - mNr.Length - 2)
			mRubrik = mTextZeile.Substring(0,mTextZeile.IndexOf("**"))
			mTextZeile= mTextZeile.Substring(mRubrik.Length + 2, mTextZeile.Length - mRubrik.Length - 2)
			mIconnummerString = mTextZeile.Substring(0,mTextZeile.IndexOf("**"))
			mIconnummerInteger = CInt(mIconnummerString)
			mTextZeile= mTextZeile.Substring(mIconnummerString.Length + 2, mTextZeile.Length - mIconnummerString.Length - 2)
			mProgrammname = mTextZeile.Substring(0,mTextZeile.IndexOf("**"))
			mTextZeile= mTextZeile.Substring(mProgrammname.Length + 2, mTextZeile.Length - mProgrammname.Length - 2)
			mVersion = mTextZeile.Substring(0,mTextZeile.IndexOf("**"))
			mTextZeile = mTextZeile.Substring(mVersion.Length + 2, mTextZeile.Length - mVersion.Length - 2)
			mAktualisierungsdatum =  mTextZeile.Substring(0,mTextZeile.IndexOf("**"))
			mTextZeile = mTextZeile.Substring(mAktualisierungsdatum.Length + 2, mTextZeile.Length - mAktualisierungsdatum.Length - 2)
			mProgrammOrdner = mTextZeile.Substring(0,mTextZeile.IndexOf("**"))
			mTextZeile = mTextZeile.Substring(mProgrammOrdner.Length + 2, mTextZeile.Length - mProgrammOrdner.Length - 2)
			mProgrammZipDatei = mTextZeile.Substring(0,mTextZeile.IndexOf("**"))
			mTextZeile = mTextZeile.Substring(mProgrammZipDatei.Length + 2, mTextZeile.Length - mProgrammZipDatei.Length - 2)
			mAbhaengigVon = mTextZeile.Substring(0,mTextZeile.IndexOf("**"))
			mAbhaengigVonMerk = mAbhaengigVon
			If mAbhaengigVon.Length > 0 Then
				If mAbhaengigVon.Substring(0,1) = "|" Then
					mAbhaengigMehrfach1 = mAbhaengigVon.Substring(1, mAbhaengigVon.Substring(1,mAbhaengigVon.Length - 1).IndexOf("|"))
					mAbhaengigVon = mAbhaengigVon.Substring(mAbhaengigMehrfach1.Length + 1, mAbhaengigVon.Length - mAbhaengigMehrfach1.Length - 1)
					If mAbhaengigVon.Length > 1 Then
						mAbhaengigMehrfach2 = mAbhaengigVon.Substring(1, mAbhaengigVon.Substring(1,mAbhaengigVon.Length - 1).IndexOf("|"))
						mAbhaengigVon = mAbhaengigVon.Substring(mAbhaengigMehrfach2.Length + 1, mAbhaengigVon.Length - mAbhaengigMehrfach2.Length - 1)
						If mAbhaengigVon.Length > 1 Then
							mAbhaengigMehrfach3 = mAbhaengigVon.Substring(1, mAbhaengigVon.Substring(1,mAbhaengigVon.Length - 1).IndexOf("|"))
						End If
					End If
				End If
			End If
			mAbhaengigVon = mAbhaengigVonMerk
			If mAbhaengigVon.Length > 0 Then
				If mAbhaengigVon.Substring(0,1) = "/" Then
					mAbhaengigVon1 = mAbhaengigVon.Substring(1, mAbhaengigVon.Substring(1,mAbhaengigVon.Length - 1).IndexOf("/"))
					mAbhaengigVon2 = mAbhaengigVon.Substring(mAbhaengigVon1.Length + 2, mAbhaengigVon.Length - 1 - (mAbhaengigVon1.Length + 2))
				End If
			End If
			mTextZeile = mTextZeile.Substring(mAbhaengigVon.Length + 2, mTextZeile.Length - mAbhaengigVon.Length - 2)
			mNeu = mTextZeile
		End Sub
		
		Sub InstallierteProgrammeAnzeigen()
			lvInstalliert.Items.Clear
			lvInstalliert.CheckBoxes = True
			lvInstalliert.ForeColor = Color.Black
			mProgrammPfad = mInstalVerzeichnisBackSlash & "Programme\"
			mZeilenzaehler = -1
			For Each suchOrdner As String In My.Computer.FileSystem.GetDirectories(mProgrammPfad)
				mFileName = suchOrdner & "\installiert.txt"
				If System.IO.File.Exists(mFileName) = True Then
					mZeilenzaehler = mZeilenzaehler + 1
					mZeilenText = IO.File.ReadAllLines(suchOrdner & "\installiert.txt")
					mTextZeile = Rechts("00" & mZeilenzaehler.ToString,3) & "**" & mZeilenText(0) 
					TextzeileZerlegen()
					mInstalliertDatumListe(mZeilenzaehler) = mAktualisierungsdatum
					mInstalliertProgrammordnerListe(mZeilenzaehler) = mProgrammOrdner
					mListViewEintrag=lvInstalliert.Items.Add("     " & mAktualisierungsdatum, mIconnummerInteger)
					mListViewEintrag.SubItems.Add(mProgrammname)
					mListViewEintrag.SubItems.Add(mVersion)
					mListViewEintrag.SubItems.Add(mRubrik)
					mListViewEintrag.SubItems.Add(Datumumwandlung(mAktualisierungsdatum))
					mInstallierteProgrammeZaehler  = mInstallierteProgrammeZaehler + 1
				End If
			Next
			lbInstallierteProgramme.Text = "Liste der auf dem Stick bisher installierten " & lvInstalliert.Items.Count.ToString & " Programme"
			mAnzahlInstallierteProgramme = mZeilenzaehler
			If lvInstalliert.Items.Count = 0 Then
				lvInstalliert.CheckBoxes = False
				lvInstalliert.ForeColor = Color.Red
				mListViewEintrag=lvInstalliert.Items.Add("")
				mListViewEintrag.SubItems.Add("derzeit sind noch keine Programme installiert")
			End If
		End Sub
		
		Public Function Datumumwandlung(ByVal datum As String)
			Return datum.Substring(6,2) & "." & datum.Substring(4,2) & "." & datum.Substring(0,4)
		End Function
		
		Sub AbhaengigkeitPruefen()
			mAbhaengigVonAusgewaehlt = False
			For Each lvZeile as ListViewItem In lvDownloadAngebot.Items
				If lvZeile.Checked Then
					mTextZeile = mDownloadAngebotListe(lvZeile.Index)
					TextzeileZerlegen()
					If mProgrammname = "Xampp - Apache + Tomcat + MySQL + FileZilla" And mVersion = "7.4.7" Then
						mFileName = mInstalVerzeichnisBackSlash & "Programme\Xampp\installiert.txt"
						If System.IO.File.Exists(mFileName) = True Then
							mMessageText = "Sie haben bereits Xampp 7.1.0 installiert und wollen nun Xampp 7.4.7 zusätzlich installieren." & CHR(10) & "Es ist ratsam, Xampp 7.1.0 zu entfernen, da Ihre mySQL - Datenbanken durch die Nutzung von Xampp 7.4.7 so " & CHR(10) & "umorganisiert wird, dass ein Wechsel zurück zu Xampp 7.1.0 nicht mehr möglich ist." & CHR(10) & CHR(10) & "Starten Sie ausserdem zusätzlich einmal den Menüpunkt" & Chr(10) & "                              >> MySQLUpgrade <<" & CHR(10) & "um Ihre Datenbanken auf den neuesten Stand zu bringen." & CHR(10) & CHR(10) & "Im Menü wird nun die Xampp 7.1.0 Version nicht mehr angezeigt!"
							mMessageText = mMessageText & Chr(10) & Chr(10) & "Zusätzlich ist es sinnvoll, ein Backup des Ordners" & Chr(10) & ">> EigeneDateien\mySQLData << zu erstellen" & Chr(10) & Chr(10)  & Chr(10) & Chr(10) & "Wollen Sie zusätzliche Informationen im Dokument"  & Chr(10) & ">> Xampp-Update.pdf << aus dem Menü-Ordner"  & Chr(10) & ">> Hilfe und Dokumentation << dazu sehen?"
							mMessageText = mMessageText & Chr(10) & "Oder brechen Sie die Installation ab."
							mMehrInfo = clsTopMostMessageBox.Show(mMessageText, _
								"Programm Inkompatibilität", _
								MessageBoxButtons.YesNoCancel, _
								MessageBoxIcon.Exclamation)
							If mMehrInfo = 6 Then
								Process.Start(mInstalVerzeichnisBackSlash & "\Hilfe_und_Dokumentation\Xampp-Update.pdf")
							End If
							If mMehrInfo = 2 Or mMehrInfo = 7 Then
								lvZeile.Checked = False
							End If
						End If
					End If
					If mProgrammname = "Xampp - Apache + Tomcat + MySQL + FileZilla" And mVersion = "7.1.0" Then
						mFileName = mInstalVerzeichnisBackSlash & "Programme\Xampp_7.4.7\installiert.txt"
						If System.IO.File.Exists(mFileName) = True Then
							mMessageText = "Sie haben bereits Xampp 7.4.7 installiert und wollen nun Xampp 7.1.0 zusätzlich installieren." & CHR(10) & "Es ist ratsam, Xampp 7.1.0 nicht zu installieren, da Ihre mySQL - Datenbanken durch die Nutzung von Xampp 7.4.7 so " & CHR(10) & "umorganisiert wurde, dass ein Wechsel zurück zu Xampp 7.1.0 nicht mehr möglich ist." & CHR(10) & CHR(10)  & "Deshalb wird im Menü wird die Xampp 7.1.0 Version nicht mehr angezeigt!"
							mMessageText = mMessageText & Chr(10) & Chr(10) & "Wollen Sie zusätzliche Informationen im Dokument"  & Chr(10) & ">> Xampp-Update.pdf << aus dem Menü-Ordner"  & Chr(10) & ">> Hilfe und Dokumentation << dazu sehen?"
							mMessageText = mMessageText & Chr(10) & "Oder brechen Sie die Installation ab."
							mMehrInfo = clsTopMostMessageBox.Show(mMessageText, _
								"Programm Inkompatibilität", _
								MessageBoxButtons.YesNoCancel, _
								MessageBoxIcon.Exclamation)
							If mMehrInfo = 6 Then
								Process.Start(mInstalVerzeichnisBackSlash & "\Hilfe_und_Dokumentation\Xampp-Update.pdf")
							End If
							If mMehrInfo = 2 Or mMehrInfo = 7 Then
								lvZeile.Checked = False
							End If
						End If
					End If
					If mAbhaengigVon.Length > 0 Then
						mMessageText = "Das Programm " & mProgrammname & " setzt voraus, dass "
						mFileName = mInstalVerzeichnisBackSlash & "Programme\" & mAbhaengigVon & "\installiert.txt"
						If System.IO.File.Exists(mFileName) = False Then
							For Each lvZeileAbhaengigkeitVon As ListViewItem In lvDownloadAngebot.Items
								If mDownloadProgrammordnerListe(lvZeileAbhaengigkeitVon.Index) = mAbhaengigVon Then
									If System.IO.File.Exists(mFileName) = False Then
										If lvZeileAbhaengigkeitVon.Checked = False Then
											lvZeileAbhaengigkeitVon.Checked = True
											mAbhaengigVonAusgewaehlt = True
											clsTopMostMessageBox.Show(mMessageText & mAbhaengigVon & " mit installiert ist!" & CHR(10) & "Deshalb wurde automatisch " & mAbhaengigVon & " mit ausgewählt." & CHR(10) & CHR(10) & "Bitte klicken Sie erneut auf den Schalter mit der Aufschrift" & CHR(10) & "> Markierte Programme herunterladen und installieren <" , _
												"Auswahlergänzung", _
												MessageBoxButtons.OK, _
												MessageBoxIcon.Exclamation)
										End If
									End If
								End If
								If mDownloadProgrammordnerListe(lvZeileAbhaengigkeitVon.Index) = mAbhaengigVon1 Then
									mFileName = mInstalVerzeichnisBackSlash & "Programme\" & mAbhaengigVon1 & "\installiert.txt"
									If System.IO.File.Exists(mFileName) = False Then
										mFileName = mInstalVerzeichnisBackSlash & "Programme\" & mAbhaengigVon2 & "\installiert.txt"
										If System.IO.File.Exists(mFileName) = False Then
											If lvZeileAbhaengigkeitVon.Checked = False Then
												lvZeileAbhaengigkeitVon.Checked = True
												mAbhaengigVonAusgewaehlt = True
												clsTopMostMessageBox.Show(mMessageText & mAbhaengigVon & " mit installiert ist!" & CHR(10) & "Deshalb wurde automatisch " & mAbhaengigVon & " mit ausgewählt." & CHR(10) & CHR(10) & "Bitte klicken Sie erneut auf den Schalter mit der Aufschrift" & CHR(10) & "> Markierte Programme herunterladen und installieren <" , _
													"Auswahlergänzung", _
													MessageBoxButtons.OK, _
													MessageBoxIcon.Exclamation)
											End If
										End If
									End If
								End If
							Next	
						End If
					End If
					
					If mAbhaengigMehrfach1.Length > 0 Then
						mMessageText = "Das Programm " & mProgrammname & " setzt voraus, dass "
						mFileName = mInstalVerzeichnisBackSlash & "Programme\" & mAbhaengigMehrfach1 & "\installiert.txt"
						If System.IO.File.Exists(mFileName) = False Then
							For Each lvZeileAbhaengigkeitVon As ListViewItem In lvDownloadAngebot.Items
								If mDownloadProgrammordnerListe(lvZeileAbhaengigkeitVon.Index) = mAbhaengigMehrfach1 Then
									If System.IO.File.Exists(mFileName) = False Then
										If lvZeileAbhaengigkeitVon.Checked = False Then
											lvZeileAbhaengigkeitVon.Checked = True
											mAbhaengigVonAusgewaehlt = True
											clsTopMostMessageBox.Show(mMessageText & mAbhaengigMehrfach1 & " mit installiert ist!" & CHR(10) & "Deshalb wurde automatisch " & mAbhaengigMehrfach1 & " mit ausgewählt." & CHR(10) & CHR(10) & "Bitte klicken Sie erneut auf den Schalter mit der Aufschrift" & CHR(10) & "> Markierte Programme herunterladen und installieren <" , _
												"Auswahlergänzung", _
												MessageBoxButtons.OK, _
												MessageBoxIcon.Exclamation)
										End If
									End If
								End If
							Next	
						End If
					End If
					If mAbhaengigMehrfach2.Length > 0 Then
						mMessageText = "Das Programm " & mProgrammname & " setzt voraus, dass "
						mFileName = mInstalVerzeichnisBackSlash & "Programme\" & mAbhaengigMehrfach2 & "\installiert.txt"
						If System.IO.File.Exists(mFileName) = False Then
							For Each lvZeileAbhaengigkeitVon As ListViewItem In lvDownloadAngebot.Items
								If mDownloadProgrammordnerListe(lvZeileAbhaengigkeitVon.Index) = mAbhaengigMehrfach2 Then
									If System.IO.File.Exists(mFileName) = False Then
										If lvZeileAbhaengigkeitVon.Checked = False Then
											lvZeileAbhaengigkeitVon.Checked = True
											mAbhaengigVonAusgewaehlt = True
											clsTopMostMessageBox.Show(mMessageText & mAbhaengigMehrfach2 & " mit installiert ist!" & CHR(10) & "Deshalb wurde automatisch " & mAbhaengigMehrfach2 & " mit ausgewählt." & CHR(10) & CHR(10) & "Bitte klicken Sie erneut auf den Schalter mit der Aufschrift" & CHR(10) & "> Markierte Programme herunterladen und installieren <" , _
												"Auswahlergänzung", _
												MessageBoxButtons.OK, _
												MessageBoxIcon.Exclamation)
										End If
									End If
								End If
							Next	
						End If
					End If
					If mAbhaengigMehrfach3.Length > 0 Then
						mMessageText = "Das Programm " & mProgrammname & " setzt voraus, dass "
						mFileName = mInstalVerzeichnisBackSlash & "Programme\" & mAbhaengigMehrfach3 & "\installiert.txt"
						If System.IO.File.Exists(mFileName) = False Then
							For Each lvZeileAbhaengigkeitVon As ListViewItem In lvDownloadAngebot.Items
								If mDownloadProgrammordnerListe(lvZeileAbhaengigkeitVon.Index) = mAbhaengigMehrfach3 Then
									If System.IO.File.Exists(mFileName) = False Then
										If lvZeileAbhaengigkeitVon.Checked = False Then
											lvZeileAbhaengigkeitVon.Checked = True
											mAbhaengigVonAusgewaehlt = True
											clsTopMostMessageBox.Show(mMessageText & mAbhaengigMehrfach3 & " mit installiert ist!" & CHR(10) & "Deshalb wurde automatisch " & mAbhaengigMehrfach3 & " mit ausgewählt." & CHR(10) & CHR(10) & "Bitte klicken Sie erneut auf den Schalter mit der Aufschrift" & CHR(10) & "> Markierte Programme herunterladen und installieren <" , _
												"Auswahlergänzung", _
												MessageBoxButtons.OK, _
												MessageBoxIcon.Exclamation)
										End If
									End If
								End If
							Next	
						End If
					End If
					
				End If
			Next
		End Sub
		
		Sub BtDownloadInstalClick(sender As Object, e As EventArgs)
			If chkFlexibel.Checked = False Then
				clsTopMostMessageBox.Show("Denken Sie daran, nach der Installation einmal" & CHR(10) & "einen Start im Flexibel-Modus durchzuführen!" & CHR(10) & CHR(10) & "Sonst werden neu installierte Programme nicht im Menü angezeigt!", _
					"Fix-Modus ist eingestellt", _
					MessageBoxButtons.OK, _
					MessageBoxIcon.Exclamation)
			End If
			If TestWebConnection() = 1 Then
				lblVerbindung.Text = "Verbindungsstatus: Verbunden"
				AbhaengigkeitPruefen()	
				If mAbhaengigVonAusgewaehlt = False then
					mZaehler = -1
					For Each lvZeile as ListViewItem In lvDownloadAngebot.Items
						If lvZeile.Checked Then
							mZaehler = mZaehler + 1
							mTextZeile = mDownloadAngebotListe(lvZeile.Index)
							TextzeileZerlegen()
							mDownloadDateiListe(mZaehler) = mProgrammZipDatei
							mDownloadProgrammordnerListe(mZaehler) = mProgrammOrdner
							mDownloadIconnummerListe(mZaehler)  = mIconnummerString
							mDownloadVersionListe(mZaehler) = mVersion
							mDownloadProgrammnameListe(mZaehler) = mProgrammname 
							mDownloadRubrikListe(mZaehler) = mRubrik
							mDownloadURLListe(mZaehler) = mUpdateControlURL & mProgrammZipDatei	
							mFileName = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\Test.txt"
							If System.IO.File.Exists(mFileName) = True Then
								mDownloadURLListe(mZaehler) = mUpdateControlURL & "/test/" & mProgrammZipDatei		
							End If
							lvZeile.Checked = False
						End If
					Next
					mEndeDownload = mZaehler + 1
					mDownloadzaehler = -1
					StartNextInstallationsDownload()
				End If 
			Else
				lblVerbindung.Text = "Verbindungsstatus: Getrennt"
				clsTopMostMessageBox.Show("Aktuell besteht keine Verbindung zum Downloadserver", "Vorgang abgebrochen", _
					MessageBoxButtons.OK, _
					MessageBoxIcon.Information)
			End If 
		End Sub
		
		Sub StartNextInstallationsDownload
			ServicePointManager.Expect100Continue = True
			ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)
			mGesamtbyteszumHerunterladen = 0
			mDownloadzaehler = mDownloadzaehler + 1
			If mEndeDownload = 1 Then
				lblDateienAnzahl.Text = mDownloadzaehler + 1 & " von " & mEndeDownload & vbCrLf & " Programm"
			Else
				lblDateienAnzahl.Text = mDownloadzaehler + 1 & " von " & mEndeDownload & vbCrLf & " Programmen"
			End If
			
			If mDownloadzaehler = mEndeDownload Then
				progressDownload.Visible = False
				lblDownloadFortschritt.Visible = False
				lblDownloadInfo.Visible = False
				lblMomentaneInstallation.Visible = False
				picInstallationsanzeige.Visible = False
				btDownloadInstal.Enabled = True
				btMarkierteProgrammeEntfernen.Enabled = True
				lblDateienAnzahl.Visible = False
			Else
				Dim meinInstallationsDownloadClient As WebClient = New WebClient
				meinInstallationsDownloadClient.UseDefaultCredentials= True
				meinInstallationsDownloadClient.Credentials = CredentialCache.DefaultCredentials
				meinInstallationsDownloadClient.Proxy.Credentials = CredentialCache.DefaultCredentials
				AddHandler meinInstallationsDownloadClient.DownloadProgressChanged, AddressOf meinInstallationsDownloadClient_ProgressChanged
				AddHandler meinInstallationsDownloadClient.DownloadFileCompleted, AddressOf meinInstallationsDownloadClient_DownloadCompleted
				meinInstallationsDownloadClient.Headers.Add("Cookie", "__test=3c020c18923605cf39e4292d69038f3a")
				lblMomentaneInstallation.Text = mDownloadDateiListe(mDownloadzaehler)
				progressDownload.Value = 0
				progressDownload.Visible = True
				lblDownloadFortschritt.Visible = True
				lblDownloadInfo.Visible = True
				lblDownloadInfo.Text = ""
				lblMomentaneInstallation.Visible = True
				picInstallationsanzeige.Visible = True
				btDownloadInstal.Enabled = False
				btMarkierteProgrammeEntfernen.Enabled = False
				lblDateienAnzahl.Visible = True
				meinInstallationsDownloadClient.DownloadFileAsync(New Uri(mDownloadURLListe(mDownloadzaehler)), mInstalVerzeichnisBackSlash & "Download/" &  mDownloadDateiListe(mDownloadzaehler))
			End If
		End Sub
		
		Sub meinInstallationsDownloadClient_ProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
			progressDownload.Value = e.ProgressPercentage
			lblDownloadInfo.Text = mDownloadDateiListe(mDownloadzaehler) & "  " & Int(e.BytesReceived/1000) & " kB von " & Int(e.TotalBytesToReceive/1000) & " kB"
			mGesamtbyteszumHerunterladen = e.TotalBytesToReceive 
		End Sub
		
		Sub meinInstallationsDownloadClient_DownloadCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
			If mGesamtbyteszumHerunterladen > 0 Then
				lblDownloadInfo.Text = mDownloadDateiListe(mDownloadzaehler) & " Entpacken und Installieren"
				mFileName = mInstalVerzeichnisBackSlash &"Download\" & mDownloadDateiListe(mDownloadzaehler)
				If System.IO.File.Exists(mFileName) = True Then
					Dim ProgrammEntZippen As New System.Diagnostics.Process()
					ProgrammEntZippen.StartInfo.FileName = mInstalVerzeichnisBackSlash & "Programme\7-Zip\7z.exe"
					ProgrammEntZippen.StartInfo.Arguments = "x -aoa -y  " & mInstalVerzeichnisBackSlash & "Download\" & mDownloadDateiListe(mDownloadzaehler)  & " -o" & mInstalVerzeichnisBackSlash & "Programme\" 
					ProgrammEntZippen.StartInfo.WindowStyle = ProcessWindowStyle.Normal	
					ProgrammEntZippen.Start()
					ProgrammEntZippen.WaitForExit()
					If ProgrammEntZippen.HasExited Then
						mFileName  = mInstalVerzeichnisBackSlash & "Programme\" & mDownloadProgrammordnerListe(mDownloadzaehler) & "\installiert.txt"
						IO.File.WriteAllText(mFileName,mDownloadRubrikListe(mDownloadzaehler) & "**" & mDownloadIconnummerListe(mDownloadzaehler) & "**" & mDownloadProgrammnameListe(mDownloadzaehler) & "**" & mDownloadVersionListe(mDownloadzaehler) & "**" & DateTime.Now.ToString("yyyyMMddhhmmss") & "**" &  mDownloadProgrammordnerListe(mDownloadzaehler) & "******")		
						For Each foundFile As String In My.Computer.FileSystem.GetFiles( mInstalVerzeichnisBackSlash & "Programme\" & mDownloadProgrammordnerListe(mDownloadzaehler), FileIO.SearchOption.SearchTopLevelOnly, "*.ico")
							Try
								My.Computer.FileSystem.CopyFile(foundFile ,
									mInstalVerzeichnisBackSlash & "Icon\" & My.Computer.FileSystem.GetName(foundFile))
							Catch ex As Exception
							End Try
						Next
						InstallierteProgrammeAnzeigen()
						For Each gefundeneDateien As String In My.Computer.FileSystem.GetFiles(mInstalVerzeichnisBackSlash & "Download")
							Try
								My.Computer.FileSystem.DeleteFile(gefundeneDateien)
							Catch ex As Exception
							End Try
						Next
					End If
				End If
			Else
				clsTopMostMessageBox.Show(mDownloadDateiListe(mDownloadzaehler) & " konnte nicht heruntergeladen werden", _
					"Downloadfehler", _
					MessageBoxButtons.OK, _
					MessageBoxIcon.Exclamation)
			End If	
			progressDownload.Visible = False
			lblDownloadFortschritt.Visible = False
			lblDownloadInfo.Visible = False
			lblMomentaneInstallation.Visible = False
			picInstallationsanzeige.Visible = False
			btDownloadInstal.Enabled = True
			btMarkierteProgrammeEntfernen.Enabled = True
			StartNextInstallationsDownload()
		End Sub
		
		Public Function Rechts(ByVal sText As String, _
			ByVal nLen As Integer) As String
			
			If nLen > sText.Length Then nLen = sText.Length
			Return (sText.Substring(sText.Length - nLen))
		End Function
		
		Public Function Links(ByVal sText As String, _
			ByVal nLen As Integer) As String
			
			If nLen > sText.Length Then nLen = sText.Length
			Return (sText.Substring(0, nLen))
		End Function
		
		Sub BtMarkierteProgrammeEntfernenClick(sender As Object, e As EventArgs)
			For mZaehler = 0 To 99
				mProgrammOrdnerLoeschen(mZaehler) = Nothing
			Next
			mZaehlerLoeschen = 0
			For Each lvZeile as ListViewItem In lvInstalliert.Items
				If lvZeile.Checked Then
					lvInstalliert.Items(lvZeile.Index).Selected = True
					mText = lvInstalliert.SelectedItems(0).SubItems(0).Text.Trim
					lvInstalliert.Items(lvZeile.Index).Selected = false
					For mZaehler = 0 To 99
						If mText = mInstalliertDatumListe(mZaehler) Then
							mProgrammOrdner = mInstalliertProgrammordnerListe(mZaehler)
							mProgrammOrdnerLoeschen(mZaehlerLoeschen) = mInstalliertProgrammordnerListe(mZaehler)
							mZaehlerLoeschen = mZaehlerLoeschen + 1
							btMarkierteProgrammeEntfernen.Text = "Bitte warten"
							btMarkierteProgrammeEntfernen.ForeColor = Color.Red
							btMarkierteProgrammeEntfernen.Font = New Font("Sans Serif", 10,  FontStyle.Bold)
							btMarkierteProgrammeEntfernen.Update
							Try
								System.IO.Directory.Delete(mInstalVerzeichnisBackSlash & "Programme\" & mProgrammOrdner,True)
							Catch ex As Exception
							End Try
							btMarkierteProgrammeEntfernen.Text = "Markierte Programme entfernen"
							btMarkierteProgrammeEntfernen.ForeColor = Color.Black 
							btMarkierteProgrammeEntfernen.Font = New Font("Sans Serif", 10,  FontStyle.Bold)
							btMarkierteProgrammeEntfernen.Update	
						End If
					Next
				End If
			Next
			InstallierteProgrammeAnzeigen()
		End Sub
		
		Sub BtEigeneDateienPfadAendernClick(sender As Object, e As EventArgs)
			mSuchpfad = Links(mEigeneDateienVerzeichnis, Len(mEigeneDateienVerzeichnis) - 14)
			meinFolderBrowserDialog.SelectedPath = mSuchpfad
			If meinFolderBrowserDialog.ShowDialog=DialogResult.OK Then
				mEntscheidung = DialogResult.No
				If System.IO.Directory.Exists(meinFolderBrowserDialog.SelectedPath & "EigeneDateien") = True Then
					mEntscheidung = clsTopMostMessageBox.Show("Das Verzeichnis " & meinFolderBrowserDialog.SelectedPath & "EigeneDateien existiert schon. " & CHR(10) & "Soll es überschrieben werden?" ,	"Hinweis", _
						MessageBoxButtons.YesNo, _
						MessageBoxIcon.Question)
				Else
					mEntscheidung = DialogResult.Yes
				End If
				If mEntscheidung = DialogResult.Yes 
					clsTopMostMessageBox.Show("Das gesamte Verzeichnis " & lblPfadEigeneDateien.Text & " wird nach  " & meinFolderBrowserDialog.SelectedPath & "\EigeneDateien KOPIERT" & CHR(10) & "und künftig als Pfad zu EigeneDateien verwendet !" & CHR(10) & CHR(10) & "Den Standardpfad " &  mInstalVerzeichnisBackSlash & "\EigeneDateien sollten Sie dennoch nicht löschen, damit im Bedarfsfall darauf zurückgegriffen wird, falls der von Ihnen eingestellte Pfad nicht verfügbar ist (bei Netzwerken oder externen Datenträgern" , "Hinweis", _
						MessageBoxButtons.OK, _
						MessageBoxIcon.Information)
					lblPfadEigeneDateien.Text = meinFolderBrowserDialog.SelectedPath & "\EigeneDateien"
					IO.File.WriteAllText(mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\aktuellesEigeneDateienVerzeichnis.txt",lblPfadEigeneDateien.Text)
					mEigeneDateienZielpfad = lblPfadEigeneDateien.Text
					Dim EigeneDateienKopieren As New System.Diagnostics.Process()
					EigeneDateienKopieren.StartInfo.FileName = "xcopy.exe"
					'EigeneDateienKopieren.StartInfo.Arguments = "/I /h /e /y " & mEigeneDateienQuellpfad & " " &  mEigeneDateienZielpfad 
					EigeneDateienKopieren.StartInfo.Arguments = "/I /h /e /y " & mEigeneDateienQuellpfad & " " & Chr(34) &  mEigeneDateienZielpfad & Chr(34)
					EigeneDateienKopieren.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
					EigeneDateienKopieren.Start()
					EigeneDateienKopieren.WaitForExit()
					mEigeneDateienVerzeichnis = mEigeneDateienZielpfad
				End If
				If mEntscheidung = DialogResult.No 
					lblPfadEigeneDateien.Text = meinFolderBrowserDialog.SelectedPath & "EigeneDateien"
					mEigeneDateienZielpfad = lblPfadEigeneDateien.Text
					IO.File.WriteAllText(mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\aktuellesEigeneDateienVerzeichnis.txt",lblPfadEigeneDateien.Text)
					mEigeneDateienVerzeichnis = mEigeneDateienZielpfad
				End If
			End If
		End Sub
		
		Function TestWebConnection() As Integer
			Try
				txt = mUpdateControlURL
				mFundstelle = txt.IndexOf("//")
				txt = txt.substring(mFundstelle + 2,txt.Length - mFundstelle -2)
				mFundstelle = txt.IndexOf("/")
				txt = txt.substring(0, mFundstelle)
				My.Computer.Network.Ping(txt)
				lblVerbindungsname.Text = txt
				Return 1
			Catch ex As Exception
				Return 0
			End Try
		End Function
		
		Sub BtProgrammendeClick(sender As Object, e As EventArgs)
			mFileName = mInstalVerzeichnisBackSlash & "Start.exe"
			If System.IO.File.Exists(mFileName) = True And mAutoUpdate = True Then
				mFileName = mInstalVerzeichnisBackSlash & "Programme\Start.exe"
				If System.IO.File.Exists(mFileName) = True Then
					My.Computer.FileSystem.DeleteFile(mInstalVerzeichnisBackSlash & "Start.exe")
					System.IO.File.Move( mInstalVerzeichnisBackSlash & "Programme\Start.exe", mInstalVerzeichnisBackSlash & "Start.exe" )
				End If
			End If
			End		
		End Sub
		
		Public Function OpenEmail(ByVal EmailAddress As String, Optional ByVal Subject As String = "",  Optional ByVal Body As String = "")  As Boolean
			Dim bAns As Boolean = True
			Dim sParams As String
			sParams = EmailAddress
			If LCase(Strings.Left(sParams, 7)) <> "mailto:" Then    sParams = "mailto:" & sParams
			If Subject <> "" Then sParams = sParams &   "?subject=" & Subject
			If Body <> "" Then
				sParams = sParams & IIf(Subject = "", "?", "&")
				sParams = sParams & "body=" & Body
			End If
			Try
				System.Diagnostics.Process.Start(sParams)
			Catch
				bAns = False
			End Try
			Return bAns
		End Function
		
		Sub BtHotlineClick(sender As Object, e As EventArgs)
			OpenEmail("support@schultasche-bw.de", "S2025 Start Version " & mStartVersion & " /  Verwaltung Version " & mVerwaltungVersion, "Hallo Support-Team," & CHR(10) & CHR(10))
		End Sub
		
		Sub MainFormFormClosing(sender As Object, e As FormClosingEventArgs)
			mFileName = mInstalVerzeichnisBackSlash & "Start.exe"
			If System.IO.File.Exists(mFileName) = True And mAutoUpdate = True Then
				mFileName = mInstalVerzeichnisBackSlash & "Programme\Start.exe"
				If System.IO.File.Exists(mFileName) = True Then
					My.Computer.FileSystem.DeleteFile(mInstalVerzeichnisBackSlash & "Start.exe")
					System.IO.File.Move( mInstalVerzeichnisBackSlash & "Programme\Start.exe", mInstalVerzeichnisBackSlash & "Start.exe" )
				End If
			End If
		End Sub
		
		Sub prznofkInfoUpdate()
			nofkfinfo = ""
			If mAutoUpdate = False Then
				nofkfinfo = nofkfinfo & "n"
			End If
			If mOnline = False Then
				nofkfinfo = nofkfinfo & "o"
			End If
			If mFlexibel = False Then
				nofkfinfo = nofkfinfo & "f"
			End If
			If mKeineNews = True Then
				nofkfinfo = nofkfinfo & "k"
			End If
			nofkfinfo = nofkfinfo & "_"
		End Sub
		
		Sub ChkAutoUpdateMouseUp(sender As Object, e As MouseEventArgs)
			If chkAutoUpdate.Checked = true Then
				mAutoUpdate = True
				prznofkInfoUpdate()
				btStartUpdate.Enabled = False
				btVerwaltungsUpdate.Enabled = False
				mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
				Dim objWriter As New System.IO.StreamWriter(mFileName)
				objWriter.WriteLine(nofkfinfo & mStartUpdate.Trim)
				objWriter.Close()
			Else
				mAutoUpdate = False
				prznofkInfoUpdate()
				If btVerwaltungsUpdate.Text <> "Die akuellste Verwaltung Vers. ist schon installiert" And btVerwaltungsUpdate.Text <> "" Then
					btVerwaltungsUpdate.Enabled = True
				End If
				If btStartUpdate.Text <> "Die akuellste Start Vers. ist schon installiert" And btStartUpdate.Text <> "" Then
					btStartUpdate.Enabled = True
				End If
				mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
				Dim objWriter As New System.IO.StreamWriter(mFileName)
				objWriter.WriteLine(nofkfinfo & mStartUpdate.Trim)
				objWriter.Close()
			End If
		End Sub
		
		
		Sub BtVerwaltungsUpdateClick(sender As Object, e As EventArgs)
			If mOnline = False Then
				mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\VerwaltungVersion.txt"
				If System.IO.File.Exists(mFileName) = True Then
					Dim objWriter As New System.IO.StreamWriter(mFileName)
					objWriter.WriteLine("x_" & mVerwaltungVersion.Trim)
					objWriter.Close()
				End If
				clsTopMostMessageBox.Show("Beim nächste Start der Start.exe wird die neue Version " & mVerwaltungUpdate & " des Programms Verwaltung.exe installiert." & Chr(10) & Chr(10) _
					& "Deshalb wird bis nach dem nächsten Start auf " & Chr(10) _
					& ">> Start im Online-Modus << umgestellt !", _
					"Update ist vorbereitet", _
					MessageBoxButtons.OK, _
					MessageBoxIcon.Exclamation)
				chkOnline.Checked = True
				mOnline = True
				prznofkInfoUpdate()
				mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
				Dim objWriter1 As New System.IO.StreamWriter(mFileName)
				objWriter1.WriteLine(nofkfinfo & mStartVersion.Trim)
				objWriter1.Close()
			Else
				clsTopMostMessageBox.Show("Beim nächste Start der Start.exe wird die neue Version " & mVerwaltungUpdate & " des Programms Verwaltung.exe installiert.", _
					"Update ist vorbereitet", _
					MessageBoxButtons.OK, _
					MessageBoxIcon.Exclamation)
			End If
			btVerwaltungsUpdate.Enabled = False
			btVerwaltungsUpdate.Text = "Die akuellste Start Vers. ist schon installiert"
		End Sub
		
		Sub BtStartUpdateClick(sender As Object, e As EventArgs)
			mStartDownload = 4
			mNeueStartEXE = True
			mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
			Dim meinWebClientStart As WebClient = New WebClient
			meinWebClientStart.UseDefaultCredentials= True
			meinWebClientStart.Credentials = CredentialCache.DefaultCredentials
			meinWebClientStart.Proxy.Credentials = CredentialCache.DefaultCredentials
			AddHandler meinWebClientStart.DownloadFileCompleted, AddressOf meinWebClientStart_DownloadCompleted
			meinWebClientStart.Headers.Add("Cookie", "__test=3c020c18923605cf39e4292d69038f3a")
			meinWebClientStart.DownloadFileAsync(New Uri(mAutomatischerDownloadURLListe(mStartDownload)), mInstalVerzeichnisBackSlash & "\Download\" &  mAutomatischerDownloadDateiListe(mStartDownload))
			prznofkInfoUpdate()
			Dim objWriter As New System.IO.StreamWriter(mFileName)
			objWriter.WriteLine(nofkfinfo & mStartUpdate.Trim)
			objWriter.Close()
			btStartUpdate.Enabled = False
			btStartUpdate.Text = "Die akuellste Start Vers. ist schon installiert"
		End Sub
		
		Sub ChkStartEigenCheckedChanged(sender As Object, e As EventArgs)
			
		End Sub
		
		Sub ChkOnlineMouseUp(sender As Object, e As MouseEventArgs)
			If chkOnline.Checked = True Then
				mOnline = True
				prznofkInfoUpdate()
				mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
				Dim objWriter As New System.IO.StreamWriter(mFileName)
				objWriter.WriteLine(nofkfinfo & mStartVersion.Trim)
				objWriter.Close()
				clsTopMostMessageBox.Show("Wenn Sie den Info-Stick im >> Online-Modus << starten," & CHR(10) _
					& "wird eine Verbindung zur Website >> schultasche-bw.de << hergestellt" & CHR(10) _
					& "um zu prüfen, ob neue Updates der Start.exe und der Verwaltung.exe verfügbar sind." & CHR(10) _
					& "Gibt es Updates, so wird dies angezeigt. Ob diese" & CHR(10) _
					& "automatisch heruntergeladen und installiert werden" & CHR(10) _
					& "hängt vom Schalter >> immer automatisch installieren << ab." & CHR(10) _
					& "Allgemeine Dateien und die Liste der downloadbaren" & CHR(10) _
					& "Programme werden auf jeden Fall heruntergeladen" & CHR(10) _
					& "und gespeichert." & CHR(10) & CHR(10) _
					& "Vorteil: Sie halten ihren Info-Stick immer auf den aktuellen Stand." & CHR(10) & CHR(10) _
					& "Nachteil: Der Download verzögert den Start bis zur Anzeige des Menüs ein wenig.", _
					"Was bedeutet >>Start im Online Modus << ?", _
					MessageBoxButtons.OK, _
					MessageBoxIcon.Information)
			Else
				mOnline = False
				prznofkInfoUpdate()
				mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
				Dim objWriter As New System.IO.StreamWriter(mFileName)
				objWriter.WriteLine(nofkfinfo & mStartVersion.Trim)
				objWriter.Close()
				clsTopMostMessageBox.Show("Wenn Sie den Info-Stick im >> Offline-Modus << starten," & CHR(10) _
					& "wird keine Verbindung zur Website >> schultasche-bw.de <<  hergestellt" & CHR(10) _
					& "um zu prüfen, ob neue Updatesder Start.exe und der" & CHR(10) _
					& "Verwaltung.exe verfügbar sind und auch keine" & CHR(10) _
					& "Allgemeine Dateien und keine Liste der downloadbaren Programme aktualisiert." & CHR(10) & CHR(10) _
					& "Vorteil: Der Start bis zur Anzeige des Menüs dauert nur sehr kurz." & CHR(10) & CHR(10) _
					& "Nachteil: Sie halten ihren Info-Stick nicht immer auf den aktuellen Stand.", _
					"Was bedeutet >>Start im Offline Modus << ?", _
					MessageBoxButtons.OK, _
					MessageBoxIcon.Information)
			End If
		End Sub
		
		Sub ChkFlexibelMouseUp(sender As Object, e As MouseEventArgs)
			If chkFlexibel.Checked = true Then
				mFlexibel = True
				prznofkInfoUpdate()
				mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
				Dim objWriter As New System.IO.StreamWriter(mFileName)
				objWriter.WriteLine(nofkfinfo & mStartVersion.Trim)
				objWriter.Close()
				clsTopMostMessageBox.Show("Wenn Sie den Info-Stick im >> Flexibel-Modus << starten," & CHR(10) _
					& "werden bei jedem Start die aktuellen Pfadeinstellungen" & CHR(10) _
					& "in viele verschiedene Dateien und auch die" & CHR(10) _
					& "Menügestaltung gespeichert. Das ist vor allem" & CHR(10) _
					& "dann erforderlich, wenn Sie den Info-Stick von einem" & CHR(10) _
					& "mobilen Datenträger (USB-Stick oder externe Festplatte) aus" & CHR(10) _
					& "auf unterschiedlichen Rechnern starten wollen." & CHR(10) & CHR(10) _
					& "Betreiben Sie den USB-Stick jedoch stets von einer" & CHR(10) _
					& "eingebauten Festplatte aus, so reicht es, wenn Sie" & CHR(10) _
					& "diese Pfadeinstellungen einmal nach der Installation des" & CHR(10) _
					& "Sticks und auch nach jeder weiteren Installation von" & CHR(10) _
					& "downloadbaren Programmen durchführen." & CHR(10) & CHR(10) _
					& "Vorteil: Die Softwarepfade und das angezeigte Menü sind immer auf dem aktuellen Stand." & CHR(10) & CHR(10) _
					& "Nachteil: Der Start bis zur Anzeige des Menüs wird verzögert."& CHR(10) _
					& "Je mehr Software Sie heruntergeladen und installiert haben, desto länger dauert der Start.", _
					"Was bedeutet >>Start im Flexibel Modus << ?", _
					MessageBoxButtons.OK, _
					MessageBoxIcon.Information)
			Else
				mFlexibel = False
				prznofkInfoUpdate()
				mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
				Dim objWriter As New System.IO.StreamWriter(mFileName)
				objWriter.WriteLine(nofkfinfo & mStartVersion.Trim)
				objWriter.Close()
				clsTopMostMessageBox.Show("Wenn Sie den Info-Stick im >> Fix-Modus << starten," & CHR(10) _
					& "werden keine Pfadeinstellungen aktualisiert und auch" & CHR(10) _
					& "keine Ergänzungen des Menüs  gespeichert. Das ist vor" & CHR(10) _
					& "allem dann sinnvoll, wenn Sie den Info-Stick von einer" & CHR(10) _
					& "eingebauten Festplatte aus betreiben und nicht gerade" & CHR(10) _
					& "zusätzliche Software installiert haben." & CHR(10) & CHR(10) _
					& "Vorteil: Der Start bis zur Anzeige des Menüs wird dauert nur" & CHR(10) _
					& "sehr kurz - auch wenn sie viele Programme installiert haben." & CHR(10) & CHR(10) _
					& "Nachteil: Nach einer Softwareinstallation wird dieses Programm" & CHR(10) _
					& "nicht im Menü angezeigt. Es reicht aber aus, nach einer" & CHR(10) _ 
					& "Installation einmal den Info-Stick im Flexibel-Modus zu" & CHR(10) _
					& "starten. Anschließend kann wieder in den Fix-Modus umgeschaltet werden.", _
					"Was bedeutet >>Start im Fix Modus << ?", _
					MessageBoxButtons.OK, _
					MessageBoxIcon.Information)
			End If		
		End Sub
		
		Sub ChkKeineNewsMouseUp(sender As Object, e As MouseEventArgs)
			If chkKeineNews.Checked = true Then
				mKeineNews = True
				prznofkInfoUpdate()
				mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
				Dim objWriter As New System.IO.StreamWriter(mFileName)
				objWriter.WriteLine(nofkfinfo & mStartVersion.Trim)
				objWriter.Close()
			Else
				mKeineNews = False
				prznofkInfoUpdate()
				mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartVersion.txt"
				Dim objWriter As New System.IO.StreamWriter(mFileName)
				objWriter.WriteLine(nofkfinfo & mStartVersion.Trim)
				objWriter.Close()
			End If	
		End Sub
		
		Sub ChkStartEigenMouseUp(sender As Object, e As MouseEventArgs)
			mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartEigen.txt" 
			If chkStartEigen.Checked Then
				If System.IO.File.Exists(mFileName) = False Then
					mFileName = mInstalVerzeichnisBackSlash & "Programme\PStart\StartEigen.xml"
					If System.IO.File.Exists(mFileName) = True Then
						clsTopMostMessageBox.Show("Das Erscheinungsbild des Start-Menüs wird von der Datei " & CHR(10) & mInstalVerzeichnisBackSlash & "\Programme\PStart\StartEigen.xml gesteuert." & CHR(10) & CHR(10) & "Seit der Erstellung dieser Datei veränderte Installationen werden nicht berücksichtigt!", _
							"Eigenes Start-Menü", _
							MessageBoxButtons.OK, _
							MessageBoxIcon.Exclamation)
						mFileName  = mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\StartEigen.txt" 
						IO.File.WriteAllText(mFileName,"")		
					Else
						clsTopMostMessageBox.Show("Erstellen Sie über die Menüleiste" & CHR(10) & "des Start-Menüs zuerst die Datei " & CHR(10) & mInstalVerzeichnisBackSlash & "\Programme\PStart\StartEigen.xml " & CHR(10) & "mit den Menü-Befehlen" & CHR(10) & ">> Einrichtung - Einrichtung sichern <<", _
							"Eigene Start-Menü Einstellungen noch nicht gesichert", _
							MessageBoxButtons.OK, _
							MessageBoxIcon.Exclamation)
						chkStartEigen.Checked = False
					End If
				End If
			Else
				If System.IO.File.Exists(mFileName) = True Then
					My.Computer.FileSystem.DeleteFile(mFileName)
				End If
			End If
		End Sub
		
		
		Sub LvDownloadAngebotColumnClick(sender As Object, e As ColumnClickEventArgs)
			Select Case Links(Me.lvDownloadangebot.Columns(e.Column).Text,5)
				Case "anfor"
					My.Computer.FileSystem.CopyFile(mInstalVerzeichnisBackSlash &"Programme\PStart\Settings\downloadbareprogramme.txt.sic",	mInstalVerzeichnisBackSlash & "Programme\PStart\Settings\downloadbareprogramme.txt",True)
					Me.lvDownloadangebot.Columns(1).Text = "Programmname"
					Me.lvDownloadangebot.Columns(2).Text = "Version"
					Me.lvDownloadangebot.Columns(3).Text = "Rubrik"
					Me.lvDownloadangebot.Columns(4).Text = "bereitgest. ab"
				Case "Progr"
					Dim lines() As String = System.IO.File.ReadAllLines(mFileNameDownloadbareProgramme)
					If Rechts(Me.lvDownloadangebot.Columns(e.Column).Text,1) = "↑" Then
						Dim column_comparer As New ColumnSorter(-3, 5)
						Array.Sort(lines, column_comparer)
						Me.lvDownloadangebot.Columns(e.Column).Text = "Programmname ↓"
					Else
						Dim column_comparer As New ColumnSorter(3, -5)
						Array.Sort(lines, column_comparer)
						Me.lvDownloadangebot.Columns(e.Column).Text = "Programmname ↑"
					End If
					System.IO.File.WriteAllLines(mFileNameDownloadbareProgramme, lines)
					Me.lvDownloadangebot.Columns(2).Text = "Version"
					Me.lvDownloadangebot.Columns(3).Text = "Rubrik"
					Me.lvDownloadangebot.Columns(4).Text = "bereitgest. ab"
				Case "Versi"
					Dim lines() As String = System.IO.File.ReadAllLines(mFileNameDownloadbareProgramme)
					If Rechts(Me.lvDownloadangebot.Columns(e.Column).Text,1) = "↑" Then
						Dim column_comparer As New ColumnSorter(-4, 5)
						Array.Sort(lines, column_comparer)
						Me.lvDownloadangebot.Columns(e.Column).Text = "Version ↓"
					Else
						Dim column_comparer As New ColumnSorter(4, -5)
						Array.Sort(lines, column_comparer)
						Me.lvDownloadangebot.Columns(e.Column).Text = "Version ↑"
					End If
					System.IO.File.WriteAllLines(mFileNameDownloadbareProgramme, lines)
					Me.lvDownloadangebot.Columns(1).Text = "Programmname"
					Me.lvDownloadangebot.Columns(3).Text = "Rubrik"
					Me.lvDownloadangebot.Columns(4).Text = "bereitgest. ab"
				Case "Rubri"
					Dim lines() As String = System.IO.File.ReadAllLines(mFileNameDownloadbareProgramme)
					If Rechts(Me.lvDownloadangebot.Columns(e.Column).Text,1) = "↑" Then
						Dim column_comparer As New ColumnSorter(-1, 5)
						Array.Sort(lines, column_comparer)
						Me.lvDownloadangebot.Columns(e.Column).Text = "Rubrik ↓"
					Else
						Dim column_comparer As New ColumnSorter(1, -5)
						Array.Sort(lines, column_comparer)
						Me.lvDownloadangebot.Columns(e.Column).Text = "Rubrik ↑"
					End If
					System.IO.File.WriteAllLines(mFileNameDownloadbareProgramme, lines)
					Me.lvDownloadangebot.Columns(1).Text = "Programmname"
					Me.lvDownloadangebot.Columns(2).Text = "Version"
					Me.lvDownloadangebot.Columns(4).Text = "bereitgest. ab"
				Case "berei"
					Dim lines() As String = System.IO.File.ReadAllLines(mFileNameDownloadbareProgramme)
					If Rechts(Me.lvDownloadangebot.Columns(e.Column).Text,1) = "↓" Then
						Dim column_comparer As New ColumnSorter(5, -1)
						Array.Sort(lines, column_comparer)
						Me.lvDownloadangebot.Columns(e.Column).Text = "bereitgest. ab ↑"
					Else
						Dim column_comparer As New ColumnSorter(-5, 1)
						Array.Sort(lines, column_comparer)
						Me.lvDownloadangebot.Columns(e.Column).Text = "bereitgest. ab ↓"
					End If
					System.IO.File.WriteAllLines(mFileNameDownloadbareProgramme, lines)
					Me.lvDownloadangebot.Columns(1).Text = "Programmname"
					Me.lvDownloadangebot.Columns(2).Text = "Version"
					Me.lvDownloadangebot.Columns(3).Text = "Rubrik"
			End Select
			InstallierbareProgrammeAnzeigen()		
		End Sub
	End Class
	
	Public Class ColumnSorter
		Implements IComparer(Of String)
		Private m_Columns() As Integer
		
		Public Sub New(ByVal ParamArray numbers() As Integer)
			m_Columns = numbers
		End Sub
		
		Public Function Compare(ByVal x As String, ByVal y As String) As Integer Implements System.Collections.Generic.IComparer(Of String).Compare
			Dim x_fields() As String = x.Split(New String() {"**"}, StringSplitOptions.RemoveEmptyEntries)
			Dim y_fields() As String = y.Split(New String() {"**"}, StringSplitOptions.RemoveEmptyEntries)
			For i As Integer = 0 To m_Columns.GetUpperBound(0)
				Dim col As Integer = m_Columns(i)
				If col < 0 Then
					col = -col
					If x_fields(col).ToUpper < y_fields(col).ToUpper Then Return 1
					If x_fields(col).ToUpper > y_fields(col).ToUpper Then Return -1
				Else
					If x_fields(col).ToUpper < y_fields(col).ToUpper Then Return -1
					If x_fields(col).ToUpper > y_fields(col).ToUpper Then Return 1
				End If
			Next i
			Return 0
		End Function
	End Class
	