Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Nesnenin dışarı taşması
#1
Merhaba;

Kayan yazı için Timage ve TText Create ediyorum ve TText nesnesini Ttimer ile sola doğru kaydırıyoum.
Fakat TText nesnesi sola doğru kaydırdığımda Timage nesnesinin dışına çıkıyor TTextsin Timage dışına çıkmamasını nasıl çözebilirim?


  

            TitleBackground:= TImage.Create(MainForm);
            TitleBackground.Parent := Panel2;
            TitleBackground.Name := FDQ.FieldByName('Name').AsString;
            TitleBackground.Bitmap.LoadFromFile(FDQ.FieldByName('Resim').AsString);
            TitleBackground.Height := Integer(Trunc(FDQ.FieldByName('Lh').AsInteger));
            TitleBackground.Width := Integer(Trunc(FDQ.FieldByName('Lw').AsInteger));
            TitleBackground.Position.X := Integer(Trunc(FDQ.FieldByName('Lx').AsInteger));
            TitleBackground.Position.Y := Integer(Trunc(FDQ.FieldByName('Ly').AsInteger));
            TitleBackground.Visible := FDQ.FieldByName('Status').Value; // AsBoolean
            TitleBackground.WrapMode := TImageWrapMode.Stretch;

          
            iText := TText.Create(MainForm);
            iText.Name := 'TitleName';
            iText.Parent := TitleBackground;
            iText.Font.Family := 'Arial';
            iText.TextSettings.HorzAlign := TTextAlign.Leading;
            iText.TextSettings.Font.Style := [TFontStyle.fsBold];
            iText.Text := EmptyStr;
            iText.TextSettings.FontColor := FDQ.FieldByName('Color').AsInteger;
            iText.Text := TrimLeft(FDQ.FieldByName('Title').AsString);
            iText.AutoSize := True;
            iText.WordWrap := False;
            iText.BringToFront;

            iText.Position.X := TitleBackground.Width; // Left
            iText.Position.Y := +4; // Top
            iText.Font.Size := TitleBackground.Height - 15;
            TimerSubTile.Enabled := True;




procedure TMainForm.TimerTileTimer(Sender: TObject);
begin
  try
    TThread.Synchronize(TThread.CurrentThread,
      procedure()
      begin
        if Assigned(TitleBackground) then // Create edilmişse
        begin
          iText.Position.X := iText.Position.X - 1.5;
          if iText.Position.X + iText.Width < 0 then
          begin
            TimerTitle.Enabled := False;
            iText.Position.X := TitleBackground.Width; // Yeniden kordinat atadık
            TitleUpdate(Sender); // Yeniden alt yazıyı çektik
            TimerTitle.Enabled := True;
          end;
        end;
      end);
  except

  end;
end;
Cevapla
#2
Merhaba,
Aşağıki şekilde bir düzenleme yapıp gözlemleyebilir misiniz.
           TitleBackground:= TImage.Create(MainForm);
           TitleBackground.Parent := Panel2;
           TitleBackground.Name := FDQ.FieldByName('Name').AsString;
           TitleBackground.Bitmap.LoadFromFile(FDQ.FieldByName('Resim').AsString);
           TitleBackground.Height := Integer(Trunc(FDQ.FieldByName('Lh').AsInteger));
           TitleBackground.Width := Integer(Trunc(FDQ.FieldByName('Lw').AsInteger));
           TitleBackground.Position.X := Integer(Trunc(FDQ.FieldByName('Lx').AsInteger));
           TitleBackground.Position.Y := Integer(Trunc(FDQ.FieldByName('Ly').AsInteger));
           TitleBackground.Visible := FDQ.FieldByName('Status').Value; // AsBoolean
           TitleBackground.WrapMode := TImageWrapMode.Stretch;

          
           iText := TText.Create(MainForm);
           iText.Name := 'TitleName';
           iText.Parent := TitleBackground;
           iText.Font.Family := 'Arial';
           iText.TextSettings.HorzAlign := TTextAlign.Leading;
           iText.TextSettings.Font.Style := [TFontStyle.fsBold];
           iText.Text := EmptyStr;
           iText.TextSettings.FontColor := FDQ.FieldByName('Color').AsInteger;
           iText.Text := TrimLeft(FDQ.FieldByName('Title').AsString);
           iText.AutoSize := True;
           iText.WordWrap := False;
           iText.BringToFront; 
           iText.Position.X := TitleBackground.Width; // Left
           iText.Position.Y := +4; // Top
           iText.Font.Size := TitleBackground.Height - 15;
           TimerSubTile.Enabled := True;

           iText.TextSettings.HorzAlign:= TTextAlign.Trailing; //<<<<<  
           iText.AutoSize := False;  //<<<<<



 try
   TThread.Synchronize(TThread.CurrentThread,
     procedure()
     begin
       if Assigned(TitleBackground) then // Create edilmişse
       begin
         iText.Position.X := iText.Position.X - 1.5;
         Caption:=iText.Position.X.ToString;
        // if iText.Position.X + iText.Width < 0 then
         begin

           if iText.Position.X<=0 then
           Begin
             iText.Position.X  :=0;
             iText.Width       :=iText.Width-1.5;
           End;
//            TimerTitle.Enabled := False;
//            iText.Position.X := TitleBackground.Width; // Yeniden kordinat atadık
//            TitleUpdate(Sender); // Yeniden alt yazıyı çektik
//            TimerTitle.Enabled := True;
         end;
       end;
     end);
 except

 end;
Cevapla
#3
FMX mimarisinde kayan yazı animasyonunu tek satırda yapabilirsiniz. 
TAnimator
not if
Cevapla
#4
@ozcanm  Hocam soladan dışarı taşma engellendi fakat yazı sağdan sola geldiğinden sağ tarafdaki taşmayı nasıl önlerim?

          
    begin
           SubTitleText := TText.Create(MainForm);
           SubTitleText.Name := 'SubTitleName';
           SubTitleText.Parent := TImage(FindComponent(SLogoName));
           SubTitleText.Font.Family := 'Arial';
           SubTitleText.TextSettings.Font.Style := [TFontStyle.fsBold];
           SubTitleText.Text := EmptyStr;
           SubTitleText.TextSettings.FontColor := FDQ.FieldByName('Color').AsInteger;
           SubTitleText.Text := TrimLeft(FDQ.FieldByName('Subtitle').AsString);
           SubTitleText.AutoSize := True;
           SubTitleText.Position.X := TImage(FindComponent(SLogoName)).Width;
           SubTitleText.Position.Y := +4;
           SubTitleText.Font.Size := TImage(FindComponent(SLogoName)).Height - 15;
           SubTitleText.WordWrap := False;
           SubTitleText.TextSettings.HorzAlign := TTextAlign.Trailing;
           SubTitleText.AutoSize := False;
           NewSubTitleBackground := TImage(FindComponent(SLogoName));
           //
           MarqueeTimer := TTimer.Create(Nil);
           MarqueeTimer.Interval := 1;
           MarqueeTimer.Enabled := True;
           MarqueeTimer.OnTimer := MarqueeOnHourTimer;
           MarqueeTimer.Enabled := True;
         end;

procedure TMainForm.MarqueeOnHourTimer(Sender: TObject);
begin
 TThread.Synchronize(TThread.CurrentThread,
   procedure()
   begin
     if SubTitleText.Position.X >= 0 then
     begin
       SubTitleText.Position.X := SubTitleText.Position.X - 1.5;
     end;
     if SubTitleText.Position.X <= 0 then
     begin
       SubTitleText.Position.X := 0;
       SubTitleText.Width := SubTitleText.Width - 1.5;
     end;
     if SubTitleText.Width < 1 then
     begin
       MarqueeTimer.Enabled := False;

     end;
   end);
end;
Cevapla
#5
Merhaba,
SubTitleText.AutoSize := True;
dedikten sonra bir değişkende With değerini alın. Yazı uzunluğuna göre örnek With=250 olsun.
SubTitleText.AutoSize := False;
Yaptıktan sonra With değerini Sıfır yapın ve timer başladığında With değeri 250 olana kadar artırın. Tabi burada şuna dikkat etmeniz gerekecek Kayan yazının bulunduğu alanın With değeri 250 den küçük olmasın. o zaman farklı bir çözüm üretmek gerekir.

yapmak istediğiniz çalışmayla ilgili bir görsel paylaşabilirseniz daha farklı fikirler, çözümler bulabilirsiniz diye düşünüyorum.

İyi çalışmalar.
Cevapla
#6
@ozcanm  hocam denedim ama olmadı, resimdeki durum ortaya çıkıyor. yazı resimin yine dışıda görünüyor


rty5df8.PNG

            
   SubTitleText.AutoSize := False;
   genislik := Trunc(NewSubTitleBackground.Width);
   SubTitleText.Width := 0;




procedure TMainForm.MarqueeOnHourTimer(Sender: TObject);
begin
  try
    TThread.Synchronize(TThread.CurrentThread,
      procedure()
      begin
        if (genislik > SubTitleText.Width ) And (SubTitleText.Position.X <>0) then
        begin
          SubTitleText.Width := SubTitleText.Width + 1.5;
        end;
        if SubTitleText.Position.X >= 0 then
        begin
          SubTitleText.Position.X := SubTitleText.Position.X - 1.5;
        end;
        if SubTitleText.Position.X <= 0 then
        begin
          SubTitleText.Position.X := 0;
          SubTitleText.Width := SubTitleText.Width - 1.5;
        end;
        if SubTitleText.Width < 1 then
        begin
          MarqueeTimer.Enabled := False;
        end;
      end);
  except

  end;
end;
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Runtime Create edilen nesnenin Parent erişim sorunu 41linea41 5 774 17-05-2021, Saat: 10:26
Son Yorum: ozcanm
  Bir nesnenin renginin değiştirilmesi ferhatcelik 2 373 08-05-2021, Saat: 15:07
Son Yorum: emozgun



Konuyu Okuyanlar: 1 Ziyaretçi