Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Yazı renklendirme
#1
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;
Cevapla
#2
Hafıza da mı renklendirecek siniz?

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


label1.TextSettings.FontColor:=TAlphaColorRec.Blanchedalmond; gibi
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#3
Merhaba,
Memoda istediğimiz satırı farklı renk yapabiilirmiyiz?
Muharrem ARSLAN
WWW
Cevapla
#4
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.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#5
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.
Muharrem ARSLAN
WWW
Cevapla
#6
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
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#7
(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.
Cevapla
#8
@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
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#9
(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.
Cevapla
#10
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.
// Bilgi paylaştıkça çoğalır.. 

Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  kayan yazı serhat 4 4.110 20-02-2024, Saat: 06:30
Son Yorum: sso
  Kordinata göre yazı yazma Husv 0 625 19-09-2023, Saat: 23:07
Son Yorum: Husv
  Grid veya StringGrid Hücre Renklendirme burakb44 6 5.789 06-08-2021, Saat: 10:01
Son Yorum: ahmet6513
  Resime iki satır yazı yazma Nese 3 3.053 11-06-2020, Saat: 06:38
Son Yorum: mrmarman
  [Çözüldü] Fmx grid veya stringgrid hücre renklendirme CesuR 4 5.072 11-02-2019, Saat: 13:35
Son Yorum: CesuR



Konuyu Okuyanlar: 1 Ziyaretçi