Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315

    [delphi] passare parametro a form richiamante

    Ciao a tutti,

    ho questo problema:

    in una form ho un textbox dove devo inserire il codice univoco di un record della tabella fornitori.

    Ho inserito un bottone tramite il quale apro una seconda form su cui l’utente effettua una query per rintracciare il codice fornitore. Il risultato della query lo visualizzo in una Dbgrid.

    Vorrei fare in modo che quando il cliente digita doppioclick sul record prescelto (della dbgrid) il codice di tale record venga assegnato al campo edit1 della form che lo ha richiamato.

    Non so come fare per passare tale valore.

    codice:
    procedure TFrmCerca.DBGrid1DblClick(Sender: TObject);
    begin
     Label1.Caption:=  DBGrid1.Fields[0].AsString ;
    end;
    ...riesco a selezionare il valore desiderato...nel codice precedente lo assegno a label1.


    Grazie
    fulvio

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Potresti aggiungere alla sezione private della form secondaria un campo di tipo TFormOrigine (tipo della form primaria) nel quale memorizzare un riferimento alla form primaria chiamante che visualizza la form secondaria.

    Tale valore può essere assegnato introducendo un nuovo metodo nella form secondaria al quale viene passato come parametro il riferimento alla form primaria da memorizzare all'interno del campo privato; successivamente, avviene la visualizzazione attraverso il metodo Show oppure ShowModal.

    La classe della form secondaria richiamata potrebbe essere fatta così:
    codice:
      TCalledForm = class(TForm)
      private
        FCallingForm: TCallingForm;
      public
        procedure ShowMe(ACallingForm: TCallingForm);
      end;
    Il metodo ShowMe si potrebbe implementare in questo modo:
    codice:
    procedure TCalledForm.ShowMe(ACallingForm: TCallingForm);
    begin
      FCallingForm := ACallingForm;
      ShowModal;
    end;
    Quando avviene un doppio clic sulla griglia, l'evento esegue tutte le operazioni necessarie incluso l'aggiornamento dell'etichetta sulla form chiamante di tipo TCallingForm:
    codice:
    procedure TCalledForm.DBGrid1DblClick(Sender: TObject);
    begin
      if FCallingForm <> nil then
        FCallingForm.SomeLabel.Caption := DBGrid1.Fields[0].AsString;
    end;
    Spero di aver reso il concetto.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    Scusami, mo non ho capito.

    Premetto che sono in una applicazione MDI dal cui menu attivo la form di inserimento dati...FrmMOdulo.

    Ricapitolo:

    ho una form chiamante: FrmModulo nella quale ho inserito un Tedit (Edit1) e un bottone.

    Nel campo Edit1 devo inserire il codice univoco corrispondente ad un elemento della tabella Fornitori.

    Premendo il bottone creo un seconda form (FrmCerca) su cui l’utente effettua una query per rintracciare il codice fornitore. Il risultato della query lo visualizzo in una Dbgrid.
    codice:
     procedure TFrmModulo.BitBtn1Click(Sender: TObject);
    begin
    Application.CreateForm(TFrmCerca , FrmCerca );
    end;
    Vorrei fare in modo che quando il cliente digita doppioclick sul record prescelto (della dbgrid) il codice di tale record venga assegnato al campo edit1 della form che lo ha richiamato,

    ...quindi ho seguito il tuo suggerimento e ho fatto cosi:
    nella sessione private della FrmCerca...

    codice:
    TFrmCerca = class(TForm)
      private
      FFrmModulo: TFrmModulo;
    end;
    ma gia’ a questo punto ottengo errore: “undeclared Identifier: ‘TfrmModulo’”

    per cortesia, potresti spiegarmelo di nuovo?

    grazie

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Quando il compilatore ti segnala Undeclared identifier, significa che ha individuato un identificatore (variabile, tipo o altro) non riconosciuto, poichè non reperibile o non precedentemente dichiarato.

    In questo caso, l'unico problema è che devi aggiungere la unit che contiene la definizione del form di origine alla clausola uses della unit che la utilizza, affinchè Delphi sia quindi in grado di vedere il tipo utilizzato per il campo privato.

    Ricordati di mettere il nome della unit nella sezione interface, poichè il tipo di dati che rappresenta la form di origine viene usato nella sezione dichiarativa del form secondario.

    Per il resto, mantieni ciò che ti ho indicato nel messaggio precedente e cerca di fare dei tentativi.

    A fronte di problemi specifici, eventualmente scrivi di nuovo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    abbi pazienza,....non ci riesco !!!!!

    ho creato un'applicazione nuova composta da 2 form.

    nel primo form (form1) ho inserito 2 campi Tedit e 2 bottoni.

    nei campi tedit devo scrivere il codice di riferimento di un'anagrafica di ibtable1.

    con il corrispondente bottone creo (form2) nella quale visualizzo la tabella di anagrafiche in una dbgrid.

    il mio scopo e'di selezionare con doppioclick l'anagrafica,...quindi automaticamente chiudere la form2 ed assegnare il valore prescelto a campo Tedit.

    form2 e' una formMDIchild e quando premo il button1 eseguo questo codice:
    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Application.CreateForm(TForm2 , Form2 )
    end;
    viene creata la form2 e visualizzo i dati; con doppio click seleziono ed effettuo la close.

    ma non riesco a capire come devo fare a passare il parametro al campo "chiamante".

    mi hai detto:
    Potresti aggiungere alla sezione private della form secondaria un campo di tipo TFormOrigine (tipo della form primaria) nel quale memorizzare un riferimento alla form primaria chiamante che visualizza la form secondaria.
    ...forse il problema e' tutto qui! xfavore, mi puoi spiegare SE PUOI come devo aggiungere questo campo di tipo TFormOrigine?

    grazie
    fulvio

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Proviamo in un altro modo.

    Supponi di avere Form1 e Form2, anche se in generale è meglio usare nomi più significativi.

    Form1 visualizza Form2 che contiene i controlli visuali per la selezione; supponiamo che si tratti della DBGrid.

    La Form1 crea la seconda in questo modo:
    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Frm: TForm2;
    begin
      Application.CreateForm(TForm2, Frm);
      try
        Frm.ShowModal;
        Label1.Caption := Frm.DBGrid1.Fields[0].AsString;
      finally
        Frm.Free;
      end;
    end;
    Molto semplicemente, viene creata un'istanza di TForm2 visualizzata con il metodo ShowModal; quando la finestra viene chiusa per effetto della selezione, si procede a visualizzare sulla Label1 il contenuto del campo nella DBGrid che si trova sulla Form2.
    La chiamata al metodo Free consente di distruggere la form dopo l'utilizzo; il costrutto try...finally esegue la Free anche in caso di errore (eccezione).

    Nella Form2, scriveremo un codice simile a questo:
    codice:
    procedure TForm2.DBGrid1DblClick(Sender: TObject);
    begin
      Close;
    end;
    E' sufficiente chiudere la form con il metodo Close quando si fa clic sulla griglia per restituire il controllo alla routine chiamante, che in questo caso è rappresentato dall'evento OnClick del pulsante riportato sopra.

    Si tratta di un esempio molto parziale, poichè non viene gestita la possibilità che sia inoperabile una selezione (ad esempio, quando la tabella è vuota), oppure che si desideri non selezionare nulla attraverso un apposito tasto di annullamento.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    ...in questa maniera vedo creare e chiudere la form2....non ho la possibilita di selezionare il record desiderato.

    credo che venga generata un'eccezione, per cui la form viene chiusa.

    ...anke perche label1.caption viene subito assegnata al valore del primo record della tabella,...quindi la tabella viene aperta visualizzata e chiusa subito.

    forse ho sbagliato qcosa?

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    [QUOTE]Originariamente inviato da 123delphi321
    [B]...in questa maniera vedo creare e chiudere la form2....non ho la possibilita di selezionare il record desiderato.
    Allora c'è un errore che dipende da qualche altro fattore, ad esempio l'impossibilità di aprire la tabella.

    Originariamente inviato da 123delphi321
    credo che venga generata un'eccezione, per cui la form viene chiusa.
    Non si può credere...bisogna esserne certi!

    Originariamente inviato da 123delphi321
    ...anke perche label1.caption viene subito assegnata al valore del primo record della tabella,...quindi la tabella viene aperta visualizzata e chiusa subito. forse ho sbagliato qcosa?
    Sei sicuro di aver usato ShowModal e non semplicemente Show?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    grazie per quello che stai facendo x me!

    no, ho utilizzato show in quanto con showmodal mi da questo errote:

    'cannot make a visible window modal' .

    le due form sono entrambe fsNormal

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    La prima form può essere MDI child, quella secondaria per la selezione no. La form secondaria deve apparire e "forzare" la selezione di un elemento che ne provoca la chiusura.

    Se così non è, vedo grossi problemi logici nella strutturazione di quell'applicazione e una sicura irrealizzabilità del sistema nel suo complesso.

    Se mi viene richiesto di scegliere un record, fino a quando non l'ho scelto oppure ho deciso di non sceglierlo, non è possibile avanzare con qualsiasi altro processo.

    Se la selezione deve essere "parallela" al resto del programma, cosa succederebbe se tu chiudessi la form chiamante che contiene l'etichetta nella quale dovresti visualizzare l'elemento selezionato; non ha nemmeno più senso operare una selezione in quanto tale selezione servirebbe ad una form non più visibile.

    In poche parole, la Form 2 ha senso che venga creata, visualizzata con ShowModal e distrutta, senza essere perennemente visibile, anche quando necessario, nella form MDI parent.
    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.