Ruchomy tekst

0

Witam
Chciałbym spytać czy możliwe jest wykonanie w Delphi efektu ruchomego tekstu, podobnego do tego jaki jest w winamp'ie z tytułem utworu, autorem i czasem.

Pozdrawiam
Robster

0

jest możliwe.

0

Hehehe rzeczowa odpowiedź ^^
A możesz podpowiedzieć mi w jaki sposób? Ja się zastanawiałem nad stworzeniem tablicy znaków i wyświetlaniem i po kolei na różnych pozycjach w pewnym odstępie czasu, ale dużo z tym zabawy, więc zastanawiałem się czy jest prostszy sposób :)

0

no fakt, że dużo zabawy to proponuje poszukać gotowego komponentu (torry.net), albo przeszukać FAQ o Delphi.

0

Zobacz.. musialeś pisać posta, czekać aż ktoś odpowie, odpowiedź nic Ci nie dała, znowu czekasz...
A ja wszedłem na Artykuły i znalazłem stronę w 20 sekund.. :|
http://4programmers.net/Delphi/Artyku%C5%82y/Animacje

0

No widzisz i tym się różnimy, że ty wiesz jakie słowo kluczowe wpisać by znaleźć to co cię interesuje, a ja nie ^^
Szukałem pod ruchomy tekst oraz efekty przejścia, do głowy mi nie przyszły żadne animacje :/

Dzięki :)

0

taaa, na pewno najprościej jest poczekać, aż ktoś napisze za ciebie.
wrzuć na formularz timer, panel, na panel label, podepnij pod timer drugą metodę, pod oncreate formatki pierwszą, i już. chcesz większy skok tekstu, to odejmuj więcej niż 1. tyle. 20 minut pisania, wliczając kichanie, dmuchanie nosa i jedzenie śniadania.

var
  t : String = 'jakis bardzo bardzo bardzo bardzo bardzo bardzo dlugi tekst';
  w : integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
  label1.Left := 0;
  w := Label1.Canvas.TextWidth(t);
  if w =< Label1.Parent.Width then
  begin
    Timer1.Enabled := false;
    Label1.Caption := t;
  end else Label1.Caption := t + ' ' + t;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if -label1.Left > w then
    label1.Left := 0
  else
    label1.Left := label1.Left - 1;
end;

możesz też w identyczny sposób bawić się wyświetlaniem tekstu bezpośrednio na canvas panelu - mi się nie chciało.

0

Dzięki ŁF, ale ja nigdzie nie prosiłem o gotowca. Chciałem tylko podpowiedzi by jakoś z tym ruszyć :)

Niemniej gotowiec się przyda ^^

0

Jak ktoś jest zainteresowany to zrobiłem takie małe DEMO.
Na PaintBoxie jest gradient czerwono-czarny. Tekst przesuwa się z dołu do góry dość płynnie.
Dodatkowo zatrzymuje się, aby przeczytać i idzie dalej do góry... powinien się wczytać kolejny tekst, ale to już nie jest trudne do zrobienia.

Co 2 sekundy występuje mignięcie ostrzegawcze o pilnej wiadomości...
zresztą, wystarczy sobie skompilować aby zobaczyć.

Interval dla Timera: 20ms.

type
  TForm1 = class(TForm)
    Tim1: TTimer;
    Panel1: TPanel;
    PBox_1: TPaintBox;
    procedure PBox_1Paint(Sender: TObject);
    procedure Tim1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;
  i: ShortInt = 60;
  StopNews: Boolean;

implementation

{$R *.dfm}

procedure TForm1.PBox_1Paint(Sender: TObject);
var
 arTVX : array[0..1] of TRIVERTEX;
 GradRect: GRADIENT_RECT;
begin
 arTVX[0].X := PBox_1.Width;
 arTVX[0].Y := 0;

 case i of
   24, 26, 28: begin
       arTVX[0].Red    := $FF00;
       arTVX[0].Green  := $CC00;
       arTVX[0].Blue   := $CC00;
      end;
   -15..23, 25, 27, 29..60: begin
       arTVX[0].Red    := $FE00;
       arTVX[0].Green  := $0000;
       arTVX[0].Blue   := $0000;
      end;
 end;

 arTVX[0].Alpha  := $0000;
 arTVX[1].X      := 0;
 arTVX[1].Y      := PBox_1.Height;
 arTVX[1].Red    := $2B00;
 arTVX[1].Green  := $0000;
 arTVX[1].Blue   := $0000;
 arTVX[1].Alpha  := $0000;
 GradRect.UpperLeft  := 0;
 GradRect.LowerRight := 1;
 GradientFill(PBox_1.Canvas.Handle, @arTVX, 2, @GradRect, 1, GRADIENT_FILL_RECT_V);
end;

procedure TForm1.Tim1Timer(Sender: TObject);
begin
 Dec(i);
 if i = -15 then i := 60;
 if i = 10 then StopNews := not StopNews;
 if not StopNews then
   begin
    PBox_1.OnPaint(Sender);
    with PBox_1 do
      begin
       Canvas.Font.Color  := clWhite;
       Canvas.Font.Size   := 10;
       Canvas.Font.Name   := 'Tahoma';
       Canvas.Font.Style  := [fsBold];
       Canvas.Brush.Style := bsClear;
       Application.ProcessMessages;
       Canvas.TextOut(16, i, 'UWAGA: Wybory do parlamentu zostały zawieszone na czas nieokreślony.');
      end;
   end;
end;

EDIT:
Troszę zmodyfikowałem i ulepszyłem, łącznie z kolejnymi tekstami...

http://odsiebie.com/pokaz/1530804---150a.html

user image

Jak ktoś jest zainteresowany to niech pisze to udostępnie.

0

a nie prościej jest użyć gotowych komponentów ??

komponent pozwoli na przesuwanie tekstu w pionie i poziomie

http://kupa.info/hackme/download/delphi/komponenty/ddbanner.zip

komponent przelatującego tekstu

http://kupa.info/hackme/download/delphi/komponenty/alscrtxt.zip

wystarczyło w google wpisać "delphi animowany napis" :P

0

to masz coś ode mnie:

procedure DrawText(Text: String);
Var
B: TBitmap;
I, X, W, D, WaitDraw: Integer;
Left: Boolean;
begin
IM_Title.Canvas.Brush.Color := RGB(8, 8, 9);
IM_Title.Canvas.Pen.Color   := RGB(8, 8, 9);
IM_Title.Canvas.Rectangle(0, 0, IM_Title.Width, IM_Title.Height);
IM_Title.Canvas.Font.Color := $008F8774;
IM_Title.Canvas.Font.Name := 'Tahoma';
IM_Title.Canvas.Font.Height := -10; 

WaitDraw := 30;
W := IM_Title.Canvas.TextWidth(Text);
Done := False;
Left := True;
while not (Done) do begin
if Done = True then begin
IM_Title.Canvas.Rectangle(0, 0, IM_Title.Width, IM_Title.Height);
IM_Title.Canvas.TextOut(3, 1, Text);
Exit;
end;
if W > IM_Title.Width then begin
IM_Title.Canvas.Rectangle(0, 0, IM_Title.Width, IM_Title.Height);
IM_Title.Canvas.TextOut(3, 1, Text);

X := 3;
if Left = True then begin
repeat
Dec(X);
IM_Title.Canvas.Rectangle(0, 0, IM_Title.Width, IM_Title.Height);
IM_Title.Canvas.TextOut(X, 1, Text);
Sleep(WaitDraw);
Application.ProcessMessages;
if Done = True then begin
IM_Title.Canvas.Rectangle(0, 0, IM_Title.Width, IM_Title.Height);
IM_Title.Canvas.TextOut(3, 1, Text);
Exit;
end;
until
X+W <= IM_Title.Width-3;

if X+W <= IM_Title.Width-3 then begin
D := 0;
repeat
Inc(D);
Sleep(10);
Application.ProcessMessages;
if Done = True then begin
IM_Title.Canvas.Rectangle(0, 0, IM_Title.Width, IM_Title.Height);
IM_Title.Canvas.TextOut(3, 1, Text);
Exit;
end;
until
D = 400;

Left := False;
end;

end;
end;

// IM_TITLE - Image
// Done - Zmienna globalna typu Boolean;

Żeby rozpocząć wywołyjesz DrawText('Jakiś tam tekst') a żeby zakończyć ustawiasz Done := True;

Efekt taki jak w winampie w wersji 5.X

0

z ciekawosci przetestowalem kody opiego i puchiego i stwierdzam ze na d7 personal kod opiego sie nie kompiluje, kod puchiego owszem ale zawiesza aplikacje i nic wiecej, pozdro

0
sadadsa napisał(a)

z ciekawosci przetestowalem kody opiego i puchiego i stwierdzam ze na d7 personal kod opiego sie nie kompiluje, kod puchiego owszem ale zawiesza aplikacje i nic wiecej, pozdro

A jaki błąd ?

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

Całość wygląda tak:
http://odsiebie.com/pokaz/1530804---150a.html

maxi12 napisał(a)

a nie prościej jest użyć gotowych komponentów ??

Rzeczywiście profesjonalne podejście...

0

OPi proponuje zebys zamiescil te zrodlo demka, bo wyglada niezle, a wywala blad , nie pamietam teraz dokladnie co bo nie jestem w domu i nie mam jak ponownie sprawdzic

0

u mnie tek kod działa bez problemu wycialem go z jakiegos testowego projektu blayera mp3 pisanego w oparciu o bass.dll coprawda ten kod był pisany i kompilowany w Turbo Delphi ale to chyba nie powinno miec znaczenia w tym przypadku.

Masz tu linka do całego projektu:
http://odsiebie.com/pokaz/1531816---a21e.html

jest tam exe skompilowany mozesz podejzec efekt uruchamia sie przez Button3 a wyłącza przez button4 chyba.

0
maxi12 napisał(a)

a nie prościej jest użyć gotowych komponentów ??

Opi napisał(a)

Rzeczywiście profesjonalne podejście...

Wiesz to zależy w jakim celu chcemy użyć tego ruchomego tekstu itp Nie zawsze trzeba pisać coś samemu skoro można wykorzystać już gotowe rzeczy. Zwłaszcza, że w pisaniu kodu można zrobić błędy.

Ja się nie kłócę, że koniecznie trzeba korzystać z gotowców. Ale propozycje komponentów dałem może ktoś skorzysta :)

0

Update@
Kod Puchiego dziala pod d7 , natomiast kod Opiego nie chce sie skompilowac, pisze cos o zmiennych ktore sa poza zakresem czy cos ($FE00), jest jeszcze jakis inny blad, sprawa sie ma tak pod d7 personal; byc moze na d turbo dziala poprawnie, jednkazeobydwa programy(exe) maja fajne efekty :)

0
asasas napisał(a)

Update@
kod Opiego nie chce sie skompilowac, pisze cos o zmiennych ktore sa poza zakresem czy cos ($FE00), jest jeszcze jakis inny blad, sprawa sie ma tak pod d7 personal

Rozwiązanie problemu (źródło):
http://www.festra.com/wwwboard/messages/13146.html

: When I try to compile your source example code for GradientFill with Delphi 7 Personal, I get the errors "Constant expression violates subrange bounds" and "Types of actual and formal var parameters must be identical".

You're right. Amazing... this bug existed since Delphi 3 up to Delphi 7!
I didn't notice it before, because I only tried out GradientFill with Turbo Delphi, and afterwards a quick look in the older Delphi Help documents showed that it also existed in Delphi 7 as well as in Delphi 4.

We found out that the TRIVERTEX structure and the GradientFill function were declared wrongly in all Delphi versions before Delphi 2005. Since Delphi 2005 this bug has been fixed.

So, if you're using Delphi version 7 or older, add the following correct declarations to your source code, at the top of the IMPLEMENTATION section of the form's unit:

implementation
  
{$R  *.DFM}

{ Corrects the wrong declararions of TRIVERTEX ---------------------
  and GradientFill in Delphi unit WINDOWS.PAS
}
type
  TRIVERTEX = packed record
    X, Y: DWORD;
    Red, Green, Blue, Alpha: Word;
  end;

function GradientFill(DC: hDC; pVertex: Pointer; dwNumVertex: DWORD;
  pMesh: Pointer; dwNumMesh, dwMode: DWORD): DWord; stdcall;
		external 'msimg32.dll';

Tip: if you're using gradient fills with several forms or several projects, better put the corrected code in a separate unit and add this unit to the USES clause of every form unit.

1 użytkowników online, w tym zalogowanych: 0, gości: 1