Delphi __ Kompendium __ Roz12.pdf

(834 KB) Pobierz
Delphi :: Kompendium :: Roz...
Delphi :: Kompendium :: Rozdział 12 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_12
Logowanie | Rejestracja | Forum | Pomoc | Reklama | Szukaj
Strona główna :: Delphi :: Kompendium
Rozdział 12
Edytuj Historia
Delphi
Artykuły
Kompendium
Gotowce
FAQ
.NET
Turbo Pascal
FAQ
PHP
FAQ
Java
FAQ
C/C++
Artykuły
FAQ
C#
Wprowadzenie
Assembler
FAQ
(X)HTML
CSS
JavaScript
Z pogranicza
Algorytmy
WIĘCEJ »
WinAPI
Nie sposób było nie wspomnieć w tej książce o WinAPI. Z tym terminem zetknąłeś się już wielokrotnie podczas
lektury niniejszej publikacji. Teraz chciałbym omówić ten temat nieco dogłębniej. Nie jest możliwe bowiem
zawarcie wszystkich informacji dotyczących WinAPI w jednym rozdziale ? temat ten jest na tyle rozległy, że
można by mu poświęcić osobną książkę. Więcej o WinAPI możesz dowiedzieć się ze strony
http://msdn.microsoft.com lub z systemu pomocy Delphi (znajdziesz tam dokładny opis funkcji i procedur).
Spis treści
1 Czym tak naprawdę jest WinAPI?
1.1 Zasady tworzenia programów za pomocą WinAPI
1.2 Brak zdarzeń
1.3 Brak komponentów
1.4 Zalety wykorzystania WinAPI
2 Pierwszy program
3 Funkcja okienkowa
4 Rejestracja klasy
5 Tworzenie formularza
6 Komunikaty i uchwyty
7 Łańcuchy
7.1 Konwersja łańcuchów
7.2 Funkcje operujące na łańcuchach
7.2.1 CharLower, CharUpper
7.2.2 lstrlen
7.2.3 lstrcpyn
8 Tworzenie kontrolek
8.1 Umieszczanie kontrolek przy starcie programu
8.2 Flagi kontrolek
9 Obsługa zdarzeń
10 Uchwyty do kontrolek
11 Tworzenie bardziej zaawansowanych kontrolek
11.1 Pozostałe kontrolki
12 Wyświetlanie grafiki
12.1 Rysowanie w WinAPI
12.2 Kontekst urządzenia graficznego
12.3 Obsługa WM_PAINT
12.3.1 Zmiana koloru tła
12.4 Ładowanie i wyświetlanie bitmapy
13 Ładowanie zasobów
13.1 Skompilowane zasoby
13.2 Wykorzystanie zasobów
13.2.1 Wyświetlenie formularza
13.2.2 Ustawianie wartości komponentów formularza
13.3 LockResource, LoadResource, FindResource
13.4 Zapisywanie plików na dysku
14 Podsumowanie
Delphi
C/C++
Turbo Pascal
Assembler
PHP
Programy
Dokumentacja
Kursy
Komponenty
WIĘCEJ »
Można powiedzieć, że ten rozdział przeznaczony jest dla ?maniaków? Delphi w pozytywnym tego słowa
znaczeniu. Programowanie w WinAPI nie jest bowiem łatwe i wygodne, ale umożliwia zachowanie większej
kontroli nad programem.
Czym tak naprawdę jest WinAPI?
Pełna nazwa tego skrótu to Windows Application Programming Interface . Dla osób, które wcześniej tworzyły
swoje programy w Turbo Pascalu, biblioteka wizualna i klasy mogą wydać się dość niezrozumiałe. Z kolei dla
niektórych prostsze może okazać się rozpoczęcie pisania programów metodą API. Ty jednak jesteś już zapewne
przyzwyczajony do stosowania klas i komponentów, a WinAPI może Ci się wydać trudne lub po prostu
nieciekawe. Problem, którego rozwiązanie przy użyciu komponentów wymagało jednego wiersza kodu, przy
wykorzystaniu WinAPI może oznaczać konieczność napisania nawet kilkudziesięciu wierszy! Dlatego nie
zdziwię się, jeżeli ominiesz ten rozdział i przejdziesz od razu do kolejnego.
Zasady tworzenia programów za pomocą WinAPI
Wyobraź sobie pisanie programów bez wykorzystania formularzy, komponentów i wszystkich innych
udogodnień oferowanych przez Delphi. Nasze programy będą oparte jedynie na podstawowych modułach
Windows.pas i Messages.pas. Wszystkie funkcje, z których będziemy korzystać, zawarte są w bibliotekach DLL
systemu Windows. Ich załadowanie do programu odbywa się w module Windows.pas.
Nam, użytkownikom tych bibliotek, potrzebna jest wiedza o ich budowie ? liczbie i typie parametrów,
wartościach zwracanych przez funkcję itp. Stąd miej na uwadze perspektywę częstego zaglądania do pomocy
Delphi.
Przy tej okazji warto wspomnieć o możliwości choć częściowego nauczenia się języka C. System Windows był
pisany w tym języku, stąd opisy wszystkich funkcji API (deklaracje) są również w nim przedstawione. Jest to
pewna okazja do poznania choćby w małym stopniu budowy języka C.
Gdy kiedyś zaczniesz pisać programy w języku C++, znajomość WinAPI bardzo Ci się przyda! Nazwy funkcji są
takie same ? jedynie składnia nieco się różni.
Brak zdarzeń
1 z 18
2009-03-14 15:43
77981602.009.png 77981602.010.png 77981602.011.png 77981602.012.png 77981602.001.png 77981602.002.png 77981602.003.png
Delphi :: Kompendium :: Rozdział 12 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_12
Podczas pisania programów w ?czystym? API będziemy pozbawieni wygodnego mechanizmu, jakim są
zdarzenia. Jak pamiętasz z rozdziału 5., mechanizm zdarzeń można zastąpić poprzez komunikaty Windows.
Ten moment jest więc dobrą okazją, aby cofnąć się do rozdziału 5. i przypomnieć sobie zasadę funkcjonowania
komunikatów.
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 1.6790 sek. (zapytań SQL:
12)
Brak komponentów
W API będziemy musieli obyć się bez komponentów. Te ?klocki?, jakimi są komponenty, w dużym stopniu
odciążały nas od mozolnego operowania komunikatami czy pamięcią. Nie będziemy jednak pozbawieni
typowych kontrolek Windows, jak przycisk czy lista rozwijalna ? będziemy je tworzyć w kodzie programu za
pomocą funkcji CreateWindow .
Zalety wykorzystania WinAPI
Zastanawiasz się może, co takiego zyskasz, używając mechanizmów WinAPI? Powiem szczerze: niewiele.
Dużym plusem jest szybkość działania aplikacji oraz rozmiar. Programy tworzone w Delphi i wykorzystujące
VCL mają duże rozmiary. Nawet prosty program w postaci ?czystego? formularza potrafi zajmować grubo
ponad 300 kB. Aplikacje wykorzystujące jedynie WinAPI mogą zajmować nawet 16 kB i są wykonywane
znacznie szybciej. Różnica jest znaczna, nieprawdaż?
Czytając ten rozdział, masz możliwość zaznajomienia się z dotąd nieznanymi funkcjami, z których być może
będziesz musiał skorzystać w swoich programach, gdy VCL okaże się niewystarczający i zbytnio będzie Cię
ograniczał.
Głównymi zaletami Delphi są przecież biblioteka VCL, klasy oraz formularze, dzięki którym tworzenie
programów trwa znacznie krócej. Jeśli porzucisz te udogodnienia, pisanie aplikacji może zająć więcej czasu, a
nie po to chyba tworzono Delphi, prawda?
Podsumowując: WinAPI jest okazją do głębszego zaznajomienia się z tematyką programowania w systemie
Windows, lecz nie nadaje się do pisania dużych projektów.
Pierwszy program
Przypomnij sobie rozdział 2. Wówczas poznawałeś dopiero język Object Pascal, ale tworzone przez Ciebie
programy także nie zawierały żadnych komponentów czy formularzy. Te programy po skompilowaniu także
miały rozmiar kilkunastu kilobajtów ? można zatem powiedzieć, że już wtedy pisałeś programy WinAPI!
Zamknij formularz i Edytor kodu. Następnie z menu Project wybierz polecenie View Source . Kod źródłowy
projektu (pliku *.dpr) doprowadź do takiej postaci:
program Project1;
uses
Windows;
begin
end .
Na razie nie potrzebujemy pliku zasobów, więc usunąłem także dyrektywę {$R}. Ikonę naszego programu
możemy dodać w następnej kolejności. Tak powstały kod źródłowy zapisz gdzieś na dysku. Następnie z menu
Project wybierz polecenie Build , co spowoduje skompilowanie aplikacji i utworzenie pliku *.exe. Spójrz teraz na
rozmiar aplikacji ? u mnie jest to 14 kB! Na razie co prawda program jest ?pusty?, ale już wkrótce co nieco do
niego dodamy.
Funkcja okienkowa
Dotąd nasz program kończył pracę zaraz po uruchomieniu go ? w bloku begin nie ma przecież żadnej
instrukcji. Naszym celem jest napisanie takiego programu w WinAPI, który zakończyłby pracę po interwencji
użytkownika ? zamknięciu okna. Musimy więc napisać kod, który spowodowałby wyświetlenie formularza.
Jednym z etapów tworzenia takiego formularza jest napisanie funkcji okienkowej. Funkcja taka będzie
odpowiedzialna za odbieranie wszystkich komunikatów, które docierają do okna i ewentualną reakcję na dany
komunikat. Zadeklaruj więc w programie taką funkcję:
function WndProc ( Wnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM ) : LRESULT; stdcall ;
begin
end ;
Znaczenie parametrów tej funkcji jest następujące:
Wnd ? uchwyt do okna.
uMsg ? komunikat.
wPar ? pierwsza wartość komunikatu.
lPar ? druga wartość komunikatu.
Taka budowa jest nieprzypadkowa ? aby cały program został prawidłowo skompilowany, funkcja okienkowa
musi wyglądać tak, jak to przedstawiłem powyżej. Pierwszym komunikatem, jaki będzie obsługiwany przez
funkcję okienkową, jest WM_DESTROY . Program musi odpowiednio zareagować na próbę zamknięcia programu.
function WndProc ( Wnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM ) : LRESULT; stdcall ;
begin
{ na początek zwracamy wartość 0 ? meldunek jest przetwarzany }
Result := 0 ;
case uMsg of
{ w tym miejscu należy obsłużyć należne komunikaty }
{ w funkcji DefWindowProc przekazujemy takie same parametry, jak w funkcji okienkowej }
WM_DESTROY: PostQuitMessage ( 0 ) ;
else Result := DefWindowProc ( Wnd, uMsg, wPar, lPar ) ;
end ;
end ;
Jak widzisz, instrukcja case sprawdza, jaki komunikat został odebrany przez funkcję okienkową. W przypadku
odebrania komunikatu WM_DESTROY program kończy pracę ? PostQuitMessage . Na samym jednak początku
przypisujemy funkcji wartość zwrotną ? cyfrę 0. W przeciwnym wypadku ? jeżeli nadesłany komunikat ?nas
interesuje? ? przekazujemy go dalej, do domyślnego okna. Realizuje to funkcja DefWindowProc ; parametry
muszą być identyczne z parametrami funkcji okienkowej.
2 z 18
2009-03-14 15:43
RSS | Forum | Pastebin |
Regulamin | Pomoc | Usuń
cookies | Prawa autorskie |
Kontakt | Reklama
77981602.004.png 77981602.005.png
Delphi :: Kompendium :: Rozdział 12 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_12
Aby program został prawidłowo skompilowany, na liście uses musi znaleźć się moduł Messages.pas .
Rejestracja klasy
Aby cały formularz mógł zostać stworzony, uprzednio należy zarejestrować klasę. Rejestracja klasy następuje
poprzez wywołanie funkcji RegisterClass z modułu Windows.pas .
function RegisterClass ( const lpWndClass: TWndClass ) : ATOM; stdcall ;
W parametrze owej funkcji należy podać zmienną wskazującą rekord TWndClass :
TWndClass = packed record
style: UINT;
lpfnWndProc: TFNWndProc;
cbClsExtra: Integer ;
cbWndExtra: Integer ;
hInstance: HINST;
hIcon: HICON;
hCursor: HCURSOR;
hbrBackground: HBRUSH;
lpszMenuName: PAnsiChar ;
lpszClassName: PAnsiChar ;
end ;
Powyższy rekord określa wygląd formularza, kolor tła, styl i kursor. Znacznie parametrów jest następujące:
style ? parametr ów określa styl wyświetlanego okna. Możliwe jest mieszanie stylów za pomocą
operatora or.
lpfnWndProc ? jest to wskazanie na funkcję okienkową.
cbClsExtra ? liczba dodatkowych bajtów alokowanych wraz z rekordem.
cbWndExtra ? liczba dodatkowych bajtów alokowanych wraz z instancją okna.
hInstance ? uchwyt do zasobów.
hIcon ? identyfikacja formularza.
hCursor ? kursor używany w czasie wyświetlania formularza.
hbrBackground ? tło formularza. Możliwe jest zastosowanie jednej z poniższych wartości:
COLOR_ACTIVEBORDER, COLOR_ACTIVECAPTION, COLOR_APPWORKSPACE, COLOR_BACKGROUND,
COLOR_BTNFACE, COLOR_BTNSHADOW, COLOR_BTNTEXT, COLOR_CAPTIONTEXT, COLOR_GRAYTEXT,
COLOR_HIGHLIGHT, COLOR_HIGHLIGHTTEXT, COLOR_INACTIVEBORDER, COLOR_INACTIVECAPTION,
COLOR_MENU, COLOR_MENUTEXT, COLOR_SCROLLBAR, COLOR_WINDOW, COLOR_WINDOWFRAME,
COLOR_WINDOWTEXT.
lpszMenuName ? wskazanie na łańcuch określający menu używane w programie.
lpszClassName ? wskazanie na nazwę klasy (wartość typu PChar ).
Rejestracja nowej klasy może być wykonana w poniższy sposób:
var
Wnd: TWndClass; // klasa okna
begin
with Wnd do
begin
lpfnWndProc := @WndProc; // funkcja okienkowa
hInstance := hInstance; // uchwyt do zasobów
lpszClassName := 'My1stApp' ; // klasa
hbrBackground := COLOR_WINDOW; // kolor tła
end ;
RegisterClass ( Wnd ) ; // zarejestruj nową klasę
end ;
W moim przypadku nie było konieczne wypełnianie wszystkich pól rekordu TWndClass . Przypisałem jedynie te
pola, które wydawały się konieczne do uzyskania przynajmniej podstawowego wyglądu formularza.
Tworzenie formularza
Na szczęście tworzenie samego formularza nie jest czynnością zbytnio skomplikowaną. Realizuje to bowiem
jedna instrukcja ? CreateWindow :
function CreateWindow ( lpClassName: PChar ; lpWindowName: PChar ;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer ; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer ) : HWND;
Przyznasz, że ilość parametrów jest spora:
lpClassName ? nazwa klasy (wartość PChar ). Wartość ta musi się równać wartości wpisanej w rekordzie
TWndClass .
lpWindowName ? łańcuch określający tekst, który będzie wyświetlany na formularzu. Znaczenie
parametru można porównywać do właściwości Caption komponentów.
dwStyle ? styl okna (tabela 12.1).
x ? położenie formularza w poziomie. Wstawienie w to miejsce stałej CW_USEDEFAULT powoduje
automatyczne dopasowanie położenia przez system (nowe okno będzie przesunięte lekko w lewą stronę).
y ? położenie formularza w pionie. Wstawienie w to miejsce stałej CW_USEDEFAULT powoduje
automatyczne dopasowanie położenia przez system.
nWidth ? szerokość formularza. Tutaj także stała CW_USEDEFAULT powoduje automatyczne
dopasowanie szerokości.
nHeight ? wysokość formularza. Stała CW_USEDEFAULT powoduje dopasowanie wysokości formularza.
hWndParent ? uchwyt do okna rodzica.
hMenu ? wskazanie do menu, które ma być użyte w programie.
hInstance ? określa instancję modułu, który ma być kojarzony z programem.
Na podstawie tych danych utworzenie formularza może wyglądać tak:
3 z 18
2009-03-14 15:43
77981602.006.png
Delphi :: Kompendium :: Rozdział 12 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_12
CreateWindow ( 'My1stApp' , 'Pierwszy program w WinAPI' ,
WS_VISIBLE or WS_TILEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, 0 , 0 , hInstance, NIL ) ;
Tabela 12.1. Najczęstsze wartości określające styl okna
Wartość Opis
WS_OVERLAPPED Okno posiada pasek tytułowy oraz obramowanie
WS_CHILD Potomne okno, które nie może ?wyjść? poza okno rodzicielskie
WS_POPUP Okno dialogowe
WS_CAPTION Okno ma pasek tytułu
WS_SYSMENU Okno ma menu systemowe
WS_MINIMIZEBOX Okno ma przycisk minimalizacji
WS_MAXIMIZEBOX Okno ma przycisk maksymalizacji
WS_VISIBLE Okno jest widoczne
WS_HIDE Okno jest ukryte
WS_DISABLED Nieaktywne okno ? nie reaguje na zdarzenia
WS_BORDER Okno posiada ramkę
Listing 12.1. Pierwszy program napisany w WinAPI
{
Copyright (c) 2002 by Adam Boduch
}
program WndApp;
uses
Windows,
Messages;
function WndProc ( Wnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM ) : LRESULT; stdcall ;
begin
{ na początek zwracamy wartość 0 ? meldunek jest przetwarzany }
Result := 0 ;
case uMsg of
{ w tym miejscu należy obsłużyć należne komunikaty }
{ w funkcji DefWindowProc przekazujemy takie same parametry, jak w funkcji okienkowej }
WM_DESTROY: PostQuitMessage ( 0 ) ;
else Result := DefWindowProc ( Wnd, uMsg, wPar, lPar ) ;
end ;
end ;
var
Wnd: TWndClass; // klasa okna
Msg: TMsg;
begin
with Wnd do
begin
lpfnWndProc := @WndProc; // funkcja okienkowa
hInstance := hInstance; // uchwyt do zasobów
lpszClassName := 'My1stApp' ; // klasa
hbrBackground := COLOR_WINDOW; // kolor tła
end ;
RegisterClass ( Wnd ) ; // zarejestruj nową klasę
CreateWindow ( 'My1stApp' , 'Pierwszy program w WinAPI' ,
WS_VISIBLE or WS_TILEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
0 , 0 , hInstance, NIL ) ;
while GetMessage ( msg, 0 , 0 , 0 ) do DispatchMessage ( msg ) ;
end .
W listingu 12.1 zaprezentowano cały kod źródłowy programu. Nie omawiałem jeszcze ostatnich instrukcji tego
listingu. Są one bardzo ważne ? bez nich program nie będzie mógł zostać uruchomiony. Operacje te muszą być
wykonane, aby funkcja okienkowa otrzymała potrzebne meldunki. Podczas uruchamiania program musi wejść w
tzw. fazę meldunków. Funkcja GetMessage pobiera kolejno meldunki, wpisując je do struktury TMsg (parametry
są nieistotne), a następnie przekazuje funkcji DispatchMessage , która z kolei przekazuje meldunek funkcji
okienkowej.
Komunikaty i uchwyty
Pisząc programy w WinAPI, będziemy posługiwali się wyłącznie komunikatami jako formą zastępującą zdarzenia
(funkcje SendMessage i PostMessage). Warto więc przypomnieć sobie informacje na temat wysyłania
komunikatów. Ich odbieranie będzie następowało tylko w funkcji okienkowej.
Odświeżmy zatem pamięć ? komunikaty można podzielić na następujące kategorie:
komunikaty klawiaturowe (użytkownik nacisnął lub zwolnił jakiś klawisz),
komunikaty myszy (użytkownik wykonał jakąś czynność myszą),
komunikaty zegara, oznaczające upływ określonego odcinka czasu,
komunikaty systemu ? tworzenie okna, zmiana jego rozmiaru i położenia, zwijanie i rozwijanie okna,
zmiana kolorów systemowych itp.,
komunikaty wewnętrzne ? wysyłane przez inne okna utworzone w naszym programie.
W każdym komunikacie należy podać uchwyt okna docelowego (lub kontrolki docelowej). Uchwyt jest liczbą
32-bitową, która identyfikuje kontrolkę w systemie Windows. To właśnie Windows przydziela uchwyty różnym
kontrolkom. Nazwa typu reprezentującego uchwyt zaczyna się od litery H , czyli np. HWND , HBRUSH , HFONT czy
4 z 18
2009-03-14 15:43
77981602.007.png
Delphi :: Kompendium :: Rozdział 12 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_12
HBITMAP . Dzięki temu łatwo jest rozpoznać, czy dana zmienna jest uchwytem.
Łańcuchy
Podczas pisania programów w WinAPI będziemy używali jedynie łańcuchów typu PChar lub łańcuchów w formie
tablicy. Stosowanie typu String powoduje spowolnienie działania programu i zużywanie większej ilości pamięci.
Typ PChar ma jeszcze jedną zaletę ? można dokonywać na nim takich operacji:
P2 := 'To jest Delphi' ;
P1 := P2 + 8 ;
Pozornie wygląda to tak, jakby do zmiennej P2 dodawana była cyfra 8. W rzeczywistości do typu P1
przypisujemy wartość zmiennej P2 , tyle że bez pierwszych 8 znaków. Podczas lektury dalszej części książki
możesz spotkać się także z deklaracjami zmiennych w postaci tablicy:
Variable : array [ 0 .. 255 ] of char ;
Do takiej zmiennej można następnie przypisać dane w zwykły sposób, tyle że ich wielkość będzie ograniczona
do 255 znaków.
Variable := 'Adam Boduch' ;
Konwersja łańcuchów
W VCL ten problem nie istniał ? moduł SysUtils posiadał odpowiednie funkcje, umożliwiające konwersję typów.
Pisząc programy API, nie będziemy mogli z nich skorzystać ? pozostaje nam użycie funkcji zastępczych, np.
wvsprintf .
Oto możliwy sposób wykonania funkcji zastępczej:
function IntToStr ( Value : Integer ) : String ;
var
Buffer : array [ 0 .. 255 ] of char ; // bufor, w którym przechowywać będziemy dane
begin
wvsprintf ( Buffer, '%d' , @Value ) ; // tu następuje funkcja konwersji
Result := Buffer; // zwracamy rezultat
end ;
Funkcja wvsprintf służy do konwertowania tekstu. Pierwszym parametrem musi być wskazanie zwracanego
przez funkcję ciągu. Ja zadeklarowałem Buffer ? 256-elementową tablicę typu Char . Drugi parametr to tzw.
maska. Jeśli wstawimy w to miejsce znak %d , zostanie on zastąpiony liczbą typu Integer . Owa liczba to
zmienna Value , przekazywana jako trzeci parametr. Przykładowy program prezentujący działanie łańcuchów,
zamieściłem w listingu 12.2.
W powyższej funkcji IntToStr zadeklarowałem tablicę 256-elementową (standardowo),
chociaż tak naprawdę aż tak duża wartość nie jest konieczna.
Wyjątkowo w powyższej funkcji jako zwracanego rezultatu użyłem typu String . Zrobiłem to
tylko po to, aby upodobnić budowę funkcji do rzeczywistego wyglądu funkcji IntToStr z
modułu SysUtils .
Listing 12.2. Pełny kod źródłowy programu
{
Copyright (c) 2002 by Adam Boduch
}
uses Windows;
function IntToStr ( Value : Integer ) : String ;
var
Buffer : array [ 0 .. 255 ] of char ; // bufor, w którym przechowywać będziemy dane
begin
wvsprintf ( Buffer, '%d' , @Value ) ; // tu następuje funkcja konwersji
Result := Buffer; // zwracamy rezultat
end ;
begin
MessageBox ( 0 , PChar ( 'Witaj w ' + IntToStr ( 12 ) + ' części książki!' ) , 'Witaj!' , MB_OK ) ; //
wyświetl wartość zmiennej
end .
Inny przykład wykorzystania funkcji wvsprintf :
Buffer : array [ 0 .. 255 ] of char ;
Format : packed record // deklaracja rekordu danych do konwersji
Int : Integer ;
Fl : String ;
end ;
begin
{ wypełnienie danych do konwersji }
Format . Int := 11 ;
Format . Fl := 'Adam Boduch' ;
wvsprintf ( Buffer, 'Witaj w %d części kursu, ja nazywam się %s!' , @ Format ) ;
MessageBox ( 0 , Buffer, '' , 0 ) ;
end .
5 z 18
2009-03-14 15:43
77981602.008.png
Zgłoś jeśli naruszono regulamin