Visual C++ - kako koristiti MFC kontrole?

poruka: 110
|
čitano: 14.059
|
moderatori: XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
14 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

Klikneš na Edit1 komponentu i u Object Inspectoru odabereš Events. Pronađi OnKeyPress event i tu napravi dvoklik:

 

#include <string>  //negdje na početku cpp datoteke

 

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, wchar_t &Key) {
    std::string str = "+-1234567890,";
    if (str.find(Key) == std::string::npos && Key != VK_BACK) {
       // Znak nije dozvoljen
       Key = 0;
    }
}

 

Iako, preporučujem da klikom na gumb na kraju svega napraviš provjeru unosa. Npr. nešto tipa ovo:

 

try{
    double pom = Edit1->Text.ToDouble();
    ShowMessage("Input ok");
}
catch(...){
    ShowMessage("input nije ok");
}

 

.. s druge strane, u TDBEdit komponenti validacija unosa je automatska. Sama kontrola prepozna koji tip vrijednosti očekuje te ne dopušta ništa drugo.

Poruka je uređivana zadnji put pet 24.6.2011 16:08 (TracerCPP).
Moj PC  
1 0 hvala 1
17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

kako klikom na gumb pokrenuti neki drugi program?

 

probao sam system("putanja...") ali neće :/

 

napomena, koristim VCL, a ne MFC

Atomska bubamara
 
0 0 hvala 0
15 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...

kako klikom na gumb pokrenuti neki drugi program?

 

probao sam system("putanja...") ali neće :/

 

napomena, koristim VCL, a ne MFC

Kako nece? Jesi li probao napraviti mali testni programcic u kojemu unutar maina stoji samo system() sa putanjom do programa? Kako ti tocno izgleda putanja?

 

Ali ako bas nece i nece, uvijek imas i ShellExecute

My computer once beat me at chess, but we got even after a round of boxing.
17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
rustweaver kaže...
Kako nece? Jesi li probao napraviti mali testni programcic u kojemu unutar maina stoji samo system() sa putanjom do programa? Kako ti tocno izgleda putanja?

sad sam skužio da radi samo sa windows programima, ali ne i sa nekim drugima

 

npr system("C:\\Windows\\notepad.exe") radi bez problema, samo što me smeta cmd prozor :)

 

rustweaver kaže...

Ali ako bas nece i nece, uvijek imas i ShellExecute

jel možeš dat primjer kako bi izgledao kod za pokretanje npr notepada?

Atomska bubamara
14 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

Zaboravi system i ShellExecute. Prva se koristi u C-u i kao što vidiš radi preko cmd-a. U windowsima pravilno je ovako:

 

WinExec("notepad.exe", SW_SHOW);  //SW_SHOWMAXIMIZED, SW_SHOWMINIZED

 

a ShellExecute ne služi za pokretanje aplikacije već otvaranje dokumenata (i ostalih operacija nad dokumentima) odgovarajućeg tipa. Npr:

 

ShellExecute(0, "open", "datoteka.txt", 0, 0, SW_SHOW); - otvara datoteka.txt u aplikaciji koja je registrirana da radi s txt ekstenzijom (notepad uglavnom)

ShellExecute(0, "open", "datoteka.doc", 0, 0, SW_SHOW); - otvara datoteka.doc u aplikaciji koja je registrirana da radi s doc ekstenzijom (MS Word...)

 

a može i:

ShellExecute(0, "open", "www.google.com", 0, 0, SW_SHOW); - otvara defaultni web browser i ide na google.com

 

Edit: Tracer

Poruka je uređivana zadnji put čet 15.9.2011 21:48 (tvzovac).
15 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

Ali i ShellExecute pokrece bilo koji tip datoteke, pa i izvrsne, bez problema. Radi istu stvar sto i otvaranje datoteka kroz explorer.

 

Bar u API-ju postoji 101 nacin za pokretanje drugih izvrsnih datoteka.

My computer once beat me at chess, but we got even after a round of boxing.
Poruka je uređivana zadnji put čet 15.9.2011 21:42 (rustweaver).
14 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

ShellExecute može pokretati izvršne programe no to nije njegova svrha. ShellExecute se koristi kod operacija nad datotekama i to mu je primarna namjena.

 

Inače, osim WinExec programi se mogu pokrenuti kreiranjem procesa:

 

STARTUPINFO startInfo;
PROCESS_INFORMATION processInfo;
char CommandLine[255] = "Notepad.exe";

GetStartupInfo(&startInfo);
if (!CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL,    &startInfo, &processInfo)) {
    ShowMessage("Cannot create process!");
}

Poruka je uređivana zadnji put čet 15.9.2011 21:51 (tvzovac).
 
0 0 hvala 1
17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
tvzovac kaže...

...

vidim tvzovac, reko moj čovjek, kad ono tracer, pa di ćeš bolje ;)

 

hvala!

Atomska bubamara
17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

kako u embarcadero rad studiu 2010 promjenit ikonu izvršne datoteke, znači gotovog programa? da ne bude ona njihova ikona, nego neka moja po želji :/

Atomska bubamara
 
0 0 hvala 0
14 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

Project/Options.../Application

 
1 0 hvala 1
17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

aaaaa, pa ne znam kako mi je to promaklo... {#}

Atomska bubamara
17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

radim jedan program sa više formi. u header datoteci za jednu formu sam deklarirao par globalnih varijabli, konkretno polje struktura, no to nije bitno. kako mogu te strukture koristiti i sa drugim formama? znači da kôd pišem na jednim cpp i h datotekama, a "vidim" varijable sa neke druge header datoteke. uključivanje sa #include ne pomaže :/

Atomska bubamara
 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

Umjesto da budu globalne deklariraj ih unutar klase (pod public). Tad ćeš im lagano moći pristupiti. Npr.

 

Form2->MojaVarijabla = 10;

17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
TracerCPP kaže...

...

Form2->MojaVarijabla = 10;

e, to, to! ja sam tako i pokušo, a znači samo sam ih još trebo deklarirat unutar klase...

 

hvala!

Atomska bubamara
17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

opet trebam pomoć :)

imam formu na kojoj se između ostalog nalaze i ListBox i dosta Edit polja. napravio sam da kad odaberem nešto u listboxu, da mi se u tim Edit poljima pokazuju detalji vezano uz to što sam odabrao. međutim imam problem sa Edit poljima u kojima se pojavljuju brojevi. zapravo su sve float ili double brojevi koje program učita iz datoteke i svi imaju najviše 4 decimale, a tijekom izvođenja programa u tim Edit poljima imaju 10, 12, 15 decimala, kako koji... kako napraviti da pokazuje onoliko decimala koliko zapravo i ima?

 

i decimalna točka je prikazana kao zarez, kako napraviti da bude baš točka?

Atomska bubamara | edomovina.blog.hr
 
0 0 hvala 0
15 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

Pomocu "sprintf" isprintas float na 4 decimale u nekakav buffer, tada petljom prodes kroz taj buffer i zareze zamjenis tockama. Tako ureden string posaljes u edit kontrolu. Kasnije, da bi iz edit kontrole dobio float samo obrnes proces, tocke u stringu koji dobijes iz edit kontrole zamijenis zarezima i taj string proslijedis funkciji "atof".

My computer once beat me at chess, but we got even after a round of boxing.
14 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...

opet trebam pomoć :)

imam formu na kojoj se između ostalog nalaze i ListBox i dosta Edit polja. napravio sam da kad odaberem nešto u listboxu, da mi se u tim Edit poljima pokazuju detalji vezano uz to što sam odabrao. međutim imam problem sa Edit poljima u kojima se pojavljuju brojevi. zapravo su sve float ili double brojevi koje program učita iz datoteke i svi imaju najviše 4 decimale, a tijekom izvođenja programa u tim Edit poljima imaju 10, 12, 15 decimala, kako koji... kako napraviti da pokazuje onoliko decimala koliko zapravo i ima?

 

i decimalna točka je prikazana kao zarez, kako napraviti da bude baš točka?

Čim brojevi imaju toliko dodatnih (izmišljenih) decimala očito je da su krivi i da nisu dobro učitani . Zato, prvo provjeri kako učitavaš te brojeve. Kasnije možeš koristiti FormatFloat ako bi htio zaokružiti te realne brojeve na određen broj decimala. Npr.;

 

float r = 92.567895;
Edit1->Text = FormatFloat("0.0000", r);  // zaokružuje na 4 decimale (92.5679)

 

Decimalna točka je prikazana kao zarez zbog regional settings postavki u windowsima. Za nas po defaultu za decimalni simbol je postavljen zarez. Ne isplati se raditi nikakve stringovne konverzije zareza u točku jer onda te konverzije moraš raditi nazad ako ti taj broj opet treba zbog matematičkih operacija. Ali ako već želiš onda možeš npr. ovako:

 

