Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Listboxen mit WinApi erstellen und auswerten

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 19.05.2017, 01:01    Titel: Listboxen mit WinApi erstellen und auswerten Antworten mit Zitat

Hat schon mal jemand von euch Listboxen mit der WinApi erstellt?

Ich möchte eine Listbox erstellen, die mir vorhandene Artikel anzeigt, die ich auswählen kann und dann in eine Variable übernehme bzw. übernehmen kann! Was brauche ich alles damit der mir die Artikel korrekt anzeigt? Wie muss die Definition aussehen?

Zitat:
hLinks = CreateWindow("listbox", "A",_
WS_BORDER OR WS_CHILD or WS_VISIBLE OR ES_AUTOVSCROLL OR LBS_NOTIFY,_
235, 30, 150, 122, hWnd, NULL,_
cast(LPCREATESTRUCT,lParam)->hInstance,NULL)


Die Liste sollte (eventuell) Scrollbar sein? Desweiteren sollte gegebenenfalls auch ein Übernahmebutton sichtbar sein. https://i-msdn.sec.s-msft.com/dynimg/IC510700.png
Leider gibt es zu wenig Infomaterial für Freebasic! Die MSDN Seite von Microsoft hilft mir nicht weiter, da ich weder C++ noch perfekt Englisch kann. Vielleicht kann mir jemand ein Beispiel geben? Ich bedanke mich schon mal im Voraus!



Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 19.05.2017, 08:34    Titel: Antworten mit Zitat

Hallo ALWIM

Ich habe dir das Beispiel, das zu dem von dir verlinkten Bild gehört, mal nach FB übersetzt:
Code:
#Include "windows.bi"

Type Player
   achName As ZString*MAX_PATH
   achPosition As ZString*12
   nGamesPlayed As Integer
   nGoalsScored As Integer
End Type

Dim Shared As Player Roster(0 To ...) = {Type <Player> ("Haas, Jonathan", "Midfield", 18, 4), _
                                         Type <Player> ("Pai, Jyothi", "Forward", 36, 12), _
                                         Type <Player> ("Hanif, Kerim", "Back", 26, 0), _
                                         Type <Player> ("Anderberg, Michael", "Back", 24, 2), _
                                         Type <Player> ("Jelitto, Jacek", "Midfield", 26, 3), _
                                         Type <Player> ("Raposo, Rui", "Back", 24, 3), _
                                         Type <Player> ("Joseph, Brad", "Forward", 13, 3), _
                                         Type <Player> ("Bouchard, Thomas", "Forward", 28, 5), _
                                         Type <Player> ("Salmre, Ivo", "Midfield", 27, 7), _
                                         Type <Player> ("Camp, David", "Midfield", 22, 3), _
                                         Type <Player> ("Kohl, Franz", "Goalkeeper", 17, 0)}

Dim Shared As Integer IDC_LISTBOX_EXAMPLE, IDC_STATISTICS

Function ListBoxExampleProc(hDlg As HWND, message As UInteger, wParam As WPARAM, lParam As LPARAM) As bool
   Dim As HWND hwndList
   Dim As Integer _pos, i, lbItem
   Dim As ZString*MAX_PATH buff
   
   Select Case message
      Case WM_INITDIALOG
         'Add items to list.
         hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE)
         For i = 0 To UBound(Roster)
            _pos = SendMessage(hwndList, LB_ADDSTRING, 0, Cast(LPARAM, Roster(i).achName))
            'Set the array index of the player as item data.
        'This enables us to retrieve the item from the array
        'even after the items are sorted by the list box.
        SendMessage(hwndList, LB_SETITEMDATA, _pos, Cast(LPARAM, i))
         Next
         'Set input focus to the list box.
         SetFocus(hwndList)
         Return TRUE

      Case WM_COMMAND
         Select Case LoWord(wParam)
            Case IDOK
            Case IDCANCEL
               EndDialog(hDlg, LoWord(wParam))
               Return TRUE
            Case IDC_LISTBOX_EXAMPLE
               Select Case HiWord(wParam)
                  Case LBN_SELCHANGE
                     hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE)
                     'Get selected index
                     lbItem = SendMessage(hwndList, LB_GETCURSEL, 0, 0)
                     'Get item data
                     i = SendMessage(hwndList, LB_GETITEMDATA, lbItem, 0)
                     'Do something With the Data from Roster(i)
                     StringCbPrintf (buff, SizeOf(buff), _
                              "Position: %s\nGames played: %d\nGoals: %d", _
                              Roster(i).achPosition, Roster(i).nGamesPlayed, _
                              Roster(i).nGoalsScored)
                     SetDlgItemText(hDlg, IDC_STATISTICS, buff)
                     Return TRUE
               End Select
         End Select
      Return TRUE
   End Select
   Return FALSE
End Function


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 19.05.2017, 13:14    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Hallo ALWIM

Ich habe dir das Beispiel, das zu dem von dir verlinkten Bild gehört, mal nach FB übersetzt:
Code:
#Include "windows.bi"

Type Player
   achName As ZString*MAX_PATH
   achPosition As ZString*12
   nGamesPlayed As Integer
   nGoalsScored As Integer
End Type

Dim Shared As Player Roster(0 To ...) = {Type <Player> ("Haas, Jonathan", "Midfield", 18, 4), _
                                         Type <Player> ("Pai, Jyothi", "Forward", 36, 12), _
                                         Type <Player> ("Hanif, Kerim", "Back", 26, 0), _
                                         Type <Player> ("Anderberg, Michael", "Back", 24, 2), _
                                         Type <Player> ("Jelitto, Jacek", "Midfield", 26, 3), _
                                         Type <Player> ("Raposo, Rui", "Back", 24, 3), _
                                         Type <Player> ("Joseph, Brad", "Forward", 13, 3), _
                                         Type <Player> ("Bouchard, Thomas", "Forward", 28, 5), _
                                         Type <Player> ("Salmre, Ivo", "Midfield", 27, 7), _
                                         Type <Player> ("Camp, David", "Midfield", 22, 3), _
                                         Type <Player> ("Kohl, Franz", "Goalkeeper", 17, 0)}

Dim Shared As Integer IDC_LISTBOX_EXAMPLE, IDC_STATISTICS

