380 likes | 499 Views
Počítače a programování 2. Tutoriál 3 8.3.2014 Jiří Šebesta. TÉMA. PROGRAMOV ÁNÍ V MS VISUAL STUDIU: Z ákladní pojmy Formulářová aplikace Příklady formulářových aplikací Objekt DataGridWiev Inverzní matice. Základní pojmy (1/4). Projekt pro Windows: hlavičkové soubory
E N D
Počítače a programování 2 Tutoriál 3 8.3.2014 Jiří Šebesta
TÉMA PROGRAMOVÁNÍ V MS VISUAL STUDIU: Základní pojmy Formulářová aplikace Příklady formulářových aplikací Objekt DataGridWiev Inverzní matice
Základní pojmy (1/4) Projekt pro Windows: hlavičkové soubory soubory xxx.h zdrojové soubory soubory xxx.c nebo xxx.cpp zdroje (resources) = především grafické objekty s danými vlastnostmi a chováním soubory xxx.rc(xxx.ico)
Základní pojmy (2/4) Zdroje: nabídky klávesové zkratky bitové rastry, ikony, kurzory znakové řetězce panely nástrojů dialogová okna • Dialogové okno: • základní objekt (každé okno je dialogové okno) • ovládací prvky v dialogovém okně jsou opět dialogová okna se speciálními vlastnostmi • platí princip nadřízený vs. podřízený dialog
Dialogové okno (resp. prvek): • vlastnosti (properties) – proměnné defi-nující vlastnosti okna (prvku)a události (events), tj. funkce vyvolané při vzniku určité události v objektu (okně), např. kliknutí myší Základní pojmy (3/4) • modalita oken • modální okno, ne-lze opustit bez za-vření (příznak stylu WS_VISIBLE nastaven) • nemodální lze kdykoli opustit (defokusovat)
Základní typy Win aplikací: • využívající MFC(Microsoft Foundation Class Library) • SDI (Single-document interface) – aplikace, kdy se pracuje pouze s jedním dokumentem • MDI (Multiple-document interface) – aplikace, kdy se pracuje s více dokumenty současně (např. MS Visual Studio je MDI aplikace) • Aplikace na bázi dialogu – jedno dialogové okno pro jednodušší programy • využívající standardní prostředky Windows • Formulářová aplikace pro Windows Základní pojmy (4/4) • Kde získat MS Visual Studio Professional 2008/2010: MSDN AA FEKT VUT v Brně
Založení projektu: Formulářová aplikace (1/10)
Tvorba formuláře (úprava vlastností + vkládání ovládacích prvků) : Formulářová aplikace (2/10)
Formulářová aplikace (3/10) this->ColorBox->BackColor= system::Drawing::Color::Transparent; this->ColorBox->Controls->Add(this->RB_blue); this->ColorBox->Controls->Add(this->RB_green); this->ColorBox->Controls->Add(this->RB_red); this->ColorBox->ForeColor= system::Drawing::SystemColors::ControlText; this->ColorBox->Location = System::Drawing::Point(2,86); this->ColorBox->Name = L"ColorBox"; this->ColorBox->Size = System::Drawing::Size(88, 100); this->ColorBox->TabIndex = 1; this->ColorBox->TabStop = false; this->ColorBox->Text = L"Color"; Automaticky vygenerovaný kód pro nastavení ovládacího prvku veform.h : • thisreprezentuje ukazatel na tento formulář
Generování funkce pro ošetření události Formulářová aplikace (4/10) ve form1.h je vygenero-vána hlavička funkce udá-losti, do které lze vepsat tělo s požadovaným kódem … private: System::Void RB_blue_Click(System::Object^ sender, System::EventArgs^e) { this->My_text->ForeColor = System::Drawing::Color::Blue; } …
Funkce main() ve Form1.cpp Formulářová aplikace (5/10) #include<stdafx.h> #include"Form1.h" using namespaceEx95; [STAThreadAttribute] int main(array<System::String ^> ^args) { Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // Create the main window and run it Application::Run(gcnew Form1()); return 0; } Projekt: Ex95
Windows Form aplikace ve MSVS2013: new project Formulářová aplikace (6/10) • Nelze založit formulářovou aplikaci přímo, je nutné nejprve založit prázdný projekt CLR Empty Project s vhodným jménem
Pro formulářovou aplikaci je třeba přidat v Project – Add (vyvolat pravým tlačítkem): UI – Windows Form s vhod-ným jménem např. MyForm.h nebo Form.h Formulářová aplikace (7/10)
Dále je třeba doplnit MyForm.cpp o následující kód: Formulářová aplikace (8/10) #include"MyForm.h" using namespaceSystem; using namespaceSystem::Windows::Forms; [STAThread] voidMain(array<System::String ^> ^args) { Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); Ex105::MyForm form; Application::Run(%form); return 0; } • Podle názvu projektu a formuláře upravit.
Nastavit v Project – Properties:Linker - System Formulářová aplikace (9/10)
Nastavit Linker – Advanced – Entry Point na jméno startovací funkce v MyForm.cpp, např.Main Formulářová aplikace (10/10)
Funkce main() ve Ex95.cpp Formulářová aplikace (5/5) #include<stdafx.h> #include<Form1.h> using namespace EX07_1; [STAThreadAttribute] int main(array<System::String ^> ^args) { // Enabling Windows XP visual effects before any controls are created Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // Create the main window and run it Application::Run(gcnew Form1()); return 0; } Projekt: Ex95
Příklady formulářových aplikací (1/7) • Vizuální návrh formuláře 1) Vytvořte formulářový program pro jednoduchou kalkulačku – sčítání, odečítání, násobení a dělení dvou racionálních čísel.
Funkce pro načtení textu z TextBoxu s koverzí na double Příklady formulářových aplikací (2/7) double get_A(void) { return System::Convert::ToDouble(this->text_A->Text); } double get_B(void) { return System::Convert::ToDouble(this->text_B->Text); } ovládací prvek formuláře TextBox pojmenovaný text_B proměnná TextBoxu volání konverzní metody ukazatel na tento formulář
Ošetření událostí – kliknutí na jednotlivá tlačítka Příklady formulářových aplikací (3/7) private: System::Void bt_plus_Click(System::Object^ sender, System::EventArgs^ e) { this->Res->Text = System::Convert::ToString(get_A()+get_B()); } … private: System::Void bt_div_Click(System::Object^ sender, System::EventArgs^ e) { this->Res->Text = System::Convert::ToString(get_A()/get_B()); } volání konverzní metody volání funkcí pro čtení vstupů ukazatel na tento formulář třídaSystem metoda třídy System Projekt: Ex96
Příklady formulářových aplikací (4/7) • Vizuální návrh formuláře 2) Vytvořte formulářový program pro jednoduchou databázi počítačů (položky: výrobce, cena a velikost paměti) se záznam až 20ti počítačů s dynamickým přístupem.
Sestavení vlastní knihovny funkci pocitac.h Příklady formulářových aplikací (5/7) #include<stdlib.h> #include<string.h> #include"stdafx.h" typedefstruct t_pc { char prod[ 20]; // name of the producer int price; // price of the computer float mem; // RAM capacity in GB }a_pc; void add(char* _prod, int _price, float _mem); // adding new computer void sort(void); // sorting according to the price t_pc* get_fwd(void);// point out to the next computer t_pc* get_bwd(void);// point out to the prev. computer int show_price(void);// get price of an added pc int show_cheap(void);// get price of the cheapest pc
Deklarace pole ukazatelů na záznamy + příklad funkce add() v pocitac.cpp Příklady formulářových aplikací (6/7) #include"stdafx.h" #include"pocitac.h"// definition of the struct t_pc t_pc *katalog[20];// array of pointers to computers int index=0; // first free position in the katalog int ptr=index-1; // pointer to a pc displayed in edits void add(char* _prod, int _price, float _mem) { t_pc *my_pc; my_pc = (t_pc*) malloc(sizeof(t_pc)); strcpy(my_pc->prod, _prod); my_pc->price = _price; my_pc->mem = _mem; katalog[ptr=index++] = my_pc; }
Přilinkování knihovny a ošetření události stisku tlačítka Add ve Form1.h Příklady formulářových aplikací (7/7) #pragma once #include"pocitac.h" using namespace System::Runtime::InteropServices; namespace EX07_3 { …. private: System::Void AddBtn_Click(System::Object^ sender, System::EventArgs^ e) { add((char*)Marshal::StringToHGlobalAnsi(ProdEdit->Text).ToPointer(), System::Convert::ToInt32(PriceEdit->Text), System::Convert::ToDouble(MemEdit->Text)); ShowLbl->Text = System::Convert::ToString(show_price()); } volání konverzní metody VisualString => *char Projekt: Ex97
Objekt DataViewGrid (1/3) počet sloupců a řádků text v hlavičkách sloupců this->DGW->ColumnCount = 5; this->DGW->RowCount = 1; this->DGW->Columns[0]->Name = "Name"; … this->DGW->Columns[4]->Name = "Plant"; jméno objektu index sloupce
text v hlavičkách řádků nelze Objekt DataViewGrid (2/3) text do datových řádků array<String^>^RowA = gcnewarray<String^>{"Adam","Aachen","Auto","*","**"}; this->DGW->Rows->Add(RowA); array<String^>^RowB = gcnewarray<String^>{"Bob","Brno","Basket","Buffalo","*"}; this->DGW->Rows->Add(RowB); přidání nového řádku a naplnění polem RowB definice pole znakových řetězců RowB
tabulka bez hlaviček Objekt DataViewGrid (3/3) numerická data do buněk DGW->Rows[m]->Cells[n]->Value = X[m][n].ToString("0.000"); konverze do VS stringu na 3 desetinná místa data jsou v poli double X[][] n-tý sloupec m-tý řádek
Inverzní matice (1/10) • Zadání: • Vytvořte program, který bude počítat inverzní matici. Správnost výpočtu ověřte. • Předpřipravený formulář Řešení krok za krokem
Gauss – Jordanova eliminační metoda: Inverzní matice (2/10) • Postup: • Shodnými úpravami v obou mati-cích je třeba matici A převést na jednotkovou matici, pak původní jednotková matice z pravé strany bude hledanou inverzní maticí A-1. A 1
Inverzní matice (3/10) Po Po
Inverzní matice (4/10) Po Po
Inverzní matice (5/10) Po Po
Po Inverzní matice (6/10) A-1
Algoritmus: Inverzní matice (7/10) • Shora => dolů
Ze spodu => nahoru Inverzní matice (8/10) Projekt: Ex98
Funkcevoid invert(TMatrix A, TMatrix U)(část shora – dolů): Inverzní matice (9/10) int i, j, k; double cf; for(i=0; i<3; i++) {cf = A[i][i]; for( j=0; j<3; j++) {A[i][j] /= cf; U[i][j] /= cf; } for(k=i+1; k<3; k++) {cf = A[k][i]; for(j=0; j<3; j++) {A[k][j] -=cf*A[i][j]; U[k][j] -=cf*U[i][j]; } } }
Funkcevoid invert(TMatrix A, TMatrix U)(část ze spodu – nahoru): Inverzní matice (10/10) for(i=2; i>=0; i--) for( k=i-1; k>=0; k--) { cf = A[k][i]; for(j=2; j>=0; j--) { A[k][j] -= cf*A[i][j]; U[k][j] -= cf*U[i][j]; } } • Společné programování v BPC2E (zveřejní se 10.3.) Projekt: Ex98sol
TÉMA NÁSLEDUJÍCÍHO TUTORIÁLU Matlab DĚKUJI ZA POZORNOST