Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Suchen, vergleichen (https://www.delphipraxis.net/149259-suchen-vergleichen.html)

jonsen2.0.0.9 17. Mär 2010 17:39


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:
string[x]
eine Zahl ist.

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

Jens Hartmann 17. Mär 2010 17:43

Re: Suchen, vergleichen
 
Schau mal hier...

Delphi-Quellcode:
if Pos('Ich Suche', 'Suchstring') > 0 then
  ...
//Pos(Suchstring, Stringvar.)
auf die Frage mit dem Integer. Du musst mit Pos prüfen, aber...
Delphi-Quellcode:
  tryStrToInt
wäre da schon ratsam...


Gruß Jens

dominikkv 17. Mär 2010 17:58

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]]));

jonsen2.0.0.9 17. Mär 2010 18:39

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

Jens Hartmann 17. Mär 2010 18:54

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:
var
  iPos : integer;
begin
...
  while Pos('Suchetext', Text) > 0 do
    begin
      iPos := Pos('Suchtext', Text);
      ShowMessage(IntToStr(iPos));
    end;
Gruß Jens

dominikkv 17. Mär 2010 19:03

Re: Suchen, vergleichen
 
Zitat:

Zitat von Jens Hartmann
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:
var
  iPos : integer;
begin
...
  while Pos('Suchetext', Text) > 0 do
    begin
      iPos := Pos('Suchtext', Text);
      ShowMessage(IntToStr(iPos));
    end;
Gruß Jens

Da hast du dir aber eine feine Endlosschleife gebastelt :feuerchen:


Zitat:

Zitat von jonsen2.0.0.9
ber wie finde ich heraus an welcher position (was x ist) der anfangsbuchstabe oder der endbuchstabe von dem gesuchten ist?

Pos() liefert dir diese Position! (Bitte in der Hilfe nachlesen)
Zitat:

Zitat von jonsen2.0.0.9
und was ist wenn es das was ich suche mehr als einmal gibt?

Da musst du dir, wie Jens schon sagte, eine Schleife bauen. Schau dir mal PosEx an, dort kannst du noch einen Offset angeben.

Jens Hartmann 17. Mär 2010 19:12

Re: Suchen, vergleichen
 
Sorry, ja da hast Du recht, da fehlte ja auch was...

Delphi-Quellcode:
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;
Gruß Jens

jonsen2.0.0.9 17. Mär 2010 19:24

Re: Suchen, vergleichen
 
bisher sieht das so aus :

(is erstmal für die-staemme.de)

Delphi-Quellcode:
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;
gibt mir aber was falsches zurück...
und immer etwas anderes -.-

MFG
Jonsen

Jens Hartmann 17. Mär 2010 21:16

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

jonsen2.0.0.9 18. Mär 2010 05:08

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 :(

Butch87 18. Mär 2010 08:55

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).

DeddyH 18. Mär 2010 09:16

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;

Sir Rufo 18. Mär 2010 09:30

Re: Suchen, vergleichen
 
Ich würde den Gebäudenamen aber suchen lassen bis zum ersten Erscheinen von " ("
Das erscheint mir eindeutiger

DeddyH 18. Mär 2010 09:43

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 ;)

p80286 18. Mär 2010 16:23

Re: Suchen, vergleichen
 
Lägen die Daten in dieser Form vor:
Code:
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
Dann wär das alles kein Problem.

Gruß
K-H

Jens Hartmann 18. Mär 2010 16:59

Re: Suchen, vergleichen
 
Zitat:

Zitat von p80286
Lägen die Daten in dieser Form vor:

Liegen sie aber ja scheinbar nicht. Deshalb denke ich, das Sir Rufo da schon den richtigen Ansatz gegeben hat. Es sieht aufjedenfall so aus, als wär die "(" immer vor der Stufe, also sollte es in etwa so gehen...

Delphi-Quellcode:
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;
Gruß Jens

jonsen2.0.0.9 19. Mär 2010 17:52

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 :)

Jens Hartmann 19. Mär 2010 19:11

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

jonsen2.0.0.9 19. Mär 2010 19:38

Re: Suchen, vergleichen
 
@ jens...das

Delphi-Quellcode:
Memo2.Text:=Memo1.Text[ipos]+temp;
gehört wenn dann außerhalb der if bedingung also nach das end...dies soll immer! ausgefürht werden :)


die andere lösung find ich auch richtig gut danke

jonsen2.0.0.9 19. Mär 2010 19:55

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

Jens Hartmann 19. Mär 2010 21:02

Re: Suchen, vergleichen
 
Mach mal aus dem

Delphi-Quellcode:
  Memo1.Free;
//ein
  Memo1.Clear;
Gruß Jens

jonsen2.0.0.9 19. Mär 2010 21:46

Re: Suchen, vergleichen
 
upps...funktioniert trotzdem nicht :(

jonsen2.0.0.9 19. Mär 2010 21:55

Re: Suchen, vergleichen
 
Liste der Anhänge anzeigen (Anzahl: 1)
so hier noch mal die neuste version... :)

funktioniert immer noch nicht ganz :(

DeddyH 20. Mär 2010 16:38

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:
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;
[edit] Das Clear in den try-finally-Block verschoben [/edit]

jonsen2.0.0.9 20. Mär 2010 17:36

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

DeddyH 20. Mär 2010 17:46

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:
C:
cd \Test
programm.exe
Das ist der Fall, von dem Du ausgehst. Es geht aber auch so:
Code:
C:
cd \
Test\Programm.exe
Oder so:
Code:
D:
C:\Test\Programm.exe
Von daher würde ich an Deiner Stelle GetCurrentDir() weitestgehend aus meinem Wortschatz streichen. Und Delphi-Referenz durchsuchenTStrings.EndUpdate ist eine Methode von TStrings und korrespondiert mit Delphi-Referenz durchsuchenTStrings.BeginUpdate. In die Zwischenablage bekommst Du den Text im schlimmsten Fall, indem Du die Unit ClipBrd einbindest und ClipBoard.AsText den Text des Memos zuweist. Ob das Memo da schon etwas Fertiges mitbringt, weiß ich gerade nicht.

jonsen2.0.0.9 20. Mär 2010 17:51

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