Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Suchen der Textteile (https://www.delphipraxis.net/109727-suchen-der-textteile.html)

djpaull 6. Mär 2008 14:58


Suchen der Textteile
 
Hallo allerseits.

Irgendwie komm ich nicht weiter. Mein Programm soll unteranderem folgendes können:
Ein Editfeld enthält immer eine Internet-Adresse. Falls die Adresse ein Bild ist, also z.B. "http://www.bla.de/bilder/bild123.jpg", soll das Programm im zweiten Editfeld nur die Bildnummer ausspucken (hier "123") - also ohne "http://www.bla.de/bilder/bild" und ohne ".jpg".

Hab dazu eine Funktion geschrieben.

Delphi-Quellcode:
function tform1.suchebild;
var Text, Suchtext, Bildnr: string;
    Suchindex: integer;
begin
  Text:= edtadresse.Text;
  Suchtext := '.jpg';
  Suchindex := Pos(Suchtext, Text);
  edt2.Text:=copy(text, Suchindex - 3, Suchindex - 0); // hier wird dir Bildnummer ausgegeben
  edt1.Text:=copy(text, 1, suchindex - 4);
end;
Problem dabei ist, in der Zeile mit "edt2", dass er mir "123.jpg" ausgibt. Ich will aber das ".jpg" weghaben.

Und noch was. Kann man vielleicht den Text nur nach Ziffern oder z.B. nach "/" dursuchen lassen?
Über ein Tutorial zum Thema Suche würd ich mich auch freuen.

[edit=SirThornberry]Titel angepasst - Mfg, SirThornberry[/edit]

Fussball-Robby 6. Mär 2008 16:25

Re: Problem beim Suchen der Textteile
 
erstmal muss eine Funktion einen Ergebniswert haben, wenn dus aber so lassen willst, nimm eine prozedur.
Delphi-Quellcode:
Procedure SucheBild;
Var Text, Suchtext       : String;
    Suchindex, Bildlaenge : Integer;
begin
  Text:= edtadresse.Text;
  Suchtext := '.jpg';
  Suchindex := Pos(Suchtext, Text);
  Bildlaenge := Length(Text)-Suchindex;
  edt2.Text:=Copy(Text, Suchindex - 3, Bildlaenge); //Der Dritte Parameter ist hier NICHT, BIS ZU WELCHEM, sondern WIE VIELE Zeichen er kopieren soll!
  edt1.Text:=Copy(Text, 1, Suchindex - 4);
end;
Mfg

Muetze1 6. Mär 2008 16:40

Re: Problem beim Suchen der Textteile
 
Wie wäre es mit [oh]ChangeFileExt(deinString, '');[/oh] um die Dateiendung zu entfernen? Und Wie wäre es mit Delphi-Referenz durchsuchenExtractFileName() zuvor, damit du nur noch den Dateinamen hast und nicht mehr die URI Angabe?

s-off 6. Mär 2008 16:46

Re: Problem beim Suchen der Textteile
 
Zitat:

Zitat von djpaull
Über ein Tutorial zum Thema Suche würd ich mich auch freuen.

Dann mach Dich mal zum Thema 'Reguläre Ausdrücke' bzw. 'Regular Expressions' bzw. 'RegEx' schlau.

Mazel 6. Mär 2008 16:48

Re: Problem beim Suchen der Textteile
 
Auch mal von mir ein Ansatz:

Delphi-Quellcode:
function TForm1.SuchBildNummer(Addr: String): String;
var
 i: Byte;
 j: Byte;

begin
  Addr := Copy(Addr, 1, Pos('.jpg', Addr) - 1);
  for i := Length(Addr) downto 1 do
    begin
      if (Ord(Addr[i]) < 48) or (Ord(Addr[i]) > 57) then Break;
    end;
  Result := Copy(Addr, i + 1, Length(Addr) - i);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Edt2.Text := SuchBildNummer(Edt1.Text); // Edt1.Text enthält die Adresse
end;

Fussball-Robby 6. Mär 2008 16:53

Re: Problem beim Suchen der Textteile
 
Zitat:

Zitat von Muetze1
Und Wie wäre es mit Delphi-Referenz durchsuchenExtractFileName() zuvor, damit du nur noch den Dateinamen hast und nicht mehr die URI Angabe?

Kann es sein, dass ExtractFileName nur bei Pfadangaben mit "\" und nicht mit "/" geht? Also bei mir liefert er bei
Delphi-Quellcode:
ExtractFileName('http://www.bla.de/bilder/bild123.jpg')
"//www.bla.de/bilder/bild123.jpg" zurück

Mfg

Muetze1 6. Mär 2008 17:17

Re: Problem beim Suchen der Textteile
 
Da du noch Delphi 5 hast: Ja. Bei dir schon.

djpaull 6. Mär 2008 19:23

Re: Problem beim Suchen der Textteile
 
Danke euch. Werde mich schlau machen und n bischen mit dem code rumspielen. Ich schreib dann wie es war. :)

