Component Arıyorum

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
heavy
Üye
Mesajlar: 67
Kayıt: 07 May 2005 03:31

Component Arıyorum

Mesaj gönderen heavy »

Resim

şekildeki salon düzenini yapabileceğim bi komponent biliyor musunuz? kısaca istediğim satıra istediğim kadar belirlediğim boyutta belirlediğim iconu koyabileceğim bi komponent arıyorum. (bunları multiselect ile seçtirebilmekde istiyorum mümkünse)

yardımcı olursanız çok sevinirim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam.

- Anet News'dan görüşüyoruz... Cevap olarak aşağıdaki kodu buradan da yayınlıyorum ki başkaları da faydalansın...

Kod: Tümünü seç

Procedure KoltukDuzeni( Tuval:TCanvas; KoltukResmi:TBitmap );
Const
  SiraSayisi      = 13; // 13 sıra A .. M için
  TekSiraKoltuk   = 21; // Tek  numaralı sıralar 21 koltuk ayarlayalım...
  CiftSiraKoltuk  = 21; // Çift numaralı sıralar 22 koltuk ayarlayalım...
  KoltukGenislik  = 30;
  KoltukYukseklik = 30;
  KoltukAralik    = 02;
  SolBas          = 20; // 20,20 ilk koltuk adresi
  UstBas          = 10;
Var
  Koltuklar : Array[1..SiraSayisi] of Integer; // her sırada kaç koltuk var için...
  Sayac, i  : Integer;
  xBas, yBas: Integer;
  Rect      : TRect;
  xIsim,
  yIsim     : Integer;
  KoltukAdi : String;
begin
  Tuval.Brush.Color := clBtnFace;
  Tuval.FillRect( Tuval.ClipRect );

  Sayac := 1;
  While Sayac <= SiraSayisi do begin
    Koltuklar[Sayac]   := TekSiraKoltuk;
    // Yanlışlıkla bir fazla sıra olmasın diye..
    If Sayac < SiraSayisi-1 then Koltuklar[Sayac+1] := CiftSiraKoltuk;
    Inc(Sayac, 2);
  end;

  // Koltukları çiziyoruz...
  For Sayac := 1 to SiraSayisi do begin
    xBas := SolBas;
    yBas := UstBas;
    // Tekler biraz soldan, Çiftler biraz sağdan başlasın diye case içine aldık...
    Case Sayac mod 2 of
    1: xBas := xBas - ( (KoltukYukseklik + KoltukAralik)div 2 ); // Tekler...
    0: xBas := xBas;      // Çiftler...
    end; // Case

    yBas        := yBas + ((KoltukYukseklik + KoltukAralik)*(Sayac-1));
    Rect.Top    := yBas;
    Rect.Bottom := yBas + KoltukYukseklik;
    For i := 1 to Koltuklar[Sayac] do begin
      Rect.Left   := xBas + ((KoltukGenislik+KoltukAralik)*i);
      Rect.Right  := Rect.Left + KoltukGenislik;
      Tuval.Brush.Color := clMaroon;
      Tuval.FillRect(Rect);

      Tuval.Pen.Color := clBlack;
      Tuval.Pen.Width := 2;
      Tuval.Rectangle(Rect);
      KoltukResmi.Transparent := True;
      Tuval.Draw(Rect.Left+( (KoltukGenislik  - KoltukResmi.Width) div 2 ), Rect.Top+1, KoltukResmi);

      KoltukAdi   := Format('%s%d', [Chr( (SiraSayisi + 65) - Sayac), i]);
      xIsim       := Rect.Left+((KoltukGenislik  - Tuval.TextWidth( KoltukAdi )) div 2);
      yIsim       := 7+Rect.Top +((KoltukYukseklik - Tuval.TextHeight('H')) div 2);
      Tuval.Brush.Style := bsClear;
      Tuval.Font.Style  := [fsBold];
      Tuval.Font.Color  := clNavy;
      Tuval.TextOut( xIsim-1, yIsim-1, KoltukAdi);
      Tuval.Font.Color  := clYellow;
      Tuval.TextOut( xIsim, yIsim, KoltukAdi);
    end;
  end;
end;

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
Var
  Resim : TBitmap;
begin
  Resim := TBitmap.Create;
  Resim.LoadFromFile(ExtractFilePath(Application.Exename)+ 'Koltuk_13x25.BMP');
  KoltukDuzeni( Form1.Canvas, Resim );
  Resim.Free;
end;
- Çalışmalarında başarılar...
Resim
Resim ....Resim
heavy
Üye
Mesajlar: 67
Kayıt: 07 May 2005 03:31

