File et Folder 2

Je rouvre un message sur le sujet; le précédent ayant dévié au delà de File et Folder.

J’utilise ces deux commandes intéressantes mais elles m’ont posé deux problèmes :

  • ayant besoin des valeurs retournées par les commandes, j’ai copié les objets renvoyés par File et Folder ; les objets n’étant pas modifiables, j’ai dû créer une méthode pour copier les propriétés une par une ; pas très compliqué…, https://forums.4d.com/4DBB_Main/x_User/4018/files/33173430.zipla voici> pour ceux qui seraient intéressés
  • j’ai besoin d’effacer les propriétés de l’objet résultant de la copie ; or l’objet File comporte deux propriétés ‘original’ et ‘parent’ qui apparaissent comme des objets type 38 ; en réalité, ils se comportent comme un lien récursif qui renvoie indéfiniment vers lui-même ; et comme il renvoie vers un objet de type File ou Folder, les propriétés de l’objet ‘parent’ ou ‘original’ ne sont pas effaçables.

Ma méthode est récursive afin de n’effacer que les propriétés, elle se bloque sur deux objets ‘parent’ et ‘original’.
Pour le moment, j’ai fait une méthode spécifique mais j’aimerais être plus générique.
Comment détecter que ces objets ne sont pas comme les autres ?
Il me semble qu’au lieu de renvoyer vers un objet, on aurait dû mettre un chemin que, le cas échéant on aurait exploré avec un File ou Folder.

Bernard,
The object returned by File and Folder is not editable, that’s true. You use the methods to make changes, save, so forth. We don’t have the option of adding custom properties. I’m not sure it would be a good idea if we could.

You can add the entire File object to another object:
<code 4D>
$file_o.myProperty:=“yada yada”
$file_o.file : = File ( $ Path_t ; fk platform path)

</code 4D>

I had probably a side effect because I can now copy.
Thanks Kirk.

Copy was my initial intent ; I do it with :
<code 4D>
$folder_o:=Folder($Path_t;fk platform path)
$o.files.folderContent:=$o.files.folderContent.push($folder_o)

</code 4D>
Now, it is OK.

Bonjour Bernard,

juste une remarque: tu n’es pas obligé d’écrire
<code 4D>
$folder_o:=Folder($Path_t;fk platform path)
$o.files.folderContent:=$o.files.folderContent.push($folder_o)
</code 4D>

tu peux tout simplement écrire:
<code 4D>
$folder_o:=Folder($Path_t;fk platform path)
$o.files.folderContent.push($folder_o)
</code 4D>

Info issue de la doc: La méthode collection.push( ) ajoute un ou plusieurs élément(s) à la fin de la collection d’origine et retourne la collection modifiée.
Note : Cette méthode modifie la collection d’origine.

Patrick

: Patrick EMANUEL

tu peux tout simplement écrire:
Code 4D :

1 $folder_o:=Folder($Path_t;fk platform path)
2 $o.files.folderContent.push($folder_o)

Bien noté cette simplification !

Je reviens sur ce que j’ai dit hier ; j’ai refait l’essai suivant :
<code 4D>
C_OBJECT($file_o)
C_OBJECT($fileCopy_o)
C_TEXT($path_t)
$Path_t:=“SSG4T:0:aa.json”
$file_o:=File($Path_t;fk platform path)
//$fileCopy_o:=New object => cette déclaration ne semble pas utile
$fileCopy_o:=OB Copy($file_o)
$fileCopy_o.aaa:=“zz”

</code 4D>
Il se traduit par le message d’erreur
[]33000707;“Your comment here…”[/]

Si je fais
<code 4D>
C_OBJECT($file_o)
C_OBJECT($fileCopy_o)
C_TEXT($path_t)
$path_t:=“SSG4T:0:aa.json”
$file_o:=File($Path_t;fk platform path)
$fileCopy_o:=New object
OB GET PROPERTY NAMES($file_o;$properties_ta;$propertiesTypes_la)
For ($i;1;Size of array($properties_ta))
$fileCopy_o[$properties_ta{$i}]:=$file_o[$properties_ta{$i}]
End for
$fileCopy_o.aaa:=“zz”

</code 4D>
Cette fois-ci, ça se passe bien.

Dans mon premier message, j’essayais de modifier l’objet File ; ça ne me choque pas que ce soit impossible.
Mais la copie est une nouvelle référence qui devrait être indépendante de l’original, non ?
Pouvez-vous tester ?

Bonsoir Bernard,

Je dirai que oui, tu as raison, si le contenu retourné par ‘file’ était connu et exactement conforme à un objet.
Cependant, je pense qu’il y a d’autres paramètres non accessibles par nous qui définissent ‘file’.
C’est, je dirai, un peu comme le cas de ‘New Transporter’. Cela ressemble à un objet, mais pas que :wink:

Du coup, faire ‘.copy’ copie la partie objet mais aussi ce qui n’est pas accessible.
En conclusion, oui c’est normal que cela ne fonctionne pas, enfin de mon point de vue.
Si je me trompe, merci à un 4Dman/4Dwoman de bien vouloir nous en donner la raison.

Patrick

File ou Folder retournent un objet. Un objet est un objet, celui-ci n’a pour seul particularité que d’être en lecture seule.
La manipulation de Bernard est tout à fait possible mais coûteuse, la suggestion de Kirk est plus intéressante si vraiment on veut faire plus que ce qui existe déjà (personnellement, j’utilise depuis plus d’un an sans avoir trouvé de limite).
Mais soyez un peu patient :wink:

Je retiens, Vincent, que le fameux objet File est bloqué à la
modification, ce qui semblait déjà acquis mais cela n’explique pas que
la copie par OB COPY soit aussi non modifiable, à moins qu’un autre
développeur me dise que ça fonctionne chez lui avec le code que j’ai
donné.

: Vincent DE LACHAUX

La manipulation de Bernard est tout à fait possible mais coûteuse, la
suggestion de Kirk est plus intéressante si vraiment on veut faire
plus que ce qui existe déjà (personnellement,
Coûteux ?
Tu veux dire que la copie d’un objet est longue ?
Je vous tiendrai au courant de la pratique…

A quoi ça sert ?
De manière simplifiée, je fais beaucoup de photos (j’en ai 140000) et
j’ai besoin de les gérer, renommer, copier, déplacer,… 4D me permet
de faire des traitements en masse que ne me permettent pas les
logiciels du marché.
Exemple : j’ai dans le même répertoire la photo en RAW, la photo en
JPEG, la même photo JPEG développée par DxO, le fichier sidecar de
DxO, le fichier sidecar json.
Quand j’affiche le contenu du répertoire, je n’affiche qu’une
occurence ; il faut un certain nombre de traitements pour y arriver ;
les commandes File et Folder me permettent de réécrire mes méthodes de
manière beaucoup plus efficace.
Je fais bien d’autres traitements comme de mettre des tags IPTC/XMP,
de les copier en les redimensionnant et en superposant un titre.

Pourquoi préféré-je ma solution à celle de Kirk ?
Je préfère pour des raisons sémantiques ou esthétiques, comme vous
voudrez, avoir au même niveau de notation les propriétés issues de
File et les propriétés additionnelles ; ça me paraît plus facile à
manipuler.

$file_o.name (issu de File)
$file.copyright (tag ajouté par moi)
$file.selected (drapeau indiquant que le fichier est sélectionné)

: Bernard ESCAICH

Je préfère pour des raisons sémantiques ou esthétiques, comme vous
voudrez, avoir au même niveau de notation les propriétés issues de
File et les propriétés additionnelles ; ça me paraît plus facile à
manipuler.

Tu trouveras peut-être des idées dans ce “https://github.com/vdelachaux/classeswork in progress>”.

J’utilise ces “classes” dans mes développements et c’est une bonne approche du futur…

Aïe, ça demande un cours pour comprendre et mettre en oeuvre !
J’ai cherché dans la doc, notamment sur This mais, s’il y a beaucoup d’informations de détail, il manque une explication globale sur les concepts, donc beaucoup de travail pour se mettre au niveau…
A suivre.

Vincent,

Tu crées des member functions sur un objet ?
Ca n’est pas dans la doc.

J’ai regardé cette https://download.4d.com/Documents/4D-Germany/4D_Events/4DSummit2018-PostClass_EN.pdfprésentation du Summit 2018> où on parle de member functions sur les objets qui n’existent pas encore (page 92), même en V18.

C’est pour quand ?

Bonjour Bernard,

je pense qu’il faut que tu te rapproches du Blog, il y a plein d’articles qui devraient t’aider.

https://blog.4d.com/new-formula-more-power-behind-simplicity/

en est un exemple :wink:

Patrick

La commande New formula (renommée Formula) est disponible depuis la 17R3.
Ce projet est v17R5+, et à fortiori v18, compatible…

Patrick,

Je l’avais bien lu mais sans doute pas bien compris.
La doc est assez éparpillée mais on décrit bien les ‘Formula’ au chapitre Objet de la doc Langage.
Je comprends un peu mieux les “classes” de Vincent !
Il faut lire et relire et mettre en application.

il ya aussi celui-ci : https://blog.4d.com/write-your-own-methods-for-objects/WRITE YOUR OWN METHODS FOR OBJECTS>

Oui, tout à fait.
merci Vincent pour ce rappel.

Patrick

Aussitôt lu, aussitôt testé.
Il faut préciser que les commandes ont renommées (New Formula -> Formula).

Au fait, sur un blog, on devrait pouvoir écrire des remarques ?

Je l’ai examiné avec attention mais j’avoue être bloqué.
J’ai pu faire tourner ‘environment’ mais pas les autres ; même en examinant le fonctionnement en mode trace.

Le but ne me paraît pas clair.
Quel avantage par rapport à une méthode classique ?
Il faudrait une base de démo et un peu de texte explicatif !
Comme https://forums.4d.com/Post/EN/32986281/0/0/#33031390dit plus haut>, le sujet a été abordé il y a 18 mois au Summit ; tous les autres thèmes ont été développés et j’arrive à les mettre en oeuvre mais pas celui-là ; j’ai bien lu toutes les docs…

As tu lu la
<https://github.com/vdelachaux/classes/tree/master/Project/Documentatio

documentation>, très partielle je te l’accorde, que j’ai déjà écrite
sur les classes “database”, “svg” et “menu” (le reste viendra au fil
du temps, mais je n’ai que 2 mains). Pour la class “menu” il y a un
exemple de code que je juge très lisible.

J’essaye d’ajouter des méthodes HTU_xxx (How To Use) pour montrer du
code.

Tu peux également aller voir le projet
https://github.com/vdelachaux/pathPickerpathPicker>. C’est un widget
mais qui utilise la même technique.

: Bernard ESCAICH

Quel avantage par rapport à une méthode classique ?
Toute la complexité du code est masquée dans la class, quand tu l’utilise le code écrit est immédiatement lisible. Un petit exemple :

<code 4D>
$Mnu_bar:=Create menu
$Mnu_edit:=Create menu

APPEND MENU ITEM($Mnu_edit;Get localized string(“CommonMenuItemUndo”))
SET MENU ITEM PROPERTY($Mnu_edit;-1;Associated standard action;_o_Undo action)
SET MENU ITEM SHORTCUT($Mnu_edit;-1;“Z”;Command key mask)

APPEND MENU ITEM($Mnu_edit;Get localized string(“CommonMenuRedo”))
SET MENU ITEM PROPERTY($Mnu_edit;-1;Associated standard action;_o_Redo action)
SET MENU ITEM SHORTCUT($Mnu_edit;-1;“Z”;Shift key mask)

APPEND MENU ITEM($Mnu_edit;"-")

APPEND MENU ITEM($Mnu_edit;Get localized string(“CommonMenuItemCut”))
SET MENU ITEM PROPERTY($Mnu_edit;-1;Associated standard action;_o_Cut action)
SET MENU ITEM SHORTCUT($Mnu_edit;-1;“X”;Command key mask)

APPEND MENU ITEM($Mnu_edit;Get localized string(“CommonMenuItemCopy”))
SET MENU ITEM PROPERTY($Mnu_edit;-1;Associated standard action;_o_Copy action)
SET MENU ITEM SHORTCUT($Mnu_edit;-1;“C”;Command key mask)

APPEND MENU ITEM($Mnu_edit;Get localized string(“CommonMenuItemPaste”))
SET MENU ITEM PROPERTY($Mnu_edit;-1;Associated standard action;_o_Paste action)
SET MENU ITEM SHORTCUT($Mnu_edit;-1;“V”;Command key mask)

APPEND MENU ITEM($Mnu_edit;Get localized string(“CommonMenuItemClear”))
SET MENU ITEM PROPERTY($Mnu_edit;-1;Associated standard action;_o_Clear action)

APPEND MENU ITEM($Mnu_edit;Get localized string(“CommonMenuItemSelectAll”))
SET MENU ITEM PROPERTY($Mnu_edit;-1;Associated standard action;_o_Select all action)
SET MENU ITEM SHORTCUT($Mnu_edit;-1;“A”;Command key mask)

APPEND MENU ITEM($Mnu_edit;"(-")

APPEND MENU ITEM($Mnu_edit;Get localized string(“CommonMenuItemShowClipboard”))
SET MENU ITEM PROPERTY($Mnu_edit;-1;Associated standard action;_o_Show clipboard action)

APPEND MENU ITEM($Mnu_bar;Get localized string(“CommonMenuEdit”);$Mnu_edit)
RELEASE MENU($Mnu_edit)

SET MENU BAR($Mnu_bar)
</code 4D>

devient :

<code 4D>
$o:=menu .append(":xliff:CommonMenuEdit";menu .edit()).setBar()
</code 4D>

Tu peux aussi essayer ce code sur le clic d’un bouton :

<code 4D>
$menu:=menu .fonts().popup()

If ($menu.selected)

$font:=$menu.choice

  //...

End if
</code 4D>

Ajoute True à la méthode fonts

<code 4D>
menu .fonts(True).popup()
</code 4D>

et vois la différence

Autre exemple pour un bouton :

<code 4D>
$menu:=menu .windows().popup()

If ($menu.selected)

window($menu.choice).bringToFront()

End if
</code 4D>

Mais rien ne t’empêche de faire en reprenant l’exemple de la barre de menu:

<code 4D>
$o:=menu
.append(":xliff:CommonMenuEdit";menu .edit())
.append(“Polices”;menu .fonts(True))
.append(“Fenêtres”;menu .windows())
.setBar()

</code 4D>