2014-06-30 2 views
1

J'ai une application qui charge des plugins qui sont sous la forme de bpls. Chaque plugin contient un formulaire à incorporer dans un autre paquet appelé CoreInf (nom de formulaire ManageF) qui est juste l'interface de base de l'application qui contient un TTabcontrol connu sous le nom de MTabcontrol1. Voici en gros ce qui se passeFocus TEdit sur un formulaire incorporé dynamiquement chargé Firemonkey

Une liste de plugins est chargée dynamiquement à l'exécution dans un ordre séquentiel pour la mise en page de l'interface. Il charge les plugins basés sur l'interface IPluginFrame (Shared.bpl). S'il contient l'interface, il essaie ensuite de créer un nouvel onglet dans MTabcontrol1 et d'incorporer le formulaire. Ce que j'essaie de faire est de créer un bouton de raccourci créé dynamiquement onClick, de mettre au point une boîte TEdit sur un formulaire ebedded spécifique, mais cela continue à apparaître comme des erreurs de violation d'accès.

Shared.bpl qui contient l'interface

unit PluginIntf; 

interface 

uses 
    FMX.Types, FMX.Controls; 

type 
    IPluginFrame = interface 
    ['{3B4943DB-951B-411B-8726-03BF1688542F}'] 
    function GetBaseControl: TControl; 
    end; 


implementation 

end. 

formulaire et Button qui doit être ebedded dans l'interface

InventoryInf.pas a la forme à embeeded

var 
     InventoryF: TInventoryF; 

    implementation 

    {$R *.fmx} 

    function TInventoryF.GetBaseControl: TControl; 
    begin 
     Result := InvenLayout; //<---- This is a a TLayout which align 
           //to client this is the parent of every item on form 
    end; 

    //Below is the on click event for the TSpeedButton invBtn 
    //Which looks for the embedded form that is embedded 
    //in MTabcontrol1 as a TTabitem that has the name InventoryF 

    procedure TInventoryF.Look4Tabitem(Sender: TObject); 
    var 
    o : TTabitem; 
    s :TEdit; 
    begin 
    o := TTabitem(ManageF.MTabcontrol1.FindComponent('InventoryF')); 

    ManageF.MTabcontrol1.ActiveTab := o; 

    s := TEdit(ManageF.MTabcontrol1.FindComponent('VendorF').FindComponent('SearchEdit1')); <-- Dont think it actually found the TEdit        

    s.Setfocus; <------------------ Not focusing giving access violtaion error 

     with DataConModule1.InventoryQuery do 
     ... 


    end; 

TSpeedButton invBtn qui est injecté dans le panneau sur le côté

unit InjectedInvBtn; 
interface 
implementation 
uses 
    FMX.Types, InventoryInf, FMX.Controls, FMX.Forms, InjectedControlsHelper, FMX.StdCtrls, 
    ManageInf; 
var 
    SysBtn: TSpeedButton; 
initialization 
    SysBtn := TInjectedControl<TSpeedButton>.Create; 
    SysBtn.Align := TAlignLayout.Top; 
    SysBtn.Name := 'invBtn'; 
    SysBtn.Text := 'INVENTORY'; 
    ManageF.MenuPanel.AddObject(SysBtn); 
    SysBtn.OnClick := InventoryF.Look4Tabitem; 
end. 

** ManageF montrant comment il charge les formulaires en onglets MTabControl1 **

espoir i illustré le problème correctement. S'il vous plaît Aide = (

+0

Vous dites que le TEdit peut ne pas être retourné. Utilisez le débogueur pour savoir s'il est nul ou le mauvais objet. –

Répondre

0

trouvé un travail autour par une boucle à travers les composants du TCustomForm qui est intégré. Voici ce que je l'ai fait.

au lieu de TEdit j'ai utilisé une boîte modifier tms TTMSFMXSearchEdit

procedure TVendorF.focuscheck; 
var 
    i: integer; 
    j: integer; 
    Fieldname: string; 
    o : TTabitem; 
    e : TTMSFMXSearchEdit; 
begin 
    if ManageF.MTabcontrol1.FindComponent('VendorF').Name = 'VendorF' then 
    begin 
    o := TTabitem(ManageF.MTabcontrol1.FindComponent('VendorF')); 

    //ShowMessage(IntToStr(o.ComponentCount)) ; 
    // ShowMessage((o.Components[0].tostring)); 

     for i := 0 to ManageF.MTabcontrol1.ActiveTab.ComponentCount - 1 do 
     if (ManageF.MTabcontrol1.ActiveTab.Components[i]) is TCustomForm then 
      begin 
     // ShowMessage('TCustomForm Recognized gonna look for child components now'); 
     // ShowMessage(IntToStr(ManageF.MTabcontrol1.ActiveTab.Components[i].ComponentCount)); 

     for j := 0 to ManageF.MTabcontrol1.ActiveTab.Components[i].ComponentCount - 1 do 
       if (ManageF.MTabcontrol1.ActiveTab.Components[i].Components[j]) is TTMSFMXSearchEdit then 
        begin 
        // ShowMessage('Edit box found =)') 
         if (ManageF.MTabcontrol1.ActiveTab.Components[i].Components[j].Name = 'VenSearchEdit1') then 
          begin 
          //ShowMessage('Edit1 box found =)'); 
          //ShowMessage('See if we can focus it'); 
          e := TTMSFMXSearchEdit(ManageF.MTabcontrol1.ActiveTab.Components[i].Components[j]) ; 
          e.SetFocus; 
          end; 

       end; 
     end; 
    end; 
end; 

C'est un peu bâclé mais ça marche =). Si quelqu'un d'autre a obtenu un meilleur moyen, faites-le moi savoir

Questions connexes