Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326

    [delphi] aprire la stessa form + volte

    Ciao a tutti,

    ho un problema e non riesco a capire come risolvere.

    da un menu, apro un form dove gestisco tramite IBDataset la tabella fornitori.

    sull'evento OnShow di questa form eseguo:
    codice:
    procedure TFrmFornitori.FormShow(Sender: TObject);
    begin
     Setta_Bottoni_Start ;
    end;
    
    procedure Setta_Bottoni_Start ;
    begin
     FrmFornitori.Edit1.Enabled       := True ;
     FrmFornitori.BtnCerca.Enabled    := True ;
     FrmFornitori.BtnOK.Enabled       := False ;
     FrmFornitori.BtnAnnulla.Enabled  := False ;
     FrmFornitori.BtnCancella.Enabled := False ;
     FrmFornitori.BtnFine.Enabled     := True ;
     FrmFornitori.Edit1.SetFocus ;
    end;
    settando i bottoni per gestire gli eventi.

    prmendo sul bottone 'BtnCerca' eseguo la query ed ottengo IBdataset1, e poi attivo gli opportuni pulsanti:
    codice:
    procedure TFrmFornitori.BtnCercaClick(Sender: TObject);
    begin
     IBDataSet1.Close;
     IBdataset1.SelectSQL.Text := 'SELECT * FROM Fornitori WHERE upper(CODICE) = :ParParola';
     IBdataset1.ParamByName('ParParola').AsString := FrmFornitori.Edit1.Text;
     IBdataset1.Open;
     Setta_Bottoni_Cerca ;
    end;
    
    procedure Setta_Bottoni_Cerca ;
    begin
     FrmFornitori.Edit1.Enabled       := False ;
     FrmFornitori.BtnCerca.Enabled    := False ;
     FrmFornitori.BtnOK.Enabled       := True ;
     FrmFornitori.BtnAnnulla.Enabled  := True ;
     FrmFornitori.BtnCancella.Enabled := not FrmFornitori.IBDataSet1.IsEmpty ;
     FrmFornitori.BtnFine.Enabled     := True ;
     FrmFornitori.DBEditNome.SetFocus ;
    end;
    fin qui tutto ok.
    e funziona tutto bene se apro unicamente una sola form.

    se apro due volte la stessa form...
    codice:
      Application.CreateForm(TFrmFornitori , FrmFornitori )
    succede che quando premo un pulsante della fom1..si sposta sulla form2.
    sto continando a vedere ma non riesco a capire dove sta il problema.

    xfavore, qualcuno mi sa aiutare?

    grazie

  2. #2
    Per creare la form puoi provare con

    with TfrmFornitori.Create(Self) do
    try
    ShowModal;
    finally
    Free;
    end;

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Si tratta di un problema puramente di principio, ed è dovuto al fatto che all'interno del codice della tua form fai riferimento ad una form specifica, cioè quella che ha il riferimento all'interno della variabile FrmFornitori.

    Ciascuna classe che discende da TForm definisce le caratteristiche comportamentali di un form personalizzata.
    Tale comportamento viene rispettato da tutte le istanze di quella classe TForm che vado a creare, siano esse 10, 100, 1000.

    Nel tuo codice, non puoi scrivere istruzioni che fanno riferimento ad una variabile specifica, poichè altrimenti la tua classe lavorerà solamente sull'istanza rappresentata da quella variabile, che per giunta viene inserita in automatico da Delphi ma potrebbe non esistere nemmeno (ad esempio, se voglio creare 10 copie dello stesso form e memorizzarmi i riferimenti in una lista).

    In definitiva, devi sostituire alle istruzioni del tipo
    codice:
    FrmFornitori.Edit1.SetFocus;
    la forma
    codice:
    Edit1.SetFocus;
    o al massimo
    codice:
    Self.Edit1.SetFocus;
    L'identificatore Self viene passato a tutti i metodi della classe e rappresenta l'istanza di tale classe che si sta utilizzando per accedere al metodo ("metodo" = "procedura o funzione di una classe).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    ho provato a fare come mi indichi...

    In definitiva, devi sostituire alle istruzioni del tipo
    codice:
    FrmFornitori.Edit1.SetFocus;
    la forma
    codice:
    Edit1.SetFocus;
    il comando FrmFornitori.Edit1.SetFocus; viene richiamato dalla procedura Setta_Bottoni_Start e se tolgo FrmFornitori. ottengo errore in compilazione

    codice:
    [Error] Unt_fornitori.pas(56): Undeclared identifier: 'Edit1'
    [Error] Unt_fornitori.pas(62): Missing operator or semicolon
    [Fatal Error] Prj_fatture.dpr(8): Could not compile used unit 'Unt_fornitori.pas'
    forse non puo essere richiamato da una procedura?

    grazie

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Il problema è che la procedura Setta_Bottoni_Start è statica, è una procedura completamente slegata dalla classe del form con la quale ha in comune solo il fatto che si trova nella stessa unit.

    Devi tramutare la procedura in un metodo della classe TFrmFornitori:
    codice:
    procedure TFrmFornitori.Setta_Bottoni_Start ;
    begin
     Edit1.Enabled       := True ;
     BtnCerca.Enabled    := True ;
     BtnOK.Enabled       := False ;
     BtnAnnulla.Enabled  := False ;
     BtnCancella.Enabled := False ;
     BtnFine.Enabled     := True ;
     Edit1.SetFocus ;
    end;
    L'evento OnShow non viene modificato:
    codice:
    procedure TFrmFornitori.FormShow(Sender: TObject);
    begin
     Setta_Bottoni_Start;
    end;
    Quando l'evento viene generato, il metodo Setta_Bottoni_Start dell'istanza viene eseguito. Ciascun form condividerà lo stesso metodo che agirà, in fase di visualizzazione, sull'istanza corrente del form rappresentata dall'identificatore implicito Self.
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.