Autor Téma: funkce pos, ansipos  (Přečteno 758 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ů: 4426
  • 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ů: 1432
  • 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ů: 4426
  • 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ů: 1432
  • 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ů: 4426
  • 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ů: 2593
  • 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ů: 777
  • 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.