В UniGUI это не так очевидно. Поскольку UniGUI – надстройка над ExtJS. Вот мой пост и решение проблемы.
Проблема заключается вот в чем. Пытаемся сделать обработчик в другом классе и получаем Invalid TypeCast.
1 2 3 4 5 6 7 8 |
procedure TLeftMenu2.OnClickElement(Sender: TObject); var i: integer; begin showmessage( // ((Sender as TUniLabel).Parent as TLeftMenu2Element).ClassName // << invalid type Cast ); // end; |
Решение проблемы через Tag
При создании класса, записываем в Tag всех компонентов класса и в сам класс некий идентификатор
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
procedure TLeftMenu2.LoadGoodsTree; procedure loadNullLevel(); var q: TFDquery; i: integer; h: integer; itemName: string; begin h := 0; q := TFDquery.Create(nil); try with q do begin Connection := UniMainModule.DB.FDConnection; sql.Text := 'SELECT * FROM sewworld_db.goods where idParent is NULL order by sortIndex'; Disconnect(); Open; while not EOF do begin i := FOL.Add(TLeftMenu2Element.Create(Self)); itemName := FieldByName('name').AsString; if itemName.Length > 15 then itemName := itemName.Substring(0, 15) + '...'; FOL[i].lName.Caption := itemName; FOL[i].Parent := Self; FOL[i].Left := 0; FOL[i].Top := h; FOL[i].Show; FOL[i].lName.Tag := FieldByName('id').AsInteger; // <<< FOL[i].iPic.Tag := FieldByName('id').AsInteger; // <<< FOL[i].lName.OnClick := OnClickElement; FOL[i].iPic.OnClick := OnClickElement; FOL[i].Tag := FieldByName('id').AsInteger; // <<< h := h + FOL[i].Height; Next; end; Close; end; finally q.Free; end; end; begin loadNullLevel(); end; |
И при обращении к нему из другого класса – ищем его…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
procedure TLeftMenu2.OnClickElement(Sender: TObject); function getLeftMenuElement(aID: integer): TLeftMenu2Element; var i: Integer; begin Result := nil; for i := 0 to FOL.Count - 1 do if FOL[i].Tag = aID then begin result := FOL[i]; break; end; end; var leftMenu2Element: TLeftMenu2Element; begin if (Sender is TUniLabel) then leftMenu2Element := getLeftMenuElement((Sender as TUniLabel).Tag); if (Sender is TUniImage) then leftMenu2Element := getLeftMenuElement((Sender as TUniImage).Tag); showmessage(leftMenu2Element.lName.Caption); end; |