ustalanie wyswietlania cyfr za pomocą scrolball

0

witam:)

mam pewien problem.......
otóż ucze sie programowania własnie w delphi i robie rownanie kwadratowe.
doszedłem lecz do pewnego miejsca w moim zamysle i stoje.

mam gotowy program to nie było trudne. ale chciałbym teraz do tego programu dodac przycisk aktywny scrolball w celu regulacji wyswietlanych cyfr po przecinku dla moich wyników. niestety nigdzie nie znalazlem nic podobnego. ani polecen ani podobnych problemow.
chciałbym aby wygladało to tak.

scrolball niech ma 10 stanow (po mojemu klikniec?)
i gdy bedzie w stanie 0 to wynik np x1 moze byc wynikiem o liczbie cyfr po przecinku max=10
gdy bedzie w stanie 1 to wynik x1 moze byc wynikiem o liczbie cyfr po przecinku max=9
gdy bedzie w stanie 2 to wynik x1 moze byc wynikiem o liczbie cyfr po przecinku max=8

itd itd

dorzucam kod mojego programu. i prosze o przyblizenie mi składni wyrazenia z drobnym wskazaniem gdzie co musze zmienic:)

dzieki z góry :D ;]

<font size="4"></span>oto moje równanie w postaci kodu

<font size="3"></span>
unit main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ToolWin, ComCtrls, ImgList;