Mesaj gönderen heavy »

çok teşekkür ederim.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

mrmarman yazdı:Selam.

- Anet News'dan görüşüyoruz... Cevap olarak aşağıdaki kodu buradan da yayınlıyorum ki başkaları da faydalansın...

Kod: Tümünü seç

Procedure KoltukDuzeni( Tuval:TCanvas; KoltukResmi:TBitmap );
Const
  SiraSayisi      = 13; // 13 sıra A .. M için
  TekSiraKoltuk   = 21; // Tek  numaralı sıralar 21 koltuk ayarlayalım...
  CiftSiraKoltuk  = 21; // Çift numaralı sıralar 22 koltuk ayarlayalım...
  KoltukGenislik  = 30;
  KoltukYukseklik = 30;
  KoltukAralik    = 02;
  SolBas          = 20; // 20,20 ilk koltuk adresi
  UstBas          = 10;
Var
  Koltuklar : Array[1..SiraSayisi] of Integer; // her sırada kaç koltuk var için...
  Sayac, i  : Integer;
  xBas, yBas: Integer;
  Rect      : TRect;
  xIsim,
  yIsim     : Integer;
  KoltukAdi : String;
begin
  Tuval.Brush.Color := clBtnFace;
  Tuval.FillRect( Tuval.ClipRect );

  Sayac := 1;
  While Sayac <= SiraSayisi do begin
    Koltuklar[Sayac]   := TekSiraKoltuk;
    // Yanlışlıkla bir fazla sıra olmasın diye..
    If Sayac < SiraSayisi-1 then Koltuklar[Sayac+1] := CiftSiraKoltuk;
    Inc(Sayac, 2);
  end;

  // Koltukları çiziyoruz...
  For Sayac := 1 to SiraSayisi do begin
    xBas := SolBas;
    yBas := UstBas;
    // Tekler biraz soldan, Çiftler biraz sağdan başlasın diye case içine aldık...
    Case Sayac mod 2 of
    1: xBas := xBas - ( (KoltukYukseklik + KoltukAralik)div 2 ); // Tekler...
    0: xBas := xBas;      // Çiftler...
    end; // Case

    yBas        := yBas + ((KoltukYukseklik + KoltukAralik)*(Sayac-1));
    Rect.Top    := yBas;
    Rect.Bottom := yBas + KoltukYukseklik;
    For i := 1 to Koltuklar[Sayac] do begin
      Rect.Left   := xBas + ((KoltukGenislik+KoltukAralik)*i);
      Rect.Right  := Rect.Left + KoltukGenislik;
      Tuval.Brush.Color := clMaroon;
      Tuval.FillRect(Rect);

      Tuval.Pen.Color := clBlack;
      Tuval.Pen.Width := 2;
      Tuval.Rectangle(Rect);
      KoltukResmi.Transparent := True;
      Tuval.Draw(Rect.Left+( (KoltukGenislik  - KoltukResmi.Width) div 2 ), Rect.Top+1, KoltukResmi);

      KoltukAdi   := Format('%s%d', [Chr( (SiraSayisi + 65) - Sayac), i]);
      xIsim       := Rect.Left+((KoltukGenislik  - Tuval.TextWidth( KoltukAdi )) div 2);
      yIsim       := 7+Rect.Top +((KoltukYukseklik - Tuval.TextHeight('H')) div 2);
      Tuval.Brush.Style := bsClear;
      Tuval.Font.Style  := [fsBold];
      Tuval.Font.Color  := clNavy;
      Tuval.TextOut( xIsim-1, yIsim-1, KoltukAdi);
      Tuval.Font.Color  := clYellow;
      Tuval.TextOut( xIsim, yIsim, KoltukAdi);
    end;
  end;
end;

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
Var
  Resim : TBitmap;
begin
  Resim := TBitmap.Create;
  Resim.LoadFromFile(ExtractFilePath(Application.Exename)+ 'Koltuk_13x25.BMP');
  KoltukDuzeni( Form1.Canvas, Resim );
  Resim.Free;
end;
- Çalışmalarında başarılar...
S.a.

Peki muharrem hocam bunun hangi koltuğa tıklandığını nasıl bulabiliriz?

Teşekkür ederim örnek için

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

nesnenin focused özelliğini kontrol ederek bulabilirsiniz.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

bence bunu bir grid le bile yapabilirisin...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam..

- İstanbul'dan biraz önce döndüm sorunuzu yani gördüm...

