Autor Téma: funkce pos, ansipos  (Přečteno 764 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #30 kdy: 29-06-2019, 22:09:17 »
Fakt bych se chtěl do toho souboru StrUtils podívat. Ale žádný soubor s koncovkou *.pas s funkcí PosEx v adresáři Delphi 7 nemám.
No pokud mas nejakou starter edition nebo buhvi co, tak tam treba ty zdrojove kody nejsou.

Ale pokud mas zakoupenou nejakou edici pocinaje Professional, tak zatim soucasti kazde instalace byly zdrojove kody v podadresari source\.
Jestli uz D7 obsahoval strutils nebo ne si samozrejme nepamatuju. Ale pokud ne, tak funkce pos  bude urcite v system.pas

Jak jsem psal, mám D7, žádné profi, prostě jen to co lze zdarma stáhnout z netu. Celé to tady je že vy jste mi tvrdili že to na tom počítači musí být a já vám už psal aspoň dvakrát, že jsem to tam nenašel. Tak kdo neumí pracovat s argumentama a komunikovat já nebo vy? Jdo je tu teď za šaška já nebo vy? A teď tvrdíte, že ty zdrojáky vůbec mít nemusím. Takže příště mi věřte, když říkám, že jsem je nenašel. To že jsem source prohledal, jsem už psal taky.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4438
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:funkce pos, ansipos
« Odpověď #31 kdy: 29-06-2019, 22:22:33 »
A ako máme vedieť, že si taký lachvatý :o  a máš takú mizernú verziu >:(
Kód: Delphi [Vybrat]
  1. function Pos(const SubStr, Str: _ShortStr; Offset: Integer): Integer;
  2. {$IFDEF PUREPASCAL}
  3. var
  4.   I, LIterCnt, L, J: Integer;
  5.   PSubStr, PS: _PAnsiChr;
  6. begin
  7.   L := _PStrLen(SubStr);
  8.   { Calculate the number of possible iterations. Not valid if Offset < 1. }
  9.   LIterCnt := _PStrLen(Str) - Offset - L + 1;
  10.  
  11.  
  12.   { Only continue if the number of iterations is positive or zero (there is space to check) }
  13.   if (Offset > 0) and (LIterCnt >= 0) and (L > 0) then
  14.   begin
  15.     PSubStr := @SubStr[1];
  16.     PS := @Str[1];
  17.     Inc(PS, Offset - 1);
  18.  
  19.  
  20.     for I := 0 to LIterCnt do
  21.     begin
  22.       J := 0;
  23.       while (J >= 0) and (J < L) do
  24.       begin
  25.         if PS[I + J] = PSubStr[J] then
  26.           Inc(J)
  27.         else
  28.           J := -1;
  29.       end;
  30.       if J >= L then
  31.         Exit(I + Offset);
  32.     end;
  33.   end;
  34.  
  35.  
  36.   Result := 0;
  37. end;
  38.  
  39.  
  40. function Pos(const SubStr, Str: UnicodeString; Offset: Integer): Integer; overload;
  41. {$IFDEF PUREPASCAL}
  42. var
  43.   I, LIterCnt, L, J: Integer;
  44.   PSubStr, PS: PWideChar;
  45. begin
  46.   L := Length(SubStr);
  47.   { Calculate the number of possible iterations. Not valid if Offset < 1. }
  48.   LIterCnt := Length(Str) - Offset - L + 1;
  49.  
  50.  
  51.   { Only continue if the number of iterations is positive or zero (there is space to check) }
  52.   if (Offset > 0) and (LIterCnt >= 0) and (L > 0) then
  53.   begin
  54.     PSubStr := PWideChar(SubStr);
  55.     PS := PWideChar(Str);
  56.     Inc(PS, Offset - 1);
  57.  
  58.  
  59.     for I := 0 to LIterCnt do
  60.     begin
  61.       J := 0;
  62.       while (J >= 0) and (J < L) do
  63.       begin
  64.         if PS[I + J] = PSubStr[J] then
  65.           Inc(J)
  66.         else
  67.           J := -1;
  68.       end;
  69.       if J >= L then
  70.         Exit(I + Offset);
  71.     end;
  72.   end;
  73.  
  74.  
  75.   Result := 0;
  76. end;
  77.  
  78.  
  79. function Pos(const SubStr, Str: _WideStr; Offset: Integer): Integer; overload;
  80. {$IFDEF MSWINDOWS}
  81. {$IFDEF PUREPASCAL}
  82. var
  83.   I, LIterCnt, L, J: Integer;
  84.   PSubStr, PS: PWideChar;
  85. begin
  86.   L := Length(SubStr);
  87.   { Calculate the number of possible iterations. Not valid if Offset < 1. }
  88.   LIterCnt := Length(Str) - Offset - L + 1;
  89.  
  90.  
  91.   { Only continue if the number of iterations is positive or zero (there is space to check) }
  92.   if (Offset > 0) and (LIterCnt >= 0) and (L > 0) then
  93.   begin
  94.     PSubStr := PWideChar(SubStr);
  95.     PS := PWideChar(Str);
  96.     Inc(PS, Offset - 1);
  97.  
  98.  
  99.     for I := 0 to LIterCnt do
  100.     begin
  101.       J := 0;
  102.       while (J >= 0) and (J < L) do
  103.       begin
  104.         if PS[I + J] = PSubStr[J] then
  105.           Inc(J)
  106.         else
  107.           J := -1;
  108.       end;
  109.       if J >= L then
  110.         Exit(I + Offset);
  111.     end;
  112.   end;
  113.  
  114.  
  115.   Result := 0;
  116. end;
  117.  
  118.  
  119. function Pos(const SubStr, Str: _RawByteStr; Offset: Integer): Integer;
  120. {$IFDEF PUREPASCAL}
  121. var
  122.   I, LIterCnt, L, J: Integer;
  123.   PSubStr, PS: _PAnsiChr;
  124. begin
  125.   L := Length(SubStr);
  126.   { Calculate the number of possible iterations. Not valid if Offset < 1. }
  127.   LIterCnt := Length(Str) - Offset - L + 1;
  128.  
  129.  
  130.   { Only continue if the number of iterations is positive or zero (there is space to check) }
  131.   if (Offset > 0) and (LIterCnt >= 0) and (L > 0) then
  132.   begin
  133.     PSubStr := _PAnsiChr(SubStr);
  134.     PS := _PAnsiChr(Str);
  135.     Inc(PS, Offset - 1);
  136.  
  137.  
  138.     for I := 0 to LIterCnt do
  139.     begin
  140.       J := 0;
  141.       while (J >= 0) and (J < L) do
  142.       begin
  143.         if PS[I + J] = PSubStr[J] then
  144.           Inc(J)
  145.         else
  146.           J := -1;
  147.       end;
  148.       if J >= L then
  149.         Exit(I + Offset);
  150.     end;
  151.   end;
  152.  
  153.  
  154.   Result := 0;
  155. end;
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 43
    • Verze Delphi: 10.3
Re:funkce pos, ansipos
« Odpověď #32 kdy: 29-06-2019, 22:25:57 »
Už jsem nalezl řešení.

https://stackoverflow.com/questions/56816904/how-to-modify-ansistrpos-function-to-return-integer-offset-delphi-7

Kód: Delphi [Vybrat]
  1. function AnsiPosOffset(ASubStr, AStr: PChar; const AStartPos: Cardinal = 0): Integer;
  2. var
  3.   VPos: PChar;
  4. begin
  5.   Result := -1; // not found
  6.   if StrLen(AStr) <= AStartPos then begin
  7.     Exit;
  8.   end;
  9.   Inc(AStr, AStartPos);
  10.   VPos := AnsiStrPos(AStr, ASubStr);
  11.   if VPos <> nil then begin
  12.     Result := Int64(VPos) - Int64(AStr);
  13.     // add AStartPos to Result if you need offset from the string beginning
  14.   end;
  15. end;
  16.  

Vždyť ta funkce ale dělá něco jiného, než jsi na začátku tématu psal, že chceš :-)

Z původního dotazu jsem to chápal tak, že hledaný text má být hnedka na začátku, a že pokud tam není, tak nemá smysl ani prohlížet zbytek textu.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2594
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:funkce pos, ansipos
« Odpověď #33 kdy: 29-06-2019, 22:49:52 »
Tak kdo neumí pracovat s argumentama a komunikovat já nebo vy? Jdo je tu teď za šaška já nebo vy? A teď tvrdíte, že ty zdrojáky vůbec mít nemusím. Takže příště mi věřte, když říkám, že jsem je nenašel. To že jsem source prohledal, jsem už psal taky.
a) Jak mame vedet, ze mas nejen archaickou, ale jeste nejakou "detskou" verzi? To tady snad nikdo nema a pokud, tak zpravidla vi, ze je to jen nejake siditko na skolni vyuku programovani bez datasetu, zdrojovek apod., ale na praci to neni. A vi to vetsinou proto, ze se na webu podival, jake jsou rozdily mezi jednotlivymi edicemi. Tak si napis do profilu, ze nemas Delphi, ale nejake siditko...

b) Proc bychom ti na zaklade zkusenosti s tebou na tomto foru meli verit, kdyz trvale vykazujes nedostatky v elementarnich znalostech na urovni neznalosti male nasobilky nebo vyjmenovanych slov? To se budes muset dooost polepsit, abys svoji nejakou duveru obnovil ...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2594
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:funkce pos, ansipos
« Odpověď #34 kdy: 29-06-2019, 22:51:35 »
Vždyť ta funkce ale dělá něco jiného, než jsi na začátku tématu psal, že chceš :-)
Protoze na tom SO nic jineho nevylizal :-)

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:funkce pos, ansipos
« Odpověď #35 kdy: 30-06-2019, 08:32:05 »
OK, takže jsme konečně dostali kompletní informace. Doplním tedy jednu věc - ty přece ten zdroják příslušných funkcí k ničemu nepotřebuješ! Funkce jsou součástí knihovny Delphi, jistě je máš i ve své osekané verze, stačí dát unitu do uses a funkce používat. Mělo by to stačit vědět, jak se funkce jmenuje, to už ti Code Insight nabídne parametry, případně to najdeš zdokumentované v helpu. Ale abys neřekl:

Kód: Delphi [Vybrat]
  1. { AnsiStartsText & AnsiEndText return true if the leading or trailing part
  2.   of the given text matches, without case-sensitivity, the subtext }
  3.  
  4. function AnsiStartsText(const ASubText, AText: string): Boolean;
  5. function AnsiEndsText(const ASubText, AText: string): Boolean;
  6.  
  7. { These function are similar to some of the above but are case-sensitive }
  8.  
  9. function AnsiStartsStr(const ASubText, AText: string): Boolean;
  10. function AnsiEndsStr(const ASubText, AText: string): Boolean;