Run time de Image eklemek ve çoğaltmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Run time de Image eklemek ve çoğaltmak

Mesaj gönderen haydarxxx »

Slm
arkadaşlar Forumda run time diye aradım ama 28 başlık üzerinde bulamadım run time durumunda bir butona basarak ımage nesnesi nasıl eklenir.Her tıklamada tekrar üretecek şekilde.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

1. kural: Bir bileşen sınıfınının Create metodu ile oluşturulur.
2. kural: Görsel bileşenlerini nerede göstermek gerekiyorsa Parent özelliği ile ayarlamak gerekecektir.

O halde:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender:TObject);
begin
  with TImage.Create(Self) do begin //<-1. madde
    Parent:=Form1;//2. madde, panel groupbox değerleri de alabilir.
  end;
end;
Her şey bu kadar. Bileşenler form yok olduğunda kendiliğinden yok olacaktır. Kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Her tıklamada birbirinden bağımsız TImage'ler üretmek istersen şöyle bir örnek de ben hazırladım.

Kod: Tümünü seç

Var
  xResimGrubu : Array of TImage; // Uses ExtCtrls
  xResimIdx   : Integer = -1;
  xSoldan     : Integer = 0;
  xTepeden    : Integer = 0;
  xImgSat     : Integer = 5; // satırda kaç resim olacak

procedure TForm1.Button1Click(Sender: TObject);
begin
  Inc(xResimIdx); // Resim Indexi 1 arttırdık. 0'dan başlıyoruz.
  SetLength( xResimGrubu, xResimIdx+1); // dinamik uzunluk 0 olamaz

  xResimGrubu[xResimIdx] := TImage.Create(Self); // Create işlemi
  With TImage(xResimGrubu[xResimIdx]) do begin
    Parent := Self;
    Width  := 10;
    Height := 10;

    If (xResimIdx) MOD xImgSat = 0 then begin
      xSoldan := 0;
      Inc(xTepeden, Height);
    end;
    Inc(xSoldan, Width);
    Left   := xSoldan;
    Top    := xTepeden;
    //Varsayılan Resmi Yükleyebilirsin.
    Picture.LoadFromFile('C:\adsız.bmp');
  end;
  // Artık herhangi bir yerden xResimGrubu[0] dediğinde 1 nolu image elinde demektir.
  //                           xResimGrubu[3] dediğinde 4 nolu image elinde demektir.
end;
Resim
Resim ....Resim
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

ilgilerinize teşekkür ediyorum

hocam her iki kodu da ayrı ayrı denedim fakat forma Tımage nesnesi eklemiyor atladığım bir yer mi var :?: bilmiyorum :cry:

Birde oluşturduğum nesneleri form üzerinde ileri geri taşımak istiyorum şöyle bir kod var butonları taşımak için ama Tımageye uyarlamama rağmen çaıştıramadım butonda gayat güzel çalışıyor.

Kod: Tümünü seç

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
TButton(Sender).perform(WM_SYSCOMMAND, $F012, 0);
end;
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Mesaj gönderen Battosai »

Taşıma kodu image nesnesinde çalışması için image i panel içine al sonra kodu image'in mousedown olayına panel için yaz....
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Taşıma kodu image nesnesinde çalışması için image i panel içine al sonra kodu image'in mousedown olayına panel için yaz....
Battosai cevap için teşekkürler.

Ama diğer soru ve sorunum hala devam ediyor :cry:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

diğer soru ??? "TImage nesnesi neden oluşmuyor ?" olamaz değil mi !?

TImage nesnesi öyle rengi ve kokusu olan bir nesne değildir. İçine bir resim koymazsan göremezsin, bunu hatırlatmak isterim.

Kendi örneğimde bir resmi otomatik olarak yüklyen bir satır koymuştum onu kaldırmadıysan sonucu görmen lazımdı. Aksi halde olmuyor sözünü destekleyen bir hata mesajı beklerdim.
Resim
Resim ....Resim
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

mrmarman hocam özür dilerim
Width := 10;
Height := 10;
özelliğinden dolayı ToolButton nu altında kalıyormuş oluşan ımageler ToolButton ı kadırınca gördüm.Çok özür

mrmarman hocam bu oluşturduğumuz Tımage yi paneller içinde nasıl gösterebiliriz yani panel yaratılıp içine

Picture.LoadFromFile('C:\adsız.bmp');

Battosai önerisi üzerinden oluşan ımageleri taşımak istiyorum form içinde.Tabi burada her yaratılan Tımagelerde bu kodun

Kod: Tümünü seç

ReleaseCapture;
TPanel(Sender).perform(WM_SYSCOMMAND, $F012, 0);
çalışmasını istiyorum yardımcı olabilirmisiniz çok şey istediğiminde farkınadayım :oops:
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

haydarxxx yazdı:

Kod: Tümünü seç

ReleaseCapture;
TPanel(Sender).perform(WM_SYSCOMMAND, $F012, 0);
Eğer kodu TImage'ın olayına yazıyorsan kodu

Kod: Tümünü seç

ReleaseCapture;
TImage(Sender).Parent.perform(WM_SYSCOMMAND, $F012, 0);
şeklinde değiştirmen gerekiyor.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

ReleaseCapture;
TImage(Sender).Parent.perform(WM_SYSCOMMAND, $F012, 0);
hocam böyle denedim ama bu kod TImagede çalışmıyor.Panel içinde halaldebiliyorum.+ run time de eklenen her bir imagede bu kodun çalışması gerekir şekilde olmalı
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

ilk aşama olarak onMouseDown olayı ile aynı parametrik yapıya sahip bir prosedür yaz.

Kod: Tümünü seç

  private
    { Private declarations }
    procedure Img_MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
.
.
.
.
.
procedure TForm1.Img_MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Sender is TControl then begin
    ReleaseCapture;
    TControl(Sender).Parent.perform(WM_SYSCOMMAND, $F012, 0);
  end;
end;
Oluşturduğun bu image bileşenlerine bu olayı ata.

Kod: Tümünü seç

with TImage.Create(Self) do begin
  Parent:=Panelx;
  OnMouseDown:=Img_MouseDown;
  Left:=x;
  Top:=y;
.
.
.
end;
gibi. Burada kilit nokta olay atamayı gerçekleştirmek.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Sıfır bir proje aç ve forma bir adet buton yerleştir. O butonun OnClick olayına da şekildeki gibi kodu yaz. Kodlar arasındaki farkı gözeterek hatayı nerede yaptığını bul.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Jpeg;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure KendiminMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.KendiminMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer); 
{bunu formda private bloğunda sen tanımla (Ctrl+Shift+C tuşları otomatik tanımlar)} 
begin 
  ReleaseCapture;
  TImage(Sender).Parent.Perform(WM_SYSCOMMAND, $F012, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var Panel:TPanel;
begin
  Randomize;
  Panel:=TPanel.Create(Self);
  with Panel do begin
    Parent:=Self;
    Left:=Random(Self.Width div 2);//100
    Top:=Random(Self.Height div 2);//100
  end;
  with TImage.Create(Self) do begin
    Parent:=Panel;
    Align:=alClient;
    OnMouseDown:=KendiminMouseDown;
    Picture.LoadFromFile('c:\a.jpg');
  end;
end;

end.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Bu oluşturduğumuz panel leri del duşuna basarak yada popup gibi bir menü ile nasıl free (silme) yapabiliriz.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Formun KeyPreview özelliğine True verilmeli ve SeciliPanel:TPanel; diye bir değişken tanımlanmalı.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Jpeg;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    SeciliPanel:TPanel;
    procedure KendiminMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.KendiminMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
{bunu formda private bloğunda sen tanımla (Ctrl+Shift+C tuşları otomatik tanımlar)}
begin
  if Assigned(SeciliPanel) then SeciliPanel.Color:=clBtnFace;//eski panel normale döner
  ReleaseCapture;
  SeciliPanel:=TPanel(TImage(Sender).Parent);
  SeciliPanel.Color:=clBlue;//seçilen panel mavi olur
  SeciliPanel.Perform(WM_SYSCOMMAND, $F012, 0);
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var Panel:TPanel; 
begin 
  Randomize; 
  Panel:=TPanel.Create(Self); 
  with Panel do begin 
    Parent:=Self; 
    Left:=Random(Self.Width div 2);//100 
    Top:=Random(Self.Height div 2);//100 
  end; 
  with TImage.Create(Self) do begin 
    Parent:=Panel; 
    Align:=alClient; 
    OnMouseDown:=KendiminMouseDown; 
    Picture.LoadFromFile('c:\a.jpg'); 
  end; 
end; 

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_DELETE:if Assigned(SeciliPanel) then begin
      FreeAndNil(SeciliPanel.Controls[0]); //TImage silinir
      FreeAndNil(SeciliPanel);//TPanel silinir
    end;
  end;
end;

end.
KendiminMouseDown olayında seçilen paneli bir değişkene atayıp daha sonra formun onKeyDown olayında da silme işlemi bu değişken üzerinden yapılmaktadır. Kolay gele.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Hocam cevap için teşekkür ediyorum

Kod: Tümünü seç

FreeAndNil(SeciliPanel.Controls[0]); //TImage silinir
satırında bu ahatayı alıyorum

Kod: Tümünü seç

Build
  [Error] Unit1.pas(92): Constant object cannot be passed as var parameter
  [Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Cevapla