Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132

    [Delphi] Usare metodo di classe caricata e istanziata a runtime

    Ciao a tutti,
    ho bisogno di una mano. Vorrei poter utilizzare un metodo di una classe che istanzio a run time. Vi faccio subito l'esempio pratico:

    codice:
    PackageModule := LoadPackage('VEN.bpl'); //carico il package contenete la classe
        if PackageModule <> 0 then  begin
          AClass := GetClass('TFrmTDocumenti'); //recupero la classe che mi interessa
          if aclass <> nil then begin
              MyForm  :=  TComponentClass(AClass).Create(Application) as TForm; //la istanzio la classe
              
               //qui devo poter eseguire un metodo della classe TFrmTDocumenti che si chiama
               //setdettaglio e che prende in input 2 stringhe
    
              MyForm.ShowModal;
              MyForm.Release;
          end;
          UnloadPackage(PackageModule);
        end;
    Come posso invocare il metodo della classe TFrmTDocumenti.setdettaglio(param1: string, param2: string) ??

    Qualcuno gentilemente mi può aiutare per favore??

    Grazie mille.

    mainetz.

  2. #2
    nella stessa maniera con cui hai chiamato il metodo ShowModal, nome classe seguito dal punto .
    Piuttosto perchè non la istanzi con
    MyForm := TComponentClass(AClass).Create(nil); ?


    ciao
    sergio

  3. #3
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Grazie mille per la risposta, ma in realtà non ho la disponibilità di chiamarla inserendo:
    codice:
    MyForm.setdettaglio(param1, param2)
    perchè non ho disponibilità a compile time dei metodi della classe TFrmTDocumenti e mi genera un errore in compilazione ( Error (1087):Undeclared indentifier: 'setdettaglio' ).
    Ho solamente disponibili tutti i metodi della classe alla quale casto la MyForm cioè la THForm che include la showmodal.

    altre idee??

    Grazie, ciao

    mainetz.

  4. #4
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Ciao a tutti,
    dopo una mattina di ricerche ho trovato il modo di chiamare un metodo della classe che istanzio a run-time. Ecco come si fa:
    codice:
    var mymethod: procedure(var:string; var1: string; var2: string);
    
    
    ...
    
    
    
        PackageModule := LoadPackage('VEN.bpl'); //carico il package contenete la classe
        if PackageModule <> 0 then  begin
          AClass := GetClass('TFrmTDocumenti'); //recupero la classe che mi interessa
          if aclass <> nil then begin
              MyForm  :=  TComponentClass(AClass).Create(Application) as TForm; //la istanzio la classe
              
              mymethod := MyForm.MethodAddress('setdettaglio'); //il metodo setdettaglio deve essere di tipo published nella classe che lo contiene
              if Assigned(mymethod) then
                  mymethod('','P','C');  //non ho capito il perchè ma bisogna dichiare una variabile in più all'inizio.
    
              MyForm.ShowModal;
              MyForm.Release;
          end;
          UnloadPackage(PackageModule);
        end;
    l'unico problema che ho è che sembrerebbe che la create non crea tutti gli oggetti che sono contenuti nella classe TFrmTDocumenti. Qualcuno si è scontrato con questo problema?

    ciao.

    mainetz

  5. #5
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    In realtà mi sono accorto che il problema non è quello che la create non genera tutti i componenti (almeno a me pare che li generi tutti) ma piuttosto che il metodo che viene puntato
    codice:
    MyForm.MethodAddress('setdettaglio');
    non sia esattamente quello dell' istanza MyForm.

    Qualcuno ha mai eseguito prima d'ora un metodo in questo modo?

    Grazie mille.

    Ciao.

    mainetz

  6. #6
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Dovrei avere quasi risolto il problema...

    Per lanciare un metodo di quell'istanza bisogna usare questo arteficio....
    codice:
    procedure TFrmSino.Dettaglio1Click(Sender: TObject);
    var 
        AClass : TPersistentClass;
        obj: TComponent;
        Routine: TMethod;
        Exec: TExec;
    begin
      try
          AClass := GetClass('TFrmTDocumenti');
          if aclass <> nil then begin
              obj := TComponentClass(AClass).Create(Self);
              Routine.Data := Pointer(obj);
              Routine.Code := obj.MethodAddress('extsetdet');
              if NOT Assigned(Routine.Code) then Exit;
                  Exec := TExec(Routine);
                  Exec;
          end;
      except
         ;
      end;
    end;
    l'ultimo problema è come passare al metodo extsetdet i parametri...

    Qualcuno mi sa aiutare??

    Grazie.

    mainetz.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    225
    Io una cosa del genere in Delphi non l'ho mai fatta, ma sono contento tu ti sia avventurato cosi' adesso so che si puo' fare. L'ho gia' fatto in C/C++, e forse ti torna utile, vado a spiegare.
    Il compilatore del C++ crea dei simboli molto complessi e soprattutto non codificati in modo stabile, di solito per librerie che rendono disponibili oggetti vengono scritte delle funzioni statiche con la clausola "C" la cui unica funzione e' creare l'oggetto e distruggerlo, questo credo perche' altrimenti l'ereditarieta' fa fatica a passare attraverso la libreria (per dirla in prosa...).
    Forse bisogna che tu faccia la stessa cosa con delphi, e ti fai restituire due metodi non "of object" che creino gli oggetti della libreria e te li restituiscano, e degli altri cui li passi per distruggerli.
    In C++ io avevo dichiarato una classe padre nel programma principale da cui le librerie ereditavano, tu forse puoi fare la stessa cosa con le interfacce in delphi.

  8. #8
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Quella sarebbe una soluzione probabilmente ma sarebbe troppo onerosa da implementare..

    Credo esista un modo per chiamare il metdodo extsetdet così da potergli passare i parametri, anche perchè vorrei sottolineare che se viene chiamato un metodo che non necessita di parametri funziona tutto alla perfezione.

    Qualcuno sa aiutarmi per favore?

    Grazie mille.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    225
    Cosi' com'e' forse puoi anche usare una variabile di tipo procedure oppure procedure of object; a quel punto hai la signature corretta per passargli direttamente anche i parametri. O no?

  10. #10
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    grazie mille per l'aiuto che mi stai dando.. L'osservazione è corretta ma:
    codice:
    procedure TFrmSino.Dettaglio1Click(Sender: TObject);
    var 
        AClass : TPersistentClass;
        obj: TComponent;
        Routine: TMethod;
        Exec: TExec;
        mymethod: procedure(var1:string; var2: string; var3: string; bol1: Boolean);
    begin
      try
          AClass := GetClass('TFrmTDocumenti');
          if aclass <> nil then begin
              obj := TComponentClass(AClass).Create(Self) as THForm;
              Routine.Data := Pointer(obj);
              mymethod := obj.MethodAddress('extsetdet');
    
              Routine.Code := Pointer(mymethod); //dove però passo i parametri della mymethod???
    
              if NOT Assigned(Routine.Code) then Exit;
                  Exec := TExec(Routine); //forse dovrei specificarli qui???
                  Exec;
          end;
      except
         ;
      end;
    end;
    dove specifico i parametri della procedura mymethod???

    Grazie mille.

    mainetz.

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.