Lazarus 2.2.2 (2022.05.19.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Dinamikusan létrehozott vezérlők közös eseménykezelője 2022 okt. 27 07:04 #2622

  • Hozso
  • Hozso profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 28
  • Köszönetek: 0
Köszönöm a segítséget, ezt így már tudom használni! (Most még maradok a TPanel nélküli megoldásnál, de legközelebb már ezzel fogom készíteni az ilyen feladatokat.)

Dinamikusan létrehozott vezérlők közös eseménykezelője 2022 okt. 26 14:52 #2621

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 485
  • Köszönetek: 85
Természetesen TForm-on is ugyanúgy működik, hiszen annak is elérhető a .Components tulajdonsága. Én ennek ellenére TPanel-re tenném, mert úgy könnyebb lenne őket együtt kezelni (csak a panel elemein kell végigmenni) ha a Form-ra később egyéb dolgok is kerülnek.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 2.3.0 -- FPC 3.3.1-- GNU/Linux 5.4.0 x86_64
Megköszönték: Hozso

Dinamikusan létrehozott vezérlők közös eseménykezelője 2022 okt. 26 13:44 #2620

  • Hozso
  • Hozso profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 28
  • Köszönetek: 0
Nem volt zavaros, értem amit írtál. De ez csak akkor működik, ha egy TPanel-re pakolom fel a vezérlőket? A formra rakva (TPanel nélkül) is működhet a dolog? (Bocs, ha hülyeséget kérdezek...)

Dinamikusan létrehozott vezérlők közös eseménykezelője 2022 okt. 26 12:39 #2619

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 485
  • Köszönetek: 85
A TForm és a TPanel is a TComponent leszármazottja, mely(ek)nek van .Components nevű tulajdonsága (és persze .Name is), ami a rajtuk elhelyezett elemeket tartalmazza.
Így aztán a TComponent lehetőségeinek szem előtt tartásával megvalósítható az amit szeretnél.

Pl. ha a Form1-en elhelyezel egy TPalel-t, melynek a neve Panel1 akkor az ezen elhelyezett TEdit-ek már a Panel1.Components[index] kifejezés használatával elérhetők, ahol 0 alaporól indulva index:=(sor*sorhossz)+oszlop

Remélem nem írtam túl zavarosan :)
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 2.3.0 -- FPC 3.3.1-- GNU/Linux 5.4.0 x86_64

Dinamikusan létrehozott vezérlők közös eseménykezelője 2022 okt. 26 11:52 #2618

  • Hozso
  • Hozso profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 28
  • Köszönetek: 0
Köszönöm, ezt a 'TControl(Sender).Name' megoldást tudom használni.

Azt esetleg meg lehet oldani, hogy a kétdimenziós tömb elemeit egyből "megkapjam" valahol?

Arra gondolok, hogy van egy edtMsg[x,y] tömbbe rendezett TEditfileld. A létrehozáskor meg tudom csinálni, hogy a nevük sorra utaljon a tömbindexekre és a fenti megoldással a tömbindexeket vissza tudom "keresni" a név alapján. De ennél "elegánsabb" lenne, ha valahogy a tömbindexeket egyből tudnám használni. Már, ha ez megoldható...

 

Dinamikusan létrehozott vezérlők közös eseménykezelője 2022 okt. 26 10:26 #2617

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 485
  • Köszönetek: 85
Az eseménykezelők Sender:TObject paramétere mindig a kiváltó objektumra mutat.
A kiváltó objektum nevét (és minden TControl-ból örökölt infóját is) az alábbi módon olvashatod ki:
procedure TForm1.Button1Click(Sender: TObject);
begin
    Label1.Caption := TControl(Sender).Name;
end;
Részleteket lásd a TControl leírásában.
Természetesen bármely ős típust lehet használni a maszkolásra vagy akár olyat is, amely egy esetleges leszármazott, de ez utóbbit csak akkor ha biztos a dolog, máskülönben súlyos kivétel (hiba) keletkezhet.

Ha adott típusú objektumok eseményét akarod kezelni (pl. bármely TButton típusú objektum):
if Sender is TButton then ValamiLegyen;
Ha egy meghatározott objektum eseményét akarod kezelni (itt Button1 kattintását):
if Sender = Button1 then ValamiLegyen;
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 2.3.0 -- FPC 3.3.1-- GNU/Linux 5.4.0 x86_64

Dinamikusan létrehozott vezérlők közös eseménykezelője 2022 okt. 26 09:09 #2615

  • Hozso
  • Hozso profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 28
  • Köszönetek: 0
  Elnézést, ha már volt ilyen téma, de nem tudom, hogyan is tudnék ilyesmire rákeresni... (elég bonyolult a kérdés ahhoz, hogy ne legyen egyszerű rákeresni a megoldásra...)

  Adva van több form, amelyeken dinamikusan hozok létre grafikus szabványos vezérlőket. Pl. ComboBox-okat, Edit mezőket stb. Van amelyik egy- és van, amelyik kétdimenziós tömbbe van szervezve. Azt sikerült megoldanom, hogy a létrehozáskor megadom egy-egy vezérlő csoportnak, hogy mi legyen az adott esemény kezelője. (Egy eljárás.)
  A kérdésem, hogy honnan tudja az eljárás, hogy épp melyik vezérlő váltotta ki a meghívását? (Most azt csinálom, hogy ha lefut az eseménykezelő, akkor az összes vezérlőelemen elvégzi a szükséges vizsgálatokat. De ha sok vezérlő van, akkor ez sokáig tart, illetve eleve praktikusabb lenne, csak azon az egy elemen elvégezni a szükséges műveleteket, amelyik kiváltotta az eseményt.)

  Mellékelek egy kis részletet a programomból. A SetDataFields()-ben az összes mezőre végrehajtom a vizsgálatot, de ha tudnám, hogy melyik elem váltotta ki az eseményt, akkor elég lenne csak azzal foglalkozni... 


   Horváth Zsolt
 
for iTmp:=0 to 15 do                //slave address hardware type labels
  begin
    frmMain.cboHWType[iTmp]:=TComboBox.Create(self);
    with cboHWType[iTmp] do
    begin
      Parent:=self;
      Height:=cLblHWTableHeight;
      Width:=cCboHWTypeWidth;
      Left:=cLblHWTableStartX+cLblHWTableXDist;
      Top:=cLblHWTableStartY+cLblHWTableYDist*iTmp;
      Name:='cboHWType_'+IntToStr(iTmp);
      Items:=lstHWType;
      ItemIndex:=0;
      Style:=csDropDownList;
      OnChange:=@SetFields;
      Font.Name:=cLabelFontType;
      Font.Size:=cLabelFontSize;
    end;
 
  end;                                         
 
...
 
procedure TfrmMain.SetFields(Sender: TObject);
          //combo box changed, set the data fields
begin
  SetDataFields();
end;
 
...
 
 
procedure SetDataFields();
          //set the visibility and enable properties of the IODat fields
var
  iTmp, iTmp2: integer;
 
begin
  for iTmp:=0 to 15 do
  begin
    if (frmMain.cboHWType[iTmp].Text=cHWType01) then
    begin
      for iTmp2:=0 to 15 do
      begin
        frmMain.chkIODat[iTmp,iTmp2].Visible:=true;
        frmMain.chkIODat[iTmp,iTmp2].Enabled:=false;
      end;
      for iTmp2:=0 to 7 do frmMain.edtIODat[iTmp,iTmp2].Visible:=false;
    end;
    if (frmMain.cboHWType[iTmp].Text=cHWType02) then
    begin
      for iTmp2:=0 to 15 do
      begin
        frmMain.chkIODat[iTmp,iTmp2].Visible:=true;
        frmMain.chkIODat[iTmp,iTmp2].Enabled:=true;
      end;
      for iTmp2:=0 to 7 do frmMain.edtIODat[iTmp,iTmp2].Visible:=false;
    end;
    if (frmMain.cboHWType[iTmp].Text=cHWType03) then
    begin
      for iTmp2:=0 to 7 do
      begin
        frmMain.edtIODat[iTmp,iTmp2].Visible:=true;
        frmMain.edtIODat[iTmp,iTmp2].Enabled:=false;
      end;
      for iTmp2:=0 to 15 do frmMain.chkIODat[iTmp,iTmp2].Visible:=false;
    end;
    if (frmMain.cboHWType[iTmp].Text=cHWType04) then
    begin
      for iTmp2:=0 to 7 do
      begin
        frmMain.edtIODat[iTmp,iTmp2].Visible:=true;
        frmMain.edtIODat[iTmp,iTmp2].Enabled:=true;
      end;
      for iTmp2:=0 to 15 do frmMain.chkIODat[iTmp,iTmp2].Visible:=false;
    end;
    if (frmMain.cboHWType[iTmp].Text='-') then
    begin
      for iTmp2:=0 to 7 do frmMain.edtIODat[iTmp,iTmp2].Visible:=false;
      for iTmp2:=0 to 15 do frmMain.chkIODat[iTmp,iTmp2].Visible:=false;
    end;
   end;
 
end;
 

  • Oldal:
  • 1