Missa inte Amazon Prime Day i Dagens fynd

skicka resultat till "edit box" i Visual C++?

Permalänk
Medlem

skicka resultat till "edit box" i Visual C++?

Hej

En lite dum fråga kanske...

Nu är det så att jag håller på att göra ett simpelt program som kollar om ett tal är ett primtal....men så har jag på något sätt lyckats glömma hur man skriver till en edit box...

koden nedan är det som händer när jag trycker på knappen "Kontrollera tal"....

m_delare och m_tal är av typen "int" och m_prim är av typen "CString"

void CPrimecheckerDlg::OnOK()
{
int tal;
int i=1;
bool ejprim=false;

tal=m_tal;
UpdateData(TRUE);

do{
i++;

if(tal%i==0){
ejprim=true;
m_delare=i;
UpdateData(FALSE);
}

}while(i<(tal/2));

if(!ejprim){
m_prim="Talet ar ett primtal";
UpdateData(FALSE);
}

CDialog::OnOK();
}

Vad är fel?

P.S. Blev kaos med tabbarna men hoppas ni kan läsa det ändå...

Permalänk
Medlem

SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)"texten");

Den koden använder jag.

Svar på PS: Använd [ code] och [ /code]

Permalänk
Medlem

Vad ska stå vart i SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)"texten");

Har du lust att förklara vad den olika delarna står för...typ hwnd, WM_SETTEXT, 0, (LPARAM)

Har alldrig använt denna funktion innan....måste man ha med UpdateData då?

Förresten om man ska skicka en int till boxen blir det då (hwnd, WM_SETTEXT, 0, (LPARAM)variabel);

Permalänk
Medlem

Jag har inte hållit på med C++ mycket, men håller på att lära mig och den funktion jag använder för att ändra text i en edit-ruta är just den funktionen.
Allt som jag försöker förklara här har jag lärt mig på denna sida: http://www.winprog.org/tutorial/
Mycket bra guide!

Alla kontroller och fönster har ett ID som är unikt för just dem, även edit-rutor. Detta nummer kallas hwnd, du måste veta det för att ändra värdet.
WM_SETTEXT är en konstant som säger just vad funktionen - som SendMessage anropar - ska göra med de värden man skriver in.
(WPARAM) används inte i detta fallet, därav 0an.
(LARAPM) är för funktionen WM_SETTEXT texten som ska läggas in i rutan med ID-nummret som står i hwnd.

Korrekt gissat att du skriver in variabeln efter (LPARAM).

Permalänk
Medlem

ok tack...

men jag får felmeddelandet:

"SendMessage": function does not take 4 parameters

hwnd sätter jag till tex IDC_EDIT2....det är boxens ID...me du säger att det ska vara ett nummer?

???

Permalänk
Medlem

IDC_EDIT2 kanske innehåller siffror.. en variabel?

Visa signatur

~ When there's no more room in hell, the dead will walk the earth. ~

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av ASTRX
ok tack...

men jag får felmeddelandet:

"SendMessage": function does not take 4 parameters

hwnd sätter jag till tex IDC_EDIT2....det är boxens ID...me du säger att det ska vara ett nummer?

???

hwnd = Window Handle. Blir tilldelat automatiskt av Windows när du skapar kontrollen och är alltså inte samma sak som IDC_EDIT2 (som du kan välja själv).

För att skicka med ett tal eller annan typ av variabel måste du göra om det till en c-sträng först, med t ex sprintf().

För att få bort ditt felmeddelande pröva skriv ::SendMessage, dvs med två kolon före.

Mer info om det på MSDN (sök på sendmessage).

I ditt fall kanske det är enklare att använda någon av MFC's klasser (så du kan skicka med ditt IDC_EDIT2 istället för hwnd) för att ändra värdet, har dock ingen aning om hur man gör eftersom jag aldrig använt MFC.

Permalänk
Hedersmedlem

Lite anmärkningar på själva algoritmen. Den kommer att säga att 2 inte är ett primtal och den tittar på onödigt många tal. Det finns givetvis ännu bättre men här är en lite mer optimerad algoritm.

int tal; int i=3; bool ejprim=false; tal=m_tal; UpdateData(TRUE); if (tal != 2 && tal%2) ejprim = true; else if (tal != 2) while(i<sqrt(tal)) { if(tal%i==0) { ejprim=true; m_delare=i; UpdateData(FALSE); } i+=2; }

Visa signatur

The variable 'brain' is declared but never used

Permalänk
Medlem

jag vet :D...tänkte lägga till det med 2an senare ville bara få det att funka först...

Citat:

hwnd = Window Handle. Blir tilldelat automatiskt av Windows när du skapar kontrollen och är alltså inte samma sak som IDC_EDIT2 (som du kan välja själv).

testade lite olika saker och sökte i MSDN men jag kom inte fram till vad hwnd gör...är där jag anger vilken Kontroll värdet skall skickas till?

någon som kan skriva hela SendMessage-raden så kanske jag förstår bättre. skall alltså skicka en text "Talet är ett primtal" till Edit Boxen med ID IDC_EDIT3.

Frågar man inget får man ingenting veta...

Permalänk
Medlem

Hur laddar du ditt fönster med alla kontroller?

Permalänk
Medlem

hur menar du?

Permalänk
Medlem

Hur skapar du ditt fönster?
Det verkar som om du laddar fönstret från en resource file, korrekt?

edit: Skapar du en Dialog så kan du använda denna funktion:

SetDlgItemText(hwnd, IDC_TEXT, "This is a string");

Där hwnd är ID för hela fönstret (det ID får du reda på när du skapar dialogen tror jag), IDC_TEXT vet du, och "This is a string" är texten som ska hamna i rutan.

Permalänk
Medlem

korrekt, jag laddar filen från en resource file.

dialogen heter ID_PRIMECHECKER_DIALOG, detta är allstå ID för fönstret? på properties står det ju: "ID: ID_PRIMECHECKER_DIALOG"

får fellmeddelandet: "SetDlgItemTextA": does not take 3 parameters

konstigt med tanke på att det borde vara 3 st...

så här har jag skrivit:

SetDlgItemText(IDD_PRIMECHECKER_DIALOG, IDC_EDIT3, "Talet är ett Primtal");

Permalänk
Medlem

testa SetDlgItemText(hWnd, IDC_EDIT3, "Talet är ett Primtal");

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."

Permalänk
Medlem

ERROR: "hWnd" undeclared identifier

måste jag deklarera HWND?

typ

HWND dialog;

sedan:

SetDlgItemText(dialog, IDC_EDIT3, "Talet är ett Primtal");

Permalänk
Medlem

IDD_PRIMECHECKER_DIALOG är inte fönstrets hwnd.
Om du skapar en dialog med CreateDialog så får du hwnd från det funktionen returnererar, alltså:

HWND dialogen = CreateDialog(blbalbala)

Alla funktioner som skapar rutor/fönster returnerar hwnd, så det är bara att spara nummret i en global variabel så du kan använda den vid ett senare tillfälle.

Permalänk
Medlem

okej det känns som jag tar mig vatten över huvudet nu...inte tillräckligt insatt i det här med fönster och hur allt är strukturerat....är van vid att bara behöva skriva cout<<

men jag vet att jag tidigare i skolan har kunnat skicka text till en kontroll genom att bara skriva

m_delare=i;
UpdateData(FALSE);

eller liknande...kommer inte precis ihåg...

går det inte att göra på det enkla sättet?

Permalänk
Medlem

Jo visst går det. Men då måste du göra en funktion som heter UpdateData och gör just det där krångliga vi går igenom nu :).

Hur ser kommandot ut som skapar fönstret?

Permalänk
Medlem

gaahhh....har inger förutom MSDN för problemlösning...och i vissa fall känns det som lite svår läsning när man precis gett sig in på fönster-program.

CPrimecheckerDlg::CPrimecheckerDlg(CWnd* pParent) : CDialog(CPrimecheckerDlg::IDD, pParent) { m_tal = 0; m_delare = 0; m_prim = _T(""); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CPrimecheckerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_tal); DDX_Text(pDX, IDC_EDIT2, m_delare); DDX_Text(pDX, IDC_EDIT3, m_prim); } BEGIN_MESSAGE_MAP(CPrimecheckerDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() END_MESSAGE_MAP() BOOL CPrimecheckerDlg::OnInitDialog() { CDialog::OnInitDialog(); ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); return TRUE; }

