Einzelnen Beitrag anzeigen

madina

Registriert seit: 1. Nov 2005
153 Beiträge
 
#6

Re: Wie ein VCL aus TBitmap erstellen ?

  Alt 30. Sep 2009, 16:16
Hallo,

OK: nun bin ich soweit mit der Klasse und Komponente, daß ich diese Komponente in ein Appl. einfügen kann und den TTimer.enabled:= true; aus der Appl. setzen kann und der Timer reagiert auch jede Sekunde richtig.

NOK Problem: die Anzeige wird aber nicht jede Sek. aktualisiert warum ?

Delphi-Quellcode:
unit AnalogUhr;

interface

uses
  Windows, SysUtils, Classes, Graphics, ExtCtrls, Controls;

type
  TAnalogUhr = class(TImage)
  private
    { Private-Deklarationen }
    iOStunde,
    iOMinute,
    iOSekunde: Integer;
    clOFuellFarbe: TColor;
    FTimer: TTimer;
    byOEinAus: Boolean;

    iSinVal, iCosVal,
    iMX, iMY, // UhrMittelpunkt
    iR,
    iTX, iTY : Integer;
    TimeVal : Extended;
    BMP : TBitmap;
    S : String[2];

    // FOnOptionsChange: TNotifyEvent;
// FOnTimer1Timer: TNotifyEvent;

    Procedure SetStunde(iHour: Integer);
    Function GetStunde: Integer;
    Procedure SetMinute(iMin: Integer);
    Function GetMinute: Integer;
    Procedure SetSekunde(iSek: Integer);
    Function GetSekunde: Integer;
    Procedure SetFuelFarbe(clFarbe: TColor);
    Function GetFuelFarbe: TColor;

    Procedure SetTimer(byEinAus: Boolean);
    Function GetTimer: Boolean;
    // procedure DoOptionsChange;
    procedure Timer1Timer(Sender: TObject);
    Procedure Uhr;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
    property Stunde: Integer read GetStunde write SetStunde default 1;
    property Minute: Integer read GetMinute write SetMinute default 2;
    property Sekunde: Integer read GetSekunde write SetSekunde default 3;
    property FuellFarbe: TColor read GetFuelFarbe write SetFuelFarbe default clWhite;
    property TimerEinAus: Boolean read GetTimer write SetTimer default false;
// property OnTimer: TNotifyEvent read FOnTimer1Timer write FOnTimer1Timer;
    // property OnOptionsChange: TNotifyEvent read FOnOptionsChange write FOnOptionsChange;
  end;

procedure Register;

Var iI: Integer;

implementation

{###############################################################################
#
###############################################################################}

procedure Register;
begin
  RegisterComponents('Custom', [TAnalogUhr]);
end;

{###############################################################################
#
###############################################################################}

constructor TAnalogUhr.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FTimer := TTimer.Create(Self);
  FTimer.Enabled := false;
  FTimer.OnTimer := Timer1Timer;
  FTimer.Interval:= 1000;
  byOEinAus := false;

  BMP := TBitmap.Create;
  BMP.PixelFormat:= pf32bit;
  BMP.Width := ClientWidth;
  BMP.Height := ClientHeight;

  Stunde := 15;
  Minute := 22;
  Sekunde:= 11;

  Uhr;
end;

{###############################################################################
#
###############################################################################}

{procedure TAnalogUhr.DoOptionsChange;
begin
  if Assigned(FOnOptionsChange) then FOnOptionsChange(Self);
end;}


{###############################################################################
#
###############################################################################}

procedure TAnalogUhr.Timer1Timer(Sender: TObject);
begin
  Uhr
end;

{###############################################################################
#
###############################################################################}

Procedure TAnalogUhr.Uhr;
Procedure SinCosValue;
begin
  iSinVal:= Round(iR*SIN(TimeVal));
  iCosVal:= Round(iR*COS(TimeVal));
end;
Procedure Ausgabe;
begin
  SinCosValue;

  BMP.Canvas.MoveTo(iMX, iMY);
  BMP.Canvas.LineTo(iMX+iSinVal, iMY-iCosVal);
end;
begin
  BMP := TBitmap.Create;
  BMP.PixelFormat:= pf32bit;
  BMP.Width := ClientWidth;
  BMP.Height := ClientHeight;

  try
    // Mitte
    iMX:= ClientWidth div 2;
    iMY:= ClientHeight div 2;
    // GrößenFaktor
    if (iMX<iMY) then iR:= iMX*9 div 10
    else iR:= iMY*9 div 10;

    BMP.Canvas.Pen.Width := 1;
    BMP.Canvas.Font.Name := 'Tahoma';
    BMP.Canvas.Font.Height:= iR div 8;

    // Zahlen:
    for iI:=1 to 12 do
      begin
        TimeVal:= iI*2*PI/12;
        SinCosValue;

        S := IntToStr(iI);
        iTX:= BMP.Canvas.TextWidth(S);
        iTY:= BMP.Canvas.TextHeight(S);
        BMP.Canvas.TextOut(iMX+iSinVal-(iTX div 2), iMY-iCosVal-(iTY div 2), S);
      end;

    iR := iR*9 div 10; //
    iTX:= iR div 50;
    // Kreis
    BMP.Canvas.Ellipse(iMX-iR-iTX-4, iMY-iR-iTX-4, iMX+iR+iTX+4, iMY+iR+iTX+4);
    BMP.Canvas.Brush.Color:= clYellow;
    BMP.Canvas.FloodFill(iMX, iMY, clWhite, fsSurface);
    // Mittelpunkt
// BMP.Canvas.Ellipse(iMX-iTX, iMY-iTX, iMX+iTX, iMY+iTX);

    // PunkteMinuten:
    for iI:=1 to 60 do
      begin
        TimeVal:= iI*2*PI/60;
        SinCosValue;

        // MinutenPunkte
        BMP.Canvas.Ellipse(Rect(iMX+iSinVal-iTX, iMY-iCosVal-iTX, iMX+iSinVal+iTX, iMY-iCosVal+iTX));
      end;

    //----------------------Sekunden--------------------------------------------
    TimeVal:= Time*SecsPerDay*2*PI/60;
    Ausgabe;
    //----------------------Minuten---------------------------------------------
    BMP.Canvas.Pen.Width:= 2;
    TimeVal:= Time*MinsPerDay*2*PI/60;
    Ausgabe;
    //----------------------Stunden---------------------------------------------
    iR:= iR div 2;
    TimeVal:= Time*HoursPerDay*2*PI/12;
    Ausgabe;

    // Darstellung
    BitBlt(Canvas.Handle, 0, 0, BMP.Width, BMP.Height, BMP.Canvas.Handle, 0, 0, SRCCOPY);
  finally
    BMP.Free
  end
end;

{###############################################################################
#
###############################################################################}

{---------------Stunde---------------------------------------------------------}
Procedure TAnalogUhr.SetStunde(iHour: Integer);
begin
  if (iHour<>iOStunde) then iOStunde:= iHour;
end;

{###############################################################################
#
###############################################################################}

Function TAnalogUhr.GetStunde: Integer;
begin
  Result:= iOStunde;
end;

{###############################################################################
#
###############################################################################}

{--------------Minute----------------------------------------------------------}
Procedure TAnalogUhr.SetMinute(iMin: Integer);
begin
  if (iMin<>iOMinute) then iOMinute:= iMin;
end;

{###############################################################################
#
###############################################################################}

Function TAnalogUhr.GetMinute: Integer;
begin
  Result:= iOMinute;
end;

{###############################################################################
#
###############################################################################}

{---------------Sekunde--------------------------------------------------------}
Procedure TAnalogUhr.SetSekunde(iSek: Integer);
begin
  if (iSek<>iOSekunde) then iOSekunde:= iSek;
end;

{###############################################################################
#
###############################################################################}

Function TAnalogUhr.GetSekunde: Integer;
begin
  Result:= iOSekunde;
end;

{###############################################################################
#
###############################################################################}

Procedure TAnalogUhr.SetFuelFarbe(clFarbe: TColor);
begin
  if (clFarbe<>clOFuellFarbe) then clOFuellFarbe:= clFarbe;
end;

{###############################################################################
#
###############################################################################}

Function TAnalogUhr.GetFuelFarbe: TColor;
begin
  Result:= clOFuellFarbe;
end;

{###############################################################################
#
###############################################################################}

Procedure TAnalogUhr.SetTimer(byEinAus: Boolean);
begin
  if (byEinAus<>byOEinAus) then byOEinAus:= byEinAus;
  FTimer.Enabled:= byOEinAus
end;

{###############################################################################
#
###############################################################################}

Function TAnalogUhr.GetTimer: Boolean;
begin
  Result:= byOEinAus;
end;

{###############################################################################
#
###############################################################################}

destructor TAnalogUhr.Destroy;
begin
  inherited Destroy;
end;

end.
mfg
mfg
madina
  Mit Zitat antworten Zitat