Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Návrh pro pohyb v menu

Hezký večer.
Může někdo poradit primitivní návrh, podle kterého bych mohl vypisovat položky v menu? Zasekl jsem se a nedokážu se hnout. Předem Děkuji.

Mám v poli 10 položek.
Zobrazuji vždy jenom tři položky.
Jedna položka je vždy aktuální.

Pokud půjdu směrem dolů, a menu bude vypadat následovně (každý jeden sloupeček se třemi řádky je jeden stisk na klávesnici)


1položka<<<
2položka
3položka

1položka
2položka<<<
3položka

1položka
2položka
3položka<<<

4položka<<<
5položka
6položka

4položka
5položka<<<
6položka
Předmět Autor Datum
A o co ti jde ???
dsa 22.11.2022 20:25
dsa
Jde mi o údaje které potřebuji dosadit do nějakýho cyklu. To je všechno. Jde mi o nějakou logiku. Zn…
JAN60 22.11.2022 20:42
JAN60
První 3 sloupečky jsou jednoduchý polozky=['1Položka','2Položka','3Položka','4Položka','5Položka','…
JAN60 22.11.2022 20:52
JAN60
Takže se jedná o PHP?
host 22.11.2022 20:57
host
To měl být jen příklad, ale klidně v PHP.
JAN60 22.11.2022 21:01
JAN60
Lepší by to bylo asi v Pythonu, viď? ;-)
host 22.11.2022 21:48
host
Ten cyklus nebude od 0, ale od: aktualni_id_polozky / max_polozek Je nutné použít celočíselné dělení…
Wikan 22.11.2022 21:51
Wikan
A druhý parametr? a=aktualni_id_polozky / max_polozek for ( i=a; i==??; i++ )
JAN60 22.11.2022 21:59
JAN60
Logicky o max_polozek víc. Případně ještě s kontrolou, jestli to nepřesáhne počet položek.
Wikan 22.11.2022 22:07
Wikan
Kdyby to bylo tak jednoduché jak si myslíš, tak tady nejsem. :) Myslel jsi tak? Pokud ano, tak fungu…
JAN60 22.11.2022 22:15
JAN60
Co je tam ten nesmysl i=b? Nechtěl jsi spíš napsat i < b? Jo a vypadl mi tam konec: a=(aktualni_id_p…
Wikan 22.11.2022 22:18
Wikan
Ano mělo tam být místo znaku = znak < Jdu to otestovat
JAN60 22.11.2022 22:54
JAN60
Tak pole které má 6 položek funguje správně, pole které má 7 položek udělá loop o 2 kroky navíc, pol…
JAN60 22.11.2022 23:03
JAN60
Však na to už jsem upozorňoval: Případně ještě s kontrolou, jestli to nepřesáhne počet položek.
Wikan 22.11.2022 23:06
Wikan
Ano, to jsi psal, to jsem neudělal, opravim.. Děkuji Pokud je počet položek v menu na výpise 3 tak j…
JAN60 22.11.2022 23:17
JAN60
Nějak v tomhle výpisu nevidím logiku.
Wikan 22.11.2022 23:22
Wikan
Jako, že v tom nevidíš rozdíl nebo nerozumím jak to myslíš. A víš jak to udělat?
JAN60 22.11.2022 23:42
JAN60
Myslel jsem to tak, že nerozumím podle jakého pravidla by to mělo být právě takhle. Jak bys to slovn…
Wikan 23.11.2022 07:17
Wikan
Tak to je to přesně teď, což bylo původní zadání. To ale nechci, (viz jak jsem psal), navíc se mění…
JAN60 23.11.2022 13:16
JAN60
Tak to je to přesně teď, což bylo původní zadání. Takhle to teď teda není. A výška menu se rozhodně…
Wikan 23.11.2022 13:18
Wikan
Omlouvám se! Jasně že ne, myslel jsem, že si se uklepl s tou položkou č.7 v předposledním sloupečku.…
JAN60 23.11.2022 16:14
JAN60
Prostě do "a" nastavíš číslo o 3 menší než "b".
Wikan 23.11.2022 17:11
Wikan
Nerozumím. Teď je to takto a=(aktualni_id_polozky / max_polozek) * max_polozek b=a+max_polozek Po…
JAN60 23.11.2022 17:35
JAN60
Nebude, protože před tím uděláš kontrolu, aby "b" nebylo větší než počet položek.
Wikan 23.11.2022 17:50
Wikan
Psal jsi, že to bude jednoduché:-p
JAN60 23.11.2022 18:10
JAN60
A to ti přijde složité?
Wikan 23.11.2022 18:11
Wikan
Ano je, vůbec netuším co s výsledkem té kontroly.
JAN60 23.11.2022 18:17
JAN60
To že "b" nebude větší než počet položek.
Wikan 23.11.2022 18:18
Wikan
No to už jsi psal.. zjistím, že 'b' je nebo není větší než počet položek a?
JAN60 23.11.2022 18:20
JAN60
A když je, tak do "b" nastavíš hodnotu rovnou počtu položek.
Wikan 23.11.2022 18:24
Wikan
Tak? Vážně nevím. :-( a=(aktualni_id_polozky/max_polozek)*max_polozek b=a+max_polozek if b > max_po…
JAN60 23.11.2022 18:31
JAN60
Co ti brání to vyzkoušet?
Wikan 23.11.2022 18:32
Wikan
No tak to dobře nemám :(
JAN60 23.11.2022 18:35
JAN60
To není zrovna dokonalý popis chyby.
Wikan 23.11.2022 18:36
Wikan
Těžko popsat jak se to teď chová, asi to udělat nejde. Vzdávám to, díky za pomoc.
JAN60 23.11.2022 18:43
JAN60
No a nastavil jsi potom ještě "a" na správnou hodnotu?
Wikan 23.11.2022 18:45
Wikan
Celý kód jsem tu napsal a žádnou správnou hodnotu jsem do 'a' nepsal jelikož ji ani neznám.
JAN60 23.11.2022 19:01
JAN60
Prostě do "a" nastavíš číslo o 3 menší než "b".
Wikan 23.11.2022 19:03
Wikan
Vypíšou se jen první tři položky, čtvrtou už nevidím a následně se ztratí i ty první tři položky.
JAN60 23.11.2022 19:10
JAN60
Jak máš přesně celý kód?
Wikan 23.11.2022 19:24
Wikan
a=(aktualni_id_polozky/max_polozek)*max_polozek b=a+max_polozek if b>max_polozek b=max_polozek a=b-m…
JAN60 23.11.2022 19:33
JAN60
Jo už to vidím. V té podmínce nemá být max položek ale celkový počet položek.
Wikan 23.11.2022 20:25
Wikan
Tak to vůbec nepracuje, živá ukázka tady:ZGTQ93861
JAN60 23.11.2022 21:16
JAN60
https://rextester.com/DJEM99965
Wikan 23.11.2022 22:46
Wikan
Díky moc. Tak problém byl pouze v tom zaokrouhlení nebo jsem něco přehlídl? Pokud se vrátím k uprave…
JAN60 24.11.2022 10:27
JAN60
Nebylo tam jenom zaokrouhlení. Složité to není.
Wikan 24.11.2022 11:00
Wikan
A poradíš ještě i s tímto jak to udělat? Díky
JAN60 24.11.2022 14:09
JAN60
Budeš si udržovat informace o "okně", tj. index prvního a posledního viditelného prvku. Jakmile se p…
Wikan 24.11.2022 14:44
Wikan
Tak je to složité, ne že není, dokonce ještě víc než jsem si myslel. Vůbec nevím jak a co přesně mám…
JAN60 24.11.2022 19:19
JAN60
Vždyť je to naprosto primitivní.
Wikan 24.11.2022 19:22
Wikan
Pro programátora seniora (jak jsi psal níže) určitě určitě primitivní je, ještě aby ne ;-)
JAN60 24.11.2022 19:24
JAN60
Tohle by měl zvládnout i začátečník po pár týdnech učení.
Wikan 24.11.2022 19:26
Wikan
Učení? Co to je? Já myslel, že doba pokročila a že stačí napsat někam na Poradnu a počkat, až to něk… poslední
host 24.11.2022 19:32
host
Wikan obdivujem tvoju trpezlivosť,....
Ale 23.11.2022 19:42
Ale
Jako senior programátor zodpovědný za méně zkušené kolegy to ani jinak nejde. To ovšem neznamená že…
Wikan 23.11.2022 20:26
Wikan
a čo je problém? starting_index = selected_index - (selected_index % separate_per) ...(7 - (7 % 3))…
Ale 23.11.2022 17:40
Ale
Bez urážky, ale takový blábol můžeš pochopit možná jen ty.
JAN60 23.11.2022 18:08
JAN60
asi pomoc nechcete, tak ďakujem za otázku, dovidenia... (a nie neurazil som sa, len zisťujem že tu t…
Ale 23.11.2022 18:21
Ale
Já bych použil takovéhle chování: polozky=['1Položka','2Položka','3Položka','4Položka','5Položka',…
gilhad 23.11.2022 20:18
gilhad
ale on simuluje chování klasického listboxu... edit: tedy dokud není pozice mimo viditelný interval…
touchwood 23.11.2022 20:51
touchwood
čo som pochopil tak nie, ale ak by to bolo takto, tak vlastne na čo sa pýta? Však v takom prípade an…
Ale 23.11.2022 21:17
Ale
to právě ne. Když pojedeš dolů a pak zmáčkneš 2x nahoru, tak se view měnit nebude, ale kurzor, který…
touchwood 24.11.2022 15:30
touchwood
no však to je čo Wikan písal, a v podstate povedal celý algoritmus.... aký je problém? Implementácia…
Ale 24.11.2022 17:35
Ale
já ale nereagoval na Wikana...
touchwood 24.11.2022 18:11
touchwood
Problém je, že on nejspíš neví, co přesně chce ...
dsa 24.11.2022 09:14
dsa
Přesně tak.
JAN60 24.11.2022 10:23
JAN60

Jde mi o údaje které potřebuji dosadit do nějakýho cyklu. To je všechno. Jde mi o nějakou logiku. Znám počet položek v array, znám aktuální ID položky a znám maximální počet položek které se mají zobrazovat v jednom sloupci, ale nevím jak nakrmit ten loop.

První 3 sloupečky jsou jednoduchý

polozky=['1Položka','2Položka','3Položka','4Položka','5Položka','6Položka']
aktualni_id_polozky=0
max_polozek=3
for ( i=0; i<=max_polozek; i++ )
   if   aktualni_id_polozky == i
        print polozky[i], '<<<'
   else
        print polozky[i]

ale další nevím jak udělat.

Kdyby to bylo tak jednoduché jak si myslíš, tak tady nejsem. :)
Myslel jsi tak? Pokud ano, tak fungují pouze první 4 položky, pak už se aktuální položka nevypíše, je někde dole v menu

polozky=['1Položka','2Položka','3Položka','4Položka','5Položka','6Položka']
aktualni_id_polozky=0
max_polozek=3
a=aktualni_id_polozky / max_polozek
b=a+max_polozek
for ( i=a; i=b; i++ )
   if   aktualni_id_polozky == i
        print '>>>',polozky[i], '<<<'
   else
        print polozky[i]

Tak pole které má 6 položek funguje správně,
pole které má 7 položek udělá loop o 2 kroky navíc,
pole které má 8 položek udělá loop o 1 krok navíc,
pole které má 9 položek už zase funguje správně.
a tak dokola
Napadá tě jak to opravit?

Ano, to jsi psal, to jsem neudělal, opravim.. Děkuji
Pokud je počet položek v menu na výpise 3 tak je to hezké, ale jak je pouze jedna tak to vypadá, že má menu pouze jednu položku.
Je to složitější udělat to vzhledově líp?

1položka<<<
2položka
3položka

1položka
2položka<<<
3položka

1položka
2položka
3položka<<<

2položka
3položka
4položka<<<

3položka
4položka
5položka<<<

4položka
5položka
6položka<<<

Myslel jsem to tak, že nerozumím podle jakého pravidla by to mělo být právě takhle. Jak bys to slovně popsal?
Tohle bych třeba chápal a bylo by to i jednoduchý to tak upravit.

1Položka<<<
2Položka
3Položka

1Položka
2Položka<<<
3Položka

1Položka
2Položka
3Položka<<<

4Položka<<<
5Položka
6Položka

4Položka
5Položka<<<
6Položka

4Položka
5Položka
6Položka<<<

6Položka
7Položka<<<
8Položka

6Položka
7Položka
8Položka<<<

Tak to je to přesně teď, což bylo původní zadání.
To ale nechci, (viz jak jsem psal), navíc se mění i samotná výška menu.

Slovně bych to popsal asi. tak, při posunování kurzoru směrem dolů pojede tak dlouho pokud dosáhne kurzor poslední pozice (dole položka č3) další krok zobrazí cyklus od +1 do +1 a kurzor zůstane na svém spodním místě a pro kroky nahoru to bude přesně zrcadlově.
Nevím ale jestli je to to, co jsi chtěl abych slovně popsal.

Omlouvám se! Jasně že ne, myslel jsem, že si se uklepl s tou položkou č.7 v předposledním sloupečku. V tomto případě je to tak jak říkáš, a v tomto případě se výška opravdu nemění..
Tak by asi mohlo být, pokud víš jak na to.

Díky moc. Tak problém byl pouze v tom zaokrouhlení nebo jsem něco přehlídl?
Pokud se vrátím k upravenému dotazu u kterého jsi nenašel logiku, je to opravdu složité? Jedná se o tu verzi kterou doslovně popisuje uživatel 'touchwood' Tohle funguje ale není to pěkný, když se chová poslední strana jinak než ty ostatní, hlavně směrem nahoru. Díky

Budeš si udržovat informace o "okně", tj. index prvního a posledního viditelného prvku. Jakmile se posuneš s indexem za okno (tj. index současného prvku bude větší než posledního viditelného prvku), posuneš i indexy okna. Obdobně když se posuneš s indexem před okno. Samozřejmě v obou případech musíš hlídat, aby ses oknem nedostal před první nebo za poslední prvek.

Příklady:

prvky = [ "prvek 0", "prvek 1", "prvek 2", "prvek 3", "prvek 4" ]

-----------------------------------------------
Stav:

prvek 1
prvek 2 <<<
prvek 3

Okno je 1-3.
Posun dolů na index 3 nemění pozici okna, stejně jako nahoru na prvek 1.
-----------------------------------------------
Stav:

prvek 1
prvek 2
prvek 3 <<<

Okno je 1-3.
Posun dolů na index 4 změní pozici okna na 2-4. Posun nahoru na index 2 pozici okna nezmění.
-----------------------------------------------
Stav:

prvek 2
prvek 3
prvek 4 <<<

Okno je 2-4.
Posun dolů není možný. Posun nahoru na index 3 pozici okna nezmění.
-----------------------------------------------
Stav:

prvek 2 <<<
prvek 3
prvek 4

Okno je 2-4.
Posun dolů na index 3 nezmění pozici okna. Posun nahoru na index 1 změní pozici okna na 1-3.

Tak je to složité, ne že není, dokonce ještě víc než jsem si myslel. Vůbec nevím jak a co přesně mám hlídat, navíc jak s těmi daty které mám hlídat pracovat a kdy je použít.
Pro mně je to tedy tím pádem konečná. Děkuji velmi za tvou ochotu.

a čo je problém?

starting_index = selected_index - (selected_index % separate_per) ...(7 - (7 % 3)) = 7 - 1 = 6, na indexe 6 máš začínajúcu položku tretej skupiny [0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]

následne od starting_index vypíšeš separate_per počet položiek. A na selected_index danej položky pridáš šípku.

veľmi jednoduchý algoritmus. Nie je na tom čo vymýšľať, len jedno blbé odčítanie zvyšku, získaného modulom.

asi pomoc nechcete, tak ďakujem za otázku, dovidenia... (a nie neurazil som sa, len zisťujem že tu trávim čas zbytočne)

btw. neviem čo nepochopíte na blbom vzorci:

starting_index = selected_index - (selected_index % separate_per)

ale, keďže neviete vyriešiť ani takýto primitívny problém, tak sa ani nedivím že nechápete.... logikou zrejme neohurujete.

Alebo ste to chceli celé vypracované a rovno kód?

Já bych použil takovéhle chování:


polozky=['1Položka','2Položka','3Položka','4Položka','5Položka','6Položka']
pocet_polozek=len(polozky)     // cili tady 6, v puv zadani 10 a tak
aktualni_id_polozky=0
max_polozek=3
max_pul=max_polozek/2       // celociselne deleni, prostredni z vypisovanych mist

nějaká smyčka na čtení kláves a upravování akt.id okolo tohohle


// hledame interval <a..b) aby akt.id bylo v nem, idealne uprostred, ale interval nevypadnul z rozsahu
b=aktualni_id_polozky+max_pul
if b>=pocet_polozek then b=pocet_polozek-1
a=b-max_polozek
if a<0 then a=0
b=a+max polozek
if b>=pocet_polozek then b=pocet_polozek-1

for (i=a;i<b;i++)
   if   aktualni_id_polozky == i
        print polozky[i], '<<<'
   else
        print polozky[i]
print

Takhle by to melo fungovat pro libovolny pocet polozek a delku sloupce, s tim ze pokud to pujde, tak je vybrana polozka uprostred zobrazeneho intervalu

to právě ne. Když pojedeš dolů a pak zmáčkneš 2x nahoru, tak se view měnit nebude, ale kurzor, který je na pozici S+2, přejde na S+1 a pak S. Teprve při dalším zmáčknutí nahoru se pozice nezmění (S) ale změní se její index z hlediska pole. A to je celá podstata problému.

Zpět do poradny Odpovědět na původní otázku Nahoru