Domanda

Qualcuno sa cosa c'è di diverso Delphi 2009 gestione "con"?

Ho risolto un problema che, ieri, decostruendo "con" piena di riferimenti, in "con il Datamodule, set di dati, MainForm".Delphi 2006 e precedenti applicato "Chiudi" per il set di dati.Delphi 2009 applicata "Chiudi" per la MainForm e uscito l'applicazione!

È stato utile?

Soluzione

Non è cambiato nulla. La tua osservazione precedente era sbagliata. Gli oggetti menzionati in una nota with sono considerati "da destra a sinistra", così nel tuo esempio, MainForm sarebbe cercato per primo, poi Dataset, e poi Datamodule. Ecco come è sempre stato. E 'lo stesso che se avessi scritto questo:

with Datamodule do
  with Dataset do
    with MainForm do begin
      Close;
    end;

Vai avanti e controllare la documentazione Delphi 2006; ci dovrebbe essere una sezione denominata Le dichiarazioni e le dichiarazioni , sotto il quale si trovano dichiarazioni strutturati , compresa la sezione Con le dichiarazioni .

Fatevi un favore e non utilizzare with. Essa provoca senza fine di problemi sia in fase di debugging e durante la manutenzione, in cui la manutenzione potrebbe anche essere effettuata dalla persona che ha scritto il codice appena il giorno prima.

Altri suggerimenti

With è il male.Non so quante volte ho bisogno di dire questo, ma a quanto pare non ci siamo ancora arrivati.

Con solo può "tranquillamente" essere utilizzato con gli oggetti che non sono mai sta per cambiare.Se lo si applica a oggetti è possibile definire il proprio progetto, tutte le scommesse sono spenti e mi piacerebbe ch'è meglio usare solo "se Casuale(50)<25" parti per eseguire il codice, è almeno documentato eseguito in modo strano.

Il problema è che una volta che si inizia a fare scherzi con un oggetto, l'introduzione di nuovi metodi o proprietà, o la ridenominazione vecchio, tutti quelli esistenti with-le istruzioni che utilizzano tali metodi ha il potenziale per cambiare significato.E non il "Warning:Chiamata a ambigua metodo" si modifica.Il codice sarà solo fare qualcosa di diverso rispetto a quanto avveniva in precedenza.Senza dirvi su di esso.

Per esempio, si supponga di avere questo:

with connection, file do
begin
    Close;
end;

dunque, cosa vi aspettate che succeda?Beh, è naturale per chiudere un file, quindi mi aspetto che il file deve essere chiuso.Supponiamo ancora che questo file variabile contiene un oggetto di tipo TSomeOddFile che non definisce un metodo di chiusura, ma piuttosto un CloseFile metodo.Di cui sopra Con-dichiarazione di chiudere la connessione, invece.

Tutto bene, è documentato, nessuno ha scritto questo pezzo di codice pensare che il file sarebbe stato chiuso, dopo tutto, il metodo è denominato CloseFile per l'oggetto, è solo una mia ipotesi che è sbagliato e io non lavoro sul progetto.Di sicurezza.

E poi qualcuno correzioni, ridenominazione CloseFile per Chiudere.Il codice di cui sopra verrà automaticamente iniziare a chiusura invece il file di connessione.Nessun avviso, nessun errore, compila altrettanto bene come prima hai cambiato il nome del metodo.Funziona altrettanto bene^h^h^h, no, aspetta, non.

Quindi sì, with ti morderà in un**.

Utilizzando with A,B,C,D è cattiva pratica dal momento che le modifiche ad altre unità possono improvvisamente causare il codice per smettere di lavorare come previsto. Vedi qui per ulteriori informazioni, oppure qui (ricerca di "with keyword").

Il compilatore è di solito abbastanza solida, quindi non avrebbe assunto un bug o cambiare prima che realmente escluso tutto il resto. Alcune cose mi viene in mente subito di:

1) Cercare se si utilizzano funzioni o operatori sovraccarico. Poiché la definizione di STRING (e diversi altri tipi) cambiato, una variante differente può essere scelto, perché la firma effettivamente cambia.

2) può inoltre essere che alcune unità incluso ora definisce un identificatore che è già utilizzato, e prendendo precedenza su quella esposta in un'unità diversa.

In caso contrario, avviare isolare il codice in un esempio minimo, utilizzando come piccole unità possibile. Non passo dopo passo, dal momento che il trucco è quello che l'ultimo cambiamento è stato quando il comportamento è cambiato.

Inserisci che (o un URL) qui, è sempre interessante vedere.

With..do deve essere usato con cautela. In caso contrario, è una fonte infinita di mal di testa .... Sono d'accordo con Rob Kennedy e altri.

Craig Stuntz ( in altri post su with..do ) e Lasse V. Karlsen sopra detto, with..do can creare un sacco di trappole.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top