Programowanie Główna arrow delphi arrow Własny ProgressBar


Własny ProgressBar
Komponent ProgressBar służy do wyświetlania paska postępu. Jeżeli nie podoba się nam jego wygląd możemy zrobić własny komponent tego typu, będzie on tworzyć wygląd paska na podstawie 2 bitmap. Żeby zrobić nowy kompoenent wybieramy w menu Component->New Component.. . W polu Ancestor type wybieramy komponent z którego będziemy dziedziczyć właściwości - wybierz TGraphicControl . W polu Class Name wpisujemy nazwę komponentu jaki stworzymy np. TNewProgressBar, a w polu Palette Page nazwę zakładki na której będzie nasz komponent. W przed ostatnim polu wybieramy miejsce w którym będzie plik z komponentem (*.pas). Powinno wyjść coś takiego:

unit NewProgressBar;

interface

uses
SysUtils, Classes, Controls;

type
TTNewProgressBar = class(TGraphicControl)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Moje', [TNewProgressBar]);
end;

end.
W sekcji private umieszczamy zmienne lub procedury dostępne tylko w tym projekcie (nie będzie do nich dostępu z programu w którym użyjemy komponentu), podobnie jest w sekcji protected. W sekcji public umieszczamy to co "będzie dostępne" poza tym komponentem. W sekcji published także to co umieścimy będzie dostępne, ale tam umieszcza się właściwośći które będą w Object Inspector. Do listy modułów (uses) dodajemy pozycje: Windows, Graphics i Dialogs(w tej kolejności) .Teraz w sekcji private deklarujemy zmienne które wykorzystamy, i dodajemy też procedury które będą zapisywać właściwość Bitmap(w wypadku korzystania z operatora := powstanie błąd, należy skorzystać z metody Assign). Sekcja private powinna wyglądać teraz tak:

private
_Max, _Poz : Integer;
_Bitmapa1, _Bitmapa2: TBitmap;
_Styl_Obrzeza : TPen;
procedure UstawBitmape1(Wartosc:TBitmap);
procedure UstawBitmape2(Wartosc:TBitmap);

Zmienne _Bitmapa1 i _Bitmapa2 są bitmapami z których będzie powstawać wygląd komponentu. Teraz do sekcji public dodaj konstruktor i destruktor - będą inicjować zmienne i zwalniać pamięć. Należy też dodać procedurę Paint. Sekcja ta powinna teraz wyglądać tak:

public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
procedure Paint; override;

Teraz trzeba zrobić, by zmienne można bylo zmieniać z Object Inspecor. Aby to zrobić należy dodać do sekcji published np.

property Nazwa:Typ read Zmienna write Zmienna default 100;
Po słowie read wpisujemy nazwę zmiennej z której wartość będzie odczytywana, a po write zmienna do której będzie zapisywana wartość. Po default wpisujemy wartość domyślną. Można nie używać np. default, można też zrobić tak, by możliwe było tylko odczytywanie (nie używamy write). Sekcja published powinna wyglądać tak:

published
property Max:Integer read _Max write _Max default 100;
property Poz:Integer read _Poz write _Poz default 0;
property Styl_Obrzeza:TPen read _Styl_Obrzeza write _Styl_Obrzeza;
property Bitmapa1:TBitmap read _Bitmapa1 write UstawBitmape1;
property Bitmapa2:TBitmap read _Bitmapa2 write UstawBitmape2;
Teraz należy napisać procedury (podobnie jak w programie), należy umieścić je między "implementation" a

"end.". Tak powinno to wyglądać:

constructor TNewProgressBar.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
_Max:=100;
_Poz:=0;
_Bitmapa1:=TBitmap.Create;
_Bitmapa2:=TBitmap.Create;
_Styl_Obrzeza:=TPen.Create;
end;

destructor TNewProgressBar.Destroy;
begin
inherited;
_Bitmapa1.Free;
_Bitmapa2.Free;
_Styl_Obrzeza.Free;
end;

procedure TNewProgressBar.UstawBitmape1(Wartosc:TBitmap);
begin
if Wartosc.Width<>1 then
ShowMessage('Szerokość musi wynosić 1px!')
else _Bitmapa1.Assign(Wartosc);
end;

procedure TNewProgressBar.UstawBitmape2(Wartosc:TBitmap);
begin
if Wartosc2.Width<>1 then
ShowMessage('Szerokość musi wynosić 1px!')
else _Bitmapa2.Assign(Wartosc);
end;

Procedury zapisywania bitmap (UstawBitmape1 i UstawBitmape2), zrobione są tak, że gdy szerokość bitmapy bedzię różna od 1px wtedy nie zostanie zapisana ta bitmapa. Teraz należy tylko zrobić procedurę paint, która będzie odpowiedzialna za rysowanie komponentu. Rysowane będzie obrzeże (z wykorzystaniem _Styl_Obrzeza), następnie z wykorzystaniem _Bitmapa1 będzie rysowana część paska która jest "aktywna" i z pomocą _Bitmapa2 będzie rysowana reszta. Bitmapy powinny mieć 1px szerokości (tak jest łatwiej), jeśli nie będą mieć takiego rozmiaru-nie zostaną wczytane. Tak powinna wyglądać ta procedura:

procedure TNewProgressBar.Paint;
begin
self.Canvas.Pen.Assign(_Styl_Obrzeza);
self.Canvas.Rectangle(0,0,width,height);
if _Poz<>0 then
self.Canvas.StretchDraw(Rect(_Styl_Obrzeza.Width,_Styl_Obrzeza.Width,self.Width*_Poz div

_Max,_Styl_Obrzeza.Width+_Bitmapa1.Height),_Bitmapa1);
if _Poz<>_Max then
self.Canvas.StretchDraw(Rect(self.Width*_Poz div

_Max,_Styl_Obrzeza.Width,self.Width-_Styl_Obrzeza.Width*2+1,_Styl_Obrzeza.Width+_Bitmapa2.Height),_Bitmapa2);

self.Canvas.Pen.Assign(_Styl_Obrzeza);
self.Canvas.Brush.Style:=bsClear;
self.Canvas.Rectangle(0,0,width,height);
self.Height:=_Styl_Obrzeza.Width*2+Bitmapa1.Height;
end;ght:=_Styl_Obrzeza.Width*2+Bitmapa1.Height;
end;

Ostatnia linijka kodu, zmienia wysokość komponentu-będzie równa 2*szerokość obrzeza+szerokość bitmapy 1. Teraz należy tylko zainstalować komponent. Wybieramy w menu Component->Instal Component.. i w oknie w pierwszym polu wybiermy adres do pliku *.pas z komponentem, w Package file name wybieramy folder w którym jest Delphi Libdclusr.dpk . Teraz klikamy na OK, powinien wyświetlić się komunikat, klikamy na Yes - komponent powinien zostać zainstalowany. Neleży jeszcze skopiować plik *.dcu do katalogu Lib w miejscu zainstalowania Delphi. Żeby w trakcie programu zmienić właściwość Poz i było to widoczne trzeba użyć procedure rysującą:

NewProgressBar1.Poz:=50;
NewProgressBar1.Paint;

site copyright © http://www.e-kursy.com
webcam | Pozycjonowanie Legnica | Linki | odzyskiwanie danych | pozycjonowanie
odżywki | tekst piosenki | liposukcja | Odzysk ciepła | Tatry, noclegi | hale magazynowe | pozycjonowanie | najlepsze kredyty gotówkowe | Pozycjonowanie | Kontrola paliwa