├── AndroidManifest.template.xml ├── DemoDesktop ├── DemoDesktop.deployproj ├── DemoDesktop.dpr ├── DemoDesktop.dproj ├── DemoDesktop.res ├── Entitlement.TemplateOSX32.xml ├── ObjectDebuggerFMXForm.fmx ├── ObjectDebuggerFMXForm.pas ├── Project1.res ├── Unit5.fmx └── Unit5.pas ├── DemoMobile ├── AndroidManifest.template.xml ├── Demo.res ├── DemoMobile.deployproj ├── DemoMobile.dpr ├── DemoMobile.dproj ├── DemoMobile.res ├── Entitlement.TemplateOSX32.xml ├── Entitlement.TemplateiOS.xml ├── Unit3.fmx └── Unit3.pas ├── Entitlement.TemplateOSX32.xml ├── Entitlement.TemplateiOS.xml ├── FormMessage.fmx ├── FormMessage.pas ├── LICENSE ├── ObjectDebuggerFMX.dpk ├── ObjectDebuggerFMX.dproj ├── ObjectDebuggerFMX.res ├── ObjectDebuggerFMXFrame.fmx ├── ObjectDebuggerFMXFrame.pas ├── ProjectGroupComponent.groupproj ├── README.md ├── README.txt └── Test ├── ObjectDebuggerFMXTest.deployproj ├── ObjectDebuggerFMXTest.dpr ├── ObjectDebuggerFMXTest.dproj ├── ObjectDebuggerFMXTest.res ├── Unit1.fmx ├── Unit1.pas ├── Unit2.fmx └── Unit2.pas /AndroidManifest.template.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | <%uses-permission%> 12 | 13 | 21 | 22 | <%application-meta-data%> 23 | <%services%> 24 | 26 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 38 | <%activity%> 39 | <%receivers%> 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /DemoDesktop/DemoDesktop.deployproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 12 5 | 6 | 7 | 8 | 9 | 10 | 11 | DemoDesktop\ 12 | DemoDesktop.exe 13 | ProjectOutput 14 | 0 15 | 16 | 17 | True 18 | True 19 | 20 | 21 | 22 | 23 | DemoDesktop.app\../\ 24 | DemoDesktop.entitlements 25 | ProjectOSXEntitlements 26 | 1 27 | 28 | 29 | True 30 | 31 | 32 | DemoDesktop.app\Contents\MacOS\ 33 | libcgunwind.1.0.dylib 34 | DependencyModule 35 | 1 36 | 37 | 38 | True 39 | 40 | 41 | DemoDesktop.app\Contents\MacOS\ 42 | DemoDesktop 43 | ProjectOutput 44 | 1 45 | 46 | 47 | True 48 | True 49 | 50 | 51 | DemoDesktop.app\Contents\MacOS\ 52 | DemoDesktop.rsm 53 | DebugSymbols 54 | 1 55 | 56 | 57 | True 58 | 59 | 60 | DemoDesktop.app\Contents\Resources\ 61 | DemoDesktop.icns 62 | ProjectOSXResource 63 | 1 64 | 65 | 66 | True 67 | 68 | 69 | DemoDesktop.app\Contents\ 70 | Info.plist 71 | ProjectOSXInfoPList 72 | 1 73 | 74 | 75 | True 76 | 77 | 78 | 79 | 80 | 81 | DemoDesktop.app\ 82 | libPCRE.dylib 83 | DependencyModule 84 | 1 85 | 86 | 87 | True 88 | 89 | 90 | DemoDesktop.app\ 91 | libcgunwind.1.0.dylib 92 | DependencyModule 93 | 1 94 | 95 | 96 | True 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /DemoDesktop/DemoDesktop.dpr: -------------------------------------------------------------------------------- 1 | program DemoDesktop; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | ObjectDebuggerFMXFrame in '..\ObjectDebuggerFMXFrame.pas' {FMXObjectDebuggerFrame: TFrame} , 7 | FormMessage in '..\FormMessage.pas' {MessageForm} , 8 | Unit5 in 'Unit5.pas' {Form5} , 9 | ObjectDebuggerFMXForm in 'ObjectDebuggerFMXForm.pas' {ObjectDebuggerFMXForm}; 10 | 11 | {$R *.res} 12 | 13 | 14 | begin 15 | Application.Initialize; 16 | Application.CreateForm(TForm5, Form5); 17 | Application.CreateForm(TMessageForm, MessageForm); 18 | Application.CreateForm(TObjectDebuggerFMXForm, ObjectDebuggerFMXForm1); 19 | Application.Run; 20 | 21 | end. 22 | -------------------------------------------------------------------------------- /DemoDesktop/DemoDesktop.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dph2011/Object-Debugger-for-FireMonkey/3f966bac9f19e4bf8cba2c8d87ffc1b092589cf0/DemoDesktop/DemoDesktop.res -------------------------------------------------------------------------------- /DemoDesktop/Entitlement.TemplateOSX32.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | <%appSandboxKeys%> 6 | 7 | 8 | -------------------------------------------------------------------------------- /DemoDesktop/ObjectDebuggerFMXForm.fmx: -------------------------------------------------------------------------------- 1 | object ObjectDebuggerFMXForm: TObjectDebuggerFMXForm 2 | Left = 0 3 | Top = 0 4 | Caption = 'FireMonkey Object Debugger' 5 | ClientHeight = 480 6 | ClientWidth = 350 7 | Position = Designed 8 | FormFactor.Width = 320 9 | FormFactor.Height = 480 10 | FormFactor.Devices = [Desktop] 11 | DesignerMasterStyle = 0 12 | inline TFMXObjectDebuggerFrame1: TFMXObjectDebuggerFrame 13 | Align = MostRight 14 | Size.Width = 350.000000000000000000 15 | Size.Height = 480.000000000000000000 16 | Size.PlatformDefault = False 17 | inherited Panel1: TPanel 18 | Size.Height = 480.000000000000000000 19 | inherited TabControl1: TTabControl 20 | Size.Height = 377.000000000000000000 21 | inherited TabItemProperties: TTabItem 22 | Size.Width = 74.000000000000000000 23 | ExplicitSize.cx = 50.000000000000000000 24 | ExplicitSize.cy = 26.000000000000000000 25 | inherited sgProp: TStringGrid 26 | Size.Height = 351.000000000000000000 27 | Viewport.Width = 298.000000000000000000 28 | Viewport.Height = 326.000000000000000000 29 | inherited StringColumn1: TStringColumn 30 | Size.Height = 336.000000000000000000 31 | end 32 | inherited StringColumn2: TStringColumn 33 | Size.Height = 336.000000000000000000 34 | end 35 | end 36 | end 37 | inherited TabItemEvents: TTabItem 38 | Size.Width = 54.000000000000000000 39 | ExplicitSize.cx = 50.000000000000000000 40 | ExplicitSize.cy = 26.000000000000000000 41 | inherited sgEvt: TStringGrid 42 | Viewport.Width = 314.000000000000000000 43 | Viewport.Height = 486.000000000000000000 44 | end 45 | end 46 | inherited TabItemData: TTabItem 47 | Size.Width = 44.000000000000000000 48 | ExplicitSize.cx = 50.000000000000000000 49 | ExplicitSize.cy = 26.000000000000000000 50 | inherited sgData: TStringGrid 51 | Viewport.Width = 314.000000000000000000 52 | Viewport.Height = 486.000000000000000000 53 | end 54 | end 55 | end 56 | end 57 | end 58 | end 59 | -------------------------------------------------------------------------------- /DemoDesktop/ObjectDebuggerFMXForm.pas: -------------------------------------------------------------------------------- 1 | unit ObjectDebuggerFMXForm; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 8 | ObjectDebuggerFMXFrame; 9 | 10 | type 11 | TObjectDebuggerFMXForm = class(TForm) 12 | TFMXObjectDebuggerFrame1: TFMXObjectDebuggerFrame; 13 | private 14 | { Private declarations } 15 | public 16 | { Public declarations } 17 | end; 18 | 19 | var 20 | ObjectDebuggerFMXForm1: TObjectDebuggerFMXForm; 21 | 22 | implementation 23 | 24 | {$R *.fmx} 25 | 26 | end. 27 | -------------------------------------------------------------------------------- /DemoDesktop/Project1.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dph2011/Object-Debugger-for-FireMonkey/3f966bac9f19e4bf8cba2c8d87ffc1b092589cf0/DemoDesktop/Project1.res -------------------------------------------------------------------------------- /DemoDesktop/Unit5.fmx: -------------------------------------------------------------------------------- 1 | object Form5: TForm5 2 | Left = 0 3 | Top = 0 4 | Caption = 'FireMonkey Object Debugger Demo' 5 | ClientHeight = 646 6 | ClientWidth = 556 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnShow = FormShow 11 | DesignerMasterStyle = 0 12 | object Edit1: TEdit 13 | Hint = 'Use the inspector to alter the '#39'Text'#39' property.' 14 | Touch.InteractiveGestures = [LongTap, DoubleTap] 15 | Anchors = [akLeft, akTop, akRight] 16 | TabOrder = 1 17 | Position.X = 16.000000000000000000 18 | Position.Y = 205.000000000000000000 19 | Size.Width = 524.000000000000000000 20 | Size.Height = 22.000000000000000000 21 | Size.PlatformDefault = False 22 | ParentShowHint = False 23 | ShowHint = True 24 | end 25 | object ComboBox1: TComboBox 26 | Hint = 'A TComboBox object' 27 | Anchors = [akLeft, akTop, akRight] 28 | Items.Strings = ( 29 | 'Item 0' 30 | 'Item 1' 31 | 'Item 2' 32 | 'Item 3' 33 | 'Item 4' 34 | 'Item 5') 35 | ItemIndex = 4 36 | Position.X = 16.000000000000000000 37 | Position.Y = 384.000000000000000000 38 | Size.Width = 524.000000000000000000 39 | Size.Height = 22.000000000000000000 40 | Size.PlatformDefault = False 41 | TabOrder = 2 42 | ParentShowHint = False 43 | ShowHint = True 44 | end 45 | object ListBox1: TListBox 46 | Hint = 'A TListBox object' 47 | Anchors = [akLeft, akTop, akRight] 48 | Position.X = 16.000000000000000000 49 | Position.Y = 240.000000000000000000 50 | Size.Width = 524.000000000000000000 51 | Size.Height = 129.000000000000000000 52 | Size.PlatformDefault = False 53 | TabOrder = 3 54 | DisableFocusEffect = True 55 | Items.Strings = ( 56 | 'Item 0' 57 | 'Item 1' 58 | 'Item 2' 59 | 'Item 3') 60 | DefaultItemStyles.ItemStyle = '' 61 | DefaultItemStyles.GroupHeaderStyle = '' 62 | DefaultItemStyles.GroupFooterStyle = '' 63 | ParentShowHint = False 64 | ShowHint = True 65 | Viewport.Width = 520.000000000000000000 66 | Viewport.Height = 125.000000000000000000 67 | end 68 | object Memo1: TMemo 69 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 70 | DataDetectorTypes = [] 71 | Lines.Strings = ( 72 | 73 | 'You can use object debugger panel (to the right) to do the follo' + 74 | 'wing:' 75 | '' 76 | ' choose the edit field and change its Text property;' 77 | '' 78 | ' change the cursor;' 79 | '' 80 | ' change the position of a control;' 81 | '' 82 | 83 | ' choose the listbox or combobox and add modify its conten' + 84 | 't (the Items property) or change its selected item (ItemIndex);' 85 | '' 86 | ' change the form'#39's caption.' 87 | '') 88 | ReadOnly = True 89 | TextSettings.WordWrap = True 90 | Anchors = [akLeft, akTop, akRight] 91 | Position.X = 16.000000000000000000 92 | Position.Y = 8.000000000000000000 93 | Size.Width = 524.000000000000000000 94 | Size.Height = 185.000000000000000000 95 | Size.PlatformDefault = False 96 | TabOrder = 4 97 | Viewport.Width = 504.000000000000000000 98 | Viewport.Height = 181.000000000000000000 99 | end 100 | object ColorPanel1: TColorPanel 101 | Hint = 'A TColorPanel object' 102 | Anchors = [akLeft, akTop, akRight, akBottom] 103 | Color = claWhite 104 | Position.X = 16.000000000000000000 105 | Position.Y = 456.000000000000000000 106 | Size.Width = 524.000000000000000000 107 | Size.Height = 182.000000000000000000 108 | Size.PlatformDefault = False 109 | TabOrder = 5 110 | end 111 | object ComboColorBox1: TComboColorBox 112 | Hint = 'A TComboColorBox object' 113 | Anchors = [akLeft, akTop, akRight] 114 | Color = claSteelblue 115 | Position.X = 16.000000000000000000 116 | Position.Y = 424.000000000000000000 117 | Size.Width = 524.000000000000000000 118 | Size.Height = 22.000000000000000000 119 | Size.PlatformDefault = False 120 | TabOrder = 6 121 | end 122 | end 123 | -------------------------------------------------------------------------------- /DemoDesktop/Unit5.pas: -------------------------------------------------------------------------------- 1 | unit Unit5; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 8 | FMX.ListView.Types, 9 | FMX.ListView.Appearances, FMX.ListView.Adapters.Base, System.Rtti, FMX.Menus, 10 | FMX.Ani, FMX.Grid, FMX.Layouts, FMX.ComboEdit, FMX.Controls.Presentation, 11 | FMX.Edit, FMX.ListView, FMX.TabControl, FMX.ListBox, ObjectDebuggerFMXFrame, 12 | FMX.Colors, FMX.ScrollBox, FMX.Memo; 13 | 14 | type 15 | TForm5 = class(TForm) 16 | Edit1: TEdit; 17 | ComboBox1: TComboBox; 18 | ListBox1: TListBox; 19 | Memo1: TMemo; 20 | ColorPanel1: TColorPanel; 21 | ComboColorBox1: TComboColorBox; 22 | procedure FormShow(Sender: TObject); 23 | private 24 | {Private declarations} 25 | public 26 | {Public declarations} 27 | end; 28 | 29 | var 30 | Form5: TForm5; 31 | 32 | implementation 33 | 34 | {$R *.fmx} 35 | 36 | 37 | uses 38 | ObjectDebuggerFMXForm; 39 | 40 | procedure TForm5.FormShow(Sender: TObject); 41 | begin 42 | ObjectDebuggerFMXForm1.Show; 43 | end; 44 | 45 | end. 46 | -------------------------------------------------------------------------------- /DemoMobile/AndroidManifest.template.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | <%uses-permission%> 12 | 13 | 21 | 22 | <%application-meta-data%> 23 | <%services%> 24 | 26 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 38 | <%activity%> 39 | <%receivers%> 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /DemoMobile/Demo.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dph2011/Object-Debugger-for-FireMonkey/3f966bac9f19e4bf8cba2c8d87ffc1b092589cf0/DemoMobile/Demo.res -------------------------------------------------------------------------------- /DemoMobile/DemoMobile.deployproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 12 5 | 6 | 7 | 8 | 9 | 10 | 11 | DemoMobile\ 12 | DemoMobile.exe 13 | ProjectOutput 14 | 0 15 | 16 | 17 | True 18 | True 19 | 20 | 21 | 22 | 23 | DemoMobile.app\Contents\MacOS\ 24 | DemoMobile 25 | ProjectOutput 26 | 1 27 | 28 | 29 | True 30 | True 31 | 32 | 33 | DemoMobile.app\Contents\ 34 | Info.plist 35 | ProjectOSXInfoPList 36 | 1 37 | 38 | 39 | True 40 | 41 | 42 | DemoMobile.app\Contents\Resources\ 43 | DemoMobile.icns 44 | ProjectOSXResource 45 | 1 46 | 47 | 48 | True 49 | 50 | 51 | DemoMobile.app\Contents\MacOS\ 52 | libcgunwind.1.0.dylib 53 | DependencyModule 54 | 1 55 | 56 | 57 | True 58 | 59 | 60 | DemoMobile.app\../\ 61 | DemoMobile.entitlements 62 | ProjectOSXEntitlements 63 | 1 64 | 65 | 66 | True 67 | 68 | 69 | 70 | 71 | DemoMobile\res\drawable-ldpi\ 72 | ic_launcher.png 73 | Android_LauncherIcon36 74 | 1 75 | 76 | 77 | True 78 | 79 | 80 | DemoMobile\res\drawable-hdpi\ 81 | ic_launcher.png 82 | Android_LauncherIcon72 83 | 1 84 | 85 | 86 | True 87 | 88 | 89 | DemoMobile\res\drawable-small\ 90 | splash_image.png 91 | Android_SplashImage426 92 | 1 93 | 94 | 95 | True 96 | 97 | 98 | DemoMobile\library\lib\mips\ 99 | libDemoMobile.so 100 | AndroidLibnativeMipsFile 101 | 1 102 | 103 | 104 | True 105 | 106 | 107 | DemoMobile\res\drawable\ 108 | splash_image_def.xml 109 | AndroidSplashImageDef 110 | 1 111 | 112 | 113 | True 114 | 115 | 116 | DemoMobile\ 117 | AndroidManifest.xml 118 | ProjectAndroidManifest 119 | 1 120 | 121 | 122 | True 123 | 124 | 125 | DemoMobile\library\lib\armeabi\ 126 | libDemoMobile.so 127 | AndroidLibnativeArmeabiFile 128 | 1 129 | 130 | 131 | True 132 | 133 | 134 | DemoMobile\res\drawable-xxhdpi\ 135 | ic_launcher.png 136 | Android_LauncherIcon144 137 | 1 138 | 139 | 140 | True 141 | 142 | 143 | DemoMobile\res\drawable-xhdpi\ 144 | ic_launcher.png 145 | Android_LauncherIcon96 146 | 1 147 | 148 | 149 | True 150 | 151 | 152 | DemoMobile\res\drawable-large\ 153 | splash_image.png 154 | Android_SplashImage640 155 | 1 156 | 157 | 158 | True 159 | 160 | 161 | DemoMobile\res\drawable-xlarge\ 162 | splash_image.png 163 | Android_SplashImage960 164 | 1 165 | 166 | 167 | True 168 | 169 | 170 | DemoMobile\library\lib\armeabi-v7a\ 171 | libDemoMobile.so 172 | ProjectOutput 173 | 1 174 | 175 | 176 | True 177 | True 178 | 179 | 180 | DemoMobile\res\drawable-mdpi\ 181 | ic_launcher.png 182 | Android_LauncherIcon48 183 | 1 184 | 185 | 186 | True 187 | 188 | 189 | DemoMobile\library\lib\armeabi-v7a\ 190 | gdbserver 191 | AndroidGDBServer 192 | 1 193 | 194 | 195 | True 196 | 197 | 198 | DemoMobile\res\values\ 199 | styles.xml 200 | AndroidSplashStyles 201 | 1 202 | 203 | 204 | True 205 | 206 | 207 | DemoMobile\classes\ 208 | classes.dex 209 | AndroidClassesDexFile 210 | 1 211 | 212 | 213 | True 214 | 215 | 216 | DemoMobile\res\drawable-normal\ 217 | splash_image.png 218 | Android_SplashImage470 219 | 1 220 | 221 | 222 | True 223 | 224 | 225 | DemoMobile\library\lib\x86\ 226 | libDemoMobile.so 227 | AndroidLibnativeX86File 228 | 1 229 | 230 | 231 | True 232 | 233 | 234 | 235 | 236 | DemoMobile.app\ 237 | FM_ApplicationIcon_144x144.png 238 | iPad_AppIcon144 239 | 0 240 | 241 | 242 | True 243 | 244 | 245 | DemoMobile.app\ 246 | DemoMobile 247 | ProjectOutput 248 | 1 249 | 250 | 251 | True 252 | True 253 | 254 | 255 | DemoMobile.app\ 256 | FM_SpotlightSearchIcon_100x100.png 257 | iPad_SpotLight100 258 | 0 259 | 260 | 261 | True 262 | 263 | 264 | DemoMobile.app\ 265 | FM_SpotlightSearchIcon_40x40.png 266 | iPad_SpotLight40 267 | 0 268 | 269 | 270 | True 271 | 272 | 273 | DemoMobile.app\ 274 | FM_ApplicationIcon_60x60.png 275 | iPhone_AppIcon60 276 | 0 277 | 278 | 279 | True 280 | 281 | 282 | DemoMobile.app\ 283 | FM_ApplicationIcon_114x114.png 284 | iPhone_AppIcon114 285 | 0 286 | 287 | 288 | True 289 | 290 | 291 | DemoMobile.app\ 292 | Default-Portrait@2x.png 293 | iPad_Launch1536 294 | 1 295 | 296 | 297 | True 298 | 299 | 300 | DemoMobile.app\ 301 | DemoMobile.entitlements 302 | ProjectiOSEntitlements 303 | 0 304 | 305 | 306 | True 307 | 308 | 309 | DemoMobile.app\ 310 | FM_ApplicationIcon_152x152.png 311 | iPad_AppIcon152 312 | 0 313 | 314 | 315 | True 316 | 317 | 318 | DemoMobile.app\ 319 | Default-736h@3x.png 320 | iPhone_Launch1242 321 | 0 322 | 323 | 324 | True 325 | 326 | 327 | DemoMobile.app\ 328 | Default-667h@2x.png 329 | iPhone_Launch750 330 | 0 331 | 332 | 333 | True 334 | 335 | 336 | DemoMobile.app\ 337 | Default~ipad.png 338 | iPad_Launch768 339 | 1 340 | 341 | 342 | True 343 | 344 | 345 | DemoMobile.app\ 346 | FM_ApplicationIcon_72x72.png 347 | iPad_AppIcon72 348 | 0 349 | 350 | 351 | True 352 | 353 | 354 | DemoMobile.app\ 355 | libcgunwind.1.0.dylib 356 | DependencyModule 357 | 1 358 | 359 | 360 | True 361 | 362 | 363 | DemoMobile.app\ 364 | Default-Portrait~ipad.png 365 | iPad_Launch768x1024 366 | 0 367 | 368 | 369 | True 370 | 371 | 372 | DemoMobile.app\ 373 | Default@2x.png 374 | iPhone_Launch640 375 | 1 376 | 377 | 378 | True 379 | 380 | 381 | DemoMobile.app\ 382 | FM_SpotlightSearchIcon_40x40.png 383 | iPhone_Spotlight40 384 | 0 385 | 386 | 387 | True 388 | 389 | 390 | DemoMobile.app\ 391 | Default-Landscape@2x~ipad.png 392 | iPad_Launch2048x1536 393 | 0 394 | 395 | 396 | True 397 | 398 | 399 | DemoMobile.app\ 400 | FM_ApplicationIcon_87x87.png 401 | iPhone_AppIcon87 402 | 0 403 | 404 | 405 | True 406 | 407 | 408 | DemoMobile.app\ 409 | Default-Landscape~ipad.png 410 | iPad_Launch1024x768 411 | 0 412 | 413 | 414 | True 415 | 416 | 417 | DemoMobile.app\ 418 | Default.png 419 | iPhone_Launch320 420 | 1 421 | 422 | 423 | True 424 | 425 | 426 | DemoMobile.app\ 427 | FM_ApplicationIcon_180x180.png 428 | iPhone_AppIcon180 429 | 0 430 | 431 | 432 | True 433 | 434 | 435 | DemoMobile.app\ 436 | Info.plist 437 | ProjectiOSInfoPList 438 | 1 439 | 440 | 441 | True 442 | 443 | 444 | DemoMobile.app\ 445 | FM_ApplicationIcon_76x76.png 446 | iPad_AppIcon76 447 | 0 448 | 449 | 450 | True 451 | 452 | 453 | DemoMobile.app\ 454 | libPCRE.dylib 455 | DependencyModule 456 | 1 457 | 458 | 459 | True 460 | 461 | 462 | DemoMobile.app\ 463 | FM_SettingIcon_58x58.png 464 | iPad_Setting58 465 | 0 466 | 467 | 468 | True 469 | 470 | 471 | DemoMobile.app\ 472 | Default-Portrait@2x~ipad.png 473 | iPad_Launch1536x2048 474 | 0 475 | 476 | 477 | True 478 | 479 | 480 | DemoMobile.app\ 481 | Default-Landscape-736h@3x.png 482 | iPhone_Launch2208 483 | 0 484 | 485 | 486 | True 487 | 488 | 489 | DemoMobile.app\ 490 | FM_SpotlightSearchIcon_80x80.png 491 | iPad_SpotLight80 492 | 0 493 | 494 | 495 | True 496 | 497 | 498 | DemoMobile.app\ 499 | FM_ApplicationIcon_120x120.png 500 | iPhone_AppIcon120 501 | 0 502 | 503 | 504 | True 505 | 506 | 507 | DemoMobile.app\ 508 | FM_ApplicationIcon_57x57.png 509 | iPhone_AppIcon57 510 | 0 511 | 512 | 513 | True 514 | 515 | 516 | DemoMobile.app\ 517 | Default-Landscape@2x.png 518 | iPad_Launch2048 519 | 1 520 | 521 | 522 | True 523 | 524 | 525 | DemoMobile.app\ 526 | FM_SpotlightSearchIcon_50x50.png 527 | iPad_SpotLight50 528 | 0 529 | 530 | 531 | True 532 | 533 | 534 | DemoMobile.app\ 535 | Default-568h@2x.png 536 | iPhone_Launch640x1136 537 | 1 538 | 539 | 540 | True 541 | 542 | 543 | DemoMobile.app\ 544 | FM_SpotlightSearchIcon_29x29.png 545 | iPhone_Spotlight29 546 | 0 547 | 548 | 549 | True 550 | 551 | 552 | DemoMobile.app\ 553 | FM_SettingIcon_29x29.png 554 | iPad_Setting29 555 | 0 556 | 557 | 558 | True 559 | 560 | 561 | DemoMobile.app\ 562 | Default-Landscape.png 563 | iPad_Launch1024 564 | 1 565 | 566 | 567 | True 568 | 569 | 570 | 571 | -------------------------------------------------------------------------------- /DemoMobile/DemoMobile.dpr: -------------------------------------------------------------------------------- 1 | program DemoMobile; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | Unit3 in 'Unit3.pas' {Form3}, 7 | FormMessage in '..\FormMessage.pas' {MessageForm}, 8 | ObjectDebuggerFMXFrame in '..\ObjectDebuggerFMXFrame.pas' {FMXObjectDebuggerFrame: TFrame}; 9 | 10 | {$R *.res} 11 | 12 | begin 13 | Application.Initialize; 14 | Application.CreateForm(TForm3, Form3); 15 | Application.CreateForm(TMessageForm, MessageForm); 16 | Application.CreateForm(TFMXObjectDebuggerFrame, FMXObjectDebuggerFrame); 17 | Application.Run; 18 | end. 19 | -------------------------------------------------------------------------------- /DemoMobile/DemoMobile.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dph2011/Object-Debugger-for-FireMonkey/3f966bac9f19e4bf8cba2c8d87ffc1b092589cf0/DemoMobile/DemoMobile.res -------------------------------------------------------------------------------- /DemoMobile/Entitlement.TemplateOSX32.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | <%appSandboxKeys%> 6 | 7 | 8 | -------------------------------------------------------------------------------- /DemoMobile/Entitlement.TemplateiOS.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | <%getTaskAllowKey%> 6 | <%applicationIdentifier%> 7 | <%pushNotificationKey%> 8 | <%keychainAccessGroups%> 9 | 10 | 11 | -------------------------------------------------------------------------------- /DemoMobile/Unit3.fmx: -------------------------------------------------------------------------------- 1 | object Form3: TForm3 2 | Left = 0 3 | Top = 0 4 | Caption = 'FireMonkey Object Debugger Demo' 5 | ClientHeight = 646 6 | ClientWidth = 640 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | DesignerMasterStyle = 0 11 | object Edit1: TEdit 12 | Hint = 'Use the inspector to alter the '#39'Text'#39' property.' 13 | Touch.InteractiveGestures = [LongTap, DoubleTap] 14 | Anchors = [akLeft, akTop, akRight] 15 | TabOrder = 1 16 | Position.X = 8.000000000000000000 17 | Position.Y = 205.000000000000000000 18 | Size.Width = 273.000000000000000000 19 | Size.Height = 22.000000000000000000 20 | Size.PlatformDefault = False 21 | ParentShowHint = False 22 | ShowHint = True 23 | end 24 | object ComboBox1: TComboBox 25 | Hint = 'A TComboBox object' 26 | Anchors = [akLeft, akTop, akRight] 27 | Items.Strings = ( 28 | 'Item 0' 29 | 'Item 1' 30 | 'Item 2' 31 | 'Item 3' 32 | 'Item 4' 33 | 'Item 5') 34 | ItemIndex = 4 35 | Position.X = 8.000000000000000000 36 | Position.Y = 384.000000000000000000 37 | Size.Width = 273.000000000000000000 38 | Size.Height = 22.000000000000000000 39 | Size.PlatformDefault = False 40 | TabOrder = 2 41 | ParentShowHint = False 42 | ShowHint = True 43 | end 44 | object ListBox1: TListBox 45 | Hint = 'A TListBox object' 46 | Anchors = [akLeft, akTop, akRight] 47 | Position.X = 8.000000000000000000 48 | Position.Y = 240.000000000000000000 49 | Size.Width = 273.000000000000000000 50 | Size.Height = 129.000000000000000000 51 | Size.PlatformDefault = False 52 | TabOrder = 3 53 | DisableFocusEffect = True 54 | ItemIndex = 2 55 | Items.Strings = ( 56 | 'Item 0' 57 | 'Item 1' 58 | 'Item 2' 59 | 'Item 3') 60 | DefaultItemStyles.ItemStyle = '' 61 | DefaultItemStyles.GroupHeaderStyle = '' 62 | DefaultItemStyles.GroupFooterStyle = '' 63 | ParentShowHint = False 64 | ShowHint = True 65 | Viewport.Width = 269.000000000000000000 66 | Viewport.Height = 125.000000000000000000 67 | end 68 | object Memo1: TMemo 69 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 70 | DataDetectorTypes = [] 71 | Lines.Strings = ( 72 | 73 | 'You can use object debugger panel (to the right) to do the follo' + 74 | 'wing:' 75 | '' 76 | ' choose the edit field and change its Text property;' 77 | '' 78 | ' change the cursor;' 79 | '' 80 | ' change the position of a control;' 81 | '' 82 | 83 | ' choose the listbox or combobox and add modify its conten' + 84 | 't (the Items property) or change its selected item (ItemIndex);' 85 | '' 86 | ' change the form'#39's caption.' 87 | '') 88 | ReadOnly = True 89 | TextSettings.WordWrap = True 90 | Anchors = [akLeft, akTop, akRight] 91 | Position.X = 8.000000000000000000 92 | Position.Y = 8.000000000000000000 93 | Size.Width = 273.000000000000000000 94 | Size.Height = 185.000000000000000000 95 | Size.PlatformDefault = False 96 | TabOrder = 4 97 | Viewport.Width = 253.000000000000000000 98 | Viewport.Height = 181.000000000000000000 99 | end 100 | object ColorPanel1: TColorPanel 101 | Hint = 'A TColorPanel object' 102 | Anchors = [akLeft, akTop, akRight, akBottom] 103 | Color = claWhite 104 | Position.X = 8.000000000000000000 105 | Position.Y = 456.000000000000000000 106 | Size.Width = 273.000000000000000000 107 | Size.Height = 182.000000000000000000 108 | Size.PlatformDefault = False 109 | TabOrder = 5 110 | end 111 | object ComboColorBox1: TComboColorBox 112 | Hint = 'A TComboColorBox object' 113 | Anchors = [akLeft, akTop, akRight] 114 | Color = claSteelblue 115 | Position.X = 8.000000000000000000 116 | Position.Y = 424.000000000000000000 117 | Size.Width = 273.000000000000000000 118 | Size.Height = 22.000000000000000000 119 | Size.PlatformDefault = False 120 | TabOrder = 6 121 | end 122 | inline TFMXObjectDebuggerFrame1: TFMXObjectDebuggerFrame 123 | Align = MostRight 124 | Position.X = 290.000000000000000000 125 | Size.Width = 350.000000000000000000 126 | Size.Height = 646.000000000000000000 127 | Size.PlatformDefault = False 128 | inherited Panel1: TPanel 129 | Anchors = [akLeft, akTop, akRight, akBottom] 130 | Size.Height = 646.000000000000000000 131 | inherited TabControl1: TTabControl 132 | Size.Height = 543.000000000000000000 133 | inherited TabItemProperties: TTabItem 134 | ExplicitSize.cx = 50.000000000000000000 135 | ExplicitSize.cy = 26.000000000000000000 136 | inherited sgProp: TStringGrid 137 | Size.Height = 517.000000000000000000 138 | Viewport.Width = 298.000000000000000000 139 | Viewport.Height = 492.000000000000000000 140 | end 141 | end 142 | inherited TabItemEvents: TTabItem 143 | ExplicitSize.cx = 50.000000000000000000 144 | ExplicitSize.cy = 26.000000000000000000 145 | inherited sgEvt: TStringGrid 146 | Viewport.Width = 314.000000000000000000 147 | Viewport.Height = 486.000000000000000000 148 | end 149 | end 150 | inherited TabItemData: TTabItem 151 | ExplicitSize.cx = 50.000000000000000000 152 | ExplicitSize.cy = 26.000000000000000000 153 | inherited sgData: TStringGrid 154 | Viewport.Width = 314.000000000000000000 155 | Viewport.Height = 486.000000000000000000 156 | end 157 | end 158 | end 159 | end 160 | end 161 | end 162 | -------------------------------------------------------------------------------- /DemoMobile/Unit3.pas: -------------------------------------------------------------------------------- 1 | unit Unit3; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 8 | FMX.ListView.Types, 9 | FMX.ListView.Appearances, FMX.ListView.Adapters.Base, System.Rtti, FMX.Menus, 10 | FMX.Ani, FMX.Grid, FMX.Layouts, FMX.ComboEdit, FMX.Controls.Presentation, 11 | FMX.Edit, FMX.ListView, FMX.TabControl, FMX.ListBox, ObjectDebuggerFMXFrame, 12 | FMX.Colors, FMX.ScrollBox, FMX.Memo; 13 | 14 | type 15 | TForm3 = class(TForm) 16 | Edit1: TEdit; 17 | ComboBox1: TComboBox; 18 | ListBox1: TListBox; 19 | Memo1: TMemo; 20 | ColorPanel1: TColorPanel; 21 | ComboColorBox1: TComboColorBox; 22 | TFMXObjectDebuggerFrame1: TFMXObjectDebuggerFrame; 23 | private 24 | {Private declarations} 25 | public 26 | {Public declarations} 27 | end; 28 | 29 | var 30 | Form3: TForm3; 31 | 32 | implementation 33 | 34 | {$R *.fmx} 35 | 36 | end. 37 | -------------------------------------------------------------------------------- /Entitlement.TemplateOSX32.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | <%appSandboxKeys%> 6 | 7 | 8 | -------------------------------------------------------------------------------- /Entitlement.TemplateiOS.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | <%getTaskAllowKey%> 6 | <%applicationIdentifier%> 7 | <%pushNotificationKey%> 8 | <%keychainAccessGroups%> 9 | 10 | 11 | -------------------------------------------------------------------------------- /FormMessage.fmx: -------------------------------------------------------------------------------- 1 | object MessageForm: TMessageForm 2 | Left = 0 3 | Top = 0 4 | BorderStyle = Single 5 | Caption = 'Form3' 6 | ClientHeight = 400 7 | ClientWidth = 350 8 | FormFactor.Width = 320 9 | FormFactor.Height = 480 10 | FormFactor.Devices = [Desktop] 11 | DesignerMasterStyle = 0 12 | object ButtonOK: TButton 13 | Anchors = [akLeft, akBottom] 14 | ModalResult = 1 15 | Position.X = 16.000000000000000000 16 | Position.Y = 364.000000000000000000 17 | TabOrder = 0 18 | Text = '&OK' 19 | end 20 | object Button2: TButton 21 | Anchors = [akRight, akBottom] 22 | ModalResult = 2 23 | Position.X = 254.000000000000000000 24 | Position.Y = 364.000000000000000000 25 | TabOrder = 1 26 | Text = '&Cancel' 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /FormMessage.pas: -------------------------------------------------------------------------------- 1 | unit FormMessage; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 8 | FMX.Controls.Presentation, FMX.StdCtrls; 9 | 10 | type 11 | TMessageForm = class(TForm) 12 | ButtonOK: TButton; 13 | Button2: TButton; 14 | private 15 | {Private declarations} 16 | TopPanel: TPanel; 17 | public 18 | {Public declarations} 19 | procedure AddPanel(panel: TPanel); 20 | procedure ShowMessage(str, caption: string); 21 | end; 22 | 23 | var 24 | MessageForm: TMessageForm; 25 | 26 | implementation 27 | 28 | {$R *.fmx} 29 | 30 | 31 | uses 32 | FMX.Memo // TMemo 33 | ; 34 | 35 | procedure TMessageForm.AddPanel(panel: TPanel); 36 | var 37 | margin: Single; 38 | begin 39 | if (nil <> TopPanel) and (TopPanel.Parent = Self) then 40 | begin 41 | Self.RemoveObject(TopPanel); 42 | FreeAndNil(TopPanel); 43 | end; 44 | 45 | Self.AddObject(panel); 46 | panel.Position.X := 0; 47 | panel.Position.Y := 0; 48 | panel.Width := Self.Width; 49 | margin := Self.ClientHeight - (ButtonOK.Position.Y + ButtonOK.Height); 50 | panel.Height := Self.ClientHeight - 2 * margin - ButtonOK.Height; 51 | 52 | panel.Align := TAlignLayout.None; 53 | panel.Anchors := [TAnchorKind.akTop, TAnchorKind.akBottom, TAnchorKind.akLeft, TAnchorKind.akRight]; 54 | 55 | TopPanel := panel; 56 | end; 57 | 58 | procedure TMessageForm.ShowMessage(str, caption: string); 59 | var 60 | P: TPanel; 61 | Memo1: TMemo; 62 | begin 63 | P := TPanel.Create(Self); 64 | try 65 | //middle of the screen 66 | Self.Left := Screen.Width div 2 - 125; 67 | Self.Top := Screen.Height div 2 - 150; 68 | Self.caption := caption; 69 | 70 | AddPanel(P); 71 | Memo1 := TMemo.Create(P); 72 | with Memo1 do 73 | begin 74 | Parent := P; 75 | Width := P.Width - 30; 76 | Height := P.Height - 30; 77 | ReadOnly := True; 78 | Position.X := 15; 79 | Position.Y := 15; 80 | WordWrap := True; 81 | Align := TAlignLayout.None; 82 | Anchors := [TAnchorKind.akTop, TAnchorKind.akBottom, TAnchorKind.akLeft, TAnchorKind.akRight]; 83 | Lines.Text := str; 84 | end; 85 | // Plain old ShowModal not supported on Android so use newer version with support for callback. 86 | Self.ShowModal( 87 | procedure(ModalResult: TModalResult) 88 | begin 89 | Self.Visible := False; 90 | end); 91 | finally 92 | 93 | end; 94 | end; 95 | 96 | end. 97 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /ObjectDebuggerFMX.dpk: -------------------------------------------------------------------------------- 1 | package ObjectDebuggerFMX; 2 | 3 | {$R *.res} 4 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 5 | {$ALIGN 8} 6 | {$ASSERTIONS ON} 7 | {$BOOLEVAL OFF} 8 | {$DEBUGINFO OFF} 9 | {$EXTENDEDSYNTAX ON} 10 | {$IMPORTEDDATA ON} 11 | {$IOCHECKS ON} 12 | {$LOCALSYMBOLS ON} 13 | {$LONGSTRINGS ON} 14 | {$OPENSTRINGS ON} 15 | {$OPTIMIZATION OFF} 16 | {$OVERFLOWCHECKS OFF} 17 | {$RANGECHECKS OFF} 18 | {$REFERENCEINFO ON} 19 | {$SAFEDIVIDE OFF} 20 | {$STACKFRAMES ON} 21 | {$TYPEDADDRESS OFF} 22 | {$VARSTRINGCHECKS ON} 23 | {$WRITEABLECONST OFF} 24 | {$MINENUMSIZE 1} 25 | {$IMAGEBASE $400000} 26 | {$DEFINE DEBUG} 27 | {$ENDIF IMPLICITBUILDING} 28 | {$DESCRIPTION 'Object Debugger for FireMonkey'} 29 | {$IMPLICITBUILD ON} 30 | 31 | 32 | requires 33 | rtl, 34 | fmx; 35 | 36 | contains 37 | ObjectDebuggerFMXFrame in 'ObjectDebuggerFMXFrame.pas' {FMXObjectDebuggerFrame} , 38 | FormMessage in 'FormMessage.pas'; 39 | 40 | end. 41 | -------------------------------------------------------------------------------- /ObjectDebuggerFMX.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {CF593233-C314-4EAD-8CF5-4BAC87F3C353} 4 | ObjectDebuggerFMX.dpk 5 | 18.1 6 | FMX 7 | True 8 | Debug 9 | Win32 10 | 1119 11 | Package 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Base 54 | true 55 | 56 | 57 | true 58 | Cfg_1 59 | true 60 | true 61 | 62 | 63 | true 64 | Base 65 | true 66 | 67 | 68 | Object Debugger for FireMonkey 69 | All 70 | true 71 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 72 | ObjectDebuggerFMX 73 | true 74 | .\$(Platform)\$(Config) 75 | .\$(Platform)\$(Config) 76 | false 77 | false 78 | false 79 | false 80 | false 81 | 82 | 83 | Debug 84 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 85 | android-support-v4.dex.jar;apk-expansion.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar 86 | None 87 | rtl;fmx;$(DCC_UsePackage) 88 | 89 | 90 | $(MSBuildProjectName) 91 | true 92 | iPhoneAndiPad 93 | Debug 94 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes= 95 | None 96 | rtl;fmx;$(DCC_UsePackage) 97 | 98 | 99 | $(MSBuildProjectName) 100 | true 101 | iPhoneAndiPad 102 | Debug 103 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes= 104 | None 105 | rtl;fmx;$(DCC_UsePackage) 106 | 107 | 108 | iPhoneAndiPad 109 | true 110 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes= 111 | None 112 | rtl;fmx;$(DCC_UsePackage) 113 | 114 | 115 | Debug 116 | CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user 117 | rtl;fmx;$(DCC_UsePackage) 118 | 119 | 120 | 1033 121 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 122 | CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= 123 | true 124 | rtl;fmx;$(DCC_UsePackage) 125 | 126 | 127 | 1033 128 | true 129 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 130 | CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= 131 | rtl;fmx;$(DCC_UsePackage) 132 | 133 | 134 | DEBUG;$(DCC_Define) 135 | true 136 | false 137 | true 138 | true 139 | true 140 | 141 | 142 | false 143 | 144 | 145 | false 146 | RELEASE;$(DCC_Define) 147 | 0 148 | 0 149 | 150 | 151 | 152 | MainSource 153 | 154 | 155 | 156 | 157 |
FMXObjectDebuggerFrame
158 |
159 | 160 | 161 | Cfg_2 162 | Base 163 | 164 | 165 | Base 166 | 167 | 168 | Cfg_1 169 | Base 170 | 171 |
172 | 173 | Delphi.Personality.12 174 | Package 175 | 176 | 177 | 178 | ObjectDebuggerFMX.dpk 179 | 180 | 181 | 182 | 183 | 184 | true 185 | 186 | 187 | 188 | 189 | true 190 | 191 | 192 | 193 | 194 | ObjectDebuggerFMX.bpl 195 | true 196 | 197 | 198 | 199 | 200 | true 201 | 202 | 203 | 204 | 205 | 206 | Contents\Resources 207 | 1 208 | 209 | 210 | 211 | 212 | classes 213 | 1 214 | 215 | 216 | 217 | 218 | Contents\MacOS 219 | 0 220 | 221 | 222 | 1 223 | 224 | 225 | 226 | 227 | 1 228 | 229 | 230 | 1 231 | 232 | 233 | 1 234 | 235 | 236 | 237 | 238 | res\drawable-xxhdpi 239 | 1 240 | 241 | 242 | 243 | 244 | library\lib\mips 245 | 1 246 | 247 | 248 | 249 | 250 | 0 251 | 252 | 253 | 1 254 | 255 | 256 | 1 257 | 258 | 259 | 1 260 | 261 | 262 | library\lib\armeabi-v7a 263 | 1 264 | 265 | 266 | 1 267 | 268 | 269 | 270 | 271 | 0 272 | 273 | 274 | 1 275 | .framework 276 | 277 | 278 | 279 | 280 | 1 281 | 282 | 283 | 1 284 | 285 | 286 | 1 287 | 288 | 289 | 290 | 291 | 1 292 | 293 | 294 | 1 295 | 296 | 297 | 1 298 | 299 | 300 | 301 | 302 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 303 | 1 304 | 305 | 306 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 307 | 1 308 | 309 | 310 | 311 | 312 | library\lib\x86 313 | 1 314 | 315 | 316 | 317 | 318 | 1 319 | 320 | 321 | 1 322 | 323 | 324 | 1 325 | 326 | 327 | 328 | 329 | 330 | library\lib\armeabi 331 | 1 332 | 333 | 334 | 335 | 336 | 0 337 | 338 | 339 | 1 340 | 341 | 342 | 1 343 | 344 | 345 | 346 | 347 | 1 348 | 349 | 350 | 1 351 | 352 | 353 | 1 354 | 355 | 356 | 357 | 358 | res\drawable-normal 359 | 1 360 | 361 | 362 | 363 | 364 | res\drawable-xhdpi 365 | 1 366 | 367 | 368 | 369 | 370 | res\drawable-large 371 | 1 372 | 373 | 374 | 375 | 376 | 1 377 | 378 | 379 | 1 380 | 381 | 382 | 1 383 | 384 | 385 | 386 | 387 | 388 | res\drawable-hdpi 389 | 1 390 | 391 | 392 | 393 | 394 | library\lib\armeabi-v7a 395 | 1 396 | 397 | 398 | 399 | 400 | 401 | 402 | 1 403 | 404 | 405 | 1 406 | 407 | 408 | 1 409 | 410 | 411 | 412 | 413 | res\values 414 | 1 415 | 416 | 417 | 418 | 419 | res\drawable-small 420 | 1 421 | 422 | 423 | 424 | 425 | res\drawable 426 | 1 427 | 428 | 429 | 430 | 431 | 1 432 | 433 | 434 | 1 435 | 436 | 437 | 1 438 | 439 | 440 | 441 | 442 | 1 443 | 444 | 445 | 446 | 447 | res\drawable 448 | 1 449 | 450 | 451 | 452 | 453 | 0 454 | 455 | 456 | 0 457 | 458 | 459 | 0 460 | 461 | 462 | 0 463 | 464 | 465 | 0 466 | 467 | 468 | 0 469 | 470 | 471 | 472 | 473 | library\lib\armeabi-v7a 474 | 1 475 | 476 | 477 | 478 | 479 | 0 480 | .bpl 481 | 482 | 483 | 1 484 | .dylib 485 | 486 | 487 | 1 488 | .dylib 489 | 490 | 491 | 1 492 | .dylib 493 | 494 | 495 | 1 496 | .dylib 497 | 498 | 499 | 500 | 501 | res\drawable-mdpi 502 | 1 503 | 504 | 505 | 506 | 507 | res\drawable-xlarge 508 | 1 509 | 510 | 511 | 512 | 513 | res\drawable-ldpi 514 | 1 515 | 516 | 517 | 518 | 519 | 0 520 | .dll;.bpl 521 | 522 | 523 | 1 524 | .dylib 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | True 537 | True 538 | True 539 | True 540 | True 541 | True 542 | True 543 | 544 | 545 | 12 546 | 547 | 548 | 549 | 550 |
551 | -------------------------------------------------------------------------------- /ObjectDebuggerFMX.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dph2011/Object-Debugger-for-FireMonkey/3f966bac9f19e4bf8cba2c8d87ffc1b092589cf0/ObjectDebuggerFMX.res -------------------------------------------------------------------------------- /ObjectDebuggerFMXFrame.fmx: -------------------------------------------------------------------------------- 1 | object FMXObjectDebuggerFrame: TFMXObjectDebuggerFrame 2 | Size.Width = 350.000000000000000000 3 | Size.Height = 640.000000000000000000 4 | Size.PlatformDefault = False 5 | OnMouseDown = FrameMouseDown 6 | object Panel1: TPanel 7 | Anchors = [akLeft, akTop, akRight, akBottom] 8 | Size.Width = 350.000000000000000000 9 | Size.Height = 640.000000000000000000 10 | Size.PlatformDefault = False 11 | TabOrder = 8 12 | OnMouseDown = FrameMouseDown 13 | object cbForms: TComboBox 14 | Anchors = [akLeft, akTop, akRight] 15 | Position.X = 16.000000000000000000 16 | Position.Y = 16.000000000000000000 17 | Size.Width = 318.000000000000000000 18 | Size.Height = 22.000000000000000000 19 | Size.PlatformDefault = False 20 | TabOrder = 0 21 | OnChange = cbFormsChange 22 | end 23 | object cbComps: TComboBox 24 | Anchors = [akLeft, akTop, akRight] 25 | Position.X = 16.000000000000000000 26 | Position.Y = 48.000000000000000000 27 | Size.Width = 318.000000000000000000 28 | Size.Height = 22.000000000000000000 29 | Size.PlatformDefault = False 30 | TabOrder = 1 31 | OnChange = cbCompsChange 32 | end 33 | object TabControl1: TTabControl 34 | Anchors = [akLeft, akTop, akRight, akBottom] 35 | Position.X = 16.000000000000000000 36 | Position.Y = 88.000000000000000000 37 | Size.Width = 318.000000000000000000 38 | Size.Height = 537.000000000000000000 39 | Size.PlatformDefault = False 40 | TabHeight = 26.000000000000000000 41 | TabIndex = 0 42 | TabOrder = 5 43 | TabPosition = PlatformDefault 44 | object TabItemProperties: TTabItem 45 | CustomIcon = < 46 | item 47 | end> 48 | IsSelected = True 49 | Size.Width = 74.000000000000000000 50 | Size.Height = 26.000000000000000000 51 | Size.PlatformDefault = False 52 | StyleLookup = '' 53 | TabOrder = 0 54 | Text = 'Properties' 55 | ExplicitSize.cx = 50.000000000000000000 56 | ExplicitSize.cy = 26.000000000000000000 57 | object ListSet: TListView 58 | ItemAppearanceClassName = 'TListItemAppearance' 59 | ItemEditAppearanceClassName = 'TListItemShowCheckAppearance' 60 | HeaderAppearanceClassName = 'TListHeaderObjects' 61 | FooterAppearanceClassName = 'TListHeaderObjects' 62 | EditMode = True 63 | Position.X = 128.000000000000000000 64 | Position.Y = 88.000000000000000000 65 | TabOrder = 7 66 | OnExit = RefreshOnExit 67 | ItemAppearance.ItemHeight = 22 68 | ItemAppearance.ItemEditHeight = 22 69 | ItemAppearance.HeaderHeight = 1 70 | ItemAppearance.FooterHeight = 1 71 | OnClick = ListSetClick 72 | NativeOptions = [Styled] 73 | end 74 | object EditNum: TEdit 75 | Touch.InteractiveGestures = [LongTap, DoubleTap] 76 | TabOrder = 4 77 | Position.X = 40.000000000000000000 78 | OnChange = EditChange 79 | OnKeyDown = EditNumKeyDown 80 | OnExit = EditNumExit 81 | end 82 | object EditCh: TEdit 83 | Touch.InteractiveGestures = [LongTap, DoubleTap] 84 | TabOrder = 5 85 | Position.X = 16.000000000000000000 86 | OnChange = EditChange 87 | OnExit = EditChExit 88 | end 89 | object EditStr: TEdit 90 | Touch.InteractiveGestures = [LongTap, DoubleTap] 91 | TabOrder = 6 92 | Position.X = 24.000000000000000000 93 | OnChange = EditChange 94 | OnExit = EditStrExit 95 | end 96 | object ComboEnum: TComboEdit 97 | Touch.InteractiveGestures = [LongTap, DoubleTap] 98 | TabOrder = 3 99 | ItemHeight = 19.000000000000000000 100 | ItemIndex = -1 101 | Position.X = 40.000000000000000000 102 | OnChange = ComboEnumChange 103 | OnDblClick = ComboEnumDblClick 104 | OnExit = RefreshOnExit 105 | end 106 | object ComboCursor: TComboEdit 107 | Touch.InteractiveGestures = [LongTap, DoubleTap] 108 | TabOrder = 1 109 | ItemHeight = 19.000000000000000000 110 | ItemIndex = -1 111 | OnChange = ComboCursorChange 112 | OnExit = RefreshOnExit 113 | end 114 | object ComboColor: TComboEdit 115 | Touch.InteractiveGestures = [LongTap, DoubleTap] 116 | TabOrder = 2 117 | ItemHeight = 19.000000000000000000 118 | ItemIndex = -1 119 | Position.X = 56.000000000000000000 120 | OnChange = ComboColorChange 121 | OnDblClick = ComboColorDblClick 122 | OnExit = RefreshOnExit 123 | end 124 | object sgProp: TStringGrid 125 | OnTap = sgPropTap 126 | Align = Client 127 | Size.Width = 318.000000000000000000 128 | Size.Height = 511.000000000000000000 129 | Size.PlatformDefault = False 130 | TabOrder = 0 131 | OnResize = sgPropResize 132 | OnDblClick = sgPropDblClick 133 | OnViewportPositionChange = sgPropViewportPositionChange 134 | Options = [ColumnResize, ColLines, RowLines, Tabs, Header, HeaderClick] 135 | RowCount = 100 136 | RowHeight = 21.000000000000000000 137 | OnHeaderClick = sgPropHeaderClick 138 | OnSelectCell = sgPropSelectCell 139 | Viewport.Width = 298.000000000000000000 140 | Viewport.Height = 486.000000000000000000 141 | object StringColumn1: TStringColumn 142 | Size.Width = 145.000000000000000000 143 | Size.Height = 504.000000000000000000 144 | Size.PlatformDefault = False 145 | TabOrder = 0 146 | end 147 | object StringColumn2: TStringColumn 148 | Position.X = 145.000000000000000000 149 | Size.Width = 145.000000000000000000 150 | Size.Height = 504.000000000000000000 151 | Size.PlatformDefault = False 152 | TabOrder = 1 153 | end 154 | end 155 | end 156 | object TabItemEvents: TTabItem 157 | CustomIcon = < 158 | item 159 | end> 160 | IsSelected = False 161 | Size.Width = 54.000000000000000000 162 | Size.Height = 26.000000000000000000 163 | Size.PlatformDefault = False 164 | StyleLookup = '' 165 | TabOrder = 0 166 | Text = 'Events' 167 | ExplicitSize.cx = 50.000000000000000000 168 | ExplicitSize.cy = 26.000000000000000000 169 | object sgEvt: TStringGrid 170 | Align = Client 171 | Size.Width = 50.000000000000000000 172 | Size.Height = 50.000000000000000000 173 | Size.PlatformDefault = False 174 | TabOrder = 0 175 | OnResize = sgResize 176 | Options = [ColumnResize, ColLines, RowLines, Tabs, Header, HeaderClick] 177 | RowCount = 20 178 | RowHeight = 21.000000000000000000 179 | OnHeaderClick = sgEvtHeaderClick 180 | OnSelectCell = sgPropSelectCell 181 | Viewport.Width = 314.000000000000000000 182 | Viewport.Height = 486.000000000000000000 183 | object StringColumn3: TStringColumn 184 | Size.Width = 145.000000000000000000 185 | Size.Height = 63.000000000000000000 186 | Size.PlatformDefault = False 187 | TabOrder = 0 188 | end 189 | object StringColumn5: TStringColumn 190 | Position.X = 145.000000000000000000 191 | Size.Width = 145.000000000000000000 192 | Size.Height = 420.000000000000000000 193 | Size.PlatformDefault = False 194 | TabOrder = 1 195 | end 196 | end 197 | end 198 | object TabItemData: TTabItem 199 | CustomIcon = < 200 | item 201 | end> 202 | IsSelected = False 203 | Size.Width = 44.000000000000000000 204 | Size.Height = 26.000000000000000000 205 | Size.PlatformDefault = False 206 | StyleLookup = '' 207 | TabOrder = 0 208 | Text = 'Data' 209 | ExplicitSize.cx = 50.000000000000000000 210 | ExplicitSize.cy = 26.000000000000000000 211 | object sgData: TStringGrid 212 | Align = Client 213 | Size.Width = 50.000000000000000000 214 | Size.Height = 50.000000000000000000 215 | Size.PlatformDefault = False 216 | TabOrder = 0 217 | OnResize = sgResize 218 | Options = [ColumnResize, ColLines, RowLines, Tabs, Header, HeaderClick] 219 | RowCount = 20 220 | RowHeight = 21.000000000000000000 221 | OnHeaderClick = sgDataHeaderClick 222 | OnSelectCell = sgDataSelectCell 223 | Viewport.Width = 314.000000000000000000 224 | Viewport.Height = 486.000000000000000000 225 | object StringColumn4: TStringColumn 226 | Size.Width = 145.000000000000000000 227 | Size.Height = 63.000000000000000000 228 | Size.PlatformDefault = False 229 | TabOrder = 0 230 | end 231 | object StringColumn6: TStringColumn 232 | Position.X = 145.000000000000000000 233 | Size.Width = 145.000000000000000000 234 | Size.Height = 420.000000000000000000 235 | Size.PlatformDefault = False 236 | TabOrder = 1 237 | end 238 | end 239 | end 240 | end 241 | object Timer1: TTimer 242 | Interval = 2000 243 | OnTimer = Timer1Timer 244 | Left = 272 245 | Top = 16 246 | end 247 | object PopupMenu1: TPopupMenu 248 | Left = 304 249 | Top = 16 250 | object MenuItem1: TMenuItem 251 | Text = 'Options' 252 | object MenuItem9: TMenuItem 253 | Locked = True 254 | Text = 'Refresh Forms' 255 | OnClick = MenuItemRefreshFormsClick 256 | end 257 | object MenuItem12: TMenuItem 258 | Locked = True 259 | Text = 'Refresh Components' 260 | OnClick = MenuItemRefreshComponentsClick 261 | end 262 | object MenuItem13: TMenuItem 263 | Locked = True 264 | Text = 'Refresh Values' 265 | OnClick = MenuItemRefreshValuesClick 266 | end 267 | object MenuItem14: TMenuItem 268 | Locked = True 269 | Text = '-' 270 | end 271 | object MenuItemVisible: TMenuItem 272 | Locked = True 273 | IsChecked = True 274 | Text = 'Visible' 275 | OnClick = MenuItemVisibleClick 276 | end 277 | end 278 | object MenuItem2: TMenuItem 279 | Text = 'Help' 280 | object MenuItem16: TMenuItem 281 | Locked = True 282 | Text = 'Info...' 283 | OnClick = MenuItemInfoClick 284 | end 285 | object MenuItem17: TMenuItem 286 | Locked = True 287 | Text = 'About...' 288 | OnClick = MenuItemAboutClick 289 | end 290 | end 291 | end 292 | end 293 | end 294 | -------------------------------------------------------------------------------- /ObjectDebuggerFMXFrame.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dph2011/Object-Debugger-for-FireMonkey/3f966bac9f19e4bf8cba2c8d87ffc1b092589cf0/ObjectDebuggerFMXFrame.pas -------------------------------------------------------------------------------- /ProjectGroupComponent.groupproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {BFB0EB71-E91E-4436-B776-0D4058DF4BD8} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Default.Personality.12 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 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Object-Debugger-for-FireMonkey 2 | A run-time object inspector for Delphi FireMonkey applications 3 | 4 | README 5 | 6 | The FMX ObjectDebugger is a run-time Object Inspector for Delphi FireMonkey applications (Windows 32 bit, Windows 64 bit, Mac OS X, iOS, Android). 7 | 8 | Licensed under MPL 2.0, https://www.mozilla.org/en-US/MPL/2.0/ . 9 | 10 | Copyright (c) 2016 Daniel Horn 11 | 12 | 13 | Developed with Delphi/RAD Studio 10 Seattle. 14 | Based on version 5.0 of the (VCL) Object Debugger for Delphi by Marco Cantù: 15 | http://blog.marcocantu.com/blog/2016-february-objectdebugger-delphi10seattle.html 16 | 17 | 18 | WHAT'S HERE 19 | 20 | The projects included in this project group are: 21 | 22 | 23 | DemoMobile - A simple demo program that uses the component. This shows how you might use the component in an Android or iOS app though it will also run on Windows and Mac OS X. 24 | (Run this first on Win32 to make sure there are no problems.) 25 | 26 | DemoDesktop - Similar to DemoMobile but intended for Windows and Mac because the Object Inspector runs in its own form. 27 | 28 | ObjectDebuggerFMXTest - If you intend to modify the component, this project is a simple way of building and running the ObjectDebuggerFMXFrame class directly 29 | in an app (this is a way of avoiding any install/uninstall issues that may come up while changing the code). 30 | 31 | 32 | INSTRUCTIONS 33 | 34 | 1) To build open the project group in Delphi. 35 | 36 | 2) Open ObjectDebuggerFMXFrame in Design Mode. In the Structure pane, right-click on FMXObjectDebuggerFrame and select Add to Palette. 37 | The Component Template Information dialog appears. 38 | Accept the defaults (TFMXObjectDebuggerFrameTemplate for Component Name and Templates for Palette Page. 39 | 40 | 3) Select the Demo project and Target Platform on which you intend to run (e.g., Win32 or OX X). 41 | 42 | 4) Some simple examples of what you can do when running the Demo application: 43 | choose the edit field and change its Text property using the inspector; 44 | change the cursor; 45 | choose the listbox or combobox and add modify its content (the Items property) or change its selected item (ItemIndex). 46 | 47 | 5) When adding it to your own project, remember to also add the FormMessage.pas file to the project. 48 | 49 | 50 | NOTES 51 | 52 | This is essentially a FireMonkey version of the Object Debugger (for VCL) by Marco Cantu. 53 | (For those who are interested in comparing the two implementations, an attempt was made to use names 54 | similar to those in the VCL version.) 55 | 56 | Some differences and items to note include: 57 | 58 | 1) The RTTI code works on several platforms: not only Windows but also Mac OS X, iOS, and Android. 59 | The changes needed to accomplish this included using TypInfo calls such as GetTypeName and GetPropName and 60 | adding a routine for reading bytes as a "ShortString" and converting it to a string (the ShortString type does not exist on iOS and Android). 61 | 62 | 63 | 2) Besides using FireMonkey, the chief UI difference is that the main component is a TFrame instead of a TForm. 64 | This gives more flexibility, especially if one intends to use this in a mobile app (in which more than one form may not be visible). 65 | More specifically, if the form you want to inspect belongs to: 66 | 67 | a) an iOS or Android app: 68 | you will want to add this frame directly to that form; otherwise, you have no clear way to see both the form and the ObjectDebugger at the same time; 69 | 70 | b) a Windows or Mac desktop app: 71 | you will probably prefer to put the ObjectDebugger frame in its own window so as not to change the layout of the form. 72 | 73 | Because it is a frame and not a form, it makes more sense to provide a menu via a TPopupMenu (invoked by a right mouse click) rather 74 | than a TMainMenu. 75 | 76 | 77 | 3) This has been tested on Windows 10 (32 bit app on 64 bit Windows), Mac OS X (SDK 10.11.2 on 10.11.3), 78 | iOS Simulator 9.2 (iPad Air 2), and Android (SDK 24.3.3 32bit on Samsung SM-T217S running Android 4.4.2). 79 | While the RTTI code works on all platforms, the emphasis on UI has been for Windows and Mac. 80 | Developers using this component on iOS or Android will probably want to make adjustments to the UI. 81 | (For example, the default component size is too big for an iPhone). 82 | 83 | 84 | 4) Evidently, the FireMonkey TStringGrid component does not generate OnVScrollChange and OnHScrollChange events on the Mac. 85 | The simple solution to this is just use the OnViewportPositionChange event handler instead in FireMonkey apps. 86 | 87 | 88 | 5) Since the FMX ShowMessage messagebox does not let you assign a caption, we provide a simple replacement, FormMessage; 89 | in addition to acting like ShowMessage replacement, it can also be used to display a TPanel. 90 | 91 | 92 | See the comments in the ObjectDebuggerFMXFrame.pas source file for more information. 93 | -------------------------------------------------------------------------------- /README.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dph2011/Object-Debugger-for-FireMonkey/3f966bac9f19e4bf8cba2c8d87ffc1b092589cf0/README.txt -------------------------------------------------------------------------------- /Test/ObjectDebuggerFMXTest.deployproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 12 5 | 6 | 7 | 8 | ObjectDebuggerFMXTest.app\ 9 | Default-568h@2x.png 10 | iPhone_Launch640x1136 11 | 1 12 | 13 | 14 | True 15 | 16 | 17 | ObjectDebuggerFMXTest.app\ 18 | FM_ApplicationIcon_57x57.png 19 | iPhone_AppIcon57 20 | 0 21 | 22 | 23 | True 24 | 25 | 26 | ObjectDebuggerFMXTest.app\ 27 | FM_ApplicationIcon_144x144.png 28 | iPad_AppIcon144 29 | 0 30 | 31 | 32 | True 33 | 34 | 35 | ObjectDebuggerFMXTest.app\ 36 | Default-667h@2x.png 37 | iPhone_Launch750 38 | 0 39 | 40 | 41 | True 42 | 43 | 44 | ObjectDebuggerFMXTest.app\ 45 | Default@2x.png 46 | iPhone_Launch640 47 | 1 48 | 49 | 50 | True 51 | 52 | 53 | ObjectDebuggerFMXTest.app\ 54 | Default-Portrait@2x.png 55 | iPad_Launch1536 56 | 1 57 | 58 | 59 | True 60 | 61 | 62 | ObjectDebuggerFMXTest.app\ 63 | Default.png 64 | iPhone_Launch320 65 | 1 66 | 67 | 68 | True 69 | 70 | 71 | ObjectDebuggerFMXTest.app\ 72 | FM_ApplicationIcon_120x120.png 73 | iPhone_AppIcon120 74 | 0 75 | 76 | 77 | True 78 | 79 | 80 | ObjectDebuggerFMXTest.app\ 81 | Default~ipad.png 82 | iPad_Launch768 83 | 1 84 | 85 | 86 | True 87 | 88 | 89 | ObjectDebuggerFMXTest.app\ 90 | FM_SpotlightSearchIcon_50x50.png 91 | iPad_SpotLight50 92 | 0 93 | 94 | 95 | True 96 | 97 | 98 | ObjectDebuggerFMXTest.app\ 99 | FM_ApplicationIcon_76x76.png 100 | iPad_AppIcon76 101 | 0 102 | 103 | 104 | True 105 | 106 | 107 | ObjectDebuggerFMXTest.app\../\ 108 | ObjectDebuggerFMXTest.entitlements 109 | ProjectiOSEntitlements 110 | 1 111 | 112 | 113 | True 114 | 115 | 116 | ObjectDebuggerFMXTest.app\ 117 | FM_SpotlightSearchIcon_80x80.png 118 | iPad_SpotLight80 119 | 0 120 | 121 | 122 | True 123 | 124 | 125 | ObjectDebuggerFMXTest.app\ 126 | FM_SpotlightSearchIcon_40x40.png 127 | iPhone_Spotlight40 128 | 0 129 | 130 | 131 | True 132 | 133 | 134 | ObjectDebuggerFMXTest.app\ 135 | Default-736h@3x.png 136 | iPhone_Launch1242 137 | 0 138 | 139 | 140 | True 141 | 142 | 143 | ObjectDebuggerFMXTest.app\ 144 | FM_SpotlightSearchIcon_40x40.png 145 | iPad_SpotLight40 146 | 0 147 | 148 | 149 | True 150 | 151 | 152 | ObjectDebuggerFMXTest.app\ 153 | FM_ApplicationIcon_180x180.png 154 | iPhone_AppIcon180 155 | 0 156 | 157 | 158 | True 159 | 160 | 161 | ObjectDebuggerFMXTest.app\ 162 | FM_ApplicationIcon_60x60.png 163 | iPhone_AppIcon60 164 | 0 165 | 166 | 167 | True 168 | 169 | 170 | ObjectDebuggerFMXTest.app\ 171 | FM_SettingIcon_29x29.png 172 | iPad_Setting29 173 | 0 174 | 175 | 176 | True 177 | 178 | 179 | ObjectDebuggerFMXTest.app\ 180 | FM_SettingIcon_58x58.png 181 | iPad_Setting58 182 | 0 183 | 184 | 185 | True 186 | 187 | 188 | ObjectDebuggerFMXTest.app\ 189 | ObjectDebuggerFMXTest 190 | ProjectOutput 191 | 1 192 | 193 | 194 | True 195 | True 196 | 197 | 198 | $(PROJECTNAME).app.dSYM\Contents\Resources\DWARF\ 199 | ObjectDebuggerFMXTest 200 | ProjectiOSDeviceDebug 201 | 1 202 | 203 | 204 | True 205 | 206 | 207 | ObjectDebuggerFMXTest.app\ 208 | FM_ApplicationIcon_72x72.png 209 | iPad_AppIcon72 210 | 0 211 | 212 | 213 | True 214 | 215 | 216 | ObjectDebuggerFMXTest.app\ 217 | Default-Portrait@2x~ipad.png 218 | iPad_Launch1536x2048 219 | 0 220 | 221 | 222 | True 223 | 224 | 225 | ObjectDebuggerFMXTest.app\ 226 | Default-Landscape@2x.png 227 | iPad_Launch2048 228 | 1 229 | 230 | 231 | True 232 | 233 | 234 | ObjectDebuggerFMXTest.app\ 235 | FM_SpotlightSearchIcon_100x100.png 236 | iPad_SpotLight100 237 | 0 238 | 239 | 240 | True 241 | 242 | 243 | ObjectDebuggerFMXTest.app\ 244 | Info.plist 245 | ProjectiOSInfoPList 246 | 1 247 | 248 | 249 | True 250 | 251 | 252 | ObjectDebuggerFMXTest.app\ 253 | Default-Portrait~ipad.png 254 | iPad_Launch768x1024 255 | 0 256 | 257 | 258 | True 259 | 260 | 261 | ObjectDebuggerFMXTest.app\ 262 | FM_ApplicationIcon_114x114.png 263 | iPhone_AppIcon114 264 | 0 265 | 266 | 267 | True 268 | 269 | 270 | ObjectDebuggerFMXTest.app\ 271 | Default-Landscape-736h@3x.png 272 | iPhone_Launch2208 273 | 0 274 | 275 | 276 | True 277 | 278 | 279 | ObjectDebuggerFMXTest.app\ 280 | Default-Landscape.png 281 | iPad_Launch1024 282 | 1 283 | 284 | 285 | True 286 | 287 | 288 | ObjectDebuggerFMXTest.app\ 289 | FM_ApplicationIcon_152x152.png 290 | iPad_AppIcon152 291 | 0 292 | 293 | 294 | True 295 | 296 | 297 | ObjectDebuggerFMXTest.app\ 298 | FM_ApplicationIcon_87x87.png 299 | iPhone_AppIcon87 300 | 0 301 | 302 | 303 | True 304 | 305 | 306 | ObjectDebuggerFMXTest.app\ 307 | FM_SpotlightSearchIcon_29x29.png 308 | iPhone_Spotlight29 309 | 0 310 | 311 | 312 | True 313 | 314 | 315 | ObjectDebuggerFMXTest.app\ 316 | ResourceRules.plist 317 | ProjectiOSDeviceResourceRules 318 | 1 319 | 320 | 321 | True 322 | 323 | 324 | ObjectDebuggerFMXTest.app\ 325 | Default-Landscape@2x~ipad.png 326 | iPad_Launch2048x1536 327 | 0 328 | 329 | 330 | True 331 | 332 | 333 | ObjectDebuggerFMXTest.app\ 334 | Default-Landscape~ipad.png 335 | iPad_Launch1024x768 336 | 0 337 | 338 | 339 | True 340 | 341 | 342 | 343 | 344 | 345 | 346 | ObjectDebuggerFMXTest\ 347 | ObjectDebuggerFMXTest.exe 348 | ProjectOutput 349 | 0 350 | 351 | 352 | True 353 | True 354 | 355 | 356 | 357 | 358 | ObjectDebuggerFMXTest.app\Contents\Resources\ 359 | ObjectDebuggerFMXTest.icns 360 | ProjectOSXResource 361 | 1 362 | 363 | 364 | True 365 | 366 | 367 | ObjectDebuggerFMXTest.app\Contents\MacOS\ 368 | libcgunwind.1.0.dylib 369 | DependencyModule 370 | 1 371 | 372 | 373 | True 374 | 375 | 376 | ObjectDebuggerFMXTest.app\Contents\MacOS\ 377 | ObjectDebuggerFMXTest 378 | ProjectOutput 379 | 1 380 | 381 | 382 | True 383 | True 384 | 385 | 386 | ObjectDebuggerFMXTest.app\Contents\MacOS\ 387 | ObjectDebuggerFMXTest.rsm 388 | DebugSymbols 389 | 1 390 | 391 | 392 | True 393 | 394 | 395 | ObjectDebuggerFMXTest.app\../\ 396 | ObjectDebuggerFMXTest.entitlements 397 | ProjectOSXEntitlements 398 | 1 399 | 400 | 401 | True 402 | 403 | 404 | ObjectDebuggerFMXTest.app\Contents\ 405 | Info.plist 406 | ProjectOSXInfoPList 407 | 1 408 | 409 | 410 | True 411 | 412 | 413 | 414 | 415 | ObjectDebuggerFMXTest\res\drawable-small\ 416 | splash_image.png 417 | Android_SplashImage426 418 | 1 419 | 420 | 421 | True 422 | 423 | 424 | ObjectDebuggerFMXTest\res\drawable\ 425 | splash_image_def.xml 426 | AndroidSplashImageDef 427 | 1 428 | 429 | 430 | True 431 | 432 | 433 | ObjectDebuggerFMXTest\res\drawable-large\ 434 | splash_image.png 435 | Android_SplashImage640 436 | 1 437 | 438 | 439 | True 440 | 441 | 442 | ObjectDebuggerFMXTest\res\drawable-mdpi\ 443 | ic_launcher.png 444 | Android_LauncherIcon48 445 | 1 446 | 447 | 448 | True 449 | 450 | 451 | ObjectDebuggerFMXTest\classes\ 452 | classes.dex 453 | AndroidClassesDexFile 454 | 1 455 | 456 | 457 | True 458 | 459 | 460 | ObjectDebuggerFMXTest\res\values\ 461 | styles.xml 462 | AndroidSplashStyles 463 | 1 464 | 465 | 466 | True 467 | 468 | 469 | ObjectDebuggerFMXTest\res\drawable-ldpi\ 470 | ic_launcher.png 471 | Android_LauncherIcon36 472 | 1 473 | 474 | 475 | True 476 | 477 | 478 | ObjectDebuggerFMXTest\res\drawable-hdpi\ 479 | ic_launcher.png 480 | Android_LauncherIcon72 481 | 1 482 | 483 | 484 | True 485 | 486 | 487 | ObjectDebuggerFMXTest\library\lib\mips\ 488 | libObjectDebuggerFMXTest.so 489 | AndroidLibnativeMipsFile 490 | 1 491 | 492 | 493 | True 494 | 495 | 496 | ObjectDebuggerFMXTest\ 497 | AndroidManifest.xml 498 | ProjectAndroidManifest 499 | 1 500 | 501 | 502 | True 503 | 504 | 505 | ObjectDebuggerFMXTest\library\lib\armeabi\ 506 | libObjectDebuggerFMXTest.so 507 | AndroidLibnativeArmeabiFile 508 | 1 509 | 510 | 511 | True 512 | 513 | 514 | ObjectDebuggerFMXTest\res\drawable-xxhdpi\ 515 | ic_launcher.png 516 | Android_LauncherIcon144 517 | 1 518 | 519 | 520 | True 521 | 522 | 523 | ObjectDebuggerFMXTest\res\drawable-xhdpi\ 524 | ic_launcher.png 525 | Android_LauncherIcon96 526 | 1 527 | 528 | 529 | True 530 | 531 | 532 | ObjectDebuggerFMXTest\res\drawable-xlarge\ 533 | splash_image.png 534 | Android_SplashImage960 535 | 1 536 | 537 | 538 | True 539 | 540 | 541 | ObjectDebuggerFMXTest\library\lib\armeabi-v7a\ 542 | libObjectDebuggerFMXTest.so 543 | ProjectOutput 544 | 1 545 | 546 | 547 | True 548 | True 549 | 550 | 551 | ObjectDebuggerFMXTest\library\lib\armeabi-v7a\ 552 | gdbserver 553 | AndroidGDBServer 554 | 1 555 | 556 | 557 | True 558 | 559 | 560 | ObjectDebuggerFMXTest\res\drawable-normal\ 561 | splash_image.png 562 | Android_SplashImage470 563 | 1 564 | 565 | 566 | True 567 | 568 | 569 | ObjectDebuggerFMXTest\library\lib\x86\ 570 | libObjectDebuggerFMXTest.so 571 | AndroidLibnativeX86File 572 | 1 573 | 574 | 575 | True 576 | 577 | 578 | 579 | 580 | ObjectDebuggerFMXTest.app\ 581 | FM_ApplicationIcon_144x144.png 582 | iPad_AppIcon144 583 | 0 584 | 585 | 586 | True 587 | 588 | 589 | ObjectDebuggerFMXTest.app\ 590 | FM_SpotlightSearchIcon_100x100.png 591 | iPad_SpotLight100 592 | 0 593 | 594 | 595 | True 596 | 597 | 598 | ObjectDebuggerFMXTest.app\ 599 | FM_ApplicationIcon_114x114.png 600 | iPhone_AppIcon114 601 | 0 602 | 603 | 604 | True 605 | 606 | 607 | ObjectDebuggerFMXTest.app\ 608 | FM_ApplicationIcon_152x152.png 609 | iPad_AppIcon152 610 | 0 611 | 612 | 613 | True 614 | 615 | 616 | ObjectDebuggerFMXTest.app\ 617 | ObjectDebuggerFMXTest 618 | ProjectOutput 619 | 1 620 | 621 | 622 | True 623 | True 624 | 625 | 626 | ObjectDebuggerFMXTest.app\ 627 | Default-667h@2x.png 628 | iPhone_Launch750 629 | 0 630 | 631 | 632 | True 633 | 634 | 635 | ObjectDebuggerFMXTest.app\ 636 | FM_ApplicationIcon_72x72.png 637 | iPad_AppIcon72 638 | 0 639 | 640 | 641 | True 642 | 643 | 644 | ObjectDebuggerFMXTest.app\ 645 | libcgunwind.1.0.dylib 646 | DependencyModule 647 | 1 648 | 649 | 650 | True 651 | 652 | 653 | ObjectDebuggerFMXTest.app\ 654 | Default-Portrait~ipad.png 655 | iPad_Launch768x1024 656 | 0 657 | 658 | 659 | True 660 | 661 | 662 | ObjectDebuggerFMXTest.app\ 663 | Default@2x.png 664 | iPhone_Launch640 665 | 1 666 | 667 | 668 | True 669 | 670 | 671 | ObjectDebuggerFMXTest.app\ 672 | FM_SpotlightSearchIcon_40x40.png 673 | iPhone_Spotlight40 674 | 0 675 | 676 | 677 | True 678 | 679 | 680 | ObjectDebuggerFMXTest.app\ 681 | FM_ApplicationIcon_87x87.png 682 | iPhone_AppIcon87 683 | 0 684 | 685 | 686 | True 687 | 688 | 689 | ObjectDebuggerFMXTest.app\ 690 | Default.png 691 | iPhone_Launch320 692 | 1 693 | 694 | 695 | True 696 | 697 | 698 | ObjectDebuggerFMXTest.app\ 699 | FM_ApplicationIcon_180x180.png 700 | iPhone_AppIcon180 701 | 0 702 | 703 | 704 | True 705 | 706 | 707 | ObjectDebuggerFMXTest.app\ 708 | FM_SettingIcon_58x58.png 709 | iPad_Setting58 710 | 0 711 | 712 | 713 | True 714 | 715 | 716 | ObjectDebuggerFMXTest.app\ 717 | Default-Portrait@2x~ipad.png 718 | iPad_Launch1536x2048 719 | 0 720 | 721 | 722 | True 723 | 724 | 725 | ObjectDebuggerFMXTest.app\ 726 | FM_SpotlightSearchIcon_80x80.png 727 | iPad_SpotLight80 728 | 0 729 | 730 | 731 | True 732 | 733 | 734 | ObjectDebuggerFMXTest.app\ 735 | FM_ApplicationIcon_120x120.png 736 | iPhone_AppIcon120 737 | 0 738 | 739 | 740 | True 741 | 742 | 743 | ObjectDebuggerFMXTest.app\ 744 | FM_SpotlightSearchIcon_50x50.png 745 | iPad_SpotLight50 746 | 0 747 | 748 | 749 | True 750 | 751 | 752 | ObjectDebuggerFMXTest.app\ 753 | Default-568h@2x.png 754 | iPhone_Launch640x1136 755 | 1 756 | 757 | 758 | True 759 | 760 | 761 | ObjectDebuggerFMXTest.app\ 762 | Default-Landscape.png 763 | iPad_Launch1024 764 | 1 765 | 766 | 767 | True 768 | 769 | 770 | ObjectDebuggerFMXTest.app\ 771 | FM_SpotlightSearchIcon_40x40.png 772 | iPad_SpotLight40 773 | 0 774 | 775 | 776 | True 777 | 778 | 779 | ObjectDebuggerFMXTest.app\ 780 | FM_ApplicationIcon_60x60.png 781 | iPhone_AppIcon60 782 | 0 783 | 784 | 785 | True 786 | 787 | 788 | ObjectDebuggerFMXTest.app\ 789 | Default-Portrait@2x.png 790 | iPad_Launch1536 791 | 1 792 | 793 | 794 | True 795 | 796 | 797 | ObjectDebuggerFMXTest.app\ 798 | Default-736h@3x.png 799 | iPhone_Launch1242 800 | 0 801 | 802 | 803 | True 804 | 805 | 806 | ObjectDebuggerFMXTest.app\ 807 | Default~ipad.png 808 | iPad_Launch768 809 | 1 810 | 811 | 812 | True 813 | 814 | 815 | ObjectDebuggerFMXTest.app\ 816 | ObjectDebuggerFMXTest.entitlements 817 | ProjectiOSEntitlements 818 | 0 819 | 820 | 821 | True 822 | 823 | 824 | ObjectDebuggerFMXTest.app\ 825 | Default-Landscape@2x~ipad.png 826 | iPad_Launch2048x1536 827 | 0 828 | 829 | 830 | True 831 | 832 | 833 | ObjectDebuggerFMXTest.app\ 834 | Default-Landscape~ipad.png 835 | iPad_Launch1024x768 836 | 0 837 | 838 | 839 | True 840 | 841 | 842 | ObjectDebuggerFMXTest.app\ 843 | FM_ApplicationIcon_76x76.png 844 | iPad_AppIcon76 845 | 0 846 | 847 | 848 | True 849 | 850 | 851 | ObjectDebuggerFMXTest.app\ 852 | libPCRE.dylib 853 | DependencyModule 854 | 1 855 | 856 | 857 | True 858 | 859 | 860 | ObjectDebuggerFMXTest.app\ 861 | Info.plist 862 | ProjectiOSInfoPList 863 | 1 864 | 865 | 866 | True 867 | 868 | 869 | ObjectDebuggerFMXTest.app\ 870 | Default-Landscape-736h@3x.png 871 | iPhone_Launch2208 872 | 0 873 | 874 | 875 | True 876 | 877 | 878 | ObjectDebuggerFMXTest.app\ 879 | FM_ApplicationIcon_57x57.png 880 | iPhone_AppIcon57 881 | 0 882 | 883 | 884 | True 885 | 886 | 887 | ObjectDebuggerFMXTest.app\ 888 | Default-Landscape@2x.png 889 | iPad_Launch2048 890 | 1 891 | 892 | 893 | True 894 | 895 | 896 | ObjectDebuggerFMXTest.app\ 897 | FM_SpotlightSearchIcon_29x29.png 898 | iPhone_Spotlight29 899 | 0 900 | 901 | 902 | True 903 | 904 | 905 | ObjectDebuggerFMXTest.app\ 906 | FM_SettingIcon_29x29.png 907 | iPad_Setting29 908 | 0 909 | 910 | 911 | True 912 | 913 | 914 | 915 | -------------------------------------------------------------------------------- /Test/ObjectDebuggerFMXTest.dpr: -------------------------------------------------------------------------------- 1 | program ObjectDebuggerFMXTest; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | Unit1 in 'Unit1.pas' {Form1}, 7 | Unit2 in 'Unit2.pas' {Form2}, 8 | FormMessage in '..\FormMessage.pas' {MessageForm}, 9 | ObjectDebuggerFMXFrame in '..\ObjectDebuggerFMXFrame.pas' {FMXObjectDebuggerFrame: TFrame}; 10 | 11 | {$R *.res} 12 | 13 | begin 14 | Application.Initialize; 15 | Application.CreateForm(TForm1, Form1); 16 | Application.CreateForm(TForm2, Form2); 17 | Application.CreateForm(TMessageForm, MessageForm); 18 | Application.CreateForm(TFMXObjectDebuggerFrame, FMXObjectDebuggerFrame); 19 | Application.Run; 20 | end. 21 | -------------------------------------------------------------------------------- /Test/ObjectDebuggerFMXTest.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dph2011/Object-Debugger-for-FireMonkey/3f966bac9f19e4bf8cba2c8d87ffc1b092589cf0/Test/ObjectDebuggerFMXTest.res -------------------------------------------------------------------------------- /Test/Unit1.fmx: -------------------------------------------------------------------------------- 1 | object Form1: TForm1 2 | Left = 0 3 | Top = 0 4 | Caption = 'Form1' 5 | ClientHeight = 480 6 | ClientWidth = 640 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnShow = FormShow 11 | DesignerMasterStyle = 0 12 | object Button1: TButton 13 | Anchors = [akTop, akRight] 14 | Position.X = 432.000000000000000000 15 | Position.Y = 64.000000000000000000 16 | TabOrder = 1 17 | Text = 'Button1' 18 | OnClick = Button1Click 19 | end 20 | object Edit1: TEdit 21 | Touch.InteractiveGestures = [LongTap, DoubleTap] 22 | TabOrder = 2 23 | Position.X = 464.000000000000000000 24 | Position.Y = 392.000000000000000000 25 | end 26 | object ComboBox1: TComboBox 27 | Position.X = 440.000000000000000000 28 | Position.Y = 336.000000000000000000 29 | TabOrder = 4 30 | end 31 | object ListBox1: TListBox 32 | Position.X = 408.000000000000000000 33 | Position.Y = 120.000000000000000000 34 | TabOrder = 5 35 | DisableFocusEffect = True 36 | Items.Strings = ( 37 | 'Item 0' 38 | 'Item 1' 39 | 'Item 2' 40 | 'Item 3') 41 | DefaultItemStyles.ItemStyle = '' 42 | DefaultItemStyles.GroupHeaderStyle = '' 43 | DefaultItemStyles.GroupFooterStyle = '' 44 | Viewport.Width = 196.000000000000000000 45 | Viewport.Height = 196.000000000000000000 46 | end 47 | end 48 | -------------------------------------------------------------------------------- /Test/Unit1.pas: -------------------------------------------------------------------------------- 1 | unit Unit1; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Edit, 8 | FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.ListBox, FMX.Colors; 9 | 10 | type 11 | TForm1 = class(TForm) 12 | Button1: TButton; 13 | Edit1: TEdit; 14 | ComboBox1: TComboBox; 15 | ListBox1: TListBox; 16 | procedure FormShow(Sender: TObject); 17 | procedure Button1Click(Sender: TObject); 18 | private 19 | {Private declarations} 20 | public 21 | {Public declarations} 22 | end; 23 | 24 | var 25 | Form1: TForm1; 26 | 27 | implementation 28 | 29 | {$R *.fmx} 30 | 31 | 32 | uses 33 | ObjectDebuggerFMXFrame 34 | , Unit2 // Form2 35 | ; 36 | 37 | procedure TForm1.Button1Click(Sender: TObject); 38 | begin 39 | // TODO In iOS, need to find someone of keeping debug form on top or of bringing it back to the top. 40 | FMXObjectDebuggerFrame.Visible := True; 41 | FMXObjectDebuggerFrame.BringToFront; 42 | end; 43 | 44 | procedure TForm1.FormShow(Sender: TObject); 45 | begin 46 | Log.d('TForm1.FormShow'); 47 | 48 | if nil = FMXObjectDebuggerFrame then 49 | FMXObjectDebuggerFrame := TFMXObjectDebuggerFrame.Create(Self); 50 | 51 | AddObject(FMXObjectDebuggerFrame); 52 | with FMXObjectDebuggerFrame do 53 | begin 54 | Visible := True; 55 | BringToFront; 56 | Position.X := 0; 57 | Position.Y := 0; 58 | Height := Self.ClientHeight; 59 | Anchors := [TAnchorKind.akLeft, TAnchorKind.akRight, TAnchorKind.akTop, TAnchorKind.akBottom]; 60 | end; 61 | 62 | {$IFNDEF IOS} 63 | Form2.Show; 64 | {$ENDIF} 65 | end; 66 | 67 | initialization 68 | 69 | end. 70 | -------------------------------------------------------------------------------- /Test/Unit2.fmx: -------------------------------------------------------------------------------- 1 | object Form2: TForm2 2 | Left = 0 3 | Top = 0 4 | Caption = 'Form2' 5 | ClientHeight = 480 6 | ClientWidth = 640 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnShow = FormShow 11 | DesignerMasterStyle = 0 12 | object RadioButton1: TRadioButton 13 | Position.X = 488.000000000000000000 14 | Position.Y = 168.000000000000000000 15 | TabOrder = 0 16 | Text = 'RadioButton1' 17 | end 18 | object Button1: TButton 19 | Position.X = 496.000000000000000000 20 | Position.Y = 112.000000000000000000 21 | TabOrder = 1 22 | Text = 'Button1' 23 | OnClick = Button1Click 24 | end 25 | object ComboBox1: TComboBox 26 | Items.Strings = ( 27 | 'Item 0' 28 | 'Item 1' 29 | 'Item 2') 30 | Position.X = 488.000000000000000000 31 | Position.Y = 48.000000000000000000 32 | TabOrder = 2 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /Test/Unit2.pas: -------------------------------------------------------------------------------- 1 | unit Unit2; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListBox, 8 | FMX.StdCtrls, FMX.Controls.Presentation; 9 | 10 | type 11 | TForm2 = class(TForm) 12 | RadioButton1: TRadioButton; 13 | Button1: TButton; 14 | ComboBox1: TComboBox; 15 | procedure Button1Click(Sender: TObject); 16 | procedure FormShow(Sender: TObject); 17 | private 18 | { Private declarations } 19 | public 20 | { Public declarations } 21 | end; 22 | 23 | var 24 | Form2: TForm2; 25 | 26 | implementation 27 | 28 | {$R *.fmx} 29 | 30 | procedure TForm2.Button1Click(Sender: TObject); 31 | begin 32 | Self.Visible := False; // So we can hide the form in iOS 33 | end; 34 | 35 | procedure TForm2.FormShow(Sender: TObject); 36 | begin 37 | Log.d('TForm2.FormShow'); 38 | end; 39 | 40 | end. 41 | --------------------------------------------------------------------------------