Results 1 to 3 of 3

Thread: QueryInterface op TControl?

  1. #1
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    938

    QueryInterface op TControl?

    Ik heb een PageControl met per tab een frame. Ze erven nog rechtstreeks over van TFrame. In een vorig project hadden we een centrale frame waar ze allemaal van overerfden, wat wel relatief goed werkte, maar af en toe eens ernstig de designer in de war stuurde als we wijzigingen probeerden te doen. dus hebben we nu een eigen ITabFrame interface.

    Nu is de vraag waarom werkt dit niet:

    Delphi Code:
    1. procedure TSomeOneBigMainForm.PageControl1Change(Sender: TObject);
    2. var
    3.   tf:ITabFrame;
    4. begin
    5.   if (PageControl1.ActivePage.ControlCount=1)
    6.     and (IInterface(PageControl1.ActivePage.Controls[0]).QueryInterface(ITabFrame,tf)=S_OK) then
    7.     tf.TabShow;
    8. end;

    Voorlopig heb ik het zo opgelost, en in de praktijk zal je in normaal nooit een EIntfCastError krijgen, maar het kan wel natuurlijk, als iemand op een nieuwe frame ITabFrame vergeet toe te voegen:

    Delphi Code:
    1. procedure TSomeOneBigMainForm.PageControl1Change(Sender: TObject);
    2. begin
    3.   if PageControl1.ActivePage.ControlCount=1 then
    4.     try
    5.       (PageControl1.ActivePage.Controls[0] as ITabFrame).TabShow;
    6.     except
    7.       on EIntfCastError do ;//ignore
    8.     end;
    9. end;

  2. #2
    Hoe werkt die eerste code niet? Krijg je een fout? Heeft de interface een GUID?
    1+1=b

  3. #3
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    938
    Dit is gek. Ik wou een minimaal projectje maken om te reproduceren en hier toe te voegen, en nu werkt het wel.
    Ik kreeg een error op het compileren van "QueryInterface(ITabFrame," dat de interface declaratie een GUID moet hebben. (kan snel met Ctrl+Shift+G)
    Ik neem aan dat de vorige keer het geen S_OK gaf, maar ik heb er niet aan gedacht te kijken wat ik er dan wel kreeg...

    Ook dacht ik net, misschien ligt het aan de 'harde' cast naar een IInterface. Als ik me bijvoorbeeld vergist had en de "[0]" vergat, dan gaat hij misschien stilletjes verder met een 'geldige' QueryInterface van een compleet verkeerd object...
    dus misschien toch best met een "as", blijkt ook te werken, en zal altijd werken want IInterface zit op TComponent:
    Delphi Code:
    1. procedure TfrmDPPoolMain.DoTabAction(ta:TTabAction);
    2. var
    3.   tf:ITabFrame;
    4. begin
    5.   if PageControl1.ActivePage.ControlCount=1 then
    6.     if (PageControl1.ActivePage.Controls[0] as IInterface).QueryInterface(ITabFrame,tf)=S_OK then
    7.       tf.TabAction(ta);
    8. end;

Thread Information

Users Browsing this Thread

There are currently 3 users browsing this thread. (0 members and 3 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •