[VB6] Wyświetlanie w ListBox


(Grzeniux) #1

Hej,

For J = 1 To il_reprint1
lista.AddItem " " & tab_reprint(J, 1) & " - " & tab_reprint(J, 2) & " - " & tab_reprint(J, 3) & " - " & tab_reprint(J, 4) & " - " & tab_reprint(J, 5) & " - " & tab_reprint(J, 6) & " "
Next

Takim kodem wczytuje do listboxa zawartość tabeli, mój problem polega na tym że poszczególne wiersze wczytywanej tabeli są różnej długości i w listbox przy wyświetlaniu wszystko mi się rozjeżdża. 

W jaki sposób podczas wczytywania do listboxa poszczególne dane z tabeli tab_reprint(J,1  ) określić tak aby przed wczytaniem została sprawdzona ilość  znaków i jeśli jest mniej niż 20 uzupełniło odpowiednią ilością spacji tak aby suma równała się 20 znaków ??

 


(floyd) #2

Nie wiem co tam może się rozjeżdżać, ale spacji na początku można zawsze dołożyć, co wcale nie wygląda lepiej.

spacje = ""
If Len(tab_reprint(J, 1)) < 20 Then spacje = Space(20 - Len(tab_reprint(J, 1)))
lista.AddItem spacje & tab_reprint(J, 1)

(Grzeniux) #3
If Mid(plik, 1, 4) = "XXXX" Then
tab_reprint(k, 1) = Mid(plik, 6, 20)    
tab_reprint(k, 2) = Mid(plik, 29, 9)   
tab_reprint(k, 3) = Mid(plik, 39, 9)   
tab_reprint(k, 4) = Mid(plik, 48, 9)  
tab_reprint(k, 5) = Mid(plik, 65, 12)  
tab_reprint(k, 6) = Mid(plik, 78, 10)   
tab_reprint(k, 7) = Mid(plik, 65, 2)   

k = k + 1
End If

Plik z który zaciągam do lista ma różną ilość wierszy,  każda z kolumn(7) które tworze w siatce lista ma różną ilość znaków, i w przypadku tab_reprint(k, 1), w wierszu pierwszym kolumna ta może mieć tych znaków minimalnie 8 natomiast w drugim wierszu będzie tych znaków już 20  przez co przy wyświetlaniu danych wygląda to bardzo mało czytelnie, wszystko się rozjeżdża dla przykładu mniej więcej tak to wygląda( w przykładzie użyłem mniejszą ilość znaków od 1-3, w rzeczywistości jest ich więcej)

 

1  2  3  4  5  6  7

11  22  33  44  55  66  77

1111  2  33  444  55  6  777

1  2  3  4  5  6  7


(floyd) #4

Spacjami to ciężko to wyrównać bo spacja ma inną szerokość niż te znaki w zależności od rodzaju czcionki i jej wielkości. Czasami na jeden znak przypadają dwie spacje, a czasami trzy itp.

Jak chcesz mieć wszystko ładnie w kolumnach, to wpisuj do tabeli (grid), a nie do listboxa i będzie bez kombinowania.


(Grzeniux) #5

Masz może jakiś przykładowy program w którym jest przedstawione wrzucanie z notatnika do grida, szperam w necie juz prawie 2h i nic nie mogę znaleźć dla przykładu czym mógł bym się sugerować.

 

 

użyłem mshflexgrida:

 

k = 1
If Mid(plik, 1, 4) = "XXXX" Then

  MSHFlexGrid1.TextMatrix(k, 1) = Mid(plik, 6, 20)
  MSHFlexGrid1.TextMatrix(k, 2) = Mid(plik, 29, 9)
  MSHFlexGrid1.TextMatrix(k, 3) = Mid(plik, 38, 9)
  MSHFlexGrid1.TextMatrix(k, 4) = Mid(plik, 47, 9)
  MSHFlexGrid1.TextMatrix(k, 5) = Mid(plik, 65, 12)
  MSHFlexGrid1.TextMatrix(k, 6) = Mid(plik, 78, 10)
  MSHFlexGrid1.TextMatrix(k, 7) = Mid(plik, 65, 2)


k = k + 1

End If

 

ale wyświetla mi się tylko jeden z wiersz z kilkudziesięciu


(floyd) #6

np.

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal Hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Const SW_NORMAL = 1
Const WM_CLOSE = &H10
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lparam As Any) As Long
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Function OpenDialog(Form1 As Form, Filter As String, Title As String, InitDir As String) As String
Dim ofn As OPENFILENAME
Dim a As Long
ofn.lStructSize = Len(ofn)
ofn.hwndOwner = Form1.Hwnd
ofn.hInstance = App.hInstance
If Right$(Filter, 1) <> "|" Then Filter = Filter + "|"
For a = 1 To Len(Filter)
If Mid$(Filter, a, 1) = "|" Then Mid$(Filter, a, 1) = Chr$(0)
Next
ofn.lpstrFilter = Filter
ofn.lpstrFile = Space$(254)
ofn.nMaxFile = 255
ofn.lpstrFileTitle = Space$(254)
ofn.nMaxFileTitle = 255
ofn.lpstrInitialDir = InitDir
ofn.lpstrTitle = Title
ofn.flags = OFN_HIDEREADONLY Or OFN_FILEMUSTEXIST
a = GetOpenFileName(ofn)
If (a) Then
ofn.lpstrFile = Replace(ofn.lpstrFile, Chr(0), "")
OpenDialog = Trim$(ofn.lpstrFile)
Else
OpenDialog = ""
End If
End Function

