Visualizzazione dei risultati da 1 a 10 su 10

Discussione: delphi apertura form

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315

    delphi apertura form

    Ciao a tutti,

    sono un programmatore clipper che per ovvi motivi deve convertire delle procedure in un linguaggio funzionante sotto Windows.

    ho scelto delphi xke mi sembra molto malleabile.

    adesso pero....viene il bello!

    ho facilmente creato il menu con le varie opzioni, e adesso avrei intenzione di aprire una nuova form x ogni scelta di menu.

    il menu l'ho creato in una form MDI, ed ora con la prima scelta del menu (gestione archivio clienti) vorrei aprire una nuova form che si sovrapponga completamente alla form del menu, che rimanga attiva finquando non premo l'opposito pulsante di chiusura.

    sono agli inizi....se qualcuuno mi puo aiutare....grazie.

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

    Re: delphi apertura form

    Originariamente inviato da 123delphi321
    il menu l'ho creato in una form MDI, ed ora con la prima scelta del menu (gestione archivio clienti) vorrei aprire una nuova form che si sovrapponga completamente alla form del menu, che rimanga attiva finquando non premo l'opposito pulsante di chiusura.

    sono agli inizi....se qualcuuno mi puo aiutare....grazie. [/B]
    Manca la domanda... cosa ti serve sapere di preciso?

    Suggerirei di evitare, a meno di esigenze particolari, l'uso di un approccio MDI se non devi supportare drag and drop e altre cose simili...o meglio, con un uso intelligente dei frame si può fare senza MDI. Microsoft lo sta abbandonando per i propri applicativi appoggiandosi ad interfacce più intuitive e meno caotiche.

    Per sviluppare un'interfaccia MDI, la form principale (MainForm) deve avere la proprietà FormStyle impostata a fsMDIForm, mentre le finestre figlie che otterrai aggiungendo form al progetto dovranno avere la proprietà FormStyle impostata a fsMDIChild.

    Le form child MDI verranno visualizzate all'interno della form parent MDI. Aggiungendo form al progetto, otterrai varie unit (Unit2, Unit3 e così via) alle quali potrai dare un nome più significativo, sia ai file sia alle form che definiscono.

    Quando viene creata, ciascuna form viene visualizzata all'interno della form MDI parent.

    Occorre prestare attenzione alle opzioni del progetto, visualizzabili attraverso al voce di menu [Project|Options]: le form figlie non devono trovarsi nell'elenco delle "Auto-create forms", altrimenti verranno create automaticamente all'avvio del progetto e visualizzate nel form MDI parent. Solo la form principale dovrebbe trovarsi in tale elenco.

    Per creare una form dalla form principale, si dovrebbe aggiungere alla clausola uses il nome della unit che contiene il form di riferimento, poi scrivere nell'evento OnClick della voce di menu o del pulsante di attivazione un codice simile al seguente:
    codice:
      Application.CreateForm(TForm2, Form2);
    Spero di averti dato sufficienti indicazioni per il momento.

    Complimenti per la scelta di Delphi.

    Ciao!
    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
    Ciao a tutti,

    allora io sto iniziando, ho creato un formMDI (FrmMain) nel quale ho inserito un menu. Da questo menu ci sono le seguenti scelte:

    archivi fine
    operatori
    clienti
    stampa sheda

    all'evento click della scelta fine viene eseguito FrmMain.close e finisce l'appicazione.

    e fin qui e' tutto ok.

    poi ho creato una form nuova MdiChild che ho chiamato FrmOperatori dove in futuro gestiro la tabella degli operatori.
    Per adesso in questa form ho messo solo un pulsante che dovrebbe generare la chiusura della stessa FrmOperatori.

    Io vorrei che eseguendo il RUN il programma visualizzi solo la FrmMain e poi, a secondo della scelta si apra la form desiderata....

    Non succede cio che desideravo....
    eseguendo il programma si aprono contemporaneamente sia la form Main che la form operatori e quando eseguo frmOperatori.close, la stessa form, si iconiza in basso alla frmMain (che e' una mdi)

    andando nelle opzioni ho la possibilita di far caricare in partenza solo la frmMain....ma in questo caso quando richiamo frmoperatori.show il tutto va in errore.

    allego le units......

    una domanda a proposito delle unit: queste mi rappresentano il codice scritto x ogni form?! quindi alla form1 si associa Unit1 e cosi via..?

    se e' cosi, se la form1 la chiamo FrmMain come posso fare per far si che Unit1 si chiami UnitMain?


    help! grazie



    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, Menus;

    type
    TFrmMain = class(TForm)
    MainMenu1: TMainMenu;
    Archivi1: TMenuItem;
    Operatori1: TMenuItem;
    Clienti1: TMenuItem;
    N1: TMenuItem;
    StampaScheda1: TMenuItem;
    Fine1: TMenuItem;
    procedure Fine1Click(Sender: TObject);
    procedure Operatori1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    FrmMain: TFrmMain;

    implementation

    uses Unit2;

    {$R *.dfm}

    procedure TFrmMain.Fine1Click(Sender: TObject);
    begin
    frmmain.close;
    end;

    procedure TFrmMain.Operatori1Click(Sender: TObject);
    begin
    frmOperatori.show;
    end;

    end.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da 123delphi321
    andando nelle opzioni ho la possibilita di far caricare in partenza solo la frmMain....ma in questo caso quando richiamo frmoperatori.show il tutto va in errore.
    Da quello che scrivi, mi sembra che tu non abbia letto nulla della mia risposta precedente.

    Se la form non viene creata in automatico all'avvio del programma, devi caricarla usando Application.CreateForm come ti ho indicato. La chiamata di Show non dovrebbe essere necessaria nell'uso di form MDI.
    Solo una cosa: intercetta l'evento OnClose di ogni form MDI child e imposta il parametro Action al valore "caFree" per fare in modo che la memoria occupata da ogni form venga rilasciata quando la form stessa viene chiusa, ricreandola ogni volta su richiesta.

    una domanda a proposito delle unit: queste mi rappresentano il codice scritto x ogni form?! quindi alla form1 si associa Unit1 e cosi via..?
    I nomi attribuiti inizialmente da Delphi sono generici e poco significativi. Dovresti attribuire loro un nome che rimandi alla funzionalità; ad esempio, per quanto riguarda la form principale (MainForm), potresti chiamarla appunto "MainForm" dalla proprietà Name e salvare la unit con nome "frmMainForm.pas". La classe che rappresenta la form stessa viene automaticamente fatta precedere dalla lettera "T" che in Delphi, per convenzione, simboleggia un tipo di dato.

    se e' cosi, se la form1 la chiamo FrmMain come posso fare per far si che Unit1 si chiami UnitMain?
    File --> Save As...
    (ma ricordati di eliminare il file .PAS e .DFM che hanno il nome precedente dopo aver effettuato il salvataggio).
    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
    ...bene. ci sono riuscito....

    suul'evento click del menu.... ho creato la FrmOperatoti e questa all'atto della creazione viente automaticamente visualizzata, quindi non c'e' stato bisogno di fare FrmOperatori.show.
    E sull'evento on close ...libero tutta la memoria caFree.

    Adesso, avrei voluto disabilitare il menu della FrmMain, al fine di non permettere una ulteriore apertura della stessa FrmOperatori.

    in pratica dovrei fare questo:
    dal menu di FrmMain scelgo l'opzione "gestione Operatori"
    disattivo menu
    creo form operatori e opero in tale form fino alla chiusura
    chiudo formOperatori e libero la memoria
    riattivo il menu di FrmMain

    como posso disabilitare il menu esistente nel in FrmMain?

    grazie

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da 123delphi321
    [...]
    como posso disabilitare il menu esistente nel in FrmMain?
    Quando ti ho suggerito di non usare le form MDI, te lo dicevo perchè sapevo che ti saresti imbarcato in una simile avventura e, come avevo predetto, si rivela una fatica inutile.

    Ti spiego anche il perchè: l'approccio MDI introduce delle complicazioni all'interno del programma, poichè si tratta di una strutturazione particolare dell'applicazione che, se non giustificata, ti porta a scrivere il doppio del codice necessario senza che ve ne sia effettivamente bisogno, considerando anche tutte le possibilità di errore che potenzialmente puoi introdurre.

    Osserva la tua implementazione: perchè creare una form "madre" che può accettare una o più form "figlie" se si possono aprire solamente una alla volta? Alla luce di questa scelta, devi anche scrivere codice che sia in grado di regolare l'abilitazione delle voci di menu in accordo con la presenza di form aperti, complicando ulteriormente le cose.

    Non ti serve assolutamente una soluzione MDI: puoi usare benissimo form standard, magari che si possono aprire dalla form principale (MainForm) attraverso le voci di menu o una comoda toolbar.
    Al centro della form puoi visualizzare data, ora, un calendario, qualsiasi altra cosa utile ti venga in mente per la tua applicazione specifica, mentre puoi aprire le finestre individuali come quella che hai citato prima creandole e usando il metodo ShowModal il quale impedisce di accedere alle finestre sottostanti se la finestra in primo piano di quell'applicazione, denominata "modale", non viene chiusa.

    Risultato: nessuna necessità di accendere o spegnere ogni volta voci di menu, controllare se la finestra si trova in uno stato valido prima di uscire dall'applicazione, posizionare la finestra dove si vuole e darle le dimensioni desiderate...insomma, meno codice, più ottimizzazione ed intuitività al programma.

    Usare MDI ha senso se la tua applicazione deve trattare documenti che possono essere aperti simultaneamente, oppure se lasci la possibilità di aprire più finestre, quella dei clienti e magari quella degli operatori, passando dall'una all'altra in modo da poter aggiungere nell'una i dati che magari ti possono servire nell'altra, senza annullare le operazioni in corso.

    Ad ogni modo, se osservi i programmi Microsoft, con un occhio particolare ad Office - ad esempio - noterai che questo tipo di approccio è stato abbandonato quasi del tutto preferendo un'organizzazione più intuitiva che mantenga il layout della pagina.
    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
    ok. lascio questa strada delle MDI certamente obsoleta.

    il mio problema, stando all'inizio, e' quello di trovare una logica per scrivere queste applicazioni. Venendo da una logica di programmazione in dos, dove non esistevano finestre che si potevano spostare ma solo videate che si potevano sovrapporre.....

    adesso cercavo di fare ordine....

    Tu, gentile Marco, cosa mi consigli?
    prima hai parlato di toolbar....o di altro. Io vorrei solo fare un programma intuitivo e non dispersivo (nel senso di non fare aprire molte finestre contemporaneamente).....

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Ci sono molti modi che vanno dai più avanzati e complessi ai più semplici e facili da realizzare.

    In molte applicazioni, prediligo l'uso dei frame per costruire interfacce simili a quelle di Outlook, in cui si accede ad una singola pagina alla volta la quale viene visualizzata in un'area apposita del form principale, sostituita dalla nuova pagina quando l'utente fa una selezione diversa.
    Tuttavia, questo approccio è abbastanza complesso per chi non è abituato a lavorare nell'ottica Object Oriented.

    In alternativa, come ti ho scritto nel messaggio precedente, potresti visualizzare nella form principale dati salienti o interessanti che dovrebbero essere sempre in vista e predisporre un menu in grado di visualizzare, ad un clic sulla voce specifica, una form che rimane davanti alle altre consentendo di compiere le funzioni richieste. La finestra deve essere poi chiusa dall'utente quando ha terminato il lavoro per aprire un'altra sempre attraverso il menu principale.

    Ottenere questo effetto è abbastanza semplice: basta usare il metodo ShowModal del form; siccome la form va creata quando serve e diventa inutilizzata quando viene chiusa, è possibile richiamarla in questo modo:
    codice:
    var
      SomeForm: TSomeForm;
    begin
      Application.CreateForm(TSomeForm, SomeForm);
      try
        SomeForm.ShowModal;
      finally
        SomeForm.Free;
      end;
    end;
    Nell'esempio, il metodo ShowModal blocca l'esecuzione del codice (che potrebbe appartenere ad un evento OnClick sul menu) ridirezionando tutte le azioni sulla form "SomeForm" visualizzata; quanto questa viene chiusa attraverso i metodi convenzionali (pulsante X, menu di sistema) o con il metodo Close, il codice riportato procede nell'esecuzione distruggendo la form attraverso il metodo Free e tornando alla situazione precedente che consente l'apertura di una nuova finestra in modo analogo.

    Comunque, se tutto si sembra un po' strano e inedito, suggerirei la lettura di qualche libro su Delphi per apprendere i rudimenti nell'uso di finestre di dialogo e argomenti correlati.

    Ciao!
    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
    si, come vedo anche in questo caso alla partenza del mio programma devo far creare automaticamente solo la prima form FrmMain.

    si ok....usando showmodal credo di trovare una certa logica...
    ma si puo fare in modo che le form che creo facendo click sulle singole opzioni del menu siano contenute nella form principale? ...un po come le Form MDI che non devo usare x mitivi gia descritti

    grazie

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da 123delphi321
    ma si puo fare in modo che le form che creo facendo click sulle singole opzioni del menu siano contenute nella form principale? ...un po come le Form MDI che non devo usare x mitivi gia descritti
    Ipoteticamente sì, ma potrebbero crearsi problemi.

    Le form sono progettate per essere finestre distinte all'interno dell'applicazione. Ciò che potresti usare sono i frames: si tratta di "contenitori visuali" simili a form che possono essere farciti di controlli e utilizzati sia appoggiandoli usando la Palette dei Componenti (pagina "Standard"), oppure creandoli dinamicamente e visualizzandoli all'interno di un controllo contenitore predisposto, come un pannello, impostandone la proprietà 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.