|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
0 k6 x& z( w0 n- }, n5 {1 D) RBy Mukta & ToxicDream- m$ N% e& U2 n
- //for delphi 56 z+ t+ x5 D6 o0 r2 C( r ]
- unit MMDevApi_tlb;" w9 k' x' }8 \4 C
- * m! s8 g+ o' I5 q
- interface
' A, ? Z1 F, e/ ~( a* L/ Y - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;0 u! Z7 y+ B K, q
- const
; g$ F. M4 f) n c - // TypeLibrary Major and minor versions/ D. m0 H& C: S3 S3 M
- . a* h4 w, p" O( D; g
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
: _5 H+ E- w2 {3 V0 r/ o - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
+ l; u) `8 _- N# S7 o - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';. G8 O# f5 M; j% L: Z6 p
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';4 U! L* H3 y8 i4 S1 U& |& K7 [
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';+ L) `4 h8 V1 T2 O. l
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
) o( _) P" d. D8 U - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';( `5 S% N+ n z% Q% n e
- 2 N$ c+ `0 H8 k/ |1 Y1 b+ q, Z
- DEVICE_STATE_ACTIVE = $00000001;9 f# w0 e% N, o" C/ p
- DEVICE_STATE_UNPLUGGED = $00000002;
& r& a4 L8 G" j7 |' ? - DEVICE_STATE_NOTPRESENT = $00000004;
) j( c8 x Y4 |1 s; T' r - DEVICE_STATEMASK_ALL = $00000007;
" Z0 }! o) E& T2 \& ? - & I) q' ^. e# C5 V# f, c% u' f: |
- type! v. [7 B" M$ B4 I1 k6 ^0 A
- EDataFlow = TOleEnum;
0 e3 w; R. T/ B: E; q ? - const
" y2 L2 h5 J% c3 y - eRender = $00000000;5 G* k: |, t5 z$ {- S
- eCapture = $00000001;
. K, p0 f ?4 g: P$ ~5 n& ]! c - eAll = $00000002;1 g$ Y+ j1 f+ K5 \3 i% z( D; J
- EDataFlow_enum_count = $00000003;3 l* ?) A7 m- z% K
4 a$ q* }5 Z$ H# u9 Y; W- type
" _! U; {& a0 I* ^( P$ ^* E- Y - ERole = TOleEnum;1 j& ^- O. z: s2 h$ D
- const2 o ]" M0 M7 l' o$ e7 g' T
- eConsole = $00000000;
( S5 k" B& {; V6 v W* d - eMultimedia = $00000001;
3 Y6 h6 U0 b! `2 k - eCommunications = $00000002;5 m8 w1 Y% z" o! S& c
- ERole_enum_count = $00000003;
! f' G9 I+ @4 k
8 l/ E! W) c; q% x$ Y/ H2 U$ Z" R- type5 G0 _6 J- E) F# Z* r: F J. N' j
- IAudioEndpointVolumeCallback = interface(IUnknown)4 s, n$ c# q# A) i9 t
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
1 {6 k/ W2 o3 u. a) L+ h/ a - end;
0 @; d t& j& O8 I: o - ! I* Z9 h" J' R M6 t! ?
- IMMAudioEndpointVolume = interface(IUnknown)+ A# k v" L6 l5 Q+ y2 H
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
$ B6 J4 k+ j) G: A8 W3 p# k+ Z - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
7 @/ D' M5 o/ ` - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
, M, S+ e# N5 i' L0 y, v! z0 { - Function GetChannelCount(out PInteger): Integer; stdcall;
6 ^, q9 |' s2 |: d* Q - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;; i8 h' {% l' D' m8 t
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;- c( e7 S2 p2 t3 _+ u d
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
+ K6 E [& T* P3 r% V' r - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
2 E; X: h, a4 l [& a - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;- }5 K( s3 ]! [
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;+ w" g1 b, i" m Z7 ]
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
9 l/ H( ^+ a4 n6 w3 \7 c8 N - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;% [& q4 L; u: x0 Y
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
5 J* t; z3 b, u - Function GetMute(out bMute: Boolean ) :Integer; stdcall;
% e% z7 `' x# U3 [ - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;2 E/ B# J; m' p: m( L2 C
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;; u+ H. r: s2 M2 o T2 R$ r
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;: c$ n( A; G& y, e$ W5 l( a
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
) D- W$ B2 u: _5 p, N8 | - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;7 [* ~9 N; H( e3 D
- end;
( k% Y& M; q. b$ W5 U. k - 4 D( [% E% |8 h3 ]3 ~: f1 p
- { IAudioMeterInformation = interface(IUnknown)! b( D+ o. L9 v5 V2 s7 p
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
/ I {* o7 @+ }9 U' F! { - end;}6 U$ d3 f9 b0 t2 Q
1 j6 r3 g" \/ E# @- IPropertyStore = interface(IUnknown)4 Q% e$ i( h! J# o8 n8 j) o' F1 H
- end;: }) O# ]7 Q8 \& e! b
- - D1 N# V' C4 F
- type
, g. m4 [$ R) i- }( ]: S - IMMDevice = interface(IUnknown)
. ?5 o. ]/ X$ e+ [. Y& W - ['{D666063F-1587-4E43-81F1-B948E807363F}']$ S! ?1 k6 }+ C4 \$ \
- Function Activate( refId :TGUID;
% N" H+ i5 ]! B" V5 a8 y( k - dwClsCtx: DWORD;
. j% Z# b- i$ W - pActivationParams: PInteger ;
( _2 |. a- ]0 @; D! T: ] - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;" c* W! f1 f: Y5 I1 f9 j
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
) M+ z- h& X4 n3 d - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
% E1 i4 G) ?7 T- }+ U9 Q& ^' a - Function GetState(out State :Integer): Hresult; stdcall;
- A, y3 @' W, ~5 [ - 7 B4 g; ]7 [ H* R
- end;
: l; E& [7 I( J7 @- ~$ R
5 V. V2 \7 d% O% Q, D5 O4 p' q' k- 5 E J9 o( H4 h& g
- IMMDeviceCollection = interface(IUnknown), l4 F) N/ W5 s$ S2 S* i. [ F
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']; \+ q% r% z8 _9 r
- end;
' m" q6 v \0 c, I1 X - 7 g& G1 p& h. z8 v
- IMMNotificationClient = interface (IUnknown)6 X# r2 `7 h/ L% l
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']2 A/ @1 Q: K1 H" o ]
- end;
" Y y* a7 N9 R% s4 ~2 T
: |, V( A* V! [5 N9 X+ T- IMMDeviceEnumerator = interface(IUnknown)# p4 @9 a4 T# Y* u
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
/ M& |6 |2 S2 N2 w- g - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;8 ~, Z) m$ M2 j% M0 t8 A
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;1 z# R; S. S' h- a& J
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
, x0 b# |( N2 A8 A - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
- g; Q; M5 o# H - end;
, T! l0 T- c V& m1 ]
6 j( I$ I8 ? |- implementation0 ?4 W0 K# w2 A/ M
- end./ }* `2 o+ C. f6 b- u, W$ t
- ( w* l, N* s5 p8 p' v/ u9 p
- Thanks & Reagrds,% @7 D! u0 l* H( Q7 H0 A) Q& N
- Mukta ...
* D! h0 e7 Z) W- A' i4 ?4 \ [1 S
复制代码- 2 W% R& v6 m, m* G
- it's work in Delphi 7
5 R; u! q# A' i( n% R - //////////////////////////
s4 }5 x; T ~# p* D; ?7 f
6 U9 v8 K1 t; ^2 e( c/ K- unit MMDevApi;
7 [# m( x; m0 K7 r+ J5 K" b& Z
2 s9 P2 U6 S6 \, B- interface8 a$ w! H l; q0 Q( }6 ]2 [
- ; \& T/ V; ^. V, J7 h/ t r# }
- uses
& c* D& m6 v# }" d% G - Windows, ActiveX, ComObj;
% g0 }# `1 f2 g! c2 C* { - 9 \4 @2 d" X+ Q! r6 @
- const& z0 o9 o3 a& T
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
4 f6 u: z" h/ p5 n0 k - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
t* U% @4 G- @1 t" k) D( ] - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
9 m: p' z7 Y0 O# I# A4 r - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}'; R" r( d3 M" q5 b- R, K/ S( w
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';$ Y9 P. R2 u* u( \6 d5 J3 b0 j
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
4 T* m# |8 }, o6 b8 G- O. P - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';+ G4 }0 C, l+ G4 n; }* I1 S1 ]
- ! ]3 ^9 u e) r+ b. V$ ^2 Z6 R8 S8 ^
- DEVICE_STATE_ACTIVE = $00000001;
9 [8 J! ?3 u2 R - DEVICE_STATE_UNPLUGGED = $00000002;( ` W, ?% v. C+ B
- DEVICE_STATE_NOTPRESENT = $00000004;' Q! q4 R, K' V
- DEVICE_STATEMASK_ALL = $00000007; N+ b: k. J" F4 a: [: [0 Q$ D7 c
* E( ~" ]# g/ E8 S/ }5 I4 M9 P- type: }3 y: I9 P" F, k
- EDataFlow = TOleEnum;
( A Z% f0 Q$ F3 K' |
4 C3 F8 Q% ~' n0 H. n3 \' F- const6 ]- \; }' h) H, g
- eRender = $00000000;1 L% h2 o; V! ^5 k7 Q! A
- eCapture = $00000001;# ?- B* W- t0 t8 y5 I4 H5 K
- eAll = $00000002;
2 F- ~" c9 H3 V- z/ z - EDataFlow_enum_count = $00000003;
8 B9 ]1 E# [8 U, E* w7 e) K) m* M - 3 ^# o3 S+ P2 u0 Z8 g" j" L2 T
- type
: ~! m% i P \ U. v/ Y - ERole = TOleEnum;. _1 s( u$ a; i
- 6 a( X# g! g1 m2 A6 G) R# u
- const
9 B% B/ N+ Q$ o" @" G' ` - eConsole = $00000000;0 ^* f4 @8 X1 y" S3 I# z
- eMultimedia = $00000001;
7 |& `0 J- r2 |1 x - eCommunications = $00000002;. z: s* P3 q3 X i4 o2 Y% s
- ERole_enum_count = $00000003;
6 v2 ^1 c3 ? R4 [8 ^ - 9 Y1 p& {7 Q- Y- n9 Y( j7 l5 o
- type, Q+ [6 M. N% v3 O# |0 N
- IAudioEndpointVolumeCallback = interface(IUnknown): u) j/ G/ d, F2 _4 y A+ P) y" f
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
+ P M8 y' y5 `/ I/ r - end;8 |$ u$ ]0 W+ k* Z7 }
- " f, b/ y( M: a/ |
- IAudioEndpointVolume = interface(IUnknown)! A/ S3 }# V7 ^' _6 h) z
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
0 r* a/ Z6 {' G* E5 n2 \# D - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
- ]" P2 [, L& e: P1 K' ]. O - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
5 @& F$ `; c& [; r% h4 i" [( T - function GetChannelCount(out PInteger): Integer; stdcall;
/ e F% Q, z8 M - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;. D& C) x3 a9 j j! u7 j
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;* h. R. A. N/ q' {9 |- l$ Q4 m
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
/ D1 @$ m- Q' g2 F8 E - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
6 j; ~/ Q$ i) T/ Q2 X- T y - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;: @* Y8 k( P; W
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
" V& ~8 g q- s5 f+ m2 Z7 D# a - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;6 D& t5 Z" g C$ h( H5 Y, i
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
5 q7 R0 e/ M3 X1 |4 Q2 n - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
7 y( j! A6 D9 C! q1 `- D S - function GetMute(out bMute: Boolean): Integer; stdcall;: t7 q2 P4 o$ a$ H! ]8 l, E7 h- K
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
" a1 C1 ^* z( d# h H7 E# h - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
: j1 R4 g0 U& Y+ n - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;- c/ M# z" n$ S `9 z3 u
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
0 I6 p. l, Y% r) v y3 I! M - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
; F, A! h" ]* v0 x3 N/ H4 [ - end;" F5 t8 W' B, Y- r
- 5 @/ y3 r: Z1 w/ s% C
- IAudioMeterInformation = interface(IUnknown)
* s' ~/ @8 C' y2 C$ w. O. d - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
% {4 C+ f# t6 l) k; G5 M - end;5 k b2 y6 l# {# c3 n! [9 ~" y) C
- ; V, r0 {8 i/ [8 p- w% ~$ N
- IPropertyStore = interface(IUnknown)
- A3 W- J. ?6 t* }8 L4 [ - end;
8 x3 [' C% J/ x
: W( J) C2 t; ^2 ]2 L( S+ y# e: }- IMMDevice = interface(IUnknown)
2 I: R* d5 e& }6 t0 j9 j - ['{D666063F-1587-4E43-81F1-B948E807363F}']
( g5 f* B) J0 {% N& w, X5 \9 ~1 ` - function Activate(const refId: TGUID;" b% [7 l9 Y" |7 ~; X
- dwClsCtx: DWORD;
& I0 J" R) y8 o. M - pActivationParams: PInteger;
, d* w* ]5 v+ \3 P3 N% M; O' x - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;; E$ C% f; O% s$ s$ \* S
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;$ g" P1 ~9 ?! b7 ~- }
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;3 \. o' `- v1 q2 M" M8 u: C
- function GetState(out State: Integer): Hresult; stdcall;
9 r7 }' ]- `# Y - end;* p4 }6 f& M( f- i/ Y
* s* H8 G# Y* T6 ?) Y
* i5 D1 [% J7 E7 P- IMMDeviceCollection = interface(IUnknown) t6 m6 O& ]; e9 m* Q
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']9 {; u/ E( D& g$ v& @1 X& p) \# l. Y
- end;( L+ M3 Z! r3 G4 \' G% W
! K0 ]8 P1 r3 k; M( Z- IMMNotificationClient = interface(IUnknown)0 K6 \; i5 `" ]0 S0 ]# T
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']8 a/ S/ r1 j4 L" d- i
- end;2 @1 L3 Q1 K; Q- h% ^1 y% w" `
- ) s# }4 }* v3 x3 v! I
- IMMDeviceEnumerator = interface(IUnknown)
5 ~! F4 `; \+ P1 T- m( U - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']* Z" @! s" ]* i, f3 z9 z1 q
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
& T' E/ {8 A" g P1 L - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
( u7 P( K; B3 J( X/ U. l6 w0 j3 ^ - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;" r+ h% \- z, h8 x# n
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
) i P J. G# y - end;
: m% H4 A* ~3 g6 ?% Q x/ u5 M - G1 X) u. v5 k) P* d
- implementation% y9 h0 L$ N# `" {6 w- I
, I: o% {" L/ Z* x7 O- end.3 c' z V. r, U( D* r7 M
2 r0 V5 X s6 e# e- ///////////////////////" e4 I, e* L; _ y5 K
- simple sample :)
: ~- O) R2 ]9 P, R0 T; P# b - ///////////////////////& B6 L( Y4 Y! ~4 M
- 3 G2 E) X" Z2 O* R, T
- //...... other code
& c7 s }+ q+ J* T/ z3 }$ G' J- u - 5 P! t1 N! V" @: i1 o. h1 u* v
- uses ... ActiveX, MMDevApi, ...;
% t8 `) ~5 c( k5 x6 |( Z
% k( B6 `0 P1 g- H7 ]; L: i; b- //...... other code% B% U0 }+ e+ B: g2 F" b% R4 a4 a
7 Y" i1 w9 S; }) G# |/ p- var
/ s; G# t+ T/ S - endpointVolume: IAudioEndpointVolume = nil;
$ [- R: k# q8 V1 n) h
& e% h- |: w z$ {+ k- procedure TForm1.FormCreate(Sender: TObject);
/ K3 E# A1 @- @; _( ^4 X4 p - var! m" w4 H3 v0 ~ F
- deviceEnumerator: IMMDeviceEnumerator;
. v! U, [' B! ]* k! I. q - defaultDevice: IMMDevice;& f9 d0 J( C& Z, m9 @+ u; K
- begin/ a- y( q, n9 a2 H; g/ i# i! M3 A
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
8 Y9 @, q8 a" s8 M, L - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);$ b+ v, r4 X. P- R+ ^
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
/ s) x1 d* Z# |* ?/ U o - end;$ ^: a+ ?6 |' ~. o
: k6 o( K) T5 Z/ s- procedure TForm1.Button1Click(Sender: TObject);
1 F; j, @- z9 G; H: e - var
3 Z. U8 c, \* d9 x3 P* n. u1 x7 B - VolumeLevel: Single;
6 L! @$ ?8 Q- Q8 e$ I - begin
+ [' }5 L0 _. u5 b - if endpointVolume = nil then Exit;
, y; w8 T8 d3 B& d5 X - VolumeLevel := 0.50;: ^* q* q; W% i1 k9 [4 N3 O
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);; g( \2 L7 }; V, O% L0 K
- Caption := Format('%1.8f', [VolumeLevel])$ a4 g4 ^+ c( i5 e) \2 ~8 m9 v; o0 ^
- end;
8 _( l1 g" F; E" R. w V - + F" H. J1 i/ P. l. _
- /////////////////////////////////////& R! E- k' X: J( B- r1 A
- 8 d9 Y+ r. p; L# S3 ?, @* s
- // with best regards ToxicDream7 A4 j6 x7 e0 f3 I7 W
复制代码 |
|