Vergleich von 2 Werten klappt nicht !!!

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
sebsch80
Beiträge: 53
Registriert: 28.09.2006 20:28
Wohnort: Suhl
Kontaktdaten:

Vergleich von 2 Werten klappt nicht !!!

Beitrag 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?
PureBasic 4.00 / Anfänger
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Peloka
Beiträge: 34
Registriert: 16.01.2005 11:28

Beitrag 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.
Ein Bit ist die kleinste Software-einheit, ein falsches Bit macht aus Software Bugware...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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$
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Peloka
Beiträge: 34
Registriert: 16.01.2005 11:28

Beitrag 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$"
Ein Bit ist die kleinste Software-einheit, ein falsches Bit macht aus Software Bugware...
Benutzeravatar
sebsch80
Beiträge: 53
Registriert: 28.09.2006 20:28
Wohnort: Suhl
Kontaktdaten:

Beitrag 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$"?
PureBasic 4.00 / Anfänger
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Zuletzt geändert von Kaeru Gaman am 20.10.2006 19:04, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Peloka
Beiträge: 34
Registriert: 16.01.2005 11:28

Beitrag 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
Ein Bit ist die kleinste Software-einheit, ein falsches Bit macht aus Software Bugware...
Antworten