Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Değer döndüren panel
#1
Merhaba,  şekildeki gibi hepsi panallerden oluşan bir formum var.  Hepsini bir arada tutan ANAPANEL ve içlerinde PANEL1 , PANEL2 adında iki panelim var.
Panel1 içerisinede kutular oluşturmak için yine ufak panellerim mevcut ve her birinin captionlarında bir sayı tutuluyor. Bu sayılar sabit. Fakat aynı sayıdan başka bir panlede de olabilir. (Aynı isme sahip iki panel oluşturmayacağım için captionları kullandım)
XEvXXO.png
Global değişkenlerim
 CIKANSAYI := integer;
 KARTADI    := stringlist;

Amacım;
İçlerinde hangisinde bu sayı varsa o panelin rengi değişsin ve panel adını KARTADI adlı değişkenime eklesin.

Ana panelin içinde panel1, panel2 gibi toplamda 135 adet panelim olacak. Bunun için bana yol gösterirmisiniz, nasıl bir mantıkta ilerlemeliyim.
Değer döndüren bir panel nasıl yapabilirim?

Fikir ve yardımlarınız için şimdiden teşekkürler
Cevapla
#2
panel adı derken ilgili panelin captionu mu KARTADI değişkenine atanacak?
Cevapla
#3
Delphi'nin hangi sürümünü kullanıyorsunuz?
Cevapla
#4
Merhaba,

Sabit değerleri caption özelliğine yazılmış panellerin hepsini tek 1 event'a bağlayın.
Örn: Panel1OnClick.

Sonra bu metodun içerisine girerek Sender parametresini göndereceğiniz Panel'in tipine göre cast edin.
TPanel(Sender).Caption ile statik değerleri elinize alarak istediğiniz fonksiyona parametre geçerek bu metodu kullanabilirsiniz.

procedure TForm1.Panel1OnClick(Sender: TObject);
begin
IslemYap(TPanel(Sender).Caption));
end;
{ talk is cheap show me the code. }
Cevapla
#5
Tflowpanel nesnesi sizde var mı amacıyla hangi delphi versiyonunu kullandığınızı sormuştum, cevap gelmeyince son sürümlerden birini kullandığınızı varsaydım...

135 panel ile tek tek uğraşmak efektif olmaz, dinamik olarak bunları oluşturabilir, değiştirebilir, okuyabilir ve yokedebilirsiniz...

Başlangıcını vermiş olayım, siz geri kalanını düzenlersiniz...

ROYnlG.gif
unit Unit1_;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
 TForm1 = class(TForm)
   Panel_Menu: TPanel;
   BT_Olustur: TButton;
   ID: TEdit;
   KonteynerPanel: TFlowPanel;
   BT_Sorgula: TButton;
   BT_Yoket: TButton;
   Label1: TLabel;
   KARTADI: TPanel;
   procedure BT_Klik(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   function BirPanelEkle(aOwner: TComponent; aIndex: Integer): TPanel;
   procedure ButunPanelleriSil(aKonteynerPanel: TFlowPanel);
 end;

var
 Form1: TForm1;

const
 PanelAdedi = 50;

implementation

{$R *.dfm}

function TForm1.BirPanelEkle(aOwner: TComponent; aIndex: Integer): TPanel;
begin
 Result := TPanel.Create(aOwner);
 with  Result  do begin
       Parent            := TWinControl(aOwner);
       Caption           := aIndex.ToString;
       Width             := 50;
       Height            := 50;
       ParentBackground  := FALSE;
       AlignWithMargins  := True;
       Margins.Top       := 0;
       Margins.Left      := 0;
       Margins.Bottom    := 5;
       Margins.Right     := 5;
 end;
end;

procedure TForm1.ButunPanelleriSil(aKonteynerPanel: TFlowPanel);
begin
 while (aKonteynerPanel.ControlCount > 0) do begin
        if  (aKonteynerPanel.Controls[aKonteynerPanel.ControlCount-1] is TPanel)
        then TPanel(aKonteynerPanel.Controls[aKonteynerPanel.ControlCount-1]).Destroy;
 end;
end;

procedure TForm1.BT_Klik(Sender: TObject);
var
 I: Integer;
 BiPanel: TPanel;
begin
 if (Sender = BT_Olustur) then begin
     for I := 0 to PanelAdedi - 1 do BirPanelEkle(KonteynerPanel, I);
 end else
 if (Sender = BT_Yoket) then begin
     ButunPanelleriSil(KonteynerPanel);
 end else
 if (Sender = BT_Sorgula) then begin
     KARTADI.Caption := '(Boş)';
     for I := 0 to KonteynerPanel.ControlCount - 1 do begin
         if (KonteynerPanel.Controls[I] is TPanel) then begin
             BiPanel := TPanel(KonteynerPanel.Controls[I]);
             if (BiPanel.Caption = ID.Text) then begin
                 BiPanel.Color := clRed;
                 KARTADI.Caption := 'KART ADI = ' + BiPanel.Caption;
             end else begin
                 BiPanel.Color := clBtnFace;
             end;
         end;
     end;
 end else
 begin
   { Standart else sonu }
 end;
end;

end.

Şu da DFM dosyasıdır, Delphi Form tasarım ekranında ALT+F12 tuş kombinasyonunu kullanarak aşağıdaki kodu editöre yapıştırın;

object Form1: TForm1
 Left = 0
 Top = 0
 Caption = 'Form1'
 ClientHeight = 393
 ClientWidth = 640
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'Tahoma'
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Panel_Menu: TPanel
   Left = 0
   Top = 0
   Width = 640
   Height = 30
   Align = alTop
   TabOrder = 0
   ExplicitWidth = 864
   object Label1: TLabel
     AlignWithMargins = True
     Left = 307
     Top = 4
     Width = 52
     Height = 22
     Align = alLeft
     Caption = 'Kart Ad'#305' = '
     Layout = tlCenter
     ExplicitLeft = 498
     ExplicitHeight = 13
   end
   object BT_Olustur: TButton
     AlignWithMargins = True
     Left = 4
     Top = 4
     Width = 75
     Height = 22
     Align = alLeft
     Caption = 'Olu'#351'tur'
     TabOrder = 0
     OnClick = BT_Klik
   end
   object ID: TEdit
     AlignWithMargins = True
     Left = 85
     Top = 4
     Width = 54
     Height = 22
     Align = alLeft
     TabOrder = 1
     Text = '12'
     ExplicitHeight = 21
   end
   object BT_Sorgula: TButton
     AlignWithMargins = True
     Left = 145
     Top = 4
     Width = 75
     Height = 22
     Align = alLeft
     Caption = 'Sorgula'
     TabOrder = 2
     OnClick = BT_Klik
   end
   object BT_Yoket: TButton
     AlignWithMargins = True
     Left = 226
     Top = 4
     Width = 75
     Height = 22
     Align = alLeft
     Caption = 'Yoket'
     TabOrder = 3
     OnClick = BT_Klik
   end
   object KARTADI: TPanel
     AlignWithMargins = True
     Left = 365
     Top = 4
     Width = 96
     Height = 22
     Align = alLeft
     Caption = 'KART ADI'
     TabOrder = 4
   end
 end
 object KonteynerPanel: TFlowPanel
   Left = 0
   Top = 30
   Width = 640
   Height = 363
   Align = alClient
   TabOrder = 1
   ExplicitWidth = 864
   ExplicitHeight = 549
 end
end
Cevapla
#6
(25-09-2017, Saat: 16:02)meko Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olpanel adı derken ilgili panelin captionu mu KARTADI değişkenine atanacak?

Hayır , paylaşmış olduğum resimden örneklersem.  Panel1 diye bir panelim var ve içerisinde 27 adet küçük panel var. Bu panellerin captionında rakamlar yazılı. Mesela diyelim ki 5 sayısı arattık ve panel1 de bu sayı olduğunu buldu. Ozaman bana şöyle bir değer döndürmeli 5 sayısı panel1 de var.




(25-09-2017, Saat: 16:27)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlDelphi'nin hangi sürümünü kullanıyorsunuz?

Özür dilerim anca bilgisayar karşısına geçebildim. O yüzden cevap veremedim. Delphi xe10 kullanıyorum.  Paylaşmış olduğunu örnek için çok teşekkür ediyorum hemen inceliyorum. 




(25-09-2017, Saat: 16:32)Abdullah Ilgaz Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba,

Sabit değerleri caption özelliğine yazılmış panellerin hepsini tek 1 event'a bağlayın.
Örn: Panel1OnClick.

Sonra bu metodun içerisine girerek Sender parametresini göndereceğiniz Panel'in tipine göre cast edin.
TPanel(Sender).Caption ile statik değerleri elinize alarak istediğiniz fonksiyona parametre geçerek bu metodu kullanabilirsiniz.

Örnek için teşekkürler. Tam dediğinizi acemiliğimden olsa gerek tam anlamıyla anlayamadım ama örneği inceleyip anlamaya çalışacağım.






(25-09-2017, Saat: 17:33)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlTflowpanel nesnesi sizde var mı amacıyla hangi delphi versiyonunu kullandığınızı sormuştum, cevap gelmeyince son sürümlerden birini kullandığınızı varsaydım...

135 panel ile tek tek uğraşmak efektif olmaz, dinamik olarak bunları oluşturabilir, değiştirebilir, okuyabilir ve yokedebilirsiniz...

Başlangıcını vermiş olayım, siz geri kalanını düzenlersiniz...
 
Emeğiniz için teşekkürler. Fakat eğer yanlış anlamadıysam paneller caption değerlerini namelerinden alıyor. Bu biraz sorun çıkarabilir.
Yapmak istediğim daha iyi anlatabilmek adına şöyle örnekliyeyim.
Tombala oyununu düşünün , 1 numaralı kartı ve 7 numaralı kartı aldınız. Her ikisinde de 5 rakamı var. Eğer ben name ve captionları bir yaparsam aynı name sahip iki panel oluşturmayacağım için hata alacağım.  Nameleri farklı olup captionlara elle rakam verirsem bu seferde arama şeklimi captionlara göre yapmam gerekecek.  Bu örneğiniz bana klavuz olacaktır. Biraz inceleyip  değiştirebilirsem sanırım istediğime ulaşabilirim.

Ekli dosyada panel yapımı gösteren ufak bir örnek paylaşıyorum. Oluşturmak ve arama yapmak istediğim yapı örneği
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#7
kart panellerine isimlendirme verirken, sıralı mantık değilde grup sıralı isim verebilirsin, şöyle ki
1 nolu kart içindeki panel (ismi de pnl01 olsun) isimlerini, pnl0101, pnl0102, pnl0103, pnl0104 ...
7 nolu kart içindeki panel (ismi de pnl07 olsun) isimlerini, pnl0701, pnl0702, pnl0703, pnl0704 ...
kart içinde arama yapmak içinde kartları (pnl01, pnl02...) döngüye sokarak yapabilirsin

aPanel := (pnlkart.FindComponent('pnl'+kartno+TasNo.tosting)) as TPanel; // pnlkart, kartno form üzerindeki panel isimleri
if aPanel <> nil then
Begin
 aPanel.color := clRed;
End;
Cevapla
#8
Örneğin aIndex 10 ise bir label eklemek istediğinizi varsayalım:
function TForm1.BirPanelEkle(aOwner: TComponent; aIndex: Integer): TPanel;
var
  lbl: TLabel;
begin
Result := TPanel.Create(aOwner);
with  Result  do begin
     Parent            := TWinControl(aOwner);
     Caption           := aIndex.ToString;
     Width             := 50;
     Height            := 50;
     ParentBackground  := FALSE;
     AlignWithMargins  := True;
     Margins.Top       := 0;
     Margins.Left      := 0;
     Margins.Bottom    := 5;
     Margins.Right     := 5;
end;
if aIndex = 10 then
begin
  lbl := TLabel.Create(Result);
  lbl.Parent := Result;
  // Burada label'in diğer özelliklerini ayarlayabilirsiniz.
end;
There's no place like 127.0.0.1
WWW
Cevapla
#9
(26-09-2017, Saat: 14:08)Lord_Ares Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kod:
function TForm1.BirPanelEkle(aOwner: TComponent; aIndex: Integer): TPanel;
begin
Result := TPanel.Create(aOwner);
with  Result  do begin
      Parent            := TWinControl(aOwner);
      Caption           := aIndex.ToString;
      Width             := 50;
      Height            := 50;
      ParentBackground  := FALSE;
      AlignWithMargins  := True;
      Margins.Top       := 0;
      Margins.Left      := 0;
      Margins.Bottom    := 5;
      Margins.Right     := 5;
end;
end;


BirPanelEkle(KonteynerPanel, I);

Yukarıdaki fonksiyon ile ana panel içinde panel oluşturulabiliyor. Ben bu panel oluşturulurken oluşturulan panelin içine labelda ekleyebilirmiyim, nasıl eklerim. 

Panel oluşturulurken hangi panel içine oluşturacağımı name olarak verebilirmiyim.  Örneğin : Name 5 olan panel içine içinde label olan bir panel oluştur...


Merhaba,

Tabi, bir benzerini yazarak label de oluşturabilirsiniz...

Toplu panel oluşturmak ile ilgili olarak bir önceki iletimde bir kod paylaşmıştım, BT_Klik olayının içini inceleyin;

procedure TForm1.BT_Klik(Sender: TObject);
var
I: Integer;
begin
 if (Sender = BT_Olustur) then begin
     for I := 0 to PanelAdedi - 1 do BirPanelEkle( XXXX , I);    // burada    "PanelAdedi" kadar alt kutucuk ekleniyor "XXXX" adlı TPanel nesnesine...
     for I := 0 to PanelAdedi - 1 do BirPanelEkle( YYYY , I);    // burada da "PanelAdedi" kadar alt kutucuk ekleniyor "YYYY" adlı TPanel nesnesine...
 end else
 if (Sender = BT_Yoket) then begin
     ButunPanelleriSil(XXXX);
     ButunPanelleriSil(YYYY);
 end else
 if (Sender = BT_Sorgula) then begin
     PaneliArastir(ID.Text, XXXX);
     PaneliArastir(ID.Text, YYYY);
 end else
 begin
     { Standart else sonu }
 end;
end;

Sizin paylaştığınız proje dosyasında XXXX ve YYYY değişkenleri Panel100 ve Panel146'ya denk gelmiş oluyor...

*** EKLEME ***
Kurcalamanız için bir örnek daha paylaşacağım, sonrasını siz kendiniz bulabilirsiniz diye tahmin ediyorum.
Cevapla
#10
Teşekkürler sonradan farkettim dediğiniz gibi aslında kodunuzda zaten name göre ekliyormuş. Panel oluştur fonksiyonunuzun aynısından bir adette label için yaptım ve oluştururken panel ismini verdim. Dediğiniz gibi oluştu. Bu konuyu bilmiyordum. Bana öğrettiğiniz için çok teşekkür ediyorum. Affınıza sığınarak son birşey sormak istiyorum. Bunları runtime da oluşturduğum için çözünürlük sorun olurmu bunu nasıl geçebilirim. Çözünürlük değiştiğinde bu nesnelerin büyüklüğünü çözünürlüğe göre nasıl ayarlamasın sağlayacağım.
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Panel ve çözünürlük Lord_Ares 8 535 01-10-2017, Saat: 01:02
Son Yorum: mcuyan
  Alan boş ise değer ataması Derbeder 6 539 07-07-2017, Saat: 15:30
Son Yorum: witalihakko
  static değişkene Default değer atama! bozli54 3 326 26-05-2017, Saat: 15:35
Son Yorum: Fesih ARSLAN
Question Graphics32 companent PaintBox32 panel sabitleme. Shou 12 4.274 08-08-2016, Saat: 23:30
Son Yorum: Shou



Konuyu Okuyanlar: 1 Ziyaretçi