Adresse mémoire d'un gadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Adresse mémoire d'un gadget

Message par Ulix »

Boujour a tous,

Ce topic : http://www.purebasic.fr/french/viewtopic.php?t=6379
ma inspirer une question.

Comment récupérer l'adresse mémoire d'un gadget (une combo) ?

Le but etant d'y transferé les données sans passé par une moulinette.

pour plus explication éssayé le code si dessous.

Code : Tout sélectionner

If OpenWindow(0, 100, 100, 600, 200, "Nouvelle liste", #PB_Window_SystemMenu)
If CreateGadgetList(WindowID(0))
		
		
		ComboBoxGadget(1, 50, 20, 450, 100)
EndIf



Taille.b=10
Dim Source.s(Taille)
Dim Destination.s(Taille)

;  Remplissage du tableau
For aa=0 To 10
  Source(aa)="Ce Tableau de texte doit etre envoyé dans la combo, sans faire de moulinette" + Str(aa)
Next



;comment faire pour remplir la combo sans passé par une moulinette,

; exemple de moulinette
For aa = 0 To Taille
AddGadgetItem(1, aa, Source(aa))
Next aa
SetGadgetState(1, 0)						;selection le 1er element 

; mais plutôt avec un truc du genre 
; CopyMemory(@Source(),@Combo, ((Taille+1)*4))


; avec des tableaux ça marche bien, 
CopyMemory(@Source(),@Destination(), ((Taille+1)*4))


; mais avec un objet simple comme une combo ou une liste view : comment faire ?
; Quelqu'un  sait-il comment récupérer l'adresse mémoire du gadget ?


; Vérification que la copy mémoire a bien fonctionné ! 
For aa=0 To 10
  Debug Source(aa)+"          "+ Destination(aa)
Next 

Repeat
EventID = WaitWindowEvent()
Until EventID = #PB_Event_CloseWindow
EndIf

Merci d'avance :lol:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Code de Flype avec correction concernant les OS natif unicode

Code : Tout sélectionner

#nItem = 50000

Enumeration
  #gCombo
  #gText1
  #gText2
  #gDo1
  #gDo2
EndEnumeration

Procedure Do1()
  SetGadgetText(#gText1,"Processing...")
  ClearGadgetItemList(#gCombo)
  time = ElapsedMilliseconds()
  For i=0 To #nItem
    AddGadgetItem(#gCombo,i,RSet(Str(i),8,"0")+":$"+RSet(Hex(i),8,"0"))
  Next
  SetGadgetText(#gText1,Str(ElapsedMilliseconds()-time)+" ms")
  SetGadgetState(#gCombo,0)
EndProcedure
   
Procedure Do2()
  SetGadgetText(#gText2,"Processing...")
  ClearGadgetItemList(#gCombo)
  time = ElapsedMilliseconds()
  ;############################################################
  BufferSize.l = #nItem * 20*2 ;(on multipli par 2 pour les os natif unicode)
  SendMessage_(GadgetID(#gCombo),#CB_INITSTORAGE,0,BufferSize)
  ;############################################################
  For i=0 To #nItem
    AddGadgetItem(#gCombo,i,RSet(Str(i),8,"0")+":$"+RSet(Hex(i),8,"0"))
  Next
  SetGadgetText(#gText2,Str(ElapsedMilliseconds()-time)+" ms")
  SetGadgetState(#gCombo,0)
EndProcedure

If OpenWindow(0,150,150,200,85,"Number of items : "+Str(#nitem),#PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0))
    ComboBoxGadget(#gCombo,5,5,190,300)
    TextGadget(#gText1,5,30,90,22,"",#PB_Text_Border)
    TextGadget(#gText2,105,30,90,22,"",#PB_Text_Border)
    ButtonGadget(#gDo1,5,58,90,22,"Test 1")
    ButtonGadget(#gDo2,105,58,90,22,"Test 2")
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow: Break
        Case #PB_Event_Gadget
          Select EventGadget()
          Case #gDo1: Do1()
          Case #gDo2: Do2()
          EndSelect
      EndSelect
    ForEver
  EndIf
EndIf
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

oui, en effet, il n'y a pas de formule magique pour tout copier en une ligne. ceci dit le gain de temps est déjà très important grace a CB_INITSTORAGE.

un autre exemple qui remplit le combo depuis un tableau,
on calcule le nombre de caractères de chaque chaine dans le tableau
(x2 pour l'unicode au cas où)
et on demande à windows d'allouer la mémoire avant le remplissage

Code : Tout sélectionner

Enumeration
  #gCombo
  #gText1
  #gText2
  #gDo1
  #gDo2
EndEnumeration

Global TableCount.l = 100000
Global Dim Table.s(TableCount + 1)

For i = 0 To TableCount
  Table(i) = RSet(Str(i), 8, "0") + ":$" + RSet(Hex(i), 8, "0")
Next

Procedure TableStringLength(userArray.s(1), userArrayCount.l)
  Protected i.l, n.l 
  For i = 0 To userArrayCount 
    n + (Len(userArray(i)) * 2) + 2 
  Next 
  ProcedureReturn n 
EndProcedure 

Procedure Do1()
  SetGadgetText(#gText1, "Processing...")
  ClearGadgetItemList(#gCombo)
  time = ElapsedMilliseconds()
  For i = 0 To TableCount
    AddGadgetItem(#gCombo, i, Table(i))
  Next
  SetGadgetText(#gText1, Str(ElapsedMilliseconds() - time) + " ms")
  SetGadgetState(#gCombo, 0)
EndProcedure

Procedure Do2()
  SetGadgetText(#gText2, "Processing...")
  ClearGadgetItemList(#gCombo)
  time = ElapsedMilliseconds()
  ;############################################################
  SendMessage_(GadgetID(#gCombo), #CB_INITSTORAGE, TableCount, TableStringLength(Table(), TableCount))
  ;############################################################
  For i = 0 To TableCount
    AddGadgetItem(#gCombo, i, Table(i))
  Next
  SetGadgetText(#gText2, Str(ElapsedMilliseconds() - time) + " ms")
  SetGadgetState(#gCombo, 0)
EndProcedure

If OpenWindow(0,150,150,200,85,"Number of items : "+Str(TableCount),#PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0))
    ComboBoxGadget(#gCombo,5,5,190,300)
    TextGadget(#gText1,5,30,90,22,"",#PB_Text_Border)
    TextGadget(#gText2,105,30,90,22,"",#PB_Text_Border)
    ButtonGadget(#gDo1,5,58,90,22,"Test 1")
    ButtonGadget(#gDo2,105,58,90,22,"Test 2")
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow: Break
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #gDo1: Do1()
            Case #gDo2: Do2()
          EndSelect
      EndSelect
    ForEver
  EndIf
EndIf
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Message par Ulix »

Merci Nico et Flype pour ses codes.
Je vais les étudier de près !


:lol:
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

[Resolu] Adresse mémoire d'un gadget

Message par Ulix »

Ulix a écrit :Boujour a tous,

Ce topic : http://www.purebasic.fr/french/viewtopic.php?t=6379
ma inspirer une question.

Comment récupérer l'adresse mémoire d'un gadget (une combo) ?

Le but etant d'y transferé les données sans passé par une moulinette.

pour plus explication éssayé le code si dessous.

Code : Tout sélectionner

If OpenWindow(0, 100, 100, 600, 200, "Nouvelle liste", #PB_Window_SystemMenu)
If CreateGadgetList(WindowID(0))
		
		
		ComboBoxGadget(1, 50, 20, 450, 100)
EndIf



Taille.b=10
Dim Source.s(Taille)
Dim Destination.s(Taille)

;  Remplissage du tableau
For aa=0 To 10
  Source(aa)="Ce Tableau de texte doit etre envoyé dans la combo, sans faire de moulinette" + Str(aa)
Next



;comment faire pour remplir la combo sans passé par une moulinette,

; exemple de moulinette
For aa = 0 To Taille
AddGadgetItem(1, aa, Source(aa))
Next aa
SetGadgetState(1, 0)						;selection le 1er element 

; mais plutôt avec un truc du genre 
; CopyMemory(@Source(),@Combo, ((Taille+1)*4))


; avec des tableaux ça marche bien, 
CopyMemory(@Source(),@Destination(), ((Taille+1)*4))


; mais avec un objet simple comme une combo ou une liste view : comment faire ?
; Quelqu'un  sait-il comment récupérer l'adresse mémoire du gadget ?


; Vérification que la copy mémoire a bien fonctionné ! 
For aa=0 To 10
  Debug Source(aa)+"          "+ Destination(aa)
Next 

Repeat
EventID = WaitWindowEvent()
Until EventID = #PB_Event_CloseWindow
EndIf

Merci d'avance :lol:
Répondre