Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Delphi => Konuyu başlatan: z - 15 Kasım 2015, 18:39:53

Başlık: Delphi için yardım
Gönderen: z - 15 Kasım 2015, 18:39:53
Delphide bir birinin aynı paneller oluşturacağım.

Her panelin üzerinde atıyorum 3 tane led görevi gören shape nesnesi kullanacağım.

Bir de proocedure yazacağım. Fakat burda takıldım.

procedure Ledler(Panel,Led,On_Off:integer);

Yukarıdaki yapıdaki prosedürü mesela Ledler(3,5,1); diye çağırırsam 3 nolu panelin 5. ledi yanacak.

Takıldığım kısım panellere ve panel üzerindeki ledlere parametrik olarak erişim kısmı.

İki panel ve 2 ledden oluşan örneğin kodlarını yazabilir misiniz?
Başlık: Ynt: Delphi için yardım
Gönderen: t2 - 15 Kasım 2015, 18:45:53
bir Panelin veya başka panelin içinde  olması neyi değiştirir? sonuçta bu shape'in bir ismi var. Onu bildirmek gerek. paneli yazmaya gerek yok.

procedure TForm1.Ledler(Led: TShape; On_Off: boolean);
begin
  Led.Visible := on_off;
end;


unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Shape1: TShape;
    Shape2: TShape;
    Shape3: TShape;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    procedure Ledler(Led: TShape; On_Off: boolean);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Ledler(Led: TShape; On_Off: boolean);
begin
  Led.Visible := on_off;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Ledler(Shape1, false);

end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  Ledler(Shape2, false);
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  Ledler(Shape1, not Shape1.Visible);
end;

end.

Başlık: Ynt: Delphi için yardım
Gönderen: z - 15 Kasım 2015, 18:50:46
Soruyu basitleştirerek sordum. 10 kadar panel ve her birinin üzerinde 10 kadar led var. Her bir led için tek tek fonksiyon yazmak istemiyorum.

Başlık: Ynt: Delphi için yardım
Gönderen: t2 - 15 Kasım 2015, 18:54:34
Otomatik olarak nesneleri oluştururken illa ki bir isim verilmiştir.Muhtemelen bu isimler bir dizidir.
işte o dizideki indeksi kullanarak led ismini, prosedüre yazalım

Ledler(Led[ledno], false);  // kapat
Ledler(Led[ledno], true);  // aç
Başlık: Ynt: Delphi için yardım
Gönderen: z - 15 Kasım 2015, 19:22:43
LEdleri ve panelleri tasarım aşamasında mouse ile yerine koyarak tek tek oluşturdum. 160 tane led 10 tane de panelim var. Ledlerin her birisine sırayla 1,2,3..160  diye isim verdi.

mesaj birleştirme:: 15 Kasım 2015, 17:39:43

Sorumu şu şekilde değiştireyim.

Bir panelin üstüne mouse ile tek tek uğraşıp 10 tane tshape nesnesi yerleştirmiş olayım.

Bu ledlere led1.pen.color:=clred; led2.pen.color:=clred; .... olarak değilde

numara ile erişmek istesem nasıl yapabilirim? 

Tabiki

if LedNo=1 then Led1.Pen.color:=clred;
if LedNo=2 then Led2.Pen.color:=clred;
if LedNo=3 then Led3.Pen.color:=clred;

şeklinde tek tek kod yazmak istemiyorum. Nesneye index numarası ile ulaşmak istiyorum.

Başlık: Ynt: Delphi için yardım
Gönderen: t2 - 15 Kasım 2015, 19:47:14
Ledleri ve panelleri tasarım aşamasında mouse ile yerine koyarak tek tek oluşturma!
Program başlayınca program bunları kendisi oluştursun. olayını kodunu filan tek seferde eşitlerisn. daha önce de sormuştun bir arkadaş çok güzel örnek yapmıştı.

https://www.picproje.org/index.php?topic=60277.0 (https://www.picproje.org/index.php?topic=60277.0)


    ButonAdedi := SpinEdit1.Value;
    SetLength(Btn, ButonAdedi);

    for i := 0 to ButonAdedi - 1 do
    begin
      Btn[i] := TButton.Create(Self);
      Btn[i].Parent := Form1;
      Btn[i].Height:=24;
      Btn[i].Top := i * 30 + 50;
      Btn[i].Left := 10;
      Btn[i].Width := 200;
      Btn[i].Caption := 'Buton' + IntToStr(i + 1);
      Btn[i].Tag := i + 1;
      Btn[i].OnClick := BtnClick;
    end;
Başlık: Ynt: Delphi için yardım
Gönderen: z - 15 Kasım 2015, 20:33:09
Evet elle oluşturmak yerine programa oluşturtursam bir haylı yol aldım.

Fakat hala şu panelin şu ledini yak diyemiyorum.

Panel[1].Shape[3]=clRed gibi bir satır yazabilmeyi beceremdim.

procedure TForm1.FormCreate(Sender: TObject);
var i,j,f:integer;
begin
        Doublebuffered:=true;

        for i:=0 to 15 do
          begin
            Panel[i]:=Tpanel.Create(Form1);
            Panel[i].BevelOuter:=bvNone;
            Panel[i].Top:=1;
            Panel[i].Left:=i*14;
            Panel[i].Width:=15;
            Panel[i].Height:=15*15;
            Panel[i].Parent:=Form1;
            Panel[i].ParentBiDiMode:=true;
            for j:=0 to 15 do
              begin
                Shape[j]:=Tshape.Create(Panel[i]);
                Shape[j].Parent:=Panel[i];
                Shape[j].left:=0;
                Shape[j].top:=j*14;
                Shape[j].height:=15;
                Shape[j].width:=15;
                Shape[j].Brush.Color:=clMaroon;
                Shape[j].Brush.Style:=bsSolid;
              end;
          end;

end;


Başlık: Ynt: Delphi için yardım
Gönderen: t2 - 15 Kasım 2015, 21:07:31
ledin panele ait olduğunu 
shape[i].Parent:=Panel[i];

şeklinde belirttikten sonra artık panelden bahsetmeye gerek yok. SAdece shape kullanılır. hangi panel içinde olduğu oluştururken zaten belirtilmiş
Shape[3].Brush.Color:= clRed;

numara 0 dan başlıyor diyelim.
her panelde 10 shape varsa, 2. panelin birinci ledini yakmak için numara 0 değil 10  olmalı 30 panel 300 led varsa. sonuncu ledi yakmak için panelno.ledno şeklinde değil, ledno olarak 299 kullanılacak.

denebilir.
Başlık: Ynt: Delphi için yardım
Gönderen: robomaster - 15 Kasım 2015, 21:13:36
Şu şekilde de yazılabilir yalnış hatırlamıyorsam.

with Panel[i] do
  begin
    Shape[j].Brush.Color:=cdRed;

  end;
Başlık: Ynt: Delphi için yardım
Gönderen: z - 15 Kasım 2015, 21:15:41
Neyse panelleri kaldırıp attım ve shapeleri 2 boyutlu array olarak tanımladım.

Şu anda istediğim oldu.

Shape[3,7] dediğimde 3 sutundaki 7.satıra ait lede erişebiliyorum.

Başlık: Ynt: Delphi için yardım
Gönderen: ByTEK - 15 Kasım 2015, 21:47:28
Merhaba,

2010 yılında ufak bir yazılım yazmıştım. üzerinde bir sürü bileşen vardı tek tek yazmaktansa aşağıdaki kod ile istediğimi buluyordum ve değer atıyordum. Belki faydası dokunur. Siz çözmüşsünüz ama başka bir yerde yardımı dokunur diye düünüyorum.

procedure TForm1.urunresim1Click(Sender: TObject);
var
buton:TPNGButton;
sayi,s : integer;
urunadi : string;
begin
if Sender is TPNGButton then   // hangi resim gösterilecek
begin
    buton:=TPNGButton(Sender);
    sayi:= strtoint(trim(copy(buton.name,10,2)));
end;

for s := 0 to ComponentCount-1 do   // etkineşecek bileşenleri bulalım
begin
  if( Components[ s ] is Tscombobox )then
  begin
   if (Components[ s ] as Tscombobox ).name = 'urun'+inttostr(sayi) then
   urunadi := (Components[ s ] as Tscombobox).Text;
begin
     urunadi := copy(urunadi,1,pos('.....',urunadi)-1);
       if trim(urunadi) <> '' then
       begin
        resimadi := urunadi;
       end;
     end
  end;
  end;


Aşağıda isteğinize yakın birşey yaptım. arkadaşlara ipin ucu olacaktır diye düşünüyorum.


unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Buttons, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    renk: TEdit;
    panel: TEdit;
    Led: TEdit;
    Panel1: TPanel;
    Panel2: TPanel;
    Shape1: TShape;
    Shape2: TShape;
    Shape3: TShape;
    Shape4: TShape;
    procedure BitBtn1Click(Sender: TObject);
    procedure Ledler(panelno,Ledno,On_Off:string);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure Tform1.Ledler(panelno,Ledno,On_Off:string);
var
  p,s,panell,ledd,renkk:integer;
begin
     panell := strtoint(panelno);
     Ledd := strtoint(Ledno);
     renkk := strtoint(On_Off);

     for p := 0 to ComponentCount-1 do   // Paneli Bulalım
     begin
       if( Components[ p ] is TPanel ) then
           begin
             if (Components[ p ] as TPanel ).name = 'Panel'+inttostr(Panell) then //Paneli Bulduk
                 begin
                  for s := 0 to ComponentCount-1 do
                  begin
                    if( Components[ s ] is TShape ) then
                        begin
                             if (Components[ s ] as TShape ).name = 'Shape'+inttostr(Ledd) then
                                begin
                                if ((Components[ s ] as TShape).GetParentComponent.Name) = // led doğru panelde midir ?
                                   (Components[ p ] as TPanel ).name then
                                  begin
                                    if renkk = 1 then
                                     (Components[ s ] as TShape).Brush.Color:=clred
                                     else
                                     (Components[ s ] as TShape).Brush.Color:=clwhite;
                                  end;
                                 end;
                              end;

                        end;

                 end;
           end;
       end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ledler(panel.Text,led.text,renk.text);
end;

end.
Başlık: Ynt: Delphi için yardım
Gönderen: engerex - 15 Kasım 2015, 23:15:47
Ledler nasıl ulaşmak istiyorsun?
Panel2 deki 3. Ledi yak diye mi?
Led 79 u yak diye mi?

Düzenleme: Ben mesajı yazarken "Panel2 deki 3. Ledi yak" olanı kullanmışsın
Başlık: Ynt: Delphi için yardım
Gönderen: boreas - 16 Kasım 2015, 11:38:38
Panellere ulaşmak için;
Tpanel(form1.findcomponent('Panel1')) ile istediğin gibi ulaşırsın.

Ben bu işi şöyle çözmüştüm 10 farklı sensörün grafiğini ve her grafiğin üst alt limit alrm vs. vardı.

Hepsinin ismi belli bir mantıkda gitti L_1_1, L_1_2, L_1_3 gibi. Bu nedemek ? L (led) _1 (1.panel) _ 3 (3.led) böyle bir mantıkla isimlendirsen. yukarıdaki kod örneği ile ismine göre istediğin bileşene ulaşırsın.

mesaj birleştirme:: 16 Kasım 2015, 11:43:26

Örnek olarak verdiğin ;

if LedNo=1 then Led1.Pen.color:=clred;
if LedNo=2 then Led2.Pen.color:=clred;
if LedNo=3 then Led3.Pen.color:=clred;


Procedure Led(Ledno,On_Off)
tshape(form1.findcomponent('Led'+inttostr(Ledno)).Pen.color:=ON_off*clred;

on_off eğer bir ise kırmızı sıfır ise siyah olur.