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

    [DELPHI] Creare più istanze di TFrame senza perdere valore delle variabili

    Ciao a tutti,

    ho questo problema:

    ho un Tframe che si chiama TFrameTabella.
    Quando creo questo frame lo inserisco all�interno di un Tform!

    Quando creo TFrameTabella imposto una variabile al suo interno dove indico quale il nome della tabella da gestire:

    ad esempio gestisco la tabella ANAGRAFICHE .TFrameTabella(ANAGRAFICHE)
    codice:
    var
    ....
      MyForm:TForm;
      MyFrame:TFrameTabellaII;
    ....
    
    
    try  
       screen.Cursor := crHourGlass;
       MyForm:=TForm.Create(Self);
       i:=0;
       while DM.FindComponent('MyForm'+IntToStr(i))<> nil do i:=i+1;
       MyForm.Name :='MyForm'+IntToStr(i);
       MyForm.Position:=poMainFormCenter;
    
    
          MyFrame:=TFrameTabellaII.Create(self);
          i:=0;
          while DM.FindComponent('MyFrame'+IntToStr(i))<> nil do i:=i+1;
          MyFrame.Name :='MyFrame'+IntToStr(i);
          MyFrame.Parent:=MyForm;
          MyFrame.Align:=alClient;
          MyFrame.InitializePage;
          MyForm.Hint:='ANAGRAFICHE';
          MyForm.Width := (screen.ActiveForm as TForm).Width-40;;
          MyForm.Height:= (screen.ActiveForm as TForm).Height-40;;
          if (MyForm.Showmodal = mrOk) then
           begin
           //
           end;
    finally
       screen.Cursor := crHourGlass;
       FreeAndNil(MyFrame);
       FreeAndNil(MyForm);
       screen.Cursor := crDefault;
    end;
    all'interno di questo frame gestisco i dati della tabella ANAGRAFICHE tra cui il field IDCOMUNE che fa riferimento alla tabella COMUNI.
    IDCOMUNE è un campo dblookup.

    Da questa TFrameTabella(ANAGRAFICHE) tramite un pulsante creo un nuovo TFORM e un nuovo TframeTabella(COMUNI) per gestire la tabella COMUNI. Il nuovo form viene visualizzato in modalità SHOWMODAL quindi attivo fino alla sua chiusura.

    sempre lo stesso codice già postato. cambia solo il nome della tabella
    codice:
    var
    ....
      MyForm:TForm;
      MyFrame:TFrameTabellaII;
    ....
    
    
    try  
       screen.Cursor := crHourGlass;
       MyForm:=TForm.Create(Self);
       i:=0;
       while DM.FindComponent('MyForm'+IntToStr(i))<> nil do i:=i+1;
       MyForm.Name :='MyForm'+IntToStr(i);
       MyForm.Position:=poMainFormCenter;
    
    
          MyFrame:=TFrameTabellaII.Create(self);
          i:=0;
          while DM.FindComponent('MyFrame'+IntToStr(i))<> nil do i:=i+1;
          MyFrame.Name :='MyFrame'+IntToStr(i);
          MyFrame.Parent:=MyForm;
          MyFrame.Align:=alClient;
          MyFrame.InitializePage;
          MyForm.Hint:='COMUNI';
          MyForm.Width := (screen.ActiveForm as TForm).Width-40;;
          MyForm.Height:= (screen.ActiveForm as TForm).Height-40;;
          if (MyForm.Showmodal = mrOk) then
           begin
           //
           end;
    finally
       screen.Cursor := crHourGlass;
       FreeAndNil(MyFrame);
       FreeAndNil(MyForm);
       screen.Cursor := crDefault;
    end;
    una volta chiusi i TFORM e TframeTabella(COMUNI) il controllo rientra alprecedente TframeTabella(ANAGRAFICHE) dove però non ritrovo più le mie variabili precedenti come se si fossero ripulite

    cosa sbaglio?????
    per favore qualcuno mi sa aiutare?

    grazie in anticipo

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    una volta chiusi i TFORM e TframeTabella(COMUNI) il controllo rientra alprecedente TframeTabella(ANAGRAFICHE) dove però non ritrovo più le mie variabili precedenti come se si fossero ripulite

    cosa sbaglio?????
    per favore qualcuno mi sa aiutare?
    Dove salvi l'informazione della tabella su cui deve lavorare il Form o il Frame?
    Hai riportato il codice di creazione di Form e Frame, ma non sappiamo come sono implementati.

    In merito a questo:
    codice:
    var
    ....
      MyForm:TForm;
      MyFrame:TFrameTabellaII;
    ....
    dove si trovano queste variabili? Sono campi di una classe, oppure sono variabili globali?
    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,326
    Ciao Marco e grazie

    salvo qui:

    MyForm.Hint:='COMUNI';

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    codice:
    procedure TFrameTabellaII.cxButton1Click(Sender: TObject);var
     MioForm:TForm;
     MioFrame:TFrameTabellaII;
     i:Integer;
    begin
      inherited;
    
    
       try
         Screen.Cursor:=crHourGlass;
         MioForm:=TForm.Create(nil);
         i:=0; while DM.FindComponent('MioForm'+IntToStr(i))<> nil do i:=i+1;
         MioForm.Caption :='tttttt';
         MioForm.Name :='MioFormtttttt';
         MioForm.Position:=poMainFormCenter;
    
    
         MioFrame:=TFrameTabellaII.Create(nil);
         i:=0; while DM.FindComponent('MioFrame'+IntToStr(i))<> nil do i:=i+1;
         MioFrame.Name :='MioFrametttttt';
         MioFrame.Parent:=MioForm;
         MioFrame.Hint:='Comuni';
         MioFrame.Align:=alClient;
         //MioFrame.ADataset:=ADataSet;
    
    
         //MioFrame.cxGridDocumentiAllegatiLevel.GridView:=MioFrame.cxGVT_DocumentiAllegati;
         //MioFrame.dxLayoutControlItemNavigatoreMaster.Visible:=not MioFrame.cxGVT_DocumentiAllegati.Navigator.Visible;
    
    
         MioFrame.InitializePage;
    
    
    	   if (MioForm.Showmodal = mrOk) then
           begin
           //
           end;
    
    
       finally
         //cxGridTabellaIIDettaglio01Level.GridView:=cxGridViewRDBTVDocumentiAllegati;
         MioFrame.ClosePage;
         Screen.Cursor:=crDefault;
         //FreeAndNil(MioFrame);
         FreeAndNil(MioForm);
       end;
    end;

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Prima scrivi questo
    codice:
    MyForm.Hint:='COMUNI';
    poi però nel codice completo scrivi:
    codice:
    MioFrame.Hint:='Comuni';
    mentre nella prima versione del codice era la prima versione.

    Dove va questo valore, nel Form o nel Frame?
    Perché poi la proprietà Hint?
    A che serve il ciclo con DM.FindComponent()?

    Vi sono poi righe inspiegabili, tipo MioFrame.Name :='MioFrametttttt';, che non hanno una motivazione logica a mio avviso.

    Il codice va rifattorizzato, e per determinare quello che accade e non corrisponde al comportamento atteso, bisogna fare debug.

    Per quello che ho visto, non saprei dire perché avviene ciò che avviene, ma sono anche sorpreso che non vi siano altri problemi oltre a quello, perché il codice è davvero farraginoso, poco leggibile. Sorry.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    il frametabellaII è:

    type
    TFrameTabellaII = class(TMyCustomPageFrame)

    il TMyCustomPageFrame è il frame che tu mi suggeristi di utilizzare...
    un frame Vuoto con dentro 3 eventi...:

    public
    { Public declarations }
    procedure InitializePage; virtual;
    procedure ClosePage; virtual;
    procedure RefreshStyle; virtual;
    end;



    non so se ricordi....

    per passare un parametro che nel mio caso è il nome della tabella (da anni fa - quando avevo ancora meno conoscenza di oggi-) utilizzavo sempre la proprieta hint del frame che creavo.

    codice:
    procedure TFrmMain.ShowPage(PageClass: TMyPageFrameClass; Pulsante:String);
    begin
    
    
      if PageClass = nil then Exit;
    
    
      if (FCurrentPage <> nil) and (FCurrentPage.Hint = Pulsante)
         then Exit;
    
    
      if FCurrentPage <> nil then
      begin
       // FrmMain.Caption:=NomeProgramma+' - '+NomeOperatore ;
        screen.Cursor := crHourGlass;
        FCurrentPage.ClosePage;
        FCurrentPage.Free;
        FCurrentPage := nil;
        screen.Cursor := crDefault;
      end;
      FCurrentPage := PageClass.Create(Self);
      FCurrentPage.Hint := Pulsante;
      try
        if FCurrentPage <> nil then
        begin
          screen.Cursor := crHourGlass;
          FCurrentPage.Parent := FrmMain ;
          FCurrentPage.InitializePage;
          screen.Cursor := crDefault;
        end;
      except              
        screen.Cursor := crHourGlass;
        FCurrentPage.ClosePage;
        FrmMain.Caption:=NomeProgramma+' - '+NomeOperatore ;
        FCurrentPage.Free;
        FCurrentPage := nil;
        try
        ShowPage(TFrameMenuPulsanti,MenuHome.Name);
        except
        end;
        screen.Cursor := crDefault;
      end;
    end;
    adesso, in più, sul frame ho messo un tbutton con il quale visualizzo una finestra MODALE nella quale gestire la tabella 'COMUNI' (non è importante se minuscolo o MAIUSCOLO)

    il findcomponent lo utilizzo per assegnare al nuovo form e al nuovo frame un nome univoco ma certamente da come mi fai intendere è inutile! nell'esempio HO SBAGLIATO per la fretta scusa. ....
    MioFrame.Name :='MioFrametttttt'+IntToStr(i);


  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    il frametabellaII è:

    type
    TFrameTabellaII = class(TMyCustomPageFrame)

    il TMyCustomPageFrame è il frame che tu mi suggeristi di utilizzare...
    Quella classe era il nome di un TFrame creato da zero.
    Non è una classe da utilizzare, è il nome di una classe di un semplice TFrame, nulla di più nulla di meno.

    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    un frame Vuoto con dentro 3 eventi...:

    public
    { Public declarations }
    procedure InitializePage; virtual;
    procedure ClosePage; virtual;
    procedure RefreshStyle; virtual;
    end;
    Non sono eventi, sono metodi.

    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    non so se ricordi....
    Sì, ma quella implementazione - nella sua incarnazione specifica - funzionava senza problemi: bisogna vedere come è stata modificata in seguito e quale codice è stato aggiunto che non è correlato specificatamente alla gestione dei Frame in sé (es. logiche di business).

    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    per passare un parametro che nel mio caso è il nome della tabella (da anni fa - quando avevo ancora meno conoscenza di oggi-) utilizzavo sempre la proprieta hint del frame che creavo.
    Io avrei creato una proprietà ad hoc: la proprietà Hint serve ad altro e piegarla a utilizzi diversi è fuorviante, oltre al fatto che potrebbero servire potenzialmente altre proprietà per veicolare più informazioni, quindi meglio aggiungere proprietà pubbliche per i propri scopi, con un nome che indichi a cosa servono.

    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    adesso, in più, sul frame ho messo un tbutton con il quale visualizzo una finestra MODALE nella quale gestire la tabella 'COMUNI' (non è importante se minuscolo o MAIUSCOLO)
    C'è qualcosa in quella gestione che non funziona o "calpesta" i piedi a porzioni di codice in cui non si deve passare.
    Non posso dirti cosa non va con gli elementi che abbiamo in mano.
    Fai debug passo per passo e verifica cosa avviene nel flusso di lavoro dell'applicazione.

    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    il findcomponent lo utilizzo per assegnare al nuovo form e al nuovo frame un nome univoco ma certamente da come mi fai intendere è inutile! nell'esempio HO SBAGLIATO per la fretta scusa. ....
    Se non è nemmeno sicuro che il codice sia esattamente quello che hai scritto, come si fanno a dare indicazioni?
    Ad ogni modo, rilancio l'idea di fare debug passo per passo mettendo appositi breakpoint nei punti nevralgici e verificando lo stato delle variabili e il valore rispetto a quello atteso, e come si arriva a determinati punti nella sequenza di istruzioni che viene eseguita.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    Ciao Marco e grazie sempre per le tue generose spiegazioni.

    nell'immediato ho risolto mettendo sul frame un componente TdxMemData (tClientDataset) nel quale vado a scrivere il nome della tabella. In questo modo evito di fare riferimento alla proprieta Hint che, come anche tu consigli, serve ad altro.

    adesso 'sembra' funzionare, sto continuando con i TEST


    Se non è nemmeno sicuro che il codice sia esattamente quello che hai scritto, come si fanno a dare indicazioni?
    Ad ogni modo, rilancio l'idea di fare debug passo per passo mettendo appositi breakpoint nei punti nevralgici e verificando lo stato delle variabili e il valore rispetto a quello atteso, e come si arriva a determinati punti nella sequenza di istruzioni che viene eseguita.
    il DEBUG lo uso sempre! e' proprio con il debug che mi sono reso conto che le variabili venivano annullate

    io per fare un esempio più semplice ho fatto copia/incolla di alcune parti di codice. Ma io non ho problemi a darti tutti i sorgenti che tra l'altro sono tutti 'tuoi nipoti' visto che tutto quello che conosco di Delphi è perchè tu me lo hai spiegato

    grazie sempre!

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    il DEBUG lo uso sempre! e' proprio con il debug che mi sono reso conto che le variabili venivano annullate
    Ok, però sembra una "verifica successiva", ovvero che hai riscontrato solo *dopo* che le variabili venivano "annullate".

    Devi cercare tutti i punti in cui quelle variabili vengono valorizzate e mettere il breakpoint: in questo modo riesci a determinare *quando* le variabili vengono "svuotate", che è una informazione molto più rilevante. Esaminando poi il call stack, estrapoli la catena delle chiamate e in sostanza il motivo per cui stai "passando di lì".

    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    io per fare un esempio più semplice ho fatto copia/incolla di alcune parti di codice. Ma io non ho problemi a darti tutti i sorgenti che tra l'altro sono tutti 'tuoi nipoti' visto che tutto quello che conosco di Delphi è perchè tu me lo hai spiegato
    Questo però uscirebbe dalle prerogative del forum: quello di cui si discute non va a beneficio di tutti e diventa come una sorta di "consulenza privata", che purtroppo non ho il tempo di fare. :|
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    Ciao a tutti,

    ill TframeTabella è cosi:
    codice:
    type
      TFrameTabellaII = class(TMyCustomPageFrame)
        ......
        ......
      private
        { Private declarations }
      protected
      public
        { Public declarations }
        procedure InitializePage; override;
        procedure ClosePage; override;
      end;
    
    
    var
      PRS_TabellaGestita:String;
    quando dal menu principale lo richiamavo io assegnavo alla proprietà TframeTabella.hint il nome della tabella da gestire es.: TframeTabella.hint:='Anagrafiche'

    e poi, nel metodo intializepage, assegnavo PRS_TabellaGestita:=Self.hint;
    in modo da memorizzare il nome della tabella da gestire nella variabile PRS_TabellaGestita

    e funzionaVA senza intoppi fino a quando dallo stesso TframeTabella ho ricreato (tramite un tbutton posto sullo stesso TframeTabella ) un nuovo TframeTabella per gestire una ulteriore tabella es.: TframeTabella.hint:='Comuni'
    codice:
    procedure TFrameTabellaII.cxButton1Click(Sender: TObject);var
     MioForm:TForm;
     MioFrame:TFrameTabellaII;
    begin
      inherited;
    
       try
         Screen.Cursor:=crHourGlass;
         MioForm:=TForm.Create(nil);
         MioForm.Position:=poMainFormCenter;
    
         MioFrame:=TFrameTabellaII.Create(nil);
         MioFrame.Hint:='Comuni';
         MioFrame.Align:=alClient;
         MioFrame.InitializePage;
    
           if (MioForm.Showmodal = mrOk) then
           begin
           //
           end;
    
       finally
         MioFrame.ClosePage;
         Screen.Cursor:=crDefault;
         FreeAndNil(MioFrame);
         FreeAndNil(MioForm);
       end;
    end;
    il problema nasce nel momento in cui viene eseguito FreeAndNil(MioFrame);la variabile PRS_TabellaGestita non ha più alcun valore!

    ho risolto il problema dichiarando quella variabile nella sezione private

    codice:
    type
      TFrameTabellaII = class(TMyCustomPageFrame)
        ......
        ......
      private
        { Private declarations }
        PRS_TabellaGestita:String;
      protected
      public
        { Public declarations }
        procedure InitializePage; override;
        procedure ClosePage; override;
      end;
    graie per l'aiuto
    Ultima modifica di 123delphi321; 03-02-2025 a 09:37

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.