ďťż

Ładny brzuch

Witam.

Chce zrobić taką oto rzecz:

Program na podstawie wpisanego kolejnego znaku do TEdit dodaje do ProgressBara jakąś tam wartość w zależności od tego znaku - zrobione;
Jesli znak = poprzedniemu znakowi to wartośc ta = 0 - zrobione;
Jesli user wcisnie Backspace to wartość progressBara zmaleje o daną wartość przypisaną znakowi - zrobione;

Niby wsio ok, ale sa z tym problemy bo jesli user wpisze kilka takich samych znaków to wartoścćmu się nie zwiększy, ale jesli potem wscisnie backspace to wartośc ta się zmiejszy.

W kodzie wyglada to tak:

{funkcja sprawdzi czy znak znajduje się w zbiorze i na jego podstawie zwróci odpowiedni numerek na podstawie prostego algorytmu - mniejsza o to nie w tym problem} function SprChar(chk: Char): byte; var i: integer; begin {...} //tu wszystko działą dobrze end; function Getvalue(caly, znak: PChar; actpos: byte): integer; stdcall; //jest to dll var punkty: integer; ciag: string; max: integer; begin ciag := StrPas(caly);   {cf = #8}   if (Char(znak) = cf) and (Length(ciag) > 0)  then    punkty := (-1 * SprChar(ciag[Length(ciag)])) //jesli user wciska backspace to wartośc przyjmuje swoja przeciwnośc dla ostaniego znaku   else    punkty := SprChar(Char(znak)); //jesli <> backspace to pobiera wartosc   if (Length(ciag) > 0) then   begin    if ciag[Length(ciag)] = Char(znak) then      punkty := 0; //jesli ostatni znak byl taki sam to wartosc jest 0   end; Result := actpos + punkty; end;
Wywyołanie tej funkcji to (w onkeypress dla edita):
Progressbar1.Position := getValue(PChar(edit1.text), PChar(key), progressbar1.position;

A w praktyce to wyglada to tak:

1.user wpisuje takie coś do edita:
'ala ma kota'
w tym przypadku wartość w progressbar wyniesie 18.
2.Potem user kasuje ten tekst.
wartosc progressbara spada do zera.
3.Potem user wpisuje takie coś:
'abcccccccccccccc'
wartość progressbara w tym momencie wyniesie 6.
4. User wciska backspace i mimo to wartosc progressBara spada... :( i w koncu osiaga głupie wartosci (np 254). Chce aby instrukcje które odpowiadaja za zmiejszanie wartosci zadziałały tylko wtedy gdy kasowany znak juz bedzie ostatnim z 'tych samych znaków' czyli w tym wypadku zmiejszanie sie wartosci progressbara powinno sie zaczac jesli user skasuje ostania litere 'c' (liczac od konca) i naturalnie wszytskie poprzednie. Jak to przerobic? A może kod powinien wygladac całkiem inaczej?

P.S.
Instrukcja:

if progressbar1.position > 100 then

nie wchodzi w gre, bo te wielkie wartosci sa spowodowane niedopracoiwaniem komponentu z którego korzystam (tak mi sie wydaje). komponent ten nie ma MAx i Min, oblicza on wszystko w procentach wiec MAX = 100, ale mimo to daje jakies bzdury, jesli wartosc bedzie maleć poniżej zera to daje te bzdury.
Teraz tylko oparłem sie na progressbarze.

Mam nadzieje, ze nie namotałem i mniejwięcej wiecie o co mi chodzi.
Oczekuje pomocy.
Z góry dzieki.



Nie wiem czy dobrze cię zrozumiałem:

Chodzi o to :

If Edit1.Text = '' then //wartość progresa przypisz 0

I może to Timerem sprawdzać.


Nie wiem czy dobrze cię zrozumiałem:

Chodzi o to :

If Edit1.Text = '' then //wartość progresa przypisz 0

I może to Timerem sprawdzać.


Nie nie. Kompetnie mam na mysli co innego.

Założmy takie coś:
user wspiał:
abcdef (czyli nie ma dwóchj takich samych znaków koło siebie)
w progressbarze pojawiła mu się wartość X - obliczona w jakis tam sposob
potem to skasował to i warytosć zmalała - prawidłowo
potem wpisał:
abccccccccccc (czyli litera c pojawia sie kilka razy koło siebie)
wiec wartosc w progressbarze wynosi Y - jest liczona tylko do momentu pierwszego c
potem user kasuje tekst
i chce aby zmiejszanie wartosci wg mojego kodu (lub innego) nastapiło jesli kasowanie dojdzie do litery C ostatniej liczac od konca, dopoki kasuje sobie puierwsze, drugie, trzecie itp to wartosc progressbara sie nie zmienia - nie maleje. Tak jak nie rołą przy wpisuwaniu kolejnych C to teraz nie powinna maleć przy ich kasowaniu.



Już sobie poradziłem.

Wystarczyło dodać zagnieździć jesze jeden warunek:
if ciag[length(ciag)] = ciag[Length(ciag)-1] then

ale lame ze mnie :frusty:

Sorky, za zawracanie głowy.


Już sobie poradziłem.

Wystarczyło dodać zagnieździć jesze jeden warunek:
if ciag[length(ciag)] = ciag[Length(ciag)-1] then

ale lame ze mnie  :frusty:

Sorky, za zawracanie głowy.


Nie z ciebie lame tylko z pomocnika...  :D

Ps. To tylko zart MatPien....  :D

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •