Avatar billede hand Nybegynder
26. december 2000 - 23:28 Der er 12 kommentarer

Ny linie i Canvas.TextRext

Ja hvordan kan lave en ny linie i Canvas.TextRect() ?

Normalt vil jeg gøre det med #13 men det virker ikke !

altså sådan ville jeg gøre men der kommer en sjov fed |
Canvas.TextRect(Rect,X,Y,\'tekst\'+#13+\'tekst\'+#13+\'tekst\');
Avatar billede stigc Nybegynder
26. december 2000 - 23:30 #1
har du prøvet med:
Canvas.TextRect(Rect,X,Y,\'linie1 \\n linie2\');
Avatar billede hand Nybegynder
26. december 2000 - 23:34 #2
Hm.. ja nu har jeg også er det lige jeg vil sige at det ikke er javascript men delphi så man kan ikke på denne måde !
Avatar billede snowball Novice
27. december 2000 - 00:01 #3
Jeg vil mene at det næsten er rigtigt det du laver. Du mangler bare lige en #10 også. Så prøv dette:

Canvas.TextRect(Rect,X,Y,\'tekst\'+#13#10+\'tekst\'+#13#10+\'tekst\');

Har ikke lige en Delphi på den PC jeg sidder ved nu så jeg kan ikke afprøve det, men jeg vil mene det skulle virke !

Snowball
Avatar billede hand Nybegynder
27. december 2000 - 00:53 #4
snowball -> Det har jeg prøvet men så kommer der bare to || og den gør ikke så den kommer på en ny linie !
Avatar billede pellelil Nybegynder
27. december 2000 - 08:28 #5
Det er vel \"bare\" at lave et cald til Canvas.TextRect for hver linie der skal  !skrives (hvor du selvfølgelig skal incremente Y) !?
Avatar billede borrisholt Novice
27. december 2000 - 11:22 #6
Som pellelil så rigtigt siger så skal du bare incremere din y.

altså en Canvas.TextRect fo hver linje. Spørgsmålet er blot hvormeget du skal incremere Din y med ?

På din canvas har du metoder til at måle højden på din tekst : Canvas.TextHeight du skal så ledes tælle op med lidt mere end højden på di tekst.

Jens B
Avatar billede hand Nybegynder
27. december 2000 - 13:43 #7
oki i får lige min kode og så kan i se hvordan jeg gør !

procedure TOmForm.FormCreate(Sender: TObject);
begin
ATimer.Interval := 100;
ATimer.Enabled := True;
Y :=369;
end;

procedure TOmForm.ATimerTimer(Sender: TObject);
var Rect: Trect;
begin
  Rect.Top := 228;
  Rect.Left := 25;
  Rect.Right := 323;
  Rect.Bottom := 364;
  Dec(Y);
  if Y=230 then ATimer.Enabled := False;
  Canvas.Font.Color := clWhite;
  Canvas.Brush.Color := clBlack;
  Canvas.TextRect(Rect,27,Y,\'linie1\');
end;

Hvordan er det så man lige gør det ???
Avatar billede hand Nybegynder
01. januar 2001 - 21:54 #8
Er der nogen som kan/vil forklare hvordan man kan det med Canvas.TextHeight ?
Avatar billede borrisholt Novice
02. januar 2001 - 10:35 #9
hand >> Jeg vil anbefale dig at gribe det anderledes an :

Lav en klasse, som arver fra TStringList fordi det er en masse strenge du vil scrolere .... Der udover skal dne i sin konstructor tagen en TWinControl fordi den skal jo vide hvad den skal scrollere på ....

prøv den her :


type
  TJScrollText = class ( TStringList )
                  private
                    fOffset : integer;
                    FBackGround: TColor;
                    FClientRect : TRect;
                    fHandle : THandle;
                    fTextHeight : Integer;
                    FTextColor: TColor;
                    FBrush : TBrush;
                    FTimer : TTimer;
                    procedure SetBackGround(const Value: TColor);
                    procedure SetTextColor(const Value: TColor);
                  protected
                    procedure OnTimer(Sender : TObject);
                  public
                    constructor Create (WinControl : TWinControl);
                    destructor Destroy; override;
                    procedure LoadFromFile(const FileName: string); override;
                    procedure Reset;
                    procedure Draw;
                    property BackGround : TColor write SetBackGround;
                    property TextColor : TColor  write SetTextColor;
                  end;


{ TJScrollText }

constructor TJScrollText.Create(WinControl : TWinControl);
begin
  inherited Create;
  FTimer := TTimer.Create(nil);
  FTimer.OnTimer := OnTimer;
  FTimer.Interval := 40;
  fHandle := WinControl.Handle;
  GetClientRect(fHandle,  FClientRect);
  FBrush := TBrush.Create;
  Reset;
end;

destructor TJScrollText.Destroy;
begin
FTimer.free;
inherited;
end;

procedure TJScrollText.Draw;
var
  i : Integer;
  s : string;
  aDC : HDC;
begin
  GetClientRect(fHandle,  FClientRect);
  aDC := GetDc(fHandle);

  fillRect(aDC,FClientRect,FBackGround);

  SetBkMode ( aDC, Transparent );
  Windows.SetTextColor ( aDC, FTextColor ) ;

  for i := 0 to count - 1 do
  begin
    S := Strings[i];
    TextOut ( aDC, 0, i*20+fOffset, PChar ( s ) , length ( s ) ) ;
  end;
  ReleaseDC(fHandle, aDC);
  Dec ( fOffset,4 );
  if fTextHeight + fOffset <= 0 then
    Reset;
end;

procedure TJScrollText.LoadFromFile(const FileName: string);
var
  Size : TSize;
  aDc : HDC;
begin
  inherited LoadFromFile(FileName);
  aDC := GetDc(fHandle);
  Windows.GetTextExtentPoint32(aDC, \'Wg\', 2, Size);
  ReleaseDC(fHandle, aDC);
  fTextHeight := Size.cy * Count + FClientRect.Bottom - FClientRect.Top;
end;

procedure TJScrollText.OnTimer(Sender: TObject);
begin
draw;
end;

procedure TJScrollText.Reset;
var
  aDc : HDC;
begin
  aDC := GetDc(fHandle);
  GetClientRect(fHandle, FClientRect);
  fOffset := FClientRect.Bottom - FClientRect.Top;
  FillRect(aDC,FClientRect,FBackGround);
  ReleaseDC(fHandle, aDC);
end;

procedure TJScrollText.SetBackGround(const Value: TColor);
begin
  FBackGround := CreateSolidBrush(Value);
end;

procedure TJScrollText.SetTextColor(const Value: TColor);
begin
  FTextColor := Value;
end;


også lidt test kode :

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TJScrollText.Create(self) do
  begin
    BackGround := clYellow;
    TextColor := clRed;
    LoadFromFile(\'unit1.pas\');
  end;
end;


Jens B
Avatar billede hand Nybegynder
10. januar 2001 - 01:25 #10
borrisholt -> Hey Jens

Det er meget godt det som du har der, men kan du
ikke lave sådan at man kan bestemme hvor på formen
det skal være ?

Og gøre sådan at teksten kan blive loadet fra en memo ?
Avatar billede borrisholt Novice
10. januar 2001 - 11:03 #11
hand >>

Nå men når nu man skal til at overstyre flere funktioner, må vi hellere gøre det rigtigt ... Jeg har indført en funktion der udregner størelsen på vores scroll fætter .....

Der udover har jeg overstyret Assign medtoden for at gøre det muligt at hente teksten fra et memo felt ....

Således ser vores scroll fætter såleses ud :


type
  TJScrollText = class ( TStringList )
                  private
                    fOffset : integer;
                    FBackGround: TColor;
                    FClientRect : TRect;
                    fHandle : THandle;
                    fTextHeight : Integer;
                    FTextColor: TColor;
                    FBrush : TBrush;
                    FTimer : TTimer;
                  protected
                    procedure CalculateSize;
                    procedure OnTimer(Sender : TObject);
                    procedure SetBackGround(const Value: TColor);
                    procedure SetTextColor(const Value: TColor);
                  public
                    constructor Create (WinControl : TWinControl);
                    destructor Destroy; override;
                    procedure LoadFromFile(const FileName: string); override;
                    procedure Assign(Source: TPersistent); override;
                    procedure Reset;
                    procedure Draw;
                    property BackGround : TColor write SetBackGround;
                    property TextColor : TColor  write SetTextColor;
                  end;


constructor TJScrollText.Create(WinControl : TWinControl);
begin
  inherited Create;
  FTimer := TTimer.Create(nil);
  FTimer.OnTimer := OnTimer;
  FTimer.Interval := 40;
  fHandle := WinControl.Handle;
  GetClientRect(fHandle,  FClientRect);
  FBrush := TBrush.Create;
  Reset;
end;

destructor TJScrollText.Destroy;
begin
  FTimer.free;
  inherited;
end;

procedure TJScrollText.Draw;
var
  i : Integer;
  s : string;
  aDC : HDC;
begin
  GetClientRect(fHandle,  FClientRect);
  aDC := GetDc(fHandle);

  fillRect(aDC,FClientRect,FBackGround);

  SetBkMode ( aDC, Transparent );
  Windows.SetTextColor ( aDC, FTextColor ) ;

  for i := 0 to count - 1 do
  begin
    S := Strings[i];
    TextOut ( aDC, 0, i*20+fOffset, PChar ( s ) , length ( s ) ) ;
  end;
  ReleaseDC(fHandle, aDC);
  Dec ( fOffset,4 );
  if fTextHeight + fOffset <= 0 then
    Reset;
end;

procedure TJScrollText.LoadFromFile(const FileName: string);
begin
  inherited;
  CalculateSize;
end;

procedure TJScrollText.Assign(Source: TPersistent);
begin
  inherited;
  CalculateSize;
end;


procedure TJScrollText.OnTimer(Sender: TObject);
begin
  Draw;
end;

procedure TJScrollText.Reset;
var
  aDc : HDC;
begin
  aDC := GetDc(fHandle);
  GetClientRect(fHandle, FClientRect);
  fOffset := FClientRect.Bottom - FClientRect.Top;
  FillRect(aDC,FClientRect,FBackGround);
  ReleaseDC(fHandle, aDC);
end;

procedure TJScrollText.SetBackGround(const Value: TColor);
begin
  FBackGround := CreateSolidBrush(Value);
end;

procedure TJScrollText.SetTextColor(const Value: TColor);
begin
  FTextColor := Value;
end;

procedure TJScrollText.CalculateSize;
var
  Size : TSize;
  aDc : HDC;
begin

  aDC := GetDc(fHandle);
  Windows.GetTextExtentPoint32(aDC, \'Wg\', 2, Size);
  ReleaseDC(fHandle, aDC);
  fTextHeight := Size.cy * Count + FClientRect.Bottom - FClientRect.Top;
end;

Se så var der det snedige ved det hele :

Den her Scroll Fætter er IKKE et komponent, og det er 100% med vilje, fordi så skal man til at instalere det først, og hit op og kom her ned. Det snedige er at du bare giver min klasse et komponent i sin konstructor og så scrolerer den på det ....

Så hvis du vil have teksten stående et bestemt sted og fylde en bestemt mængde tja ... så sætter du blot et panel på det ønskede sted, og tilpasser det i størelsen og så set vores test applikation således ud :

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile(\'Unit1.pas\'); //Kom noget tekst ind i dit memo felt

  with TJScrollText.Create(Panel1) do
  begin
    BackGround := clYellow;
    TextColor := clRed;
    Assign(Memo1.Lines);
//    LoadFromFile(\'unit1.pas\');
  end;
end;

Jens B
Avatar billede hand Nybegynder
10. januar 2001 - 22:13 #12
Nu kommer der en helt vil masse fejl !

Så kan du ikke prøve at lave et eks. og
ligge op på din HP ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester