Seite 1 von 2
Vergleich von 2 Werten klappt nicht !!!
Verfasst: 19.10.2006 21:48
von sebsch80
Hallo,
wieso wird bei diesem Vergleich immer das Fenster mit "Gewonnen" ausgegeben.
Auch wenn man 2 Unterschiedliche Zahlen eingibt.
Sinn:
Bei "Gesuchter" soll ein Wert eingegeben werden (zB. "2")
Bei "Vorhandener" ebenfalls. Dann auf "Hinzufügen" und der Wert kommt in die Liste.
Nun soll der Gesuchte Wert mit allen Werten in der Liste verglichen werden.
Code: Alles auswählen
If OpenWindow(0,100,100,500,400,"Fenster 1",#PB_Window_SystemMenu)
If CreateGadgetList(WindowID(0))
TextGadget(1,20,20,120,20,"Gesuchter")
StringGadget(2,140,20,100,20,"")
TextGadget(3,20,50,100,20,"Neuer")
StringGadget(4,140,50,100,20,"")
ButtonGadget(5,260,50,100,20,"Hinzufügen")
ListViewGadget(6,140,90,100,80)
ButtonGadget(7,200,200,80,20,"Vergleichen")
EndIf
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
If EventID = #PB_Event_Gadget
If EventGadget()=5
a$=GetGadgetText(4)
AddGadgetItem(6,-1,""+a$)
EndIf
EndIf
Gesuchter$ = GetGadgetText(2)
Vorhandene$ = GetGadgetText(6)
If EventID = #PB_Event_Gadget
If EventGadget()=7
If Mid(Gesucht$,0,10) = Mid(Vorhandene$,0,10)
MessageRequester("","Gewonnen",0)
Else
MessageRequester("","Leider nichts",0)
EndIf
EndIf
EndIf
Until Quit=1
EndIf
Kann mir jemand helfen???
Oder kann man Werte in einem ListViewGadget nicht vergleichen?
Verfasst: 19.10.2006 22:26
von Kaeru Gaman
du solltest das füllen der strings per GetGadgetText() auch innerhalb des If ...=7 machen.
bei strings wird nicht ab 0 gezählt: die erste position ist 1.
wenn du den anfang haben willst, kannst du auch Left() nehmen.
...schau mal, obs dann schon geht....
Verfasst: 19.10.2006 23:22
von Fluid Byte
Ein bischen aufwendig aber vieleicht so?
Code: Alles auswählen
Enumeration
#TXT_Gesuchter
#TXT_Neuer
#TXT_Werte
#STR_Gesuchter
#STR_Neuer
#LST_Werte
#BTN_Vergleichen
#BTN_Hinzufuegen
EndEnumeration
OpenWindow(0,0,0,215,170,"Fenster 1",#PB_Window_SystemMenu | 1)
CreateGadgetList(WindowID(0))
TextGadget(#TXT_Gesuchter,5,7,55,15,"Gesuchter:")
TextGadget(#TXT_Neuer,5,32,55,15,"Neuer:")
TextGadget(#TXT_Werte,5,57,55,15,"Werte:")
StringGadget(#STR_Gesuchter,60,5,150,20,"",#PB_String_Numeric)
StringGadget(#STR_Neuer,60,30,150,20,"",#PB_String_Numeric)
ListViewGadget(#LST_Werte,60,55,150,80)
ButtonGadget(#BTN_Hinzufuegen,5,140,100,23,"Hinzufügen")
ButtonGadget(#BTN_Vergleichen,110,140,100,23,"Vergleichen",#WS_DISABLED)
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget
Select EventGadget()
Case #BTN_Hinzufuegen
Wert$ = GetGadgetText(#STR_Neuer)
If Wert$ = ""
MessageRequester("Hinweis","Bitte geben sein einen Wert ein der hinzugefügt werden soll.",48)
Else
ItemsNUM = CountGadgetItems(#LST_Werte)-1 : Found = 0
For i=0 To ItemsNUM
Result$ = GetGadgetItemText(#LST_Werte,i,0)
If Val(Result$) = Val(Wert$)
MessageRequester("Hinweis","Der eingegebene Wert ist bereits in der List vorhanden.",48)
Found = #True : Break
EndIf
Next
If Found = 0
AddGadgetItem(#LST_Werte,-1,Wert$)
SetGadgetText(#STR_Neuer,"")
DisableGadget(#BTN_Vergleichen,0)
EndIf
EndIf
Case #BTN_Vergleichen
State = GetGadgetState(#LST_Werte)
If GetGadgetText(#STR_Gesuchter) = ""
MessageRequester("Hinweis","Bitte geben Sie den gewünschten Suchwert ein.",48)
ElseIf State = -1
MessageRequester("Hinweis","Bitte wählen Sie einen vorhandenen Vergleichswert aus der Liste.",48)
Else
Gesucht = Val(GetGadgetText(#STR_Gesuchter))
Vorhanden = Val(GetGadgetItemText(#LST_Werte,State,0))
If Gesucht = Vorhanden
MessageRequester("Glückwunsch","Sie haben Gewonnen",64)
Else
MessageRequester("Glückwunsch","Leider eine Niete.",64)
EndIf
EndIf
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
Verfasst: 20.10.2006 00:22
von Peloka
Gesuchter$ <>Gesucht$
Variabelnamen beachten.
so gehts bei PB3.94
Code: Alles auswählen
If OpenWindow(0,100,100,500,400,#PB_Window_SystemMenu,"Fenster 1")
If CreateGadgetList(WindowID(0))
TextGadget(1,20,20,120,20,"Gesuchter")
StringGadget(2,140,20,100,20,"")
TextGadget(3,20,50,100,20,"Neuer")
StringGadget(4,140,50,100,20,"")
ButtonGadget(5,260,50,100,20,"Hinzufügen")
ListViewGadget(6,140,90,100,80)
ButtonGadget(7,200,200,80,20,"Vergleichen")
EndIf
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
If EventID = #PB_Event_Gadget
If EventGadgetID()=5
a$=GetGadgetText(4)
If a$ = ""
MessageRequester("Fehler","Ich vermisse die Eingabe",0)
Else
AddGadgetItem(6,-1,""+a$)
SetGadgetText(4,"")
ActivateGadget(4)
EndIf
EndIf
EndIf
If EventID = #PB_Event_Gadget
If EventGadgetID()=7
Gesucht$ = GetGadgetText(2)
Anz = CountGadgetItems(6)
For i = 0 To Anz - 1
SetGadgetState(6, i)
Vorhandene$ = GetGadgetText(6)
If Mid(Gesucht$,1,Len(Gesucht$)) = Mid(Vorhandene$,1,Len(Vorhandene$))
control = control + 1
Else
control = control + 0
EndIf
Next i
If control = 0
MessageRequester("","Leider nichts",0)
Else
MessageRequester("","Gewonnen",0)
EndIf
SetGadgetText(2,"")
SetGadgetText(4,"")
ClearGadgetItemList(6)
EndIf
EndIf
Until Quit=1
CloseWindow(0)
EndIf
Einige Befehle müssen umgestellt werden ,-Fehlermeldungen und Hilfe verwenden.
Verfasst: 20.10.2006 00:36
von Kaeru Gaman
ist etwas sinnlos. da genügt dann einfach Gesucht$.
ich hatte den eindruck, sebsch wollte die ersten 10 zeichen vergleichen:
das geht aber nur dann richtig, wenn die strings alle länger als 10 sind,
bei kürzeren kommt kein 10 zeichen langer string bei raus.
wenn allerdings die strings sowieso genau übereinstimmen sollen, dann genügt:
Verfasst: 20.10.2006 10:59
von Peloka
Ich hätte auch eine elegantere Lösung gehabt.
Wenn es nur um Zahlen geht, hätte ich andere Zeichen geblockt und die Zahlen direkt verglichen.
Aber Richtig ist unbedingt, dass man keinen String vergleichen kann der nicht so lang ist wie getestet.
Der eigentliche Fehler war aber der Variabelname "Gesuchter$"
Verfasst: 20.10.2006 18:57
von sebsch80
@Kaeru Gaman
Hab das füllen der Strings in die If Abfrage rein geschrieben, hat aber nichts gebracht. Immer noch falsches Ergebniss bei der Abfrage.
Bist Du Dir sicher das man bei Strings nicht bei 0 anfangen kann.
Ich hab ein Programm in dem ich es so mache und das funktioniert.
Habs aber auch mit 1 probiert und es bringt nichts.
Das mit dem Left ist natürlich klasse, danke das kannte ich noch nicht.
@Fluid Byte
Das Prog ist schon in Ordnung so aber ich muß immer 1 Wert in der Liste auswählen und das ist genau das was ich nicht machen wollte.
Er soll die Ganze Liste an hinzugefügten Zahlenreihen vergleichen.
@Peloka
Hab die Änderungen vorgenommen und sieh da, es funktioniert. Danke
@Kaeru Gaman
Ich wollte eine Zahlenfolge von 11 Zahlen und davor 1 Buchstaben abfragen. (zB. "G12345678901")
Und sie müssen genau übereinstimmen.
@Peloka
Wieso war der Fehler die Variable "Gesuchter$"?
Verfasst: 20.10.2006 19:03
von Kaeru Gaman
> Bist Du Dir sicher das man bei Strings nicht bei 0 anfangen kann.
ja. mag sein, dass es funktioniert, aber dann zählst du falsch.
wie du weiter unten schreibst willst du ja 11 zeichen, dann musst du auch 11 angeben.
> Ich wollte eine Zahlenfolge von 11 Zahlen und davor 1 Buchstaben abfragen. (zB. "G12345678901")
> Und sie müssen genau übereinstimmen.
wenn deine strings immer genau 11 zeichen lang sind, brauchst du sie nicht zu beschneiden.
wenn sie immer genau übereinstimmen sollen, soll ja auch kein #True erzeugt werden, wenn einer der string noch irgendwelchen müll dranhängen hat.
> Wieso war der Fehler die Variable "Gesuchter$"?
weil du einmal "Gesuchter$" und einmal "Gesucht$" geschrieben hattest.
> Hab das füllen der Strings in die If Abfrage rein geschrieben, hat aber nichts gebracht. Immer noch falsches Ergebniss bei der Abfrage.
das lag an der namensverwechsulg.
trotzdem sollte das füllen mit im if drinstehn, weil du dass nicht machen musst,
wenn du nicht unmittelbar danach prüfen willst.
so wie du es zuerst hattest, werden die strings auch unnötiger weise gefüllt, wenn man das fenster verschiebt.
Verfasst: 20.10.2006 19:03
von Kiffi
> Wieso war der Fehler die Variable "Gesuchter$"?
schau Dir Deinen Ausgangscode mal ein wenig genauer an:
Code: Alles auswählen
Gesuchter$ = GetGadgetText(2)
[...]
If Mid(Gesucht$,0,10) = Mid(Vorhandene$,0,10)
Du weist Gesuchter$ einen Wert zu, vergleichst dann aber Gesucht$. Das
kann nicht funktionieren.
Wenn Du in die erste Zeile Deines Code EnableExplicit schreibst, wird das
in Zukunft nicht mehr passieren. Da musst Du nämlich jede Variable, die
Du benutzt, vorher deklarieren. Daraus ergibt sich, dass solche Fehler von
vornherein vermieden werden.
Grüße ... Kiffi
Verfasst: 21.10.2006 00:59
von Peloka
Danke Kiffi
Genau das meinte ich.
Kopiert man den Variabelname kann es auch nich Passieren.
Einige Editoren bieten auch die Möglichkeit alle Variabeln stets anzeigen zu lassen.
Und notfalls einen Zettel und Stift verwenden, ich machs auch was bei dutzenden von Variabeln und Sprungmarken sinnvoll ist.
Variabelname, Typ, [Startwert,] Zweck bzw Erklärung