AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie ein VCL aus TBitmap erstellen ?

Ein Thema von madina · begonnen am 17. Sep 2009 · letzter Beitrag vom 30. Sep 2009
Antwort Antwort
madina

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

Wie ein VCL aus TBitmap erstellen ?

  Alt 17. Sep 2009, 14:32
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
mfg
madina
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Wie ein VCL aus TBitmap erstellen ?

  Alt 17. Sep 2009, 14:34
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Wie ein VCL aus TBitmap erstellen ?

  Alt 17. Sep 2009, 14:39
Oder TImage
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Wie ein VCL aus TBitmap erstellen ?

  Alt 17. Sep 2009, 14:43
Oder TGraphicControl
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#5

Re: Wie ein VCL aus TBitmap erstellen ?

  Alt 17. Sep 2009, 15:00
Zur 2. Frage: http://www.delphipraxis.net/internal...=701531#701531
  Mit Zitat antworten Zitat
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#7

Re: Wie ein VCL aus TBitmap erstellen ?

  Alt 30. Sep 2009, 16:23
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Wie ein VCL aus TBitmap erstellen ?

  Alt 30. Sep 2009, 16:54
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;
//.......
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
madina

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

Re: Wie ein VCL aus TBitmap erstellen ?

  Alt 30. Sep 2009, 17:21
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
mfg
madina
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Wie ein VCL aus TBitmap erstellen ?

  Alt 30. Sep 2009, 17:40
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.
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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