elGringo Posted April 15, 2018 Share Posted April 15, 2018 Hi, having 2 classes 1 frame is created on another Second frame on 1 frame there is TUniLabel for example i'm trying to handle onClick event of label in Second frame and assign it like FOL[i].lName.OnClick := OnClickElement; here i have "Invalid type Cast" procedure TLeftMenu2.OnClickElement(Sender: TObject); var i: integer; begin showmessage( // ((Sender as TUniLabel).Parent as TLeftMenu2Element).ClassName // << invalid type Cast ); // end; As Delphi coder I'm doing everything correct, but as UniGUI coder i'm being not so experienced i tried to do things like procedure TLeftMenu2.OnClickElement(Sender: TObject); var i: integer; begin showmessage( // ((Sender as TUniLabel).Parent.Parent).ClassName // ); // end; and on click i have TUniSimplePanel - which is not my class. Is any way to get instance of TLeftMenu2Element - 1 frame on click in 2 frame? Below full code of 2 frames unit uLeftMenu2Element; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, uniGUITypes, uniGUIAbstractClasses, uniGUIClasses, uniGUIFrame, uniGUIBaseClasses, uniPanel, uniImage, uniLabel; type TLeftMenu2Element = class(TUniFrame) iPic: TUniImage; lName: TUniLabel; procedure UniFrameCreate(Sender: TObject); procedure iPicClick(Sender: TObject); procedure lNameClick(Sender: TObject); private FIsExpanded: boolean; procedure SetIsExpanded(const Value: boolean); { Private declarations } public { Public declarations } property IsExpanded: boolean read FIsExpanded write SetIsExpanded; end; implementation {$R *.dfm} uses uLeftMenu2; procedure TLeftMenu2Element.iPicClick(Sender: TObject); begin if FIsExpanded then begin FIsExpanded := false; iPic.Picture.LoadFromFile('pics/arrowRight16x16.png') end else // if not expanded begin FIsExpanded := true; iPic.Picture.LoadFromFile('pics/arrowDown16x16.png'); end; end; procedure TLeftMenu2Element.lNameClick(Sender: TObject); begin // end; procedure TLeftMenu2Element.SetIsExpanded(const Value: boolean); begin FIsExpanded := Value; end; procedure TLeftMenu2Element.UniFrameCreate(Sender: TObject); begin iPic.Picture.LoadFromFile('pics/arrowRight16x16.png'); lName.Top := trunc(Self.Height / 2 - lName.Height / 2); iPic.Top := trunc(Self.Height / 2 - iPic.Height / 2); end; end. And another class unit uLeftMenu2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, uniGUITypes, uniGUIAbstractClasses, uniGUIClasses, uniGUIFrame, uLeftMenu2Element, System.Generics.Collections, uniGUIBaseClasses, uniPanel; type TLeftMenu2 = class(TUniFrame) procedure UniFrameCreate(Sender: TObject); procedure UniFrameDestroy(Sender: TObject); private { Private declarations } FOL: TObjectList<TLeftMenu2Element>; procedure OnClickElement(Sender: TObject); public { Public declarations } procedure LoadGoodsTree; // procedure LoadChildren(aID: integer); end; implementation uses FireDAC.Comp.Client, MainModule, uniLabel; {$R *.dfm} 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.OnClick := OnClickElement; h := h + FOL[i].Height; Next; end; Close; end; finally q.Free; end; end; begin loadNullLevel(); end; procedure TLeftMenu2.OnClickElement(Sender: TObject); var i: integer; begin showmessage( // ((Sender as TUniLabel).Parent as TLeftMenu2Element).ClassName // ); // end; procedure TLeftMenu2.UniFrameCreate(Sender: TObject); begin FOL := TObjectList<TLeftMenu2Element>.Create; end; procedure TLeftMenu2.UniFrameDestroy(Sender: TObject); begin FOL.Free; end; end. Link to comment Share on other sites More sharing options...
elGringo Posted April 15, 2018 Author Share Posted April 15, 2018 Asked myself - answered myself my workAround 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); showmessage(leftMenu2Element.lName.Caption); end; Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now