Question

Quelqu'un sait ce qui est différent au sujet de la gestion de Delphi 2009 « avec »?

Je fixe un problème hier juste en déconstruisant « avec » pour les références complètes, comme dans « avec datamodule, Dataset, MainForm ». Delphi 2006 et les versions antérieures appliquées « Fermer » au DataSet. Delphi 2009 appliquée "Fermer" à la MainForm et est sorti de l'application!

Était-ce utile?

La solution

Rien n'a changé. Votre observation précédente était erronée. Les objets mentionnés dans une déclaration de with sont considérés comme « droite à gauche », donc dans votre exemple, MainForm serait recherché d'abord, puis Dataset, puis Datamodule. Voilà comment il a toujours été. Il est le même que si vous aviez écrit ceci:

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

Allez-y et consultez la documentation Delphi 2006; il devrait y avoir une section intitulée Déclarations et déclarations , sous lequel vous trouverez Instructions structurées , y compris la section Avec des déclarations .

Faites-vous une faveur et ne pas utiliser with. Il provoque des difficultés sans fin à la fois pendant le débogage et lors de l'entretien, où l'entretien pourrait même être effectuée par la personne qui a écrit le code la veille.

Autres conseils

With est le mal. Je ne sais pas combien de fois je dois dire, mais apparemment nous ne sommes pas encore là.

ne peut « en toute sécurité » être utilisé avec des objets qui ne vont jamais changer. Si vous l'appliquez à des objets que vous définissez dans votre propre projet, tous les paris sont ouverts et je vous daresay devriez plutôt utiliser « if au hasard (50) <25 » pièces pour exécuter votre code, il est au moins documenté à exécuter curieusement.

Le problème est qu'une fois que vous commencez à jouer avec un objet, l'introduction de nouvelles méthodes ou propriétés, ou renommer les anciens, toutes les déclarations de with existantes qui utilisent ces méthodes a le potentiel de changer le sens. Et pas dans le: changement « Attention appel à la méthode ambiguë » non plus. Le code va juste faire autre chose qu'il a fait auparavant. Sans vous dire à ce sujet.

Par exemple, supposons que vous avez ceci:

with connection, file do
begin
    Close;
end;

alors qu'attendez-vous arriver? Eh bien, il est naturel de fermer un fichier, donc j'attendre que le fichier soit fermé. Supposons en outre que cette variable de fichier contient un objet de type TSomeOddFile qui ne définit pas une méthode Close, mais plutôt une méthode CloseFile. Avec ce qui précède-déclaration sera ensuite fermer la connexion à la place.

Tout bon, il est documenté, personne a écrit ce morceau de code penser que le dossier serait fermé, après tout, la méthode est nommé CloseFile pour cet objet, il est juste mon hypothèse est fausse et je ne travaille pas sur la projet. Et pourtant.

Et puis quelqu'un fixe que, renommer CloseFile fermer. Le code ci-dessus commencera silencieusement fermer le fichier au lieu de la connexion. Aucun avertissement, aucune erreur, compile aussi bien qu'avant vous avez modifié le nom de la méthode. Fonctionne aussi bien ^ h ^ h ^ h, sans attendre, il ne sera pas.

Alors oui, with vous mordre dans le un **.

L'utilisation with A,B,C,D est une mauvaise pratique puisque les changements à d'autres unités peuvent provoquer subitement votre code d'arrêter de travailler comme prévu. Voir pour plus d'informations, ou ici (recherche "with keyword").

Le compilateur est généralement assez solide, donc je ne prendrait pas un bug ou changer avant de vraiment tout le reste exclu. Certaines choses que je peux penser rapidement:

1) Regardez si vous utilisez des fonctions ou opérateurs surchargées. Étant donné que la définition de STRING (et plusieurs autres types) changé, une variante peut être choisie différente, car la signature change effectivement.

2) il peut également être inclus qu'une certaine unité définit maintenant un identificateur qui est déjà utilisé, et en prenant la priorité sur celle qui est exposée dans une unité différente.

Dans le cas contraire, commencer à isoler le code dans un exemple minimal, en utilisant des unités aussi peu que possible. Ne pas à pas, puisque l'affaire est que le dernier changement a été lorsque le comportement a changé.

Post que (ou une URL) ici, il est toujours intéressant de voir.

With..do doit être utilisé avec précaution. Dans le cas contraire, est une source infinie de maux de tête .... Je suis d'accord avec Rob Kennedy et d'autres.

Craig Stuntz ( dans un autre post sur with..do ) et Lasse V. Karlsen ci-dessus dit, with..do peut créer beaucoup de pièges.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top