[ Pobierz całość w formacie PDF ]
Rysowanie po pulpicieOg�lnie m�wi�c rysowanie po obiektach wizualnych jest mo�liwe bez wzgl�du na to czy posiadaj� one klas�Canvas czy nie. Je�li maj� to sprawa jest prosta. Je�li nie maj� to trzeba si� do nich dosta�za pomoc� uchwytu. W tej lekcji nauczymy si� rysowa� po pulpicie, a wi�c poza obszarem formy.Osi�gniemy to pobieraj�c uchwyt pulpitu.Mo�na tu skorzysta� z dw�ch funkcji:GetWindowDC(Form->Handle) lub GetDC(NULL).Funkcja GetDC gdy podamy jej argument 0 pobierze uchwyt do pulpitu.Przyk�adNa form� k�adziemy 1 ButtonZdarzenie OnClick uzupe�niamyTCanvas *C = new TCanvas;// stworzenie obiektu typu CanvasC->Handle = GetDC(0);// pobranie uchwytu do pulpituC->Pen->Color = clRed;// kolor obramowaniaC->Pen->Width = 3;// szerokosc linii obramowaniaC->Brush->Color = clMoneyGreen;// kolor wypelnieniaC->Ellipse(50, 50, 600, 180);// kreslenie elipsyReleaseDC(0, C->Handle);// zwalnianie uchwytudelete C;// usuniecie obiektu CanvasJe�li chcemy malowa� na samej formie to wystarczy �e skorzystamy z metody Canvas formyForm1->CanvasOdczyt nazwy, rozmiaru i rozszerzenia plikuOdczyt rozmiaru plikuBardzo cz�sto zachodzi potrzeba odczytu rozmiaru pliku na dysku.Niekiedy z czystej ciekawo�ci chcemy wiedzie� jaki rozmiar ma wybrany plik,w innych sytuacjach chcemy sprawdzi� czy rozmiar pliku przesy�anego do kolegi czy kole�anki nie przewy�sza dopuszczalnego rozmiaru. Nie b�dziemy si� tu m�czy� funkcjami rodem z biblioteki io.h,ale tak jak zwykle u�yjemy "mocy" biblioteki VCL.Skorzystamy przy tym z klasy TFileStream.Na form� k�adziemy Button oraz dwa Labele. W obs�udze zdarzenia OnClick przycisku wpisujemyTFileStream *Str = new TFileStream("nazwa_pliku.roz", fmOpenRead);// otwarcie pliku z w�a�ciwymi prawami dost�pu__int64 rozmiar = Str->Size() / 1000;// w�a�ciwy odczyt rozmiaru pliku w KBdelete Str;// zwalnianie zasobuif(rozmiar < 1000){Label1->Caption = IntToStr(rozmiar);Label2->Caption = "[kB]";}else{Label1->Caption = IntToStr(rozmiar/1e+03);// rozmiar w MBLabel2->Caption = "[MB]";}T� metod� za�atwili�my rozmiar pliku. Kr�tkie podsumowanie. Otwieramy plik tylko z prawem do czytania (bo i po co wi�cej). Korzystamy z metody Size(), zwracaj�cej rozmiar pliku w bajtach. Otrzyman� wielko�c odpowiednio formatujemy oraz usuwamy strumie� TFileStream. O zwalnianiu zasobu strumienia wtedy kiedy z niego ju� nie korzystamy nale�y bezwzgl�dnie pami�ta�!Odczyt nazwy plikuNa form� k�adziemy komponenty: OpenDialog z palety Dialogs, Label oraz Button.Do odczytu nazwy pliku skorzystamy z funkcjiAnsiString ExtractFileName(AnsiString nazwa_pliku).Gdy nie skorzystamy z tej funkcji to wpisuj�c taki oto kodString nazwa_pliku = OpenDialog1->FileName;Label1->Caption = nazwa_pliku;i za�adujemy dowolny plik np. kotki.jpg z katalogu g��wnego dysku i to otrzymamy napis:I:\kotki.jpgA nam przecie� chodzi�o o same kotki.jpg.Poni�ej poprawny kodString nazwa_pliku = ExtractFileName(OpenDialog1->FileName);Label1->Caption = nazwa_pliku;Odczyt rozszerzenia plikuRozszerzenie jest zwykle bardzo u�yteczne. Dzi�ki niemu wiadomo, do jakiej grupy plik�w nale�y wybrany plik. Jako przyk�ad podam odczyt rozszerzenia pliku, aby sprawdzi� czy mo�na go wy�wietli� na obiekcie Image. Rozszerzenie jest cz�ci� nazwy pliku, sk�adaj�ce si� z kropki wraz z kilkoma znakami. W DOSie obowi�zywa�a konwencja zapisu nazy pliku 8.3, to znaczy 8 znak�w nazwy + 3 znaki rozszerzenia. Je�li nazwa lub rozszerzenie przekracza�o maksymaln� dozwolon� ilo�� znak�w to by�o one zast�powane znakiem ~.Skorzystamy z funkcjiAnsiString ExtractFileExt(AnsiString nazwa_pliku)void __fastcall TForm1::Button1Click(TObject *Sender){if(OpenDialog1->Execute()){if(!OpenDialog1->FileName.IsEmpty())// jesli wybrano plik{String roz = ExtractFileExt(OpenDialog1->FileName);Label1->Caption = roz;}}}Czasami mo�e si� przyda� tak�e funkcja odczytuj�ca liter� dysku na kt�rym znajduje si� plikAnsiString ExtractFileDrive(AnsiString nazwa_pliku)zwracaj�cy wynik w postaci litera_dysku:np. H:Operacje na pami�ciW pami�ci RAM, tzw pami�ci danych przechowywane s� zmienne wymagane podczas pracy programy.Sam program jest �adowany do pami�ci, tyle �e jest to pami�� programu.Poni�ej przedstawi� przydatne funkcje, u�atwiaj�ce prac� z pami�ci�.funkcja memset - przydatna gdy chcemy zape�ni� pami�� tymi samymi elementami, np. zerami.void *memset(void *bufor, char znak, rozmiar bufora)Przyk�adK�adziemy na form� 1 Button oraz 2 Labele.Zdarzenie OnClick przycisku uzupe�niamyvoid __fastcall TForm1::Button1Click(TObject *Sender){char bufor[] = "www.doctor.programuj.com";Label1->Caption = bufor;memset(bufor, '0', 5);Label2->Caption = bufor;}Jak wida�, funkcja memset zast�pi pi�c pierwszych znak�w naszego bufora zerami, czyli zacznie czy�ci� bufor.W aplikacjach konsolowych wymaga w��czenia bibliotek#include <string.h>#include <stdio.h>#include <mem.h>funkcja memcpy kopiuje blok n-bajt�w ze �r�d�a do miejsca docelowego.void *memcpy(void *przeznaczenie, const void *zrodlo,int n)Przyk�advoid __fastcall TForm1::Button1Click(TObject *Sender){char zrodlo[] = "******************************";char przeznaczenie[] = "abcdefghijlkmnopqrstuvwxyz0123456709";char *ptr;Label1->Caption = przeznaczenie;ptr = (char *) memcpy(przeznaczenie, zrodlo, strlen(zrodlo));if (ptr)Label2->Caption = przeznaczenie;elseShowMessage("b��d memcpy\n");}W aplikacjach konsolowych wymaga do��czenia mem.h, string.h.funkcja memcmp por�wnuje dwa bloki pami�ci na d�ugo�ci pierwszych n-bajt�w.int memcmp(const void *blok1, const void *blok2, int n)Funkcja zwraca warto�� r�wn� zero je�li por�wnywane bloki s� r�wne. W innym przypadku zwraca warto�� r�n� od zera.1 przypadek: bloki nie s� takie same.char *blok1 = "ABCDE123";char *blok2 = "ABCDe237";int status = memcmp(blok1, blok2, 5);//The strings to position 5 are:if (status)Label1->Caption = "Nie takie same";if(status == 0)Label1->Caption = "Takie same";Zwracam uwag�, �e por�wnywane jest tylko 5 pierwszych znak�w z ka�dego bloku.2 przypadek: por�wnywane bloki s� takie same.char *blok1 = "ABCDE123";char *blok2 = "ABCDE237";int status = memcmp(blok1, blok2, 5);//The strings to position 5 are:if (status)Label1->Caption = "Nie takie same";if(status == 0)Label1->Caption = "Takie same";Wymagane biblioteki mem.h, string.h.Rezerwacja bloku pami�ci o d�ugo�ci n-bajt�w - funkcja malloc.void *malloc(int n)Je�li operacja alokacji pami�ci przebiegnie poprawnie, funkcja zwraca wska�nik do bloku pami�ci. Je�eli nie ma wystarczaj�co du�o miejsca w pami�ci n aalokacj� bloku, to funkcja malloc zwraca NULL.char *wskaznik;// wskaznik do bloku pamieciif ((wskaznik = (char *) malloc(50)) == NULL)// rezerwacja 10 bajt�w pami�ciLabel1->Caption = "Nie uda�o si� zarezerwowa� pami�ci";else{Label1->Caption = "Zarezerwowa�em pami��";strcpy(wskaznik, "Kopiuj� przyk�adowe dane do pami�ci");Label2->Caption = wskaznik;}Wymagane biblioteki alloc.h, stdlib.h.Pozosta�e funkcje do przydzia�u pami�ci:void *realloc(void *block, int n) - zmienia rozmiar przydzielonej poprzednio pami�ci na n-bajt�w.void *calloc(int n, int rozmiar_zmiennej) - do dynamicznego przydzia�u pami�ci. Rezerwacja n-jednostek pami�ci.Przyk�adchar *wskaznik = NULL;wskaznik = (char *) calloc(10, sizeof(char));// alokacja 10 jednostek typu charstrcpy(wskaznik, "doctor");Label1->Caption = wskaznik;free(wskaznik);Zwalnianie przydzielonej pami�ci - skoro umiemy j� alokowa�, to musimy umie� j� i zwalnia�.S�u�y do tego funkcja free.void free(void *block)Zwalnianie pami�ci w powy�szym przyk�adzie:free(wskaznik);Operacje na plikachW bibliotece VCL zaszyte s� pot�ne mo�liwo�ci operacji na plikach.Umo�liwiaj� one w pe�ni funkcjonalne zarz�dzanie zbiorem plik�w na dyskach.Pierwsz� funkcj� b�dzieCopyFile(char nazwa_pliku, char nazwa_pliku_w_nowej_lokalizacji, int FailifExists)Funkcja pobiera 3 argumenty. Nazwy plik�w podajemy w postaci typu char.Ostatni parametr FailifExists m�wi o tym, jak ma si� zachowa� program je�li plik o tej samej nazwie ju� istnieje.I tak:je�li FailifExists = 0 to je�eli istnieje plik o tej samej nazwie to zostanie nadpisanyje�li FailifExists = 1 to je�eli istnieje plik o tej samej nazwie to nie zostanie nadpisany.Inaczej m�wi�c operacja kopiowania nie powiedzie si�.Zmiana nazwy / przenoszenie pliku do innej lokalizacjiMoveFile(char obecna_nazwa, char nowa_nazwa)Zmiana nazwy plikuRenameFile(AnsiString stara_nazwa, AnsiString nowa_nazwa)Usuwanie plikuDeleteFile(AnsiString nazwa_pliku)// zwraca true je�li istniejeSprawdzanie czy plik istniejebool FileExists(AnsiString nazwa)Tworzenie kataloguCreateDir(AnsiString nazwa)Usuwanie kataloguRemoveDir(AnsiString nazwa)Powy�sze funkcje zwracaj� warto�� true je�li operacja si� powiedzie, false w przeciwnym wypadku.Zwracanie bie��cej lokalizacjiAnsiString GetCurrentDir()Ustawianie bie��cej lokalizacjibool SetCurrentDir(AnsiString Dir)Sprawdzanie czy katalog istniejebool DirectoryExists(AnsiString Dir)// zwraca true je�li wybrany katalog istniejePrzyk�advoid __fastcall TForm1::Button1Click(TObject *Sender){AnsiString nazwa = "WBW-14436.avi";CopyFile(nazwa.c_str(), "11", 1);MoveFile(nazwa.c_str(), "NN");DeleteFile("NN");if(!DirectoryExists("Dir")){// je�li nie istnieje to j� stw�rzif(CreateDir("Dir"))// je�li utworzonoLabel2->Caption = "Utworzono katalog Dir";Label1->Caption = "Katalog wczesniej nie istnial";}... [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • grabaz.htw.pl
  •