Ĺ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
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