type
TForm1 = class(TForm)
pole_a: TEdit;
pole_b: TEdit;
pole_c: TEdit;
wynik_delty: TPanel;
zakoncz: TButton;
wzor: TLabel;
tytul: TLabel;
wys_a: TLabel;
wys_b: TLabel;
wys_c: TLabel;
wys_x1: TLabel;
wys_x2: TLabel;
wys_x0: TLabel;
x1: TLabel;
x2: TLabel;
x0: TLabel;
Label1: TLabel;
procedure pole_aChange(Sender: TObject);
procedure pole_bChange(Sender: TObject);
procedure pole_cChange(Sender: TObject);
procedure zakonczClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure pole_aKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure pole_bKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure pole_cKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure pole_aClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure pole_bClick(Sender: TObject);
procedure pole_cClick(Sender: TObject);
procedure FormCreate(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure znajdz_pierwiastki;
var //deklaracje
delta, x1,x0, x2 : Real; //zmiennych
a, b, c : Integer; //wprowadzanych
liczba,liczba2 : String;
begin
a:= StrToInt(Form1.pole_a.Text); //skad zczytuje podane wartosci
b:= StrToInt(Form1.pole_b.Text);
c:= StrToInt(Form1.pole_c.Text);

    delta := b*b - 4*a*c;                         //wzor na delte

                // Form1.wynik_delty.Caption:=MakeItAString(delta);  <--oblicz delte pokaz wynik
                begin                             //wykonaj
                delta := b*b - 4*a*c;             //wzor delta
                Str(delta:1:0,liczba);            //delte zamieniam na typ slowa
                Form1.wynik_delty.Caption:='delta='+liczba ;
                                                  //przypisuje wartosc slowa
                end;                              //zakoncz

    if          delta<0 then                      //jesli del < to
      begin                                       //wykonaj

                Form1.wynik_delty.Color:=clRed;   //to daje kolor delty czerwony gdy nie ma pier.
      end                                         //zakoncz
    else       Form1.wynik_delty.Color:=clGreen;  //kolor zielony gdy pierwiastki wystepuja
    if         delta=0 then                       // jesli del=0 to
        begin                                     //wykonaj

               Form1.x1.Caption:= 'brak' ;        //wyswietl brak wyniku
               Form1.x2.Caption:= 'brak' ;        //wyswietl brak wyniku

               x0:=-b/2/a;                        //oblicz x0
               Str(x0:1:10,liczba);               //xo zamieniam na  typ slowa
               Form1.x0.Caption:=liczba
                                                  //przypisuje wartosc slowa
        end;
    if        delta>0 then                        //jesli del >0 to
        begin                                     //wykonaj

              Form1.x0.Caption:= 'brak' ;         //wyswietl brak wyniku x0
              x1:=(-b-sqrt(delta))/(2*a);         //obl. x1 ze wzoru
              x2:=(-b+sqrt(delta))/(2*a);         //obl. x2 ze wzoru
              Str(x1:1:10,liczba);                //x1 zamieniam na typ slowa liczba
              Form1.x1.Caption:=liczba ;          //przypisuje wartosci  slowa liczba
              Str(x2:1:10,liczba2);               //x2 zamieniam na typ slowa x2
              Form1.x2.Caption:=liczba2;          //przypisuje wartosc  slowa liczba2
        end;
   if delta<0 then
        begin
            Form1.x2.Caption:=' brak' ;           //wyswietl brak wyniku x2
            Form1.x1.Caption:=' brak' ;           //wyswietl brak wyniku x1
            Form1.x0.Caption:=' brak' ;           //wyswietl brak wyniku x0
        end ;
        end;

  procedure TForm1.pole_aChange(Sender: TObject); //reakcje na zmiane wartosci wpisywanej a
  var       str  : string;                        //deklaracje tekstu
            i,j : integer;                        //dek. cyfr
            fl  : byte;                           //deklaracja rozmiaru pamieci
            ch  : char;
            a, Code : integer;
      begin
            str := pole_a.Text;
            Val(str, a, Code);
  if        Code > 0 then
      begin
            ShowMessage('to nie są cyfry! wpisz ponownie!!');
                                                  //alert
      end;                                        //zakoncz


  if        (pole_a.Text = '') then pole_a.Text := '0';
                                                  //jesli pole puste przypisz 0
            str:=pole_a.Text;
            i:=strlen(Pchar(str));                //dlugosc napise pole_a.text
            j:=1;
            fl:=0;
  Repeat
            ch := str[j];
            if (((ord(ch)<=57)and(ord(ch)>=48))or(ord(ch)=45)) then fl:=0 else fl:=1;
            j:=j+1;
  until     (j=i+1)or(fl=1);
  if        fl=0 then
      begin
  if        pole_a.Text='-' then pole_a.Text:='-1';//jesli sam - to przypisz -1
  if        (StrToInt(pole_a.Text)>3000000)or(StrToInt(pole_a.Text)<-3000000) then
                                                  //ograniczam ilosc wpisanych cyfr a:
                                                  //jesli wiecej niz podane to
      begin                                       //wykonaj
            pole_a.Text:=IntToStr(1);             // przypisz  1
            ShowMessage('za dużo cyfr!');         //wyslij alert  bledu
            form1.pole_a.SetFocus;                //nie dziala;/dlaczego??
      end;                                        //zakoncz
  if        (StrToInt(pole_a.Text)=0) then        //jesli wartosc a=  to
      begin                                       //wykonaj
            Showmessage('Nie moze byc 0!!');      //wyslij alert bledu
            pole_a.Text:=IntToStr(1);             //i przypisz wartosc =1
      end                                         //zakoncz
  end else                                        //i jesli
      begin                                       //wykonaj
            pole_a.Text:=IntToStr(1);             //przypisz wartosc 1
      if    pole_a.Text='-' then pole_a.Text:='-1'//gdy sam- przypisz =-1
      end;                                        //zakoncz
            znajdz_pierwiastki;                   //oblicz podaj wynik
  end;                                            //koniec

  procedure TForm1.pole_bChange(Sender: TObject); //reakcje na zmiane wartosci wpisywanej b


  var     str  : string;
          i,j : integer;
          fl  : byte;
          ch  : char;
          b, Code : integer;
      begin
          str := pole_b.Text;
          Val(str, I, Code);
  if      Code > 0 then
      begin
          ShowMessage('to nie są cyfry! wpisz ponownie!!');
                                                  //wyslij alert bledu
      end;                                        //zakoncz


  if      (pole_b.Text = '')then pole_b.Text := '0';//gdy puste pole b przypisz 0

          str:=pole_b.Text;                       //deklaracja pola b jako tekstu
          i:=strlen(Pchar(str));                  //dlugosc napise pole_b.text
          j:=1;
          fl:=0;
  Repeat
          ch := str[j];
          if (((ord(ch)<=57)and(ord(ch)>=48))or(ord(ch)=45)) then fl:=0 else fl:=1;
          j:=j+1;
  until   (j=i+1)or(fl=1);
  if      fl=0 then
      begin
  if      pole_b.Text='-' then pole_b.Text:='-1';  //gdy sam minus przypisz -1
  if (    StrToInt(pole_b.Text)>300000000)or(StrToInt(pole_b.Text)<-30000000) then //ograniczam liczbe wpisanych cyfr b:
      begin
            pole_b.Text:=IntToStr(0);              //gdy wiecej niz 3000 przypisz 0
            ShowMessage('za dużo cyfr!');          //wyslij komunikat
      end;                                         //zakoncz
    end else
       begin
  if        pole_b.Text='-' then pole_b.Text:='-1';//gdy sam minus przypisz -1
            pole_b.Text:=IntToStr(0);              //inaczej przypisz =0
        end;
    znajdz_pierwiastki;                            //oblicz podaj wynik

    end;                                           //zakoncz

    procedure TForm1.pole_cChange(Sender: TObject);
    var     str  : string;                         //deklaracje
            i,j : integer;
            fl  : byte;
            ch  : char;
            c, Code : integer;
        begin
            str := pole_c.Text;
            Val(str, I, Code);
            if Code > 0 then
        begin
            ShowMessage('to nie są cyfry! wpisz ponownie!!') ;
        end;


    if      (pole_c.Text = '') then pole_c.Text := '0';//gdy puste pole b przypisz 0
            str:=pole_c.Text;                          //tekst w b
            i:=strlen(Pchar(str));                     //dlugosc napise pole_c.text
            j:=1;
            fl:=0;
    Repeat
            ch := str[j];
            if (((ord(ch)<=57)and(ord(ch)>=48))or(ord(ch)=45)) then fl:=0 else fl:=1;
            j:=j+1;
    until   (j=i+1)or(fl=1);
    if      fl=0 then
        begin
    if      pole_c.Text='-' then pole_c.Text:='-1';   //gdy sam minus przypisz -1
    if     (StrToInt(pole_c.Text)>30000000)or(StrToInt(pole_c.Text)<-3000000) then
                                                      //ograniczam liczbe wpisanych cyfr c:

        begin
            pole_c.Text:=IntToStr(0);                 //gdy wiecej niz 3000 przypisz 0
            ShowMessage('za dużo cyfr!');             //wyslij alert
        end;
    end else
        begin
            pole_c.Text:=IntToStr(0);                 //i przypisz 0
    if      pole_c.Text='-' then pole_c.Text:='-1';   //gdy sam minus przypisz -1
        end;
            znajdz_pierwiastki;
    end;

    procedure TForm1.zakonczClick(Sender: TObject);
        begin
            Form1.Close;
        end;

    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        begin
    if       Application.MessageBox('chcesz mnie opuscic??;(',
                                                      //pytanie o kill :D
            'nie zamykaj mnie ja chce dzialac!!;D', MB_YESNO) = IDYES then CanClose:=True
    else     CanClose:=False;                         //if yes=close else tru#close
        end;



    procedure TForm1.pole_aKeyDown(Sender: TObject; var Key: Word;
              Shift: TShiftState);
        begin
    if       key=13 then form1.pole_b.SetFocus  ;
        end;

    procedure   TForm1.pole_bKeyDown(Sender: TObject; var Key: Word;
              Shift: TShiftState);
        begin
              if key=13 then form1.pole_c.SetFocus  ;
        end;

    procedure TForm1.pole_cKeyDown(Sender: TObject; var Key: Word;
              Shift: TShiftState);
        begin
    if       key=13 then form1.pole_a.SetFocus  ;
        end;

    procedure TForm1.pole_aClick(Sender: TObject);
        begin
              form1.pole_a.SetFocus
        end;

    procedure TForm1.FormActivate(Sender: TObject);
        begin
              Form1.pole_a.SetFocus
        end;


    procedure TForm1.pole_bClick(Sender: TObject);
        begin
              form1.pole_b.SetFocus
        end;

    procedure TForm1.pole_cClick(Sender: TObject);
        begin
              form1.pole_c.setfocus
        end;

    procedure TForm1.FormCreate(Sender: TObject);

begin

end;

end.

0

Zamiast wklejać kod bez prawidłowych znaczników delphi mogłeś spakować całośc i wrzucić na
przykład na http://www.speedyshare.com dlatego w Twoim kodzie nie powiem Ci konkretnie co
musisz zmienić, bo to się już sam domyślisz skoro podstawy znasz. Poniżej jest przykład kodu,
który umieszczasz w zdarzeniu OnChange dla ScrollBara, którego własność Name jest u mnie w
kodzie standardowa czyli ScrollBar1, własność Min to 0, a max to 10, a własnośc Position to w
tym zakresie sobie możesz ustawić, ja zostawiłęm 0. I teraz Ty napisałeś coś bez sensu według
mnie, bo chcesz aby przy pozycji 0 bylo 10 miejsc po przecinku, powinno być chyba odwrotnie,
tak jak w moim kodzie, pozycja ScrollBara to ilość miejsc po przecinku, ale jak chcesz inaczej to
nie problem sobie odwrocic to co jest po dwukropkach w case. Użyłem najprostszej metody czyli
funkcji FormatFloat, która ustala format liczby zmiennoprzecinkowej, a jej wynik zwracany jest w
postaci łańcucha znaków (czyli string). Jak chcesz wywołać zdarzenia OnChange ScrollBara bez
poruszania suwakiem to w kodzie wpisz ScrollBar1.OnChange(Self); Instrukcje po case są między
słowami begin oraz end; po to aby można było wykonać ewentualnie więcej niż jedno polecenie w
przypadku każdej z liczb. Czyli przuda się Tobie przy zmianie kilku wartości. Więcej informacji na:
Case oraz FormatFloat Powodzenia.

var
X : Real;
S : string;
begin
// Jakaś przykładowa liczba;
X := 58.0987654321;
case ScrollBar1.Position of
 0: begin S := FormatFloat('0', X); end;
 1: begin S := FormatFloat('0.0', X); end;
 2: begin S := FormatFloat('0.00', X); end;
 3: begin S := FormatFloat('0.000', X); end;
 4: begin S := FormatFloat('0.0000', X); end;
 5: begin S := FormatFloat('0.00000', X); end;
 6: begin S := FormatFloat('0.000000', X); end;
 7: begin S := FormatFloat('0.0000000', X); end;
 8: begin S := FormatFloat('0.00000000', X); end;
 9: begin S := FormatFloat('0.000000000', X); end;
10: begin S := FormatFloat('0.0000000000', X); end;
end;
Label1.Caption := S;
end;
0

DOBRZE GADASZ:)
domyslam sie....jednak nie wiem jak wprowadzic cos takiego zeby zczytywało mi z 3 pol wynik....
bo przy rownaniu mam x1 x2 i x0
dla jednej liczby faktycznie działa:D
do tej pory uzywałem polecenia :
random(0,r) np.

ale to z jednego pola:)
mozesz mi podpowiedziec jak sprawic aby zczytywało mi jednoczesnie z x1 i x2??
musze osobne dla tych czynnikow polecenia robic??
czy dopisac po prostu w deklaracji??
przepraszam za wklejenie;( nie pomyslałem :/

dzieki za pomoc:)

0

o kurcze:D przeczytałem raz jeszcze wszystko na spokojnie i załapałem w koncu co napisałes;)
mądry z Ciebie gościo:)
podziekował:)

wszystko mi prawie smiga:)
a co do tej odwrotności to fakt mozna i tak i tak:)
a ja sobie własnie wymysliłem na spak:D

dzieki za pomoc raz jeszcze:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1