Canvas a çizdiğim çizgiyi silemiyorum

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mehmetayan
Üye
Mesajlar: 8
Kayıt: 28 Oca 2015 06:49

Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen mehmetayan »

Merhaba Arkadaşlar,
Delphi ye yeni başladım.
Bir tane uygulama yapıyorum canvas üzerine aşağıdaki komutlar ile çizim yapıyorum.
Ama ne yaptıysam çizdiğim çizgiyi silmeyi başaramadım.
dizlerle işi yapmaya çalıştım ama o da olmadı. mesela dedim ki 500*500 resim olsa
yazının yazıldığı pixelin matristeki değeri 1 olsa vs falan düşündüm ama bu defada ram i ve işlemciyi çok yoracak
bu konuda ne yapabiliriz. Tecrübeli arkadaşların yardımlarını bekliyorum.
internette çok araştırma yaptım ama işe yarar bir şey bulamadım.

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with PaintBox1.canvas do
begin
if yazmamodu then begin // kalem e tıkladığımda burası
pen.width:=3;
pen.color:=s;

// Canvas.Pen.Mode := pmXOR;
drawing:=true;
moveto(x,y);
end
else begin // silgiye tıkladığımda burası çalışıyor
drawing:=true;
Canvas.Pen.Mode := pmNotXor;

Canvas.Pen.Width := 2;
Canvas.Brush.style := bsClear;

Canvas.MoveTo(x,y);

end;
end;

asıl çizme işini aşağıdaki kodlar ile yapıyorum.
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
cursor:=crNone;
canvas.lineto(x,y);

cursor:=crdefault;

end;
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen omurolmez »

Mehmet Bey,

Kodunuz derlenmiyor. Bu şekilde zor olur ...
Ömür Ölmez
mehmetayan
Üye
Mesajlar: 8
Kayıt: 28 Oca 2015 06:49

Re: Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen mehmetayan »

Ömür bey bir tane proje buldum aşağıya linki ekliyorum.
Bu proje üzerinden çalışıyorum. Projede çizgi çiziliyor onda sorun yok
color grid koyarak renkte seçtiriyor um onda da sorun yok ama silme işlemini yapamıyorum.
ne yaptıysam çizdiğim çizgiyi resme dokunmadan silemedim.
Beyaza da boyamak istemiyorum çünkü arka planda resim olacak

http://www.delphiforfun.org/programs/de ... rawing.htm
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen omurolmez »

Bir çeşit çizim programı mı yapmaya çalışıyorsunuz ?

Öyle ise, şu mantığı kullanmalısınız :
* Kullanıcının ekrana çizdiği nesnenin (örneğin çizginin) bir kopyasını hafızada saklamalısınız.
* Silme işlemini, hafızadan nesnenin çıkarılması ve diğer nesnelerin boş tuvale çizilmesi olarak ele almalısınız.

Böyle başlarsanız, kaydet ve yükle komutları için, zoom in / out komutları için doğru yönde ilerlemiş olursunuz. Burada asıl zorluk, silinmek istenen nesnenin ekrandan seçilmesi (Ya da bana zor gelmişti). Bu akşam mesaiden sonra bir örnek yapıp göndereceğim, üzerinden konuşuruz ...
Ömür Ölmez
mehmetayan
Üye
Mesajlar: 8
Kayıt: 28 Oca 2015 06:49

Re: Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen mehmetayan »

Ömür bey öncelikle ilginiz için teşekkür ediyorum.
Delphi de yeniyim bu 3. uygulamam
Yapmak istediğim şey ise bir nevi soru çözme uygulaması gibi bir şey
resimleri klasörden çağırıp daha sonra üzerinde karalama yapmak, zoom yapmak yaptığım karalamaları kayıt etmek
dikdörtgen kare gibi şekiller çizdirmek vs gibi özellikler koymak istiyorum.
Bu konuda hangi yolu izleyeceğim ve kodlar noktasında yardıma ihtiyacım var.
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen omurolmez »

Bir adet formu ve form üstünde bir adet TPaintBox ve TRadioGroup nesnesi olan bir programa ait iki dosya paylaşıyorum. RadioGroups.Items sıraları önemli olarak Yok, Çizgi ve Daire olmak üzere toplam üç satıra sahiptir (Bu kod, kaydet, yükle, zoom in, zoom out komutlarının eklenmesine müsaittir).

Paylaştığım örnekte, konuyla ilgili olarak
* Çizim nesnelerinin hafızada sayılar/nesneler olarak tutulması
* Canvas a gerektikçe herşeyin yeniden çizilmesi
* Nesnelerde kalıtsallık
* Birden çok nesneyi ortak kod ile kullanmak ( FNesneler[AIndex].Ciz(); )
* Fare ile basit çizim
bulunabilir.

Konu ile ilgisi olmayan,
* Çalışma anında oluşturulan birden çok çeşit nesnenin tek bir dizi değişkende tutulması
* Sabit (const) kullanımı
* Basit haliyle Delphi değişken isim kuralları
örnekleri bulunabilir.

