TStringList und if Strukturen



  • Also in meinem Programm verwende ich TStringList Variablen um Text in Textdateien zu speichern, doch wenn ich am Programmstart automatisch lade, kann ich auf TStringList keine if Strukturen und Vergleichsoperatoren wie == benutzen. Borland gibt zwar keine Fehlermeldung doch berücksichtigt er keineswegs meine Anweisung, so ist es mir nicht möglich die Seriennummer, die eingegen wurde zu überprüfen. Gibt es da eine Lösung??? 😞



  • Hallo

    zeig doch mal, wie deine Vergleiche und Zugriffe auf die TStringList aussehen.

    bis bald
    akari



  • Gut also in ein Programm gibt man den Freischaltcode ein, der wird dann in "Freischaltcode.KJT" gespeichert und das andere Programm greift darauf zu. Das Rätselprogramm sieht so aus:

    ------------------------------------------------------------------------------
    |  Dieses Rätselprogramm stellt ihnen auf Knopfdruck ein Rätsel, welches sie |
    |  durch eine Eingabe in das Eingabefeld lösen können, bei jeder falschen Ant|
    |  wort wird ein Versuch hinzuaddiert, bei jeder richtigen Antwort wird ein  |
    |  Punkt hinzuaddiert. Schon gelöste Rätsel können nicht nocheinmal gelöst   |
    |  werden. Diese werden als gelöst gekennzeichnet.                           |
    |                                                                            |
    |  Den Quellcode habe ich komplett selbst geschrieben und somit ist er       |
    |  geistiges Eigentum von Kevin Jakob.										
    
      Copyright by: Kevin Jakob						Version: 1.1    									
    ------------------------------------------------------------------------------*/
    #include <vcl\vcl.h>
    #pragma hdrstop
    
    #include "Basis.h"
    //---------------------------------------------------------------------------
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int Raetselnummer,Versuche,Versuchegesamt,Punkte,Start=1,Messagebox1,Messagebox2;
    String Antwort;
    TStringList *Raetsel1,*Freischaltcode, *Raetsel2,*Leer,*Weiter,*Geloest,*SicherRaetsel1,*SicherRaetsel2;
    const String DRaetsel1="Rätsel1.KJT";
    const String DRaetsel2="Rätsel2.KJT";
    const String Freischaltung="Freischaltcode.KJT";
    const int Raetselanzahl=2;
    bool Klick=false,Raetselloesung=false;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    Leer=new TStringList;
    Leer->Add(" ");
    SicherRaetsel1=new TStringList;
    SicherRaetsel2=new TStringList;
    Weiter=new TStringList;
    Weiter->Add("Für das nächste Rätsel drücken sie auf Weiter oder auf beenden. ");
    Geloest=new TStringList;
    Geloest->Add("Dieses Rätsel ist bereits gelöst !");
    Raetsel1=new TStringList;
    Raetsel2=new TStringList;
    Freischaltcode=new TStringList;
    randomize();
    try
    {
    	Raetsel1->LoadFromFile(DRaetsel1);
    }
    catch(...)
    {
    	Application->MessageBox("Fehler beim Laden der Datei: Rätsel1.KJT, stellen sie sicher, dass diese Datei vorhanden ist!","Fehler",0+16);
    	Raetsel1->Add("Fehler beim Laden dieses Rätsels!");
    }
    try
    {
    	Raetsel2->LoadFromFile(DRaetsel2);
    }
    catch(...)
    {
     	Application->MessageBox("Fehler beim Laden der Datei: Rätsel2.KJT, stellen sie sicher, dass diese Datei vorhanden ist!","Fehler",0+16);
    	Raetsel2->Add("Fehler beim Laden dieses Rätsels!");
    }
    try
    {
    //Hier will ich die if Abfrage, doch das geht nicht.
    	Freischaltcode->LoadFromFile(Freischaltung);
    }
    catch(...)
    {
    	Application->MessageBox("Sie können das Programm nicht benutzen, da kein Freischaltcode vorhanden ist. Drücken sie auf beenden und geben sie im Freischaltprogramm einen gültigen Freischaltcode ein.","Achtung!",0+16);
    }
    SicherRaetsel1=Raetsel1;
    SicherRaetsel2=Raetsel2;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    Application->MessageBox("Copyright by: Kevin Jakob, Version: 1.1","Info",0);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    int Sicher;
    Sicher=Application->MessageBox("Sind sie sicher?","Beenden",4+32);
    if(Sicher==IDYES)Close();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    if(Start==1)
    {
    	Klick=true;
    	Raetselnummer=random(2);
    	if(Raetselnummer==0)
    	{
    		RichEdit1->Lines=Raetsel1;
        	Label2->Caption="Lösen sie dieses Rätsel !";
    	}
    	if(Raetselnummer==1)
    	{
    		RichEdit1->Lines=Raetsel2;
       	 	Label2->Caption="Lösen sie dieses Rätsel !";
    	}
    }
    if(Start==2)
    {
        Messagebox1=Application->MessageBox("Wollen sie neu starten?","Neustart",4+32);
        if(Messagebox1==IDYES)
        {
        	Application->MessageBox("Alle Werte wurden zurück gesetzt!","Hinweis",0+48);
            Raetselloesung=false;
            Raetsel1=SicherRaetsel1;
            Raetsel2=SicherRaetsel2;
            Label2->Caption="Hier wird ihnen das Rätsel gestellt.";
            Edit1->Text="";
            RichEdit1->Lines=Leer;
            Versuche=0;
            Label6->Caption=IntToStr(Versuche);
            Versuchegesamt=0;
            Label8->Caption=IntToStr(Versuchegesamt);
            Punkte=0;
            Label4->Caption=IntToStr(Punkte);
            Start=1;
       	}
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    Start=2;
    if(Klick==false)
    	Application->MessageBox("Sie müssen zuerst auf Start klicken !","Starten",0+48);
    if(Klick==true && Raetselloesung==false)
    {
    	Antwort=Edit1->Text;
    	if(Raetselnummer==0)
        {
        	if(Antwort=="Luft" || Antwort=="luft" || Antwort=="die Luft" || Antwort=="die luft")
            {
            	Versuchegesamt=Versuchegesamt+1;
                Label8->Caption=IntToStr(Versuchegesamt);
            	Versuche=Versuche+1;
                Label6->Caption=IntToStr(Versuche);
                Punkte=Punkte+1;
                Label4->Caption=IntToStr(Punkte);
                Label2->Caption="Diese Antwort ist richtig !";
                RichEdit1->Lines=Weiter;
                Raetsel1=Geloest;
                Edit1->Text="";
                Raetselloesung=true;
            }
            if(Antwort!="Luft" && Antwort!="luft" && Antwort!="die Luft" && Antwort!="die luft")
            {
            	Label2->Caption="Diese Antwort ist falsch !";
                Versuchegesamt=Versuchegesamt+1;
                Label8->Caption=IntToStr(Versuchegesamt);
                Versuche=Versuche+1;
                Label6->Caption=IntToStr(Versuche);
            }
        }
        if(Raetselnummer==1)
        {
        	if(Antwort=="Ziel" || Antwort=="ziel" || Antwort=="das Ziel" || Antwort=="das ziel")
            {
            	Versuche=Versuche+1;
                Versuchegesamt=Versuchegesamt+1;
                Label6->Caption=IntToStr(Versuche);
                Label8->Caption=IntToStr(Versuchegesamt);
                Punkte=Punkte+1;
                Label4->Caption=IntToStr(Punkte);
            	Label2->Caption="Diese Antwort ist richtig !";
                RichEdit1->Lines=Weiter;
                Raetsel2=Geloest;
                Edit1->Text="";
                Raetselloesung=true;
            }
            if(Antwort!="Ziel" && Antwort!="ziel" && Antwort!="das Ziel" && Antwort!="das ziel")        {
            	Label2->Caption="Diese Antwort ist falsch !";
            	Versuche=Versuche+1;
                Versuchegesamt=Versuchegesamt+1;
                Label8->Caption=IntToStr(Versuchegesamt);
                Label6->Caption=IntToStr(Versuche);
            }
        }
    }
    if(Punkte==Raetselanzahl)
    {
    	Messagebox2=Application->MessageBox("Sie haben alle Rätsel richtig gelöst. Drücken sie OK für einen Neustart und Abrechen für beenden.","Neustart",4+16);
        if(Messagebox2==IDYES)
        {
        	Start=2;
        	Button5Click(Sender);
        }
        if(Messagebox2!=IDYES)
        	Button2Click(Sender);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    if(Klick==false)
    	Application->MessageBox("Sie müssen zuerst auf Start klicken !","Starten",0+48);
    if(Klick==true)
    {
        Versuche=0;
        Label6->Caption=IntToStr(Versuche);
        Raetselloesung=false;
    	Raetselnummer=random(2);
        if(Raetselnummer==0)
    	{
    		RichEdit1->Lines=Raetsel1;
        	Label2->Caption="Lösen sie dieses Rätsel !";
    	}
    	if(Raetselnummer==1)
    	{
    		RichEdit1->Lines=Raetsel2;
       	 	Label2->Caption="Lösen sie dieses Rätsel !";
    	}
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Label1Click(TObject *Sender)
    {
    Application->MessageBox("Geben sie in das Eingebefeld neben diesem Text ihre Antwort ein!","Hinweis",0);	
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Label2Click(TObject *Sender)
    {
    Application->MessageBox("In dem Eingabefeld unter diesem Text wird ihnen das Rätsel gestellt !","Hinweis",0);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Label3Click(TObject *Sender)
    {
    Application->MessageBox("Hier wird ihnen die Punktzahl angezeigt.","Hinweis",0);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Label5Click(TObject *Sender)
    {
    Application->MessageBox("Hier wird ihnen die Versuchszahl angezeigt, die sie für das aktuelle Rätsel bisher gebraucht haben.","Hinweis",0);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Label7Click(TObject *Sender)
    {
    Application->MessageBox("Hier wird ihnen die Gesamtversuchszahl, des derzeitigen Spiels angezeigt.","Hinweis",0);
    }
    //---------------------------------------------------------------------------
    

    Dort wo Hier will ich die If Abfrage, dort wollte ich sie machen, doch der Builder reagiert nicht. Bitte helft mir. Ich bin noch Anfänger also nicht über die Form aufregen, falls sie irgendwie schlecht ist.



  • Hallo

    und wie sehen deine Daten in Freischaltcode.kjt aus? Was genau soll mit der if-Bedingung in den Daten geprüft werden?
    Allgemein gilt :

    AnsiString Buffer;
    int Lines;
    TStringList *List;
    Buffer = List->Text; // gesamter Text der StringList
    Lines = List->Count; // Anzahl der Zeilen des Textes
    Buffer = List->Strings[0]; // Zugriff auf erste Zeile, Zeilen gehen von 0 bis Count -1
    Buffer = List->Values["ValueName"]; 
    // Zugriff auf den Wert mit der Bezeichnung ValueName, wenn in der 
    // Datei so ein Eintrag vorhanden ist :
    // <Zeilenende>ValueName=Value<Zeilenende>
    

    bis bald
    akari



  • Also in den KJT Dateien steht der Freischaltcode. Das Rätselprogramm soll, nachdem es registriert hat, dass Freischaltcode.KJT vorhanden ist, überprüfen ob TStringList Freischaltcode nach der Übergabe aus der Textdatei == dem Code iost oder nicht. Soll ich da lieber eine Direktüberprüfung wie

    if(Freischaltcode=="DVNDEFK")
    

    machen oder lieber mit einer anderen Variable überprüfen lassen wie hier:

    if(Freischaltcode==Ueberpruefer)
    

    ???
    Der Freischaltcode ist nur ein Beispiel.



  • Hallo

    da du schon einige const String hast, nimm noch mal einen. Wenn dann in der Datei nur der Code steht, reicht dann das :

    const String Code = "LegalCopy";
    ...
    if (Freischaltcode->Text == Code)
    {
      // Dateiinhalt ist korrekt
      }
    else
    {
      // Dateiinhalt ist nicht korrekt
      }
    

    bis bald
    akari



  • Also das funzt immer noch nicht. Wenn ich schreibe

    Freischaltcode->Text==RealCode;
    

    und der Code stimmt in der KJT Datei und in der const string überein. Macht er trotzdem nicht. Er sagt immer erwäre ungültig, obwohl er richtig ist, ich verstehe das nicht.



  • Hallo

    dann stehen in der Datei noch zusätzliche Zeichen drin (z.B. Zeilenumbruch).
    Nimm als Überprüfung mal :

    if (Freischaltcode->Text.AnsiPos(Code) > 0)
    

    dann wird geschaut, ob Code überhaupt in der Datei ist.

    bis bald
    akari



  • Ne keine zusätzlichen Zeichen sind drin aber ich probiers mit deiner Methode ich werde schon eine Methode finden doch ich bin für weitere Vorschläge offen.



  • Gut ich hab es jetzt ausprobiert und es funktioniert!!! Nur wollte ich Fragen was bei diesem Stück Quellcode:

    AnsiString Buffer;
    int Lines;
    TStringList *List;
    Buffer = List->Text; // gesamter Text der StringList
    Lines = List->Count; // Anzahl der Zeilen des Textes
    Buffer = List->Strings[0]; // Zugriff auf erste Zeile, Zeilen gehen von 0 bis Count -1
    Buffer = List->Values["ValueName"]; 
    // Zugriff auf den Wert mit der Bezeichnung ValueName, wenn in der 
    // Datei so ein Eintrag vorhanden ist :
    // <Zeilenende>ValueName=Value<Zeilenende>
    

    die Lines Variable für einen Sinn hat. Eigentlich gar keinen oder?



  • Hallo

    In den Zeilen, die du gepostet hats, brauchst du es wirklich nicht. Kommentier es doch einmal aus, dann wirst du schon sehen, ob du es endgültig rausnehmen kannst.

    bis bald
    akari


Anmelden zum Antworten