Hallo NicTheQuick,
erst einmal noch ein ausdrückliches Danke für Deine Verbesserungen (ich habe selbstverständlich auch auf den Danke-Button gedrückt). Bei einem zweiten Durchlauf funktionierte auch bei mir der Haltepunkt – keine Ahnung, was beim ersten Mal los war (am Anti-Viren-Programm lag es aber sicher nicht).
Aufgrund des erfolgreichen Durchlaufs dieses sehr minimalistischen Programms dachte ich mir, daß man, um dem Problem auf die Spur zu kommen, einen Quellkode schreiben muß, der näher am ursprünglichen Programm ist. Der kann dann notwendigerweise nicht mehr so minimalistisch sein. Ich habe nämlich den Verdacht, daß es irgendetwas mit dem Unterfenster, in dem man die auszusondernden Fächer festlegt, zu tun hat.
Da ich Dir die Datei, mit der das Listenfeld befüllt wird, nicht übermitteln kann, habe ich nach guter alter Basic-Manier eine Data-Sektion ans Ende des Quellkodes gesetzt. Die Strings nach
Data.s haben exakt dasselbe Format, wie jeweils eine Zeile in meiner Textdatei. Der
Read-Befehl liest also die Zeilen aus der Data-Sektion genau so aus, wie es der
ReadString-Befehl im ursprünglichen Programm aus der Textdatei tut. Möglicherweise mußt Du, wenn Du den Quelltext in Deine IDE kopierst, die Umbrüche bei den Data-Strings entfernen, denn die Strings sind sehr lang. Es müssen exakt 20 nichtumbrochene Data-Zeilen sein.
Bei dieser zweiten Version, die sehr nah am Original ist, wird auch der Haltepunkt nach der Kommentarzeile
Code: Alles auswählen
; 4. Alle Einträge löschen, deren Fach nicht in F enthalten ist
also die For-Next-Schleife, definitiv nicht erreicht (ich habe es mehrmals getestet). Bis zum Ende von
läuft alles perfekt:
Code: Alles auswählen
EnableExplicit
Enumeration 100
#Fe_Li
#Lf_Li
#Sf_F
#Fe_Fa=200
#Sf_a =291
#Sf_k
#Sf_OK
EndEnumeration
Define.i AaLi=20, HLf=AaLi*15+21, HFe=HLf+70
OpenWindow(#Fe_Li, 0, 0, 375, HFe, "Lerninhalte", #PB_Window_SystemMenu|
#PB_Window_ScreenCentered)
ListViewGadget(#Lf_Li, 10, 10, 355, HLf, #PB_ListView_MultiSelect|
#PB_ListView_ClickSelect)
ButtonGadget(#Sf_F, 10, HFe-50, 42, 42, "Fach")
Define.i GrLf, Gk, GrLfzs
Define.i brE, Ix, Zl, AdF, Et
Define.s TxdZl, eF, F
Define.size Lw
GrLf=GadgetID(#Lf_Li)
Gk=GetDC_(GrLf)
LoadFont(1, "Arial", 10)
GrLfzs=FontID(1)
SetGadgetFont(#Lf_Li, GrLfzs)
SelectObject_(Gk, GrLfzs)
ReadFile(1, "D:\Lernen\gesamte Lerninhalte.txt")
Repeat
Read.s TxdZl
TxdZl=ReplaceString(TxdZl, "|", ", "+#US$)
GetTextExtentPoint32_(Gk, @TxdZl, Len(TxdZl), Lw)
If brE<Lw\cx
brE=Lw\cx
EndIf
AddGadgetItem(#Lf_Li, Ix, TxdZl)
Ix+1
Until Ix=20
CloseFile(1)
SendMessage_(GrLf, #LB_SETHORIZONTALEXTENT, brE+8, 0)
ReleaseDC_(GrLf, Gk)
Repeat
Et=WaitWindowEvent()
If Et=#PB_Event_Gadget
Select EventGadget()
Case #Sf_F
Ix=CountGadgetItems(#Lf_Li)-1
; 1. Welche Fächer sind in der Liste enthalten?
For Zl=0 To Ix
TxdZl=GetGadgetItemText(#Lf_Li, Zl)
eF=StringField(TxdZl, 4, #US$) ; Fach des Einzeleintrags eF zuweisen
If Not FindString(F, eF) ; Zeichenkette F bilden, die aus allen
F+eF+"|" ; im Feld enthaltenen Fächern besteht
EndIf
Next
; 2. Fenster anzeigen, das die enthaltenen Fächer auflistet
AdF=CountString(F, "|")-1 ; Anzahl der Fächer minus 1
Dim Fl.s(AdF) ; Feld ’Fächerliste’
For Zl=0 To AdF
Fl(Zl)=StringField(F, Zl+1, "|") ; Fächer aus der Zeichenkette ’F’ ins
Next ; Feld ’Fächerliste’ einlesen
SortArray(Fl(), 0) ; Feld ’Fächerliste’ alphabetisch ordnen
LoadFont(2, "Segoe UI", 10)
GrLfzs=FontID(2)
OpenWindow(#Fe_Fa, 0, 0, 160, AdF*20+90, "Fachauswahl",
#PB_Window_WindowCentered, WindowID(#Fe_Li))
GrLf=WindowID(#Fe_Fa)
Gk=GetDC_(GrLf)
SelectObject_(Gk, GrLfzs)
SetGadgetFont(#PB_Default, GrLfzs)
For Zl=0 To AdF
GetTextExtentPoint32_(Gk, @Fl(Zl), Len(Fl(Zl)), Lw)
CheckBoxGadget(#Fe_Fa+Zl+1, 10, Zl*20+10, Lw\cx+18, 20, Fl(Zl))
Next
ReleaseDC_(GrLf, Gk)
ButtonGadget(#Sf_a, 10, AdF*20+38, 42, 42, "alle")
ButtonGadget(#Sf_k, 60, AdF*20+38, 42, 42, "keins")
ButtonGadget(#Sf_OK, 110, AdF*20+38, 42, 42, "OK")
Repeat
Et=WaitWindowEvent()
If Et=#PB_Event_Gadget
Select EventGadget()
Case #Sf_a ; alle auswählen
For Zl=0 To AdF
SetGadgetState(#Fe_Fa+Zl+1, #PB_Checkbox_Checked)
Next
Case #Sf_k ; alle deselektieren
For Zl=0 To AdF
SetGadgetState(#Fe_Fa+Zl+1, #PB_Checkbox_Unchecked)
Next
; 3. Zeichenkette aus der Benutzerauswahl bilden
Case #Sf_OK
F="|"
For Zl=0 To AdF
If GetGadgetState(#Fe_Fa+Zl+1)=#PB_Checkbox_Checked ; wenn angehakt,
F+GetGadgetText(#Fe_Fa+Zl+1)+"|" ; wird der Text der Checkbox
EndIf ; zur Zeichenkette ’F’ hinzugefügt,
Next ; die am Ende alle angehakten Fächer
CloseWindow(#Fe_Fa) ; enthält
EndSelect
EndIf
Until Et=#PB_Event_CloseWindow
; 4. Alle Einträge löschen, deren Fach nicht in F enthalten ist
Zl=0
While Zl<Ix
eF="|"+StringField(GetGadgetItemText(#Lf_Li, Zl), 4, #US$)+"|"
If Not FindString(F, eF)
RemoveGadgetItem(#Lf_Li, Zl)
EndIf
If StringField(GetGadgetItemText(#Lf_Li, Zl), 4, #US$)=F
RemoveGadgetItem(#Lf_Li, Zl)
Ix-1
Else
Zl+1
EndIf
Wend
EndSelect
EndIf
Until Et=#PB_Event_CloseWindow
DataSection
Data.s "Hewings Martin|Advanced Grammar in Use, 3. Aufl. 2013|20 Should, ought to and had better|Englisch"
Data.s "Hewings Martin|Advanced Grammar in Use, 3. Aufl. 2013|21 Linking verbs: be, appear, seem; become, get, etc.|Englisch"
Data.s "Hewings Martin|Advanced Grammar in Use, 3. Aufl. 2013|22 Forming passive sentences 1|Englisch"
Data.s "Hewings Martin|Advanced Grammar in Use, 3. Aufl. 2013|23 Forming passive sentences 2: verb + -ing or to-infinitive|Englisch"
Data.s "Hewings Martin|Advanced Grammar in Use, 3. Aufl. 2013|24 Using passives|Englisch"
Data.s "Roland Vocke|Deutsche Geschichte (hg. v. Heinrich Pleticha), Bd. 1|Cluny und Gorze und ihre Reformen, S. 246–254|Geschichte"
Data.s "Hanswernfried Muth, Günter Merwald|Deutsche Geschichte (hg. v. Heinrich Pleticha), Bd. 1|Die romanische Kunst der Salierzeit–Literatur in der salischen Zeit, S. 255–67|Geschichte"
Data.s "Siegfried Grißhammer|Deutsche Geschichte (hg. v. Heinrich Pleticha), Bd. 1|Die Zeit des Investiturstreits, Bischöfliches Kidnapping: Entführung des jungen Königs und Ende der Regentschaft–Der Streit zwischen Kaiser und Papst: Spaltung der Einheit der mittelalterlichen Welt, S. 268–78|Geschichte"
Data.s "Siegfried Grißhammer|Deutsche Geschichte (hg. v. Heinrich Pleticha), Bd. 1|Die Zeit des Investiturstreits, „Dictatus papae“: Päpstlicher Machtwille–Der Gang nach Canossa Unterwerfung oder Kalkül?, S. 279–92|Geschichte"
Data.s "Siegfried Grißhammer|Deutsche Geschichte (hg. v. Heinrich Pleticha), Bd. 1|Die Zeit des Investiturstreits, Erneute Fürstenopposition: Rudolf von Rheinfelden zum Gegenkönig gewählt–Weitere Erfolge für Papst Urban II., S. 292–303|Geschichte"
Data.s "Hirschberger Johannes|Geschichte der Philosophie, Band 1|II. Abschnitt: Die Philosophie des Mittelalters, 1. Kapitel: Die Philosophie der Patristik, 3. Augustinus: Der Lehrer des Abendlandes, Leben–A. Wahrheit|Philosophie"
Data.s "Hirschberger Johannes|Geschichte der Philosophie, Band 1|II. Abschnitt: Die Philosophie des Mittelalters, 1. Kapitel: Die Philosophie der Patristik, 3. Augustinus: Der Lehrer des Abendlandes, B. Gott|Philosophie"
Data.s "Hirschberger Johannes|Geschichte der Philosophie, Band 1|II. Abschnitt: Die Philosophie des Mittelalters, 1. Kapitel: Die Philosophie der Patristik, 3. Augustinus: Der Lehrer des Abendlandes, C. Schöpfung|Philosophie"
Data.s "Hirschberger Johannes|Geschichte der Philosophie, Band 1|II. Abschnitt: Die Philosophie des Mittelalters, 1. Kapitel: Die Philosophie der Patristik, 3. Augustinus: Der Lehrer des Abendlandes, D. Seele|Philosophie"
Data.s "Hirschberger Johannes|Geschichte der Philosophie, Band 1|II. Abschnitt: Die Philosophie des Mittelalters, 1. Kapitel: Die Philosophie der Patristik, 3. Augustinus: Der Lehrer des Abendlandes, E. Das Gute–F. Gottesstaat|Philosophie"
Data.s "Pascoe Graham|Englisch für Anfänger (1982)|30. The Editor's Office|Video"
Data.s "Pascoe Graham|Englisch für Anfänger (1982)|31. The Election Campaign|Video"
Data.s "Pascoe Graham|Englisch für Anfänger (1982)|32. The Helpful Neighbour|Video"
Data.s "Pascoe Graham|Englisch für Anfänger (1982)|33. At the Police Station|Video"
Data.s "Pascoe Graham|Englisch für Anfänger (1982)|34. Mail Order Shopping|Video"
Das Fenster wird nach dem
CloseWindow(#Fe_Fa)-Befehl geschlossen, aber die
Repeat-
Until-Ereignisschleife des Unterfensters nicht verlassen, so daß es dort offenbar zu einer Endlos-Schleife kommt.
Nur für den Fall, daß Du mit
GetTextExtentPoint32 nichts anfangen kannst: Das ist eine API-Funktion, mit der man die Länge von Texten auf dem Bildschirm ausmessen kann. So wird z.B. bei Listenfeldern nur dann ein waagerechter Scrollbalken angezeigt, wenn man dem Listenfeld durch
SendMessage_(Handle des Listenfeldes,
#LB_SETHORIZONTALEXTENT, Breite, 0) mitgeteilt hat, wie breit die längste Zeile in ihm ist.
GetTextExtentPoint32 benötigt als Parameter 1. den Gerätekontext (
Gk), 2. einen Zeiger auf den auszumessenden String, 3. die Anzahl der Zeichen, aus denen der String besteht und 4. eine
Size-Struktur, in die dann die Breite (
cx) und Höhe (
cy) des Strings geschrieben werden. Mit
SelectObject_(Gerätekontext, Handle des Fonts) wird der Font des Strings in den Gerätekontext geladen.
Vielen Dank