Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pos funktion (https://www.delphipraxis.net/35788-pos-funktion.html)

Pseudemys Nelsoni 11. Dez 2004 21:07


Pos funktion
 
hi, ich schreibe gerade gerade eine pos funktion (falls ich die vcl mal nicht mitverwenden möchte)...

ich weiss das es wohl nich die beste möglichkeit ist, aber hauptsache es funktioniert...

Delphi-Quellcode:
function pos(sub, s: string; const cs: boolean = false): integer;
var
  tmp, sublen: string;
  idx: integer;
begin
  result := 0; idx := 0;
  if (sub <> '') and (s <> '') then
    while ((length(s) >= length(sub))) and (result = 0) do
    begin
      sublen := length(sub);
      setstring(tmp, pchar(s), sublen);
      inc(idx);
      if ((cs) and (lstrcmp(pchar(tmp), pchar(sub)) = 0)) or
         ((not cs) and (lstrcmpi(pchar(tmp), pchar(sub)) = 0)) then
      begin
        result := idx;
        exit;
      end;
      //hier "s[1]" löschen
    end;
end;

kann mir jemand sagen wie ich einen bestimmtem teil eines strings lösche (siehe kommentar) ?

Nikolas 11. Dez 2004 21:11

Re: Pos funktion
 
Du könntest den Buchstaben auf ' ' setzen und dann trim benutzen. Oder wenn du den Befehl nicht benutzen willst, könntest du dir ein dyn. array of Char nehmen und dann den zweiten Buchstaben über den ersten schreiben, so dass dann hinten ein Loch entsteht.

gmarts 11. Dez 2004 21:14

Re: Pos funktion
 
Versuche es mal mit:

Delphi-Quellcode:
function AnsiReplaceStr(const AText, AFromText, AToText: string): string;
Zitat:

Beschreibung

Mit AnsiReplaceStr können Sie den String AText analysieren und alle Fundstellen des Strings AFromText durch den String AToText ersetzen. Fundstellen von AFromText werden unter Berücksichtigung der Groß-/Kleinschreibung gesucht. Die Suche erfolgt nicht rekursiv: Wenn die Ersetzung durch AToText zu einer neuen Fundstelle von AFromText führt, wird diese Fundstelle nicht ersetzt.

Für AToText nimmst du einfach einen leeren String.

MfG GM

[Edit]Tja,keine VCL.....Wer lesen kann ist klar im Vorteil :wall: [/Edit]

Pseudemys Nelsoni 11. Dez 2004 21:19

Re: Pos funktion
 
@toxman, ich könnte den string selbst auch wie ein array verwenden, ich weiss nur nicht genau wie ich das machen soll, ich habe mir das so gedacht

jedes zeichen des strings um eine stelle nach links verschieben, und dann mit setlength...

aber wäre das nicht n bisschen sehr langsam?


@gmarts: keine VCL :wink:

Pseudemys Nelsoni 11. Dez 2004 21:38

Re: Pos funktion
 
kk, hat sich erledigt, das funktioniert:

Delphi-Quellcode:
function pos(sub, s: string; const cs: boolean = false): integer;
var
  tmp: string;
  idx: integer;
  i, sublen: integer;
begin
  result := 0; idx := 0;
  if (sub <> '') and (s <> '') then
  begin
    while ((length(s) >= length(sub))) and (result = 0) do
    begin
      sublen := length(sub);
      setstring(tmp, pchar(s), sublen);
      inc(idx);
      if ((cs) and (lstrcmp(pchar(tmp), pchar(sub)) = 0)) or
         ((not cs) and (lstrcmpi(pchar(tmp), pchar(sub)) = 0)) then
      begin
        result := idx;
        exit;
      end;
      if length(s) >= 2 then
      begin
        for i := 2 to length(s) do
          s[i-1] := s[i];
        setlength(s, length(s)-1);
      end
      else exit;
    end;
  end;
end;
byebye

Robert_G 11. Dez 2004 22:45

Re: Pos funktion
 
Vorweg: Ich bin überhaupt kein Pointerfachmann und bin mit dem "richtigen" Pos ganz zufrieden. :)

Ich frage mich nur, warum du ständig die Größe des Strings ändern willst? Das da dürfte doch auch reichen.
Delphi-Quellcode:
function Pos(const aSubString, aString: string;
             const aCaseSensitive    : Boolean = False): Integer;
var
   CurrentPosition       :Integer;
   pContent, pTempContent :PChar;
   pSearch , pTempSearch :PChar;
begin
   if aCaseSensitive then
   begin
      pContent := PChar(aString);
      pSearch := PChar(aSubString);
   end
   else
   begin
      pContent := PChar(AnsiUpperCase(aString));
      pSearch := PChar(AnsiUpperCase(aSubString));
   end;

   Result         := -1;
   CurrentPosition := 1; // EDIT: das "richtige" Pos liefert die Position basierend auf 1 ;)

   while pContent^ <> #0 do
   begin
      if pContent^ = pSearch^ then
      begin
         pTempContent := pContent;
         pTempSearch := pSearch;

         while (pTempSearch^ <> #0) and (pTempSearch^ = pTempContent^) do
         begin
            Inc(pTempContent);
            Inc(pTempSearch);
         end;

         // Suchstring wurde bis zum #0 durchlaufen -> Match
         if pTempSearch^ = #0 then
         begin
            Result := CurrentPosition;
            Break;
         end;
      end;

      Inc(CurrentPosition);
      Inc(pContent);
   end;
end;

Pseudemys Nelsoni 11. Dez 2004 22:55

Re: Pos funktion
 
danke rober, das muss ich mir mal reinziehen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 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