Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   problemas al agregar texto a un bitmap (https://www.clubdelphi.com/foros/showthread.php?t=90660)

Casimiro Notevi 16-08-2016 00:22:04

Cita:

Empezado por Delphius (Mensaje 507715)
¿Y? Si la idea es que fuera una especie de parámetro opcional, o por defecto, entonces no deberían haberlo declarado de esa forma sino así:

Cita:

Empezado por Casimiro Notevi (Mensaje 507712)
Son esas cosas en las que se dice: "Ya lo dejamos preparado para más adelante". Luego nadie se acuerda porque no les habrá hecho falta.

. .

Delphius 16-08-2016 00:29:14

El problema es que de ser experimental ya lleva unos cuantos años. Inaceptable.
¿Cuánto tiempo más deberán esperar los desarrolladores? :rolleyes:

Saludos,

Casimiro Notevi 16-08-2016 00:38:36

Pue eso digo, que es la típica cosa que se olvida porque no ha hecho falta.

jhonny 16-08-2016 19:41:17

Cita:

Empezado por roman (Mensaje 507704)
Yo probaría dejando en blanco el parámetro:

Código Delphi [-]
Image1.Bitmap.Canvas.FillText(MyRect, '100 dias', false, 100, [], TTextAlign.Center, TTextAlign.Center);

He probado el asunto desde el principio y definitivamente me ha sucedido en un principio lo expuesto acá por cl2raul, pero probando con la solución expuesta por Roman en el apartado que he citado anteriormente funciona correctamente, quedando así finalmente:

Código Delphi [-]
  Image1.Bitmap.Canvas.BeginScene;
  Image1.Bitmap.Canvas.FillText(TRectF.Create(50, 40, 200, 270), '100 dias', false, 1, [], TTextAlign.Leading,
    TTextAlign.Center);
  Image1.Bitmap.Canvas.EndScene;

Hice un par de cambios a lo original, pero no han de ser representativos para solucionar el problema del hilo.

jhonny 16-08-2016 19:48:24

Metiéndose uno sólo un poco en el código de la FMX, ve uno que dicho parámetro llamado Flags es asignado a la propiedad boolean del TTextLayout creado en RunTime, llamada RightToLeft, de la siguiente manera:

Código Delphi [-]
Layout.RightToLeft := TFillTextFlag.RightToLeft in Flags;

O sea que si enviamos como valor del parámetro Flags... TFillTextFlag.RightToLeft, simplemente el Layout escribirá de derecha a izquierda, pero si lo enviamos vacío, escribirá de izquierda a derecha.

Mejor dicho, mirando la FMX, nos damos cuenta que aquí todos ya tenían razón en lo que hablaban. Y pongo esto acá, sólo para confirmarlo :D.

cl2raul 23-08-2016 16:24:02

Gracias a todos los involucrador, ya solucione el problema, segui el prosedimiento con el objetivo de eliminar [TFillTextFlag.RightToLeft] que era el responsable de priorizar las letras a los números causando la no esperada respuesta, como en la unidad FMX.Graphics esla que contienes el procedimiento TCanvas.FillText(), cree mi version del procedimiento para ver resultado esperado (100 dias)=(100 dias), a continuacion la unidad, ojo hay q agregar al uses FMX.TextLayout;

Código Delphi [-]
unit main;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
  FMX.StdCtrls, FMX.Controls.Presentation, FMX.Edit, FMX.Layouts;

type
  TTextInImage = class(TForm)
    Image1: TImage;
    Layout1: TLayout;
    Edit1: TEdit;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  TextInImage: TTextInImage;

implementation

{$R *.fmx}

uses FMX.TextLayout;

procedure TextInImg(const ARect: TRectF; const AText: string; LaImagen: TCanvas;
  const WordWrap: Boolean; const AOpacity: Single; const ATextAlign, AVTextAlign: TTextAlign);
var
  Layout: TTextLayout;
begin
  Layout := TTextLayoutManager.TextLayoutByCanvas(LaImagen.ClassType).Create(LaImagen);
  try
    Layout.BeginUpdate;
    Layout.TopLeft:=ARect.TopLeft;
    Layout.MaxSize:=PointF(ARect.Width, ARect.Height);
    Layout.Text:=AText;
    Layout.WordWrap:=WordWrap;
    Layout.Opacity:=AOpacity;
    Layout.HorizontalAlign:=ATextAlign;
    Layout.VerticalAlign:=AVTextAlign;
    Layout.Font:=LaImagen.Font;
    Layout.Color:=LaImagen.Fill.Color;
    //Layout.RightToLeft := TFillTextFlag.RightToLeft in Flags;
    Layout.EndUpdate;
    Layout.RenderLayout(LaImagen);
  finally
    FreeAndNil(Layout);
  end;
end;

procedure TTextInImage.Button1Click(Sender: TObject);
var
  MyRect: TRectF;
  x1, y1, x2, y2, I: integer;
begin
  x1 := 60;
  y1 := 60;
  x2 := Image1.Bitmap.Canvas.Width - 60;
  y2 := Image1.Bitmap.Canvas.Height - 60;

  MyRect := TRectF.Create(x1, y1, x2, y2);

  Image1.Bitmap.Canvas.BeginScene;
  Image1.Bitmap.Canvas.Font.Family:='Arial';
  Image1.Bitmap.Canvas.Font.Size:=48;

  TextInImg(MyRect,Edit1.Text,Image1.Bitmap.Canvas,True,100,TTextAlign.Center,TTextAlign.Center);

  Image1.Bitmap.Canvas.EndScene;
end;

procedure TTextInImage.FormCreate(Sender: TObject);
begin
  Image1.Bitmap.LoadFromFile(GetCurrentDir+'\p10.png');
end;

end.


La franja horaria es GMT +2. Ahora son las 22:15:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi