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

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.

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

Beitragvon Mathias » 5. Aug 2017, 17:11 Canvas.Brush.Color, geht bei Text nicht (Linux)

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4350
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Timm Thaler » 5. Aug 2017, 18:01 Re: Canvas.Brush.Color, geht bei Text nicht (Linux)

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.
Timm Thaler
 
Beiträge: 985
Registriert: 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
Nach oben

Beitragvon wp_xyz » 5. Aug 2017, 18:19 Re: Canvas.Brush.Color, geht bei Text nicht (Linux)

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.
wp_xyz
 
Beiträge: 3005
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 5. Aug 2017, 20:05 Re: Canvas.Brush.Color, geht bei Text nicht (Linux)

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4350
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 5. Aug 2017, 20:26 Re: Canvas.Brush.Color, geht bei Text nicht (Linux)

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.
wp_xyz
 
Beiträge: 3005
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 6. Aug 2017, 16:14 Re: Canvas.Brush.Color, geht bei Text nicht (Linux)

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4350
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Lazarus - Bugs



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried