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??? :freak:

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

Code: Alles auswählen

Mid(Gesucht$,1,Len(Gesucht$)) 
ist etwas sinnlos. da genügt dann einfach Gesucht$.

ich hatte den eindruck, sebsch wollte die ersten 10 zeichen vergleichen:

Code: Alles auswählen

Left(Gesucht$,10)
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:

Code: Alles auswählen

If Gesucht$ = Vorhandene$

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