Örnekle ilgili olarak şu tarz taleplere kapalıyım:
"xxx da ekler misin"

Şu tarz taleplere açığım, vakit ayırabilirim.
"xxx eklemek istedim, şu hatayı veriyor"
"burayı anlamadım"
"buraya ne gerek vardı ?"
"ben böyle yaptım daha kısa yazdım. Sen neden uzun yolu seçtin ?"


///////////////////////////////

grafik.pas

Kod: Tümünü seç

unit grafik;

interface

uses Graphics;

type
 TNesne =class(TObject)
 public
    procedure Ciz(ACanvas :TCanvas); virtual;
 end;
  TCizgi =class(TNesne)
  public
    X1, Y1, X2, Y2 :integer;
    procedure Ciz(ACanvas :TCanvas); override;
  end;
  TDaire =class(TNesne)
  public
    X1, Y1, X2, Y2 :integer;
    procedure Ciz(ACanvas :TCanvas); override;
  end;


implementation

{ TCizgi }

procedure TCizgi.Ciz(ACanvas: TCanvas);
begin
  ACanvas.MoveTo(X1, Y1);
  ACanvas.LineTo(X2, Y2);
end;

{ TDaire }

procedure TDaire.Ciz(ACanvas: TCanvas);
begin
  ACanvas.Ellipse(X1, Y1, X2, Y2);
end;

{ TNesne }

procedure TNesne.Ciz(ACanvas: TCanvas);
begin
  ACanvas.Rectangle(0, 0, 100, 100);
end;

end.
///////////////////////////////

main.pas

Kod: Tümünü seç

unit main;

interface

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

const
  aracYok =0;
  aracCizgi =1;
  aracDaire =2;

type
  TForm1 = class(TForm)
    rgMod: TRadioGroup;
    PaintBox1: TPaintBox;
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure PaintBox1Paint(Sender: TObject);
    procedure rgModClick(Sender: TObject);
  private
    FGeciciCizgi :TCizgi;
    FGeciciDaire :TDaire;
    FCizimAraci :integer;
    FNesnelerHazir :boolean;
    FNesneler :array of TNesne;
    FCiziyor :boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.rgModClick(Sender: TObject);
begin
  case rgMod.ItemIndex of
    0 : FCizimAraci :=aracYok;
    1 : FCizimAraci :=aracCizgi;
    2 : FCizimAraci :=aracDaire;
  end;
end;

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FCizimAraci=aracCizgi then begin
    FGeciciCizgi.X1 :=X;
    FGeciciCizgi.Y1 :=Y;
    FGeciciCizgi.X2 :=X;
    FGeciciCizgi.Y2 :=Y;
  end else if FCizimAraci=aracDaire then begin
    FGeciciDaire.X1 :=X;
    FGeciciDaire.Y1 :=Y;
    FGeciciDaire.X2 :=X;
    FGeciciDaire.Y2 :=Y;
  end;
  FCiziyor :=true;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  AIndex :integer;
begin
  if FCizimAraci=aracCizgi then begin
    AIndex :=Length(FNesneler);
    SetLength(FNesneler, AIndex+1);
    FNesneler[AIndex] :=TCizgi.Create;
    TCizgi(FNesneler[AIndex]).X1 :=FGeciciCizgi.X1;
    TCizgi(FNesneler[AIndex]).Y1 :=FGeciciCizgi.Y1;
    TCizgi(FNesneler[AIndex]).X2 :=X;
    TCizgi(FNesneler[AIndex]).Y2 :=Y;
  end else if FCizimAraci=aracDaire then begin
    AIndex :=Length(FNesneler);
    SetLength(FNesneler, AIndex+1);
    FNesneler[AIndex] :=TDaire.Create;
    TDaire(FNesneler[AIndex]).X1 :=FGeciciDaire.X1;
    TDaire(FNesneler[AIndex]).Y1 :=FGeciciDaire.Y1;
    TDaire(FNesneler[AIndex]).X2 :=X;
    TDaire(FNesneler[AIndex]).Y2 :=Y;
  end;
  FCiziyor :=false;
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FCizimAraci=aracCizgi then begin
    FGeciciCizgi.X2 :=X;
    FGeciciCizgi.Y2 :=Y;
  end else if FCizimAraci=aracDaire then begin
    FGeciciDaire.X2 :=X;
    FGeciciDaire.Y2 :=Y;
  end;
  PaintBox1.Refresh;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FGeciciCizgi :=TCizgi.Create;
  FGeciciDaire :=TDaire.Create;
  FNesnelerHazir :=true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FNesnelerHazir :=false;
  FGeciciDaire.Free;
  FGeciciCizgi.Free;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  i :integer;
