Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Alternative zu PosEx und Insert (https://www.delphipraxis.net/55768-alternative-zu-posex-und-insert.html)

kingflo 26. Okt 2005 16:49


Alternative zu PosEx und Insert
 
Hallo...

Ich habe in delphi7 einen code geschreiben, der PosEx und Insert benutzt, jetzt muss ich dass auf D6 machen, und da funzt PosEx und Insert nicht.

hat da jemand ne idee?


So sah der Codeteil mit D7 aus:

Delphi-Quellcode:
  _p2 := PosEx('"', _S, _p1+1);

  if (_p2 = 0) then begin
    // Nicht gefunden
    Exit;
  end;

  Delete(_s, _p1, _p2-_p1);
  Insert( Edit1.Text, _s, _p1);

  memo1.Text := _s;

SirThornberry 26. Okt 2005 16:50

Re: Alternative zu PosEx und Insert
 
du könntest dir die funktionen PosEx und Insert doch einfach aus deinem Delphi7 rüberkopieren.

kingflo 26. Okt 2005 17:00

Re: Alternative zu PosEx und Insert
 
ich habe D7 leider nicht hier :-(
Ausserdem weiß ich auch net genau welche Units das sind

Wenn jemand D7 hat könnte er die Units eventuell posten?

Kann ich dann eigentlich einfach die alten Units aus D6 ersetzen? denn D7 müsste doch alles können was D6 auch kann oder?

SirThornberry 26. Okt 2005 17:03

Re: Alternative zu PosEx und Insert
 
mit posten von kompletten units sieht es schlecht aus, selbst das posten einzelner Funktionen fällt schon unter das Urheberreicht. Hast du schon versucht die Funktionen selbst zu schreiben?

marabu 26. Okt 2005 17:03

Re: Alternative zu PosEx und Insert
 
Insert() dürfte kein Problem unter D6 sein - hier kommt PosEx():

Delphi-Quellcode:
function PosEx(const SubStr, S: string; Offset: integer): integer;
begin
  Result := Pos(SubStr, Copy(S, OffSet, Succ(Length(S) - OffSet)));
  if Result > 0 then Result := Result + Pred(Offset);
end;
marabu

SirThornberry 26. Okt 2005 17:11

Re: Alternative zu PosEx und Insert
 
insert vermute ich auch das es das unter Delphi6 gibt, wenn nicht:
Delphi-Quellcode:
procedure Insert(SubStr: String; var Dest: String; Index: Integer);
begin
  Dest := copy(Dest, 1, Index - 1) + SubStr + copy(Dest, Index, Length(Dest));
end;
@marabu: Die PosEx funktion sieht genau so unperformant aus wie meine Insert-Procedure

kingflo 26. Okt 2005 17:11

Re: Alternative zu PosEx und Insert
 
Danke für PosEx aber das Insert Problem hab ich noch

der code war folgendermaßen

Insert('Text to Insert', _s, _p1);

und in D7 ging alles und jetzt habe ich die Fehlermeldung, das ein operator oder Simikolon fehlt, das kann aber nicht sein (und tuts auch net) unter D7 lief es genau so.

SirThornberry 26. Okt 2005 17:17

Re: Alternative zu PosEx und Insert
 
hier noch mal die Insertfunktion mit mehr performance, PosEx werd ich mir auch nochmal anschauen
Delphi-Quellcode:
procedure Insert(SubStr: String; var Dest: String; Index: Integer);
var LOldLen, LNewLen, LSubLen: Integer;
begin
  LSubLen := Length(SubStr);
  LOldLen := Length(Dest);
  LNewLen := LSubLen + LOldLen;
  SetLength(Dest, LNewLen);
  move(Dest[Index], Dest[Index + LSubLen], LSubLen);
  move(SubStr[1], Dest[Index], LSubLen);
end;
[Edit]
und hier jetzt noch PosEx
Delphi-Quellcode:
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
var LSubStrlen, LCount1, LCount2: Integer;
begin
  if Offset = 1 then
    result := Pos(SubStr, S)
  else begin
    LSubStrLen := Length(SubStr);
    if LSubStrLen > 0 then
    begin
      for LCount1 := Offset to Length(S) - LSubStrLen + 1 do
      begin
        LCount2 := 0;
        while (LCount2 < LSubStrLen) and (SubStr[LCount2 + 1] = S[LCount2 + LCount1]) do
          inc(LCount2);
        if (LCount2 = LSubStrLen) then
        begin
          result := LCount1;
          Exit;
        end;
      end;
    end;
    result := -1;
  end;
end;
ist fast genau so schnell wie die originale posex von Delphi7. Vorteil dieser Funktion ist, das sie nicht mit einer AV abbricht wenn man einen leeren Substring übergibt (bei der originalen von D7 ist dies leider der Fall).

himitsu 16. Mär 2006 15:49

Re: Alternative zu PosEx und Insert
 
ähhhm Code-Library -> Object-Pascal / Delphi-Language -> (Teil)String in anderem String suchen/zählen


PS: ich hoffe mal marbaru hat nichts dagegen, dat ich mir mal seine PosEx-Version gemopst hab :roll:
> http://www.delphipraxis.net/internal...hlight=#517629


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