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;