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

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
funkce pos, ansipos
« kdy: 21-06-2019, 08:55:33 »
Nemáte někdo algoritmus funkce pos, ansipo? Chtěl bych tu funkci upravit. Uvědomil jsem si, že klasická funkce pos je pro mě velmi neefektivní, protože hledám slovíčko, které začíná na začátku řádku a vně funkce mám podmínku, která porovnává jestli je výsledek roven 1.

Kód: Delphi [Vybrat]
  1. if ansipos(keys[0], fileIn[n])=1 then

Takže v případě že nenajde, ona prohledává celý řádek dál až téměř do konce. Což je hodně neefektivní. Co bych potřeboval napsat funkci, která by se zadávala stylem
position := ansipos(needle, sourceText, maxPos);

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:funkce pos, ansipos
« Odpověď #1 kdy: 21-06-2019, 09:14:27 »
Zdrojáky sú predsa súčasťou dodávky Delphi.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1437
  • Karma: 34
    • Pepak.net
Re:funkce pos, ansipos
« Odpověď #2 kdy: 21-06-2019, 09:38:18 »
(Ansi)StartsStr, (Ansi)StartsText.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #3 kdy: 21-06-2019, 10:27:55 »
Zdrojáky sú predsa súčasťou dodávky Delphi.

A kde mám hledat, v adresáři
delphi7\Source
jsem "function pos" nenašel, ani "ansipos"
dost pochybuju, že by to tam bylo.
« Poslední změna: 21-06-2019, 10:29:34 od vangog »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:funkce pos, ansipos
« Odpověď #4 kdy: 21-06-2019, 11:04:39 »
Poor
Rated 1 time
System.StrUtils. Sú tam obe.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1437
  • Karma: 34
    • Pepak.net
Re:funkce pos, ansipos
« Odpověď #5 kdy: 21-06-2019, 13:09:08 »
V Delphi 7 je to v SysUtils. Obvykle se na to použije buď Code Insight z editoru Delphi nebo hledání ve file manageru.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #6 kdy: 21-06-2019, 15:03:32 »
Nenašel jsem, ve kterém adresáři a souboru to je? Nevím jak to hledáte.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:funkce pos, ansipos
« Odpověď #7 kdy: 21-06-2019, 15:42:18 »
Poor
Rated 1 time
Ja som z toho človeka fascinovaný. Robí veci, ktoré by som ja nikdy nezvládol. Ale najzákladnejšie veci nevie :o :o :o  Ešte dve také otázky a budem z neho fas olovený. V Košiciach, neviem či aj inde, sa výraz fas používa vo význame: No tak ty si ale fas...

Napríklad tak, že sa hľadaný výraz zadá do helpu. Presnejšie neporadím, lebo si už D7 nepamätám. Ale určite máš na hornej lište niekde vpravo otáznik. Tým si vyvoláš help.
Ak nemá zadanú správnu jednotku, v tomto prípade SysUtils.pas, tak mu Code Insight nepomôže.
« Poslední změna: 21-06-2019, 15:44:12 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2600
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:funkce pos, ansipos
« Odpověď #8 kdy: 21-06-2019, 16:31:17 »
Ja som z toho človeka fascinovaný.
Bud v klidu, nejsi sam. Ale ja uz na nej neraguju, to je ztrata casu. Vetsina tech veci se da vygooglit rychleji, nez napsat prispevek do konference...

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #9 kdy: 21-06-2019, 21:08:53 »
Ja som z toho človeka fascinovaný. Robí veci, ktoré by som ja nikdy nezvládol. Ale najzákladnejšie veci nevie :o :o :o  Ešte dve také otázky a budem z neho fas olovený. V Košiciach, neviem či aj inde, sa výraz fas používa vo význame: No tak ty si ale fas...

Napríklad tak, že sa hľadaný výraz zadá do helpu. Presnejšie neporadím, lebo si už D7 nepamätám. Ale určite máš na hornej lište niekde vpravo otáznik. Tým si vyvoláš help.
Ak nemá zadanú správnu jednotku, v tomto prípade SysUtils.pas, tak mu Code Insight nepomôže.

No však jsem to hledal v helpu a nic. Jen konfigurace toho Insight Codu jako jak to má vypadat.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #10 kdy: 21-06-2019, 21:10:12 »
Ja som z toho človeka fascinovaný.
Bud v klidu, nejsi sam. Ale ja uz na nej neraguju, to je ztrata casu. Vetsina tech veci se da vygooglit rychleji, nez napsat prispevek do konference...

Však jsem googlil a google mi nic nenašel. Hledal jsem zdrojáky k funkci pos a prakticky nic. Nic co by se dalo použít.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #11 kdy: 21-06-2019, 21:16:55 »

Ak nemá zadanú správnu jednotku, v tomto prípade SysUtils.pas, tak mu Code Insight nepomôže.

Tak bohužel. Sice oceňuju, že si konečně napsal jméno souboru, ale Windows explorer mi ten soubor SysUtils.pas nenašel.

Na netu jsem našel nějaký modul, který tam má funkci ansipos
Kód: Delphi [Vybrat]
  1. https://github.com/Fr0sT-Brutal/Delphi_MiniRTL/blob/master/SysUtils.pas

To používá dvě funkce:
Kód: Delphi [Vybrat]
  1. function StrPosLen(const Str1, Str2: PWideChar; Len1, Len2: Integer): PWideChar;
  2. var
  3.   I: Integer;
  4. begin
  5.   Result := nil;
  6.   if Len1 = 0 then
  7.     Exit;
  8.   if Len2 = 0 then
  9.     Exit;
  10.   for I := 0 to Len1 - Len2 do
  11.   begin
  12.     if (Str1[I] <> #0) and (StrLComp(PWideChar(Integer(Str1) + I * SizeOf(WideChar)), Str2, Len2) = 0) then
  13.     begin
  14.       Result := PWideChar(Integer(Str1) + I * SizeOf(WideChar));
  15.       Exit;
  16.     end;
  17.   end;
  18. end;
  19.  

a

Kód: Delphi [Vybrat]
  1. function AnsiStrPos(Str, SubStr: PAnsiChar): PAnsiChar;
  2. var
  3.   L1, L2: Cardinal;
  4.   ByteType : TMbcsByteType;
  5. begin
  6.   Result := nil;
  7.   if (Str = nil) or (Str^ = #0) or (SubStr = nil) or (SubStr^ = #0) then Exit;
  8.   L1 := StrLen(Str);
  9.   L2 := StrLen(SubStr);
  10.   Result := StrPos(Str, SubStr);
  11.   while (Result <> nil) and ((L1 - Cardinal(Result - Str)) >= L2) do
  12.   begin
  13.     ByteType := StrByteType(Str, Integer(Result-Str));
  14. {$IFDEF MSWINDOWS}
  15.     if (ByteType <> mbTrailByte) and
  16.       (CompareStringA(LOCALE_USER_DEFAULT, 0, Result, L2, SubStr, L2) = CSTR_EQUAL) then Exit;
  17.     if (ByteType = mbLeadByte) then Inc(Result);
  18. {$ENDIF}
  19. {$IFDEF LINUX}
  20.     if (ByteType <> mbTrailByte) and
  21.       (strncmp(Result, SubStr, L2) = 0) then Exit;
  22. {$ENDIF}
  23.     Inc(Result);
  24.     Result := StrPos(Result, SubStr);
  25.   end;
  26.   Result := nil;
  27. end;
  28.  
« Poslední změna: 21-06-2019, 21:19:21 od vangog »

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #12 kdy: 21-06-2019, 21:23:42 »
Excellent
Rated 1 time
Ja som z toho človeka fascinovaný. Robí veci, ktoré by som ja nikdy nezvládol. Ale najzákladnejšie veci nevie :o :o :o  Ešte dve také otázky a budem z neho fas olovený. V Košiciach, neviem či aj inde, sa výraz fas používa vo význame: No tak ty si ale fas...

Každý člověk je zcela jedinečný; pokud mám mluvit za sebe, tak mám fúru geniálních nápadů, které ze mě dělají genia v některých věcech, ale jiným věcem zase nerozumím vůbec. Nestydím se za to, protože většina géniú se v životě setká s nepochopením. Jo a furt se učím, všichni se učíme, to je přece lidské.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #13 kdy: 29-06-2019, 15:30:06 »
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.  

Ve většina případů to funguje, ale v tomto to krachne:
Kód: Delphi [Vybrat]
  1. AnsiPosOffset( PChar('$'),
  2. PChar('N&#38;#8209;proper&#38;#8209;ms</tr></table><table><tr><td></RFT>'),
  3. length('N&#38;#8209;proper&#38;#8209;ms</tr></table><table><tr><td></RFT>')-7 )

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 786
  • Karma: 43
    • Verze Delphi: 10.3
Re:funkce pos, ansipos
« Odpověď #14 kdy: 29-06-2019, 16:32:51 »
Co tady znamená "krachne"?

Jinak v Delphi 7 bych místo přetypování na Int64 přetypoval spíš na Cardinal.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1437
  • Karma: 34
    • Pepak.net
Re:funkce pos, ansipos
« Odpověď #15 kdy: 29-06-2019, 16:39:37 »
A vážně nechceš použít ten AnsiStartsText? Jako nebudu ti to vnucovat, ale člověk s tvými znalostmi by se fakt neměl pokoušet používat funkce, které pracují s C-like řetězci (PChar) a konkrétním rozložením v paměti. I kdyby ti na to na Stack Overflow nabídli funkci.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #16 kdy: 29-06-2019, 17:34:05 »
Co tady znamená "krachne"?

Jinak v Delphi 7 bych místo přetypování na Int64 přetypoval spíš na Cardinal.

exception: EAccessViolation on address...

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #17 kdy: 29-06-2019, 17:36:30 »
A vážně nechceš použít ten AnsiStartsText? Jako nebudu ti to vnucovat, ale člověk s tvými znalostmi by se fakt neměl pokoušet používat funkce, které pracují s C-like řetězci (PChar) a konkrétním rozložením v paměti. I kdyby ti na to na Stack Overflow nabídli funkci.

Myslím, že jsem to už jsem psal, že jsem žádnou takovou funkci nenašel, ani nic z toho co mi lidi radili.

Já myslím, že je docela možné že tu chybu generuje tohle:
Kód: Delphi [Vybrat]
  1. Inc(AStr, AStartPos);
Pokud je AStartPos vyšší než je rozsah AStr, tak to vygeneruje chybu.

Ale je to jen domněnka. Přímo otestovat to neumím, protože při krokování mi to najede do funkce a pak se rekurzivně volá ta samá funkce, ale vidím už jen krokování kódu uvnitř FMM4

Zjednoším to:

Kód: Delphi [Vybrat]
  1. lastOffset := ansiPosOffset(
  2.     PChar('L'),
  3.     PChar('RL'),
  4.     1 );
  5.  
« Poslední změna: 29-06-2019, 17:46:16 od vangog »

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 786
  • Karma: 43
    • Verze Delphi: 10.3
Re:funkce pos, ansipos
« Odpověď #18 kdy: 29-06-2019, 17:41:28 »
Když předáváš jako parametr jen jeden znak, tak asi chybí koncový znak #0.
AnsiPosOffset( PAnsiChar(AnsiString('$')), ... mi funguje (v novějších Delphi, tak tam mám PAnsiChar a AnsiString).

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #19 kdy: 29-06-2019, 18:09:06 »
Aha tak tím to je. Zajimavá maličkost.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1437
  • Karma: 34
    • Pepak.net
Re:funkce pos, ansipos
« Odpověď #20 kdy: 29-06-2019, 18:12:19 »
A vážně nechceš použít ten AnsiStartsText? Jako nebudu ti to vnucovat, ale člověk s tvými znalostmi by se fakt neměl pokoušet používat funkce, které pracují s C-like řetězci (PChar) a konkrétním rozložením v paměti. I kdyby ti na to na Stack Overflow nabídli funkci.

Myslím, že jsem to už jsem psal, že jsem žádnou takovou funkci nenašel, ani nic z toho co mi lidi radili.

A podíval ses do StrUtils, jak ti poradil Stano? Třeba například na řádek 29?

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #21 kdy: 29-06-2019, 18:56:37 »
Hmm věděli jste, že existuje funkce PosEx v StrUtils? Ale teď vážně. 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.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #22 kdy: 29-06-2019, 18:57:28 »
A vážně nechceš použít ten AnsiStartsText? Jako nebudu ti to vnucovat, ale člověk s tvými znalostmi by se fakt neměl pokoušet používat funkce, které pracují s C-like řetězci (PChar) a konkrétním rozložením v paměti. I kdyby ti na to na Stack Overflow nabídli funkci.

Myslím, že jsem to už jsem psal, že jsem žádnou takovou funkci nenašel, ani nic z toho co mi lidi radili.

A podíval ses do StrUtils, jak ti poradil Stano? Třeba například na řádek 29?

Já jsem jim psal, že jsem StrUtils nenašel. Nikdo mi neporadil jak přesně postupovat abych ho našel. Stále na ten návod čekám. Třeba pomocí F8 se dovnitř té funkce nedostanu a soubor jsem nenašel.
« Poslední změna: 29-06-2019, 19:01:57 od vangog »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:funkce pos, ansipos
« Odpověď #23 kdy: 29-06-2019, 19:22:39 »
Odpověď #5 kdy: 21-06-2019, 13:09:08  Asi si slepý
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #24 kdy: 29-06-2019, 19:58:13 »
A já jsem odpověděl:

Nenašel jsem, ve kterém adresáři a souboru to je? Nevím jak to hledáte.

Řekl jsem že potřebuju podrobný návod, jinak mi je taková rada úplně k ničemu.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #25 kdy: 29-06-2019, 20:01:04 »
Co je Code Insight a kde to najdu jsem se taky nedozvěděl. Psal jsem že jsem našel jen nastavení Code Insight a to je tak vše. To jsou takové rady jakoby rádobymudrců ale užitečné to je asi tak jako když bych se někoho na ulici zeptal kolik je hodin a on mi odpověděl, "zajdi si do hodinářství!". EHm... A já na to: "A kde je nejbližší hodinářství?". "Najdi si to na mapě." nebo "Zeptej se někoho jiného"
« Poslední změna: 29-06-2019, 20:02:35 od vangog »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2600
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:funkce pos, ansipos
« Odpověď #26 kdy: 29-06-2019, 20:16:01 »
Asi bys mel precist https://www.root.cz/texty/jak-se-spravne-ptat/, abys pochopil, na jakem principu diskusni fora funguji a ne svadet vlastni insuficienci na ostatni  >:(

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:funkce pos, ansipos
« Odpověď #27 kdy: 29-06-2019, 20:18:14 »
To snáď nie je pravda.
  • Ak si neviem pomôcť ináč, tak si otvorím správcu súboru, vyberiem disk C a dám hľadať "SysUtils", alebo
  • do uses pridám "SysUtils". Potom potom na to slovo nabehnem kurzorom. Podškrtne sa. <Ctrl>+ľavé tlačidlo myši. Alebo pravé a prvá položka "Find declaration"
Plus súhlas s pdf1957
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2600
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:funkce pos, ansipos
« Odpověď #28 kdy: 29-06-2019, 21:22:45 »
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

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:funkce pos, ansipos
« Odpověď #29 kdy: 29-06-2019, 22:06:24 »
To snáď nie je pravda.
  • Ak si neviem pomôcť ináč, tak si otvorím správcu súboru, vyberiem disk C a dám hľadať "SysUtils", alebo
  • do uses pridám "SysUtils". Potom potom na to slovo nabehnem kurzorom. Podškrtne sa. <Ctrl>+ľavé tlačidlo myši. Alebo pravé a prvá položka "Find declaration"
Plus súhlas s pdf1957

Ale to jsem už psal, že jsem ten soubor hledal a nikde jsem nic nenašel. Proč si myslíš, že když dám prohledávat disk c: na kterém nic nemám nainstalované, že mi to něco najde? Mám to nainstalované pod P:, to jsem ale už psal, že program jsem prohledával. To snad není pravda...

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ů: 4472
  • 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ů: 786
  • 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ů: 2600
  • 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ů: 2600
  • 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ů: 1437
  • 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;