Also, ich hab mich dem Code von Mazel bedient. Es funzt auch soweit. Noch ne Kleinigkeit - kann man auch so machen, dass wenn er ".jpg" findet, soll er das und das machen. Irgendwie so:

if "Suchtext" found then ...

DP-Maintenance 6. Mär 2008 19:24

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.

djpaull 10. Mär 2008 14:10

Re: Suchen der Textteile
 
Hi. Also ich hab das gleiche Problem wie Fussball-Robby. Hab im Web das gefunden. ExtractFileWasAuchImmer scheint nur mit "\" zu funktionieren. Also nur für lokale Adressen, wie die im Explorer bzw. Arbeitsplatz. Gilt also nicht für Internet-Pfade.

[Edit 1]
Vielleicht könnte man örgentwie im AdressenFeld nach "/" suchen, diese in "\" umwandeln, Suchfunktion laufen lassen und anschließend die "\" zurück umwandeln in die "/", damit die Adresse korrekt angezeigt wird. Mal sehen, vielleicht krieg ich das so hin.
[/Edit 1]

Fussball-Robby 10. Mär 2008 14:43

Re: Suchen der Textteile
 
So könnte man es natürlich lösen. Hier mal ein Denkanstoß, den Rest müsstest du aber auch selber hinbekommen.
Delphi-Quellcode:
function FileName(Name:String):String;
begin
  Name:=stringreplace(Name,'/','\',[rfreplaceall]);
  Name:=extractfilename(Name);
  Name:=ChangeFileExt(Name,'');
  Result:=Name;
end;
Oder in einer Zeile: :wink:
Delphi-Quellcode:
function FileName(Name:String):String;
begin
Result:=ChangeFileExt(extractfilename(stringreplace(Name,'/','\',[rfreplaceall])),'');
end;
Mfg

marabu 10. Mär 2008 14:57

Re: Suchen der Textteile
 
Hallo,

wenn nur der Dateiname existiert, dann sind mir die Delimiter eigentlich egal:

Delphi-Quellcode:
// image filename = NAMEnnn.jpg

function ExtractImageNumber(const url: string): string;
var
  iPos: Integer;
  fn: TFileName;
begin
  fn := Copy(url, Succ(LastDelimiter('/', url)), MAXINT);
  if SameText(ExtractFileExt(fn), '.jpg') then
  begin
    fn := ChangeFileExt(fn, '');
    Result := Copy(fn, FirstDelimiter('1234567890', fn), MAXINT);
  end else Result := '';
end;
Freundliche Grüße

djpaull 10. Mär 2008 15:10

Re: Suchen der Textteile
 
Fehler: "FirstDelimiter" ist Undefinirter Bezeichner. Was tun?

[Edit 1]
In meiner DelphiHilfe (TurboDelphi win32) gibt es kein FirstDelimiter, nur LastDelimiter.

marabu 10. Mär 2008 15:28

Re: Suchen der Textteile
 
Hier eine einfache Version ohne MBCS Unterstützung:

Delphi-Quellcode:
function FirstDelimiter(const delimiters, s: string): Integer;
begin
  Result := 0;
  while Result < Length(s) do
  begin
    Inc(Result);
    if Pos(s[Result], delimiters) > 0 then
      Exit
  end;
  Result := 0;
end;

djpaull 10. Mär 2008 15:40

Re: Suchen der Textteile
 
Sorry, nix für Ungut aber ... Der letzte Part Ist etwas zu hoch für mich. Was macht diese Funktion? Bei deinem ersten Part kann ich alles nachvollziehen (das mit URL und .jpg). Wo ist der zusammenhang? :?

[Edit 1]
Ich schau mal hier nach.

[Edit 2]
Also, meine aktuelle Lösung ist folgende:

Delphi-Quellcode:
function tform1.ExtractURLPath(Name: string): String;
begin
  Name:=stringreplace(Name,'/','\',[rfreplaceall]);
  Name:=extractfilename(Name);
  Name:=ChangeFileExt(Name,'');
  Result:=Name;
end;

function tform1.FilePath(Name:String):String;
begin
  Name:=stringreplace(Name,'/','\',[rfreplaceall]);
  Name:=extractfilepath(Name);
  Name:=stringreplace(Name,'\','/',[rfreplaceall]);
  Result:=Name;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
  edt2.Text := ExtractURLPath(edtadresse.Text);
  edt1.Text := FilePath(edtadresse.Text)
end;
Primärziel erreicht. Nur so nebenbei. Kann man in einem Text NUR nach Zahlen oder NUR nach Buchstaben suchen?

Fussball-Robby 10. Mär 2008 15:43

Re: Suchen der Textteile
 
Zitat:

Zitat von djpaull
Sorry, nix für Ungut aber ... Der letzte Part Ist etwas zu hoch für mich. Was macht diese Funktion? Bei deinem ersten Part kann ich alles nachvollziehen (das mit URL und .jpg). Wo ist der zusammenhang? :?

Das ist eine vereinfachte Alternative zur Funktion FirstDelimiter, die dein Delphi ja nicht kennt.
Einfach mit ins Projekt aufnehmen, und der erste Code von marabu müsste funktionieren

DeddyH 10. Mär 2008 15:45

Re: Suchen der Textteile
 
Ich habe es mal für Dich kommentiert:
Delphi-Quellcode:
function FirstDelimiter(const delimiters, s: string): Integer;
begin
  //Ergebnis mit 0 vorbelegen --> kein Treffer
  Result := 0;
  //ggf. ganzen String s durchgehen
  while Result < Length(s) do
  begin
    //Result wird hochgezählt und dient als Laufvariable
    Inc(Result);
    //wenn das Zeichen an der aktuellen Position des Strings s
    //im String Delimiters vorkommt
    if Pos(s[Result], delimiters) > 0 then
      //Funktion verlassen, Result ist ja bereits belegt
      Exit
  end;
  //kein Treffer gefunden, Ergebnis wieder auf 0 setzen
  Result := 0;
end;

djpaull 10. Mär 2008 17:55

Re: Suchen der Textteile
 
Achso-o :thumb: . Jetzt habe ich verstanden. Danke. Nichts desto trotz, weiss vielleicht jemand, ob man in einem Text NUR nach Zahlen oder NUR nach Buchstaben suchen kann?

DeddyH 10. Mär 2008 18:12

Re: Suchen der Textteile
 
Wie meinst Du das jetzt?

djpaull 10. Mär 2008 18:26

Re: Suchen der Textteile
 
Naja. Angenommen mein Text besteht aus Zahlen und Buchstaben. Ist es möglich alle Zahlen in EditFeld1 und alle Buchstaben in EditFeld2 auszugeben ( - die Leerzeichen brauche ich in meinem Fall nicht). Oder den Text bis zu der letzten (gefundenen, beliebigen) Zahl auszugeben.

DeddyH 10. Mär 2008 18:33

Re: Suchen der Textteile
 
Wo ist das Problem?
Delphi-Quellcode:
EditZahlen.Text := '';
EditBst.Text := '';
for i := 1 to Length(DeinString) do
  if (DeinString[i] in ['a'..'z','A'..'Z']) then
    EditBst.Text := EditBst.Text + DeinString[i]
  else if (DeinString[i] in ['0'..'9']) then
    EditZahlen.Text := EditZahlen.Text + DeinString[i];
[edit] Oder mit case:
Delphi-Quellcode:
for i := 1 to Length(DeinString) do
  case DeinString[i] of
    'a'..'z',
    'A'..'Z' : EditBst.Text := EditBst.Text + DeinString[i];
    '0'..'9' : EditZahlen.Text := EditZahlen.Text + DeinString[i];
  end;

djpaull 10. Mär 2008 18:56

Re: Suchen der Textteile
 
Zitat:

Wo ist das Problem?
Habe in der Schule nicht aufgepasst :oops: Aber jetzt funzt alles wie es soll. Danke euch :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz