[ Pobierz całość w formacie PDF ]
.14.Z kolei menu Edycja zaprojektujemy według przepisu pokazanego na rysunku 6.13.112Borland C++Builder 5.wiczenia praktyczneRys.6.13.MenuEdycja wraz zodpowiednimiprzypisaniami winspektorze obiektówNa wydruku 6.4 zamieszczono kompletny kod aplikacji Projekt07.bpr.W funkcji FormCreate()wykorzystaliśmy właściwości InitialDir oraz Filter obiektów TOpenDialog iTSaveDialog, z których pierwsza pozwala już w momencie uruchomienia aplikacji ustalićwłaściwą ścieżkę dostępu do aktualnego katalogu, z kolei druga z wymienionych zapewniamożliwość odczytania plików posiadających wymagane przez nas rozszerzenia.W tej samejfunkcji umieściliśmy również dymki podpowiedzi do poszczególnych przycisków, korzystając zwłaściwości Hint oraz ShowHint.Zledząc poniższy wydruk zauważymy też, że aby komponentyTOpenDialog i TsaveDialog, niewidoczne przecież w trakcie uruchomienia programu,generowały zdarzenia polegające na wyświetleniu odpowiednich okien dialogowych, należy wfunkcjach odpowiednich zdarzeń skorzystać z metody Execute().Plik z dysku odczytujemykorzystając z metody LoadFromFile(), zapisujemy zaś przy pomocy SaveToFile().W funkcji CheckFileSave() skorzystaliśmy z właściwości Modified komponentówedycyjnych, w tym również klasy TRichEdit.Jeżeli wykonamy jakąkolwiek modyfikację oknaedycji, nastąpi wywołanie metody:virtual void __fastcall Modified(void) = 0 ;którą należy obsłużyć, chociażby w sposób zaprezentowany poniżej.Jeżeli zdecydujemy sięzapisać zmiany, zostanie wywołana funkcja obsługi zdarzenia FileSaveAsClick(this), wprzeciwnym wypadku nastąpi wywołanie funkcji Abort() wstrzymującej wykonywaniabieżącego zdarzenia.113W języku C++ istnieje słowo kluczowe this, będące ważnym elementem wielu tzw. przeładowywanych operatorów.Każda funkcja składowa aplikacji lub ogólnieobiektu w momencie wywołania uzyskuje automatycznie wskaznik do obiektu, któryją wywołał.Dostęp do tego wskaznika uzyskuje się dzięki słowu (wskaznikowi)this, który jest niejawnym parametrem wszystkich funkcji wchodzących w składobiektu (aplikacji).Jeżeli w pewnej, wydzielonej części aplikacji, np.w jakiejś funkcji, wywołujemyfunkcję obsługi zdarzenia, której argumentem jest z reguły wskaznik TObject*Sender, należy wówczas jawnie uzyskać do niego dostęp.Z reguły robimy tokorzystając właśnie ze wskaznika this.Wydruk 6.4.Kod modułu Unit07.cpp aplikacji wykorzystującej listę akcji TActionList w celuzorganizowania pracy głównego menu oraz całego programu.#include#pragma hdrstop#include "Unit07.h"#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;//--------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){}//--------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender){OpenDialog1->InitialDir = ExtractFilePath(ParamStr(0));OpenDialog1->Filter ="*.dat , *.txt, *.cpp, *.c, *.rtf | *.dat; *.txt; *.cpp;*.c; *.rtf";SaveDialog1->InitialDir = OpenDialog1->InitialDir;SaveDialog1->Filter = "*.*|*.*";RichEdit1->ScrollBars = ssVertical;FileNew->Hint = "Nowy plik Ctrl+N";FileNew->ShowHint = TRUE;FileOpen->Hint = "Otwórz plik Ctrl+O";FileOpen->ShowHint = TRUE;FileSave->Hint = "Zapisz jako.Ctrl+J";FileSave->ShowHint = TRUE;Copy->Hint = "Kopiuj Ctrl+C";Copy->ShowHint = TRUE;Paste->Hint = "Wklej Ctrl+V";Paste->ShowHint = TRUE;Cut->Hint = "Wytnij Ctrl+X";Cut->ShowHint = TRUE;Undo->Hint = "Cofnij Ctrl+Z";Undo->ShowHint = TRUE;}//--------------------------------------------------------------------114Borland C++Builder 5.wiczenia praktycznevoid __fastcall TForm1::CheckFileSave(void){if (RichEdit1->Modified){switch(MessageBox(NULL, "Zawartość pliku lub okna została"" zmieniona.Zapisać zmiany?", "Uwaga!",MB_YESNOCANCEL | MB_ICONQUESTION)){case ID_YES : FileSaveAsClick(this);case ID_CANCEL : Abort();};}}//--------------------------------------------------------------------void __fastcall TForm1::FileNewClick(TObject *Sender){CheckFileSave();RichEdit1->Lines->Clear();RichEdit1->Modified = FALSE;}//--------------------------------------------------------------------void __fastcall TForm1::FileOpenClick(TObject *Sender){CheckFileSave();if (OpenDialog1->Execute()){RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);RichEdit1->Modified = FALSE;RichEdit1->ReadOnly =OpenDialog1->Options.Contains(ofReadOnly);}}//--------------------------------------------------------------------void __fastcall TForm1::FileSaveAsClick(TObject *Sender){if (SaveDialog1->Execute()){RichEdit1->Lines->SaveToFile(SaveDialog1->FileName);RichEdit1->Modified = False;}}//--------------------------------------------------------------------void __fastcall TForm1::UndoClick(TObject *Sender){if (RichEdit1->HandleAllocated())SendMessage(RichEdit1->Handle, EM_UNDO, 0, 0);}//--------------------------------------------------------------------void __fastcall TForm1::CutClick(TObject *Sender){RichEdit1->CutToClipboard();}//--------------------------------------------------------------------void __fastcall TForm1::PasteClick(TObject *Sender){RichEdit1->PasteFromClipboard();}//--------------------------------------------------------------------void __fastcall TForm1::CopyClick(TObject *Sender)115{RichEdit1->CopyToClipboard();}//--------------------------------------------------------------------void __fastcall TForm1::CloseApplicationClick(TObject *Sender){switch(MessageBox(NULL, " Działanie aplikacji zostanie"" zakończone.", "Uwaga!", MB_YESNOCANCEL | MB_ICONQUESTION)){case ID_YES :{if (RichEdit1->Modified)CheckFileSave();Application->Terminate();}case ID_CANCEL : Abort();};}//--------------------------------------------------------------------Funkcje zdarzeniowe CutClick(), PasteClick(), CopyClick(), towarzyszące podmenuEdycja oraz zaimplementowane w odpowiednich przyciskach zgrupowanych w paneluToolBar1, czyli Cut, Paste, Copy korzystają z metod RichEdit1->CutToClipboard(),RichEdit1->PasteFromClipboard()i RichEdit1->CopyToClipboard().Funkcje teumożliwiają także usuwanie fragmentu tekstu, wstawianie fragmentu tekstu znajdującego się wschowku (ang.clipboard) oraz kopiowanie fragmentu tekstu do schowka.Możliwe jest równieżzaznaczanie całości tekstu przy wykorzystaniu metody RichEdit1->SelectAll().Abypowtórzyć ostatnio wykonaną (na tekście) operację, należy skorzystać z metody RichEdit1->HandleAllocated(), umieszczonej w funkcji obsługi zdarzenia UndoClick().Przykład wykorzystania komponentów TApplicationEvents oraz TTimerwiczenie 6.5.1.Załóżmy na dysku oddzielny katalog i nazwijmy go \Projekt08.2.Zaprojektujmy formularz w ten sposób, aby składał się z dwóch komponentówTButton oraz po jednym TTimer i TApplicationEvents, tak jak pokazuje to rys.6.14.116Borland C++Builder 5.wiczenia praktyczneRys.6.14.Komponentyformularza projektuProjekt08.bpr3 [ Pobierz całość w formacie PDF ]