Tworzenie własnego komponentu - progressbar

0

Pisałem o tym w dziale newbie, ale nikt nie raczy mi odpisać. Może tutaj znajdę lepszą odpowiedź?
A teraz do sedna ;p

Wypociłem taki oto kodzik:

unit ProgressBar;
 
interface
 
 uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls, ComCtrls, Buttons, ExtCtrls,
  WinTypes, WinProcs;
 
type
  TProgressBarOWN = class(TProgressBar)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
        procedure MouseMove(Shift: TShiftState;
  X, Y: Integer);
    { Public declarations }
  published
    { Published declarations }
 
 
 end;
 
 
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('Samples', [TProgressBarOWN]);
end;
 
///////////////////////////////////////////////
 
 
 
  procedure TProgressBarOWN.MouseMove(Shift: TShiftState;
  X, Y: Integer);
var
    newPosition : integer;
 begin
    if ssShift in Shift then
    begin
      Cursor := crHSplit;
      newPosition := Round(x * Max / ClientWidth) ;
      Position := newPosition;
    end
    else
    begin
      Cursor := crDefault;
    end;
 end;
 
 
 
//////////////////////////////////////////////////////
 
 
 
end.
 

Założenie jest takie, żeby utworzony progressbar można było regulować jak np. poziom głośności.
Miałem procedurkę dla progressbara w formie, ale chcę zaimplementować to bezpośrednio w komponent.
Innymi słowy chciałbym żeby po najechaniu myszką uaktywnił się event onmousemove, ale bez jakiegokolwiek pisania w programie.
Wszystko musi się znajdować w komponencie.

Co robię źle?

0

A pisali chłopaki żeby poczytać o tworzeniu i pisaniu komponentów... Widzę lekcje dalej nie odrobione...

W deklaracji swojego komponentu musisz przedefiniować konstruktor klasy bazowej (override):

type
  TTest = class(TProgressBar)
   private
     procedure MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
   public
     constructor Create(AOwner: TComponent); override;
     
   end;

potem w sekcji implementation przypisujesz twoje MouseMove do zdarzenia OnMoseMove:

{ TTest }

constructor TTest.Create(AOwner: TComponent);
begin
   inherited Create(AOwner);
   OnMouseMove:= MyMouseMove;
end;

procedure TTest.MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
    ShowMessage('To działa!');
end;

Ja też na początku przygody z Delphi miałem opory naciskać F1, ale naprawdę warto (jeżeli ktoś chce NAPRAWDĘ nauczyć się programować)

Pozdro...

0
unit ProgressBar;

interface
 
 uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls, ComCtrls, Buttons, ExtCtrls,
  WinTypes, WinProcs;

type
  TProgressBarOWN = class(TProgressBar)
  private
    { Private declarations }
  protected
    { Protected declarations }
     procedure MouseMove(Shift: TShiftState; X,Y: Integer); override;
  public
    { Public declarations }
  published
    { Published declarations }
 
 
 end;
 
 
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('Samples', [TProgressBarOWN]);
end;
 
///////////////////////////////////////////////
 

procedure TProgressBarOWN.MouseMove(Shift: TShiftState; X,Y: Integer);
var
    newPosition : integer;
 begin
    if ssShift in Shift then
    begin
      Cursor:= crHSplit;
      newPosition := Round(x * Max / ClientWidth) ;
      Position := newPosition;
    end
    else
    begin
      Cursor:= crDefault;
    end;
    inherited;
 end;



//////////////////////////////////////////////////////
 
 
 
end.

i chyba ssLeft a nie ssShift jak chcesz tylko myszką zmieniać

zibicoder o tworzeniu komponentów poczytaj też Ty wiesz co się stanie jak zechcesz obsłużyć zdarzenie OnMouseMove utworzonego po Twojemu komponentu?

0

dzięki wielkie kAzek ;]

czyli wszystko sprowadzało się do tej komendy override i inherited :/ muszę się jeszcze sporo pouczyć ;d

1 użytkowników online, w tym zalogowanych: 0, gości: 1