Page 1 sur 2

...

Publié : ven. 07/mai/2004 23:03
par Dr. Dri
...

Publié : ven. 07/mai/2004 23:13
par Dr. Dri
...

Publié : ven. 07/mai/2004 23:18
par Flype
essaye çà :

Code : Tout sélectionner

Procedure pointe_truc( StructPtr ) 
  *ptr.truc = StructPtr
  Debug *ptr\machin
EndProcedure

Publié : ven. 07/mai/2004 23:22
par Dr. Dri
...

Publié : ven. 07/mai/2004 23:31
par nico
@Dri

Ton premier exemple fonctionne très bien, il y a juste une erreur:

Code : Tout sélectionner

Procedure pointe_truc(*ptr.truc) 
  ;Debug PeekL(ptr\machin) ;le pointeur a diparu et si tu le rajoute tu n'as plus besoin de PeekL puisque tu pointes sur une variable.
  ;la ligne au dessus pose problème... 
EndProcedure 
Ce qui donne:

Code : Tout sélectionner

Procedure pointe_truc(*ptr.truc) 
  Debug *ptr\machin
EndProcedure 
:)

Publié : ven. 07/mai/2004 23:31
par Flype
regarde on est obligé de faire ce genre de chose dans bien des
cas avec l' API windows. j'ai appris comme çà.

Code : Tout sélectionner

#DI_NORMAL = $0003 

Procedure WindowCallback(WindowID, Message, wParam, lParam) 
  Result = #PB_ProcessPureBasicEvents 
  Select Message 
    Case #WM_DRAWITEM 
      *DrawItem.DRAWITEMSTRUCT = lParam ; <------------- ICI
      If *DrawItem\CtlType = #ODT_COMBOBOX 
        SetBkMode_(*DrawItem\hDC, #TRANSPARENT)
        If *DrawItem\ItemState & #ODS_FOCUS 
          Brush = CreateSolidBrush_($FFEEFF) 
          FillRect_(*DrawItem\hDC, *DrawItem\rcItem, Brush) 
          DeleteObject_(Brush) 
          SetTextColor_(*DrawItem\hDC, $FF) 
        Else 
          FillRect_(*DrawItem\hDC, *DrawItem\rcItem, GetStockObject_(#WHITE_BRUSH)) 
        EndIf 
        If *DrawItem\itemID <> -1 
          Text$ = Space(512) 
          SendMessage_(*DrawItem\hwndItem, #CB_GETLBTEXT, *DrawItem\itemID, @Text$) 
          DrawIconEx_(*DrawItem\hDC, *DrawItem\rcItem\left+2   , *DrawItem\rcItem\top+1, LoadIcon_(0, #IDI_ASTERISK), 16, 16, 0, 0, #DI_NORMAL) 
          TextOut_   (*DrawItem\hDC, *DrawItem\rcItem\left+2+20, *DrawItem\rcItem\top+1, Text$, Len(Text$)) 
        EndIf 
      EndIf 
  EndSelect 
  ProcedureReturn Result 
EndProcedure 

OpenWindow(0, 0, 0, 340, 35, #PB_Window_SystemMenu|#PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_TitleBar , "ComboBox")
CreateGadgetList(WindowID()) 
ComboBoxGadget(0, 5, 5, 330, 200, #CBS_OWNERDRAWFIXED)
AddGadgetItem(0, -1, "Test1") 
AddGadgetItem(0, -1, "Test2") 
AddGadgetItem(0, -1, "Test3") 
SetWindowCallback(@WindowCallback()) 

Repeat  : Until WaitWindowEvent()=#PB_EventCloseWindow 

End 

Publié : ven. 07/mai/2004 23:39
par Chris
Il est joli, ton petit combo. Dommage qu'il plante avec la 3.91b, sinon, je l'aurais utilisé :D

Chris :)

Publié : ven. 07/mai/2004 23:53
par Dr. Dri
...

Publié : ven. 07/mai/2004 23:59
par nico
Je ne comprends pas, dans ton deuxième exemple tu renvoie bien la valeur et non l'adresse!

Publié : sam. 08/mai/2004 0:02
par Dr. Dri
...

Publié : sam. 08/mai/2004 0:35
par nico
Ok :)

Tu dis: PS. de plus l'utilisation d'un @ est interdite

dans quel cas!!??

Publié : sam. 08/mai/2004 0:38
par Flype
in this case :

Procedure Toto( @Valeur )
; code
EndProcedure

:wink:

Publié : sam. 08/mai/2004 0:41
par nico
Oui mais pourquoi c'est interdit, c'est écrit dans la doc!

Publié : sam. 08/mai/2004 0:45
par Flype
la doc je sais pas mais en tout cas le compilateur lui il aime pas

Publié : sam. 08/mai/2004 1:34
par filperj
Procedure Toto( @Valeur )
; code
EndProcedure
C'est interdit parceque, du point de vue du compilo, ça ne veut rien dire: "@variable" est une expression qui renvoie quelquechose (l'adresse de la variable), ce n'est donc pas à sa place ici.
Pour ce genre de choses, on peut utiliser les pointeurs structurés:

Code : Tout sélectionner


structure mastruc
   valeur.l
   chaine.s
endstructure

procedure valverschaine(*ptr.mastruc)
   *ptr\chaine=str(*ptr\valeur)
endprocedure


deftype.mastruc mavar

mavar\valeur=18
valverschaine(@mavar)
result$=mavar\chaine
debug result$