CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Własność Increment komponentu SpinEdit.
Strona 1 z 1

Własność Increment komponentu SpinEdit.

Nowy postNapisane: wtorek, 14 stycznia 2014, 11:09
przez manin
Witam ponownie.
Czy istnieje jakiś sposób na to aby przy użyciu SpinEdita zmieniać wartość zmiennej double inaczej niż tylko o wartości całkowite? Przeszukałem forum i post tutaj wskazuje na to, że tak (chyba, że nie zrozumiałem kontekstu).
Używam Buildera 6 i za każdym razem, gdy zmieniam własność Increment na liczbę inną niż całkowitą otrzymuję błąd "is not a valid integer value", a wpisanie w SpinEdicie liczby zmiennoprzecinkowej powoduje jej zokrąglenie.

Re: Własność Increment komponentu SpinEdit.

Nowy postNapisane: wtorek, 14 stycznia 2014, 13:11
przez Mironas
W SpinEdit można wpisywać wyłącznie liczby całkowite.

Proponuję użyć zwykłego komponentu TEdit i dodatkowo TUpDown. Aby w TEdit ograniczyć wpisywanie tylko do liczb możesz utworzyć takie zdarzenie:
KOD cpp:     UKRYJ  
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
  if ( !(isdigit(Key) || Key==VK_BACK || Key==DecimalSeparator) )
    Key = 0;
  else if ( (Key==DecimalSeparator) && (Edit1->Text.Pos(DecimalSeparator)>0) )
    Key = 0;
}
 

Re: Własność Increment komponentu SpinEdit.

Nowy postNapisane: wtorek, 14 stycznia 2014, 17:26
przez Cyfrowy Baron
SpinEdit inkrementuje tylko liczy całkowite. Możesz posłużyć się jednak komponentem TCSpinButton z palety Samples w połączeniu z komponentem TEdit. Umieść na formularzu komponent CSpinButton1 i Edit1. We właściwości FocusControl komponentu CSpinButton1 wybierz Edit1. Utwórz zdarzenia OnDownClick i OnUpClick dla komponentu CSpinButton1. W zdarzeniach umieść taki kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::CSpinButton1DownClick(TObject *Sender)
{
  double x = StrToFloatDef( reinterpret_cast<TEdit *>(CSpinButton1->FocusControl)->Text, 0.2);
  x -= 0.2;
  reinterpret_cast<TEdit *>(CSpinButton1->FocusControl)->Text = FloatToStrF(x, ffFixed, 7, 1);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::CSpinButton1UpClick(TObject *Sender)
{
  double x = StrToFloatDef( reinterpret_cast<TEdit *>(CSpinButton1->FocusControl)->Text, 0.2);
  x += 0.2;
  reinterpret_cast<TEdit *>(CSpinButton1->FocusControl)->Text = FloatToStrF(x, ffFixed, 7, 1);
}


W przykładzie inkrementowana jest wartość 0.2, ale możesz oczywiście użyć dowolnej.

Nie wiem, czy w C++Builder 6 występuje funkcja StrToFLoatDef, więc masz tu jeszcze kod bez tej funkcji:

KOD cpp:     UKRYJ  
double MyStrToFloatDef(String sText, double x)
{
  double Result;
  try{ Result = sText.ToDouble(); } catch(...) { Result = x;}

  return Result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CSpinButton1DownClick(TObject *Sender)
{
  double x = MyStrToFloatDef( reinterpret_cast<TEdit *>(CSpinButton1->FocusControl)->Text, 0.2);
  x -= 0.2;
  reinterpret_cast<TEdit *>(CSpinButton1->FocusControl)->Text = FloatToStrF(x, ffFixed, 7, 1);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::CSpinButton1UpClick(TObject *Sender)
{
  double x = MyStrToFloatDef( reinterpret_cast<TEdit *>(CSpinButton1->FocusControl)->Text, 0.2);
  x += 0.2;
  reinterpret_cast<TEdit *>(CSpinButton1->FocusControl)->Text = FloatToStrF(x, ffFixed, 7, 1);
}