![]() |
Ticker-Text
Hoi,
wie stellt man es unter Delphi an einen String als Ticker auf einem Form von links nach rechts wiederholt durchlaufen zu lassen. Ich hätte da nicht mal ne Idee?! :| |
Re: Ticker-Text
Zitat:
Nimm ein Label und eine TTime-Komponente. Das Intervall von TTime legst du auf einen geeigneten Wert (z.B.: 100ms) Tritt das Ereignis ein -also der Timer hat 100ms geliefert- (OnTimer) veränderst du die Caption des Labels. Du schneidest vorne ein Zeichen des Strings der Caption ab und setzt hinten ein Zeichen deines Testes hin. Das müsste mit einer Zählvariablen gut klappen. Leider kann ich dir keinen Source liefern, da ich die Hilfe für ttimer.ontimer nicht ganz verstanden habe. Schau es dir mal an. Falls du weißt wie man ein "TNotifyEvent"(siehe "Hilfe") behandelt, dürfte es kein Problem mehr sein. MfG Phil |
thx
aber damit kann ich wenig anfangen. Gibt es vielleicht eine Komponente die dies realisieren kann?? |
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var Text : STRING; begin Text := Copy (Label1.Caption,2,length(Label1.Caption)-1)+ Label1.Caption[1]; Label1.Caption := Text; end; |
Anfangs sollte man aber noch imho das Intervall setzen.
Also: timer1.interval:=100; (*ms) Da die Standarteinstellung für den Timer 1000 (also 1s) ist und dies dann eher nach nix aussieht. (Kleine Zwischenfrage ohne unnötigerweise einen neuen Thread zu eröffnen) @Lucky: Ist die procedure automatisch die OnTimer Eigenschaft, bzw. wird diese Procedure nach einem Intervall aufgerufen? Ich verstehe immer noch nicht die "Hilfe" von Delphi: Zitat:
(Unter Link TNotifyEvent steht): Zitat:
MfG Phil |
HI !
Kurz zusammengefasst: Die Procedure für OnTImer wird immer dann ausgeführt, wenn das Zeitintervall verstrichen ist. Gleichzeitig wird das Intervall wieder auf seinen Ausgangswert gestellt und läuft wieder ab, usw. D.h.: Interval: 1000 entspricht 1 Sekunde Nach einer Sekunde wird die Procedure Timer1OnTimer(...) ausgeführt, dann nach einer weiteren Sekunde usw. Das Problem an der obigen Lösung ist, dass das Label anfängt zu flackern (zumindest bei mir :-)), wenn man ein Intervall von 100 einstllt. Und ein größeres Intervall macht da keinen Sinn. Wenn also einer von euch eine Komponente kennt, dann her damit !! Hatte das Problem schon vor einem Jahr versucht zu lösen, war aber zu faul mir eine vernünftige Kompo zu schreiben. Gruß, Helld |
Moin Zusammen,
da ich die Idee als solche ganz witzig fand, hab' ich das mal in eine kleine Kompo gegossen, aber, wie Helld schon so schön sagte, das Flackern nervt. Wenn jemand eine Idee hat, wie man das verhindern kann... |
Hallo Zusammen nur so als Idee:
Ich habe ein Label auf ein Panel gelegt Rest siehe Code
Delphi-Quellcode:
dieses Konstrukt flacker bei mir nicht sichtbar
procedure TForm1.Timer1Timer(Sender: TObject);
begin if label1.left = 0 then begin if label1.Width = 0 then begin label1.Left := panel1.Width; label1.Width := 32; // gewünschte Anfangsbreite end else begin label1.Width := label1.Width -1; end; end else begin label1.left := label1.left -1; end; end; procedure TForm1.FormCreate(Sender: TObject); begin timer1.Interval := 10; timer1.Enabled := true; panel1.Doublebuffered:=true; end; Gruss Roger |
Moin Zusammen,
nur mal so ein Schnellschuss auf Basis von TStaticText, damit das DoubleBuffered schon in der Kompo enthalten ist. Ruckelt aber noch ganz schön. Wer's optimieren will: Nur zu ;-)
Delphi-Quellcode:
unit csTickerStatic;
interface uses stdctrls,extctrls,classes; type TcsTickerStatic = class(TStaticText) private FsTickerText : string; FcInterval : cardinal; FTimer : TTimer; FfRunning : Boolean; procedure OnTimer(Sender : TObject); function GetRunning: Boolean; public constructor Create(AOwner : TComponent); override; procedure Start; procedure Stop; property TickerText : string read FsTickerText write FsTickerText; property Interval : cardinal read FcInterval write FcInterval; property Running : Boolean read GetRunning; end; procedure Register; implementation procedure Register; begin RegisterComponents('csKompos',[TcsTickerStatic]); end; { TcsTickerStatic } constructor TcsTickerStatic.Create(AOwner: TComponent); begin inherited Create(AOwner); self.DoubleBuffered := true; self.Autosize := false; FsTickerText := 'Tickertext '; self.Caption := FsTickerText; self.Width := 100; self.Height := 16; FcInterval := 100; FTimer := TTimer.Create(self); FTimer.Interval := FcInterval; FTimer.Enabled := false; FTimer.OnTimer := OnTimer; FfRunning := false; end; function TcsTickerStatic.GetRunning: Boolean; begin Result := FTimer.Enabled; end; procedure TcsTickerStatic.OnTimer(Sender: TObject); begin if Length(FsTickerText) = 0 then begin exit; end; FTimer.Enabled := false; self.Caption := FsTickerText; FsTickerText := copy(FsTickerText,2,Length(FsTickerText))+FsTickerText[1]; FTimer.Enabled := true; end; procedure TcsTickerStatic.Start; begin FTimer.Enabled := true; end; procedure TcsTickerStatic.Stop; begin FTimer.Enabled := false; end; end. |
das ist mir einfach noch zu hoch...
hab erstmal luckie's Vorschlag weiterverwendet. |
Moin Privateer,
das ist genau das Gleiche, nur als Komponente verpackt. Du müsstest den Code nur als Pas speichern, und dann als Komponente installieren. |
Danke Christian,
werde es mal versuchen. |
Cool, jetzt hab ich endlich mal ein simples und verständliches Beispiel für eine Komponente. Alles was ich bisher gesehen hatte, war mir irgendwie zu anstrengend.
Gruß, helld; |
Mit Doublebuffered kann ich leider nix anfangen.
Ist das eine Funktion? Mein D3 kennt es nicht... PS: Kann bitte jemand dazu noch etwas sagen?: ![]() |
Moin Privateer,
das kannst Du auch ersatzlos streichen. Es sollte (siehe Rogers Beitrag) Flackern verhindern. Deshalb hatte ich auch TStaticText als Basis genommen, und nicht TLabel, das kennt DoubleBuffered nämlich auch nicht. Ich hatte ja so keine Idee das Flackern zu unterbinden, und habe einfach Rogers Idee mit eingebaut. (auch wenn's nichts gebracht hat, zumindest bei mir ;-) ) Hat TPanel unter D3 diese Eigenschaft? |
@Christian
nein..weder im OI noch in der OH unter Eigenschaften. |
Hallo,
will ja nur mal meinen Senf dazugeben, aber ein Ticker sollte doch eigentlich Pixelweise scrollen? Was haltet ihr davon einfach mal ein TLabel abzuleiten und die Ausgabe auf ein anderes Canvas umzuleiten, von dem man dann einfach nur einen Außschnitt auf das Formular kopiert. Das flaggert dann auch nicht. Thomas |
Moin Thomas,
Zitat:
:oops: :pale: :oops: *MitDemKopfVorDieWandHau* Stimmt auch wieder. Mal sehen, ob mir dazu was einfällt. Langsam fängt die Sache an interessant zu werden ;-) |
Zitat:
![]() |
Die Diskussion wurde ja abgebrochen, aber die Nachfrage besteht nach wie vor :wink:
|
Zitat:
Thomas |
Moin Luckie,
:mrgreen: :mrgreen: :mrgreen: der ist aber auch einfach zu schön. (dicht gefolgt von mecker ;-) ) |
Und wehe der Ticker läuft morgen nicht.
![]() Aber wer sagt das ein Ticker pixelweise scrollen muß? Klar es sieht schöner aus, aber dürfte auch recht schwer zu realisieren sein. Man müßte ja praktisch die Buchstaben selber zeichnen oder so. |
Moin Luckie,
das denke ich nicht. Ich hab' mir das so gedacht (Umsetzung offen ;-) ):
Als zweite Variante könnte man auch, statt eine Spalte der Bitmap zu verschieben, einen Spaltenzähler mitlaufen lassen, ab diesem ausgeben, und den Rest mit dem Anfang der Bitmap aufüllen. [EDIT] Das :oops: :pale: :oops: *MitDemKopfVorDieWandHau* bezog sich auch darauf, dass ich das Problem mit dem Ruckeln verkannt hatte. Es ruckelt nun einmal, wenn man Buchstabenweise Scrollt :? :mrgreen: [/EDIT] |
Und jetzt das pixelweise Scrollen als kleine liebe Komponente.
Delphi-Quellcode:
...:cat:...
unit uDPTicker;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TdpTicker = class(TGraphicControl) private FTimer: TTimer; FXPos, FTextWidth: Integer; FRunAtDesignTime: Boolean; procedure OnTimer(Sender: TObject); function GetCaption: TCaption; procedure SetCaption(const Value: TCaption); function GetSpeed: Integer; procedure SetSpeed(const Value: Integer); procedure SetRunAtDesignTime(const Value: Boolean); protected procedure Paint; override; procedure SetEnabled(Value: Boolean); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Speed: Integer read GetSpeed write SetSpeed; property Caption: TCaption read GetCaption write SetCaption; property RunAtDesignTime: Boolean read FRunAtDesignTime write SetRunAtDesignTime; property Align; property Anchors; property Color; property Enabled; property Constraints; property DragCursor; property DragKind; property DragMode; property Font; property Height; property ParentColor; property ParentFont; property ParentShowHint; property PopupMenu; property ShowHint; property Width; property Visible; property OnClick; property OnContextPopup; property OnDblClick; property OnDragDrop; property OnDragOver; property OnEndDock; property OnEndDrag; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnStartDock; property OnStartDrag; end; procedure Register; implementation procedure Register; begin RegisterComponents('Delphi-PRAXiS', [TdpTicker]); end; { TdpTicker } constructor TdpTicker.Create(AOwner: TComponent); begin inherited Create(AOwner); Width := 150; Height := 25; FTimer := TTimer.Create(Self); FTimer.Interval := 15; FTimer.OnTimer := OnTimer; FRunAtDesignTime := False; FTimer.Enabled := not (csDesigning in ComponentState); end; destructor TdpTicker.Destroy; begin FTimer.Free; inherited Destroy; end; function TdpTicker.GetCaption: TCaption; begin Result := inherited Caption; end; function TdpTicker.GetSpeed: Integer; begin Result := FTimer.Interval; end; procedure TdpTicker.OnTimer(Sender: TObject); begin Paint; end; procedure TdpTicker.Paint; var Bmp: TBitmap; begin Bmp := TBitmap.Create; try Bmp.Canvas.Brush.Color := Color; Bmp.Canvas.Brush.Style := bsSolid; Bmp.Canvas.Font.Assign(Font); Bmp.Width := Width; Bmp.Height := Height; Bmp.Canvas.TextOut(FXPos, (Height - Canvas.TextHeight(Caption)) div 2, Caption); Dec(FXPos); if FXPos + FTextWidth < 0 then FXPos := Width; Canvas.CopyRect(Canvas.ClipRect, Bmp.Canvas, Canvas.ClipRect); finally Bmp.Free; end; end; procedure TdpTicker.SetCaption(const Value: TCaption); begin inherited Caption := Value; FXPos := Width; if Canvas <> nil then FTextWidth := Canvas.TextWidth(Caption); end; procedure TdpTicker.SetEnabled(Value: Boolean); begin inherited Enabled := Value; FTimer.Enabled := ((not (csDesigning in ComponentState)) or FRunAtDesignTime) and Enabled; end; procedure TdpTicker.SetRunAtDesignTime(const Value: Boolean); begin FRunAtDesignTime := Value; FTimer.Enabled := ((not (csDesigning in ComponentState)) or FRunAtDesignTime) and Enabled; end; procedure TdpTicker.SetSpeed(const Value: Integer); begin FTimer.Interval := Value; end; end. |
Zitat:
|
Mach was draus ;) Links-Rechts scrollen, Hoch-Runter scrollen, etc. Ausserdem kannst Du die Komponente ja transparent machen. Obiges Beispiel ist übrigens flickerfrei.
"Entwicklungszeit" waren 15 Minuten. Also, nimm die Outline und mach was richtig geiles daraus. Danke. ...:cat:... |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
Ich habe mal die Komponente von sakura erweitert. Neu ist die Eigenschaft Direction (TickerUp,Ticker Down etc.) dazu gekommen. Die Eigenschaft Transparent ist zwar da, aber wird beim Paint noch nicht gebraucht. Hab noch keinen Weg, wie das transparent gezeichnet werden soll :roll: . Aber ich bin sicher, die Lösung wird nicht lange auf sich warten lassen. :D Die Unit als File liegt bei. Gruss Roger |
Könntet ihr bitte in Zukunft das als Zip-Archiv anhängen? Und eventuell nur die interssanten Stellen posten? Mit so ewig langen Quellcode im Posting wird das ganze etwas unübersichtlich. Danke.
|
Hi,
um das flackern zu verhindern könntest du mal folgendes versuchen: form1.doublebuffered := true; (bei der nicht pixel genauen Scrollvariante) |
Re: Ticker-Text
Hallo,
wie kann man die Ticker Kombo um eine Eigenschaft erweitern? :arrow: Zeilenumbruch (#13#10) geht net Wäre super wenn jemand helfen könnte. MfG Jazz |
Re: Ticker-Text
Mist,
ich bekomms net gebacken das mit dem Zeilenumbruch. Weiß einer von euch Rat?? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 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-2025 by Thomas Breitkreuz