![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Бегущая строка
Dead.MorozZ © (2006-01-21 22:03:00)У меня такая ситуация строка полностью не влазет в метку, поэтому решил сделать ее бегущей.
Как можно сделать бегущую строку по типу как в WinAmp'e. Чтоб после того, как последняя часть строки выползла процесс пошел в другую сторону(строка побежала обратно) а добежав до другого конца снова поворачивала и т.д. ...
Только, чтоб это обязательно происходило в Лейбле
Shirson (2006-01-24 14:52:00) [1]>Dead.MorozZ
>Мне все казалось гораздо проще:)
>В цикле прибавлять к строке (если она меньше 10) пробелы до тех пор >пока она не станет равной 10:)
uses StrUtils;
procedure TForm1.FormCreate(Sender: TObject);
var s:string;
begin
s:='1234';
Caption:=s+DupeString(' ',10-length(s));
end;
Dead.MorozZ (2006-01-24 14:12:00) [2]
> procedure TForm1.FormCreate(Sender: TObject);
> VAR s:string;
> begin
> s:='1234';
> WHILE Length(s)<10 DO s:=s+' ';
> Caption:=s+' '+inttostr(Length(s));
> end;
> VAR I:WORD;
>
> procedure TForm1.Timer1Timer(Sender: TObject);
> begin
> IF I<Length(Label1.Caption) THEN
> label1.Caption := Copy(Label1.Caption, 2, Length(Label1.
> Caption)-0) + Copy(Label1.Caption, 1, 1)
> ELSE IF I>=Length(Label1.Caption) THEN
> label1.Caption := Copy(Label1.Caption, Length(Label1.Caption),
> 1)+Copy(Label1.Caption, 1, Length(Label1.Caption)-1);
> I:=I+1;
> IF I>=2*Length(Label1.Caption) THEN I:=0;
> end;
>
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> Label1.Caption:='123';
> I:=0;
> Timer1.Interval:=1000;
> end;
Как можно объеденить два куска программы в одно:
Сначала забить до конца строки пробелами а потом
Перемещать? А то когда я их объединял получилось совсем не то что я ожидал:) Помогите PlzZ
Ega23 (2006-01-23 15:51:00) [3]А если размер фонта поменялся, тогда что?
RunningString (2006-01-23 15:42:00) [4]>А как удалить из строки последние 4 символа??
>(навсегда удалить:)
procedure TForm1.FormCreate(Sender: TObject);
VAR s:string;
begin
s:='12345678901234';
DELETE(s,Length(s)-3,4);
Caption:=s;
end;
>Как написать на Паскале:
>Если длина строки, присваиваемой Label1.Caption < 10,
>то дополнять эту строку пробелами до тех пор пока ее длина строки не станет = 10 ???
procedure TForm1.FormCreate(Sender: TObject);
VAR s:string;
begin
s:='1234';
WHILE Length(s)<10 DO s:=s+' ';
Caption:=s+' '+inttostr(Length(s));
end;
Dead.MorozZ (2006-01-23 14:34:00) [5]Зачем мне целый компонент???
Мне все казалось гораздо проще:)
В цикле прибавлять к строке (если она меньше 10) пробелы до тех пор пока она не станет равной 10:)
Я просто с Паскалем не очень, а нам надо проект скоро сдавать на Делфи.
Помогите PlzZ
Ega23 (2006-01-23 13:27:00) [6]На, не жалко. Как в пакет собрать, надеюсь, разберёшься.
unit ScrLabel;
interface
uses
Windows, Classes,
Controls, StdCtrls;
{$R TSCROLLABLELABEL.DCR}
type
TCustomScrollableLabel=class(TLabel)
private
fCaptureX: Integer;
fOffset: Integer;
fScrolling: Boolean;
protected
procedure SetOffset(Value: Integer); virtual;
procedure DoDrawText(var Rect: TRect; Flags: Longint); override;
procedure DblClick; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
public
constructor Create(AOwner: TComponent); override;
property Offset: Integer read fOffset write SetOffset;
property Scrolling: Boolean read fScrolling;
end;
TScrollableLabel=class(TCustomScrollableLabel);
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Additional', [TScrollableLabel]);
end;
{ TCustomScrollableLabel }
constructor TCustomScrollableLabel.Create(AOwner: TComponent);
begin
inherited;
fOffset:=0;
fScrolling:=False;
end;
procedure TCustomScrollableLabel.DblClick;
begin
inherited;
Offset:=0;
end;
procedure TCustomScrollableLabel.DoDrawText(var Rect: TRect; Flags: Integer);
begin
Rect.Left:=Rect.Left+fOffset;
inherited;
end;
procedure TCustomScrollableLabel.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
inherited;
fScrolling:=Button=mbLeft;
fCaptureX:=X-Offset;
end;
procedure TCustomScrollableLabel.MouseMove(Shift: TShiftState; X,
Y: Integer);
begin
inherited;
if not fScrolling then
Exit;
Offset:=X-fCaptureX;
end;
procedure TCustomScrollableLabel.MouseUp(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
fScrolling:=False;
inherited;
end;
procedure TCustomScrollableLabel.SetOffset(Value: Integer);
var
CanvasLeft, CanvasWidth, CaptionLeft, CaptionWidth: Integer;
begin
if Value=fOffset then
Exit;
with Canvas do
begin
CanvasLeft:=ClipRect.Left;
CanvasWidth:=ClipRect.Right-CanvasLeft;
CaptionWidth:=TextWidth(Caption);
end;
case Alignment of
taRightJustify:
CaptionLeft:=(CanvasWidth-CanvasLeft)-CaptionWidth;
taCenter:
CaptionLeft:=((CanvasWidth-CanvasLeft)-CaptionWidth) div 2;
else
CaptionLeft:=CanvasLeft;
end;
if Value<(CanvasLeft+CanvasWidth)-(CaptionLeft+CaptionWidth) then
Value:=(CanvasLeft+CanvasWidth)-(CaptionLeft+CaptionWidth);
if Value>CanvasLeft-CaptionLeft then
Value:=CanvasLeft-CaptionLeft;
fOffset:=Value;
Repaint;
end;
end.
Dead.MorozZ (2006-01-23 13:07:00) [7]Как написать на Паскале:
Если длина строки, присваиваемой Label1.Caption < 10,
то дополнять эту строку пробелами до тех пор пока ее длина строки не станет = 10 ???
Dead.MorozZ (2006-01-23 11:52:00) [8]А как удалить из строки последние 4 символа??
(навсегда удалить:)
RunningString (2006-01-23 02:11:00) [9]Так ?
VAR I:WORD;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
IF I<Length(Label1.Caption) THEN
label1.Caption := Copy(Label1.Caption, 2, Length(Label1.Caption)-0) + Copy(Label1.Caption, 1, 1)
ELSE IF I>=Length(Label1.Caption) THEN
label1.Caption := Copy(Label1.Caption, Length(Label1.Caption), 1)+Copy(Label1.Caption, 1, Length(Label1.Caption)-1);
I:=I+1;
IF I>=2*Length(Label1.Caption) THEN I:=0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:='123';
I:=0;
Timer1.Interval:=1000;
end;
Dead.MorozZ (2006-01-23 01:20:00) [10]
> procedure TForm1.Timer1Timer(Sender: TObject);
> begin
> IF I>2*Length(Label1.Caption)-1 THEN I:=0;
> IF (I>=Length(Label1.Caption)) THEN
> label1.Caption := Copy(Label1.Caption, 2, Length(Label1.
> Caption)-1) + Copy(Label1.Caption, 1, 1)
> ELSE
> label1.Caption := Copy(Label1.Caption, Length(Label1.
> Caption), 1)+Copy(Label1.Caption, 1, Length(Label1.Caption)-
> 1);
> I:=I+1;
> end;
>
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> I:=0;
> Label1.Caption:='Test ';
> Timer1.Interval:=500;
> end;
тут еще один баг:
если кепшон присвоить 123 то результаты после каждого интервала Таймера:
123
312
231
123
312
123<<<<сдесь упускается 231
и лучше бы выглядело еслиб строка бежала вперед т.е:
123
231
312
123
312
231
помоги PlzZ
RunningString (2006-01-23 00:09:00) [11]p-это кол-во пробелов в конце строки.
Corrected:
VAR I,P:WORD;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
IF I>P*2-1 then i:=0;
IF I<p THEN
label1.Caption := Copy(Label1.Caption, Length(Label1.Caption), 1)+Copy(Label1.Caption, 1, Length(Label1.Caption)-1)
ELSE
label1.Caption := Copy(Label1.Caption, 2, Length(Label1.Caption)-1) + Copy(Label1.Caption, 1, 1);
I:=I+1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:='1 2 3 4 5 ';
FOR i:=Length(Label1.Caption) DOWNTO 1 DO
IF Label1.Caption[i]<>' ' THEN
BEGIN
P:=Length(Label1.Caption)-i;
BREAK;
END;
Timer1.Interval:=100;
I:=0;
end;
>И еще как на Паскале написать
>если длина строки (Label1.Caption) больше 10 символов то.
IF Length(Label1.Caption) > 10 THEN BEEP;
Dead.MorozZ (2006-01-22 23:14:00) [12]Что здесь означает р и где указывается длина метки??
И еще как на Паскале написать
если длина строки (Label1.Caption) больше 10 символов то..... ?????
RunningString (2006-01-22 22:37:00) [13]
procedure TForm1.Timer1Timer(Sender: TObject);
begin
IF I>P*2-1 then i:=0;
IF I<p THEN
label1.Caption := Copy(Label1.Caption, Length(Label1.Caption), 1)+Copy(Label1.Caption, 1, Length(Label1.Caption)-1)
ELSE
label1.Caption := Copy(Label1.Caption, 2, Length(Label1.Caption)-1) + Copy(Label1.Caption, 1, 1);
I:=I+1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
I:=0;
Label1.Caption:='Test ';
IF pos(' ',Label1.Caption)=0 THEN Label1.Caption:=Label1.Caption+' ';
P:=Length(Label1.Caption)+1-pos(' ',Label1.Caption);
Timer1.Interval:=500;
end;
Dead.MorozZ (2006-01-22 21:40:00) [14]ЗЫ: Первая прога работала лучше:)
Dead.MorozZ (2006-01-22 21:18:00) [15]А как сделать так что:
если в видимой части Метки еще есть место для символов забивать это место пробелами, а потом наоборот убирать пробелы так чтобы получился эффект перемещения строки от одного края Метки к другому??
Dead.MorozZ (2006-01-22 20:39:00) [16]Большой Сенкс!!!
RunningString (2006-01-22 19:56:00) [17]Corrected:
VAR I:WORD;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
IF I>2*Length(Label1.Caption)-1 THEN I:=0;
IF (I>=Length(Label1.Caption)) THEN
label1.Caption := Copy(Label1.Caption, 2, Length(Label1.Caption)-1) + Copy(Label1.Caption, 1, 1)
ELSE
label1.Caption := Copy(Label1.Caption, Length(Label1.Caption), 1)+Copy(Label1.Caption, 1, Length(Label1.Caption)-1);
I:=I+1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
I:=0;
Label1.Caption:='Test ';
Timer1.Interval:=500;
end;
RunningString (2006-01-22 19:39:00) [18]
VAR I:WORD;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
IF I>2*Length(Label1.Caption) THEN I:=0;
IF (I>Length(Label1.Caption)) {AND (I<Length(Label1.Caption))} THEN
BEGIN
label1.Caption := Copy(Label1.Caption, 2, Length(Label1.Caption)-1) + Copy(Label1.Caption, 1, 1);
I:=I+1;
END
ELSE
BEGIN
label1.Caption := Copy(Label1.Caption, Length(Label1.Caption), 1)+Copy(Label1.Caption, 1, Length(Label1.Caption)-1);
I:=I+1;
END;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
I:=0;
Label1.Caption:='12345 ';
Timer1.Interval:=1000;
end;
Dead.MorozZ (2006-01-21 23:07:00) [19]Это я сам умею не могу придумать как сделать чтоб строка когда уже полностью вылезла ползла обратно, т.е. сначала как ты сказал, а когда вылезет послндний символ от первоначальной строки удалялся первый символ а вместо него вставлялся последний
з. танька (2006-01-21 23:04:00) [20]плюхаешь на форму таймер, в обработчике OnTimer пишеш:
label1.Caption := Copy(Label1.Caption, 2, MAXINT) + Copy(Label1.Caption, 1, 1);