[Builder C++] weryfikacja formularza + przejęcie danych z Form2

0

Hejka

muszę na sobotę napisać małą gierkę w C++ (a przyznam że pół roku nic nie robiłem)

  1. Jak sprawdzić czy pole Edit zostało wypełnione zanim wykonamy dalszą część kodu
  int graczy = StrToInt( EditGraczy->Text );
        if ( graczy != 2 && graczy != 3 && graczy != 4)
        {
                Application->MessageBox("Podaj liczbę z zakresu 2 - 4", "Informacja!",
	                MB_OK | MB_ICONWARNING);
        }
        else Close();
  1. Jak wyświetlić dane wpisane w Form2 w polu Label Form1
0

Za pomocą instrukcji if().
Musisz sobie stworzyć jakiegoś gettera, z którego pobierasz interesujące Cie informacje i tyle..

0
kopernik napisał(a)

Za pomocą instrukcji if().
Musisz sobie stworzyć jakiegoś gettera, z którego pobierasz interesujące Cie informacje i tyle..

a możesz troszkę jaśniej

0
bool IsDigit(String n){
        return n>='0'&&n<='9';
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
         if(IsDigit(Edit1->Text)==true){
              Label1->Caption = Edit1->Text;
         }
         else
              ShowMessage("ERROR");
}

Sprawdzasz Sobie czy to co jest w edicie, to aby na pewno cyferka.. Jak tak to coś tam działasz.. a jak nie to wyświetlasz komunikat o błędnie wprowadzonej danie..
Co do getterów i setterów
[CIACH!]

0

no niestety nie działa po wpisaniu jakiegokolwiek znaku nie będącego cyfrą program się sypie
'a' is not a valid integer value

0

nio to Ciekawe, bo mi się nie sypie..
//edit: Jeżeli wpisujesz tam więcej niż jedną cyferkę, to przejedź po kolei po każdym znaku i sprawdz czy jest cyferką..

0
bool TForm1::IsDigit(String n){
        for(int i=1;i<=n.Length();i++){
                if(!(n[i]>='0'&&n[i]<='9'))
                        return false;
        }
        return true;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        if(IsDigit(Edit1->Text)==true){
                Label1->Caption = Edit1->Text;
                int x = StrToInt(Edit1->Text);
        }
        else
                ShowMessage("ERROR");
}

A tutaj fragment kodu z dstring.h

 char& __fastcall operator [](const int idx)
    {
      ThrowIfOutOfRange(idx);   // Should Range-checking be optional to avoid overhead ??
      Unique();                 // Ensure we're not ref-counted
      return Data[idx-1];
    }

Kto wpadł na genialny pomysł aby zaczynać iterować od 1!!!!!?? To woła o pomstę do nieba!

0

ok dzięki faktycznie rozwiązanie pierwsze zadziałało z blokadą wpisania tylko 1 znaku

 void __fastcall TGracze::EditGraczyKeyPress(TObject *Sender, char &Key)
{
        if (Key != VK_BACK)
        {
                if (EditGraczy->Text.Length() > 0)
                {
                        Key = 0;
                }
        }
}

drugie też pewnie będzie działać .... ;)

a co do pytania nr.2 to chodzi mi o to że liczbę graczy wpisuję w TForm2 a cała gra będzie w TForm1 więc jak tę liczbę graczy przechwycić ??

0

albo ustaw komponent jako public, albo zrób gettera..

0
PaKo1407 napisał(a)

a co do pytania nr.2 to chodzi mi o to że liczbę graczy wpisuję w TForm2 a cała gra będzie w TForm1 więc jak tę liczbę graczy przechwycić ??

W Unit1.cpp dodaj :

#include "Unit2.h"

Lub odpowiednio jeśli masz zmienione nazwy plików ,aby wskaźnik do Form2 był widoczny dla kodu Form1 np:

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ShowMessage(Form2->Label1->Caption) ;
}
//---------------------------------------------------------------------------

To najprostsze rozwiązanie .
Można też zastosować oddzielne zmienne dostępne dla obu formularzy , tworząc plik cpp z def i .h z deklaracjami +
include do obu Unitów 1 i 2 .
Lub przez zmienne :

//---------------------------------------------------------------------------
//FORM 2
#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
String a ;       // <--- zmienna dostępna dla Form1
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
      a = Label1->Caption ;
}
//---------------------------------------------------------------------------

Header Form1:

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

extern String a ;                       // <--- tylko deklaracja ! Zmienna definiowana w Form2 cpp 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Użycie:

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ShowMessage(a) ;
}
//---------------------------------------------------------------------------
0

OK wszystko działa ... Wielkie dzięki chłopaki ;)

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