Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr.
Seite 1 von 4  1 23     Letzte »    

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