Edit1->Text = StringReplace(Edit1->Text, ",", ".", TReplaceFlags());

17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
rustweaver kaže...

...

hvala rust, ali pribjegao sam tracerovom rješenju ;)

 

TracerCPP kaže...
Čim brojevi imaju toliko dodatnih (izmišljenih) decimala očito je da su krivi i da nisu dobro učitani . Zato, prvo provjeri kako učitavaš te brojeve. Kasnije možeš koristiti FormatFloat ako bi htio zaokružiti te realne brojeve na određen broj decimala. Npr.;

 

float r = 92.567895;
Edit1->Text = FormatFloat("0.0000", r);  // zaokružuje na 4 decimale (92.5679)

 

Decimalna točka je prikazana kao zarez zbog regional settings postavki u windowsima. Za nas po defaultu za decimalni simbol je postavljen zarez. Ne isplati se raditi nikakve stringovne konverzije zareza u točku jer onda te konverzije moraš raditi nazad ako ti taj broj opet treba zbog matematičkih operacija. Ali ako već želiš onda možeš npr. ovako:

 

Edit1->Text = StringReplace(Edit1->Text, ",", ".", TReplaceFlags());

iskoristio sam oba rješenja i sad je baš onako kako sam zamišljao

 

hvala!

Atomska bubamara | edomovina.blog.hr
17 godina
neaktivan
offline
Dizajn GUI-a?

ovoga putam imam jedno "dizajnersko" pitanje

 

radim jedan programčić koji se sastoji od 4 dijela, odnosno 4 koraka. kako da napravim gui da to izgleda nekako normalno i prirodno? 4 forme pa da se otvara jedna nakon druge ili kako? jer mora postojati i mogućnost "back", znači kao kod instaliranja programa, "next" i "back". kako to pravilno izvesti? {#}

Atomska bubamara | edomovina.blog.hr
 
0 0 hvala 0
14 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

Ovdje možeš pogledati kako sam napravio takav setup s gumbima next i back kako tebi treba. U pravilu, tebi treba Frame (File/New/Other.../C++ Builder files). Na njega staviš nove objekte a kasnije i sam taj frame na formu  te preko Visible=true ili false odrediš kada treba biti vidljiv.

Moj PC  
1 0 hvala 1
17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

aha, bio sam blizu. ja sam isto to radio, samo sa Panelima, a ne Frameovima. isto sam tako Visible mjenjao u true ili false. bar sam bio na tragu ;)

Atomska bubamara | edomovina.blog.hr
17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

imam jedan problem koji ne mogu riješiti

 

recimo imam formu i dva framea

unutar klase jednog framea sam deklarirao npr polje intova a[5] i još drugih varijabli

u daljnjem kodu u toj source datoteci normalno koristim polje npr Edit1->Text = a[1] i sl.

e sad, trebam to polje koristit i na drugom frameu, samo je problem što mu ne mogu pristupiti sa Form1->Frame2->a[i], dok sve ostale varijable mogu dokučiti na taj način, ne znam u čemu je problem

 

izbacuje mi errore [BCC32 Error] Unit6.h(91): E2451 Undefined symbol 'Form1', a includao sam "Unit1.h" :/

Atomska bubamara | edomovina.blog.hr
 
0 0 hvala 0
17 godina
moderator
online
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...
izbacuje mi errore [BCC32 Error] Unit6.h(91): E2451 Undefined symbol 'Form1', a includao sam "Unit1.h" :/

Očito ne misli da si uključio (da nisi možda pokušao cirkularno uključiivanje? da ti Unit1 koristi Unit6 i Unit6 koristi Unit1?). Ne znam kako tu funkcionira stvar s namespaceovima - koristiš isti namespace? Jel u headeru Unit1.h imaš deklarirano Form1? Jesi siguran da nisi pogrešno utipkao naziv varijable?

17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

[BCC32 Error] Unit6.h(91): E2451 Undefined symbol 'Form1'
  Full parser context
    Unit1.cpp(6): #include Unit1.h
    Unit1.h(14): #include Unit6.h
    Unit6.h(17): class TFrame6
    Unit6.h(505): decision to instantiate: void TFrame6::export_mpc(int,FILE *)
    --- Resetting parser context for instantiation...
    Unit6.h(86): parsing: void TFrame6::export_mpc(int,FILE *)

 

 

