Βρέθηκε ένα λάθος που παρουσιάζεται μόνο στα Windows 10. Διορθώθηκε έμμεσα επειδή δεν έχω στο περιβάλλον προγραμματισμού υπολογιστή με Windows 10 (θα φτιάξω όμως σε Virtual Box όταν βρω χρόνο). Εφόσον στα Ελληνικό Ε όταν ήταν πρώτο γράμμα, ως όνομα στοιχείου ελέγχου (control) στη φόρμα χρήστη, έβγαινε λάθος,τότε η λύση είναι εύκολη, τα ονόματα στα στοιχεία θα είναι στα αγγλικά! Το γιατί το κάνει, και που ακριβώς δεν μπόρεσα να το βρω, όμως βρήκα τι έπρεπε να κάνω ώστε να δημιουργήσω το αποτέλεσμα του λάθους από Windows 10 σε Windows 7, κάνοντας βηματική εκτέλεση και προκαλώντας καθαρισμό σε ένα αλφαριθμητικό που κανονικά είχε το όνομα του στοιχείου. Δυο εντολές καθορίζουν αυτό το όνομα, και πιθανολογώ ότι είναι στην πρώτη, μια που επιστρέφει το όνομα του στοιχείου μέσα στο κώδικα της VB6,το UserControl.Ambient.DisplayName, και η δεύτερη η GetStrUntilB() που είναι μια δική μου συνάρτηση που ξέρω ότι δουλεύει καλά, και θα είχε φέρει λάθη και σε άλλα σημεία.
Ο κώδικας σε VB6, στο μοναδικά UserControl της M2000 (και το οποίο χρησιμοποιείται σε όλες τις φόρμες - και στο διορθωτή προγραμμάτων)
Παρατηρήστε ότι η Sub MoveTwips, πρέπει να συνδέσει το Control mo, βάσει του ονόματος που έχει το UserControl στο οποίο καλέσαμε την MoveTwips, διαβάζοντας από το πατρικό (τη φόρμα) τον δείκτη σε αυτό. Δηλαδή μέσα στο κώδικα του UserControl ο μοναδικός τρόπος να πάρουμε ένα δείκτη στο αντικείμενο που ουσιαστικά βρίσκεται στη φόρμα, είναι με χρήση του ονόματος, στη λίστα στοιχείων (controls) στη φόρμα.
Public Sub MoveTwips(ByVal mleft As Long, ByVal mtop As Long, mWidth As Long, mHeight As Long)
Dim mm$, mo As Control, nm$, cnt$, p As Long
mm$ = UserControl.Ambient.DisplayName
nm$ = GetStrUntilB(p, "(", mm$ & "(", True)
cnt$ = GetStrUntilB(p, ")", mm$, True)
On Error Resume Next
If UserControl.Parent Is Nothing Then Exit Sub
If Err.Number > 0 Then Exit Sub
If cnt$ <> "" Then
Set mo = UserControl.Parent.Controls(nm$).item(CInt(cnt$))
Else
Set mo = UserControl.Parent.Controls(nm$)
End If
If mWidth < 100 Then
mo.Move mleft, mtop, mo.Width, mo.Height
ElseIf mHeight < 100 Then
mo.Move mleft, mtop, mWidth, mo.Height
Else
mo.Move mleft, mtop, mWidth, mHeight
End If
End Sub.
Ο κώδικας σε VB6, στο μοναδικά UserControl της M2000 (και το οποίο χρησιμοποιείται σε όλες τις φόρμες - και στο διορθωτή προγραμμάτων)
Παρατηρήστε ότι η Sub MoveTwips, πρέπει να συνδέσει το Control mo, βάσει του ονόματος που έχει το UserControl στο οποίο καλέσαμε την MoveTwips, διαβάζοντας από το πατρικό (τη φόρμα) τον δείκτη σε αυτό. Δηλαδή μέσα στο κώδικα του UserControl ο μοναδικός τρόπος να πάρουμε ένα δείκτη στο αντικείμενο που ουσιαστικά βρίσκεται στη φόρμα, είναι με χρήση του ονόματος, στη λίστα στοιχείων (controls) στη φόρμα.
Public Sub MoveTwips(ByVal mleft As Long, ByVal mtop As Long, mWidth As Long, mHeight As Long)
Dim mm$, mo As Control, nm$, cnt$, p As Long
mm$ = UserControl.Ambient.DisplayName
nm$ = GetStrUntilB(p, "(", mm$ & "(", True)
cnt$ = GetStrUntilB(p, ")", mm$, True)
On Error Resume Next
If UserControl.Parent Is Nothing Then Exit Sub
If Err.Number > 0 Then Exit Sub
If cnt$ <> "" Then
Set mo = UserControl.Parent.Controls(nm$).item(CInt(cnt$))
Else
Set mo = UserControl.Parent.Controls(nm$)
End If
If mWidth < 100 Then
mo.Move mleft, mtop, mo.Width, mo.Height
ElseIf mHeight < 100 Then
mo.Move mleft, mtop, mWidth, mo.Height
Else
mo.Move mleft, mtop, mWidth, mHeight
End If
End Sub.
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.