Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 28
  1. #1
    Utente di HTML.it L'avatar di Jey
    Registrato dal
    Jan 2013
    Messaggi
    41

    [Delphi] Accedere ai metodi private/protected

    Ho un problema.
    Il mio obiettivo è eseguire dei metodi presenti in una classe.
    Mi spiego meglio.

    Supponiamo di avere una form con solamente una TEdit e un TButton.
    Nella TEdit inserisco il nome di un metodo presente in una qualsiasi classe ( per esempio il metodo GetControlsAlignment del TPanel ) e, alla pressione del bottone, eseguo il metodo.

    Per eseguire il metodo uso l'Rtti in questo modo:
    codice:
    function TMyLibClass.RttiMethodInvokeEx( const lsMethodName:string; loRttiType : TRttiType; loInstance: TObject; const laoArgs: array of TValue ): TValue;
    var
       lbFound                    :  Boolean;
       loMethod                   :  TRttiMethod;
       i                          :  Integer;
       laoParams                  :  TArray<TRttiParameter>;
    begin
       Result                     := nil;
       try
          loMethod                := nil;
          lbFound                 := false;
          for loMethod in loRttiType.GetMethods do
          begin
             if SameText( UpperCase( loMethod.Name ), UpperCase( lsMethodName ) ) then
             begin
                laoParams         := loMethod.GetParameters;
                if Length( laoArgs ) = Length( laoParams ) then
                begin
                   lbFound        := true;
                   for i := 0 to Length( laoParams ) - 1 do
                   begin
                      if laoParams[i].ParamType.Handle <> laoArgs[i].TypeInfo then
                      begin
                         lbFound  := false;
                         break;
                      end;
                   end;
                end;
                if lbFound then
                begin
                   break;
                end;
             end;
          end;
          if ( loMethod <> nil ) and
             ( lbFound ) then
          begin
             Result               := loMethod.Invoke( loInstance, laoArgs );
          end else
          begin
             raise Exception.CreateFmt( 'method %s not found', [lsMethodName] );
          end;
       except
       end;
    end;
    Il tutto funziona egregiamete, fino a quando non provo ad eseguire un metodo dichiarato private/protected.
    Se non ho capito male il problema è che con l'Rtti riesco a vedere solamente i metodi pubblici. Esatto?
    C'è un modo per accedere anche a quelli private/protected?

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Private e protected fanno esattamente il loro lavoro: non permetterti di toccare la rappresentazione interna della classe. Non c'è alcun motivo di andare a toccare metodi dichiarati in tal modo: se ci fosse sarebbero stati dichiarati public...
    L'unico modo per accedervi è dall'interno della classe stessa...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3

    Re: [Delphi] Accedere ai metodi private/protected

    Originariamente inviato da Jey
    C'è un modo per accedere anche a quelli private/protected?
    Come già suggerito, ovviamente no: se c'è necessità di accesso a tali metodi o variabili, è necessario impostarle come Public; se l'accesso fosse consentito, non avrebbe senso il tipo Private o Protected, riservato a quei metodi/variabili che non devono essere 'visibili' da classi estranee.
    "Memento audere semper"

    IBM Europe - Italy Group

  4. #4
    Utente di HTML.it L'avatar di Jey
    Registrato dal
    Jan 2013
    Messaggi
    41
    Sono d'accordo su ciò che dichiaro private, ma su qualcosa dichiarato protected non è vero che è visibile solo all'interno della classe stessa...

    Vi faccio un esempio col TButton:
    codice:
    type
       TMyButton = class(TButton);
    
       TForm1 = class(TForm)
          procedure FormCreate(Sender: TObject);
       end;
    
    var
      Form1: TForm1;
    
    implementation
    
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
       c        :  TMyButton;
    begin
       c        := TMyButton.Create( Self );
    end;
    Così facendo, anche all'interno della classe TForm1, vedo i metodi protected dell'oggetto TMyButton...

    Quindi, riassumendo, ok per i metodi private ( immaginavo non si potesse per questi ), ma esiste un modo per vedere i metodi protected senza dover fare questo giro?

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Protected e private sono la stessa cosa finché non entra in campo l'ereditarietà...
    Ti suggerisco di rivedere le basi dell'OOP...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it L'avatar di Jey
    Registrato dal
    Jan 2013
    Messaggi
    41
    Appunto... Conosco il funzionamento di private e protected, però, visto che è da poco che uso i metodi Rtti e non conosco bene il loro funzionamento, mi chiedevo se fosse possibile vedere anche metodi private/protected tramite questi, visto che per quanto riguarda le variabili ho visibilità sia su quelle private che protected se non erro.

    Se non fosse possibile non mi sorprenderebbe, anzi. Chiedevo solo una conferma

    Grazie mille per le risposte

  7. #7
    Originariamente inviato da Jey
    Grazie mille per le risposte
    Prego, figurati

    Ciao
    "Memento audere semper"

    IBM Europe - Italy Group

  8. #8
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    Bhè se non ti spaventano approcci diciamo così eterodossi puoi banalmente dichiarare un tipo derivato dalla classe che vuoi, nello stesso file PAS, et voilà puoi accedere ai protected

    type tqualcosa = class(tquellocuivuoiaccedere);

    variabile: tquellocuivuoiaccedere;
    ...

    tqualcosa(variabile).ENTRIAMODENTRO:=...

  9. #9
    Utente di HTML.it L'avatar di Jey
    Registrato dal
    Jan 2013
    Messaggi
    41
    Si facendo così ottengo l'accesso ai metodi protected
    Però non mi risolve il problema

    Quello che stavo cercando di fare era una specie di interprete capace di eseguire codice a run time.
    Io ho il mio applicativo con ad esempio una TMemo, lì ci scrivo il codice e lui a run time esegue il tutto.

    Col metodo che ho scritto sopra riesco a richiamare le varie procedure pubbliche degli oggetti ( es. se scrivessi form1.button1.Refresh funziona tutto tranquillamente ).

    Mi sarebbe stato comodo riuscire a richiamare anche i metodi protected perchè ho degli oggetti miei da gestire così e non volevo modificarli e rendere pubblici i metodi di mio interesse.

    Ma se non si può fare pazienza

  10. #10
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    ???
    Io ho il mio applicativo con ad esempio una TMemo, lì ci scrivo il codice e lui a run time esegue il tutto.Cosa vorrebbe dire questo ???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.