to je sve što piše o greški

i u Unit1 je uključen Unit6 i obrnuto

 

u Unit6 se nalazi ta funkcija export_mpc koja treba koristiti to polje sa Unita 1, ali ne ide

 

 

evo kako to sve izgleda, pojednostavio sam maksimalno

u globanom dijelu klase u Unit1.h sam deklarirao polje struktura koje ima samo jedan element npr struct blabla a[5].a

funkcija koja je dio tog unita popuni tu strukturu sa podacima

recimo for (int i=0; i<5; i++) a[i].a = i;

i tu ih mogu normalno koristit, recimo for (int i=0; i<5; i++) printf("%d\n", a[i].a);

 

a recimo funkcija koja je dio Unita6, bi trebala pristupati onom polju struktura na ovaj način . for (int i=0; i<5; i++) printf("%d\n", Form1->Frame2->a[i].a); ali to ne radi, dok svim drugim varijablama mogu pristupiti na taj način

 

 

ili ajde mi onda pomozite kako negdje drugdje u globalnom području deklarirati polje struktura. pokušao sam odma u jednoj trećoj datoteci, u kojoj sam definirao strukturu, odma reklarirati i polje struktura

 

npr

struct blabla{

 int a;

}a[5];

 

problem je što kad koristim to polje, ispisuje mi sve nule, iako sam učitao određene vrijednosti

 

čiram podatke iz datoteke i spremam ih u polje struktura. ne znam je li problem u spremanju vrijednosti u strukturu ili uzimanje vrijednosti iz strukture i zapisivanje u drugu datoteku. jer sam sa debuggerom vidio da normalno čita iz prve datoteke

Atomska bubamara | edomovina.blog.hr
Poruka je uređivana zadnji put pet 21.10.2011 1:11 (jurluk).
14 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...

imam jedan problem koji ne mogu riješiti

 

recimo imam formu i dva framea

unutar klase jednog framea sam deklarirao npr polje intova a[5] i još drugih varijabli

u daljnjem kodu u toj source datoteci normalno koristim polje npr Edit1->Text = a[1] i sl.

e sad, trebam to polje koristit i na drugom frameu, samo je problem što mu ne mogu pristupiti sa Form1->Frame2->a[i], dok sve ostale varijable mogu dokučiti na taj način, ne znam u čemu je problem

 

izbacuje mi errore [BCC32 Error] Unit6.h(91): E2451 Undefined symbol 'Form1', a includao sam "Unit1.h" :/

Nakon što postaviš frameove na formu nema potrebe da jedan frame čita podatke iz drugog framea na taj način jer sve sve zapravo odvija u Form1. Ti si vjerojatno pisao code u samom frameu (tamo gdje ga se prvi put oblikuje  kada se stvori) umjesto da si pisao code za frameove u Form1 (na instanciranim frameovima).

 

EDIT: Da. Sad kad sam vidio ovu tvoju prošlu poruku potvrdio si ovo o čemu sam pisao. Znači, kada kreiraš frame u njega samo postavi komponente a kada frame staviš na formu tek tada definiraj akcije (evente) i piši code.

Poruka je uređivana zadnji put pet 21.10.2011 1:19 (TracerCPP).
17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

LOL, evo pomoglo je

dakle ovako

 

imam npr Form1, Frame2 i Frame3

sad sam polje struktura deklarirao u globalnom području u klasi za Form1 i sve funkcije iz Frame2 i Frame6 sam premjestio u Form1

iako u Frameu2 i Frameu6 pozivam funkcije koje sam sad deklarirao u Form1, a prvo su bile svaka u svojem Frameu, pozovem ih preko Form1->ime_funkcije() i radi bez problema

imam još drugih frameova kojima trebaju te strukture sa Forme1 dohvatim ih sa Form1->blabla i nema problema

i uz još malo nekih sitnih preinaka, sada sve radi savršeno

 

još malo poliranja i program je gotov :D


hvala puno!

Atomska bubamara | edomovina.blog.hr
17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

imam problem sa dinamičkom alokacijom polja struktura

 

unutar klase kao public definiram pokazivač na strukturu, primjer:

 

struktura *polje;

kasnije kad tijekom rada saznam koliko veliko polje trebam, alociram memoriju za to polje

 

polje = (struktura *) malloc (N * sizeof(struktura));

 

ali program se sruši kad dođe do dijela gdje je u kodu npr ovo:

 

polje [i].a = nesto;

 

e pošto je polje dinamički alocirano, mislio sam da treba elementima pristupati preko strelice

 

polje [i]->a = nesto;

 

ali tada prilikom kompajliranja kompajler izbaci grešku Pointer to structure required on left side of -> or ->*

 

a neće ni sa polje = new struktura [N];

i

delete [] polje;

 

gdje je greška? :/

Atomska bubamara | edomovina.blog.hr
 
0 0 hvala 0
17 godina
moderator
online
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...

imam problem sa dinamičkom alokacijom polja struktura

 

unutar klase kao public definiram pokazivač na strukturu, primjer:

 

struktura *polje;

kasnije kad tijekom rada saznam koliko veliko polje trebam, alociram memoriju za to polje

 

polje = (struktura *) malloc (N * sizeof(struktura));

Nisam "doma" na tom području, no moram postaviti pitanje - zašto? U C++-u si, koristiš strukture - gdje tu u priču ulazi malloc?

 

jurluk kaže...
a neće ni sa polje = new struktura [N];

i

delete [] polje;

 

gdje je greška? :/

Da ne znam bolje, rekao bih da iza deklaracije strukture nisi stavio točku-zarez.

 

Promotri ovaj za bezveze napisani primjer:

 

#include <iostream>

using namespace std;

int main()
{
    struct struktura {
        int a;
        char b;

        struktura() { a = 0; b = 'a'; }
    };

    cout << "Upisi broj elemenata polja: ";
    int count;
    cin >> count;

    struktura *polje;
    polje = new struktura[count];

    int broj;

    do {
        cout << "Upisi u polje: \n:: broj: ";
        cin >> broj;
        cout << ":: a: ";
        cin >> polje[broj].a;

    } while (broj != 0);

    cout << "Sve skupa\n\n";
    for (int i = 0; i < count; i++) cout << polje[i].a << endl;

    delete [] polje;

    return 0;
}

Tu sve radi.

Poruka je uređivana zadnji put sub 22.10.2011 21:46 (mbaksa).
14 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...

imam problem sa dinamičkom alokacijom polja struktura

 

unutar klase kao public definiram pokazivač na strukturu, primjer:

 

struktura *polje;

kasnije kad tijekom rada saznam koliko veliko polje trebam, alociram memoriju za to polje

 

polje = (struktura *) malloc (N * sizeof(struktura));

 

ali program se sruši kad dođe do dijela gdje je u kodu npr ovo:

 

polje [i].a = nesto;

U C++u nemoj koristiti malloc jer ćeš kad-tad napraviti grešku. Objekti alocirani s malloc ne pozivaju konstruktor, niti free poziva destruktor. Zato, koristi new i delete ili smart pointere iz boost biblioteke (npr. auto_ptr ili scoped_ptr u ovom slučaju).

 

Što se tiče tvog problema, opiši kakva greška se događa. Gdje se nalazi deklaracija i alokacija strukture a gdje pristupaš njenim članovima? Sve je u istoj funkciji ili?

17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
mbaksa kaže...
Nisam "doma" na tom području, no moram postaviti pitanje - zašto? U C++-u si, koristiš strukture - gdje tu u priču ulazi malloc?

pa nije da se sa malloc ne može alocirati polje struktura, koliko vidim po primjerima sa neta može se

 

TracerCPP kaže...
Što se tiče tvog problema, opiši kakva greška se događa. Gdje se nalazi deklaracija i alokacija strukture a gdje pristupaš njenim članovima? Sve je u istoj funkciji ili?

evo što se konkretno dogodi tijekom izvođenja programa

 

 

deklaracija je ovdje

 

class TForm1 : public TForm
{
__published:    // IDE-managed Components
    ...
private:    // User declarations
public:       // User declarations
    ...
    struktura *polje;
    int func();
    ...
};

 

alokacija je ovdje

 

int func(){
    ...
    polje = (struktura*) malloc (N * sizeof(struktura));
    ...
    free(polje);
}

 

članovima pristupam preko drugih funkcija

Atomska bubamara | edomovina.blog.hr
Poruka je uređivana zadnji put ned 23.10.2011 14:39 (jurluk).
Nova poruka
E-mail:
Lozinka:
 
vrh stranice