Type Any als ByRef

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mk-soft
Beiträge: 3856
Registriert: 24.11.2004 13:12
Wohnort: Germany

Type Any als ByRef

Beitrag von mk-soft »

War eine Frage irgendwo ob es ein Type Any in PB gibt. Hab mal eine Idee dazu :allright:

Code: Alles auswählen

;- Any Structure for pb syntax
Structure Any
  StructureUnion
    bVal.b
    wVal.w
    lVal.l
    qVal.q
    iVal.i
    fVal.f
    dVal.d
    *sVal
  EndStructureUnion
EndStructure

ProcedureDLL MyFunction(Type.c, *Arg.any)

  Select Type
    Case 'b'
      Debug "Byte: " + Str(*Arg\bVal)
    Case 'w'
      Debug "Word: " + Str(*Arg\wVal)
    Case 'l'
      Debug "Long: " + Str(*Arg\lVal)
    Case 'q'
      Debug "Quat: " + Str(*Arg\qVal)
    Case 'i'
      Debug "Integer: " + Str(*Arg\iVal)
    Case 'f'
      Debug "float: " + StrF(*Arg\fVal)
    Case 'd'
      Debug "Double: " + Str(*Arg\dVal)
    Case 's'
      Debug "String: " + PeekS(*Arg\sVal)
  EndSelect
EndProcedure

; test

Define.any value

value\lVal = 100
MyFunction('l', value)

value\sVal = @"Hallo Welt"
MyFunction('s', value)

value\fVal = 10.5
MyFunction('f', value)

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

geile Idee...


SiBru
Bild Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

VARIANT?
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
mk-soft
Beiträge: 3856
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Bekannt :mrgreen:

Code: Alles auswählen


; VariantHelper
;-T_BSTR
Procedure helpSysAllocString(*Value)
  ProcedureReturn SysAllocString_(*Value)
EndProcedure
Prototype.l ProtoSysAllocString(Value.p-unicode)

Global T_BSTR.ProtoSysAllocString = @helpSysAllocString()

ProcedureDLL MyFunction(*ArgData.variant)

  Select *Argdata\vt
    Case #VT_I2 ; signed word
      Debug "Word: " + Str(*ArgData\iVal)
      
    Case #VT_I4 ; signed long
      Debug "Word: " + Str(*ArgData\lVal)
    
    Case #VT_R4 ; signed long
      Debug "Float: " + StrF(*ArgData\fltVal)
    
    Case #VT_R8 ; signed long
      Debug "Double: " + StrD(*ArgData\dblVal)
      
    Case #VT_BSTR ; String (Unicode)
      Debug "String: " + PeekS(*ArgData\bstrVal, #PB_Any, #PB_Unicode)
      
  EndSelect

EndProcedure


; test
Define.Variant value

value\vt = #VT_I2
value\iVal = 100
MyFunction(value)

value\vt = #VT_I4
value\lVal = 444
MyFunction(value)

value\vt = #VT_R4
value\fltVal = 99.9
MyFunction(value)

value\vt = #VT_R8
value\dblVal = 88.1
MyFunction(value)

value\vt = #VT_BSTR
value\bstrVal = T_BSTR("Hallo Welt")
MyFunction(value)
VariantClear_(value)

P.S. Wer mehr mit Variant machen möchte.
VariantHelper_Include
Auch im COMate vorhanden.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten