|
Antwort |
Registriert seit: 14. Nov 2005 561 Beiträge RAD-Studio 2009 Ent |
#1
hi ...
also ich weiss nicht woran es liegt, aber das OnClick Ereignis geht net:
Delphi-Quellcode:
{------------------------------------------------------------------------------}
{ Borland Delphi Visual Component Library } { } { SoftScrollingText.pas - EnemyleftSoftScrollingText } { } { Mit dieser Komponente kannst du z.B. im Info-Teil deines Programms } { Informationen Preis geben. Das interessante daran, du kannst den Text wie } { ein Filmabspann laufen lassen. ssText1.scroll := true ! } { Dein Text kann ein und oder Ausgeblendet werden, benutze dazu die } { Farbverläufe. } { } { } { OpenSource: } { } { Diese Komponente kann beliebig und frei eingesetzt werden. } { Sie unterliegt keiner rechtlichen Bestimmung. } { Auch kannst du die Komponente beliebig anpassen oder weiter entwickeln. } { } { Unter ReleaseNotes kannst du deinen Namen hinschreiben und erklären } { was du gemacht hast. ES WERDEN KEINE NAMEN GELÖSCHT. Es wäre nett, wenn } { du nach deinen Änderungen die Komponente wieder öffentlich zur Verfügung } { stellst und die relevanten Personen darüber informierst. } { } {------------------------------------------------------------------------------} /////////////////////////////////////////////////////////////////////////////// // SOFTSCROLLINGTEXT (OS) 2009, Enemyleft [email]enemyleft@gmail.com[/email] /////////////////////////////////////////////////////////////////////////////// // ReleaseNotes: // // > v1.0.0 27.05.09 - Enemyleft > Fertiges **RELEASE 1.0** // // RELEASE 1.0 Features By Enemyleft // --------------------------------- // . SoftScrollingText // . blend- in/-out properties // . horizontal gradient // . vertical gradient // . many color propertys // /////////////////////////////////////////////////////////////////////////////// unit SSText; interface uses SysUtils, Classes, Controls, ExtCtrls, Windows, Dialogs, Messages, GraphUtil, Graphics, Math, GR32, GR32_Image; type gradient = (grNone, grToptoBottom, grLefttoRight); BlendMode = (bmNone, bmIn, bmOut); TSSText = class(TCustomControl) private { Private-Deklarationen } tx: Integer; ty: Integer; ScrollTimer: TTimer; TextWidth: Integer; FTextPosFromLeft: Integer; FTextBeginHight: Integer; FColor1: TColor; FColor2: TColor; FPanelColorTop1: TColor; FPanelColorTop2: TColor; FPanelColorBottom1: TColor; FPanelColorBottom2: TColor; FPanelColorRight1: TColor; FPanelColorRight2: TColor; FPanelColorLeft1: TColor; FPanelColorLeft2: TColor; FGradient: gradient; FShowPanelTop: Boolean; FShowPanelLeft: Boolean; FShowPanelRight: Boolean; FShowPanelBottom: Boolean; FCaption: TCaption; FBorder: Boolean; FBorderColor: TColor; FLines: TStrings; FScroll: Boolean; FSpeedx: Integer; FSpeedy: Integer; FSpReversex: Boolean; FSpReversey: Boolean; pb: TPaintBox32; bmp32: TBitmap32; procedure SetTextPosFromLeft(Value: Integer); procedure SetTextBeginHight(Value: Integer); procedure SetColor1(Value: TColor); procedure SetColor2(Value: TColor); procedure SetPanelColorTop1(Value: TColor); procedure SetPanelColorTop2(Value: TColor); procedure SetPanelColorBottom1(Value: TColor); procedure SetPanelColorBottom2(Value: TColor); procedure SetPanelColorRight1(Value: TColor); procedure SetPanelColorRight2(Value: TColor); procedure SetPanelColorLeft1(Value: TColor); procedure SetPanelColorLeft2(Value: TColor); procedure SetGradient(Value: gradient); procedure SetShowPanelTop(Value: Boolean); procedure SetShowPanelLeft(Value: Boolean); procedure SetShowPanelRight(Value: Boolean); procedure SetShowPanelBottom(Value: Boolean); procedure SetCaption(Value: TCaption); procedure SetBorder(Value: Boolean); procedure SetBorderColor(Value: TColor); procedure SetLines(Value: TStrings); procedure SetSpeedx(Value: Integer); procedure SetSpeedy(Value: Integer); procedure SetSpReversex(Value: Boolean); procedure SetSpReversey(Value: Boolean); procedure SetScroll(Value: Boolean); procedure TimerAction(Sender: TObject); procedure PaintText; protected { Protected-Deklarationen } procedure SetTextWidth; procedure DrawGradientV(bmp32: TBitMap32; Color1, Color2: TColor; Rect: TRect; Alpha: Integer; Blend: blendmode); procedure DrawGradientH(bmp32: TBitMap32; Color1, Color2: TColor; Rect: TRect; Alpha: Integer; Blend: blendmode); procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; procedure Paint; override; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } property TextPosL: Integer read FTextPosFromLeft write SetTextPosFromLeft; property TextPosT: Integer read FTextBeginHight write SetTextBeginHight; property Color1: TColor read FColor1 write SetColor1; property Color2: TColor read FColor2 write SetColor2; property PanelColorTop1: TColor read FPanelColorTop1 write SetPanelColorTop1; property PanelColorTop2: TColor read FPanelColorTop2 write SetPanelColorTop2; property PanelColorBottom1: TColor read FPanelColorBottom1 write SetPanelColorBottom1; property PanelColorBottom2: TColor read FPanelColorBottom2 write SetPanelColorBottom2; property PanelColorRight1: TColor read FPanelColorRight1 write SetPanelColorRight1; property PanelColorRight2: TColor read FPanelColorRight2 write SetPanelColorRight2; property PanelColorLeft1: TColor read FPanelColorLeft1 write SetPanelColorLeft1; property PanelColorLeft2: TColor read FPanelColorLeft2 write SetPanelColorLeft2; property Gradient: gradient read FGradient write SetGradient; property ShowPanelTop: Boolean read FShowPanelTop write SetShowPanelTop; property ShowPanelLeft: Boolean read FShowPanelLeft write SetShowPanelLeft; property ShowPanelRight: Boolean read FShowPanelRight write SetShowPanelRight; property ShowPanelBottom: Boolean read FShowPanelBottom write SetShowPanelBottom; property Caption: TCaption read FCaption write SetCaption; property Lines: TStrings read FLines write SetLines; property Speedx: Integer read FSpeedx write SetSpeedx; property Speedy: Integer read FSpeedy write SetSpeedy; property SpReversex: Boolean read FSpReversex write SetSpReversex; property SpReversey: Boolean read FSpReversey write SetSpReversey; property Scroll: Boolean read FScroll write SetScroll; property ShowBorder: Boolean read FBorder write SetBorder; property BorderColor: TColor read FBorderColor write SetBorderColor; property Font; property Anchors; property Action; property Align; property BiDiMode; property DragCursor; property DragKind; property DragMode; property ParentBiDiMode; property ParentShowHint; property PopupMenu; property ShowHint; property TabOrder; property TabStop; property Visible; property OnClick; end; procedure Register; implementation procedure Register; begin RegisterComponents('enemyleft', [TSSText]); end; constructor TSSText.Create(AOwner: TComponent); begin inherited Create(AOwner); DoubleBuffered := true; // Ohne DoubleBuffer würde das ganz schön flackern! Width := 200; Height := 100; FColor1 := clBtnFace; FColor2 := clBtnFace; FPanelColorTop1 := clBtnFace; FPanelColorTop2 := clBtnFace; FPanelColorBottom1 := clBtnFace; FPanelColorBottom2 := clBtnFace; FPanelColorRight1 := clBtnFace; FPanelColorRight2 := clBtnFace; FPanelColorLeft1 := clBtnFace; FPanelColorLeft2 := clBtnFace; FGradient := grNone; FShowPanelTop := True; FShowPanelLeft := False; FShowPanelRight := False; FShowPanelBottom := True; FBorder := False; FBorderColor := clWindowText; FLines := TStringList.Create; FLines.Add('#enemyleft'); TextWidth := 100; FTextPosFromLeft := 10; FTextBeginHight := 20; tx := FTextBeginHight; ty := FTextPosFromLeft; FScroll := False; FSpeedx := 1; FSpeedy := 0; FSpReversex := False; FSpReversey := False; ScrollTimer := TTimer.Create(Self); ScrollTimer.Interval := 100; ScrollTimer.OnTimer := TimerAction; ScrollTimer.Enabled := FScroll; pb := TPaintBox32.Create(Self); pb.Parent := Self; pb.Width := Width; pb.Height := Height; bmp32 := TBitmap32.Create; bmp32.Width := pb.Width; bmp32.Height := pb.Height; end; destructor TSSText.Destroy; begin inherited Destroy; end; procedure TSSText.DrawGradientV(bmp32: TBitMap32; Color1, Color2: TColor; Rect: TRect; Alpha: Integer; Blend: blendmode); var i, R, G, B: Integer; blender: Integer; col32: TColor32; begin blender := 255 div (Rect.Right - Rect.Left); Color1 := ColorToRGB(Color1); Color2 := ColorToRGB(Color2); for i := 0 to (Rect.Right - Rect.Left) - 1 do begin R := GetRValue(Color1) - (((GetRValue(Color1) - GetRValue(Color2)) * I) DIV (Rect.Right - Rect.Left)); G := GetGValue(Color1) - (((GetGValue(Color1) - GetGValue(Color2)) * I) DIV (Rect.Right - Rect.Left)); B := GetBValue(Color1) - (((GetBValue(Color1) - GetBValue(Color2)) * I) DIV (Rect.Right - Rect.Left)); col32 := Color32(R,G,B,Alpha); bmp32.LineAs(Rect.Left + I, Rect.Top, Rect.Left + I, Rect.Bottom, col32); if Blend = bmIn then begin Alpha := Alpha - blender; if Alpha < 0 then Alpha := 0; end else if Blend = bmOut then begin Alpha := Alpha + blender; if Alpha > 255 then Alpha := 255; end; end; end; procedure TSSText.DrawGradientH(bmp32: TBitMap32; Color1, Color2: TColor; Rect: TRect; Alpha: Integer; Blend: blendmode); var i, R, G, B: Integer; blender: Integer; col32: TColor32; begin blender := 255 div (Rect.Bottom - Rect.Top); Color1 := ColorToRGB(Color1); Color2 := ColorToRGB(Color2); for i := 0 to (Rect.Bottom - Rect.Top) - 1 do begin R := GetRValue(Color1) - (((GetRValue(Color1) - GetRValue(Color2)) * I) DIV (Rect.Bottom - Rect.Top)); G := GetGValue(Color1) - (((GetGValue(Color1) - GetGValue(Color2)) * I) DIV (Rect.Bottom - Rect.Top)); B := GetBValue(Color1) - (((GetBValue(Color1) - GetBValue(Color2)) * I) DIV (Rect.Bottom - Rect.Top)); col32 := Color32(R,G,B,Alpha); bmp32.LineAs(Rect.Left, Rect.Top + I, Rect.Right, Rect.Top + I, col32); if Blend = bmIn then begin Alpha := Alpha - blender; if Alpha < 0 then Alpha := 0; end else if Blend = bmOut then begin Alpha := Alpha + blender; if Alpha > 255 then Alpha := 255; end; end; end; procedure TSSText.TimerAction(Sender: TObject); begin // move text up / down if not FSpReverseX then begin if tx <= 0 - Canvas.TextHeight(FLines.Strings[0]) * FLines.Count then tx := Height; tx := tx - FSpeedx end else begin if tx >= Height then tx := 0 - Canvas.TextHeight(FLines.Strings[0]) * FLines.Count; tx := tx + FSpeedx end; // move text left / right if not FSpReverseY then begin if ty >= Width then ty := 0 - TextWidth; ty := ty + FSpeedy end else begin if ty <= 0 - TextWidth then ty := Width; ty := ty - FSpeedy end; // repaint Repaint; end; procedure TSSText.PaintText; var I: Integer; begin if FLines.Count > 0 then begin bmp32.Canvas.Font.Assign(Font); bmp32.Canvas.Brush.Style := bsClear; for I := 0 to FLines.Count -1 do bmp32.Canvas.TextOut(ty, tx + bmp32.Canvas.TextHeight(FLines.Strings[0]) * I, FLines.Strings[I]); end; end; procedure TSSText.Paint; var Rect1,Rect2,Rect3,Rect4,Rect5: TRect; begin pb.width := Width; pb.Height := Height; bmp32.Width := pb.Width; bmp32.Height := pb.Height; // übergabeparameter Rect bereitstellen, // wenn Verlauf ausgewählt if Gradient <> grNone then begin Rect1.Left := 0; Rect1.Top := 0; Rect1.Right := Width; Rect1.Bottom := height; // Verlauf herstellen if (FGradient = grTopToBottom) then DrawGradientH(bmp32, FColor1, FColor2, Rect1, 255, bmNone) else if (FGradient = grLeftToRight) then DrawGradientV(bmp32, FColor1, FColor2, Rect1, 255, bmNone) end else begin bmp32.Canvas.Pen.Color := FColor1; bmp32.Canvas.Brush.Style := bsSolid; bmp32.Canvas.Brush.Color := FColor1; bmp32.Canvas.Rectangle(0,0,Width,Height); end; {panel gradient for blending: TOP} with Rect2 do begin Left := 0; Top := 0; Right := Width; Bottom := 51; end; {panel gradient for blending: BOTTOM} with Rect3 do begin Left := 0; Top := Height-51; Right := Width; Bottom := Height; end; {panel gradient: LEFT} with Rect4 do begin Left := 0; Top := 0; Right := 51; Bottom := Height; end; {panel gradient: RIGHT} with Rect5 do begin Left := Width-51; Top := 0; Right := Width; Bottom := Height; end; PaintText; {TOP blending} if FShowPanelTop then DrawGradientH(bmp32, FPanelColorTop1, FPanelColorTop2, Rect2, 255, bmIn); {BOTTOM blending} if FShowPanelBottom then DrawGradientH(bmp32, FPanelColorBottom1, FPanelColorBottom2, Rect3, 0, bmOut); {LEFT panel} if FShowPanelLeft then DrawGradientV(bmp32, FPanelColorLeft1, FPanelColorLeft2, Rect4, 255, bmIn); {RIGHT panel} if FShowPanelRight then DrawGradientV(bmp32, FPanelColorRight1, FPanelColorRight2, Rect5, 0, bmOut); // Rand Zeichnen if (FBorder) then begin bmp32.Canvas.Pen.Color := ColorToRGB(FBorderColor); bmp32.Canvas.Brush.Style := bsClear; bmp32.Canvas.Rectangle(0,0,Width,Height); end; pb.Buffer.Assign(bmp32); end; procedure TSSText.SetTextWidth; var I: Integer; begin for I := 0 to Lines.Count - 1 do if TextWidth < Canvas.TextWidth(FLines.Strings[I]) then TextWidth := Canvas.TextWidth(FLines.Strings[I]); end; procedure TSSText.SetColor1(Value: TColor); begin if (FColor1 <> Value) then begin FColor1 := Value; RePaint; end; end; procedure TSSText.SetPanelColorTop1(Value: TColor); begin if (FPanelColorTop1 <> Value) then begin FPanelColorTop1 := Value; RePaint; end; end; procedure TSSText.SetPanelColorTop2(Value: TColor); begin if (FPanelColorTop2 <> Value) then begin FPanelColorTop2 := Value; RePaint; end; end; procedure TSSText.SetPanelColorBottom1(Value: TColor); begin if (FPanelColorBottom1 <> Value) then begin FPanelColorBottom1:= Value; RePaint; end; end; procedure TSSText.SetPanelColorBottom2(Value: TColor); begin if (FPanelColorBottom2 <> Value) then begin FPanelColorBottom2:= Value; RePaint; end; end; procedure TSSText.SetColor2(Value: TColor); begin if (FColor2 <> Value) then begin FColor2 := Value; RePaint; end; end; procedure TSSText.SetGradient(Value: gradient); begin if (FGradient <> Value) then begin FGradient := Value; RePaint; end; end; procedure TSSText.CMTextChanged(var Message: TMessage); begin FCaption := Name; end; procedure TSSText.SetCaption(Value: TCaption); begin if (FCaption <> Value) then begin FCaption := Value; RePaint; end; end; procedure TSSText.SetBorder(Value: Boolean); begin if (FBorder <> Value) then begin FBorder := Value; RePaint; end; end; procedure TSSText.SetBorderColor(Value: TColor); begin if (FBorderColor <> Value) then begin FBorderColor := Value; RePaint; end; end; procedure TSSText.SetLines(Value: TStrings); begin if (FLines <> Value) then begin FLines.Assign(Value); SetTextWidth; RePaint; end; end; procedure TSSText.SetSpeedx(Value: Integer); begin if (FSpeedx <> Value) then FSpeedx := Value; end; procedure TSSText.SetSpeedy(Value: Integer); begin if (FSpeedy <> Value) then FSpeedy := Value; end; procedure TSSText.SetScroll(Value: Boolean); begin if (FScroll <> Value) then begin FScroll := Value; ScrollTimer.Enabled := FScroll; end; end; procedure TSSText.SetPanelColorRight1(Value: TColor); begin if (FPanelColorRight1 <> Value) then begin FPanelColorRight1 := Value; Repaint; end; end; procedure TSSText.SetPanelColorRight2(Value: TColor); begin if (FPanelColorRight2 <> Value) then begin FPanelColorRight2 := Value; Repaint; end; end; procedure TSSText.SetPanelColorLeft1(Value: TColor); begin if (FPanelColorLeft1 <> Value) then begin FPanelColorLeft1 := Value; Repaint; end; end; procedure TSSText.SetPanelColorLeft2(Value: TColor); begin if (FPanelColorLeft2 <> Value) then begin FPanelColorLeft2 := Value; Repaint; end; end; procedure TSSText.SetShowPanelTop(Value: Boolean); begin if (FShowPanelTop <> Value) then begin FShowPanelTop := Value; Repaint; end; end; procedure TSSText.SetShowPanelLeft(Value: Boolean); begin if (FShowPanelLeft <> Value) then begin FShowPanelLeft := Value; Repaint; end; end; procedure TSSText.SetShowPanelRight(Value: Boolean); begin if (FShowPanelRight <> Value) then begin FShowPanelRight := Value; Repaint; end; end; procedure TSSText.SetShowPanelBottom(Value: Boolean); begin if (FShowPanelBottom <> Value) then begin FShowPanelBottom := Value; Repaint; end; end; procedure TSSText.SetTextPosFromLeft(Value: Integer); begin if (FTextPosFromLeft <> Value) then begin FTextPosFromLeft := Value; Repaint; end; end; procedure TSSText.SetTextBeginHight(Value: Integer); begin if (FTextBeginHight <> Value) then begin FTextBeginHight := Value; tx := FTextBeginHight; Repaint; end; end; procedure TSSText.SetSpReversex(Value: Boolean); begin if (FSpReverseX <> Value) then FSpReverseX := Value; end; procedure TSSText.SetSpReversey(Value: Boolean); begin if (FSpReverseY <> Value) then FSpReverseY := Value; end; end.
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
|
Zitat |
Registriert seit: 5. Mär 2008 131 Beiträge Delphi 2005 Personal |
#2
Hallo Cherry,
Dein Click Ereignis sollte funktionieren, da du es ja nicht überschreibst um Aktionen innerhalb der Komponente auszulösen. Mir ist aufgefallen,dass du im Destroyer die Objekte welche du im Constructer erstellst nicht wieder frei gibst. Gruss Dieter |
Zitat |
Registriert seit: 14. Nov 2005 561 Beiträge RAD-Studio 2009 Ent |
#3
Zitat von Optiplex:
Dein Click Ereignis sollte funktionieren, da du es ja nicht überschreibst um Aktionen innerhalb der Komponente auszulösen.
Zitat von Optiplex:
Mir ist aufgefallen,dass du im Destroyer die Objekte welche du im Constructer erstellst nicht wieder frei gibst.
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
|
Zitat |
Registriert seit: 14. Nov 2005 561 Beiträge RAD-Studio 2009 Ent |
#4
Ich weiss nicht, aber irgendwie hilft es mir meine Probleme hier zu posten, obwohl ich schon wieder selber auf die Lösung gekommen bin
Nun ich habe die Komponente von TCustomControl abgeleitet und dan eine TPaintBox32 über die Komponente gelegt. Dadruch funktionierte zwar das OnClick Ereignis eigentlich schon, aber ich kann ja gar nicht auf meine eigentliche Komponente klicken, denn da ist ja immer die PaintBox im weg *lol* Also habe ich die Komponente jetzt von TPaintBox32 abgeleitet, was ohnehin schon mal viel schöner ist! PS: Das ganze Package gibts bei OpenSource unteranderem ist dort auch nocht ein Color Button enthalten...
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
|
Zitat |
Registriert seit: 5. Mär 2008 131 Beiträge Delphi 2005 Personal |
#5
Mir ist nur noch aufgefallen das du das Property Caption unnötigerweise doppelt setzt, wenn du schon CMTextChanged auswertest dann brauchst du auch nicht noch mal eine procedure setcaption da CMTextChance direkt das Caption neu zeichnen kann.
procedure CMTextChanged( var msg:TMessage); begin interited repaint end; willst du den Namen der Komponente im Editor ausgeben willst dann im Paint Ereignis mit Componentstate auswerten. Dieter |
Zitat |
Registriert seit: 30. Dez 2002 Ort: Brandshagen 1.819 Beiträge Delphi 2007 Professional |
#6
Hi cherry,
schön, dass du deinen gesamten Code hier postest, aber wiederum kein Wunder, dass du den Fehler zuerst findest. Erstens ist mir das zu viel zum durchsehen, da clicke ich den Thread erst mal wieder weg. Selbst wenn, bist du eher schneller in deinem Code, bis ein anderer da durch ist. Lass in Zukunft den unwichtigen Rest weg. Mit dem Constructor, den embedded Components in deinem CustomControl und der Fehlerbeschreibung währe es schneller gegangen. Dann hätte auch ich dir sagen können, dass deine Paintbox das OnClick erhält. Nichts für ungut. Dann noch mal zum Code. Mir ist nicht ganz klar, warum du beim Platzieren deiner neuen Komponente keine Fehlrmeldung bekommst. Du weist deiner PaintBox im Create deines CustomControl den Parent self zu. Das geht definitiv schief. Zu dieser Zeit hat das CustomControl noch kein Handle. Gruß oki
42
|
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |