Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wie ein VCL aus TBitmap erstellen ? (https://www.delphipraxis.net/140396-wie-ein-vcl-aus-tbitmap-erstellen.html)

madina 17. Sep 2009 14:32


Wie ein VCL aus TBitmap erstellen ?
 
Hallo,

ich programmiere zum ersten mal eine Klasse und weiß nicht viel darüber, aber zu mindest habe ich aus der Hilfe diese Klasse zusammengestellt.

1. ich habe vor aus einer TBitmap ein VCL-Klasse zu erstellen:

Delphi-Quellcode:
type
  TAnalogUhr = class(TBitmap)
  private
    { Private-Deklarationen } 
    iOStu: Integer;
    iOMin: Integer;
    iOSec: Integer;

    Procedure SetStunde(iHour: Integer);
    Function GetStunde: Integer;
  protected
    { Protected-Deklarationen } 
  public
    { Public-Deklarationen }   
  published
    { Published-Deklarationen } 
    property Stunde: Integer read GetStunde write SetStunde default 0;
{    property Minute: Integer read GetMinute write SetMinute default 0;
    property Sekunde: Integer read GetSekunde write SetSekunde default 0;}
  end;

procedure Register;

implementation

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

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

Function TAnalogUhr.GetStunde;
begin
  Result:= iOStu;
end;
Beim Kompilieren der Komponente kommt die Fehlermeldung:

"Inkompatible Typen: 'TComponentClass' und 'Class reference'"

2. wie kann ich diesen neuen Komponenten mit eigenen Icon dann versehen ?

mfg

Bernhard Geyer 17. Sep 2009 14:34

Re: Wie ein VCL aus TBitmap erstellen ?
 
Dine komponente muß als (direkte oder indirekte) Basisklasse TComponent haben. TBitmap hat aber als Vorfahre kein TComponent.
Wenn dann wäre TPicture dein nötiger Vorfahre.

mkinzler 17. Sep 2009 14:39

Re: Wie ein VCL aus TBitmap erstellen ?
 
Oder TImage

DeddyH 17. Sep 2009 14:43

Re: Wie ein VCL aus TBitmap erstellen ?
 
Oder TGraphicControl ;)

Andreas L. 17. Sep 2009 15:00

Re: Wie ein VCL aus TBitmap erstellen ?
 
Zur 2. Frage: http://www.delphipraxis.net/internal...=701531#701531

madina 30. Sep 2009 16:16

Re: Wie ein VCL aus TBitmap erstellen ?
 
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

himitsu 30. Sep 2009 16:23

Re: Wie ein VCL aus TBitmap erstellen ?
 
Der Timer läuft im Sekundenintervall, das aber nicht ganz genau und vorallem nicht synchron zur Zeit.
Und darum kann es passieren, daß optisch auch mal eine Sekunde ausfällt.

Nimm 200, 500 oder (nehm ich für sowas gern) 333 ms für den Timer.

NickelM 30. Sep 2009 16:54

Re: Wie ein VCL aus TBitmap erstellen ?
 
Ich würde sagen nihm als Klasse auf jedenfall TGraphicControl. Dort gibt es eine Standardprozedur namens Paint. Die wird immer ausgeführt wenn es neu gezeichnet wird. Du kannst dan auch wenn du kein Bitmap verwenden willst direkt mit der Eigenschaft Canvas machen, da TGraphicControl es bereits besitzt.
Ich würd dir dann empfehlen die Prozedure zu überschreiben und dann dort deine Zeichnen Prozedure einzubauen. (Aber trotzdem die OnTimer Event lassen):

Das mit DoOptionsChange und OnOptionsChange soll das ein eigenes Event sein? Also was nicht in den Klassen davor schon vorhanden ist sein?
Wenn es ein eigenes Event sein soll ist dies in der Form richtig.

Das würde dann so aussehen:
Delphi-Quellcode:
 TAnalogUhr = class(TGraphicControl)
  private
  //...
  protected
    { Protected-Deklarationen } 
  public
    { Public-Deklarationen }
    procedure Paint; override;
  //......
  published
  //......
  end;

procedure Register;

Var iI: Integer;

implementation
//........
procedure TAnalogUhr.Paint;
begin
Uhr;
end;
//.......

madina 30. Sep 2009 17:21

Re: Wie ein VCL aus TBitmap erstellen ?
 
Hallo,

jetzt nach den Änderungen beim Einfügen der Komponente ins Appl. kommt die Meldung:

"Element " hat kein übergeordnetes Fenster."

ich bitte um etwas Sourcecode.

mfg

NickelM 30. Sep 2009 17:40

Re: Wie ein VCL aus TBitmap erstellen ?
 
LOL????????????
Kamm das jetzt erst durch meine Änderung????
Ich kenn des nur davon, dass wenn ein Fensterorientiers wie TButton anstelle des Timmers z.b. erstellt wird.
Timer ist doch eine Art Dialog zeug (also was zur Laufzeit nicht angezeigt wird)
Hm....weis grad echt net warum des so ist....hatte des halt nur in dem bezug gekannt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz