DEL420 Zaawansowane programowanie w (pakiecie) Delphi Andrzej Marciniak Prezentacja multimedialna przygotowana za pomoc¹ systemu Corel Presentations 11 i X3 Copyright 2004-2010 by Andrzej Marciniak DEL-9-10(1 z 62)
Na poprzednim wyk³adzie... tworzenie komponentów VCL i ActiveX oraz ich wykorzystanie konstrukcja komponentu VCL testowanie komponentu VCL konstrukcja komponentu ActiveX testowanie komponentu ActiveX DEL-9-10(2 z 62)
Na tym wyk³adzie... wywo³anie innego programu z programu paskalowego przegl¹d funkcji i procedur funkcje i procedury trygonometryczne, hiperboliczne, area funkcje, funkcje logarytmiczne, wyk³adnicze i potêgowe funkcje i procedury do obliczeñ statystycznych inne funkcje sprawdzanie obecnoœci poprzedniego egzemplarza programu DEL-9-10(3 z 62)
Wywo³anie innego programu Do wykonania tej operacji s³u y funkcja ShellExecute zdefiniowana w module ShellAPI. Funkcja ta nie jest opisana w systemie pomocy œrodowiska Delphi. Odwo³ujê siê ona bezpoœrednio do funkcji API œrodowiska Windows o tej samej nazwie: HINSTANCE ShellExecute( HWND hwnd, // handle to parent window LPCTSTR lpoperation, // pointer to string that specifies operation LPCTSTR lpfile, // pointer to filename or folder name string LPCTSTR lpparameters, // pointer to string that specifies executable-file parameters LPCTSTR lpdirectory,// pointer to string that specifies default directory INT nshowcmd // whether file is shown when opened ); DEL-9-10(4 z 62)
Wywo³anie innego programu Nag³ówek funkcji ShellExecute z modu³u ShellAPI ma nastêpuj¹c¹ postaæ: function ShellExecute (hwnd : HWND; Operation, FileName, Parameters, Directory : PChar; ShowCmd : Integer) : HINST; stdcall; Bezpoœrednie u ywanie tej funkcji w praktyce mo e byæ uci¹ liwe. Dlatego proponujemy korzystaæ z nastêpuj¹cej, u ytecznej funkcji: DEL-9-10(5 z 62)
Wywo³anie innego programu function ExecuteFile (const FileName, Params, DefaultDir : string; ShowCmd : Integer) : THandle; var zfilename, zparams, zdir : array [0..79] of Char; begin Result:=ShellExecute(Application.MainForm.Handle, nil, StrPCopy(zFileName, FileName), StrPCopy(zParams, Params), StrPCopy(zDir, DefaultDir), ShowCmd) end; FileName Params DefaultDir ShowCmd nazwa zbioru programowego (lub folderu), parametry wykonania programu, skorowidz (katalog) domyœlny, okreœlenie sposobu wyœwietlania okienka: SW_SHOW (bie ¹cy rozmiar i po³o enie), SW_MAXIMIZE, SW_MINIMIZE (inne sta³e SW_ zob. opis funkcji API o nazwie ShellExecute w Help Windows SDK) DEL-9-10(6 z 62)
Modu³ Math zawiera funkcje i procedury arytmetyczne, trygonometryczne, logarytmiczne i statystyczne, bêd¹ce uzupe³nieniem funkcji zdefiniowanych w module System. Ponadto w module Math znajduj¹ siê definicje funkcji przeznaczonych do obliczeñ finansowych, które przeniesiono z pakietu Quattro Pro firmy Borland. Czêœæ wykonawcza wielu funkcji i procedur zosta³a zaprogramowana bezpoœrednio w asemblerze, z wykorzystaniem instrukcji zmiennopozycyjnych, operuj¹cych bezpoœrednio na jednostce arytmetyki zmiennopozycyjnej procesora. DEL-9-10(7 z 62)
Funkcje i procedury trygonometryczne ArcCos(x) ArcSin(x) ArcTan2(x, y) Cotan(x) SinCos(x, s, c) Tan(x) arcus cosinus x arcus sinus x arcus tangens ilorazu x przez y cotangens x sinus i cosinus x (oddzielne obliczenie sinusa i cosinusa za pomoc¹ funkcji Sin i Cos modu³u System trwa dwa razy d³u ej) tangens x Przypomnienie: W module System s¹ zdefiniowane funkcje ArcTan, Cos i Sin. DEL-9-10(8 z 62)
Funkcje i procedury trygonometryczne DegToRad(stopnie) zamiana stopni na radiany RadToDeg(radiany) zamiana radianów na stopnie Przyk³ady 1)Obliczenie w stopniach przybli onej wartoœci funkcji arcsin 0,5: RadToDeg(ArcSin(0.5)) 2)Obliczenie przybli onych wartoœci sin 20 i cos 20 oraz przypisanie wyników zmiennym odpowiednio s oraz c: SinCos(DegToRad(20), s, c) DEL-9-10(9 z 62)
Funkcje hiperboliczne i area funkcje area funkcje ArcCosh(x) ArcSinh(x) ArcTanh(x) Cosh(x) Sinh(x) Tanh(x) funkcje odwrotne wzglêdem funkcji hiperbolicznych area cosinus x area sinus x area tangens x cosinus hiperboliczny x sinus hiperboliczny x tangens hiperboliczny x DEL-9-10(10 z 62)
Funkcje logarytmiczne LnXP1(x) Log10(x) Log2(x) LogN(p, x) logarytm naturalny z x+1 (funkcja zalecana do stosowania dla wartoœci x bliskich 0) logarytm dziesiêtny z x logarytm o podstawie 2 z x logarytm o podstawie p z x Przypomnienie: W module System jest zdefiniowana funkcja Ln. DEL-9-10(11 z 62)
Funkcje wyk³adnicze i potêgowe Hypot (x, y) obliczenie wartoœci wyra enia czyli normy euklidesowej wektora w R 2 IntPower (podstawa, wyk³adnik) argument podstawa podniesiony do potêgi ca³kowitej okreœlonej przez wyk³adnik Power (podstawa, wyk³adnik) podniesienie liczby rzeczywistej do dowolnej potêgi (nie tylko ca³kowitej) DEL-9-10(12 z 62)
Funkcje wyk³adnicze i potêgowe Ldexp (x, p) obliczenie x 2 p (p ca³kowite) Przypomnienie: W module System s¹ zdefiniowane funkcje Exp, Sqr i Sqrt. DEL-9-10(13 z 62)
Funkcje i procedury do obliczeñ statystycznych funkcja Sum (dane) obliczanie sumy elementów ( dane argument odpowiadaj¹cy tablicowemu parametrowi otwartemu o elementach typu Double) funkcja SumOfSquares (dane) obliczenie sumy kwadratów elementów SumsAndSquares (dane, suma, suma-kwadratów) jednoczesne obliczenie sumy i sumy kwadratów elementów DEL-9-10(14 z 62)
Funkcje i procedury do obliczeñ statystycznych funkcja Norm (dane) obliczenie normy euklidesowej wektora (pierwiastek z sumy kwadratów jego sk³adowych) funkcja Mean (dane) obliczenie œredniej arytmetycznej pewnej liczby elementów funkcja PopnVariance (dane) wyznaczenie wariancji, tj. DEL-9-10(15 z 62)
Funkcje i procedury do obliczeñ statystycznych funkcja TotalVariance (dane) obliczenie wartoœci wyra enia funkcja Variance (dane) obliczenie nieobci¹ onego estymatora wariancji (nazwa mo e byæ myl¹ca, gdy funkcja nie oblicza wariancji), tj. DEL-9-10(16 z 62)
Funkcje i procedury do obliczeñ statystycznych funkcja PopnStdDev (dane) wyznaczenie odchylenia standardowego, tj. pierwiastka kwadratowego z wariancji funkcja StdDev (dane) wyznaczenie pierwiastka kwadratowego z nieobci¹ onego estymatora wariancji MeanAndStdDev (dane, œrednia, odchylenie) jednoczesne wyznaczenie œredniej i pierwiastka kwadratowego z nieobci¹ onego estymatora wariancji DEL-9-10(17 z 62)
Funkcje i procedury do obliczeñ statystycznych MomentSkewKurtosis (dane, m1, m2, m3, m4, skoœnoœæ, eksces) wyznaczenie czterech pierwszych momentów, skoœnoœci i ekscesu (wspó³czynnika wypuk³oœci), tj. wielkoœci DEL-9-10(18 z 62)
Funkcje i procedury do obliczeñ statystycznych funkcja RandG (œrednia, odchylenie) otrzymywanie liczb losowych o rozk³adzie normalnym (Gaussa) funkcja RandomRange (i1, i2) otrzymywanie ca³kowitych liczb losowych z przedzia³u [ i1, i2) Przypomnienie: Funkcja Random z modu³u System generuje rzeczywiste liczby losowe z przedzia³u [0, 1) lub ca³kowite z przedzia³u [0, zakres). DEL-9-10(19 z 62)
Funkcje do wykonywania obliczeñ finansowych do obliczania rat i p³atnoœci ( FutureValue, InterestPayment, InterestRate, NumberOfPeriods, Payment, PeriodPayment, PresentValue), do wykonywania rachunków dyskontowych (InternalRateOfReturn, NetPresentValue), do obliczania amortyzacji (DoubleDecliningBalance, SLNDepreciation, SYDDepreciation) DEL-9-10(20 z 62)
Funkcje dotycz¹ce zaokr¹glania funkcja RoundTo (wartoœæ, rz¹d) zaokr¹glenie wartoœci do miejsca okreœlonego przez rz¹d (potêga dziesi¹tki), który musi byæ liczb¹ ca³kowit¹ z przedzia³u [ 37, 37) (?) Przyk³ady wywo³anie wartoœæ funkcji RoundTo(1234567, 3) 1235000 RoundTo(125, 1) 120 RoundTo(126, 1) 130 RoundTo(135, 1) 140 Uwaga: Wartoœci obliczane przez funkcjê RoundTo zale ¹ od ustaleñ wykonanych za pomoc¹ procedury Set8087CW lub funkcji SetRoundMode. DEL-9-10(21 z 62)
Funkcje dotycz¹ce zaokr¹glania funkcja SimpleRoundTo (wartoœæ, rz¹d) zaokr¹glenie asymetryczne (w górê) wartoœci do miejsca okreœlonego przez rz¹d (potêga dziesi¹tki), który musi byæ liczb¹ ca³kowit¹ z przedzia³u [ 37, 37) (domyœlna wartoœæ parametru rz¹d: 2) Przyk³ady wywo³anie wartoœæ funkcji SimpleRoundTo(1234567, 3) 1235000 SimpleRoundTo(124, 1) 120 SimpleRoundTo(125, 1) 130 SimpleRoundTo(135, 1) 140 DEL-9-10(22 z 62)
Funkcje dotycz¹ce zaokr¹glania Uwaga: Niektóre przyk³ady podane w systemie pomocy œrodowiska Delphi 7 s¹ b³êdne! jest powinno byæ RoundTo(1234567, 3) 1234000 1235000 (*) RoundTo(1.245, 2) 1.24 1.25 (!) SimpleRoundTo(1234567, 3) 1234000 1235000 (*) B³êdy oznaczone przez (*) s¹ oczywiste. Jak móg³ powstaæ b³¹d oznaczony przez (!)? Przypomnienie: W module System jest zdefiniowana funkcja Round zaokr¹glaj¹ca podan¹ wartoœæ do najbli szej liczby ca³kowitej. DEL-9-10(23 z 62)
Funkcje dotycz¹ce s³owa steruj¹cego FPU funkcja GetExceptionMask wartoœæ funkcji jest typu TFPUException i okreœla zbiór z maskami s³owa steruj¹cego FPU type TFPUException = (exinvalidop, exdenormalized, exzerodivide, exoverflow, exunderflow, exprecision); TFPUExceptionMask = set of TFPUException; Jeœli jakiœ element zbioru TFPUExceptionMask nale y do zbioru wartoœci funkcji, oznacza to, e odpowiadaj¹cy mu warunek nie bêdzie generowany. Zamiast tego wartoœci¹ obliczanego wyra enia bêdzie NaN (nie-liczba), Infinity (nieskoñczonoœæ) lub NegInfinity (minus nieskoñczonoœæ). Przyjmowana wartoœæ zale y od wykonywanej operacji i bie ¹cego rodzaju zaokr¹glania. DEL-9-10(24 z 62)
Funkcje dotycz¹ce s³owa steruj¹cego FPU funkcja GetPrecisionMode uzyskanie informacji o precyzji realizowanej przez FPU; wartoœæ funkcji jest typu TFPUPrecisionMode: type TFPUPrecisionMode = (pmsingle, pmreserved, pmdouble, pmextended); Znaczenia elementów: pmsingle pojedyncza precyzja pmreserved nie u ywane pmdouble podwójna precyzja pmextended precyzja rozszerzona DEL-9-10(25 z 62)
Funkcje dotycz¹ce s³owa steruj¹cego FPU funkcja GetRoundMode uzyskanie informacji o bie ¹cym rodzaju zaokr¹glania realizowanym przez FPU; wartoœæ funkcji jest typu TFPURoundingMode: type TFPURoundingMode = (rmnearest, rmdown, rmup, rmtruncate); Znaczenia elementów: rmnearest zaokr¹glenie standardowe, tj. do najbli szej liczby, a w przypadku równych odleg³oœci do liczby parzystej rmdown zakr¹glenie w dó³ rmup zaokr¹glenie w górê rmtruncate obciêcie w kierunku zera DEL-9-10(26 z 62)
Funkcje dotycz¹ce s³owa steruj¹cego FPU funkcja SetExceptionMask (maski) okreœlenie masek FPU (wartoœci¹ funkcji s¹ poprzednie maski); parametr maski i wartoœæ funkcji s¹ typu zbiorowego TFPUExceptionMask (zob. bli ej) funkcja SetPrecisionMode (precyzja) okreœlenie precyzji FPU (wartoœci¹ funkcji jest poprzednia precyzja); parametr precyzja i wartoœæ funkcji s¹ typu TFPUPrecisionMode (zob. bli ej) DEL-9-10(27 z 62)
Funkcje dotycz¹ce s³owa steruj¹cego FPU funkcja SetRoundMode (zaokr¹glenie) okreœlenie rodzaju zaokr¹glenia realizowanego przez FPU (wartoœci¹ funkcji jest poprzedni rodzaj zaokr¹glenia); parametr zaokr¹glenie i wartoœæ funkcji s¹ typu TFPURoundingMode (zob. bli ej) DEL-9-10(28 z 62)
Inne funkcje i procedury Frexp (x, mantysa, cecha) wyodrêbnienie mantysy i cechy wielkoœci zmiennoprzecinkowej (mantysa zmienna typu Extended, cecha zmienna typu Integer) funkcja Ceil (x) wyznaczenie najmniejszej liczby ca³kowitej wiêkszej od lub równej podanej wartoœci x funkcja Floor (x) wyznaczenie najwiêkszej liczby ca³kowitej mniejszej od lub równej podanej wartoœci x DEL-9-10(29 z 62)
Inne funkcje i procedury DivMod (dzielna, dzielnik, wynik, reszta) wynik dzielenia ca³kowitego z reszt¹ funkcja Max (x, y) wartoœci¹ funkcji jest wiêksza z liczb x i y (parametry mog¹ byæ dowolnego typu ca³kowitego lub rzeczywistego) funkcja Min (x, y) wartoœci¹ funkcji jest mniejsza z liczb x i y DEL-9-10(30 z 62)
Inne funkcje i procedury funkcje MaxIntValue (dane) i MaxValue (dane) uzyskanie najwiêkszej wartoœci z tablicy dane o elementach typu ca³kowitego Integer (MaxIntValue) i rzeczywistego Double (MaxValue) funkcje MinIntValue (dane) i MinValue (dane) uzyskanie najmniejszej wartoœci z tablicy dane o elementach typu ca³kowitego Integer (MinIntValue) i rzeczywistego Double (MinValue) DEL-9-10(31 z 62)
Inne funkcje i procedury funkcja CompareValue (x, y) CompareValue (x, y, eps) porównanie wartoœci x i y, przy czym drugi przypadek dotyczy parametrów rzeczywistych, które uwa a siê za równe jeœli ró ni¹ siê nie wiêcej ni o eps (domyœlna wartoœæ: 0); wartoœæ funkcji jest typu TValueRelationship: type TValueRelationship = 1..1; Znaczenia wartoœci: 1 x < y 0 x = y (z dok³adnoœci¹ eps) 1 x > y DEL-9-10(32 z 62)
Inne funkcje i procedury funkcja EnsureRange (wartoœæ, w1, w2) wyznaczenie najbli szej liczby do wartoœæ z przedzia³u [ w1, w2] (argumenty mog¹ byæ albo typu Integer, albo Int64, albo Double) Przyk³ady wywo³anie EnsureRange (1, 3, 5) 3 EnsureRange (6, 3, 5) 5 EnsureRange (4, 3, 5) 4 wartoœæ funkcji DEL-9-10(33 z 62)
Inne funkcje i procedury funkcja InRange (wartoœæ, w1, w2) sprawdzenie, czy wartoœæ nale y do przedzia³u [w1, w2] (argumenty mog¹ byæ typu Integer, Int64 lub Double) funkcja IsInfinite (x) sprawdzenie, czy wartoœci¹ argumentu x (typu Double) jest nieskoñczonoœæ (Inf) funkcja IsNan (x) sprawdzenie, czy wartoœci¹ argumentu x (typu Single, Double lub Extended) jest nie-liczba (wartoœæ nienumeryczna NaN) DEL-9-10(34 z 62)
Inne funkcje i procedury funkcja IsZero (x) sprawdzenie, czy wartoœæ argumentu x (typu Single, Double lub Extended) jest równa 0 (lub bliska 0) funkcja SameValue (x, y, eps) sprawdzenie, czy wartoœci argumentów x i y (typu Single, Double lub Extended) s¹ równe z dok³adnoœci¹ eps (wartoœæ domyœlna: 0) DEL-9-10(35 z 62)
Inne funkcje i procedury funkcja Sign (wartoœæ) okreœlenie, czy argument wartoœæ typu Integer, Int64 lub Double jest dodatni, ujemny czy równy 0; wartoœæ funkcji jest typu TValueSign: type TValueSign = 1..1; Znaczenia wartoœci: 1 wartoœæ < 0 0 wartoœæ = 0 1 wartoœæ > 0 DEL-9-10(36 z 62)
Inne funkcje i procedury funkcja Poly (x, wspó³czynniki) obliczenie wartoœci wielomianu stopnia n zmiennej x algorytmem Hornera: w n := a n, w i := w i+1 x + a i, dla i = n 1, n 2,..., 0. gdzie w 0 oznacza wyznaczan¹ wartoœæ ( x oznacza wartoœæ typu Extended, a argument wspó³czynniki odpowiada tablicowemu parametrowi otwartemu o elementach typu Double liczba elementów tej tablicy jest równa stopniowi wielomianu minus 1) DEL-9-10(37 z 62)
Sta³e predefiniowane w module Math const Infinity = 1.0/0.0; MaxComp = 9.223372036854775807e+18; MaxDouble = 1.7e+308; MaxExtended = 1.1e+4932; MaxSingle = 3.4e+38; MinComp = 9.223372036854775807e+18; MinDouble = 5.0e 324; MinExtended = 3.4e 4932; MinSingle = 1.5e 45; NaN = 0.0/0.0; NegInfinity = 1.0/0.0; do przypisywania zmiennej stanu +Inf (nie nale y u ywaæ w porównaniach) do przypisywania zmiennej stanów NaN (nie-liczba) i Inf (nie nale y u ywaæ w porównaniach) DEL-9-10(38 z 62)
Informacje o modu³ach MathStrUtils i VarCmplx MathStrUtils zawiera dwie funkcje: IfThen (do otrzymywania jednej z dwu wartoœci na podstawie zadanego warunku) i RandomFrom (do otrzymywania losowo wybranego elementu z tablicy) VarCmplx zawiera wiele funkcji do wykonywania obliczeñ na liczbach zespolonych (liczby te s¹ reprezentowane za pomoc¹ wariantów specjalnych ang. custom variants) DEL-9-10(39 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Ka dy program mo e byæ wykonany w wiêcej ni jednym egzemplarzu. Aby zezwoliæ na co najwy ej jeden egzemplarz, program musi mieæ mo liwoœæ sprawdzenia, czy poprzedni egzemplarz nie jest ju uruchomiony. Poznamy trzy sposoby rozwi¹zania tego problemu: zastosowanie funkcji API FindWindow, u ycie muteksu, przeszukanie listy okien. DEL-9-10(40 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Zastosowanie funkcji FindWindow Wartoœci¹ funkcji FindWindow (z modu³u Windows) jest identyfikator okna (ang. handle) nadawany przez œrodowisko Windows lub 0, jeœli okno nie zostanie znalezione. Identyfikator ten jest typu HWND: type HWND = type Longword; Typ ten jest zgodny m. in. z typem THandle (który zaleca siê stosowaæ). DEL-9-10(41 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Zastosowanie funkcji FindWindow Wywo³anie funkcji ma postaæ FindWindow (nazwa-klasy, nazwa-okna) Oba parametry s¹ typu PChar. Wartoœæ nil drugiego parametru oznacza, e nazwa okna mo e byæ dowolna. G³ówny kod (kod programu) powinien byæ napisany tak, by by³ wykonywany tylko wówczas, gdy wartoœci¹ funkcji FindWindow jest 0: DEL-9-10(42 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Zastosowanie funkcji FindWindow... var ident : THandle; begin ident:=findwindow( TForm1, nil); if ident=0 end. wykonanie, gdy okna nie odnaleziono then begin Application.Initialize; Application.CreateForm(TForm1, Form1);... Application.Run end else SetForegroundWindow (ident) uaktywnienie poprzedniego egzemplarza programu DEL-9-10(43 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Zastosowanie funkcji FindWindow Technika ta dzia³a tylko wówczas, gdy g³ówne okno poprzedniego programu nie zosta³o zminimalizowane. Gdy g³ówne okno jest zminimalizowane, to jest ukryte i kod aktywuj¹cy nie dzia³a. Jeœli program z podanym kodem uruchomimy w œrodowisku Delphi, to poniewa okno ju istnieje (na etapie projektowania), wiêc program nie zostanie uruchomiony ani razu. DEL-9-10(44 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... U ycie muteksu muteks obiekt wzajemnie wykluczaj¹cy siê (w œrodowisku Windows mo e istnieæ tylko jeden muteks o danej nazwie) Po utworzeniu przez program obiektu muteksu o danej nazwie lub sprawdzeniu, e taki obiekt ju istnieje (za pomoc¹ funkcji CreateMutex), program mo e sprawdziæ, czy obiekt ten jest ju w posiadaniu innego programu. W tym celu wywo³uje siê funkcjê WaitForSingleObject. DEL-9-10(45 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... U ycie muteksu Wywo³anie funkcji CreateMutex ma postaæ CreateMutex (atrybuty-bezpieczeñstwa, czy-w³aœciciel, nazwa-muteksu) Pierwszy parametr okreœla, czy identyfikator muteksu mo e byæ dziedziczony przez procesy potomne (jeœli jest on równy nil, to identyfikator ten nie mo e byæ dziedziczony tak¹ wartoœæ nale y przyj¹æ w rozwa anym problemie). DEL-9-10(46 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... U ycie muteksu Wywo³anie funkcji CreateMutex ma postaæ CreateMutex (atrybuty-bezpieczeñstwa, czy-w³aœciciel, nazwa-muteksu) W artoœæ True dugiego parametru oznacza, e program (proces) wywo³uj¹cy funkcjê staje siê w³aœcicielem muteksu (w naszym problemie parametr ten powinien mieæ wartoœæ False). Trzeci parametr (typu PChar) okreœla nazwê muteksu. Wartoœæ funkcji (typu THandle) jest identyfikatorem muteksu (nadawanym przez œrodowisko Windows). DEL-9-10(47 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... U ycie muteksu Dzia³anie funkcji WaitForSingleObject* ) jest nastêpuj¹ce: jeœli muteks nie ma w³aœciciela, funkcja powoduje, e jego w³aœcicielem staje siê program wywo³uj¹cy (tê funkcjê). Jeœli muteks ma ju w³aœciciela, program czeka a up³ynie czas podany w wywo³aniu funkcji, a nastêpnie funkcja przekazuje (jako wartoœæ) kod b³êdu. * ) w stosunku do muteksu, bo w ogólnoœci funkcja mo e dzia³aæ na ró nych obiektach DEL-9-10(48 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... U ycie muteksu Wywo³anie funkcji WaitForSingleObject : WaitForSingleObject (identyfikator-obiektu, czas-oczekiwania) Jeœli wartoœci¹ drugiego parametru jest 0, funkcja testuje stan podanego obiektu i natychmiast podaje wynik (co jest po ¹dane w rozwa anym problemie). Wartoœæ funkcji okreœla zdarzenie, które spowodowa³o zakoñczenie testowania. Do zbadania tej wartoœci wykorzystuje siê sta³e o przedrostku wait_ (zob. system pomocy). W naszym problemie nale y zbadaæ, czy wartoœæ funkcji jest ró na od wait_timeout (w przypadku muteksu sta³a ta oznacza, e ma on ju w³aœciciela). DEL-9-10(49 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza...... var muteks : THandle; begin U ycie muteksu utworzenie muteksu i (lub) przypisanie jego identyfikatora zmiennej muteks muteks:=createmutex(nil, False, MojMuteks ); if WaitForSingleObject(muteks, 0)<>wait_TimeOut sprawdzenie, czy muteks jest then begin w posiadaniu innego programu Application.Initialize; Application.CreateForm(TForm1, Form1);... Application.Run end end. DEL-9-10(50 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... U ycie muteksu Je eli dwa razy uruchomimy program z podanym kodem, zobaczymy, e tworzy on now¹ tymczasow¹ kopiê programu (na pasku zadañ pojawi siê piktogram), a nastêpnie po up³ywie czasu podanego w wywo³aniu funkcji WaitForSingleObject usuwa j¹. Nie wiadomo jednak w jaki sposób w³¹czyæ istniej¹cy egzemplarz programu. DEL-9-10(51 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Przeszukiwanie listy okien Aby wyszukaæ okreœlone okno g³ówne w œrodowisku Windows mo na u yæ funkcji API EnumWindows. Funkcja ta, zwana funkcj¹ wyliczeniow¹, wymaga podania jako parametru wskaÿnika do funkcji (zwanej funkcj¹ zwrotn¹ lub funkcj¹ powtórnego wywo³ania ang. callback function): EnumWindows (wskaÿnik-do-funkcji-zwrotnej, parametr ) gdzie parametr oznacza 32-bitowa wartoœæ przekazywana do funkcji zwrotnej (w naszym problemie wartoœæ ta jest nieistotna przyjmujemy 0). DEL-9-10(52 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Przeszukiwanie listy okien Koncepcja polega na tym, eby funkcjê zwrotn¹ wywo³aæ dla ka dego elementu na liœcie g³ównych okien œrodowiska Windows) a do koñca listy lub przyjêcia przez tê funkcjê wartoœci False, co zakoñczy tak e dzia³anie funkcji wyliczeniowej EnumWindows. Dla naszych celów funkcja zwrotna mo e mieæ nastêpuj¹c¹ postaæ (nielokalna zmienna ModuleName zawiera nazwê zbioru wykonywalnego bie ¹cego programu, a FoundWnd identyfikator odszukanego okna): DEL-9-10(53 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Przeszukiwanie listy okien function EnumWndProc (hwnd : THandle; Param : Cardinal) : Bool; stdcall; var ClassName, WinModuleName : string; WinInstance : THandle; begin Result:=True; SetLength (ClassName, 100); GetClassName (hwnd, PChar(ClassName), Length(ClassName)); ClassName:=PChar(ClassName); if ClassName=TForm1.ClassName then begin pobranie nazwy klasy o identyfikatorze hwnd dopasowanie d³ugoœci zak³adamy, e g³ówne okno nazywa siê Form1 SetLength (WinModuleName, 200); DEL-9-10(54 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Przeszukiwanie listy okien WinInstance:=GetWindowLong (hwnd, GWL_HINSTANCE); uzyskaniei dentyfikatora egzemplarza programu GetModuleFileName (WinInstance, PChar(WinModuleName), Length(WinModuleName)); pobranie nazwy zbioru wykonywalnego dotycz¹cego danego egzemplarza programu WinModuleName:=PChar(WinModuleName); ifw inmodulename=modulename then begin FoundWnd:=hwnd; end end {EnumWndProc}; Result:=False end porównanie nazw zbiorów wykonywalnych zakoñczenie wyliczania DEL-9-10(55 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Przeszukiwanie listy okien Jeœli w podanej funkcji nazwa zbioru programowego g³ównego okna (WinModuleName) odpowiada nazwie bie ¹cego programu (ModuleName), mo emy byæ pewni, e odszukaliœmy poprzedni egzemplarz tego samego programu. W takim przypadku nale y spowodowaæ uaktywnienie poprzedniego egzemplarza programu. Odpowiedni kod mo e mieæ postaæ DEL-9-10(56 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Przeszukiwanie listy okien... var hmutex, FoundWnd : THandle; ModuleName : string;... begin hmutex:=createmutex(nil, False, MyMutex2 ); if WaitForSingleObject(hMutex, 0)<>wait_TimeOut then begin Application.Initialize; Application.CreateForm(TForm1, Form1);... Application.Run end DEL-9-10(57 z 62)
end. Sprawdzanie obecnoœci poprzedniego egzemplarza... Przeszukiwanie listy okien else begin SetLength (ModuleName, 200); GetModuleFileName (HInstance, PChar(ModuleName), Length(ModuleName)); pobranie nazwy zbioru wykonywalnego bie ¹cego programu ModuleName:=PChar(ModuleName); // dopasuj dlugosc end EnumWindows (@EnumWndProc, 0); odszukanie g³ównego okna poprzedniego egzemplarza programu if FoundWnd<>0 then SetForegroundWindow (FoundWnd) DEL-9-10(58 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Przeszukiwanie listy okien Wywo³anie funkcji SetForegroundWindow nie powoduje uaktywnienia g³ównego okna poprzedniego egzemplarza programu, gdy zosta³o ono zminimalizowane (zob. pierwszy przypadek). Problem ten mo na rozwi¹zaæ przez spowodowanie, by poprzedni egzemplarz przywróci³ swoje g³ówne okno wskutek wys³ania odpowiedniej wiadomoœci z bie ¹cego egzemplarza. DEL-9-10(59 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Przeszukiwanie listy okien Instrukcjê if FoundWnd<>0 then SetForegroundWindow (FoundWnd) wystarczy zast¹piæ przez if FoundWnd<>0 then begin if not IsWindowVisible(FoundWnd) then PostMessage (FoundWnd,wm_User, 0, 0); SetForegroundWindow (FoundWnd) end DEL-9-10(60 z 62)
Sprawdzanie obecnoœci poprzedniego egzemplarza... Przeszukiwanie listy okien i w kodzie okna g³ównego dodaæ metodê obs³ugi tej wiadomoœci: type TForm1 = class(tform)... public procedure WMUser (var msg : TMessage); message wm_user; end;... procedure TForm1.WMUser (var msg : TMessage); begin Application.Restore end; DEL-9-10(61 z 62)
Na zakoñczenie prezentacja... DEL-9-10(62 z 62)