Keine Aktualiesierungen von Steuerlemente

11/10/2009 - 18:52 von Ahmed Martens | Report spam
Hallo Leute,

ich möchte mich jetzt eimal mit VBNet auseinandersetzen und habe glaube
ich, es auch einigermaßen hinbekommen.

Nun habe ich aber folgendes Problem.

Auf einem Formular möchte ich per Drag&Drop Dateien kopieren. Das
funktioniert auch einwandfrei.

Bei der Kopieraktion soll einfach eine Progressbar die bereits kopierten
Dateien anzeigen. Ferner soll im Formular.Text ebenfalls die Anzahl der
kopierten Dateien angezeigt werden. Im Anschluss soll das Formulare
wieder auf halbtransparent zurückgesetzt werden.

Das alles haut aber irgendwie nicht hin.

Kann mir da vielleicht einer noch einmal helfen?

Hier mein simpler Code:

<Code>

Private Sub frmCopy_DragDrop(ByVal sender As Object, ByVal e As
System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
Dim sTargetPath As String
Me.Opacity = 100
On Error GoTo ErrorfrmCopy
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
Dim DroppedFiles As String() CType(e.Data.GetData(DataFormats.FileDrop), String())
Dim lFileDate As Date
Dim sVolume As String

For Each Drive As IO.DriveInfo In IO.DriveInfo.GetDrives
If Drive.DriveType = IO.DriveType.Removable Then
If Drive.IsReady Then
' wenn Geràt bereit, Laufwekrsbuchstabe und
VolumeLabel anzeigen
If Drive.VolumeLabel = "TREKSTOR" Then
sVolume = Drive.Name
Exit For
End If
End If
End If
Next

With ProgressBar1
.Maximum = DroppedFiles.Length - 1
.Visible = True
End With


For i As Int32 = 0 To DroppedFiles.Length - 1

ProgressBar1.Value = i
ProgressBar1.Refresh()

'MsgBox(DroppedFiles(i))
lFileDate = FileDateTime(DroppedFiles(i))

Me.Text = "Datei " & i & "/" & ProgressBar1.Maximum
Me.Refresh()
sTargetPath = sVolume & DateAndTime.Year(lFileDate) &
(DateAndTime.Month(lFileDate).ToString("00")) &
DateAndTime.Day(lFileDate).ToString("00")
FileSystem.ChDir(sTargetPath)
FileSystem.FileCopy(DroppedFiles(i), sTargetPath & "\" &
GetFileName(DroppedFiles(i)))

Next
End If
FileSystem.ChDir("C:\")
Me.Opacity = 50
Me.Refresh()

With ProgressBar1
.Value = 0
.Visible = False
End With

Exit Sub
ErrorfrmCopy:

Select Case Err.Number
Case 76 'Pfad unbekannt
FileSystem.MkDir(sTargetPath)
Resume Next
Case Else
End Select

End Sub

Private Sub frmCopy_DragEnter(ByVal sender As Object, ByVal e As
System.Windows.Forms.DragEventArgs) Handles Me.DragEnter
e.Effect = DragDropEffects.Copy
End Sub

<\Code>

Danke schon einmal im voraus.
Gruß Ahmed

Antworten bitte nur in der Newsgroup
 

Lesen sie die antworten

#1 Armin Zingler
11/10/2009 - 19:19 | Warnen spam
Ahmed Martens schrieb:
Hallo Leute,

ich möchte mich jetzt eimal mit VBNet auseinandersetzen und habe glaube
ich, es auch einigermaßen hinbekommen.

Nun habe ich aber folgendes Problem.

Auf einem Formular möchte ich per Drag&Drop Dateien kopieren. Das
funktioniert auch einwandfrei.

Bei der Kopieraktion soll einfach eine Progressbar die bereits kopierten
Dateien anzeigen. Ferner soll im Formular.Text ebenfalls die Anzahl der
kopierten Dateien angezeigt werden. Im Anschluss soll das Formulare
wieder auf halbtransparent zurückgesetzt werden.

Das alles haut aber irgendwie nicht hin.



Das Problem seit Windows XP ist, dass selbst Refresh-Aufrufe ignoriert
werden. Dein Fenster wird durch ein "Ghost-Window" ersetzt. Der einfachste
Workaround ist wohl der Aufruf von PeekMessage:
http://msdn.microsoft.com/en-us/lib...85%29.aspx

Dort findest du ganz unten auch die Erklàrung: "Windows XP: If a top-level window stops responding"

Der sauberererere Weg wàre, die Verarbeitung in einen anderen Thread auszulagern
und die Aktualisierung der Controls durch Aufruf der (Begin)Invoke-Methode
durchzuführen. Dadurch wird dein Thread (der UI-Thread) nicht in diesem
Maße blockiert, d.h. die Controls werden weiterhin aktualisiert. Hat allerdings
den Nachteil, dass der Benutzer wàhrenddessen mit der Form arbeiten kann.
Für den Benutzer vllt ein Vorteil aber für dich mehr Aufwand, da du im UI-Thread
berücksichtigen musst, dass im Hintergrund noch der Kopiervorgang làuft.

Armin

Ähnliche fragen