Delphi Can
Yazı renklendirme - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Mobil Platform - FireMonkey (FMX) (https://www.delphican.com/forumdisplay.php?fid=7)
+--- Konu Başlığı: Yazı renklendirme (/showthread.php?tid=4965)

Sayfalar: 1 2


Yazı renklendirme - Nese - 16-06-2020

Merhaba;




ir1ZGm.png


Örnekteki gibi string bir yazıyı nasıl renklendire bilirim?




var
Texts:String;
begin
Text:='MERHABA DÜNYA';
with Texts.Canvas do
begin
BeginScene();
Font.Style := [];
Font.Size := 12;
Fill.Color := TAlphaColors.Red;
FillText(TRectF.Create(10, 10, 300, 295), Texts, False, 100, [], TTextAlign.Center, TTextAlign.Center);
 EndScene;



Yazı renklendirme - mcuyan - 16-06-2020

Hafıza da mı renklendirecek siniz?

Bir nesne oluşturun label edit button vs.. bu şekilde renklendirein.


label1.TextSettings.FontColor:=TAlphaColorRec.Blanchedalmond; gibi



Yazı renklendirme - arsl01 - 16-06-2020

Merhaba,
Memoda istediğimiz satırı farklı renk yapabiilirmiyiz?


Yazı renklendirme - mrmarman - 16-06-2020

Merhaba 
@Nese 

- Cevabınızı sorunun içinde vermişsiniz. Daha önce başka bir başlıkta benzer bir sorunuz olmuş ve çözüm üretmiştiniz. Orada bir TCanvas üzerine yazdırmıştınız. Şimdi nereye yazdırmak istiyorsunuz. @mcuyan 'ın önerisini dikkate alırsanız çözümünüz budur.


@arsl01  

- Memo deyince iki durum var, üzerine kullanıcının Word / Excel gibi yazmak isteyebileceği bir şekilde mi yoksa sadece görsel olarak readonly bir durum için mi ?

- Bu önemli çünkü yazmak için ise RichText gibi bir yapı lazım gelir, aksi halde bir Text Layout, memo yerine iş görecektir.

- Son olarak FMX mi yoks VCL tarafında mı olduğunu teyit edersen taşlar daha da yerine oturacaktır.


Yazı renklendirme - arsl01 - 16-06-2020

Hocam öncelikle fmx'te olacak ve readonly şekilde calişacak.
Yani kullanıcı mudahale etmicek.
Ben memo.lines.add dediğimde o satıra istediğim rengi yazabilmek istiyorum.


Yazı renklendirme - mrmarman - 16-06-2020

Merhaba.

- Readonly ise şöyle basit bir örnek hazırladım sizin için. Size metni parse ederek nerede hangi renk çıktı verilecek ise orada ilgili renkte baskı yapmak kalıyor.

Formun üzerine Memo yerine bir TScrollBox ( sağa sola, yukarı aşağı scroll yapabilmek için )  ve bunun içine bir tane boyutu önemli değil, sadece Alignment özelliği alNone olan, boyutunu bizim değiştrebileceğimiz, dolayısıyla ScrollBox devreye alabilecek bir TImage ekleyiniz.

- Aşağıdaki Procedure sizin için hazırladığım

procedure AddNewLineWithText( OriginalBitmap: TBitmap; aText: String; aFontSize:Single; aFontFamily:TFontName; aFontColor: TAlphaColor; aFontStyle:TFontStyles );
const
 TextPadding = 5;
var
 aBitmap     : TBitmap;
 aTextWidth,
 aTextHeight,
 aWidth,
 aHeight     : Integer;
begin
 aBitmap := TBitmap.Create;
 try
// Original Image Backup if exists....
   if NOT OriginalBitmap.IsEmpty then
     aBitmap.Assign( OriginalBitmap );

// Font Defines will needed by Canvas Text Measurement....
   with OriginalBitmap.Canvas do begin
     Font.Size   := aFontSize;
     Font.Family := aFontFamily;
     Fill.Color  := aFontColor;
     Font.Style  := aFontStyle;
     aTextWidth  := Trunc( TextWidth ( aText ) ) + TextPadding;
     aTextHeight := Trunc( TextHeight( aText ) ) + TextPadding;

     if OriginalBitmap.IsEmpty then begin
       aWidth    := aTextWidth;
       aHeight   := aTextHeight;
     end else begin
       aWidth    := Width;
       aHeight   := Height;
     end;
// Set New Image Size...
     if NOT OriginalBitmap.IsEmpty then begin
       if aTextWidth > aWidth then
         aWidth  := Trunc( aTextWidth );
       aHeight   := Height + aTextHeight;
     end;
   end;

   OriginalBitmap.SetSize( aWidth, aHeight ); // Resize Image with new size...
   OriginalBitmap.Clear(TAlphaColors.black);
   with OriginalBitmap.Canvas do begin // Reformat Canvas Font for painting...
     Font.Size   := aFontSize;
     Font.Family := aFontFamily;
     Fill.Color  := aFontColor;
     Font.Style  := aFontStyle;
   end;

// Finalize Bitmap with New Text Line...
   with OriginalBitmap.Canvas do begin
     BeginScene;
       if NOT aBitmap.IsEmpty then // Draw Backup Image, before FillText...
         DrawBitmap( aBitmap , RectF(0, 0, aBitmap.Width,  aBitmap.Height)
                             , RectF(0, 0, aBitmap.Width,  aBitmap.Height), 1);
// Draw New Text on Canvas...
       FillText(TRectF.Create(0, aHeight-aTextHeight, aWidth, aHeight), aText, false, 1, [], TTextAlign.Leading, TTextAlign.Center );
     EndScene;
   end;
 finally
   aBitmap.Free;
 end;
end;


Kullanımı için ise şu şekilde bir reelshow hazırladım.

procedure TForm1.Button1Click(Sender: TObject);
var
 i : Integer;
 aList : TStringList;
begin
 Image1.WrapMode := TImageWrapMode.Original;

 aList := TStringList.Create;
 try
   aList.LoadFromFile( '..\..\Units\Unit1.pas');
   for i := 0 to pred(aList.count) do
     case i mod 6 of
     0:  AddNewLineWithText( Image1.Bitmap, aList[i], 12, 'Times New Roman',   TAlphaColors.Red,     [ TFontStyle.fsBold] );
     1:  AddNewLineWithText( Image1.Bitmap, aList[i], 12, 'Courirer New',      TAlphaColors.Blue,    [ TFontStyle.fsItalic] );
     2:  AddNewLineWithText( Image1.Bitmap, aList[i], 12, 'Calibti',           TAlphaColors.Aqua,    [ TFontStyle.fsBold] );
     3:  AddNewLineWithText( Image1.Bitmap, aList[i], 12, 'Verdena',           TAlphaColors.Fuchsia, [ TFontStyle.fsBold] );
     4:  AddNewLineWithText( Image1.Bitmap, aList[i], 12, 'Arial Narrow',      TAlphaColors.Brown,   [ ] );
     5:  AddNewLineWithText( Image1.Bitmap, aList[i], 12, 'Arial Bold',        TAlphaColors.Yellow,  [ TFontStyle.fsBold, TFontStyle.fsStrikeOut] );
     end;
 finally
   aList.Free;
 end;

 Image1.Height := Image1.Bitmap.Height;
 Image1.Width  := Image1.Bitmap.Width;
end;

Sonucu aşağıdaki şekilde.

pkwmp5ei5tstyvxefevu.gif



Cvp: Yazı renklendirme - Nese - 17-06-2020

(16-06-2020, Saat: 18:08)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba 
@Nese 

- Cevabınızı sorunun içinde vermişsiniz. Daha önce başka bir başlıkta benzer bir sorunuz olmuş ve çözüm üretmiştiniz. Orada bir TCanvas üzerine yazdırmıştınız. Şimdi nereye yazdırmak istiyorsunuz. @mcuyan 'ın önerisini dikkate alırsanız çözümünüz budur.


@arsl01  

- Memo deyince iki durum var, üzerine kullanıcının Word / Excel gibi yazmak isteyebileceği bir şekilde mi yoksa sadece görsel olarak readonly bir durum için mi ?

- Bu önemli çünkü yazmak için ise RichText gibi bir yapı lazım gelir, aksi halde bir Text Layout, memo yerine iş görecektir.

- Son olarak FMX mi yoks VCL tarafında mı olduğunu teyit edersen taşlar daha da yerine oturacaktır.


Yanlış anlaşılma oldu sanırım.

Farklı bir şekilde anlatayım stringde örnek olarak "Bu akşam hava çok güzel" yazıyor bu yazını etrafında 200 x 300 background olacak.
Bu yazıyı memoya veya labelde alsam 200 x 300 background birlikte almak istiyorum.  

Umarım anlata bilmişimdir.


Yazı renklendirme - mrmarman - 17-06-2020

@Nese

- FMX platformunda Memo olsun Label olsun Edit olsun, ne olursa olsun Style'ler konuşur. Bu konuda çalışmanız lazım.
- Size verdiğim örnekler bunlara bulaşmadan TBitmap üzerine CANVAS boyama şeklindeydi.

- Bunları bir kenara bırakarak palyatif basit bir çözüm istiyorsanız önerim aşağıdaki şekilde olacaktır.

* TLabel adedi kadar TRectangle oluşturup, her TLabel'i ait olacağı bir TRectangle'i onun parenti olacak şekilde bağlayabilirsiniz. Aşağıda görselde bunu gösterdim.
* Böylece  TRectangle'lerin rengi ne ise ilgili Label'in background rengi de o olacaktır.

Şöyle basit bir yapı hazırladım sizin için...

  1. Forma iki adet TLabel, iki adet de TRectangle bırakın.
  2. Label önemli ama rectangle için isimlendirme önemli olmayacak, çünkü Label ne ise onun parenti olan rectangle şeklinde spontan erişilecektir.
  3. IDE'nin form görüntüleme anında, sol üstteki pencere olan Structure penceresi yardımı ile her bir Label'i tutup, background sayılacak Rectangle'nin altına bağlayın.
  4. Font için background color koyacak property hazırda olmadığından boşta duran TAG proprty'sini background color tutan integer değişken olarak kullanabilirsiniz.
  5. Geriye aşağıdaki kod iş görecektir.

procedure TForm1.Button2Click(Sender: TObject);
var
 i       : Integer;
 aRctn   : TRectangle;
 aLabel  : TLabel;
begin
 Label1.Tag  := TAlphaColors.Red;
 Label2.Tag  := TAlphaColors.Blue;

 Label1.TextSettings.HorzAlign := TTextAlign.Center;
 Label1.TextSettings.VertAlign := TTextAlign.Center;

 Label2.TextSettings.HorzAlign := TTextAlign.Center;
 Label2.TextSettings.VertAlign := TTextAlign.Center;

 for i := 0 to pred(ComponentCount)  do begin
   if  ( Components[i] is TLabel )
   and ( TLabel(Components[i]).Parent is TRectangle )  then begin
     aLabel              := TLabel( Components[i] );
     aRctn               := TRectangle( aLabel.Parent );
     aRctn.Fill.Color    := aLabel.Tag;
     aLabel.Width        := aRctn.Width;
     aLabel.Height       := aRctn.Height;
     aLabel.Position.X   := 0;
     aLabel.Position.Y   := 0;
   end;
 end;
end;


dchghpqp01ma7afja0mw.gif



Cvp: Yazı renklendirme - Nese - 17-06-2020

(17-06-2020, Saat: 11:04)mrmarman Adlı Kullanıcıdan Alıntı: @Nese

- FMX platformunda Memo olsun Label olsun Edit olsun, ne olursa olsun Style'ler konuşur. Bu konuda çalışmanız lazım.
- Size verdiğim örnekler bunlara bulaşmadan TBitmap üzerine CANVAS boyama şeklindeydi.

- Bunları bir kenara bırakarak palyatif basit bir çözüm istiyorsanız önerim aşağıdaki şekilde olacaktır.

* TLabel adedi kadar TRectangle oluşturup, her TLabel'i ait olacağı bir TRectangle'i onun parenti olacak şekilde bağlayabilirsiniz. Aşağıda görselde bunu gösterdim.
* Böylece  TRectangle'lerin rengi ne ise ilgili Label'in background rengi de o olacaktır.

Şöyle basit bir yapı hazırladım sizin için...

  1. Forma iki adet TLabel, iki adet de TRectangle bırakın.
  2. Label önemli ama rectangle için isimlendirme önemli olmayacak, çünkü Label ne ise onun parenti olan rectangle şeklinde spontan erişilecektir.
  3. IDE'nin form görüntüleme anında, sol üstteki pencere olan Structure penceresi yardımı ile her bir Label'i tutup, background sayılacak Rectangle'nin altına bağlayın.
  4. Font için background color koyacak property hazırda olmadığından boşta duran TAG proprty'sini background color tutan integer değişken olarak kullanabilirsiniz.
  5. Geriye aşağıdaki kod iş görecektir.

procedure TForm1.Button2Click(Sender: TObject);
var
 i       : Integer;
 aRctn   : TRectangle;
 aLabel  : TLabel;
begin
 Label1.Tag  := TAlphaColors.Red;
 Label2.Tag  := TAlphaColors.Blue;

 Label1.TextSettings.HorzAlign := TTextAlign.Center;
 Label1.TextSettings.VertAlign := TTextAlign.Center;

 Label2.TextSettings.HorzAlign := TTextAlign.Center;
 Label2.TextSettings.VertAlign := TTextAlign.Center;

 for i := 0 to pred(ComponentCount)  do begin
   if  ( Components[i] is TLabel )
   and ( TLabel(Components[i]).Parent is TRectangle )  then begin
     aLabel              := TLabel( Components[i] );
     aRctn               := TRectangle( aLabel.Parent );
     aRctn.Fill.Color    := aLabel.Tag;
     aLabel.Width        := aRctn.Width;
     aLabel.Height       := aRctn.Height;
     aLabel.Position.X   := 0;
     aLabel.Position.Y   := 0;
   end;
 end;
end;


dchghpqp01ma7afja0mw.gif

Anladım hocam, Çok teşekkür ederim.


Yazı renklendirme - mcuyan - 17-06-2020

FMX de rectangle componentini araştırın. orada buton gibi bir panele renk verip, üzerine yazı yazıp istediğiniz rengi verebiliyorsunuz.. Yada bir dönem çok sık kullandığım barış atalay arakdaşımızın yazdığı FlatRectButton componenti görsel olarak da göze gayet güzel gürünümü ile de işinizi görecektir.