är det detta du menar?

Permalänk
Medlem

(ta bort smilys då det ser skumt ut i koden )

Mja, det där verkar mer vara funktionerna som styr dialogen, inte den som skapar den.
Sök i projektet efter CreateDialog, DialogBox, CreateWindow eller CreateWindowEx. Dessa funktioner är de jag vet för att skapa fönster/dialoger.

Permalänk
Medlem

Ingen som märkt att han använder mfc och inte win32api direkt? Minns inte riktigt hur men du ska ju lägga till en CString för att kontrollera editboxen, sen ändrar du den till vad det ska stå och anropar UpdateData.

Edit: Du kan få en pekare till en kontroll i mfc så här:

CEdit *editPtr = (CEdit *)GetDlgItem(VAD_DIN_EDIT_BOX_HETER); //sen kan man anropa tex editPtr->SetWindowText("blablabla");

Permalänk
Medlem

hittade inte någon av de i projektet...när jag skapade projektet använder jag mig av wizarden och skapade en MFC-Applikation...

jag ska envisas lite till....Hur kan det komma sig att UpdateData fungerade i skolan utan att behöva göra den själv? är det inte en färdig funktion för att uppdatera data i t.ex. en edit box?

det jag gjorde i skolan var att skriva in text i en editbox som kopierades över till en annan editbox när man tryckte på knappen...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Ereinion
Ingen som märkt att han använder mfc och inte win32api direkt? Minns inte riktigt hur men du ska ju lägga till en CString för att kontrollera editboxen, sen ändrar du den till vad det ska stå och anropar UpdateData.

Ok, då kan ju jag sluta skriva då jag använder Win32api och kan ingenting annat :).

Snor tråden lite: Hur lägger man ihop strängar och andra värden till samma char? Ex: char* = char* & int & char*
Ni förstår hoppas jag.

Permalänk
Medlem

UpdateData är en funktion i MFC så den finns ju redan. Du måste däremot koppla (eller vad man nu ska säga) en variabel till en kontroll för att uppdatera den med UpdateData.

Permalänk
Medlem

det har jag gjort...en variabel heter till exempel m_prim och är av typen CString.

Borde jag inte kunna skriva:

m_prim="talet är ett primtal";
UpdateData(FALSE);

eller har jag glömt nåt? för programmet bara avslutas när jag klickar på "Kontrollera tal"-knappen...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Don_Tomaso
Ok, då kan ju jag sluta skriva då jag använder Win32api och kan ingenting annat :).

Snor tråden lite: Hur lägger man ihop strängar och andra värden till samma char? Ex: char* = char* & int & char*
Ni förstår hoppas jag.

wsprintf borde funka, om man gör nåt sånt här tex
wsprintf(output, "%s %i", string, integer);

Visa signatur

flippy @ Quakenet

Permalänk
Medlem

Men har du kopplat ngn funktion till knappen? Visa koden som anropas.

Permalänk
Medlem

void CPrimecheckerDlg::OnOK() { // TODO: Add extra validation here int tal; int i=1; bool ejprim=false; CEdit *delare=(CEdit *)GetDlgItem(IDC_EDIT2); CEdit *prim=(CEdit *)GetDlgItem(IDC_EDIT3); tal=m_tal; do{ i++; if(tal%i==0){ ejprim=true; delare->SetWindowText(i); } }while(i<(tal/2)); if(!ejprim){ prim->SetWindowText("talet är ett primtal"); } CDialog::OnOK(); }

Permalänk
Medlem

CDialog::OnOK(); stänger väl alltid programmet?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av ante84
wsprintf borde funka, om man gör nåt sånt här tex
wsprintf(output, "%s %i", string, integer);

Tack, det fungerade, dock lite buggigt men fungerande. Tänkte spara rader i en vektor för att sen skriva ut allt, hur fungerar vektorer?
vector<char*> test;
Då får jag detta meddelande:
'vector' is used as a type, but is not defined as a type.

Jag har #include <vector> i koden.

edit: Det löste sig när jag satte "using namespace std;" under alla includes, om någon undrade.