begin
  if FNesnelerHazir then begin
    PaintBox1.Canvas.Brush.Color :=clWhite;
    PaintBox1.Canvas.FillRect(PaintBox1.ClientRect);
    PaintBox1.Canvas.Pen.Color :=clBlack;
    for i:=0 to Length(FNesneler)-1 do begin
      FNesneler[i].Ciz(PaintBox1.Canvas);
    end;
    if FCiziyor then begin
      if FCizimAraci=aracCizgi then begin
        PaintBox1.Canvas.Pen.Color :=clBlue;
        FGeciciCizgi.Ciz(PaintBox1.Canvas);
      end else if FCizimAraci=aracDaire then begin
        PaintBox1.Canvas.Pen.Color :=clBlue;
        FGeciciDaire.Ciz(PaintBox1.Canvas);
      end;
    end;
  end;
end;

end.
Ömür Ölmez
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen omurolmez »

Arkadaşlar,
Programın çalışır hali EK 'tedir.
Dosya ekleri
cizgi.zip
Çizim programı örneği.
(216.71 KiB) 138 kere indirildi
Ömür Ölmez
mehmetayan
Üye
Mesajlar: 8
Kayıt: 28 Oca 2015 06:49

Re: Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen mehmetayan »

ömür bey Teşekkür ediyorum.
Farklı bir yöntemle sorunu çözdüm zoom yaparken problem olur mu bilmiyorum ama sime işlemininde başarılı.

Kullandığım yöntem şu
iki tane image view koydum alltaki image view e resmi koydum üstteki image i transparan yaptım. çizgiyi üstteki image view e çizdim.
silerken de mesela üstteki image viewin 30,40 pixelindeki yazıyı silmek istiyorum ya gittim alttaki image viewde yani resimde 30,40 pixelin renk değerini okudum.
ve üstteki image view i onunla boyadım silerken kalınlığı ayarlamak içinde for kullandım misal vermek gerekirse 5*5 bir matris düşünelim siz bir pixeli silmek istiyorsanız
for ile iki üst pixelden başlıyorum 2 alt pixele kadar 5*5 lik bir alanı boyuyorum. Şimdilik iş görüyor ama umarım zoom yaparken problem çıkarmaz.
Bu arada zoom konusunda yardımcı olur musunuz ?

Gesture diye birşey var ama karışık geldi bu işin mantığı nedir. Nasıl yapabilirim.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen freeman35 »

Canvas ı duvara benzetebilirsin, yazdığın çizdiğin her şey o duvar üzerinde kalır. Bu mantıkla basitçe düşünürsen, yapman gereken ilizyon, yani, her çizdiğin boyadığını yeni bir canvas üzerinde yapıp bunu saklıyacaksın, sonra boyamaya sıra geldiğinde ilk canvas ile sırayla yapılmış işlemleri arka arkaya ana canvas üzerine bascaksın. fotoşop taki layer lar gibi düşünün, hepsini üst üste koyunca bir bütün oluşturacaklar, silinecek olan layer silindikten sonra (diğer her işlemden sonra)ilk saklanan canvastan başlıyarak sırayla ana canvas üzerine boyanacak. işte ilizyon :)
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
mehmetayan
Üye
Mesajlar: 8
Kayıt: 28 Oca 2015 06:49

Re: Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen mehmetayan »

aradan bir yıl geçti ama tecrübelerimi aktarmak istiyorum.
silme işlemini kes yapıştır ile yaptım. yani iki tane resim var birinde istediğim gib çizimi yapıyorum. silme işlemine gelince çizim yaptığım resimdeki yere çizim yapılmamış alandaki resmi, silginin kalınlığı kadar kopyalıyorum. yani 10*10 silginiz var resimde bir alana tıkladınız. Ana resimden 10*10 alan kesip üzerine yapıştırıyorum. çok hızlı ve güzel çalışıyor.
Zoom ile ilgili de ne yaparsanız yapın pixel tabanlı çalıştığınız sürece sorun yaşarsınız. görüntü bozulur.
Bunun için vektörel tabanlı çalışşmak gerekiyor. şu anda svg üzerinde çizim yapmayı araştırıyorum.

kes yapıştır kodu bunun gibi birşey
BitBlt(bmp.Canvas.Handle, 0, 0, silgikalinlik, silgikalinlik, img63.Canvas.Handle, BottomRight.X-silgiorta, BottomRight.Y-silgiorta, SRCCOPY);
AhmetNuri
Üye
Mesajlar: 260
Kayıt: 02 Tem 2007 07:55
Konum: ist
İletişim:

Re: Canvas a çizdiğim çizgiyi silemiyorum

Mesaj gönderen AhmetNuri »

Merhaba Çizim için en iyi svg diyebiliriz.
Ana mantık xml dosyası için de hazırlanan bir nokta kümesi gibi çalışıyor.
http://riversoftavg.com/
Gösterimci için bu iyi bir araç.
Öğrenmesi ilk başta zor olabilir falat çok zaman kazandırıyor.
Ahmet DENİZ
Cevapla