Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Delphi için yardım

Başlatan z, 15 Kasım 2015, 18:39:53

z

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?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

#1
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.

z

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.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

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ç

z

#4
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.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

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


    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;

z

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;


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

#7
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.

robomaster

#8
Şu şekilde de yazılabilir yalnış hatırlamıyorsam.

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

  end;

z

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.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ByTEK

#10
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.

engerex

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

boreas

#12
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.