[Delphi] Wyświetlanie stanu za pomocą ProgresBar’a

Wydaje się, że jest to proste zadanie: wystarczy umieścić na formie kontrolkę, pozmieniać nieco style i gotowe. Niestety praktyka wygląda zupełnie inaczej. Każdy, kto chciał to osiągnąć w Windowsie Vista lub 7 pewnie wie, że nowe paski postępu jednym szczegółem uniemożliwiają wykonanie tego tak prosto. Dzieje się tak, ponieważ pasek postępu przy włączonym Aero jest animowany i w żaden udokumentowany sposób nie da się owej animacji wyłączyć.

Microsoft oczywiście zaleca, aby zamiast standardowego ProgressBar’a użyć coś, co nazywa ‘Meter’. I tu pojawia się kolejny problem, bo o tym rozwiązaniu wzmianka znajduje się jedynie w tym przewodniku, nie ma natomiast żadnego opisu, jak takie coś można osiągnąć w praktyce a jedynym programem, w którym można zobaczyć jak takie coś działa jest Eksplorator Windows. Niestety podejrzenie w jaki sposób jest to wykonane od strony kodu jest dla większości praktycznie niewykonalne (nie można podejrzeć styli kontrolki za pomocą programów takich jak WinDowse więc jedynym sposobem byłaby dekompilacja). Na szczęście jest jeden trick umożliwiający wykonanie kontrolki przypominającej microsoftowy meter. Jak w każdym obejściu problemu tak i tu jest niestety jeden haczyk: po zmianie skórki np. na Klasyczny Windows, bądź też przy próbie zastosowania go w starszych wersjach Windows nie zobaczymy nic. Wymusza to więc zastosowanie dwóch kontrolek: dla Windows Vista/7 – tej, którą zajmę się za chwilę oraz standardowego ProgressBar’a dla starszych Windowsów.

Sam kod nie jest ani trudny do użycia, ani też jego napisanie nie stanowiło większego problemu. Przedstawia się on następująco:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var:tRECT;
theme:HTHEME;
Progress:integer;
begin
  Progress:=50;
  theme := OpenThemeData(Handle,'PROGRESS');
  if theme<>0 then
  begin
    SetRect(r,0,0,25,100);
    DrawThemeBackground(theme,Form1.Canvas.Handle,11,2,r,nil);
    SetRect(r,0,Progress,25,100);
    DrawThemeBackground(theme,Form1.Canvas.Handle,6,4,r,nil);
    CloseThemeData(theme);
  end;
end;

Jak widać dwukrotnie została użyta funkcja DrawThemeBackground: pierwszy raz rysuje ona tło, za drugim razem została użyta do narysowania paska postępu, który w tym wypadku został ustawiony na połowie maksymalnej wartości, a ponieważ pasek ma wysokość równą 100 nie było konieczności stosowania żadnych dodatkowych funkcji do przeliczania tej wartości. Zamiast Form1.Canvas lepiej byłoby użyć komponentu TPaintBox, ewentualnie możnaby wtedy nieco zmodyfikować kod tak, aby wypełniał cały komponent co ułatwiłoby późniejsze modyfikacje. Kod należy wkleić do zdarzenia OnPaint używanego komponentu. Jeżeli powyższy przykład jest dla kogoś niejasny bądź nie wie do czego służą poszczególne argumenty odsyłam do opisów poszczególnych funkcji w bibliotece MSDN: OpenThemeData, SetRect, DrawThemeBackground oraz CloseThemeData. Do funkcji DrawThemeBackground można przekazać także inne wartości (parametry 3 i 4) używając wartości podanych tutaj.
Dla mnie jednak próbowanie wszyskich wartości nie było zbyt wygodne, napisałem więc prosty program umożliwiający szybkie przejrzenie wszyskich elementów, które można użyć. Program ten można ściągnąć stąd i nie zaliczam go do projektów, ponieważ nie zamierzam wprowadzać do niego żadnych poprawek.

Posted in Tutorials | Tagged , , , , , , , | Leave a comment

Patenty, NSA i kolejna aplikacja do pobrania

Co wspólnego mają te 3 rzeczy? Otóż jakiś czas temu całkiem przypadkiem (żeby nie było, że mam zamiar wtrącać się w to co kombinuje wymieniona w tytule agencja) dowiedziałem się bardzo interesującego dla mnie faktu związanego z patentami (stąd tytuł). Jak można dowiedzieć się z Wikipedii agencja ta ma bardzo interesujące przywileje jeśli chodzi o przyznawanie patentów. Wygląda to tak, że gdy agencji przyznany zostaje patent nie zostaje on opublikowany. Jego publikacja następuje dopiero, gdy o podobny patent zacznie ubiegać się ktoś inny. Po szybkim wyszukaniu w bazie amerykańskiego biura patentowego (USPTO) można zauważyć, że taka sytuacja zdarzyła się od 1976 roku (bo tylko ten okres obejmuje baza) już prawie 200 razy.

Jako, że przeglądanie tych patentów w całości jest delikatnie mówiąc uciążliwe (po co amerykanie mieliby to komuś ułatwiać) postanowiłem napisać program, który by mi tą czynność ułatwił. Po paru tygodniach pisania i kilkukrotnego przerywania pracy na rzecz bardziej interesujących zajęć udało mi się stworzyć takie oto coś. Nazywa to się Bot patentowy i umożliwia zapisanie wybranego patentu (tylko amerykańskiego) na dysku. Do wyboru jest wersja TIF oraz HTML (ta druga to praktycznie czysty tekst, bez ilustracji). Ułatwia to życie o tyle, że teraz nie trzeba każdej strony z osobna zapisywać na dysku, żeby móc ją sobie obejrzeć, bo wszystkie strony zapisują się do jednego folderu i można je wygodnie przeglądać z użyciem systemowej przeglądarki obrazów. Wracając jednak do NSA to nigdy nie wiadomo co można znaleźć wśród tych wszystkich patentów a posiadanie wersji offline nie powinno mi raczej zaszkodzić. Pierwszy interesujący przykład podaje już sama Wikipedia i jest to sposób na lokalizację geograficzną komputerów w sieci takiej jak internet. Zawsze dobrze jest wiedzieć co służby mogą się o nas dowiedzieć w tym wypadku mając jedynie nasz adres IP. Kończąc już program można jak zawsze pobrać z działu Projekty lub klikając tu.

Posted in Uncategorized | Tagged , , , , | Leave a comment