PODSTAWY PROGRAMOWANIA Andrzej Marciniak Prezentacja multimedialna przygotowana za pomocą systemu Corel Presentations X3 Copyright 2003-2013 by Andrzej Marciniak PP-12(1 z 46)
Na poprzednim wykładzie... Ptypy sparametryzowane < definiowanie typów sparametryzowanych < sparametryzowane typy proceduralne i metody Ppodstawowe moduły biblioteki RTL < moduł System < moduł SysUtils < moduł Math < wywołanie innego programu z programu paskalowego Pinformacje o bibliotece VCL < okienka z komunikatami PP-12(2 z 46)
Na tym wykładzie... Psystem pomocy dla programu okienkowego < wyświetlanie wskazówek < dołączanie plików pomocy i ich obsługa w języku Delphi Pprzygotowanie wersji dystrybucyjnej programu < program InstallShield Express < plik AUTORUN.INF Ptworzenie komponentów VCL i ActiveX oraz ich wykorzystanie < konstrukcja komponentu VCL < testowanie komponentu VCL < konstrukcja komponentu ActiveX PP-12(3 z 46)
Przygotowanie systemu pomocy Do utworzenia systemu pomocy dla programu okienkowego uruchamianego w środowisku Windows służy program HTML Help Workshop firmy Microsoft. Program ten można pobrać bezpłatnie m. in. ze strony http://www.microsoft.com/en-us/download W programie tym tworzy się plik projektowy systemu pomocy, a następnie kompiluje się go do pliku *.chm (w starszych wersjach programu S do pliku *.hlp). Tekst systemu pomocy można przygotować w edytorze MS Word (jako plik *.doc) lub w postaci pliku HTML. Szczegóły znajdują się w systemie pomocy programu HTML Help Workshop. PP-12(4 z 46)
Wyświetlanie wskazówek Przy aktywności komponentu: Pwe własności Hint wpisać odpowiedni tekst, Pwe własności ShowHint ustalić wartość True (domyślnie jest False). PP-12(5 z 46)
Dołączanie plików pomocy i ich obsługa Elementy typu TApplication (z modułu Vcl.Forms): Pwłasność HelpFile, Pmetoda HelpCommand, Pmetoda HelpContext, Pmetoda HelpJump, Pzdarzenie OnHelp. Bardzo ważna uwaga: Użycie w programie okienkowym plików pomocy *.chm wymaga zadeklarowania modułu HTMLHelpViewer w module głównego okna programu. PP-12(6 z 46)
Dołączanie plików pomocy i ich obsługa Własność HelpFile property HelpFile : string Służy do określenia nazwy domyślnego pliku pomocy (podczas wykonywania programu), który będzie używany przez program okienkowy do wyświetlania informacji. Domyślnie wartość tej własności jest łańcuchem pustym, co oznacza brak pliku pomocy skojarzonego z programem. PP-12(7 z 46)
Dołączanie plików pomocy i ich obsługa Własność HelpFile Przykład Application.HelpFile:= ENC_HELP.HLP ; Alternatywny sposób (statyczny): określenie Help file w okienku dialogowym wyświetlanym po zainicjowaniu w środowisku Delphi polecenia Project 6 Options i wyborze elementu Application Appearance. PP-12(8 z 46)
Dołączanie plików pomocy i ich obsługa Metoda HelpCommand function HelpCommand (Command : Word; Data : Longint): Boolean; Umożliwia szybki dostęp do dowolnego polecenia funkcji WinHelp i HTMLHelp środowiska Windows (są to funkcje API). Polecenie określa się za pomocą parametru Command, a parametr Data służy do przekazania dodatkowych informacji (w zależności od wartosci parametru Command). Szczegóły S zob. temat HTMLHelp w MSDN Library PP-12(9 z 46)
Dołączanie plików pomocy i ich obsługa Metoda HelpCommand Przykład Najczęściej stosowane wywołanie metody HelpCommand dla pliku pomocy *.hlp: Application.HelpCommand (HELP_FINDER, 0); PP-12(10 z 46)
Dołączanie plików pomocy i ich obsługa Metoda HelpContext function HelpContext (Context : THelpContext) : Boolean; Typ THelpContext jest zdefiniowany w module System.Classes: type THelpContext =!2147483647..2147483647; Metoda ta wyświetla temat pomocy o identyfikatorze określonym parametrem Context. PP-12(11 z 46)
Dołączanie plików pomocy i ich obsługa Metoda HelpContext Uwaga: Przed przesłaniem polecenia do funkcji WinHelp lub HTMLHelp metoda HelpContext generuje zdarzenie OnHelp. Funkcja API WinHelp lub HTMLHelp zostanie wywołana tylko wówczas, gdy nie określono metody obsługi tego zdarzenia lub w metodzie obsługi nastąpi jej wywołanie. Wartość funkcji równa False oznacza, że z programem nie skojarzono żadnego pliku pomocy (wartością własności CurrentHelpFile jest łańcuch pusty). Uwaga: Własność CurrentHelpFile określa plik pomocy skojarzony z aktywną formatką. W programach z jedną formatką (okienkiem) wartość własności CurrentHelpFile jest równa wartości własności HelpFile. PP-12(12 z 46)
Dołączanie plików pomocy i ich obsługa Metoda HelpContext Przykład const DATANOTFOUND = 714;... Application.HelpContext (DATANOTFOUND); PP-12(13 z 46)
Dołączanie plików pomocy i ich obsługa Metoda HelpJump function HelpJump (const JumpID : string) : Boolean; Metoda ta wyświetla temat pomocy identyfikawany przez swoją symboliczną nazwę. Uwaga: Przed przesłaniem polecenia do funkcji WinHelp lub HTMLHelp metoda HelpJump generuje zdarzenie OnHelp. Funkcja API WinHelp lub HTMLHelp zostanie wywołana tylko wówczas, gdy nie określono metody obsługi tego zdarzenia lub w metodzie obsługi nastąpi jej wywołanie. PP-12(14 z 46)
Dołączanie plików pomocy i ich obsługa Metoda HelpJump Wartość funkcji równa False oznacza, że z programem nie skojarzono żadnego pliku pomocy. Dokładniej: wartością własności CurrentHelpFile jest łańcuch pusty. Przykład Application.HelpJump ( metoda_abstrakcyjna ); PP-12(15 z 46)
Dołączanie plików pomocy i ich obsługa Zdarzenie OnHelp property OnHelp : THelpEvent read FOnHelp write FOnHelp; Typ THelpEvent jest zdefiniowany w module Vcl.Forms: type THelpEvent = function (Command : Word; Data : LongInt; var CallHelp : Boolean) : Boolean of object; Wszystkie metody wywołujące pomoc powodują najpierw wygenerowanie zdarzenia OnHelp. Wartość False metody obsługi zdarzenia OnHelp oznacza, że podczas jej wykonywania wystąpił błąd. PP-12(16 z 46)
Dołączanie plików pomocy i ich obsługa Zdarzenie OnHelp Programista może napisać własną metodę obsługi zdarzenia OnHelp. Jeśli wartością parametru CallHelp będzie True, to po wystąpieniu zdarzenia OnHelp nastąpi wywołanie funkcji API WinHelp lub HTMLHelp (działanie jest wówczas takie same, jak domyślne, tj. przy braku metody programisty obsługi tego zdarzenia). PP-12(17 z 46)
Dołączanie plików pomocy i ich obsługa Zdarzenie OnHelp Przykład (zmiana pliku pomocy dla aktywnej formatki) function TForml.AppHelp (Command : Word; Data : Longint; var CallHelp : Boolean) : Boolean; begin Application.HelpFile:=Screen.ActiveForm.Name +.HLP ; CallHelp:=True end; function TForml.FormCreate (Sender : TObject); begin Application.OnHelp:=AppHelp end; Zmienna globalna Screen (typu TScreen) opisuje stan ekranu. Jej własność ActiveForm (typu TForm) zawiera informację o aktualnie aktywnej formatce, a własność Name zawiera nazwę formatki. Metoda AppHelp jest przypisana do obsługi zdarzenia OnHelp podczas obsługi zdarzenia OnCreate dla formatki PP-12(18 z 46)
Przygotowanie wersji dystrybucyjnej programu Do tego celu służy program InstallShield Express, którego polskojęzyczną wersję można pobrać m. in. ze stron: http://www.installshield.com/express/ http://www.idg.pl http://www.filestube.com/installshield+express PP-12(19 z 46)
Przygotowanie wersji dystrybucyjnej programu W programie InstallShield Express tworzy się plik projektowy (*.ism) dla wersji instalacyjnej programu, ustalając lub określając różne parametry, w tym okienka wyświetlane podczas instalacji. Następnie plik ten kompiluje się, w wyniku czego powstaje wersja wykonywalna programu instalacyjnego. Program InstallShield Express umożliwia przetestowanie wersji instalacyjnej oraz przygotowanie jej dla różnych nośników (m. in. płyt CD i DVD). Do nagrania płyt można wykorzystać program Nero Burning ROM. PP-12(20 z 46)
Przygotowanie wersji dystrybucyjnej programu Plik AUTORUN.INF Po umieszczeniu płyty CD w napędzie, system Windows automatycznie rozpoczyna poszukiwanie pliku AUTORUN.INF i po jego odnalezieniu wykonuje zawarte w nim polecenia. W pliku tym można m. in. wskazać program do uruchomienia (np. Setup): [Autorun] OPEN=SETUP.EXE PP-12(21 z 46)
Tworzenie komponentów VCL i ActiveX Kierowca nie musi znać budowy skrzyni biegów wystarczy, że potrafi ją obsługiwać. Komponenty zdejmują z programisty ciężar zajmowania się szczegółami. Wystarczy je używać, a nie zastanawiać się nad tym, jak są zbudowane. Szczegółami zajmujemy się na etapie projektowania lub modyfikowania komponentów. PP-12(22 z 46)
Tworzenie komponentów VCL i ActiveX Powody znajomości sposobu tworzenia komponentów: P wielokrotne wykorzystanie tego samego kodu, P modyfikacja istniejących komponentów (ponieważ każdy komponent jest obiektem, więc opierając się na nim możemy utworzyć nowy komponent, który będzie dziedziczył jego własności), P udostępnianie gotowych komponentów (możliwość nabywania dodatkowych komponentów od niezależnego dostawcy lub komercyjna dystrybucja własnych komponentów w postaci skompilowanej bez udostępniania kodu źródłowego). Uwaga: W środowisku Delphi komponenty ActiveX tworzy się z komponentów VCL. PP-12(23 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) W palecie komponentów każdy komponent jest reprezentowany za pomocą jakiegoś piktogramu. Zasady wyświetlania piktogramów komponentów: Ppo dodaniu komponentu do środowiska Delphi (będzie dalej) jego piktogram jest poszukiwany w pliku o takiej samej nazwie, jak nazwa pliku z modułem (.PAS) zawierającym opis komponentu, ale o rozszerzeniu nazwy DCR (skr. ang. Delphi Component Resource), plik.dcr jest zwykłym plikiem z zasobem, tyle że o zmienionym rozszerzeniu nazwy, PP-12(24 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) W palecie komponentów każdy komponent jest reprezentowany za pomocą jakiegoś piktogramu. Zasady wyświetlania piktogramów komponentów: P jeśli taki plik nie zostanie odnaleziony, to komponent będzie reprezentowany w palecie przez piktogram domyślny (w zależności od typu przodka tworzonego komponentu piktogram ten może być różny). W pliku.dcr piktogram jest pamiętany jako mapa bitowa o rozmiarze 24 24 piksele. W starszych wersjach środowiska Delphi (np. Borland Delphi 7) piktogram komponentu można było przygotować za pomocą programu Image Editor, będącego jednym z programów narzędziowych dostępnych w pakiecie. W środowisku Embarcadero Delphi XE2 nie ma tego programu. PP-12(25 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) W celu utworzenia nowego komponentu należy: P w głównym menu środowiska Delphi zainicjować polecenie Component 6 New Component, które spowoduje zainicjowanie kreatora komponentów ze stroną zawierającą wykaz wszystkich klas definiujących komponenty już zainstalowane w systemie, P wybrać klasę definiującą przodka tworzonego komponentu (w przykładzie będzie to klasa TStaticText), po czym wybrać przycisk Next, PP-12(26 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) PP-12(27 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) W celu utworzenia nowego komponentu należy: P w drugim okienku określić nazwę klasy definiującej komponent (w podokienku Class Name) S w przykładzie będzie to TStaticTextClock, P przyjąć (lub zmienić) domyślne ustalenia w innych podokienkach wejściowych S w przykładzie zmieniamy domyślną nazwę modułu z definicją komponentu na StaticTextClock, P wybrać przycisk Next. PP-12(28 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) PP-12(29 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) Wybór przycisku Next powoduje wyświetlenie kolejnego okna z możliwością utworzenia modułu z definicją komponentu lub dodania go do istniejącego lub nowego pakietu (w przykładzie wybieramy opcję Create Unit, po czym przycisk Finish). PP-12(30 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) W przypadku wyboru opcji Create Unit i przycisku Finish na ekranie ukaże się okienko redakcyjne z modułem zawierającym szkielet definicji klasy określającej komponent. Ważnym elementem tego modułu jest procedura Register, której zadaniem jest umieszczenie piktogramu komponentu w palecie. Po uzupełnieniu definicji klasy o elementy powodujące zamierzone działanie komponentu należy zapisać moduł na dysku (przez wybór polecenia File 6 Save). PP-12(31 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) W celu zainstalowania komponentu należy zainicjować polecenie Component 6 Install Component i w wyświetlonym okienku wybrać z listy nazwę modułu z definicją klasy określającej komponent, po czym określić instalację do istniejącego lub nowego pakietu. PP-12(32 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) Wybór przycisku Next powoduje wyświetlenie kolejnego okna, w którym należy określić nazwę pakietu (w podokienku Package name) i ewentualnie jego opis (w podokienku Package description), po czym wybrać przycisk Finish. Spowoduje to pojawienie się zapytania: na które należy odpowiedzieć Yes. PP-12(33 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład: StaticTextClock) Pomyślne zainstalowanie komponentu kończy się komunikatem: O tym, że komponent został zainstalowany można przekonać się wyświetlając odpowiednią grupę (tę, do której dodano komponent) w okienku Tool Palette lub odpowiednią zakładkę palety komponentów znajdującej się pod piktogramami szybkiego inicjowania poleceń. PP-12(34 z 46)
Tworzenie komponentów Usuwanie komponentów W celu usunięcia komponentu należy: P zainicjować polecenie Project 6 Options, P w wyświetlonym oknie wybrać z lewej strony element Packages, po czym w oknie Design packages odszukać zainstalowany pakiet na liście, P przy podświetlonej nazwie pliku z pakietem (lub opisie, o ile taki został utworzony podczas tworzenia pakietu) wybrać przycisk Remove. Uwaga: Operacja ta nie usuwa pliku pakietu z dysku. PP-12(35 z 46)
Tworzenie komponentów Zmiana komponentu Zmiana (modyfikacja) zarejestrowanego komponentu polega zwykle na dodaniu kilku nowych elementów do definiującej go klasy. W tym celu należy zainicjować polecenie File 6 Open i wyszukać w wyświetlonej liście plików odpowiedni pakiet. Wczytanie pakietu spowoduje pojawienie się w okienku File (z prawej strony ekranu) drzewa hierarchicznego z pakietem, w którym należy w grupie Contains kliknąć w piktogram z modułem zawierającym definicję klasy komponentu. Po modyfikacji należy skompilować cały pakiet (wykonujemy to za pomocą polecenia Project 6 Compile). PP-12(36 z 46)
Tworzenie komponentów Konstrukcja komponentu VCL (przykład StaticTextClock) PP-12(37 z 46)
Komponenty ActiveX Konstrukcja komponentu ActiveX (przykład: StaticTextClockX) Komponenty ActiveX (elementy sterujące i formatki) mogą być wykorzystywane w różnych pakietach (m. in. C++ Builder, Visual C++, Visual Basic) i przeglądarkach internetowych. Łatwiej jest zintegrować z programem (aplikacją) obiekt realizujący określone funkcje niż programować te funkcje od początku. Z komponentu StaticTextClock utworzymy komponent ActiveX, który nazwiemy (przez analogię) StaticTextClockX. W tym celu wystarczy wykonać kilka prostych operacji: P zainicjować polecenie File 6 New 6 Other i w wyświetlonym okienku New Items uaktywnić element ActiveX, PP-12(38 z 46)
Komponenty ActiveX Konstrukcja komponentu ActiveX (przykład: StaticTextClockX) Pwybrać piktogram ActiveX Library, co spowoduje otwarcie okienka redakcyjnego z tekstem biblioteki o domyślnej nazwie oraz okienka edytora komponentów ActiveX z nazwą *.ridl, PP-12(39 z 46)
Komponenty ActiveX Konstrukcja komponentu ActiveX (przykład: StaticTextClockX) P w bibliotece dodać deklarację modułu z klasą definiującą komponent VCL; w opisywanym przykładzie klauzula uses powinna mieć postać uses ComServ, Project2_TLB in Project2_TLB.pas, StaticTextClock in StaticTextClock.pas ; P skompilować bibliotekę (przez wybór polecenia Project 6 Compile), P ponownie zainicjować polecenie File 6 New 6 Other, znowu uaktywnić element ActiveX, ale tym razem wybrać w okienku piktogram ActiveX Control, co spowoduje wyświetlenie PP-12(40 z 46) okienka dialogowego kreatora komponentów ActiveX,
Komponenty ActiveX Konstrukcja komponentu ActiveX (przykład: StaticTextClockX) Pw podokienku CoClass Name wpisać nazwę tworzonego komponentu ActiveX (w okienku Interface automatycznie pojawi się nazwa łącza programowego), Pw podokienku listowym Component Name wybrać nazwę klasy ze zwykłym komponentem, z którego jest tworzony komponent ActiveX, po czym wybrać przycisk OK (spowoduje to automatyczne utworzenie modułu z definicją klasy określającej komponent ActiveX). PP-12(41 z 46)
Komponenty ActiveX Konstrukcja komponentu ActiveX (przykład: StaticTextClockX) Uwaga: Jeśli moduł z definicją klasy zwykłego komponentu nie zostanie odnaleziony automatycznie, to na ekranie pojawi się następujące okienko i po wyborze przycisku OK. programista będzie mógł wskazać ten moduł (wcześniej skompilowany!) w wyświetlonym okienku Find Unit. PP-12(42 z 46)
Komponenty ActiveX Konstrukcja komponentu ActiveX (przykład: StaticTextClockX) Wygenerowany automatycznie moduł będzie zawierać definicję klasy TStaticTextClockX określającej komponent ActiveX. W nagłówku tej klasy obok nazwy przodka (TActiveXControl) będzie podana nazwa łącza programowego (IStaticTextClockX). Łącze to jest zdefiniowane w module *_TLB, który także został utworzony automatycznie i zawiera odpowiednie deklaracje zaimportowane z biblioteki typów. W definicji łącza programowego IStaticTextClockX są zdefiniowane własności odpowiadające własnościom komponentu StaticTextClock, ale dostęp do nich odbywa się wyłącznie za pomocą metod (o przedrostkach Get_ oraz Set_), których definicje są podane w implementacji łącza, tj. w klasie TStaticTextClockX. Do bezpośredniej ingerencji we wszystkie elementy definicji komponentu ActiveX służy edytor, którego okienko znajduje się na zakładce *.ridgl głównego okna środowiska Delphi. PP-12(43 z 46)
Komponenty ActiveX Konstrukcja komponentu ActiveX (przykład: StaticTextClockX) Automatyczne wygenerowanie modułu z definicją komponentu ActiveX nie kończy procesu jego tworzenia. Należy jeszcze cały projekt (bibliotekę): P skompilować przez zainicjowanie polecenia Project 6 Compile (otrzymamy plik *.ocx z komponentem), P zarejestrować komponent w systemie za pomocą polecenia Run 6 ActiveX Server 6 Register (do anulowania rejestracji służy polecenie Run 6 ActiveX Server 6 Unregister). Za pomocą polecenia Component 6 Install Component utworzony komponent ActiveX można dołączyć do palety komponentów (np. do grupy ActiveX). PP-12(44 z 46)
Komponenty ActiveX Konstrukcja komponentu ActiveX (przykład: StaticTextClockX) PP-12(45 z 46)
KONIEC PP-12(46 z 46)