![]() |
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) ? |
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.
|
Re: Pos funktion
Versuche es mal mit:
Delphi-Quellcode:
function AnsiReplaceStr(const AText, AFromText, AToText: string): string;
Zitat:
Für AToText nimmst du einfach einen leeren String. MfG GM [Edit]Tja,keine VCL.....Wer lesen kann ist klar im Vorteil :wall: [/Edit] |
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: |
Re: Pos funktion
kk, hat sich erledigt, das funktioniert:
Delphi-Quellcode:
byebye
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; |
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; |
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