- Burada @heavy'nin verdiği örnek çerçevesinde bir çözüm sunumu yapılmıştır. Alternatif çözümler her zaman sonsuzdur.. :lol: Ben olsam basit bir TPanel array ile hallederdim ve her tıklanan panelin kendisinin ben tıklandım diye bağırmasını kullanırdım... :lol:

- Bir koltuğa / hangi koltuğa ve / veya koltuk dizisine tıklandı veya tıklanmadıyı Sihirle (beynimizle) çözücez, ilüzyonla (göz yanıltmaca ile) koltuk seçimini yaptırıcaz...

- Şöyle ki, yine mouse ile selection yaptığımızda iki tane noktaya ihtiyacımız olacak. X_Bas, Y_Bas, X_Son, Y_Son şeklinde... Bu bize koltuk bloğunu bulmamız için başlangıç noktası olacaktır. Bunları önce iki tane TPoint içinde, sonra da kolayca bir tane TRect içinde topluycaz..

- Koltuk bloğunu hesaplayarak bulmayı avantaja dönüştürüp kullanıcaz. Sihir bu...

- Peki seçimi nasıl kullanıcıya göstericez ? Bu da ilüzyon. Canvas büyüklüğü kadar bir TPaintbox koyucaz ve seçimi bunun üzerinde yaptırıp koltuklarımız üzerinde herhangi bir boyama yapılmasının önüne geçicez.. Sonucu yine arkadaki asıl Canvas'a seçenekler sonucu olarak aktarıcaz...

- Biliyorsunuz veya bilmeyenler için TPaintBox, TCanvas içeren bir bileşendir. Canvas özelliği olmayan nesnelere bu özelliği kazandırmakta sıkça kullanılır (TPanel gibi). Ayrıca saydam bir yapı teşkil eder, Layer stili projeler geliştirmeye olanak sağlar.. Bu kadar TPaintBox girizgahı yeter.

- Şimdi uygulayalım.. İlk olarak bileşen paletindeki System sayfasındaki TPaintBox nesnesini formumuza koyalım. Align özelliği alClient yapalım ki boyutlandırma ile uğraşmayalım. ( hani boya fırçası iconu olan :) )

- Koordinatlarımızı saklayacağımız global değişkenlerimiz ve bir de geçici olarak arka fonu saklayacağımız bir TBitmap tanımı yapıyoruz. Bu da global.

- :idea: OffTopic : Benim özel tercihim belki diğer mesajlarımdan görenler olmuştur; Global değişkenlerin başına küçük x harfi koyuyorum ki bu değişkeni nerede tanımladığımı bileyim. Küçük bir örnekte yersiz gelebilir ama elimizi tembel alıştırmamak lazım. Tüm arkadaşlara şahsım tarafından bu tip bir uygulama şiddetle önerilir.

Kod: Tümünü seç

var
  Form1: TForm1;
  xBaslaNokta : TPoint;
  xBitisNokta : TPoint;
  xBaslaBool  : Boolean;
  xBitmap     : TBitmap;
- Önce OnFormCreate olayında ne yapıyoruz, xBitmap'imizi tanımlayıp boyutlandırıyoruz. :idea: Bu boyutlandırmayı dinamik hale getirmek için Canvas'ın büyüklüğünün değiştiği yerde yapmanın faydası var onu da ekleyelim...

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
begin
  xBitmap        := TBitmap.Create;
  xBitmap.Width  := Form1.ClientWidth;
  xBitmap.Height := Form1.ClientHeight;
end;

- Tabii OnCLose olayında da bunu free edicez... Örneğimizde xBitmap ana formda olduğundan bu işlem program kapanırken kendiliğinden yapılır ama bunun bir alt formda olacağını da varsayarak tedbiri elden bırakmıyoruz...

Kod: Tümünü seç

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  xBitmap.Free;
  xBitmap := Nil;
end;
- Şimdi de mousedown, mousemove ve mouseup eventlerimiz.. Unutmayınız Mouse işlemleri görünmeyen saydam tabaka olan TPaint üzerinde yapıldığından Mouse işlemleri için tetiklenecek Layer yine bu TPaint olacağından bunun OnMousexxxxx olaylarına yazıyoruz.

- Dilerseniz tüm bu işlemleri TPaintbox kullanmaksızın asıl Canvas'da da yapabilirdiniz ama ben bu şekilde olmasını uygun görüyorum. Gelecekte başka işlemler için de lazım olabilir. :idea:

Kod: Tümünü seç

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  xBaslaNokta := Point(X, Y);
  // ilk tıklamada xBitmap'a sceenshot alıyoruz.
  If NOT xBaslaBool then begin
    xBitmap.Canvas.CopyRect (Form1.Canvas.ClipRect, Form1.Canvas, Form1.Canvas.ClipRect  );
  end;
  xBaslaBool  := True;
end;

Kod: Tümünü seç

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  //Sol butoon basılı iken neler olacak...
  if ssLeft in Shift then
  begin
    PaintBox1.Canvas.Draw( 0, 0, xBitmap );
    PaintBox1.Canvas.DrawFocusRect( Rect(xBaslaNokta.X, xBaslaNokta.Y, X, Y) );
    xBitisNokta := Point(X, Y);
    xBaslaBool  := False;
  end;
end;

Kod: Tümünü seç

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  If NOT xBaslaBool then begin
    ShowMessageFmt('%d,%d /%d,%d', [xBaslaNokta.X, xBaslaNokta.Y, xBitisNokta.X, xBitisNokta.Y]);
    PaintBox1.Canvas.Draw( 0, 0, xBitmap );
  end;
end;
- Gerisi bu koordinatlar arasının hangi koltuklara tekamül ettiğini bulmaya kalıyor. Basit bir fonksiyon kurup bunu yapmak mümkün.

- Metodoloji basit. İlk verdiğim fonksiyonda tüm veriler değişken olarak sakladım ki dinamizm oluşsun. Bu dinamizm içindeki değişken ölçüleri size refarns olacak. Şöyle ki...

Kod: Tümünü seç

Const 
  SiraSayisi      = 13; // 13 sıra A .. M için 
  TekSiraKoltuk   = 21; // Tek  numaralı sıralar 21 koltuk ayarlayalım... 
  CiftSiraKoltuk  = 21; // Çift numaralı sıralar 21 koltuk ayarlayalım... 
  KoltukGenislik  = 30; 
  KoltukYukseklik = 30; 
  KoltukAralik    = 02; 
  SolBas          = 20; // 20,10 ilk koltuk adresi 
  UstBas          = 10; 
... demişiz. :idea:

- Mesela blok aralığı, 195,124 - 329,125 olsun... Bu bize yukardan aşağı (124 - UstBas) div (KoltukYukseklik + KoltukAralik) kadar tepe değeri, (125 - UstBas) div (KoltukYukseklik + KoltukAralik) kadar alt değeri demektir. Sol sağ aralığı da aynı şekilde. Bu seçilenler başka bir fonksiyonda dögü ile renklendirilip yazılır hale getirilir.

- Bu formül sizin tarafınızdan biraz elden geçirilecektir tabi. Ben sadece yol gösteriyorum. Geri kalanını da size bırakayım yoruldum.. 8)
Resim
Resim ....Resim
heavy
Üye
Mesajlar: 67
Kayıt: 07 May 2005 03:31

Mesaj gönderen heavy »

çok teşekkür ederim..

emeğine sağlık.
heavy
Üye
Mesajlar: 67
Kayıt: 07 May 2005 03:31

Mesaj gönderen heavy »

ListView'de itemlerin konumlarını değiştirebiliyormuşuz..
Item'leri döngü ile yerleştirip üzerinde seçim işlemleri yaptırmak sanırım
kolaylaşacak.

ListView1.Items.Item[0].Top:=10;
ListView1.Items.Item[0].Left:=20;

yardımlarınız için çok teşekkür ederim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Evet yaa ListView'i neden daha önce düşünmedim. :idea: Bravo. Vallahi güzel çözüm. MultiSelect'i de True yaptığında istediğin oluyor. Uzun zamandır vsReport olarak kullanıyoruz ya ondan olmalı.

- Koltuk sayısı kadar item oluşturup bunları tek boyutlu dizi olarak değerlendirmek kalıyor. Hesap olarak işin bir nebze daha zor ama operasyon kolaylığı bu zorluğu ihmal edilebilir kılıyor.

Kod: Tümünü seç

Var
  Sayac : Integer;
begin
  ListView1.MultiSelect := True;
  For Sayac := 0 to 10 do With ListView1.Items.Add do begin
    Caption := IntToStr(Sayac);
    Top  := 50;
    Left := 32*Sayac;
  end;
end;
- Başarılarının devamını dilerim.
Resim
Resim ....Resim
heavy
Üye
Mesajlar: 67
Kayıt: 07 May 2005 03:31

Mesaj gönderen heavy »

ben aslında en başından beri ListView ile yapmak istiyordum fakat Item'lerin konumlarının manuel değiştirilebileceğini bilmiyordum.

bunu da öğrenmiş oldum.

saygılar.
Cevapla