Τρίτη, 15 Αυγούστου 2017

Αναθεώρηση 28 (Έκδοση 8.9)

Βρέθηκε ένα λάθος που παρουσιάζεται μόνο στα 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.