Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Delphi 6] gestione evento per + oggetti con stessa classe.

    ciao a tutti,

    ho qui un quesito per voi che non so proprio come risolvere.

    Ho progettato, partendo come base da un file ASCII da me formattato, una funzione che mi permetta di creare a run-time i menu all'interno di una form.

    E fin qui tutto bene, funziona tutto.

    Questi MenuItem hanno 3 possibilità di essere gestiti:

    1) nessun evento
    2) evento che richiama una funzione che mi crea una form ben precisa.
    3) evento che mi apre una form già esistente (tipo le informazioni su...)

    per gestire queste possibilità ho creato :
    1 evento per il passo 2 che, in base al nome del menu, mi crea la form ben precisa e che si basa su una query che ha un nome logico simile al nome del menu.

    1 evento per il passo 3 che, in base al nome del menu, mi apre la relativa form con un nome logico simile.

    e qui ci casca l'asino.....
    Come faccio a scoprire il nome del menu che ha richiamato l'evento dato che il parametro sender dell'evento non mi da questa possibilità?

    Grazie già da ora
    Giorgino



  2. #2

    altra possibilità

    è possibile creare funzioni dinamiche a run-time, così almeno potrei creare N funzioni diverse per N voci di menu, e sarei a cavallo.

    Ciao Giorgino

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Il parametro Sender che viene passato all'evento è di tipo TObject. Il tipo TObject rappresenta la classe base fondamentale dalla quale ereditano tutte le classi di Delphi (TComponent, TControl...fino ad arrivare alle più specifiche TButton, TLabel, che rappresentano i controlli visuali).

    Considerando che è possibile fare in modo che più eventi, di componenti separati e diversi, puntino alla stessa procedura, non è possibile avere il parametro Sender di tipo TLabel o TButton, poichè questo escluderebbe l'una o l'altra categoria di classi.

    Pertanto, il parametro Sender passa l'oggetto che ha scatenato l'evento come TObject, cioè come oggetto generico...sarà poi compito del programmatore analizzare a quale classe discendente da TObject esso appartiene. Per fare questo, è possibile utilizzare l'operatore is per controllare la classe di appartenenza e, successivamente, eseguire un cosiddetto "casting" per forzare il trattamento del parametro Sender in modo che si comporti secondo la classe che vogliamo noi.

    Un esempio: supponi di avere sul form una Label e un Button e di aver associato all'evento OnClick di entrambi il seguente metodo di gestione:
    codice:
    procedure TForm1.ButtonAndLabelClick(Sender: TObject);
    begin
      if Sender is TLabel then
      begin
        ShowMessage(TLabel(Sender).Caption);
        Exit;
      end;
      if Sender is TButton then
      begin
        ShowMessage(TButton(Sender).Caption);
        Exit;
      end;
    end;
    L'operatore is controlla il tipo di Sender, determinando se il clic è stato generato da un pulsante o da un'etichetta; successivamente, tratta forzatamente Sender come uno di tali controlli per poter accedere alle proprietà. L'uso di is è obbligatorio, poichè "castare" Sender ad un tipo al quale non appartiene genera errori: si deve sempre prima controllare a quale tipo appartiene.

    Veniamo al tuo caso. Ciò che vuoi ottenere è il nome del componente. La proprietà Name è introdotta dalla classe TComponent, la classe che rappresenta i componenti, discendente di TObject e a sua volta classe base per tutti i componenti e i controlli visuali più specifici. Pertanto, puoi verificare semplicemente che Sender discenda da TComponent e, dopo aver eseguito il "cast" del parametro, accedere alla proprietà Name.

    codice:
    procedure TForm1.ButtonAndLabelClick(Sender: TObject);
    begin
      if Sender is TComponent then
        ShowMessage(TComponent(Sender).Name);
    end;
    Spero di averti chiarito le idee. Si tratta di un discorso che riguarda nello specifico il paradigma della programmazione ad oggetti: complesso forse agli inizi, ma una volta compreso si rivela molto potente e soprattutto flessibile.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Re: altra possibilità

    Originariamente inviato da giorgino
    è possibile creare funzioni dinamiche a run-time, così almeno potrei creare N funzioni diverse per N voci di menu, e sarei a cavallo.
    Dipende da ciò che intendi. Se ti riferisci ad un trattamento delle funzioni come avviene, ad esempio, in JavaScript, in cui definisci dinamicamente il corpo delle stesse, non è possibile.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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 © 2024 vBulletin Solutions, Inc. All rights reserved.