Function ListBoxExampleProc(hDlg As HWND, message As UInteger, wParam As WPARAM, lParam As LPARAM) As bool
   Dim As HWND hwndList
   Dim As Integer _pos, i, lbItem
   Dim As ZString*MAX_PATH buff
   
   Select Case message
      Case WM_INITDIALOG
         'Add items to list.
         hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE)
         For i = 0 To UBound(Roster)
            _pos = SendMessage(hwndList, LB_ADDSTRING, 0, Cast(LPARAM, Roster(i).achName))
            'Set the array index of the player as item data.
        'This enables us to retrieve the item from the array
        'even after the items are sorted by the list box.
        SendMessage(hwndList, LB_SETITEMDATA, _pos, Cast(LPARAM, i))
         Next
         'Set input focus to the list box.
         SetFocus(hwndList)
         Return TRUE

      Case WM_COMMAND
         Select Case LoWord(wParam)
            Case IDOK
            Case IDCANCEL
               EndDialog(hDlg, LoWord(wParam))
               Return TRUE
            Case IDC_LISTBOX_EXAMPLE
               Select Case HiWord(wParam)
                  Case LBN_SELCHANGE
                     hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE)
                     'Get selected index
                     lbItem = SendMessage(hwndList, LB_GETCURSEL, 0, 0)
                     'Get item data
                     i = SendMessage(hwndList, LB_GETITEMDATA, lbItem, 0)
                     'Do something With the Data from Roster(i)
                     StringCbPrintf (buff, SizeOf(buff), _
                              "Position: %s\nGames played: %d\nGoals: %d", _
                              Roster(i).achPosition, Roster(i).nGamesPlayed, _
                              Roster(i).nGoalsScored)
                     SetDlgItemText(hDlg, IDC_STATISTICS, buff)
                     Return TRUE
               End Select
         End Select
      Return TRUE
   End Select
   Return FALSE
End Function


Gruß
grindstone
Dein Beispiel funktioniert irgendwie nicht! Es lässt sich nicht kompilieren... traurig

Zitat:
C:\Program Files (x86)\FreeBASIC\fbc -s gui "HTML_TEST.bas"
HTML_TEST.bas(4) error 14: Expected identifier, found ' ' in '   achName As ZString*MAX_PATH'
HTML_TEST.bas(10) error 7: Expected ')', found ',' in 'Dim Shared As Player Roster(0 To ...) = {Type <Player> ("Haas, Jonathan", "Midfield", 18, 4), _'
HTML_TEST.bas(25) error 3: Expected End-of-Line, found ' ' in '   Dim As HWND hwndList'
HTML_TEST.bas(26) error 3: Expected End-of-Line, found ' ' in '   Dim As Integer _pos, i, lbItem'
HTML_TEST.bas(27) error 3: Expected End-of-Line, found ' ' in '   Dim As ZString*MAX_PATH buff'
HTML_TEST.bas(28 ) error 3: Expected End-of-Line, found ' ' in '   '
HTML_TEST.bas(29) error 3: Expected End-of-Line, found ' ' in '   Select Case message'
HTML_TEST.bas(30) error 3: Expected End-of-Line, found ' ' in '      Case WM_INITDIALOG'
HTML_TEST.bas(31) error 3: Expected End-of-Line, found ' ' in '         'Add items to list.'
HTML_TEST.bas(32) error 3: Expected End-of-Line, found ' ' in '         hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE)'
HTML_TEST.bas(32) error 132: Too many errors, exiting

Build error(s)
Schaffe es nicht, die Fehlermeldungen wegzukriegen.

Ich hoffe, man kann die Liste auch in eine .txt-Datei auslagern und dann vorher einlesen?
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 20.05.2017, 11:12    Titel: Antworten mit Zitat

Tut mir leid, deine Fehlermeldungen kann ich nicht nachvollziehen. Das einzige, was ich bei mir bekomme, ist
Zitat:
listbox.bas(59) error 41: Variable not declared, StringCbPrintf in 'StringCbPrintf (buff, SizeOf(buff), _'
weil StringCbPrintf in der windows.bi offenbar nicht definiert ist, aber in FB tut's an dieser Stelle auch ein entsprechender PRINT - Befehl.

Zitat:
Ich hoffe, man kann die Liste auch in eine .txt-Datei auslagern und dann vorher einlesen?
Natürlich geht das; entweder vorher in ein Array, oder direkt in dem Block nach
Code:
Case WM_INITDIALOG


Und zur Information: Das Beispiel ist NICHT das komplette Fenster, sondern "nur" eine Callback - Funktion, über die der Rücksprung der eigentlichen Fensterprozedur umgeleitet werden muß, damit man mit dem Fenster überhaupt eine sinnvolle Aufgabe erledigen kann.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 20.05.2017, 14:41    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Tut mir leid, deine Fehlermeldungen kann ich nicht nachvollziehen. Das einzige, was ich bei mir bekomme, ist
Zitat:
listbox.bas(59) error 41: Variable not declared, StringCbPrintf in 'StringCbPrintf (buff, SizeOf(buff), _'
weil StringCbPrintf in der windows.bi offenbar nicht definiert ist, aber in FB tut's an dieser Stelle auch ein entsprechender PRINT - Befehl.

Zitat:
Ich hoffe, man kann die Liste auch in eine .txt-Datei auslagern und dann vorher einlesen?
Natürlich geht das; entweder vorher in ein Array, oder direkt in dem Block nach
Code:
Case WM_INITDIALOG


Und zur Information: Das Beispiel ist NICHT das komplette Fenster, sondern "nur" eine Callback - Funktion, über die der Rücksprung der eigentlichen Fensterprozedur umgeleitet werden muß, damit man mit dem Fenster überhaupt eine sinnvolle Aufgabe erledigen kann.

Gruß
grindstone


Dass das Fenster fehlt und das Beispiel nur die Callback-Funktion ist, ist mir schon klar.

Ich habe ja folgendes gepostet:

Code:
hLinks = CreateWindow("listbox", "A",_
WS_BORDER OR WS_CHILD or WS_VISIBLE OR ES_AUTOVSCROLL OR LBS_NOTIFY,_
235, 30, 150, 122, hWnd, NULL,_
cast(LPCREATESTRUCT,lParam)->hInstance,NULL)
Damit sollte die Listbox angezeigt werden. Wie kann ich da jetzt Daten aus einer Variable anzeigen lassen?

Das Fenster habe ich erstellt; mit obigem Post, zeigt der mir ein "Listbox-Fenster" an. Jetzt fehlt nur noch der Inhalt in der Listbox! Das gepostete Beispiel bringe ich ja nicht zum laufen. Egal was ich versuche. Trotzdem Danke für die Hilfe!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 20.05.2017, 16:40    Titel: Antworten mit Zitat

So, ich habe mal ein (hoffentlich auch bei dir) lauffähiges Beispiel zusammengebastelt:
Code:
#Include "windows.bi"

Const ProgrammName = "ListBoxBeispiel"
Const IDC_LISTBOX_EXAMPLE = 1234

Type Player
   achName As ZString*MAX_PATH
   achPosition As ZString*12
   nGamesPlayed As Integer
   nGoalsScored As Integer
End Type

Dim Shared As Player Roster(0 To ...) = {Type <Player> ("Haas, Jonathan", "Midfield", 18, 4), _
                                         Type <Player> ("Pai, Jyothi", "Forward", 36, 12), _
                                         Type <Player> ("Hanif, Kerim", "Back", 26, 0), _
                                         Type <Player> ("Anderberg, Michael", "Back", 24, 2), _
                                         Type <Player> ("Jelitto, Jacek", "Midfield", 26, 3), _
                                         Type <Player> ("Raposo, Rui", "Back", 24, 3), _
                                         Type <Player> ("Joseph, Brad", "Forward", 13, 3), _
                                         Type <Player> ("Bouchard, Thomas", "Forward", 28, 5), _
                                         Type <Player> ("Salmre, Ivo", "Midfield", 27, 7), _
                                         Type <Player> ("Camp, David", "Midfield", 22, 3), _
                                         Type <Player> ("Kohl, Franz", "Goalkeeper", 17, 0)}

Dim As HWND hWnd
Dim As WNDCLASS wndcls

Function ListBoxExampleProc(hDlg As HWND, message As UInteger, wParam As WPARAM, lParam As LPARAM) As Integer
   Dim As HWND hWnd = GetParent(hDlg)
   Dim As Integer _pos, i, lbItem
   Dim As ZString*MAX_PATH buff
   Dim As HDC hdc
   Dim As PAINTSTRUCT ps
   Dim As RECT tr1 = Type<RECT>(100,200,200,500), _
               tr2 = Type<RECT>(205,200,400,500)

   Select Case message
      Case WM_INITDIALOG, WM_CREATE
         'Add items to list.
         For i = 0 To UBound(Roster)
            _pos = SendMessage(hDlg, LB_ADDSTRING, 0, Cast(LPARAM, @Roster(i).achName))
            'Set the array index of the player as item data.
            'This enables us to retrieve the item from the array
            'even after the items are sorted by the list box.
            SendMessage(hDlg, LB_SETITEMDATA, _pos, Cast(LPARAM, i))
         Next
         'Set input focus to the list box.
         SetFocus(hDlg)
         Return TRUE

      Case WM_COMMAND
         Select Case LoWord(wParam)
            Case IDOK
            Case IDCANCEL
               EndDialog(hDlg, LoWord(wParam))
               Return TRUE
            Case IDC_LISTBOX_EXAMPLE
               Select Case HiWord(wParam)
                  Case LBN_SELCHANGE
                     'Get selected index
                     lbItem = SendMessage(hDlg, LB_GETCURSEL, 0, 0)
                     i = SendMessage(hDlg, LB_GETITEMDATA, lbItem, 0)
                     
                     'Do something With the Data from Roster(i)
                     InvalidateRect(hWnd, @tr1, TRUE)
                     InvalidateRect(hWnd, @tr2, TRUE)
                     hdc = BeginPaint(hWnd, @ps)
                     
                     buff = "Name:" + Chr(13) +_
                            "Position:" + Chr(13) +_
                            "Games played:" + Chr(13) +_
                            "Goals:"
                     DrawText(hdc, @buff,Len(buff),@tr1, DT_RIGHT)

                     buff = Roster(i).achName + Chr(13) +_
                            Roster(i).achPosition + Chr(13) +_
                            Str(Roster(i).nGamesPlayed) + Chr(13) +_
                            Str(Roster(i).nGoalsScored)
                     DrawText(hdc, @buff,Len(buff),@tr2, DT_LEFT)
                     
                     EndPaint(hWnd, @ps)
                                          
                     Return TRUE
               End Select
         End Select
         Return TRUE
   End Select
   Return FALSE
End Function

Function WndProc(hWnd As HWND, message As UInteger, wParam As WPARAM, lParam As LPARAM) As LRESULT

   Static As HWND hLinks
   Dim As HDC hdc
   Dim As PAINTSTRUCT ps

   Select Case message
      Case WM_DESTROY
         PostQuitMessage 0
         Return 0

      Case WM_CREATE
         hLinks = CreateWindow("listbox", "",_
                               WS_BORDER Or WS_CHILD Or WS_VISIBLE Or LBS_NOTIFY Or _
                               WS_VSCROLL Or LBS_SORT,_
                               235, 30, 150, 122, hWnd, Cast(HMENU, IDC_LISTBOX_EXAMPLE),_
                               NULL,NULL)

         ListBoxExampleProc(hLinks, message, (LBN_SELCHANGE Shl 16) + IDC_LISTBOX_EXAMPLE, lParam)
         Return 0

      Case WM_COMMAND
         ListBoxExampleProc(hLinks, message, wParam, lParam)
         Return 0

   End Select
   Return DefWindowProc( hWnd, message, wParam, lParam )

End Function

'#################################

With wndcls
   .style         =  CS_HREDRAW Or CS_VREDRAW
   .lpfnWndProc   =  ProcPtr(WndProc)
   .cbClsExtra    =  0
   .cbWndExtra    =  0
   .hInstance     =  GetModuleHandle(NULL)
   .hCursor       =  LoadCursor(NULL, IDC_ARROW)
   .hIcon         =  LoadIcon(NULL, IDI_APPLICATION)
   .hbrBackground =  GetSysColorBrush(COLOR_WINDOW)
   .lpszClassName =  StrPtr(ProgrammName)
   .lpszMenuName  =  NULL
End With
RegisterClass @wndcls

hWnd = CreateWindow(ProgrammName, ProgrammName, WS_OVERLAPPED Or WS_SYSMENU,_
CW_USEDEFAULT, CW_USEDEFAULT, 580, 510,_
NULL, NULL, GetModuleHandle(NULL), NULL)

ShowWindow   hWnd, SW_NORMAL
UpdateWindow hWnd

Dim As MSG msg
Do While getmessage(@msg, NULL, 0, 0) <> 0
   DispatchMessage  @msg
Loop


Ansonsten kann ich diesen Link empfehlen:
http://www.willemer.de/informatik/windows/winlistb.htm#windowcreate

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 20.05.2017, 18:43    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
So, ich habe mal ein (hoffentlich auch bei dir) lauffähiges Beispiel zusammengebastelt:
Code:
#Include "windows.bi"

Const ProgrammName = "ListBoxBeispiel"
Const IDC_LISTBOX_EXAMPLE = 1234

Type Player
   achName As ZString*MAX_PATH
   achPosition As ZString*12
   nGamesPlayed As Integer
   nGoalsScored As Integer
End Type

Dim Shared As Player Roster(0 To ...) = {Type <Player> ("Haas, Jonathan", "Midfield", 18, 4), _
                                         Type <Player> ("Pai, Jyothi", "Forward", 36, 12), _
                                         Type <Player> ("Hanif, Kerim", "Back", 26, 0), _
                                         Type <Player> ("Anderberg, Michael", "Back", 24, 2), _
                                         Type <Player> ("Jelitto, Jacek", "Midfield", 26, 3), _
                                         Type <Player> ("Raposo, Rui", "Back", 24, 3), _
                                         Type <Player> ("Joseph, Brad", "Forward", 13, 3), _
                                         Type <Player> ("Bouchard, Thomas", "Forward", 28, 5), _
                                         Type <Player> ("Salmre, Ivo", "Midfield", 27, 7), _
                                         Type <Player> ("Camp, David", "Midfield", 22, 3), _
                                         Type <Player> ("Kohl, Franz", "Goalkeeper", 17, 0)}

Dim As HWND hWnd
Dim As WNDCLASS wndcls

Function ListBoxExampleProc(hDlg As HWND, message As UInteger, wParam As WPARAM, lParam As LPARAM) As Integer
   Dim As HWND hWnd = GetParent(hDlg)
   Dim As Integer _pos, i, lbItem
   Dim As ZString*MAX_PATH buff
   Dim As HDC hdc
   Dim As PAINTSTRUCT ps
   Dim As RECT tr1 = Type<RECT>(100,200,200,500), _
               tr2 = Type<RECT>(205,200,400,500)

   Select Case message
      Case WM_INITDIALOG, WM_CREATE
         'Add items to list.
         For i = 0 To UBound(Roster)
            _pos = SendMessage(hDlg, LB_ADDSTRING, 0, Cast(LPARAM, @Roster(i).achName))
            'Set the array index of the player as item data.
            'This enables us to retrieve the item from the array
            'even after the items are sorted by the list box.
            SendMessage(hDlg, LB_SETITEMDATA, _pos, Cast(LPARAM, i))
         Next
         'Set input focus to the list box.
         SetFocus(hDlg)
         Return TRUE

      Case WM_COMMAND
         Select Case LoWord(wParam)
            Case IDOK
            Case IDCANCEL
               EndDialog(hDlg, LoWord(wParam))
               Return TRUE
            Case IDC_LISTBOX_EXAMPLE
               Select Case HiWord(wParam)
                  Case LBN_SELCHANGE
                     'Get selected index
                     lbItem = SendMessage(hDlg, LB_GETCURSEL, 0, 0)
                     i = SendMessage(hDlg, LB_GETITEMDATA, lbItem, 0)
                     
                     'Do something With the Data from Roster(i)
                     InvalidateRect(hWnd, @tr1, TRUE)
                     InvalidateRect(hWnd, @tr2, TRUE)
                     hdc = BeginPaint(hWnd, @ps)
                     
                     buff = "Name:" + Chr(13) +_
                            "Position:" + Chr(13) +_
                            "Games played:" + Chr(13) +_
                            "Goals:"
                     DrawText(hdc, @buff,Len(buff),@tr1, DT_RIGHT)

                     buff = Roster(i).achName + Chr(13) +_
                            Roster(i).achPosition + Chr(13) +_
                            Str(Roster(i).nGamesPlayed) + Chr(13) +_
                            Str(Roster(i).nGoalsScored)
                     DrawText(hdc, @buff,Len(buff),@tr2, DT_LEFT)
                     
                     EndPaint(hWnd, @ps)
                                          
                     Return TRUE
               End Select
         End Select
         Return TRUE
   End Select
   Return FALSE
End Function

Function WndProc(hWnd As HWND, message As UInteger, wParam As WPARAM, lParam As LPARAM) As LRESULT

   Static As HWND hLinks
   Dim As HDC hdc
   Dim As PAINTSTRUCT ps

   Select Case message
      Case WM_DESTROY
         PostQuitMessage 0
         Return 0

      Case WM_CREATE
         hLinks = CreateWindow("listbox", "",_
                               WS_BORDER Or WS_CHILD Or WS_VISIBLE Or LBS_NOTIFY Or _
                               WS_VSCROLL Or LBS_SORT,_
                               235, 30, 150, 122, hWnd, Cast(HMENU, IDC_LISTBOX_EXAMPLE),_
                               NULL,NULL)

         ListBoxExampleProc(hLinks, message, (LBN_SELCHANGE Shl 16) + IDC_LISTBOX_EXAMPLE, lParam)
         Return 0

      Case WM_COMMAND
         ListBoxExampleProc(hLinks, message, wParam, lParam)
         Return 0

   End Select
   Return DefWindowProc( hWnd, message, wParam, lParam )

End Function

'#################################

With wndcls
   .style         =  CS_HREDRAW Or CS_VREDRAW
   .lpfnWndProc   =  ProcPtr(WndProc)
   .cbClsExtra    =  0
   .cbWndExtra    =  0
   .hInstance     =  GetModuleHandle(NULL)
   .hCursor       =  LoadCursor(NULL, IDC_ARROW)
   .hIcon         =  LoadIcon(NULL, IDI_APPLICATION)
   .hbrBackground =  GetSysColorBrush(COLOR_WINDOW)
   .lpszClassName =  StrPtr(ProgrammName)
   .lpszMenuName  =  NULL
End With
RegisterClass @wndcls

hWnd = CreateWindow(ProgrammName, ProgrammName, WS_OVERLAPPED Or WS_SYSMENU,_
CW_USEDEFAULT, CW_USEDEFAULT, 580, 510,_
NULL, NULL, GetModuleHandle(NULL), NULL)

ShowWindow   hWnd, SW_NORMAL
UpdateWindow hWnd

Dim As MSG msg
Do While getmessage(@msg, NULL, 0, 0) <> 0
   DispatchMessage  @msg
Loop


Ansonsten kann ich diesen Link empfehlen:
http://www.willemer.de/informatik/windows/winlistb.htm#windowcreate

Gruß
grindstone

Bei mir funktioniert das Beispiel nicht! Welche Compilerversion wurde verwendet? Bei mir ist es die aktuellste Version 1.0.5.0! Kann es sein, dass die Bibliothek nicht die aktuellste ist? Anders kann ich mir es nicht erklären, warum das bei mir nicht funktioniert?
Schon komisch? Den Link werde ich mal genauer anschauen! Der sieht interessant aus.

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 21.05.2017, 13:52    Titel: Antworten mit Zitat

Meine Compilerversion ist 1.05.0 (32bit) mit FbEdit als Editor. Keine Ahnung, warum das bei dir nicht funktioniert. Versuch doch mal, die Zeilen mit den Fehlermeldungen von Hand einzutippen (zumindest einmal probeweise die erste Zeile in der Fehlerliste), um zu sehen, ob der Fehler dann verschwindet.

Damit du sehen kannst, wie das Ganze aussehen würde, habe ich einmal das compilierte Programm hochgeladen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 21.05.2017, 16:39    Titel: Antworten mit Zitat

Ich weiß zwar nicht obs euch was hilft, aber ich hab Grad mal das Beispiel unter Windows10/32 / FBC 1.0.5 Compilert und ausgeführt und es funktioniert absolut fehlerfrei.
Insofern glaube ich das du ALWIM ein Problem auf deinem System hast. Oder Arbeitest du vielleicht mit einem 64Bit System? Da hängts beim FBC nämlich auch noch in einigen Sachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 22.05.2017, 00:37    Titel: Antworten mit Zitat

Elor hat Folgendes geschrieben:
Ich weiß zwar nicht obs euch was hilft, aber ich hab Grad mal das Beispiel unter Windows10/32 / FBC 1.0.5 Compilert und ausgeführt und es funktioniert absolut fehlerfrei.
Insofern glaube ich das du ALWIM ein Problem auf deinem System hast. Oder Arbeitest du vielleicht mit einem 64Bit System? Da hängts beim FBC nämlich auch noch in einigen Sachen.

Ja, ich verwende einen Rechner mit 64-Bit! Dann ist es klar, warum das nicht funktioniert. Wenn der Compiler noch nicht so mitmacht, kann es nicht funktionieren! Ihr verwendet dann wahrscheinlich 32-Bit oder? Ich werde das jetzt ohne WinApi lösen. Habe da jetzt schon eine Idee. Wobei mir die WinApi-Lösung eine Idee besser gefallen hat! Sieht gut aus, dass mit der WinApi Liste.

Vielen Dank für den Hinweis mit dem Betriebssystem!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 22.05.2017, 09:38    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Ja, ich verwende einen Rechner mit 64-Bit! Dann ist es klar, warum das nicht funktioniert.
Ich halte es für sehr unwahrscheinlich, daß das die Ursache des Problems ist. Ein zum System passender Compiler erzeugt aus jeder (fehlerfreien) Quelldatei ein auf diesem System lauffähiges Programm. Und die anfänglichen Schwierigkeiten mit den WinAPI - Bindings nach Erscheinen des 64bit - Compilers dürften längst behoben sein (der letzte Eintrag zum Thema New Windows API headers im englischen Forum ist von 2015).

Vielleicht kann jemand mit 64bit - System den geposteten Code testen?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 22.05.2017, 11:43    Titel: Antworten mit Zitat

Hi,
funktioniert auch unter FB 64Bit aber mit kleinem Warnhinweis.
Zitat:
D:\FB1050_64\fbc -s gui "ListBoxBeispiel.bas"
ListBoxBeispiel.bas(125) warning 4(1): Suspicious pointer assignment

Make done

bezieht sich auf
Code:
 .lpfnWndProc   =  ProcPtr(WndProc)


EDIT:
Code:
 .lpfnWndProc   =  Cast(WNDPROC, @WndProc)

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 22.05.2017, 15:10    Titel: Antworten mit Zitat

Ich sitz Grad vor einem 64Bit Windows und da Funktioniert es, abgesehen von der Warnung die volta schon beschrieben hat, auch. Komisch, da muß doch bei ALWIM voanders der Wurm drin sein oder?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 22.05.2017, 17:23    Titel: Antworten mit Zitat

Die Fehlermeldungen sind auf jeden Fall ziemlich seltsam, die kann ich aus "normalem Betrieb" heraus nicht zuordnen.
Interessant finde ich dagegen, dass der 64bit-Compiler in einem x84-Pfad installiert sein soll:

ALWIM hat Folgendes geschrieben:
C:\Program Files (x86)\FreeBASIC\fbc -s gui "HTML_TEST.bas"

Da werden hoffentlich nicht 32bit- und 64bit-Komponenten gemixt?
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 23.05.2017, 12:26    Titel: Antworten mit Zitat

ALWIM hat vermutlich ein 32-Bit FreeBasic auf einem 64-Bit Windows laufen. Ist aber kein Problem und keine Erklärung für die Fehlermeldungen.

@ALWIM: könntest du zum Testen vielleicht FreeBasic nue herunterladen (die ZIP/7z Variante zum probieren) und prüfen ob es damit funktioniert. Falls ja hast du vermutlich in deiner lokalen Installation einmal an den Headern und/oder Bibliotheken herumgebastelt und dabei etwas vermurkst.
Eine andere Möglichkeit könnte noch sein, dass beim Kopieren aus dem Browser irgendwelche (eventuell unsichtbare) Sonderzeichen mitkopiert wurden, die der fbc nicht mag.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 23.05.2017, 16:36    Titel: Antworten mit Zitat

St_W hat Folgendes geschrieben:
ALWIM hat vermutlich ein 32-Bit FreeBasic auf einem 64-Bit Windows laufen. Ist aber kein Problem und keine Erklärung für die Fehlermeldungen.

@ALWIM: könntest du zum Testen vielleicht FreeBasic nue herunterladen (die ZIP/7z Variante zum probieren) und prüfen ob es damit funktioniert. Falls ja hast du vermutlich in deiner lokalen Installation einmal an den Headern und/oder Bibliotheken herumgebastelt und dabei etwas vermurkst.
Eine andere Möglichkeit könnte noch sein, dass beim Kopieren aus dem Browser irgendwelche (eventuell unsichtbare) Sonderzeichen mitkopiert wurden, die der fbc nicht mag.
Ich habe das ganze auf einem Laptop mit XP und 32-bit getestet! Auch da geht es nicht. Es ist wie ihr schon sagtet bzw. ich oben geschrieben habe, möglicherweise ein Problem mit den Bibliotheken! Werde Freebasic nochmals neu runterladen und testen. Irgendwo muss doch das Problem liegen?

Zitat:
Eine andere Möglichkeit könnte noch sein, dass beim Kopieren aus dem Browser irgendwelche (eventuell unsichtbare) Sonderzeichen mitkopiert wurden, die der fbc nicht mag.
Das kann ich ausschließen, da ich Buchstabe für Buchstabe selber eingegeben habe!

Edit:
Problem wurde gefunden! Beim kopieren aus dem Browser heraus, wurden tatsächlich Zeichen mit kopiert, die der Compiler nicht schluckt!!! Diese Leerzeichen waren dran schuld! Dachte zunächst, dass es an dem Kopieren nicht liegen kann, aber ich habe mich doch etwas getäuscht. Leerzeichen entfernt und schon klappt es. Nur noch 1 Fehlermeldung, aber die kriege ich alleine weg. Da fehlt jetzt noch eine Deklarierung und dann sollte es klappen! Der Tipp mit dem Kopieren war gut!!! Yahooo!!!! vor Freude klatschen
War schon ein wenig am Verzweifeln...

Edit2:
Jetzt klappt es! grinsen Hehehe...
Für welche Lösung ich mich nun entscheide, weiß ich noch nicht? Angefangen habe ich jetzt mal das ganze selber zu schreiben, ohne WinApi! Wenn ich wüsste, ob man da auch eine Eintragssuche machen kann, würde ich vielleicht doch auf die WinApi Funktion zurückgreifen? Zumindest habe ich was, womit man arbeiten kann.

Ich bedanke mich recht herzlich, bei allen für die Hilfe!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05


Zuletzt bearbeitet von ALWIM am 23.05.2017, 23:14, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 23.05.2017, 19:23    Titel: Antworten mit Zitat

Hallo ALWIM!

Schön, daß es doch noch geklappt hat. lächeln

Hier noch eine Version, bei der die Daten nicht aus einem Array, sondern wie gewünscht aus aus einer Datei gelesen werden. Die Lese- und Schreibroutinen sind als Property in den Type eingebettet. Du brauchst nur noch die Datei im entsprechenden Modus zu öffnen (Input, Output oder Append), und die Dateinummer in die entsprechende Variable (.lesen / .schreiben) zu schreiben. Die Property liest bzw schreibt dann einen kompletten Datensatz aus der bzw. in die Datei. Ein Leerstring als Rückgabewert bedeutet Dateiende.
Code:
#Include "windows.bi"

Const ProgrammName = "ListBoxBeispiel"
Const IDC_LISTBOX_EXAMPLE = 1234

Type Player
   achName As ZString*MAX_PATH
   achPosition As ZString*12
   nGamesPlayed As Integer
   nGoalsScored As Integer
   Declare Property lesen(fnr As Integer)
   Declare Property schreiben(fnr As Integer)
End Type

Property Player.lesen(fnr As Integer)
      
   achName = ""
   achPosition = ""
   nGamesPlayed = 0
   nGoalsScored = 0
   If Eof(fnr) Then
      Return
   Else
      Line Input #fnr, achName
      Line Input #fnr, achPosition
      Input #fnr, nGamesPlayed
      Input #fnr, nGoalsScored
   EndIf
   
End Property

Property Player.schreiben(fnr As Integer)
   
   Print #fnr, achName
   Print #fnr, achPosition
   Print #fnr, nGamesPlayed
   Print #fnr, nGoalsScored
   
End Property

Dim As HWND hWnd
Dim As WNDCLASS wndcls
Dim Shared As String datei

datei = ExePath + "\daten.txt"

'------------ TESTDATEI ERSTELLEN -------------------------------------------
Dim As Integer ff
Dim As Player Roster(0 To ...) = {Type <Player> ("Haas, Jonathan", "Midfield", 18, 4), _
                                  Type <Player> ("Pai, Jyothi", "Forward", 36, 12), _
                                  Type <Player> ("Hanif, Kerim", "Back", 26, 0), _
                                  Type <Player> ("Anderberg, Michael", "Back", 24, 2), _
                                  Type <Player> ("Jelitto, Jacek", "Midfield", 26, 3), _
                                  Type <Player> ("Raposo, Rui", "Back", 24, 3), _
                                  Type <Player> ("Joseph, Brad", "Forward", 13, 3), _
                                  Type <Player> ("Bouchard, Thomas", "Forward", 28, 5), _
                                  Type <Player> ("Salmre, Ivo", "Midfield", 27, 7), _
                                  Type <Player> ("Camp, David", "Midfield", 22, 3), _
                                  Type <Player> ("Kohl, Franz", "Goalkeeper", 17, 0)}

'Datei aus Array erstellen
ff = FreeFile
Open datei For Output As #ff
For x As Integer = 0 To UBound(Roster)
   roster(x).schreiben = ff
Next
Close ff
'----------------------------------------------------------------------------

Function ListBoxExampleProc(hDlg As HWND, message As UInteger, wParam As WPARAM, lParam As LPARAM) As Integer
   Dim As HWND hWnd = GetParent(hDlg)
   Dim As Integer _pos, i, lbItem, zaehler, ff
   Dim As ZString*MAX_PATH buff
   Dim As HDC hdc
   Dim As PAINTSTRUCT ps
   Dim As RECT tr1 = Type<RECT>(100,200,200,500), _
               tr2 = Type<RECT>(205,200,400,500)
   Dim As Player pl

   Select Case message
      Case WM_INITDIALOG, WM_CREATE
         'Add items to list.
         ff = FreeFile
         Open datei For Input As #ff
         zaehler = 0
         Do
            pl.lesen = ff 'liest einen datensatz aus der datei
            If pl.achName = "" Then 'dateiende
               Exit Do
            EndIf
            _pos = SendMessage(hDlg, LB_ADDSTRING, 0, Cast(LPARAM, @pl.achName))
            'Set the array index of the player as item data.
            'This enables us to retrieve the item from the array
            'even after the items are sorted by the list box.
            SendMessage(hDlg, LB_SETITEMDATA, _pos, Cast(LPARAM, zaehler))
            zaehler += 1
         Loop
                  
         'Set input focus to the list box.
         SetFocus(hDlg)
         Return TRUE

      Case WM_COMMAND
         Select Case LoWord(wParam)
            Case IDOK
            Case IDCANCEL
               EndDialog(hDlg, LoWord(wParam))
               Return TRUE
            Case IDC_LISTBOX_EXAMPLE
               Select Case HiWord(wParam)
                  Case LBN_SELCHANGE
                     'Get selected index
                     lbItem = SendMessage(hDlg, LB_GETCURSEL, 0, 0)
                                          
                     ff = FreeFile
                     Open datei For Input As #ff
                     'bis zum gesuchten datensatz lesen
                     For i = 0 To SendMessage(hDlg, LB_GETITEMDATA, lbItem, 0)
                        pl.lesen = ff
                     Next
                     Close ff
                     
                     'Do something With the Data from Roster(i)
                     InvalidateRect(hWnd, @tr1, TRUE)
                     InvalidateRect(hWnd, @tr2, TRUE)
                     hdc = BeginPaint(hWnd, @ps)
                     
                     buff = "Name:" + Chr(13) +_
                            "Position:" + Chr(13) +_
                            "Games played:" + Chr(13) +_
                            "Goals:"
                     DrawText(hdc, @buff,Len(buff),@tr1, DT_RIGHT)
                     
                     buff = pl.achName + Chr(13) +_
                            pl.achPosition + Chr(13) +_
                            Str(pl.nGamesPlayed) + Chr(13) +_
                            Str(pl.nGoalsScored)
                     DrawText(hdc, @buff,Len(buff),@tr2, DT_LEFT)
                     
                     EndPaint(hWnd, @ps)
                                          
                     Return TRUE
               End Select
         End Select
         Return TRUE
   End Select
   Return FALSE
End Function

Function WndProc(hWnd As HWND, message As UInteger, wParam As WPARAM, lParam As LPARAM) As LRESULT

   Static As HWND hLinks
   Dim As HDC hdc
   Dim As PAINTSTRUCT ps

   Select Case message
      Case WM_DESTROY
         PostQuitMessage 0
         Return 0

      Case WM_CREATE
         hLinks = CreateWindow("listbox", "",_
                               WS_BORDER Or WS_CHILD Or WS_VISIBLE Or LBS_NOTIFY Or _
                               WS_VSCROLL Or LBS_SORT,_
                               235, 30, 150, 122, hWnd, Cast(HMENU, IDC_LISTBOX_EXAMPLE),_
                               NULL,NULL)

         ListBoxExampleProc(hLinks, message, (LBN_SELCHANGE Shl 16) + IDC_LISTBOX_EXAMPLE, lParam)
         Return 0

      Case WM_COMMAND
         ListBoxExampleProc(hLinks, message, wParam, lParam)
         Return 0

   End Select
   Return DefWindowProc( hWnd, message, wParam, lParam )

End Function

'#################################

With wndcls
   .style         =  CS_HREDRAW Or CS_VREDRAW
   .lpfnWndProc   =  ProcPtr(WndProc)
   .cbClsExtra    =  0
   .cbWndExtra    =  0
   .hInstance     =  GetModuleHandle(NULL)
   .hCursor       =  LoadCursor(NULL, IDC_ARROW)
   .hIcon         =  LoadIcon(NULL, IDI_APPLICATION)
   .hbrBackground =  GetSysColorBrush(COLOR_WINDOW)
   .lpszClassName =  StrPtr(ProgrammName)
   .lpszMenuName  =  NULL
End With
RegisterClass @wndcls

hWnd = CreateWindow(ProgrammName, ProgrammName, WS_OVERLAPPED Or WS_SYSMENU,_
CW_USEDEFAULT, CW_USEDEFAULT, 580, 510,_
NULL, NULL, GetModuleHandle(NULL), NULL)

ShowWindow   hWnd, SW_NORMAL
UpdateWindow hWnd

Dim As MSG msg
Do While getmessage(@msg, NULL, 0, 0) <> 0
   DispatchMessage  @msg
Loop


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 23.05.2017, 23:12    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Hallo ALWIM!

Schön, daß es doch noch geklappt hat. lächeln

Hier noch eine Version, bei der die Daten nicht aus einem Array, sondern wie gewünscht aus aus einer Datei gelesen werden. Die Lese- und Schreibroutinen sind als Property in den Type eingebettet. Du brauchst nur noch die Datei im entsprechenden Modus zu öffnen (Input, Output oder Append), und die Dateinummer in die entsprechende Variable (.lesen / .schreiben) zu schreiben. Die Property liest bzw schreibt dann einen kompletten Datensatz aus der bzw. in die Datei. Ein Leerstring als Rückgabewert bedeutet Dateiende.
Code:
#Include "windows.bi"

Const ProgrammName = "ListBoxBeispiel"
Const IDC_LISTBOX_EXAMPLE = 1234

Type Player
   achName As ZString*MAX_PATH
   achPosition As ZString*12
   nGamesPlayed As Integer
   nGoalsScored As Integer
   Declare Property lesen(fnr As Integer)
   Declare Property schreiben(fnr As Integer)
End Type

Property Player.lesen(fnr As Integer)
      
   achName = ""
   achPosition = ""
   nGamesPlayed = 0
   nGoalsScored = 0
   If Eof(fnr) Then
      Return
   Else
      Line Input #fnr, achName
      Line Input #fnr, achPosition
      Input #fnr, nGamesPlayed
      Input #fnr, nGoalsScored
   EndIf
   
End Property

Property Player.schreiben(fnr As Integer)
   
   Print #fnr, achName
   Print #fnr, achPosition
   Print #fnr, nGamesPlayed
   Print #fnr, nGoalsScored
   
End Property

Dim As HWND hWnd
Dim As WNDCLASS wndcls
Dim Shared As String datei

datei = ExePath + "\daten.txt"

'------------ TESTDATEI ERSTELLEN -------------------------------------------
Dim As Integer ff
Dim As Player Roster(0 To ...) = {Type <Player> ("Haas, Jonathan", "Midfield", 18, 4), _
                                  Type <Player> ("Pai, Jyothi", "Forward", 36, 12), _
                                  Type <Player> ("Hanif, Kerim", "Back", 26, 0), _
                                  Type <Player> ("Anderberg, Michael", "Back", 24, 2), _
                                  Type <Player> ("Jelitto, Jacek", "Midfield", 26, 3), _
                                  Type <Player> ("Raposo, Rui", "Back", 24, 3), _
                                  Type <Player> ("Joseph, Brad", "Forward", 13, 3), _
                                  Type <Player> ("Bouchard, Thomas", "Forward", 28, 5), _
                                  Type <Player> ("Salmre, Ivo", "Midfield", 27, 7), _
                                  Type <Player> ("Camp, David", "Midfield", 22, 3), _
                                  Type <Player> ("Kohl, Franz", "Goalkeeper", 17, 0)}

'Datei aus Array erstellen
ff = FreeFile
Open datei For Output As #ff
For x As Integer = 0 To UBound(Roster)
   roster(x).schreiben = ff
Next
Close ff
'----------------------------------------------------------------------------

