Bestimmte Textstellen
-
Wie geht das, dass aus einer datei (z.b. .txt) ne bestimmte zeile herausgesucht wird?
Ansonsten kann ich es nur mitif(Datei->Strings[0]=="ABC") { Do this and that }und das mit jeder Zeile wiederholt (kann ja hunderte von zeilen sein)
Das soll dann an LabelX gesendet werdenUnd noch eine frage: Das selbe nur das aus einer Zeile ein bestimmtes wort gesucht wird und an LabelX gesendet wird.
-
Ähh? Du hast doch schon die Lösung. Du schaust in jeder Zeile, ob ein bestimmter String vorkommt.
for(int x = 0; x <= Memo1->Lines->Count; x++) { if(Memo1->Lines->Srings[x] == "irgendwas") DoSomething(); else DoSomeOtherthing(); }Du kannst das ganze auch alternativ mit AnsiString.Pos untersuchen.
Ich versteh, glaube ich, Dein Problem nicht richtig...Gruss.
-
Naja es läuft auf die Frage hinaus:
Gibt es eine Methode die die ganze Datei nach einer bestimmten zeile /bestimmten wort sucht
-
Oops!
Naja ok das Problem ist ich beherrsche die for Schleife nicht ^^ obwohl ich sie mal durchgenommen hab
Wenn du mir noch sagen kannst wie sie funzt wäre ich dir sehr dankbar ^^CounterstrikePlayer schrieb:
Und noch eine frage: Das selbe nur das aus einer Zeile ein bestimmtes wort gesucht wird und an LabelX gesendet wird.
Falls mir das auch noch jemand beantworten kann is dieser threa durch ^^
-
CounterstrikePlayer schrieb:
Oops!
Naja ok das Problem ist ich beherrsche die for Schleife nicht ^^ obwohl ich sie mal durchgenommen hab

Die Schleife habe ich in meinem vorhergehenden Post geschildert. Die Hilfe kann Dir auch Dinge aufzeigen!
Weiterhin willst Du ein bestimmtes Wort suchen und an LabelX senden???
LabelX->Caption = myString;
mit AnsiString.Pos kannst Du die Position und/oder das Auftreten eines Strings in einem anderen auslesen.
Gruss
-
[cpp]void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int Zahl=0; Zahl<=Liste->Strings[Zahl]->Count; Zahl++);
{
if(Liste->Strings[Zahl]==Edit1->Text)
{
Label3->Caption=Edit1->Text;
}
else
{
Application->MessageBox("Your name is wrong", "error", 0);
}
}
}[/cpp]In der 1. fettgedruckten Zeile kommt die Fehlermeldung:
"Zeiger auf Struktur auf linker Seite von -> oder von ->* erforderlich*"
Aber was bedeutet das?In der 2. fettgedruckten Zeile kommt die Fehlermeldung:
"Undefiniertes Symbol 'Zahl'"

-
Liste->Strings[Zahl]->Count
Die Zeile würde ich prüfen
Liste->Strings->Count
-
Christian211 schrieb:
Liste->Strings[Zahl]->Count
Die Zeile würde ich prüfen
Liste->Strings->Count
Leider zeigt er imme rnoch den selben Fehler an
CounterstrikePlayer schrieb:
In der 1. fettgedruckten Zeile kommt die Fehlermeldung:
"Zeiger auf Struktur auf linker Seite von -> oder von ->* erforderlich*"
Aber was bedeutet das?Wenn der bei beiden Möglichkeiten den selben fehler zeigt und ich nicht weiß was das bedeutet (Hinweis: Noob)

-
Was ist Liste??
Ist es eine TSTringList
Liste->Count
-
Christian211 schrieb:
Was ist Liste??
Ist es eine TSTringList
Liste->Count
Yop is ne TStringList
Danke das geht jetzt (erstes problem gelöst)
Das zweite besteht aber weiterhin.
Mein COde ist jetzt so:for(int Zahl=0; Zahl<=Liste->Count; Zahl++); { if(Liste->Strings[Zahl]==Edit1->Text) { Label3->Caption=Edit1->Text; } else { Application->MessageBox("Your name is wrong", "error", 0); } }bei
if(Liste->Strings[Zahl]==Edit1->Text)zeiigt er mir imme rnoch an "Undefiniertes Symbol 'Zahl'"
Danke
-
Meistens hat der Compiler recht, es lohnt nicht, mit ihm darüber zu streiten. So ist wohl Zahl nicht definiert. Das hat bei dir etwas mit Gültigkeitsbereichen und Blöcken zu tun. Solltest die Regel "Variablen werden am Eingang der Funktion deklariert" beherzigen.
Fürs erste:
int Zahl; for(Zahl=0; Zahl<=Liste->Count; Zahl++); {
-
Das stimmt zwar, der eigentliche Fehler ist aber das ";" nach der for-Schleife. Damit ist die schon zuende bevor der eigentliche Block kommt. Und danach ist "Zahl" nicht mehr gültig. Also das Semikolon weglassen.
-
Christian211 schrieb:
Solltest die Regel "Variablen werden am Eingang der Funktion deklariert" beherzigen.
Aber eher nicht bei for-Schleifen. Die Zähl-Variable wird i.d.R. nur in der Schleife benötigt, es wäre deshalb Verschwendung, sie ausserhalb zu deklarieren.
Dass das öfter mal in Code-Beispielen auftaucht liegt vor allem daran, dass Microsofts VC++ bis mindestens Version 6 zu doof war, sich diesbezüglich an den Standard zu halten.
-
Aber eher nicht bei for-Schleifen. Die Zähl-Variable wird i.d.R. nur in der Schleife benötigt, es wäre deshalb Verschwendung, sie ausserhalb zu deklarieren.
Erlaube mir dazu eine andere Meinung zu haben. Variablen gehören nach "oben". Das trägt zur Lesbarkeit und Wartbarkeit des Codes ungemein bei, insbesondere, wenn mehrere daran arbeiten. Wenn 5 Leute jeweils an 5 Stellen Variablen deklarieren ist das auch Verschwendung. Wo sie auf dem Stack und wie lange liegen dürfte in der Praxis unerheblich sein.
-
for(int Zahl=0; Zahl<=Liste->Count; Zahl++) { if(Liste->Strings[Zahl]==Edit1->Text) { Label3->Caption=Edit1->Text; } else { Application->MessageBox("Your name is wrong", "error", 0); } }so hab ich es jetzt und es funktioniert. ich war so doof und hab ein ; dahinter gesetzt und es nicht bemerkt da hattet ihr recht ^^
jetzt gibts ein neues problem: der sucht sich zwar die zeile raus, aber sagt dafür 9 mal das es falsch ist.
Also in "Liste" (TStringList) stehen jetzt die zeilen:
Zeile1
Zeile2
Zeile3
Zeile4
Zeile5
Zeile6
Zeile7
Zeile8
Zeile9
Zeile10Wenn ich jetzt im Edit fenster z.b. "Zeile 3" eingebe, geht der alle Zeilen durch (soll er ja auch) aber dafür gibt er für Zeile1, Zeile2, Zeile4-10 falschmeldungen. Wee mache ich es das nur ne Fehlermeldung ausgegeben wird wenn in KEINER zeile das eingegebene steht?
Danke CSP
-
bool found=false; for(int Zahl=0; Zahl<=Liste->Count; Zahl++) { if(Liste->Strings[Zahl]==Edit1->Text) { Label3->Caption=Edit1->Text; found=true; //ggf. könnte hier ein break rein, wenn die anderen nach einem Fund nicht durchsucht werden sollen } } if(!found) { Application->MessageBox("Your name is wrong", "error", 0); }
-
Christian211 schrieb:
Erlaube mir dazu eine andere Meinung zu haben.
Dito.
Hier trifft im kleinen genau dasselbe zu wie für globale Variablen:
Wenn eine Variable nur in einer Funktion (oder Schleife) benötigt wird, dann sollte sie auch nur in der Funktion (oder Schleife) gültig sein, d.h. dort deklariert werden.Ich bezweifle ausserdem, dass sowas zu Beginn einer Funktion irgendwie der Les- und Wartbarkeit hilft:
int i, j, k, x, y, z; // Zähler für for-Schleifen // oder int i; // Zähler erste for-Schleife int j; // Zähler zweite for-Schleife int k; // Zähler dritte for-Schleife int x; // Zähler Spalten-Schleife int y; // Zähler Zeilen-Schleife int z; // Zähler Items-Schleife
-
Man könnte eine Variable wiederverwenden... Du übertreibst etwas

-
Christian211 schrieb:
bool found=false; for(int Zahl=0; Zahl<=Liste->Count; Zahl++) { if(Liste->Strings[Zahl]==Edit1->Text) { Label3->Caption=Edit1->Text; found=true; //ggf. könnte hier ein break rein, wenn die anderen nach einem Fund nicht durchsucht werden sollen } } if(!found) { Application->MessageBox("Your name is wrong", "error", 0); }das hat mich schon mal weiter gebracht danke
leider werden immernoch alle zeilen BIS ZUR richtigen Zeile mit einer MsgBox als "Falsch" benannt. Er soll aber nur sagen das nichts gefunden wurde (Your name is wrong) wenn es in der ganzen datei nichts gibt
das ist nervig vor allem wenn man mehrere hundert zeilen hat und das gefundene sagen wir in 246 ist
Ich glaube das wäre dann das letzte problem
:p
-
Das kann nicht sein. In der Schleife wir keine Messagebox mehr ausgegeben. Die wird DANACH ausgegeben. Schau nochmal hin!