Dll et liste chainée
Publié : mar. 01/mai/2012 18:33
salut
J'ai essayé de créer une dll pour permettre de sauvegarder des données (positions, et autres) des "objets" de mes éditeurs (2d et 3D).
Mais je n'arrive pas à sauvegarder la liste (list()) de ces objets via cette dll.
Savez-vous comment on fait ça avec une liste en globale si possible (ou un pointeur, si on est obligé ^^) ?
le code de la dll :
Un code test pour essayer.
L'idée c'est de sauvegarder les 11 objets, mais ça n'enregistre que la première ligne.
J'ai essayé de créer une dll pour permettre de sauvegarder des données (positions, et autres) des "objets" de mes éditeurs (2d et 3D).
Mais je n'arrive pas à sauvegarder la liste (list()) de ces objets via cette dll.
Savez-vous comment on fait ça avec une liste en globale si possible (ou un pointeur, si on est obligé ^^) ?
le code de la dll :
Code : Tout sélectionner
#savefile = 0
;{ structure
Structure vector3
x.w : y.w : z.w
EndStructure
Structure StObject3D
size.w
pos.vector3 : rot.vector3
type.a ; le type d'objet : 0 = object3D, 1 = light, 2 = water (createwaterr(), 4=createterrain, etc...
name$ : meshname$ : materialname$
entityId.w
EndStructure
Global NewList object.StObject3D()
;}
ProcedureDLL SaveScene3D()
file$=SaveFileRequester("Save","","*.ark",0)
MessageRequester("",Str(ListSize(object())))
If file$ <>""
If OpenFile(#savefile,RemoveString(file$,".ark")+".ark")
WriteStringN(#savefile,"Scene 3D créée avec l'éditeur Arkeos Scene Editor 3D (Ase3D) - 2012")
ForEach object()
With object()
Select \type
Case 0 ; objet 3D
param$ = "{Obj}"+Str(\entityId)+"/"+Str(\pos\x)+"/"+Str(\pos\y)+"/"+Str(\pos\z)+"/"
WriteStringN(#savefile,param$)
Case 1 ; light
param$ = "{Light}"+Str(\entityId)+"/"+Str(\pos\x)+"/"+Str(\pos\y)+"/"+Str(\pos\z)+"/"
WriteStringN(#savefile,param$)
EndSelect
EndWith
Next
CloseFile(#savefile)
EndIf
EndIf
EndProcedure
ProcedureDLL OpenScene3D()
EndProcedure
L'idée c'est de sauvegarder les 11 objets, mais ça n'enregistre que la première ligne.
Code : Tout sélectionner
;{ Infos
; sauvegarder avec un fichier dll pour l'import/export (format)
; save witht a dll for import/export format
; date : 29 april 2012
; author : blendman
; pb : 4.61b2 win xp x32
;}
;{ Structure
Structure vector3
x.w : y.w : z.w
EndStructure
Structure StObject3D
size.w
pos.vector3 : rot.vector3
type.a ; le type d'objet : 0 = object3D, 1 = light, 2 = water (createwaterr(), 4=createterrain, etc...
name$ : meshname$ : materialname$
entityId.w
EndStructure
Global NewList object.StObject3D()
For i = 0 To 10
AddElement(object())
With object()
\entityId = i
\pos\x = Random(500)
\pos\y = Random(500)
\pos\z = Random(200)
EndWith
Next i
;}
;{ enum, constante
#savefile =0
Enumeration
#Win_0
EndEnumeration
;}
;{ declare
Declare SaveAsDll() : Declare OpenAsDll()
;}
;{ window
flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
If OpenWindow(#Win_0, 0,0,800, 600, "Dll import/export", flag)
EndIf
SetWindowColor(#win_0,RGB(120,120,120))
;{ menu
CreateMenu(0,WindowID(#win_0))
MenuTitle("Fichier")
MenuItem(0,"Ouvrir")
MenuItem(1,"Enregistrer")
;}
;}
;{ loop
Repeat
Event =WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
quit=1
Case #PB_Event_Menu
Select EventMenu()
Case 0; ouvrir fichier
OpenAsDll()
Case 1 ; enregistrer fichier
SaveAsDll()
EndSelect
EndSelect
Until quit
;}
;{ procedures
Procedure SaveAsDll()
If OpenLibrary(0, "export.dll")
CallFunction(0, "SaveScene3D")
CloseLibrary(0)
EndIf
EndProcedure
Procedure OpenAsDll()
If OpenLibrary(0, "export.dll")
CallFunction(0, "OpenScene3D")
CloseLibrary(0)
EndIf
EndProcedure
;}