Anti-FAQ: Jak dosunąć liczby w ListBoxie do prawej strony?
Sposób podał Krzysztof Czuryło, poniżej cytuje tekst Krzysztofa w całości:
Nie wiem czy ktoś się zetknął z tym problemem i czy go rozwiązał. Może męczyłem się niepotrzebnie? Otóż podczas korzystania z wielokolumnowego ListBoxa, wszystkie kolumny są zawsze wyrównane do lewej. Jest to kłopotliwe w sytuacji, gdy niektóre z kolumn mają wyświetlać wartości liczbowe (np. jakieś ceny). W takim wypadku spodziewalibyśmy się, że te kolumny powinny być wyrówanne do prawej. Niestety, nijak nie da się tego ustawić. (A może komuś się udało?) Teoretycznie jedynym (?) wyjściem z sytuacji byłoby użycie podformularza ciągłego, ale powoduje to z kolei konieczność odmiennego oprogramowania zdarzeń dla takiej listy-podformularza. A co tu mówić o realizacji ListBoxa z multiselectem? (Wszystko to da się zrobić, ale po co się tak męczyć?) Wymyśliłem zatem elegancki sposób na poradzenie sobie z tym problemem. Mnie chodziło tylko o wyrównanie kolumn z jakimiś cenami (format Currency/Walutowy), ale można to przerobić po swojemu dla dowolnych danych. Najpierw w jakimś module deklarujemy kilka funkcji:
Type Size
    cx As Long
    cy As Long
End Type

Declare Function GetTextExtentPoint32 Lib "gdi32" Alias _
    "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, _
    ByVal cbString As Long, lpSize As Size) As Long
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long

'funkcja oblicza szerokość łańcucha w jednostkach ekranowych (pixelach)
Public Function StringExtent(str As String) As Long
    Dim ext As Size
    Dim res As Long

    res = GetTextExtentPoint32(GetDC(Application.hWndAccessApp), str, _
        Len(str), ext)
    StringExtent = ext.cx
End Function

'parametr colwidth oznacza całkowitą szerokość kolumny (można dobrać
'doświadczalnie lub przeliczać automatycznie, odczytując szerokość danej kolumny
'z właściwości ListBoxa)
'cur jest liczbą (kwotą), którą chcemy wyrównać do prawej
Public Function ToRight(cur As Single, colwidth As Long) As String
    Dim SpcExtent As Long
    Dim TxtExtent As Long
    Dim SpcCount As Long

    'obliczenie szerokości jednej spacji
    SpcExtent = StringExtent(" ")
    'obliczenie szerokości tekstu (tutaj liczby w formacie walutowym)
    TxtExtent = StringExtent(Format(cur, "Currency"))
    'obliczenie liczby spacji potrzebnych do uzupełnienia łańcucha
    SpcCount = (colwidth - TxtExtent) / SpcExtent
    '...i dodanie tych spacji z lewej strony
    ToRight = String$(SpcCount, " ") & Format(cur, "Currency")
End Function
Cały pomysł polega na dopisaniu po lewej stronie cyferek, odpowiedniej liczby spacji, tak by całkowita długość łańcucha (spacje + cyferki + separatory + zł) była zawsze taka sama (równa colwidth). Gdyby listę wyświetlać czcionką monospace (Courier), to wystarczyłoby liczyć znaki, jednak dla czcionek Arial, Times, etc. każda cyfra może mieć inną szerokość i dlatego napis "111 zł" ma inną szerokość niż "222 zł". Pomimo, że liczba znaków jest taka sama w obu przypadkach, na ekranie będą one innej szerokości. Inna jest zatem w obu przypadkach liczba spacji, którą trzeba dopisać z lewej strony. Jak widać, z tym także można się uporać. Jako źródło wierszy listy ustawiamy kwerendę, gdzie kolumnę(y) z cenami deklarujemy tak:
ToRight(NazwaPolaZCeną;100)
100 oznacza szerokość kolumny (w pixelach chyba) i należy tę wartość dobrać doświadczalnie. -- +- lek. med. Krzysztof Czuryło -+ +- Akademia Medyczna w Gdańsku & Politechnika Gdańska -+ +- krzycz2@SPAM.poczta.KILLER.onet.pl -+ +- zanim odpiszesz usuń 'SPAM.' i 'KILLER.' z adresu -+