Canvas.Brush.Color, geht bei Text nicht (Linux)

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Canvas.Brush.Color, geht bei Text nicht (Linux)

Beitrag von Mathias »

Dieser kleine Test-Code erzeugt die Forms im Anhang, einmal mit Linux, das andere mal mit Windows.
Wieso bekommt unter Windows der Text die Hintergrundfarbe, welche mit Brush.Color festgelegt wurde und bei Linux nicht ?

Code: Alles auswählen

procedure TForm1.Panel1Paint(Sender: TObject);
begin
  with Panel1 do begin
    Color := clGreen;
    Canvas.Brush.Color := clBlue;
    Canvas.Pen.Color := clYellow;
    Canvas.TextOut(10, 10, 'Hello World');
    Canvas.Rectangle(30, 30, 100, 100);
  end;
end;

Ist dies ein Bug ?
Dateianhänge
Bildschirmfoto vom 2017-08-05 18-05-43.png
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Canvas.Brush.Color, geht bei Text nicht (Linux)

Beitrag von Timm Thaler »

Im Zweifel: Nein.

Elemente farbig gestalten ist nicht selbstverständlich. Wundert mich, dass es unter Windows geht, bei älteren Versionen basierend auf der WinApi ging es bei normalem Text nicht.

Hängt wahrscheinlich mit dem Widgetset zusammen, welches verwendet wird. Versuch mal Qt, das dürfte es können, allerdings hast Du bei Qt wieder das Problem mit der Lizenz.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Canvas.Brush.Color, geht bei Text nicht (Linux)

Beitrag von wp_xyz »

Setze in Windows for der Textausgabe Brush.Style auf bsClear, dann wird der Text transparent gezeichnet. Oder setze Canvas.TextStyle.Opaque auf false und benutze TextRect für die Ausgabe.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Canvas.Brush.Color, geht bei Text nicht (Linux)

Beitrag von Mathias »

So würde es funktionieren.

Code: Alles auswählen

  with Panel1 do begin
    Color := clGreen;
    Canvas.Brush.Color := clBlue;
    Canvas.Pen.Color := clYellow;
    Canvas.Brush.Style := bsClear;
    Canvas.TextOut(10, 10, 'Hello World');
    Canvas.Brush.Style := bsSolid;
    Canvas.Rectangle(30, 30, 100, 100);
  end;   


Dies gibt nut eine Fehlermeldung.

Code: Alles auswählen

Canvas.TextStyle.Opaque:=False;


Elemente farbig gestalten ist nicht selbstverständlich.

So wie es scheint, muss man damit leben. :roll:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Canvas.Brush.Color, geht bei Text nicht (Linux)

Beitrag von wp_xyz »

Mathias hat geschrieben:So wie es scheint, muss man damit leben. :roll:

Nein, musst du nicht. TextStyle ist ein Record, und da es keine Setter/Getter für die einzelnen Record-Elemente gibt, muss man den Record auf 1x setzen. Dazu muss man einen Umweg über eine lokale Variable machen:

Code: Alles auswählen

var
  ts: TTextStyle;
begin
  with Panel1 do begin
    Color := clGreen;
    Canvas.Brush.Color := clBlue;
    Canvas.Pen.Color := clYellow;
    ts := Canvas.TextStyle;           
    ts.Opaque := false;
    Canvas.TextStyle := ts;
    Canvas.TextRect(Rect(0, 0, Width, Height), 10, 10, 'Hello World');     // Achtung: TextStyle wird nur von TextRect berücksichtigt
    Canvas.Rectangle(30, 30, 100, 100);
  end;
end;

Bevor du einwendest "Bei TFont geht's ja auch!" - TFont ist ein Objekt.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Canvas.Brush.Color, geht bei Text nicht (Linux)

Beitrag von Mathias »

Ist ein bisschen umständlich.
Da ziehe ich diese Methode vor, da sieht man auch eher was passiert.

Code: Alles auswählen

 Canvas.Brush.Style := bsClear;
  Canvas.TextOut(10, 10, 'Hello World');
  Canvas.Brush.Style := bsSolid;


Jetzt habe ich noch was lustiges endeckt,

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
begin
  Color:=clYellow;
  Canvas.TextOut(10,10,'Hello World');
end;

Wen ich die Zeile mit Color weglasse, ist der Text weiss hinterlegt, obwohl das Form grau ist.
Aber mit der Zeile Color, ist das Form und die Hinterlegung des Textes gelb.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten