Scrollbox ta resim sürükleme

FireMonkey ve Mobil uygulama (iOS, Android, Windows Phone) ile ilgili sorularınızı bu foruma sorabilirsiniz.
Cevapla
Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Scrollbox ta resim sürükleme

Mesaj gönderen Hashirama »

Merhaba Arkadaşlar
Scrollbox ın içinde alclient şeklinde resmim var ve bu resmi scrollbar

Kod: Tümünü seç

image1.Scale.X:=ScrollBar1.Value;
image1.Scale.y:=ScrollBar1.Value;
ile büyütüp küçültüyorum. Tabi resim büyüdüğünde ekrana sığmıyor, bende sağa sola ve yukarı aşağı hareket ettirmek için (aynı windows resim görüntüleyici de olduğu gibi) şöyle uzun bir yöntem denedim.
Program çalışıyor ve istenileni yapıyor ama akıcı şekilde olmuyor, Windows un resim görüntüleyicisi gibi daha akıcı yapmak için bir yöntem var mıdır? yada yazdığım koda nasıl bir düzenleme yaparsam bu akıcılığı sağlayabilirim ?

Teşekkürler.

Not: Yüksek çözünürlüklü fotoğraf kullandığım için boyut biraz büyüdü, bu linkten projeye bakabilirsiniz.
https://mega.co.nz/#!1UQwyLCb!mY0MTRcho ... cy6Qv8v8gw

Kod: Tümünü seç

unit Unit1;

interface

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

type
TScrollBox = class (FMX.Layouts.TScrollBox)

end;
  TForm1 = class(TForm)
    FramedScrollBox1: TFramedScrollBox;
    ScrollBar1: TScrollBar;
    Image1: TImage;
    Rectangle1: TRectangle;
    ScrollBox1: TScrollBox;
    CheckBox1: TCheckBox;
    ListBox1: TListBox;
    ListBox2: TListBox;
    procedure ScrollBar1Change(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Single);
    procedure Image1DragOver(Sender: TObject; const Data: TDragObject;
      const Point: TPointF; var Operation: TDragOperation);
    procedure Image1DragEnd(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  koordinat: TPointF;
  deger_AL:Boolean;


implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
begin
image1.DragMode:=TDragMode(1);
end;

procedure TForm1.Image1DragEnd(Sender: TObject);
begin

listbox1.Items.Add(floattostr( koordinat.X));
listbox2.Items.Add(floattostr( koordinat.y));
deger_AL:=true;

end;

procedure TForm1.Image1DragOver(Sender: TObject; const Data: TDragObject;
  const Point: TPointF; var Operation: TDragOperation);
begin

 Cursor:=crHandPoint;
 listbox1.Items.Add(floattostr( koordinat.X));
 listbox2.Items.Add(floattostr( koordinat.y));

end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
var
  fark1,fark2:double;
  sonsatir1,sonsatir2:integer;
begin

koordinat.X := X;
koordinat.Y := Y;

if deger_AL=true then
begin
    listbox1.Items.Add(floattostr( koordinat.X));
    listbox2.Items.Add(floattostr( koordinat.y));
    deger_AL:=false;
    sonsatir1:=listbox1.Count;
    sonsatir2:=listbox1.Count;
    fark1:= strtofloat(listbox1.Items[0])- strtofloat(listbox1.Items[sonsatir1-1]);
    fark2:= strtofloat(listbox2.Items[0])- strtofloat(listbox2.Items[sonsatir2-1]);

      //X yönünde
      if abs(fark1) > abs(fark2) then
      begin
           if fark1>0 then  FramedScrollBox1.ScrollTo(-500,0);
           if fark1<0 then  FramedScrollBox1.ScrollTo(500,0);

      end  else
            //y yönünde
      begin
            if fark2>0 then  FramedScrollBox1.ScrollTo(0,-500);
           if fark2<0 then  FramedScrollBox1.ScrollTo(0,500);

      end;


listbox1.Items.Clear;
listbox2.Items.Clear;
end;

end;


procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
image1.Scale.X:=ScrollBar1.Value;
image1.Scale.y:=ScrollBar1.Value;
end;

end.
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: Scrollbox ta resim sürükleme

Mesaj gönderen warder »

TImage bileşenini neden kullanmadığınızı merak ettim.
Çok eski bir programımda aynı veya benzer bir sorunu TImage ile çözmüştüm.
C++Builder kod, TImage ve basit Thread ilginizi çekerse paylaşırım.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: Scrollbox ta resim sürükleme

Mesaj gönderen Hashirama »

warder yazdı:TImage bileşenini neden kullanmadığınızı merak ettim.
Çok eski bir programımda aynı veya benzer bir sorunu TImage ile çözmüştüm.
C++Builder kod, TImage ve basit Thread ilginizi çekerse paylaşırım.
Timage nesnesini kullanmadınız derken ? tam anlayamadım.Fikir vermesi bakımından kendi çözümünüzü gönderirseniz sevinirim.
Teşekkürler.
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: Scrollbox ta resim sürükleme

Mesaj gönderen warder »

Hashirama yazdı: Timage nesnesini kullanmadınız derken ? tam anlayamadım.Fikir vermesi bakımından kendi çözümünüzü gönderirseniz sevinirim.
Teşekkürler.
ScrollBox ile neden uğraştığınızı, neden gerek duyduğunuzu sordum aslında..

Bahsettiğim eski programda ilgili kısım şu şekilde...

Kod: Tümünü seç

    if(List->Items->Count && List->Selected) {
        AnsiString asExt = ExtractFileExt(AdresYaz().LowerCase());
        if((asExt == ".bmp") ||
           (asExt == ".jpg") ||
           (asExt == ".jpeg")||
           (asExt == ".ico") ||
           (asExt == ".emf") ||
           (asExt == ".wmf")) {
            Image->Picture->LoadFromFile(AdresYaz().Trim());
            Image->Width  = 208;
            Image->Height = 96;
            if((Image->Picture->Width > 208) || (Image->Picture->Height > 96)) {
                Image->AutoSize = false;
                Image->Stretch  = false;
                ThOranla(false);
            }
            else {
                Image->AutoSize = true;
                Image->Stretch  = false;
            }
            Image->Left    = (209 - Image->Width) / 2;
            Image->Top     = (97 - Image->Height) / 2;
            Image->Stretch = true;
        }
    }
    else Image->Picture = NULL;
AnsiString devrinden kalma.. Onları UnicodeString düşünebilirsiniz.
List -> ListView bileşeni
AdresYaz -> ListView alanlarında bilgileri toparlayıp adrese çaviriyor..

208x96 ölçülerinde bir TImage bileşeni kullanmışım...
içteki else kısmında görebileceğiniz gibi bu ölçülerin altında resim geldiğinde, image bileşeni resim boyutuna indirgeniyor (AutoSize)
Her durumda bulunduğu zemin içine ortalıyor..
Büyük resimler ThOranla ile ayrı bir kanalda işleniyor. exe yi rahatlatmak için olabilir.
Siz fonksiyon çağrısı gibi düşünebilirsiniz..

Kod: Tümünü seç

void __fastcall ThOranla::Duzenle()
{    /*(208 / 96) = 2.16 .. oran*/
    if(2.16 < (static_cast <float>(FrmDuvar->Image->Picture->Width) / static_cast <float>(FrmDuvar->Image->Picture->Height))) 
        FrmDuvar->Image->Height = ceil((FrmDuvar->Image->Picture->Height * 208) / FrmDuvar->Image->Picture->Width);
    else FrmDuvar->Image->Width = ceil((FrmDuvar->Image->Picture->Width * 96) / FrmDuvar->Image->Picture->Height);
    FrmDuvar->Image->Left = (209 - FrmDuvar->Image->Width) / 2;
    FrmDuvar->Image->Top  = (97 - FrmDuvar->Image->Height) / 2;
}
Önce formülü bulup deneyip sonra uyarlamıştım.
Matematikçi olmadığım için formül yormuştu.. o yüzden hatırlıyorum.
Umarım işinize yarar .. kolay gelsin..
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: Scrollbox ta resim sürükleme

Mesaj gönderen Hashirama »

Cevabınız için teşekkürler. Ancak amacım resmi herhangi bir yere sığdırmak değil aksine büyütüp daha fazla ayrıntıya sahip olmak. Büyütürken de ister istemez ekrana sığmıyor ondan dolayı scrollbox kulanıyorum. scrollbox ın yatay dikey çubuklarını kullanarak sağa-sola, yukarı-aşağı çekip büyüttüğüm kısmı daha net görüntüleyebiliyorum. Sağa-sola yada yukarı-aşağı çekmeyi scrollbox yatay ve dikey çubukları ile değilde resmi tutup çekmeyle yapmak istiyorum. Yazdığım kod ile zaten bunu da yapabildim ama üstte de belirttiğim gibi maalesef çok akıcı şekilde hareket etmiyor. Bunun daha pratik bir yolunu arıyorum.
Cevapla