Function ListBoxExampleProc(hDlg As HWND, message As UInteger, wParam As WPARAM, lParam As LPARAM) As Integer
   Dim As HWND hWnd = GetParent(hDlg)
   Dim As Integer _pos, i, lbItem, zaehler, ff
   Dim As ZString*MAX_PATH buff
   Dim As HDC hdc
   Dim As PAINTSTRUCT ps
   Dim As RECT tr1 = Type<RECT>(100,200,200,500), _
               tr2 = Type<RECT>(205,200,400,500)
   Dim As Player pl

   Select Case message
      Case WM_INITDIALOG, WM_CREATE
         'Add items to list.
         ff = FreeFile
         Open datei For Input As #ff
         zaehler = 0
         Do
            pl.lesen = ff 'liest einen datensatz aus der datei
            If pl.achName = "" Then 'dateiende
               Exit Do
            EndIf
            _pos = SendMessage(hDlg, LB_ADDSTRING, 0, Cast(LPARAM, @pl.achName))
            'Set the array index of the player as item data.
            'This enables us to retrieve the item from the array
            'even after the items are sorted by the list box.
            SendMessage(hDlg, LB_SETITEMDATA, _pos, Cast(LPARAM, zaehler))
            zaehler += 1
         Loop
                  
         'Set input focus to the list box.
         SetFocus(hDlg)
         Return TRUE

      Case WM_COMMAND
         Select Case LoWord(wParam)
            Case IDOK
            Case IDCANCEL
               EndDialog(hDlg, LoWord(wParam))
               Return TRUE
            Case IDC_LISTBOX_EXAMPLE
               Select Case HiWord(wParam)
                  Case LBN_SELCHANGE
                     'Get selected index
                     lbItem = SendMessage(hDlg, LB_GETCURSEL, 0, 0)
                                          
                     ff = FreeFile
                     Open datei For Input As #ff
                     'bis zum gesuchten datensatz lesen
                     For i = 0 To SendMessage(hDlg, LB_GETITEMDATA, lbItem, 0)
                        pl.lesen = ff
                     Next
                     Close ff
                     
                     'Do something With the Data from Roster(i)
                     InvalidateRect(hWnd, @tr1, TRUE)
                     InvalidateRect(hWnd, @tr2, TRUE)
                     hdc = BeginPaint(hWnd, @ps)
                     
                     buff = "Name:" + Chr(13) +_
                            "Position:" + Chr(13) +_
                            "Games played:" + Chr(13) +_
                            "Goals:"
                     DrawText(hdc, @buff,Len(buff),@tr1, DT_RIGHT)
                     
                     buff = pl.achName + Chr(13) +_
                            pl.achPosition + Chr(13) +_
                            Str(pl.nGamesPlayed) + Chr(13) +_
                            Str(pl.nGoalsScored)
                     DrawText(hdc, @buff,Len(buff),@tr2, DT_LEFT)
                     
                     EndPaint(hWnd, @ps)
                                          
                     Return TRUE
               End Select
         End Select
         Return TRUE
   End Select
   Return FALSE
End Function

Function WndProc(hWnd As HWND, message As UInteger, wParam As WPARAM, lParam As LPARAM) As LRESULT

   Static As HWND hLinks
   Dim As HDC hdc
   Dim As PAINTSTRUCT ps

   Select Case message
      Case WM_DESTROY
         PostQuitMessage 0
         Return 0

      Case WM_CREATE
         hLinks = CreateWindow("listbox", "",_
                               WS_BORDER Or WS_CHILD Or WS_VISIBLE Or LBS_NOTIFY Or _
                               WS_VSCROLL Or LBS_SORT,_
                               235, 30, 150, 122, hWnd, Cast(HMENU, IDC_LISTBOX_EXAMPLE),_
                               NULL,NULL)

         ListBoxExampleProc(hLinks, message, (LBN_SELCHANGE Shl 16) + IDC_LISTBOX_EXAMPLE, lParam)
         Return 0

      Case WM_COMMAND
         ListBoxExampleProc(hLinks, message, wParam, lParam)
         Return 0

   End Select
   Return DefWindowProc( hWnd, message, wParam, lParam )

End Function

'#################################

With wndcls
   .style         =  CS_HREDRAW Or CS_VREDRAW
   .lpfnWndProc   =  ProcPtr(WndProc)
   .cbClsExtra    =  0
   .cbWndExtra    =  0
   .hInstance     =  GetModuleHandle(NULL)
   .hCursor       =  LoadCursor(NULL, IDC_ARROW)
   .hIcon         =  LoadIcon(NULL, IDI_APPLICATION)
   .hbrBackground =  GetSysColorBrush(COLOR_WINDOW)
   .lpszClassName =  StrPtr(ProgrammName)
   .lpszMenuName  =  NULL
End With
RegisterClass @wndcls

hWnd = CreateWindow(ProgrammName, ProgrammName, WS_OVERLAPPED Or WS_SYSMENU,_
CW_USEDEFAULT, CW_USEDEFAULT, 580, 510,_
NULL, NULL, GetModuleHandle(NULL), NULL)

ShowWindow   hWnd, SW_NORMAL
UpdateWindow hWnd

Dim As MSG msg
Do While getmessage(@msg, NULL, 0, 0) <> 0
   DispatchMessage  @msg
Loop


Gruß
grindstone
Vielen herzlichen Dank, aber das hätte ich selber auch noch hinbekommen!
An so was banales, wie den fehlerhaften Quellcode denkt man am Anfang gar nicht! Der Quellcode sieht auf den ersten Blick ja nicht fehlerhaft aus.

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 13.08.2021, 16:27    Titel: Antworten mit Zitat

Ich muss jetzt den Titel nochmals ausgraben. Bei den geposteten Beispielen wird die Listbox mit Zstrings befüllt. Was mache ich, wenn ich ganz normale Strings habe? Wie befülle ich die Listbox durch solche Variablen:

Code:
DIM AS STRING AUTO(0 TO 4)

Auto(1) = "BWM"
Auto(2) = "Mini"
Auto(3) = "Rolls Royce"
Auto(4) = "Tesla"


Sobald ich die Variablen so wie oben verwende, dann zeigt der mir in der Listbox kryptische Zeichen an! Auf jeden Fall nicht das, was ich will. Oder zum Teil gar nichts.

Ich müsste irgendwie STRINGS in ZSTRINGS umwandeln, oder von Haus aus STRINGS verwenden können?
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 14.08.2021, 16:31    Titel: Antworten mit Zitat

Die Pointerübergabe direkt aus einem Array funktioniert nicht, die WinAPI mag offenbar keine FB - Arrays. grinsen

Mit einem Hilfsstring lässt sie sich aber recht einfach überlisten:
Code:
...
Dim As String g = Auto(x) + Chr(0)
_pos = SendMessage(hDlg, LB_ADDSTRING, 0, Cast(LPARAM, StrPtr(g)))
...


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz