Stránka 1 z 1

[Delphi] spojení textu v cyklu FOR

Odeslat příspěvekNapsal: 25. 6. 2018 09:57
od dyžon
zdravím,
narazil jsem na nečekanej problém a nevím jak se na to googlu zeptat, tak nemůžu najít žádnou pomoc.
příklad:
mám text adresy: Myslivecká 2215/37 a já z toho potřebuji udělat: Myslivecká 37. čili bez čísla orientačního.
napsal jsem:
Kód: Vybrat vše
function ZkratUlici(ulice: String): String;
var i: Integer; zapsat: Boolean; sUlice: String;
begin
  Result:= '';
  sUlice:= '';
  if pos(ulice, '/') > -1 then begin
    zapsat:= True;
    for i:= 0 to Length(ulice) do begin
      if zapsat then sUlice:= sUlice + ulice[i];
      if ulice[i] = ' ' then zapsat:= False;
      if ulice[i] = '/' then zapsat:= True;
    end;
  end;
  Result:= sUlice;
end;

ale bohužel výsledek je '' ... zkoušel jsem i jiny cykly, ale stejný.
problém je ve spojení sUlice s ulice. nechápu, proč se v cyklech ty stringy nespojují ..
když dám vypsat samostatny ulice[i], tak se to písmeno normálně zobrazí.
prosím pomozte.

[i]-- 25. 6. 2018 11:04 --


tak hned jak jsem to poslal mě napadlo to udělat jinak, dokonce líp, protože ta minulá funkce by špatě vrátila třeba adresu: U Potoka 1234/56, nebo: mojmírovo nám. 5566/12,
nová funkce vypadá takhle:
Kód: Vybrat vše
function ZkratUlici(ulice: String): String;
var i, a1, a2: Integer;
begin
  Result:= '';
  if pos(ulice, '/') > -1 then begin

    for i:= Length(ulice) downTo 0 do begin
      if ulice[i] = '/' then a2:= i;
      if ulice[i] = ' ' then begin a1:= i; break; end;
    end;
  end;
  Delete(ulice, a1 + 1, a2 -a1);
  Result:= ulice;
end;

pokud by se někomu chtělo mi vysvětlit proč nefunguje to spojování textu v cyklu, tak budu rád,
ale jinak je téma vyřešeno ...

Re: [Delphi] spojení textu v cyklu FOR

Odeslat příspěvekNapsal: 25. 6. 2018 10:09
od JanFiala
Podívej se na regularni vyrazy. Budeš to mít pružňejší (jednodušeji modifikovatelné). Unita TRegExpr:
http://regexpstudio.com/en/index.html
Tady máš pak český popis:
https://delphi.cz/post/Regularni-vyrazy-TRegExpr.aspx

PomoBudeš schopný najít cislo/cislo a pokud tam je, tak z nej vzit cast za lomitkem.

Re: [Delphi] spojení textu v cyklu FOR

Odeslat příspěvekNapsal: 26. 6. 2018 08:43
od dyžon
děkuji, určitě na to mrknu podrobněji,
po letmém zhlédnutí z toho moc moudrej nejsem :o).

Re: [Delphi] spojení textu v cyklu FOR

Odeslat příspěvekNapsal: 26. 6. 2018 09:12
od JanFiala
zjednodusene hledas:
cislo/cislo s tim, ze si vyraz rozdelis do skupin. v prvni bude cislo lomitko a ve druhe pouze cislo: (\d+/)(\d+)
obycejnym nahrazenim v retezci pak nahradis nalezeny vyraz pouze za druhou skupinu: $2

564564/12 => 12

Pokud by přibyly varianty, např. že mezi číslem a lomítkem mohou být mezery nebo nebude lomítko, ale jiný znak, pak jen uděláš varianty v hledaném výrazu

Re: [Delphi] spojení textu v cyklu FOR

Odeslat příspěvekNapsal: 27. 6. 2018 07:16
od dyžon
hmmm,...
to zní dobře, určitě na to mrknu ... díky.

Re: [Delphi] spojení textu v cyklu FOR

Odeslat příspěvekNapsal: 4. 8. 2019 11:33
od borekz
Zkusil jsem tvůj kód na https://rextester.com/l/pascal_online_compiler a normálně funguje.
Akorát jsem musel změnit Result na ZkratUlici, aby to šlo přeložit. Možná ten Result je nějaká vychytávka pouze v Delphi.

https://rextester.com/WRAQA84522

Kód: Vybrat vše
program HelloWorld;

function ZkratUlici(ulice: String): String;
var i: Integer; zapsat: Boolean; sUlice: String;
begin
  ZkratUlici:= '';
  sUlice:= '';
  if pos(ulice, '/') > -1 then begin
    zapsat:= True;
    for i:= 0 to Length(ulice) do begin
      if zapsat then sUlice:= sUlice + ulice[i];
      if ulice[i] = ' ' then zapsat:= False;
      if ulice[i] = '/' then zapsat:= True;
    end;
  end;
  ZkratUlici:= sUlice;
end;

begin
    writeln(ZkratUlici('Myslivecká 2215/37'));
end.

Výstup: Myslivecká 37

Re: [Delphi] spojení textu v cyklu FOR

Odeslat příspěvekNapsal: 5. 8. 2019 09:53
od JanFiala
borekz píše:Zkusil jsem tvůj kód na https://rextester.com/l/pascal_online_compiler a normálně funguje.
Akorát jsem musel změnit Result na ZkratUlici, aby to šlo přeložit. Možná ten Result je nějaká vychytávka pouze v Delphi.


Přiřazení výsledku do Result nebo do jména funkce je obdoba. Fungovalo to tak tuším už od dob TurboPascalu.
Přiřazení do Result slouží k zpřehlednění, víš, že jde o výsledek funkce. Když to přiřadíš do jména funkce, můžeš to přehlédnout jako přiřazení do proměnné apod.