Textausgabe nicht im TextRect. Warum?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Textausgabe nicht im TextRect. Warum?

Beitrag von wennerer »

Hallo an Alle,
ich versuche mit "Canvas.TextRect" unter Verwendung von TextStyle einen Text auszugeben. Ich dachte eigentlich das der Ausgabetext bei Verwendung dieses Befehls immer im angegebenen Rechteck liegen muss. Wenn ich aber taLeftJustify und/oder tlTop einstelle ist der Text bei mir in der linken/oberen Ecke der Form. Mach ich da was falsch?
TextRect.png
TextRect.png (11.46 KiB) 1449 mal betrachtet

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    TrackBar1: TTrackBar;
    TrackBar2: TTrackBar;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure TrackBar2Change(Sender: TObject);

  private
   R : TRect;
   MyTextStyle : TTextStyle;
   L,T : integer;
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 R := rect(20,50,120,80);
 L:=0; T:=0;
 MyTextStyle.Layout   := tlCenter;
 MyTextStyle.Alignment:= taCenter;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 MyTextStyle.Layout   := tlTop;
 Invalidate;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 MyTextStyle.Layout   := tlCenter;
 Invalidate;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 MyTextStyle.Layout   := tlBottom;
 Invalidate;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 MyTextStyle.Alignment:= taLeftJustify;
 Invalidate;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
 MyTextStyle.Alignment:= taCenter;
 Invalidate;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
 MyTextStyle.Alignment:= taRightJustify;
 Invalidate;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  L:= Trackbar1.Position;
  Invalidate;
end;

procedure TForm1.TrackBar2Change(Sender: TObject);
begin
 T:= Trackbar2.Position;
 Invalidate;
end;


procedure TForm1.FormPaint(Sender: TObject);
begin
 with canvas do
  begin
   brush.Color:= clWhite;
   rectangle(R);

   TextRect(R,L,T,'Ausgabe',MyTextStyle);
  end;
end;

end.



Viele Grüße
Bernd
Dateianhänge
project1.zip
(126.08 KiB) 58-mal heruntergeladen

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Textausgabe nicht im TextRect. Warum?

Beitrag von Sieben »

X und Y, bei dir L und T, spielen offenbar nur bei tlTop bzw taLeftjustify eine Rolle. Dann aber müssen sie Punkte innerhalb des definierten Rechtecks sein, keine Angaben relativ zu ihm:

Code: Alles auswählen

TextRect(R, R.Left + L, R.Top + T, 'Ausgabe', MyTextStyle);   
Zuletzt geändert von Sieben am So 1. Nov 2020, 22:51, insgesamt 1-mal geändert.

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Textausgabe nicht im TextRect. Warum?

Beitrag von wennerer »

Hallo Sieben,
mit L und T hab ich schon herum gespielt. Die lassen sich in meinem kleinen Test mit den Trackbars einstellen. Aber wie du schon sagst liegt auch hier der Nullpunkt bei 0,0 der Form. Ich hätte erwartet das der Bezugspunkt in der linken, oberen Ecke des Rechteck liegen würde. Kann ich natürlich verrechnen aber macht man das so? Oder gibt's da einen Trick?

Viele Grüße
Bernd

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Textausgabe nicht im TextRect. Warum?

Beitrag von Sieben »

Da du hier die Canvas des Forms verwendest sind auch alle Angaben darauf bezogen. Die Annahme, X und Y seien relativ zum Rechteck finde ich zwar erst mal nachvollziehbar, aber offensichtlich trifft sie nicht zu. Also bleibt dir nichts anderes als das 'Verrechnen'... Konsequent nur ein Bezugssystem zu verwenden dürfte aber insgesamt mehr Vor- als Nachteile bringen.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Textausgabe nicht im TextRect. Warum?

Beitrag von Winni »

Hi!

Völlig vergurkter Source. Hat mich schon bei Delphi geärgert.

Entweder sich selbst ne Prcoedure schreiben.
Dürfte nicht allzu schwer sein.

Oder BGRAbitmap benutzen. Da klappt das.

Winni

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Textausgabe nicht im TextRect. Warum?

Beitrag von wennerer »

Danke für eure Antworten!
Dann werde ich es halt verrechnen, ist ja kein Problem (aber etwas seltsam :D ).

Viele Grüße
Bernd

Antworten