0

私の目的は、数字が 7 桁未満でTCheckBox入力された場合、ユーザーが決して確認できないようにすることです。TEditまた、が空TCheckBoxの場合はチェックできません。TEdit

私のコードの問題は、空でTCheckBoxもチェックできることがあります。TEdit

TEditさらに、私のもう 1 つの目標は、空の状態で TCheckBox がチェックされているときにスタート ボタンをクリックすると、スタート ボタンが実行されないか、常にエラー メッセージが表示されることです。

問題は、スタートボタンにどのコードを入れるべきかということです.

次のコードを使用しています。

//--------------------------------------------------------------------------------
void __fastcall TForm::MyTEditBoxKeyPress(TObject *Sender, System::WideChar &Key)
{
    if( Key == VK_BACK ) return;
    if((Key < '1') || (Key > '9'))
    {
        MessageDlg("Please enter number only.",mtInformation, TMsgDlgButtons()<< mbOK, 0);
        Key = 0;
    }
}
//--------------------------------------------------------------------------------
void __fastcall TForm::MyTEditBoxExit(TObject *Sender)
{
    if (MyTEditBox->Text.Length() < 7) {
        MessageDlg("Please enter at least 7 digit.",mtInformation, TMsgDlgButtons()<< mbOK, 0);
    }
}
//--------------------------------------------------------------------------------
void __fastcall TForm::MyCheckBoxClick(TObject *Sender)
{
    if (MyCheckBox->Tag == 0 ) {
        MyCheckBox->Tag = 1;
        if (MyTEditBox->Text.Length() >= 7)
            MyCheckBox->Checked = true;
        IdThrottler->BitsPerSec = StrToInt64(MyTEditBox->Text);
    }
    else {
        MyCheckBox->Tag = 0;
        if (MessageDlg("Please enter at least 7 digit.",mtInformation, TMsgDlgButtons()<< mbOK, 0) == mrYes)
            MyCheckBox->Checked = false;
    }
}
4

1 に答える 1

1

まず、スロットラーのBitsPerSecプロパティはintではなく であるため、の代わりに__int64を使用する必要があります。StrtoInt()StrToInt64()

TCheckBox::Enabledイベントでプロパティを設定しているTCheckBox::OnClickため、ユーザーは実際にクリックしTCheckBoxて更新する必要があります。ユーザーが を入力しただけでTEditをクリックしTCheckBoxないと、更新されません。

テキストが適切でTCheckBoxない限り、ユーザーにまったくクリックさせたくない場合は、イベントを使用してプロパティを設定し、処理を完全に取り除く必要があります。TEditTEdit::OnChangeTCheckBox::EnabledTCheckBox::Tag

void __fastcall TMyForm::MyTEditBoxChange(TObject *Sender)
{
    MyCheckBox->Enabled = (MyTEditBox->GetTextLen() >= 7);
}

void __fastcall TMyForm::MyCheckBoxClick(TObject *Sender)
{
    if (MyCheckBox->Checked)
        IdThrottler->BitsPerSec = StrToInt(MyTEditBox->Text);
    else
        IdThrottler->BitsPerSec = 0;
}

Textユーザーが 6 桁を超える数字を入力できるからといって、それが値の値を表しているわけではないことに注意してくださいint。そのような状況でStrToInt()は、例外が発生します。

これを処理する別の方法は、フォームに を追加しTActionList、カスタム アクションを作成し、そのアクションをTCheckBox::Actionプロパティに割り当て、TAction::OnUpdateイベントを使用してTAction::Enabledプロパティを設定することです (これにより、 が有効/無効になりますTCheckBox)。

void __fastcall TMyForm::MyActionUpdate(TObject *Sender)
{
    MyAction1->Enabled = (MyTEditBox->GetTextLen() >= 7);
}

このアプローチの利点は、TCheckBox::Enabledプロパティの変更に手動で対応する必要がまったくなく、プロパティが自動的かつリアルタイムで更新されることTEditです。

そうは言っても、最新バージョンの C++Builder を使用している場合TEditは、NumbersOnlyプロパティがあります。true に設定すると、TEdit::OnKeyPressイベントでキーストロークをフィルター処理する必要がなくなります。OS は、ユーザーが数字以外の文字を入力するのを防ぎます (さらに、手動でフィルター処理している場合は、ユーザーが入力することを許可しません)。0数字、これは間違っています)。

ユーザーが を介して数値を入力できるようにする必要がありTEdit、そのTEdit::NumbersOnlyプロパティが C++Builder のバージョンで使用できない場合でも、他にいくつかのオプションがあります (最新の C+ でもいずれにしても考慮する必要があります)。 +ビルダーバージョン):

  1. TEdit読み取り専用にTUpDownし、プロパティを介して をアタッチし、必要に応じて適切なと の値をTUpDown::Associate割り当てます。プロパティを使用して、スロットラーのプロパティを更新します。TUpDown::MinTUpDown::MaxTUpDown::PositionBitsPerSec

    void __fastcall TMyForm::MyActionUpdate(TObject *Sender)
    {
        MyAction1->Enabled = (MyUpDown->Position > 999999);
    }
    
    void __fastcall TMyForm::MyUpDownClick(TObject *Sender, TUDBtnType Button)
    {
        if ((MyCheckBox->Enabled) && (MyCheckBox->Checked))
            IdThrottler->BitsPerSec = MyUpDown->Position;
        else
            IdThrottler->BitsPerSec = 0;
    }
    

    TTrackBarまた、プロパティをより大きな増分で設定する a を使用しTUpDown::Valueて、ユーザーが上下の矢印を押して小さな調整を行う必要がないようにすることもできます。

    void __fastcall TMyForm::MyTrackBarChange(TObject *Sender)
    {
        MyUpDown->Position = MyTrackBar->Position;
        MyUpDownClick(NULL, btNext);
    }
    
  2. まったく使用しないでくださいTEditTCSpinEdit代わりにorを使用TSpinEditします (C++Builder のバージョンによって異なります)。ユーザーは数字を入力できますが、数字以外の入力は拒否されます。のように上向き/下向きの矢印があり、TUpDown微調整を行うことができます。また、プロパティと同様に、の代わりにValueを返す/受け入れるプロパティがあります。intStringTUpDown::Position

    void __fastcall TMyForm::MyActionUpdate(TObject *Sender)
    {
        MyAction1->Enabled = (MySpinEdit->Value > 999999);
    }
    
    void __fastcall TMyForm::MySpinEditChange(TObject *Sender)
    {
        if ((MyCheckBox->Enabled) && (MyCheckBox->Checked))
            IdThrottler->BitsPerSec = MySpinEdit->Value;
        else
            IdThrottler->BitsPerSec = 0;
    }
    

どちらの方法でも、ユーザーは数値以外の値をまったく入力できずTCheckBox、目的のしきい値よりも小さい値に対しては自動的に無効になります。

于 2015-08-13T05:10:03.090 に答える