![]() |
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:
Beim Kompilieren der Komponente kommt die Fehlermeldung:
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; "Inkompatible Typen: 'TComponentClass' und 'Class reference'" 2. wie kann ich diesen neuen Komponenten mit eigenen Icon dann versehen ? mfg |
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. |
Re: Wie ein VCL aus TBitmap erstellen ?
Oder TImage
|
Re: Wie ein VCL aus TBitmap erstellen ?
Oder TGraphicControl ;)
|
Re: Wie ein VCL aus TBitmap erstellen ?
Zur 2. Frage:
![]() |
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:
mfg
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. |
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. |
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; //....... |
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 |
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 11:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz