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)

cl2raul 05-08-2016 19:43:31

problemas al agregar texto a un bitmap
 
Hola, estoy dibujando en un TImage para general solapines desde una base de datos el problema consiste a la hora de agregarle el texto...
buscando encontre en los ejemplos de delphi esta linea que si me agrega el texto al timage:

Image2.Bitmap.Canvas.FillText()

el funciona bien, pero cunado agrego 100dias, pone 100dias
y al poner 100 dias, este prioriza las letras y pone dias 100, alguien pudede ayudarme

Casimiro Notevi 05-08-2016 20:06:05

:confused::confused::confused::confused::confused::confused:

Ñuño Martínez 05-08-2016 20:07:30

Me parece muy raro que haga eso. Se me ocurren dos posibilidades, aunque podría ser otra cosa: Quizá se te haya colado algún comando UNICODE raro. O quizá haya una propiedad "BiDiMode" o similar. O tal vez la alineación. ¿Te dibuja sólo una línea o líneas separadas?

La verdad es que según voy escribiendo me parece más extraño. :confused:

A ver si puedes poner un poco de código y alguna captura. A veces ayuda.

roman 05-08-2016 20:54:52

Cita:

Empezado por cl2raul (Mensaje 507452)
Image2.Bitmap.Canvas.FillText()

Yo creo que tendrás que aclarar: la clase TImage no contiene una propiedad Bitmap y la clase Canvas no contiene un método FillText.

LineComment Saludos

BDWONG 05-08-2016 22:19:16

Hola prueba con esto haber si te sirve.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  image1.Canvas.Brush.Color:=clBlue;
  Image1.Canvas.FillRect(0,0,Image1.Width,Image1.Height);

  Image1.Canvas.Brush.Color:=clRed;
  image1.Canvas.Font.Height:=18;
  Image1.Canvas.TextOut(10,10,'100, dias');
end;

jhonny 06-08-2016 03:39:20

Cita:

Empezado por roman (Mensaje 507456)
Yo creo que tendrás que aclarar: la clase TImage no contiene una propiedad Bitmap y la clase Canvas no contiene un método FillText.

LineComment Saludos

Está usando el Framework Firemonkey http://docwiki.embarcadero.com/Libra...anvas.FillText

A vuelo de pájaro, yo diría que quizá el problema sea más bien en la consulta que se está haciendo y no en el método FillText.

roman 06-08-2016 05:02:59

Cita:

Empezado por jhonny (Mensaje 507461)
Está usando el Framework Firemonkey http://docwiki.embarcadero.com/Libra...anvas.FillText

¡Ah vaya! Pues qué bueno saberlo :)

Gracias Jhonny

LineComment Saludos

cl2raul 09-08-2016 17:49:40

gracias
 
gracias a todos pero debo aclarar que el TImage es de FMX por eso cambian un poco las cosas, uso FMX pq tiene muchas obciones gracias a los layout q hace mas facil el diseño de las aplicaciones...

BDWONG: gracias pero eso se usa en VCL y yo estoy usando FMX.
Ñuño Martínez: gracias y aqui les va un ejemplo y es copia casi fiel de los ejemplos de la ayuda de FMX.

Código Delphi [-]
unit Unit1;

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.Controls.Presentation, FMX.Edit, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Bitmap.LoadFromFile(GetCurrentDir+'\01.jpg'); 
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  MyRect: TRectF;
begin
  MyRect:= TRectF.Create(50, 40, 200, 270);
  Image1.Bitmap.Canvas.BeginScene;
  Image1.Bitmap.Canvas.FillText(MyRect, '100 dias', false, 100,
    [TFillTextFlag.RightToLeft], TTextAlign.Center, TTextAlign.Center);
  Image1.Bitmap.Canvas.EndScene;
end;

end.

quiero q observen bien en '100 dias', al mostrar el resultado pone 'dias 100', pero si pongo '100dias', muestra '100dias' o sea el problema esta en que no se porque rayos al separar los numeros de las letras y estos esten delante de las letras, el procedimiento prioriza las letras y luego los numeros... llevo un mes con esto y creo q la mejor solucion es crear una dll que use la libreria VCL me cree la imagen con el texto correcto y luego la coloque en el TImagen de FMX para mostrar alguien tiene mejor idea, esta pinta de mucho trabajo y poca eficiencia.

Delphius 09-08-2016 18:32:29

Y... no se mucho de inglés, no más un tantito como para leer en tu muestra de código un RigthToLeft y eso significa "de derecha a izquierda"
Eso me hace sospechar un poquito de que algo tuviera que ver al momento de escribir palabras separadas.
No uso FMX por lo que no estoy seguro. Aunque convengamos que hay una fuerte sospecha de que por ahí van los tiros.
Yo que vos estudio inglés y me leo la doc que puso Jhonny XD

Saludos

Ñuño Martínez 09-08-2016 21:05:10

Coincido con Delphius. Precisamente lo que comentaba con eso del "BiDiMode" de VCL.

cl2raul 12-08-2016 18:44:43

ok probare tu consejo [Delphius] pareces tener razon, pronto dare respuesta...

cl2raul 15-08-2016 19:33:19

ya lo probe y no se puede pq TFillTextFlag.RightToLeft es la unica opcion q da delphi xe7, alguien sabe algo...

Delphius 15-08-2016 19:38:49

Es algo raro que existiera esa única opción en el enumerativo. Por lo que estuve viendo, en la versión Sattle sigue igual.
Quisiera pensar que todavía está en desarrollo... aunque es muy curioso.

Prueba con escribir de forma inversa las palabras. Es decir, si quieres que aparezca "100 días" pasa el texto como "días 100".

Saludos,

Casimiro Notevi 15-08-2016 19:53:21

Cita:

Empezado por cl2raul (Mensaje 507700)
ya lo probe y no se puede pq TFillTextFlag.RightToLeft es la unica opcion q da delphi xe7, alguien sabe algo...

Lo mismo no debes poner nada para que aparezca normal de left to right

roman 15-08-2016 19:53:33

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);

LineComment Saludos

Delphius 15-08-2016 20:21:03

La doc no dice nada sobre si puede dejarse en blanco.
No es muy clara al respecto.

Lo que si es bastante raro que al día de hoy ese enumerativo cuente con "Derecha a izquierda" y no el inverso. ¡Alguna razón o motivo deberían tener!

Saludos,

Casimiro Notevi 15-08-2016 22:03:16

Porque lo normal es de izquierda a derecha.

roman 15-08-2016 22:08:07

Cita:

Empezado por Casimiro Notevi (Mensaje 507710)
Porque lo normal es de izquierda a derecha.

Así es. Realmente, lo raro en esta función es que el parámetro se especificque como un conjunto de banderas en lugar de un booleano, a menos que esperen que en el futuro haya otras direcciones del texto (¿de arriba a abajo, de abajo a arriba, diagonal :confused:), y aún así, no debería ser un conjunto de banderas.

LineComment Saludos

Casimiro Notevi 15-08-2016 22:11:09

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:07:44

Cita:

Empezado por Casimiro Notevi (Mensaje 507710)
Porque lo normal es de izquierda a derecha.

¿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í:

Código Delphi [-]
Direction: TFillTextFlags = LeftToRight

Cita:

Empezado por roman (Mensaje 507711)
Así es. Realmente, lo raro en esta función es que el parámetro se especificque como un conjunto de banderas en lugar de un booleano, a menos que esperen que en el futuro haya otras direcciones del texto (¿de arriba a abajo, de abajo a arriba, diagonal :confused:), y aún así, no debería ser un conjunto de banderas.

LineComment Saludos

Exacto. Es una forma muy rara. Si sólo se permitiera dos direcciones, no hace falta el tipo enumerativo/conjunto. Un boolean y con un valor por defecto es suficiente.

Estamos frente a una implementación pobre. Pareciera ser experimental, y proviene desde XE2 y al menos hasta en XE7 está así.

Saludos,


La franja horaria es GMT +2. Ahora son las 00:30:31.

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