![]() |
Suchen, vergleichen
Hi,
ich schriebe jetzt mal ein Programm, bzw. ich versuche es, mit dem man in einem Spiel etwas formatieren kann. Naja...ich hab folgendes Problem: Die zu formatierende Liste ist allerdings unterschiedlich, deshalb muss ich nach bestimmten begriffen suchen. Meine erste Frage: Wie durchsuche ich einen String nach bestimmten Begriffen? So dann hab ich noch eine Frage: Ich habe einen String. Ich möchte gerne wissen ob an der Stelle x in diesem String ein "Integer" also eine Zahl (sind ja alles chars) steht. Ein String ist ja bekanntlich eigentlich nur ein array der aus chars besteht. ich möchte nun wissen (ohne try strtoint) ob das zeichen
Delphi-Quellcode:
eine Zahl ist.
string[x]
gibt es da eine möglichkeit mit z.B. if? (an dieser Stelle weiss ich, dass man dies mit try strtoint lösen könnte) aber ich suche eine andere möglichkeit. Hoffe ihr könnt mir helfen :) MFG Jonsen |
Re: Suchen, vergleichen
Schau mal hier...
Delphi-Quellcode:
auf die Frage mit dem Integer. Du musst mit Pos prüfen, aber...
if Pos('Ich Suche', 'Suchstring') > 0 then
... //Pos(Suchstring, Stringvar.)
Delphi-Quellcode:
wäre da schon ratsam...
tryStrToInt
Gruß Jens |
Re: Suchen, vergleichen
Überprüfen, ob ein Char eine Zahl darstellt, würde ich so:
Delphi-Quellcode:
if MyString[I] in ['0'..'9'] then
showmessage(Format('Das Zeichen "%s" ist eine Zahl!', [MyString[I]])); |
Re: Suchen, vergleichen
vielen dank :)
aber wie finde ich heraus an welcher position (was x ist) der anfangsbuchstabe oder der endbuchstabe von dem gesuchten ist? und was ist wenn es das was ich suche mehr als einmal gibt? MFG Jonsen |
Re: Suchen, vergleichen
Wie wäre es z.B. mit einer Schleife. Aber vieleicht solltest Du mal deinen Code zeigen, damit man das eventuell besser beurteilen kann. Mit einer Schleife könntest Du das z.B. in etwa so gestalten...
Delphi-Quellcode:
Gruß Jens
var
iPos : integer; begin ... while Pos('Suchetext', Text) > 0 do begin iPos := Pos('Suchtext', Text); ShowMessage(IntToStr(iPos)); end; |
Re: Suchen, vergleichen
Zitat:
Zitat:
Zitat:
|
Re: Suchen, vergleichen
Sorry, ja da hast Du recht, da fehlte ja auch was...
Delphi-Quellcode:
Gruß Jens
var
iPos : integer; Text : String; begin ... Text := MyString; while Pos('Suchetext', Text) > 0 do begin iPos := Pos('Suchtext', Text); ShowMessage(IntToStr(iPos)); Delete(Text,1,iPos+1); end; |
Re: Suchen, vergleichen
bisher sieht das so aus :
(is erstmal für die-staemme.de)
Delphi-Quellcode:
gibt mir aber was falsches zurück...
procedure TForm1.Button1Click(Sender: TObject);
Var ipos:integer; form:string; temp:string; begin temp:=''; form:=''; ipos:=pos('Hauptgebäude (Stufe',memo1.Text); ipos:=ipos+21; if memo1.Text[ipos+1] in ['0'..'9'] then temp:=memo1.Text[ipos+1]; memo2.Text:=memo1.Text[ipos]+temp; end; und immer etwas anderes -.- MFG Jonsen |
Re: Suchen, vergleichen
Wenn Du noch nicht viel hast, dann häng doch mal kurz dein Projekt an. Dann kann man eventuelle sehen wo das Problem liegt. Was steh den z.B. im Memo etc.
Gruß Jens |
Re: Suchen, vergleichen
Liste der Anhänge anzeigen (Anzahl: 1)
im grunde ist das was ich oben gepostet hab alles, da es ja noch nicht so funktioniert :(
sobald dieses stück geht, ist der rest einfach... so im memo1 steht: Hauptgebäude (Stufe 15) 2883 3060 2242 8 1:51:10 Rohstoffe verfügbar heute um 14:28 Uhr Kaserne (Stufe 5) 635 584 286 2 0:35:54 Rohstoffe verfügbar heute um 07:48 Uhr Stall (Stufe 3) 540 503 520 2 1:23:07 Rohstoffe verfügbar heute um 07:31 Uhr Werkstatt (Stufe 1) 378 307 328 1 0:57:43 Rohstoffe verfügbar heute um 07:02 Uhr Erste Kirche (Stufe 1) Gebäude vollständig ausgebaut Schmiede (Stufe 11) 2796 2605 3050 16 5:57:24 Rohstoffe verfügbar heute um 14:27 Uhr Versammlungsplatz (Stufe 1) Gebäude vollständig ausgebaut Statue (Stufe 1) Gebäude vollständig ausgebaut Marktplatz (Stufe 10) 1009 1135 1009 14 2:14:01 Rohstoffe verfügbar heute um 08:54 Uhr Holzfäller (Stufe 17) 2220 3731 1659 8 2:40:05 Rohstoffe verfügbar heute um 16:07 Uhr Lehmgrube (Stufe 16) 2977 2150 1250 10 2:13:24 Rohstoffe verfügbar heute um 14:45 Uhr Eisenmine (Stufe 16) 2734 3170 2187 18 2:40:05 Rohstoffe verfügbar heute um 14:10 Uhr Bauernhof (Stufe 10) 620 642 383 0:59:34 Rohstoffe verfügbar heute um 07:45 Uhr Speicher (Stufe 10) 1007 880 555 1:12:55 Rohstoffe verfügbar heute um 08:54 Uhr Versteck (Stufe 3) 98 117 98 0:24:56 Rohstoffe verfügbar heute um 06:12 Uhr Wall (Stufe 7) 252 548 101 2 1:43:25 Rohstoffe verfügbar heute um 06:39 Uhr eine liste der gebäude und deren stufe...dies möchte ich formatieren :) erst suche ich das gebäude dann kommme ich durch die position auf die Stufe und trage dies dann in memo2 mit einem Link zu dem entsprechenden bild ein... :) wenn ich aber nach Hauptgebäude suche und dann immer die gleichen stellen auslese...steht bei mir immer etwas anders :( |
Re: Suchen, vergleichen
Ja, is doch klar. Die Gebäudenamen sind auch unterschiedlich lang. Wenn du jetzt immer, sagen wir mal, die 30igste Stelle ausliest bekommst du immer, je nach Gebaudenamenlänge, einen anderen Char zurück.
Am besten suchst du nach dem ersten Leerzeichen im String. Das ist nämlich immer hinter dem Gebäudenamen. Nun kannst die Xte Stelle (deine Stufe) raus suchen. Nimm dazu den String nach dem ersten Leerzeichen. Der String ist ja nach dem Gebäudenamen überall gleich (bis zur Stufe zumindest, und die willst du ja heben). |
Re: Suchen, vergleichen
Mit einer ListView (vsReport mit 2 Spalten) könnte man das z.B. so darstellen:
Delphi-Quellcode:
var sl: TStringlist;
i, StufePos, BracketPos: integer; Item: TListItem; begin sl := TStringlist.Create; try sl.LoadFromFile(<Dateiname>); for i := 0 to sl.Count - 1 do begin Item := ListView.Items.Add; //Alles bis zum ersten Leerzeichen kopieren Item.Caption := Copy(sl[i],1,Pos(' ',sl[i]) - 1); //Position des Wortes "Stufe" StufePos := Pos('Stufe',sl[i]); //Position der ersten schließenden Klammer BracketPos := Pos(')',sl[i]); //alles zwischen den ermittelten Positionen kopieren Item.SubItems.Add(Copy(sl[i],StufePos + 6, BracketPos - StufePos - 6)); end; finally sl.Free; end; end; |
Re: Suchen, vergleichen
Ich würde den Gebäudenamen aber suchen lassen bis zum ersten Erscheinen von " ("
Das erscheint mir eindeutiger |
Re: Suchen, vergleichen
Klar, kann man auch machen, falls ein Gebäudename ein Leerzeichen enthalten darf. Aber darum ging es mir auch nicht, ein bisschen soll der TE ja selbst erledigen ;)
|
Re: Suchen, vergleichen
Lägen die Daten in dieser Form vor:
Code:
Dann wär das alles kein Problem.
Hauptgebäude (Stufe 15) 2883 3060 2242 8 1:51:10 Rohstoffe verfügbar heute um 14:28 Uhr
Kaserne (Stufe 5) 635 584 286 2 0:35:54 Rohstoffe verfügbar heute um 07:48 Uhr Stall (Stufe 3) 540 503 520 2 1:23:07 Rohstoffe verfügbar heute um 07:31 Uhr Werkstatt (Stufe 1) 378 307 328 1 0:57:43 Rohstoffe verfügbar heute um 07:02 Uhr Erste Kirche (Stufe 1) Gebäude vollständig ausgebaut Schmiede (Stufe 11) 2796 2605 3050 16 5:57:24 Rohstoffe verfügbar heute um 14:27 Uhr Versammlungsplatz (Stufe 1) Gebäude vollständig ausgebaut Statue (Stufe 1) Gebäude vollständig ausgebaut Marktplatz (Stufe 10) 1009 1135 1009 14 2:14:01 Rohstoffe verfügbar heute um 08:54 Uhr Holzfäller (Stufe 17) 2220 3731 1659 8 2:40:05 Rohstoffe verfügbar heute um 16:07 Uhr Lehmgrube (Stufe 16) 2977 2150 1250 10 2:13:24 Rohstoffe verfügbar heute um 14:45 Uhr Eisenmine (Stufe 16) 2734 3170 2187 18 2:40:05 Rohstoffe verfügbar heute um 14:10 Uhr Bauernhof (Stufe 10) 620 642 383 0:59:34 Rohstoffe verfügbar heute um 07:45 Uhr Speicher (Stufe 10) 1007 880 555 1:12:55 Rohstoffe verfügbar heute um 08:54 Uhr Versteck (Stufe 3) 98 117 98 0:24:56 Rohstoffe verfügbar heute um 06:12 Uhr Wall (Stufe 7) 252 548 101 2 1:43:25 Rohstoffe verfügbar heute um 06:39 Uhr Gruß K-H |
Re: Suchen, vergleichen
Zitat:
Delphi-Quellcode:
Gruß Jens
procedure TForm1.Button1Click(Sender: TObject);
var ipos:integer; form:string; temp:string; begin temp:=''; form:=''; ipos:=pos('(',Memo1.Text); if Memo1.Text[ipos+1] in ['0'..'9'] then begin temp:=Memo1.Text[ipos+1]; Memo2.Text:=Memo1.Text[ipos]+temp;//Obwohl ich diesen Sinn noch nicht ganz versteh. end; end; |
Re: Suchen, vergleichen
er meint bei mir immer :
[Fehler] Unit1.pas(30): Undefinierter Bezeichner: 'TListItem' kann mir wer da helfen ? DANKE übringens für die Lösungsvorschläge :) |
Re: Suchen, vergleichen
Dann fehlt die Unit, hast Du den wie Deddy geschrieben hat überhaupt eine TListView in dein Projekt eingefügt. Das ist eine Komponenten, die DeddyH als anzeige vorgeschlagen hat.
Gruß Jens |
Re: Suchen, vergleichen
@ jens...das
Delphi-Quellcode:
gehört wenn dann außerhalb der if bedingung also nach das end...dies soll immer! ausgefürht werden :)
Memo2.Text:=Memo1.Text[ipos]+temp;
die andere lösung find ich auch richtig gut danke |
Re: Suchen, vergleichen
Liste der Anhänge anzeigen (Anzahl: 1)
so leute...hab ma das programm für meine zwecke ein bischen umgeschrieben...jetzt geht das aber nicht mehr richtig -.-
das problem: wenn ich auf wandeln drücke...wird hinter dem namen nicht nur die stufe, sondern auch noch eine klammer und ein paar zahlen (welche rohstoffe man für das ausbauen braucht) angezeigt....dies soll nicht so sein...hoffe ihr findet den fehler den ich übersehe :) MFG Jonsen |
Re: Suchen, vergleichen
Mach mal aus dem
Delphi-Quellcode:
Gruß Jens
Memo1.Free;
//ein Memo1.Clear; |
Re: Suchen, vergleichen
upps...funktioniert trotzdem nicht :(
|
Re: Suchen, vergleichen
Liste der Anhänge anzeigen (Anzahl: 1)
so hier noch mal die neuste version... :)
funktioniert immer noch nicht ganz :( |
Re: Suchen, vergleichen
Du solltest Dir die Parameter von Copy() einmal ganz genau anschauen. Der letzte gibt keine Position, sondern die Länge des zu kopierenden Teilstrings an. Außerdem ist GetCurrentDir() keine gute Idee, oder weißt Du, in welchem Verzeichnis Du Dich gerade befindest? Ich habe das ganze mal etwas abgeändert.
Delphi-Quellcode:
[edit] Das Clear in den try-finally-Block verschoben [/edit]
procedure TForm1.Button1Click(Sender: TObject);
Var i:integer; bracketpos1,bracketpos2:integer; sl: TStringlist; Line: string; begin Memo1.Lines.BeginUpdate; try memo1.clear; sl := TStringlist.Create; try sl.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'werte.txt'); for i := 0 to sl.Count - 1 do begin Line := ''; bracketpos1 := Pos('(',sl[i]); if bracketpos1 > 2 then begin Line := Trim(Copy(sl[i],1,bracketpos1 - 1)) + #32; BracketPos2 := Pos(')',sl[i]); Line := Line + Copy(sl[i],bracketPos1 + 1,BracketPos2 - BracketPos1 - 1); memo1.Lines.Add(Line); end; end; finally sl.free; end; finally Memo1.Lines.EndUpdate; end; end; |
Re: Suchen, vergleichen
danke für die tipps :)
habe aber ein paar fragen dazu: 1) wieso ist getcurrentdir keine gute idee? 2) Memo1.Lines.EndUpdate wofür brauche ich das? und noch eine die ganz neu ist: wenn ich strg+c drücke kann ich ja etwas kopieren...kann man den inhalt von z.B. Memo1 in diesen speicher bringen ohne das der anwender alles makieren und strg+c drücken muss? MFG Jonsen |
Re: Suchen, vergleichen
GetCurrentDir gibt Dir das aktuelle Verzeichnis an. Angenommen, Dein Programm liegt unter C:\Test. Dann könnte man es z.B. von der Kommandozeile so aufrufen:
Code:
Das ist der Fall, von dem Du ausgehst. Es geht aber auch so:
C:
cd \Test programm.exe
Code:
Oder so:
C:
cd \ Test\Programm.exe
Code:
Von daher würde ich an Deiner Stelle GetCurrentDir() weitestgehend aus meinem Wortschatz streichen. Und
D:
C:\Test\Programm.exe ![]() ![]() |
Re: Suchen, vergleichen
das mit dem clipboard funtkionier DANKE...
das mit dem update lese ich mir gerade durch :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz