ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 19 févr. 2005 à 11:15
Source mise à jour (voir les détails dans la partie "Historique de cette source")
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 18 févr. 2005 à 20:52
Merci pour tes remarques :)
Pour la propostition 1, c'est ce que j'avais pensé faire au départ, mais à chaque fois que l'on
bougeait sur la trackbar d'une unité, ça mettait des plombes à recharger les grandes images,
donc j'ai préféré utiliser le principe du "Rafraichir"...
2 : OK pas de prob
3 : c'est ce que j'envisageais de faire
4 : c'est vrai ça serait pratique je vais y penser ;)
5 : dsl, mais je n'ai pas trouvé de meilleure organisation pour ma fenêtre... :(
6 : je vais arranger ça...
7 : le nom de la Form4 n'a pas trop d'intérêt, mais bon....
@+
Nico
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 17 févr. 2005 à 19:34
J'ai enfin pris le Zip, et j'aurais quelques gadgets à faire ajouter:
1) Rendre dynamique TrackBar_CompressionChange(...);
2) Form4.ImageOnClick := FermerLaFenêtre ;
3) Gérer un ImagesDuDossier.MultiSelect, car j'ai 2746 Jpg à coincer
4) Faire éventuellement une fonction de remplacement de fichier: on le charge en mémoire, on comprime le stream, on suppr le fichier, et on enregistre.
5) J'ai pas de chance sur le coup: je suis en 800 par 600.
6) Un petit drag-drop de entre 2 listes box serait sympa (cf. les démos de Delphi)
7) Tiens ? Form4 ? C'est un nom pas nommé ça...
Au final, c'est un prog sympa. Un mauvais coup n'empêche pas un bien...
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 19 janv. 2005 à 21:08
Voilà c'est fait ;)
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 19 janv. 2005 à 18:18
C'est pas le tout, mais maintenant il faut le mettre à jour parce que j'ai vraiment envie de le compiler enfin une fois...
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 13 janv. 2005 à 12:06
Merci pour cette belle illustration GrandVizir ! ;)
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 6 janv. 2005 à 18:23
Ok! C'est très clair, grandvisir.
Merci beaucoup pour l'effort pédagogique!
( 'serai toujours étonné par le devouement de bcp, ici.
Ca fait plaisir à voir... :)
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 6 janv. 2005 à 17:04
J'ai trouvé un code pour illustrer Caribensila.
Vous vous rappelez qu'il fallait remplacer par:
AjouteImage.Enabled:= (ImagesDuDossier.ItemIndex<>-1);
Eh bien dans le code suivant, il ne faut pas le faire. La casse est respectée dans la liste. Pour ignorer la casse, utiliser LowerCase ou UpperCase.
function Recherche(var STL:TStringList; S:string):boolean;
var x : cardinal;
b : boolean;
begin
b:=false;
for x:=0 to STL.Count-1 do
if STL[x]=S then
b:=true;
Recherche:=b;
end;
Je suis passé volontairement par une variable B pour bien comprendre. Le principe est de dire si la chaîne S est contenue dans la liste STL (le VAR peut être omis selon DelphiProg, mais... pas d'embrouille please bien que ce soit un objet). Bref...
Dans le code de ni69, on a une situation en TOR (Tout Ou Rien). Le processus est indépendant de tout résultat antérieur. Or, dans ma boucle (qu'on aurait pu breaker), on défile tous les items de la liste et le résultat n'est rendu qu'une fois tous scannés. Le TOR n'existe plus. On est placé dans une continuité...
Ainsi, le code suivant est incorrect:
function Recherche(var STL:TStringList; S:string):boolean;
var x : cardinal;
b : boolean;
begin
b:=false;
for x:=0 to STL.Count-1 do
b:= STL[x]=S;
Recherche:=b;
end;
En effet... si la liste contient 2 items (on rappelle que l'index de liste commence à 0), et que S=STL[0], alors dans le code alors proposé, à la fin, le résultat est équivalent à b:= S=STL[1]; Ce qui est complètement faux, car en réalité, on devrait avoir: b:=S=STL[0];
En revanche, le code suivant est correct, mais plus lourd à la lecture.
function Recherche(var STL:TStringList; S:string):boolean;
var x : cardinal;
b : boolean;
begin
b:=false;
for x:=0 to STL.Count-1 do
begin
b:= STL[x]=S;
if b then Break;
end;
Recherche:=b;
end;
Pour en revenir à JulioDelphi... Le code suivant est bien sûr juste. Mais son exécution ne correspond pas à ce que tu attends:
begin //ID 1
begin //ID 2
end; //ID 1
end; //ID 2
Ce n'est pas un problème d'alignement. Ce dernier est justement là pour montrer qu'on voulait chevaucher les BEGIN...END. Pour être clair:
oooo> DELPHI interprète ainsi:
begin //ID 1
begin //ID 2
end; //ID 1
end; //ID 2
oooo> MAIS on voulait ce qui suit (et ce n'est pas pareil)
begin //ID 1
begin //ID 2
end; //ID 1
end; //ID 2
!!!!! C'EST POUR CELA QUE JE DIS QUE L'ALIGNEMENT DES CODES SOURCES PERMET D'EVITER DES ERREURS A LA *** !!!!!
J'espère que cela est rentré dans les têtes. Là, il n'y a pas beaucoup de lignes, mais parfois, j'ai des alignements qui font la largeur de l'écran. Donc... ça sert !
Sinon, ma proposition N°1 était effectivement fausse. Je ne sait pas ce que j'avais à ce moment... ??
Désolé que certains messages soient temporellement proches, mais des posts ont été postés simultanément si bien que j'ai bien été obligé de répondre immédiatement;)
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 5 janv. 2005 à 20:47
Bien sûr qu'il est mauvais... il est bon dans le sens où il n'est pas bon. Euh ? Il est correct pour l'illustration de la chose à ne pas faire.
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 5 janv. 2005 à 20:42
Non ce code HTML est signalé MAUVAIS par le W3C HTML 4.0 ... :(
mdr nan de tete voyons !!
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 5 janv. 2005 à 20:37
T'as pris une horloge atomique pour mesurer ? :)))
Ton exemple HTML est tout à fait correct. Je n'y avais pas pensé.
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 5 janv. 2005 à 20:35
GrandVizir :
- Merci pour la quatrième remarque : j'ai modifié ça :)
- Pour les commentaires, j'estime que je n'en mets pas de trop, étant donné le nombre de commentaires du forum traitant du manque de commentaires de certaines sources... je laisse donc tel quel.
- Pour Initialization / Finalization, je vais remplacer ça tout de suite : en effet j'y pense d'habitude, mais cette fois ci, j'avais oublié ;) Merci de me le rappeler !
JulioDelphi :
"Un effort et une originilatié ça serait pas mal pour le design et/ou pour la navigation dans les dossiers :) " >> Qu'entends-tu par navigation dans les dossiers ? Qu'est-ce qui ne vas pas ? Serais-ce le choix du répertoire de destination ? Pour le design, je vais réfléchir... En tout cas, merci pour tes messages :)
Caribensila : merci pour tes idées données dans ton MP. Je vais voir ce que je peux faire ;)
Je ne vais pas tarder à faire une MAJ... Merci de vos idées respectives ;)
Bonne Prog'
@+
Nico
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 5 janv. 2005 à 20:21
Merci a toi :) n'hesite pas a me MP pour une question admin, je suis a ton service.
je reprends :
Ceci est incorrect:
begin //ID 1
begin //ID 2
end; //ID 1
end; //ID 2
Ceci est en revanche correct:
begin //ID 1
begin //ID 2
end; //ID 2
end; //ID 1
mais une fois le code compilé : ça marche quand meme
a la lisibilité : c moche et mal ordonné
c un peu comme Gras et italique qui fonctionne mais pas correct, me trompe-je ?
cari : oui une fois le code compilé c idem, mais il se peut que on gagne 1/10 de nanoseconde :D
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 5 janv. 2005 à 20:21
Caribensila> Ca ne change rien. Seulement ça exploite les performances des booléens permettant ensuite de réduire les lignes de code. Par exemple:
if Checked then Checked:=false
else Checked=true;
Ceci peut se réduire à: Checked:=not Checked;
Attention: cela dépend des cas. On ne peut pas tjs faire la technique proposée. En fait, il faut analyser les cas... C'est pas évident à expliquer.
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 5 janv. 2005 à 20:17
Pour être clair, c'est le problème des emboîtements et des chevauchements... Par exemple, on ne peut pas chevaucher les BEGIN...END.
Ceci est incorrect:
begin //ID 1
begin //ID 2
end; //ID 1
end; //ID 2
Ceci est en revanche correct:
begin //ID 1
begin //ID 2
end; //ID 2
end; //ID 1
Par principe, on fait de même avec CREATE et FREE, et idem avec TRY...EXCEPT...FINALLY.
L'avantage principal est que ça évite des erreurs et des conflicts (mot qui ne prend bien sûr pas de "c", :).
Sinon: bravo à toi JD pour ton nouveau statut, et te souhaite une bonne nouvelle continuation... ;)
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 5 janv. 2005 à 20:04
Pour la 4ème remarque de grandvizir, j'aurais une question :
C'est vrai que la proposition de grandvizir est plus propre. Mais est-ce que ça change vraiment qq chose, une fois le code compilé?
Je précise ma question: Ne vaut-il pas mieux favoriser la lisibilité du code plutôt que sa compacité?
... ... ...
Pour les commentaires, c'est un peu pareil, je trouve. Un débutant comme moi se noie plus par la pénurie de commentaires que dans l'excès. ;)
Et quand on sait l'effort à fournir pour bien commenter un code que l'on connait par coeur, je dis bravo à ni69!
... ... ...
J'ai pas compris l'importance de l'ordre pour libérer les objets... Si on pouvait m'expliquer pour que je ne meurs pas tout à fait con... lol
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 5 janv. 2005 à 18:31
Ouè mais ici c pas un meuble :D, je veux dire "pourquoi faut il le faire ? parce que ..." voila au cas ou c t vraiment important.
il est vrai que pour son appli, il n'y a pas de confirmation, mais dans une prochaine MAJ on c jamais :p
Les Onclose et OnCloseQuery mélangées avec des libération de mémoire PLUS des confirmation de fermeture, il est vrai que ça peut poser des soucis mémorables (a moi en tout cas lol)
dsl du "n'importe quoi" c pas mechant comme d'hab :) mais mes yeux ont piqués !! lol
de toute façon on est d'accord : ni69 est un chef ! :D
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 5 janv. 2005 à 18:24
Je viens de voir que je n'ai pas répondu à une question. Pourquoi l'ordre est-il inversé ?
Une fois que tu as monté un meuble, pour le démonter tu n'enlèves pas la carosserie avant d'enlever les tiroirs... J'espère que cette image est explicite. La lévitation n'existe que dans l'Airbus Zéro-G.
:))
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 5 janv. 2005 à 18:20
Que de peur ! Le post était supprimé un moment (25 minutes)... j'ai pas tout pigé ! A part que les Script Error abondaient.
On va donc pouvoir reprendre...
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 5 janv. 2005 à 17:49
Merci de ne pas dire "n'importe quoi" lorsque cela n'est pas requis. Ou du moins, il faut nuancer... ;)
J'aurais plutôt mis "...mbNo],0)=idYes;" bien que idYes=mrYes dans Windows.pas. Ca ne change donc rien. Mélangeons donc les bananes et les citrons...
T'as raison pour les ShowMessage, mais sache que je n'ai demandé aucune confirmation. Dans l'exemple inconcevable que tu donnes, il est ridule de Freer car en définitive, tu n'es pas sûr si la fenêtre sera oui ou non fermée.
En réalité, mes objets sont Freés via FINALIZATION. Je n'ai donc pas de pb avec OnClose. En revanche, ta remarque est très pertinente.
En résumé:
OnCloseQuery autorise ou non l'exécution de OnClose
OnClose gère toutes les libérations de mémoire, si cela veut bien se faire correctement. Gare à d'éventuelles exceptions... qui ne fermeraient pas la fenêtre.
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 5 janv. 2005 à 16:43
GrandVizir : N'importe quoi ...
je reprends tes remarques :
------------------------------------------
1ere : OnClose est appelé lors du clic sur la croix de la form.
J'ai testé comme suis :
OnCloseQuery : ShowMessage('CloseQuery');
OnClose : ShowMessage('Close');
et en cliquant sur la croix, j'ai les messages "CloseQuery" pui apres le clic sur OK "Close"
Si ni69 mets ses free en closeQuery, et qu'il decide par la suite de mettre une demande de confirmation de fermeture du programme dedans ça donnera :
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := MessageDlg('Quitter ?',mtConfirmation,[mbYes,mbNo],0)=mrYes;
// ici mes free;
end;
mes ~.Free seront executés ALORS que j'en ai encore besoin CAR je ne quitte pas le programme ! (si je clic sur "non" bien sur)
----------------------------------------
2eme) pour une fois qu'il y a des commentaires, on ne va pas lui demander en plus de les formater :D ahah
-----------------------------------------
3eme) chui d'accord avec toi pour le initialization et finalization, tu peux expliquer pourquoi l'ordre des free est important ?
----------------------------------------
4eme) 1000% d'accord !
voila c tout :) rien de méchant mais j'ai été choqué par la 1ere lol
ni69 : je viens de le regarder et euh bah bien ! :) tu as meme vérifié que l'image ne sois pas ajoutée deux fois.
Un effort et une originilatié ça serait pas mal pour le design et/ou pour la navigation dans les dossiers :) mais bon l'idee reste bonne !
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 5 janv. 2005 à 16:19
jmp77> :))))))
ni69> Je serais enfin le premier à te dire qu'il existe des fichiers inutiles dans le Zip. Va voir à gauche dans... vous connaissez la suite. Sinon j'ai 4 remarques:
LA PREMIERE:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); doit devenir un évènement OnCloseQuery. OnClose est appelé via Form.Close. Or, si le user clique sur la croix, OnClose n'est pas appelé, contrairement à OnCloseQuery également appelée par Form.Close.
LA SECONDE:
Je suis noyé dans les commentaires... Met les tjs en bout de ligne. Sinon je sors fatalement mon code source 24746.
LA TROISIEME:
Pour remédier au pb des OnClose*, gère plutôt une structure du type suivant:
Si tu veux gérer uniquement des finalization, il faut impérativement avoir ceci. Ca va par couple.
initialization
finalization
MaJpg.Free;
end.
LA QUATRIEME:
Dans le cas unique qui est celui-ci, il est cohérent de remplacer
procedure TForm1.ImagesDuDossierClick(Sender: TObject);
begin
if (ImagesDuDossier.ItemIndex <> -1) then
AjouteImage.Enabled := True;
end;
Par: AjouteImage.Enabled:= (ImagesDuDossier.ItemIndex<>-1);
Notepad explique tout...
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 4 janv. 2005 à 17:32
Désolé, c'est un résidu d'une ancienne version... Tu peux le supprimer de uses...
Bonne Prog'
@+
Nico
jmp77
Messages postés1119Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention 4 octobre 20067 4 janv. 2005 à 13:12
Hello,
J'ai voulu tester et voici l erreur que j'ai eu à la compilation :
[Erreur fatale] Compress.dpr(7): Fichier non trouvé : 'ToolEdit.dcu'
19 févr. 2005 à 11:15
18 févr. 2005 à 20:52
Pour la propostition 1, c'est ce que j'avais pensé faire au départ, mais à chaque fois que l'on
bougeait sur la trackbar d'une unité, ça mettait des plombes à recharger les grandes images,
donc j'ai préféré utiliser le principe du "Rafraichir"...
2 : OK pas de prob
3 : c'est ce que j'envisageais de faire
4 : c'est vrai ça serait pratique je vais y penser ;)
5 : dsl, mais je n'ai pas trouvé de meilleure organisation pour ma fenêtre... :(
6 : je vais arranger ça...
7 : le nom de la Form4 n'a pas trop d'intérêt, mais bon....
@+
Nico
17 févr. 2005 à 19:34
1) Rendre dynamique TrackBar_CompressionChange(...);
2) Form4.ImageOnClick := FermerLaFenêtre ;
3) Gérer un ImagesDuDossier.MultiSelect, car j'ai 2746 Jpg à coincer
4) Faire éventuellement une fonction de remplacement de fichier: on le charge en mémoire, on comprime le stream, on suppr le fichier, et on enregistre.
5) J'ai pas de chance sur le coup: je suis en 800 par 600.
6) Un petit drag-drop de entre 2 listes box serait sympa (cf. les démos de Delphi)
7) Tiens ? Form4 ? C'est un nom pas nommé ça...
Au final, c'est un prog sympa. Un mauvais coup n'empêche pas un bien...
19 janv. 2005 à 21:08
19 janv. 2005 à 18:18
13 janv. 2005 à 12:06
6 janv. 2005 à 18:23
Merci beaucoup pour l'effort pédagogique!
( 'serai toujours étonné par le devouement de bcp, ici.
Ca fait plaisir à voir... :)
6 janv. 2005 à 17:04
Vous vous rappelez qu'il fallait remplacer par:
AjouteImage.Enabled:= (ImagesDuDossier.ItemIndex<>-1);
Eh bien dans le code suivant, il ne faut pas le faire. La casse est respectée dans la liste. Pour ignorer la casse, utiliser LowerCase ou UpperCase.
function Recherche(var STL:TStringList; S:string):boolean;
var x : cardinal;
b : boolean;
begin
b:=false;
for x:=0 to STL.Count-1 do
if STL[x]=S then
b:=true;
Recherche:=b;
end;
Je suis passé volontairement par une variable B pour bien comprendre. Le principe est de dire si la chaîne S est contenue dans la liste STL (le VAR peut être omis selon DelphiProg, mais... pas d'embrouille please bien que ce soit un objet). Bref...
Dans le code de ni69, on a une situation en TOR (Tout Ou Rien). Le processus est indépendant de tout résultat antérieur. Or, dans ma boucle (qu'on aurait pu breaker), on défile tous les items de la liste et le résultat n'est rendu qu'une fois tous scannés. Le TOR n'existe plus. On est placé dans une continuité...
Ainsi, le code suivant est incorrect:
function Recherche(var STL:TStringList; S:string):boolean;
var x : cardinal;
b : boolean;
begin
b:=false;
for x:=0 to STL.Count-1 do
b:= STL[x]=S;
Recherche:=b;
end;
En effet... si la liste contient 2 items (on rappelle que l'index de liste commence à 0), et que S=STL[0], alors dans le code alors proposé, à la fin, le résultat est équivalent à b:= S=STL[1]; Ce qui est complètement faux, car en réalité, on devrait avoir: b:=S=STL[0];
En revanche, le code suivant est correct, mais plus lourd à la lecture.
function Recherche(var STL:TStringList; S:string):boolean;
var x : cardinal;
b : boolean;
begin
b:=false;
for x:=0 to STL.Count-1 do
begin
b:= STL[x]=S;
if b then Break;
end;
Recherche:=b;
end;
Pour en revenir à JulioDelphi... Le code suivant est bien sûr juste. Mais son exécution ne correspond pas à ce que tu attends:
begin //ID 1
begin //ID 2
end; //ID 1
end; //ID 2
Ce n'est pas un problème d'alignement. Ce dernier est justement là pour montrer qu'on voulait chevaucher les BEGIN...END. Pour être clair:
oooo> DELPHI interprète ainsi:
begin //ID 1
begin //ID 2
end; //ID 1
end; //ID 2
oooo> MAIS on voulait ce qui suit (et ce n'est pas pareil)
begin //ID 1
begin //ID 2
end; //ID 1
end; //ID 2
!!!!! C'EST POUR CELA QUE JE DIS QUE L'ALIGNEMENT DES CODES SOURCES PERMET D'EVITER DES ERREURS A LA *** !!!!!
J'espère que cela est rentré dans les têtes. Là, il n'y a pas beaucoup de lignes, mais parfois, j'ai des alignements qui font la largeur de l'écran. Donc... ça sert !
Sinon, ma proposition N°1 était effectivement fausse. Je ne sait pas ce que j'avais à ce moment... ??
Désolé que certains messages soient temporellement proches, mais des posts ont été postés simultanément si bien que j'ai bien été obligé de répondre immédiatement;)
5 janv. 2005 à 20:47
5 janv. 2005 à 20:42
mdr nan de tete voyons !!
5 janv. 2005 à 20:37
Ton exemple HTML est tout à fait correct. Je n'y avais pas pensé.
5 janv. 2005 à 20:35
- Merci pour la quatrième remarque : j'ai modifié ça :)
- Pour les commentaires, j'estime que je n'en mets pas de trop, étant donné le nombre de commentaires du forum traitant du manque de commentaires de certaines sources... je laisse donc tel quel.
- Pour Initialization / Finalization, je vais remplacer ça tout de suite : en effet j'y pense d'habitude, mais cette fois ci, j'avais oublié ;) Merci de me le rappeler !
JulioDelphi :
"Un effort et une originilatié ça serait pas mal pour le design et/ou pour la navigation dans les dossiers :) " >> Qu'entends-tu par navigation dans les dossiers ? Qu'est-ce qui ne vas pas ? Serais-ce le choix du répertoire de destination ? Pour le design, je vais réfléchir... En tout cas, merci pour tes messages :)
Caribensila : merci pour tes idées données dans ton MP. Je vais voir ce que je peux faire ;)
Je ne vais pas tarder à faire une MAJ... Merci de vos idées respectives ;)
Bonne Prog'
@+
Nico
5 janv. 2005 à 20:21
je reprends :
Ceci est incorrect:
begin //ID 1
begin //ID 2
end; //ID 1
end; //ID 2
Ceci est en revanche correct:
begin //ID 1
begin //ID 2
end; //ID 2
end; //ID 1
mais une fois le code compilé : ça marche quand meme
a la lisibilité : c moche et mal ordonné
c un peu comme Gras et italique qui fonctionne mais pas correct, me trompe-je ?
cari : oui une fois le code compilé c idem, mais il se peut que on gagne 1/10 de nanoseconde :D
5 janv. 2005 à 20:21
if Checked then Checked:=false
else Checked=true;
Ceci peut se réduire à: Checked:=not Checked;
Attention: cela dépend des cas. On ne peut pas tjs faire la technique proposée. En fait, il faut analyser les cas... C'est pas évident à expliquer.
5 janv. 2005 à 20:17
Ceci est incorrect:
begin //ID 1
begin //ID 2
end; //ID 1
end; //ID 2
Ceci est en revanche correct:
begin //ID 1
begin //ID 2
end; //ID 2
end; //ID 1
Par principe, on fait de même avec CREATE et FREE, et idem avec TRY...EXCEPT...FINALLY.
L'avantage principal est que ça évite des erreurs et des conflicts (mot qui ne prend bien sûr pas de "c", :).
Sinon: bravo à toi JD pour ton nouveau statut, et te souhaite une bonne nouvelle continuation... ;)
5 janv. 2005 à 20:04
C'est vrai que la proposition de grandvizir est plus propre. Mais est-ce que ça change vraiment qq chose, une fois le code compilé?
Je précise ma question: Ne vaut-il pas mieux favoriser la lisibilité du code plutôt que sa compacité?
... ... ...
Pour les commentaires, c'est un peu pareil, je trouve. Un débutant comme moi se noie plus par la pénurie de commentaires que dans l'excès. ;)
Et quand on sait l'effort à fournir pour bien commenter un code que l'on connait par coeur, je dis bravo à ni69!
... ... ...
J'ai pas compris l'importance de l'ordre pour libérer les objets... Si on pouvait m'expliquer pour que je ne meurs pas tout à fait con... lol
5 janv. 2005 à 18:31
il est vrai que pour son appli, il n'y a pas de confirmation, mais dans une prochaine MAJ on c jamais :p
Les Onclose et OnCloseQuery mélangées avec des libération de mémoire PLUS des confirmation de fermeture, il est vrai que ça peut poser des soucis mémorables (a moi en tout cas lol)
dsl du "n'importe quoi" c pas mechant comme d'hab :) mais mes yeux ont piqués !! lol
de toute façon on est d'accord : ni69 est un chef ! :D
5 janv. 2005 à 18:24
Une fois que tu as monté un meuble, pour le démonter tu n'enlèves pas la carosserie avant d'enlever les tiroirs... J'espère que cette image est explicite. La lévitation n'existe que dans l'Airbus Zéro-G.
:))
5 janv. 2005 à 18:20
On va donc pouvoir reprendre...
5 janv. 2005 à 17:49
J'aurais plutôt mis "...mbNo],0)=idYes;" bien que idYes=mrYes dans Windows.pas. Ca ne change donc rien. Mélangeons donc les bananes et les citrons...
T'as raison pour les ShowMessage, mais sache que je n'ai demandé aucune confirmation. Dans l'exemple inconcevable que tu donnes, il est ridule de Freer car en définitive, tu n'es pas sûr si la fenêtre sera oui ou non fermée.
En réalité, mes objets sont Freés via FINALIZATION. Je n'ai donc pas de pb avec OnClose. En revanche, ta remarque est très pertinente.
En résumé:
OnCloseQuery autorise ou non l'exécution de OnClose
OnClose gère toutes les libérations de mémoire, si cela veut bien se faire correctement. Gare à d'éventuelles exceptions... qui ne fermeraient pas la fenêtre.
5 janv. 2005 à 16:43
je reprends tes remarques :
------------------------------------------
1ere : OnClose est appelé lors du clic sur la croix de la form.
J'ai testé comme suis :
OnCloseQuery : ShowMessage('CloseQuery');
OnClose : ShowMessage('Close');
et en cliquant sur la croix, j'ai les messages "CloseQuery" pui apres le clic sur OK "Close"
Si ni69 mets ses free en closeQuery, et qu'il decide par la suite de mettre une demande de confirmation de fermeture du programme dedans ça donnera :
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := MessageDlg('Quitter ?',mtConfirmation,[mbYes,mbNo],0)=mrYes;
// ici mes free;
end;
mes ~.Free seront executés ALORS que j'en ai encore besoin CAR je ne quitte pas le programme ! (si je clic sur "non" bien sur)
----------------------------------------
2eme) pour une fois qu'il y a des commentaires, on ne va pas lui demander en plus de les formater :D ahah
-----------------------------------------
3eme) chui d'accord avec toi pour le initialization et finalization, tu peux expliquer pourquoi l'ordre des free est important ?
----------------------------------------
4eme) 1000% d'accord !
voila c tout :) rien de méchant mais j'ai été choqué par la 1ere lol
ni69 : je viens de le regarder et euh bah bien ! :) tu as meme vérifié que l'image ne sois pas ajoutée deux fois.
Un effort et une originilatié ça serait pas mal pour le design et/ou pour la navigation dans les dossiers :) mais bon l'idee reste bonne !
5 janv. 2005 à 16:19
ni69> Je serais enfin le premier à te dire qu'il existe des fichiers inutiles dans le Zip. Va voir à gauche dans... vous connaissez la suite. Sinon j'ai 4 remarques:
LA PREMIERE:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); doit devenir un évènement OnCloseQuery. OnClose est appelé via Form.Close. Or, si le user clique sur la croix, OnClose n'est pas appelé, contrairement à OnCloseQuery également appelée par Form.Close.
LA SECONDE:
Je suis noyé dans les commentaires... Met les tjs en bout de ligne. Sinon je sors fatalement mon code source 24746.
LA TROISIEME:
Pour remédier au pb des OnClose*, gère plutôt une structure du type suivant:
var MaJPg : TJpegImage;
implementation
[...]
initialization
MaJPG:=TJpegImage.Create;
finalization
MaJPG.Free;
end.
Et bien sûr, il faut Free dans l'ordre inverse des ordres de création. Exemple:
initialization
Jpg1.Create;
Jpg2.Create;
finalization
Jpg2.Free;
Jpg1.Free;
end.
Si tu veux gérer uniquement des finalization, il faut impérativement avoir ceci. Ca va par couple.
initialization
finalization
MaJpg.Free;
end.
LA QUATRIEME:
Dans le cas unique qui est celui-ci, il est cohérent de remplacer
procedure TForm1.ImagesDuDossierClick(Sender: TObject);
begin
if (ImagesDuDossier.ItemIndex <> -1) then
AjouteImage.Enabled := True;
end;
Par: AjouteImage.Enabled:= (ImagesDuDossier.ItemIndex<>-1);
Notepad explique tout...
4 janv. 2005 à 17:32
Bonne Prog'
@+
Nico
4 janv. 2005 à 13:12
J'ai voulu tester et voici l erreur que j'ai eu à la compilation :
[Erreur fatale] Compress.dpr(7): Fichier non trouvé : 'ToolEdit.dcu'
++,
JMP77.