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?
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.
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.
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ç
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.
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;
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;
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.
Şu şekilde de yazılabilir yalnış hatırlamıyorsam.
with Panel[i] do
begin
Shape[j].Brush.Color:=cdRed;
end;
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.
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.
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
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.