Private Sub Command1_Click()
Dim hn
Dim Tekst, Adres, Znacznik, spacja As String
Dim Tabela() As String, Tabela2() As String
Dim LiczbaRekordow As Integer, LiczbaWyrazow As Integer
Dim i As Integer, j As Integer
MSFlexGrid1.Cols = 8
Znacznik = Chr(13) + Chr(10): spacja = Chr(32)
hn = FindWindowEx(0, 0, "Notepad", vbNullString)
Adres = OpenDialog(Form1, "*.txt;" + Chr$(0) + "*.txt;" + Chr$(0) + "All Files *.*" + Chr$(0) + "*.*" + Chr$(0), "Odczyt", "")
If hn Then PostMessage hn, WM_CLOSE, 0&, 0&
X = ShellExecute(Hwnd, "Open", Adres, &O0, &O0, SW_NORMAL)
Open Adres For Binary As #1
Tekst = Input$(LOF(1), 1) + Znacznik
Tekst = Replace(Tekst, Znacznik + Znacznik, Znacznik)
Close #1
Tabela = Split(Tekst, Znacznik)
LiczbaRekordow = UBound(Tabela)
MSFlexGrid1.Rows = LiczbaRekordow + 1
 For i = 0 To LiczbaRekordow - 1
 Tabela2 = Split(Tabela(i), spacja)
 LiczbaWyrazow = UBound(Tabela2)
 For j = 0 To LiczbaWyrazow
MSFlexGrid1.TextMatrix(i + 1, j + 1) = Tabela2(j)
 Next j
Next i
End Sub

Liczby w pliku tekstowym rozdzielone są w każdym rekordzie tylko jedną spacją np.

123 23456 2222222 444444444 77 34 76543
33333333 555555 4444444 6666666 333 222222222 444444
222 44444 7 6666666 222 4444444 5466

(Grzeniux) #7

Faktycznie kiepsko to wygląda 

 

a czemu w moim kodzie do taeli wprowadzany jest tylko jeden wiersz? ??

Plik z notatnika do siatki wprowadza ok ale wszystko dzieję się tylko w pierwszym wierszu, jak skonczy pętle nie dodaje nowego wiersza do siatki, tylko nadpisuje kolejne dane w tym samym wierszu.

k = 1
If Mid(plik, 1, 4) = "XXXX" Then

  MSHFlexGrid1.TextMatrix(k, 1) = Mid(plik, 6, 20)
  MSHFlexGrid1.TextMatrix(k, 2) = Mid(plik, 29, 9)
  MSHFlexGrid1.TextMatrix(k, 3) = Mid(plik, 38, 9)
  MSHFlexGrid1.TextMatrix(k, 4) = Mid(plik, 47, 9)
  MSHFlexGrid1.TextMatrix(k, 5) = Mid(plik, 65, 12)
  MSHFlexGrid1.TextMatrix(k, 6) = Mid(plik, 78, 10)
  MSHFlexGrid1.TextMatrix(k, 7) = Mid(plik, 65, 2)


k = k + 1

End If

(floyd) #8

Nie widzę twojej pętli  i nie wiem jak wygląda, ale jeśli na jej początku jest k=1 to będzie tylko jeden wiersz.


(Grzeniux) #9

Pozwoliłem sobie napisać na e-maila jeśli byś miał chęci i chwilę wolnego 


(floyd) #10

Napisałeś na początku: “Masz może jakiś przykładowy program w którym jest przedstawione wrzucanie z notatnika do grida”

Podałem ci więc przykład, ale problem polegał na tym ,że to co Ty chciałeś zrobić, to całkiem coś innego i o tym już nie napisałeś.

Dopiero jak wrzuciłeś ten plik z danymi to się zorientowałem.

Ten plik z danymi, to nie jest plik tekstowy taki jak tworzone pod Windowsem pliki tekstowe np. w Notatniku, bo to jest plik bazy danych, a tam pliki tekstowe są zapisywane tak jak w Linuksie czyli inne są znaki specjalne np. końca linii.

Jeśli chodzi o tabelę grid i wpisywanie rekordów, poprzez instrukcję:MSHFlexGrid1.TextMatrix, to musi być wcześniej podana liczba wierszy w tabeli czyli:MSHFlexGrid1.Rows czyli w twoim przykladzie należy dodać jedną linię.

If Mid(dane_pliku, 1, 4) = "CIEB" Then
MSHFlexGrid1.Rows = MSHFlexGrid1.Rows + 1
  MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, 1) = Mid(dane_pliku, 6, 20)
  MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, 2) = Mid(dane_pliku, 29, 9)
  MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, 3) = Mid(dane_pliku, 38, 9)
  MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, 4) = Mid(dane_pliku, 47, 9)
  MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, 5) = Mid(dane_pliku, 65, 12)
  MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, 6) = Mid(dane_pliku, 78, 10)
  MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, 7) = Mid(dane_pliku, 65, 2)
End If