Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ticker-Text (https://www.delphipraxis.net/2097-ticker-text.html)

Privateer3000 6. Jan 2003 22:48


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?! :|

tretmine 6. Jan 2003 23:35

Re: Ticker-Text
 
Zitat:

Zitat von Privateer3000
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?! :|

Eine kleine Idee:

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

Privateer3000 7. Jan 2003 01:50

thx
aber damit kann ich wenig anfangen.
Gibt es vielleicht eine Komponente die dies realisieren kann??

Luckie 7. Jan 2003 07:15

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;

tretmine 7. Jan 2003 12:50

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:

property OnTimer: TNotifyEvent;

Beschreibung

Mit dem Ereignis OnTimer können Sie eine Behandlungsroutine schreiben, die in bestimmten Zeitabschnitten eine Aktion ausführt.
(Auszug)

(Unter Link TNotifyEvent steht):
Zitat:

type TNotifyEvent = procedure (Sender: TObject) of object;

Beschreibung

TNotifyEvent ist der Typ für Ereignisse, die keine Parameter benötigen. Diese Ereignisse benachrichtigen einfach die Komponente, daß ein bestimmtes Ereignis aufgetreten ist. So benachrichtigt beispielsweise OnClick (Typ TNotifyEvent) das Steuerelement, daß im Steuerelement ein Klickereignis stattgefunden hat. Der Parameter Sender ist das Objekt, das die Benachrichtigung erhält.
(Auszug)

MfG Phil

Helld_River 7. Jan 2003 13:15

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

Christian Seehase 7. Jan 2003 13:36

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...

R.Meyrat 7. Jan 2003 14:51

Hallo Zusammen nur so als Idee:

Ich habe ein Label auf ein Panel gelegt Rest siehe Code
Delphi-Quellcode:
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;
dieses Konstrukt flacker bei mir nicht sichtbar

Gruss Roger

Christian Seehase 7. Jan 2003 15:15

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.

Privateer3000 7. Jan 2003 21:22

das ist mir einfach noch zu hoch...

hab erstmal luckie's Vorschlag weiterverwendet.

Christian Seehase 7. Jan 2003 21:31

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.

Privateer3000 7. Jan 2003 21:57

Danke Christian,
werde es mal versuchen.

Helld_River 7. Jan 2003 22:51

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;

Privateer3000 8. Jan 2003 09:58

Mit Doublebuffered kann ich leider nix anfangen.
Ist das eine Funktion?
Mein D3 kennt es nicht...

PS: Kann bitte jemand dazu noch etwas sagen?:
http://www.delphipraxis.net/viewtopic.php?t=2346

Christian Seehase 8. Jan 2003 10:11

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?

Privateer3000 8. Jan 2003 15:31

@Christian

nein..weder im OI noch in der OH unter Eigenschaften.

fiasko 8. Jan 2003 15:54

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

Christian Seehase 8. Jan 2003 16:58

Moin Thomas,

Zitat:

...aber ein Ticker sollte doch eigentlich Pixelweise scrollen?

:oops: :pale: :oops: *MitDemKopfVorDieWandHau*

Stimmt auch wieder.

Mal sehen, ob mir dazu was einfällt. Langsam fängt die Sache an interessant zu werden ;-)

Luckie 8. Jan 2003 17:01

Zitat:

Zitat von Christian Seehase
Moin Thomas,
:oops: :pale: :oops: *MitDemKopfVorDieWandHau*

Hier ist dein Freund: http://www.luckie-online.de/_pics/wallbash.gif :mrgreen:

nailor 8. Jan 2003 17:03

Die Diskussion wurde ja abgebrochen, aber die Nachfrage besteht nach wie vor :wink:

fiasko 8. Jan 2003 17:03

Zitat:

Zitat von Christian Seehase
Mal sehen, ob mir dazu was einfällt. Langsam fängt die Sache an interessant zu werden ;-)

Jo, wenn ich heut nach'Hause komme, werd ich mich wohl gleich mal rannsetzen *gg*


Thomas

Christian Seehase 8. Jan 2003 17:10

Moin Luckie,

:mrgreen: :mrgreen: :mrgreen:

der ist aber auch einfach zu schön. (dicht gefolgt von mecker ;-) )

Luckie 8. Jan 2003 17:18

Und wehe der Ticker läuft morgen nicht. http://www.luckie-online.de/_pics/mecker.gif

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.

Christian Seehase 8. Jan 2003 17:29

Moin Luckie,

das denke ich nicht.

Ich hab' mir das so gedacht (Umsetzung offen ;-) ):
  1. Der Text wird auf eine Bitmap geschrieben
  2. Die Bitmap wird ausgegeben
  3. Die erste Spalte der Bitmap wird nach hinten verschoben (wie vorher die Buchstaben
  4. Weiter mit Punkt 2

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]

sakura 8. Jan 2003 18:17

Und jetzt das pixelweise Scrollen als kleine liebe Komponente.
Delphi-Quellcode:
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.
...:cat:...

fiasko 8. Jan 2003 19:48

Zitat:

Zitat von sakura
Und jetzt das pixelweise Scrollen als kleine liebe Komponente:

Verdammt, wohl zu spät nach Hause gekommen X-(

sakura 8. Jan 2003 19:52

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:...

R.Meyrat 9. Jan 2003 15:15

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

Luckie 9. Jan 2003 15:20

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.

Stephan 27. Jun 2003 17:38

Hi,

um das flackern zu verhindern könntest du mal folgendes versuchen:

form1.doublebuffered := true;

(bei der nicht pixel genauen Scrollvariante)

Jazz 14. Aug 2003 12:46

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

Jazz 15. Aug 2003 16:01

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