Microsoft Excel рдкрдВрдХреНрддрд┐ рд╣рд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдХрднреА-рдХрднреА рдореИрдВ рдКрдм рдЬрд╛рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдбрд┐рдмрдЧрд░ рд╕реЗ рд▓реИрд╕ рд╣реЛрдХрд░, рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реВрдВред рдЗрд╕ рдмрд╛рд░, рдореЗрд░реА рдкрд╕рдВрдж рдПрдХреНрд╕реЗрд▓ рдкрд░ рдЧрд┐рд░ рдЧрдИ рдФрд░ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдпрд╣ рдХреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕реАрдорд╛ рдХреА рдКрдВрдЪрд╛рдИ рдХреИрд╕реЗ рдорд╛рдирддрд╛ рд╣реИ, рдЖрджрд┐ред рдореИрдВрдиреЗ Excel 2010 (excel.exe, 32bit, рд╕рдВрд╕реНрдХрд░рдг 14.0.4756.1000, SHA1 a805cf60a5542f21001b0ea5d142d1cd0ee00b28) рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ред


рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рдпрджрд┐ рдЖрдк Microsoft Office рдХреЗ рд▓рд┐рдП VBA рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрдВрдХреНрддрд┐ рдХреА рдКрдБрдЪрд╛рдИ рдХреЛ рджреЛ рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  • рд░реЛрд╣рд╛рдЗрдЯ - рд░рд┐рдЯрд░реНрди рдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реАрдорд╛ рдореЗрдВ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрдВрдХ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбрдмрд▓ рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВ;
  • рдКрдБрдЪрд╛рдИ - рдПрдХ рджреЛрд╣рд░рд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдКрдВрдЪрд╛рдИ рдХрд╛, рдЕрдВрдХреЛрдВ рдореЗрдВ, рд╕реАрдорд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПред

рдФрд░ рдЕрдЧрд░ рдЖрдк рдпрд╣рд╛рдВ рднреА рджреЗрдЦрддреЗ рд╣реИрдВ: рдПрдХреНрд╕реЗрд▓ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рд╕реАрдорд╛рдПрдВ ред рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХрддрдо рдкрдВрдХреНрддрд┐ рдКрдВрдЪрд╛рдИ 409 рдЕрдВрдХ рд╣реИред рдпрд╣, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХрдорд╛рддреНрд░ рдорд╛рдорд▓реЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ рдЬрдм рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Microsoft рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдереЛрдбрд╝реЗ рднреНрд░рд╛рдордХ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХреНрд╕реЗрд▓ рдХреЛрдб рдореЗрдВ, рдЕрдзрд┐рдХрддрдо рдкрдВрдХреНрддрд┐ рдКрдВрдЪрд╛рдИ 2047 рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЕрдВрдХреЛрдВ рдореЗрдВ 1535.25 рд╣реЛрдЧреАред рдФрд░ рдЕрдзрд┐рдХрддрдо рдлрд╝реЙрдиреНрдЯ рдЖрдХрд╛рд░ 409.55 рдЕрдВрдХ рд╣реИред рдХреЗрд╡рд▓ VBA / Interop рдореЗрдВ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЗрддрдиреА рдмрдбрд╝реА рдКрдВрдЪрд╛рдИ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдкрдВрдХреНрддрд┐ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдкрдиреА рдкрд╣рд▓реА рд╕реЗрд▓ рдореЗрдВ рдХрдореНрдмреНрд░рд┐рдпрд╛ рдорда рдлрд╝реЙрдиреНрдЯ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд╝реЙрдиреНрдЯ рдЖрдХрд╛рд░ 409.55 рдЕрдВрдХ рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЕрдкрдиреЗ рдЪрд╛рд▓рд╛рдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реЗрд▓ рд╕реЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛, 2047 рдкрд┐рдХреНрд╕рд▓ (рд╢рдмреНрдж рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕) рд╕реЗ рдЕрдзрд┐рдХ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдФрд░ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рдКрдВрдЪрд╛рдИ рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк UI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдКрдВрдЪрд╛рдИ рдкреВрдЫрддреЗ рд╣реИрдВ, рддреЛ рдПрдХреНрд╕реЗрд▓ рдЭреВрда рдмреЛрд▓реЗрдЧрд╛ рдХрд┐ рдКрдВрдЪрд╛рдИ 409.5 рдЕрдВрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк VBA рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдКрдВрдЪрд╛рдИ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдИрдорд╛рдирджрд╛рд░ 1535.25 рдЕрдВрдХ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬреЛ 2047 рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдКрдВрдЪрд╛рдИ рдЕрднреА рднреА 409.5 рдЕрдВрдХ рддрдХ рдЧрд┐рд░ рдЬрд╛рдПрдЧреАред рдЗрд╕ рд╣реЗрд░рдлреЗрд░ рдХреЛ рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: http://recordit.co/ivnFEsELLI


рдореИрдВрдиреЗ рдПрдХ рдХрд╛рд░рдг рд╕реЗ рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдкрд┐рдХреНрд╕рд▓ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдПрдХреНрд╕реЗрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ)ред рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрдХреНрд╕рд░ рдпреЗ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рдХрд╛рд░рдХ рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдПрдХреНрд╕реЗрд▓ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрдВрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 75% рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рджреЛ рдирдВрдмрд░ 3 рдФрд░ 4 рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЬрдм рдкрдВрдХреНрддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рддреЛ рдПрдХреНрд╕реЗрд▓ рдкрдВрдХреНрддрд┐ рдХреЛ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛, 3 рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ рдФрд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ 4. 4. рд▓реЗрдХрд┐рди рд╡рд╣ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдЕрдВрдЬрд╛рдо рдкрд░ рдкрд╣реБрдВрдЪрд╛ рджреЗрдЧрд╛ред рдЗрд╕рд╕реЗ рдпрд╣ рдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рднрд┐рдиреНрдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, VBA рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦреЗрдВ:


w.Rows(1).RowHeight = 75.375 Debug.Print w.Rows(1).Height 

VBA 75 рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ 75.375 рдкрд┐рдХреНрд╕реЗрд▓ 100.5 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реЛрдВрдЧреЗ, рдФрд░ рдПрдХреНрд╕реЗрд▓ рдЗрд╕реЗ рдмрд░реНрджрд╛рд╢реНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ 100 рдкрд┐рдХреНрд╕реЗрд▓ рддрдХ рдХрд╛ рдЖрдВрд╢рд┐рдХ рднрд╛рдЧ рдЧрд┐рд░рд╛ рджреЗрдЧрд╛ред рдЬрдм рд╡реАрдмреАрдП рдЕрдВрдХреЛрдВ рдореЗрдВ рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рдкреВрдЫрддрд╛ рд╣реИ, рддреЛ рдПрдХреНрд╕реЗрд▓ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЕрдВрдХреЛрдВ рдореЗрдВ 100 рдкрд┐рдХреНрд╕рд▓ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ рдФрд░ 75 рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИред


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА C # рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЧрдП рд╣реИрдВ рдЬреЛ рдкрдВрдХреНрддрд┐ рдКрдВрдЪрд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛:


 class RowHeightInfo { public ushort Value { get; set; } //    ,   4. public ushort Flags { get; set; } //  } 

рдЖрдкрдХреЛ рдореЗрд░рд╛ рд╢рдмреНрдж рдЕрднреА рд▓реЗрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХреНрд╕реЗрд▓ рдореЗрдВ, рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрдВрдХреНрддрд┐ рдХреА рдКрдБрдЪрд╛рдИ 75 рдЕрдВрдХ рд╣реИ, рддреЛ рдпрд╣ рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ 100 рд╣реЛрдЧреА, рдлрд┐рд░ 400 рдХреЛ рдореВрд▓реНрдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЭрдВрдбреЗ рдореЗрдВ рд╕рднреА рдмрд┐рдЯреНрд╕ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ (рдЭрдВрдбреЗ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рд▓рдВрдмрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдкрддрд╛ рд╣реИред рд╡рд╣ 0x4000 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕рдХреА рдКрдБрдЪрд╛рдИ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИ, рдФрд░ 0x2000 - рдЫрд┐рдкреА рд╣реБрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХреА рдЧрдИ рдКрдБрдЪрд╛рдИ рд╡рд╛рд▓реА рджреГрд╢реНрдпрдорд╛рди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдлрд╝реНрд▓реИрдЧрд╕ рдЕрдХреНрд╕рд░ 0x4005 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдлрд╝реНрд▓реИрдЧ рд╕реНрд╡рд░реВрдкрдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдКрдБрдЪрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдпрд╣ рдпрд╛ рддреЛ 0xA рдпрд╛ 0x800E рд╣реИред


рд╣рдо рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рдкреВрдЫрддреЗ рд╣реИрдВ


рдЕрдм, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк excel.exe рд╕реЗ рд╡рд┐рдзрд┐ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдкрдиреЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рд╕реБрдВрджрд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП HexRays рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж):


 int __userpurge GetRowHeight@<eax>(signed int rowIndex@<edx>, SheetLayoutInfo *sheetLayoutInfo@<esi>, bool flag) { RowHeightInfo *rowHeightInfo; // eax int result; // ecx if ( sheetLayoutInfo->dword1A0 ) return sheetLayoutInfo->defaultFullRowHeightMul4 | (~(sheetLayoutInfo->defaultRowDelta2 >> 14 << 15) & 0x8000); if ( rowIndex < sheetLayoutInfo->MinRowIndexNonDefault ) return sheetLayoutInfo->defaultFullRowHeightMul4 | (~(sheetLayoutInfo->defaultRowDelta2 >> 14 << 15) & 0x8000); if ( rowIndex >= sheetLayoutInfo->MaxRowIndexNonDefault ) return sheetLayoutInfo->defaultFullRowHeightMul4 | (~(sheetLayoutInfo->defaultRowDelta2 >> 14 << 15) & 0x8000); rowHeightInfo = GetRowHeightCore(sheetLayoutInfo, rowIndex); if ( !rowHeightInfo ) return sheetLayoutInfo->defaultFullRowHeightMul4 | (~(sheetLayoutInfo->defaultRowDelta2 >> 14 << 15) & 0x8000); result = 0; if ( flag || !(rowHeightInfo->Flags & 0x2000) ) result = rowHeightInfo->Value; if ( !(rowHeightInfo->Flags & 0x4000) ) result |= 0x8000u; return result; } 

Dword1A0 рдХреНрдпрд╛ рд╣реИ, рдореИрдВ рдЕрднреА рднреА рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ рд╣реВрдВред рдПрдХ рдЬрдЧрд╣ рдирд╣реАрдВ рдорд┐рд▓реА рдЬрд╣рд╛рдБ рдпрд╣ рдЭрдВрдбрд╛ рд▓рдЧрд╛ рд╣реЛ :(
рдореЗрд░реЗ рд▓рд┐рдП defaultRowDelta2 рдХреНрдпрд╛ рд╣реИ, рдЕрднреА рднреА рдПрдХ рд░рд╣рд╕реНрдп рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдЬрдм рдПрдХреНрд╕реЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕реЗ рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред defaultRowDelta2 рдорд╛рдирдХ рдкрдВрдХреНрддрд┐ рдКрдВрдЪрд╛рдИ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд░рд╛рд╢рд┐ рд╕реЗ рджреВрд╕рд░рд╛ рдирдВрдмрд░ рд╣реИред рдзреНрд╡рдЬ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рднреА рд░рд╣рд╕реНрдпрдордп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╣рд╛рдБ рднреА рдореИрдВрдиреЗ рдЭрдВрдбреЗ рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рджреЗрдЦрд╛ рд╡рд╣ рдЧрд▓рдд рдерд╛ред
рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ SheetLayoutInfo рд╡рд░реНрдЧ рднреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢реАрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред SheetLayoutInfo рдореЗрдВ рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ:


  • DefaultFullRowHeightMul4 - рдорд╛рдирдХ рдкрдВрдХреНрддрд┐ рдКрдВрдЪрд╛рдИ;
  • MinRowIndexNonDefault - рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ, рдЬрд┐рд╕ рдкрд░ рдКрдВрдЪрд╛рдИ рдорд╛рдирдХ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ;
  • MaxRowIndexNonDefault - рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдмрд╛рдж рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ, рдЬрд┐рд╕ рдкрд░ рдКрдВрдЪрд╛рдИ рдорд╛рдирдХ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ;
  • DefaultRowDelta2 рдорд╛рдирдХ рдкрдВрдХреНрддрд┐ рдКрдВрдЪрд╛рдИ рдХреЗ рдпреЛрдЧ рдХрд╛ рдПрдХ рд╣реА рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
  • GroupIndexDelta - рдЗрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рддрд░реНрдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:


  1. рдпрджрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдЧреИрд░-рдорд╛рдирдХ рдКрдВрдЪрд╛рдИ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдорд╛рдирдХ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ;
  2. рдпрджрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдЧреИрд░-рдорд╛рдирдХ рдКрдВрдЪрд╛рдИ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдорд╛рдирдХ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ;
  3. рдЕрдиреНрдпрдерд╛, рд╣рдо GetRowHeightCore рд╡рд┐рдзрд┐ рд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП rowHeightInfo рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ;
  4. рдпрджрд┐ rowHeightInfo == рдЕрд╢рдХреНрдд рдорд╛рдирдХ рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ;
  5. рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рдЬрд╛рджреВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рдкрдВрдХреНрддрд┐рд╣рд╛рдЗрдЯрдЗрдиреНрдлреЛрдЗрдиреНрдлреЛ.рд╡реИрд▓реНрдпреВ рдореЗрдВ рдЬреЛ рд╣реИ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ 16 рд╡реАрдВ рдмрд┐рдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХреА рдЧрдИ рдереАред

рдпрджрд┐ рдЖрдк C # рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрди рдЬреИрд╕рд╛ рдХреБрдЫ рдорд┐рд▓реЗрдЧрд╛:


 const ulong HiddenRowMask = 0x2000; const ulong CustomHeightMask = 0x4000; const ushort DefaultHeightMask = 0x8000; public static ushort GetRowHeight(int rowIndex, SheetLayoutInfo sheetLayoutInfo) { ushort defaultHeight = (ushort) (sheetLayoutInfo.DefaultFullRowHeightMul4 | (~(sheetLayoutInfo.DefaultRowDelta2 >> 14 << 15) & DefaultHeightMask)); if (rowIndex < sheetLayoutInfo.MinRowIndexNonDefault) return defaultHeight; if (rowIndex >= sheetLayoutInfo.MaxRowIndexNonDefault) return defaultHeight; RowHeightInfo rowHeightInfo = GetRowHeightCore(sheetLayoutInfo, rowIndex); if (rowHeightInfo == null) return defaultHeight; ushort result = 0; if ((rowHeightInfo.Flags & HiddenRowMask) == 0) result = rowHeightInfo.Value; if ((rowHeightInfo.Flags & CustomHeightMask) == 0) result |= DefaultHeightMask; return result; } 

рдЕрдм рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ GetRowHeightCore рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:


 RowHeightInfo *__fastcall GetRowHeightCore(SheetLayoutInfo *sheetLayoutInfo, signed int rowIndex) { RowHeightInfo *result; // eax RowsGroupInfo *rowsGroupInfo; // ecx int rowInfoIndex; // edx result = 0; if ( rowIndex < sheetLayoutInfo->MinRowIndexNonDefault || rowIndex >= sheetLayoutInfo->MaxRowIndexNonDefault ) return result; rowsGroupInfo = sheetLayoutInfo->RowsGroups[sheetLayoutInfo-GroupIndexDelta + (rowIndex >> 4)]; result = 0; if ( !rowsGroupInfo ) return result; rowInfoIndex = rowsGroupInfo->Indices[rowIndex & 0xF]; if ( rowInfoIndex ) result = (rowsGroupInfo + 8 * (rowInfoIndex + rowsGroupInfo->wordBA + rowsGroupInfo->wordBC - rowsGroupInfo->wordB8)); return result; } 

  1. рдлрд┐рд░ рд╕реЗ, рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдПрдХреНрд╕реЗрд▓ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдПрдХ рдмрджрд▓реА рд╣реБрдИ рдКрдБрдЪрд╛рдИ рд╡рд╛рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рд╕реБрд╕реНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
  2. рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╕рдореВрд╣ рдХреЛ рдвреВрдБрдврддрд╛ рд╣реИ; рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рд╕рдореВрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдЕрд╢рдХреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
  3. рд╕рдореВрд╣ рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
  4. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рд░реЛрд╣рд╛рдЗрдЯрдЗрдиреНрдлреЛ рд╡рд░реНрдЧ рдХреА рд╡рд╛рдВрдЫрд┐рдд рд╡рд╕реНрддреБ рдкрд╛рддрд╛ рд╣реИред wordBA, wordBC, wordB8 - рдХреБрдЫ рд╕реНрдерд┐рд░рд╛рдВрдХред рд╡реЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рд╕рд╛рде рд╣реА рдмрджрд▓рддреЗ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╡реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд╕рдордЭ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рдпрд╣ рд╡рд┐рд╖рдп рд╕реЗ рднрдЯрдХрдиреЗ рдФрд░ RowsGroupInfo рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред Excel 16 рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рдореВрд╣ рдореЗрдВ рд░реЛрд╣рд╛рдЗрдЯрдЗрдирдЗрдиреНрдлреЛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ I-th рд╕рдореВрд╣, рдЬреЛ RowsGroupInfo рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, i ├Ч 16 рд╕реЗ i ├Ч 16 + 15 рд╕рдорд╛рд╡реЗрд╢реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред


рд▓реЗрдХрд┐рди RowsGroupInfo рдореЗрдВ рдкрдВрдХреНрддрд┐ рдКрдВрдЪрд╛рдИ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреБрдЫ рд╣рдж рддрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред рдПрдХреНрд╕реЗрд▓ рдореЗрдВ рдЗрддрд┐рд╣рд╛рд╕ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред


RowsGroupInfo рдореЗрдВ рддреАрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝реАрд▓реНрдб рд╣реИрдВ: Indices, HeightInfos, рдФрд░ RowsCount, рджреВрд╕рд░рд╛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рдпрд╣ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: (rowGroupInfo + 8 ├Ч (...)), рдХреНрдпреЛрдВрдХрд┐ rowInfoIndex рдмрд╣реБрдд рднрд┐рдиреНрди рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ , рдореИрдВрдиреЗ 1000 рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рднреА рджреЗрдЦрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдИрдбреАрдП рдореЗрдВ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреИрд╕реЗ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИред RowsCount рдлрд╝реАрд▓реНрдб рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ рдХрд┐ рд╕рдореВрд╣ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреИрд░-рдорд╛рдирдХ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, SheetLayoutInfo рдореЗрдВ GroupIndexDelta рд╣реИ - рд╕рдореВрд╣ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдкрдВрдХреНрддрд┐ рдКрдВрдЪрд╛рдИ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ред


рдЗрдВрдбрд┐рд╕реЗрд╕ рдлрд╝реАрд▓реНрдб рд╕рдореВрд╣ рдХреЗ рднреАрддрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд▓рд┐рдП RowHeightInfo рдСрдлрд╝рд╕реЗрдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдХреНрд░рдо рдореЗрдВ рд╡рд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди HeightInfos RowHeightInfo рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирдИ рдЦрд╛рд▓реА рд╢реАрдЯ рд╣реИ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рд╣рдордиреЗ рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ 23 рдХреА рдКрдВрдЪрд╛рдИ рдмрджрд▓ рджреАред рдпрд╣ рдкрдВрдХреНрддрд┐ 16 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдлрд┐рд░:


  1. рдПрдХреНрд╕реЗрд▓ рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рд╕рдореВрд╣ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЗрдВрдбреЗрдХреНрд╕ 1 рд╣реЛрдЧрд╛ рдФрд░ GroupIndexDelta = -1 рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред
  2. рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП RowsGroupInfo рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ sheetLayoutInfo-> RowsGroups рдореЗрдВ 0 рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рддрд╣рдд рдмрдирд╛рддрд╛ рд╣реИ (sheetLayoutInfo-> GroupIndexDelta + 1);
  3. RowsGroupInfo рдореЗрдВ рдПрдХреНрд╕реЗрд▓ 16 4-рдмрд╛рдЗрдЯ рдЗрдВрдбрд┐рд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдЧрд╛, RowsCount, wordBA, wordBC рдФрд░ wordB8, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП;
  4. рддрдм рдПрдХреНрд╕реЗрд▓ рдмрд┐рдЯрд╡рд╛рдЗрдВрдб рдФрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдореВрд╣ рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╢реЗрд╖ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИ): rowIndex & 0xFред рд╕рдореВрд╣ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рд╣реЛрдЧрд╛: 23 & 0xF = 7;
  5. рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХреНрд╕реЗрд▓ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ 7: рдСрдлрд╕реЗрдЯ = рдЗрдВрдбрд┐рд╕ [7] рдХреЗ рд▓рд┐рдП рдСрдлрд╕реЗрдЯ рдорд┐рд▓рддрд╛ рд╣реИред рдпрджрд┐ рдСрдлрд╕реЗрдЯ = 0, рддреЛ RowsGroupInto рдХреЗ рдЕрдВрдд рдореЗрдВ Excel 8 рдмрд╛рдЗрдЯреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдПрдХ рдХрд░рдХреЗ RowsCount рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдФрд░ Indices [7] рдкрд░ рдирдИ рдСрдлрд╕реЗрдЯ рд▓рд┐рдЦрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдВрдд рдореЗрдВ, рдПрдХреНрд╕реЗрд▓ RowsGroupInfo рдореЗрдВ рдСрдлрд╕реЗрдЯ рдкрд░ рдирдИ рдкрдВрдХреНрддрд┐ рдКрдВрдЪрд╛рдИ рдФрд░ рдЭрдВрдбреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦрддрд╛ рд╣реИред

C # рдореЗрдВ RowsGroupInfo рд╡рд░реНрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


 class RowsGroupInfo { public int[] Indices { get; } public List<RowHeightInfo> HeightInfos { get; } public RowsGroupInfo() { Indices = new int[SheetLayoutInfo.MaxRowsCountInGroup]; HeightInfos = new List<RowHeightInfo>(); for (int i = 0; i < SheetLayoutInfo.MaxRowsCountInGroup; i++) { Indices[i] = -1; } } } 

GetRowHeightCore рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:


 static RowHeightInfo GetRowHeightCore(SheetLayoutInfo sheetLayoutInfo, int rowIndex) { if (rowIndex < sheetLayoutInfo.MinRowIndexNonDefault || rowIndex >= sheetLayoutInfo.MaxRowIndexNonDefault) return null; RowsGroupInfo rowsGroupInfo = sheetLayoutInfo.RowsGroups[sheetLayoutInfo.GroupIndexDelta + (rowIndex >> 4)]; if (rowsGroupInfo == null) return null; int rowInfoIndex = rowsGroupInfo.Indices[rowIndex & 0xF]; return rowInfoIndex != -1 ? rowsGroupInfo.HeightInfos[rowInfoIndex] : null; } 

рдФрд░ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ SetRowHeight рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ (рдореИрдВрдиреЗ excel.exe рд╕реЗ рдЗрд╕рдХреЗ рдХреЛрдб рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ):


 public static void SetRowHeight(int rowIndex, ushort newRowHeight, ushort flags, SheetLayoutInfo sheetLayoutInfo) { sheetLayoutInfo.MaxRowIndexNonDefault = Math.Max(sheetLayoutInfo.MaxRowIndexNonDefault, rowIndex + 1); sheetLayoutInfo.MinRowIndexNonDefault = Math.Min(sheetLayoutInfo.MinRowIndexNonDefault, rowIndex); int realGroupIndex = rowIndex >> 4; if (sheetLayoutInfo.RowsGroups.Count == 0) { sheetLayoutInfo.RowsGroups.Add(null); sheetLayoutInfo.GroupIndexDelta = -realGroupIndex; } else if (sheetLayoutInfo.GroupIndexDelta + realGroupIndex < 0) { int bucketSize = -(sheetLayoutInfo.GroupIndexDelta + realGroupIndex); sheetLayoutInfo.RowsGroups.InsertRange(0, new RowsGroupInfo[bucketSize]); sheetLayoutInfo.GroupIndexDelta = -realGroupIndex; } else if (sheetLayoutInfo.GroupIndexDelta + realGroupIndex >= sheetLayoutInfo.RowsGroups.Count) { int bucketSize = sheetLayoutInfo.GroupIndexDelta + realGroupIndex - sheetLayoutInfo.RowsGroups.Count + 1; sheetLayoutInfo.RowsGroups.AddRange(new RowsGroupInfo[bucketSize]); } RowsGroupInfo rowsGroupInfo = sheetLayoutInfo.RowsGroups[sheetLayoutInfo.GroupIndexDelta + realGroupIndex]; if (rowsGroupInfo == null) { rowsGroupInfo = new RowsGroupInfo(); sheetLayoutInfo.RowsGroups[sheetLayoutInfo.GroupIndexDelta + realGroupIndex] = rowsGroupInfo; } int rowInfoIndex = rowsGroupInfo.Indices[rowIndex & 0xF]; RowHeightInfo rowHeightInfo; if (rowInfoIndex == -1) { rowHeightInfo = new RowHeightInfo(); rowsGroupInfo.HeightInfos.Add(rowHeightInfo); rowsGroupInfo.Indices[rowIndex & 0xF] = rowsGroupInfo.HeightInfos.Count - 1; } else { rowHeightInfo = rowsGroupInfo.HeightInfos[rowInfoIndex]; } rowHeightInfo.Value = newRowHeight; rowHeightInfo.Flags = flags; } 

рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрднреНрдпрд╛рд╕


рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рдж, рдкрдВрдХреНрддрд┐ 23 рдХреА рдКрдВрдЪрд╛рдИ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде, рдПрдХреНрд╕реЗрд▓ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рдореИрдВрдиреЗ рдкрдВрдХреНрддрд┐ 23 рдХреЛ 75 рдЕрдВрдХ рдХреА рдКрдВрдЪрд╛рдИ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ):


sheetLayoutInfo
  • DefaultFullRowHeightMul4 = 80
  • DefaultRowDelta2 = 5
  • MaxRowIndexNonDefault = 24
  • MinRowIndexNonDefault = 23
  • GroupIndexDelta = -1
  • RowsGroups рдЧрдгрдирд╛ = 1
    • [реж] RowsGroupInfo
    • HeightInfos Count = 1
      • [реж] рд░реЛрд╡рд╛рдЗрдЯрдЗрдиреНрдлреЛ
      • рдЭрдВрдбреЗ = 0x4005
      • рдорд╛рди = резрежреж
    • рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ
      • [реж] = рез
      • [рез] = -1
      • [реи] = рез
      • [рей] = рез
      • [рек] = рез
      • [рел] = рез
      • [рем] = рез
      • [[] = реж
      • [[] = рез
      • [реп] = -1
      • [резреж] = рез
      • [резрез] = рез
      • [резреи] = рез
      • [резрей] = рез
      • [резрек] = рез
      • [резрел] = рез

рдпрд╣рд╛рдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдПрдХ рдпреЛрдЬрдирд╛рдмрджреНрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдПрдХреНрд╕реЗрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрдореЛрд░реА рд╕реЗ рдПрдХ рд╕реАрдзрд╛ рдбрдВрдк рдмрд╣реБрдд рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рдЕрдм рдкрдВрдХреНрддрд┐ 23 рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 0x2000 рдмрд┐рдЯреНрд╕ рдлрд╝реНрд▓реИрдЧ рд╕реЗрдЯ рдХрд░реЗрдВред рд╣рдо рдЬреАрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: http://recordit.co/79vYIbwbzB
рдЬрдм рднреА рдЖрдк рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХреНрд╕реЗрд▓ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕реЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕реЗрд▓ A20 рдореЗрдВ рдлрд╝реЙрдиреНрдЯ 40 рдЕрдВрдХ рдХреА рдКрдВрдЪрд╛рдИ рдмрди рдЬрд╛рдиреЗ рджреЗрдВ, рдлрд┐рд░ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗрд▓ рдХреА рдКрдВрдЪрд╛рдИ 45.75 рд╣реЛрдЧреА рдФрд░ рдПрдХреНрд╕реЗрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
sheetLayoutInfo
  • DefaultFullRowHeightMul4 = 80
  • DefaultRowDelta2 = 5
  • MaxRowIndexNonDefault = 24
  • MinRowIndexNonDefault = 20
  • GroupIndexDelta = -1
  • RowsGroups рдЧрдгрдирд╛ = 1
    • [реж] RowsGroupInfo
    • HeightInfos Count = 2
      • [реж] рд░реЛрд╡рд╛рдЗрдЯрдЗрдиреНрдлреЛ
      • рдЭрдВрдбреЗ = 0x4005
      • рдорд╛рди = резрежреж
      • [рез] рд░реЛрд╣рд┐рддреЗрдЗрдиреНрдлреЛ
      • рдЭрдВрдбреЗ = 0x800E
      • рдорд╛рди = 244
    • рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ
      • [реж] = рез
      • [рез] = -1
      • [реи] = рез
      • [рей] = рез
      • [рек] = рез
      • [рел] = рез
      • [рем] = рез
      • [[] = реж
      • [[] = рез
      • [реп] = -1
      • [резреж] = рез
      • [резрез] = рез
      • [резреи] = рез
      • [резрей] = рез
      • [резрек] = рез
      • [резрел] = рез

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдорд╛рдирдХ рдирд╣реАрдВ рд╣реИ рддреЛ Excel рд╣рдореЗрд╢рд╛ рдкрдВрдХреНрддрд┐ рдХреА рдКрдБрдЪрд╛рдИ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рднрд▓реЗ рд╣реА рдКрдВрдЪрд╛рдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдпрд╛ рдкреНрд░рд╛рд░реВрдк рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдПрдХреНрд╕реЗрд▓ рдЕрднреА рднреА рдПрдХ рдмрд╛рд░ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЙрдЪрд┐рдд рд╕рдореВрд╣ рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ред


рд╣рдо рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдореНрдорд┐рд▓рди / рд╡рд┐рд▓реЛрдкрди рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ


рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд / рд╣рдЯрд╛рддреЗ рд╕рдордп рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред Excel.exe рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдХреЛ рдвреВрдВрдврдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рдереА, рдЖрдк рдЗрд╕рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:


sub_305EC930

рдлреНрд▓реИрдЧ a5 рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреМрди рд╕рд╛ рдСрдкрд░реЗрд╢рди рд╣реЛ рд░рд╣рд╛ рд╣реИред


 int __userpurge sub_305EC930@<eax>(int a1@<eax>, int a2@<edx>, int a3@<ecx>, int a4, int a5, int a6) { int v6; // esi int v7; // ebx int v8; // edi int v9; // edx int v10; // ecx size_t v11; // eax _WORD *v12; // ebp size_t v13; // eax size_t v14; // eax int v15; // eax unsigned __int16 *v16; // ecx _WORD *v17; // eax _WORD *v18; // ecx int v19; // edx __int16 v20; // bx int v21; // eax _WORD *v22; // ecx int v24; // edx int v25; // eax int v26; // esi int v27; // ebx size_t v28; // eax int v29; // ebp size_t v30; // eax int v31; // esi size_t v32; // eax int v33; // eax unsigned __int16 *v34; // ecx int v35; // eax _WORD *v36; // edx _WORD *v37; // ecx int v38; // eax __int16 v39; // bx int v40; // eax _WORD *v41; // ecx int v42; // [esp+10h] [ebp-48h] int v43; // [esp+10h] [ebp-48h] int v44; // [esp+14h] [ebp-44h] char v45; // [esp+14h] [ebp-44h] int Dst[16]; // [esp+18h] [ebp-40h] int v47; // [esp+5Ch] [ebp+4h] int v48; // [esp+60h] [ebp+8h] v6 = a1; v7 = a1 & 0xF; v8 = a2; if ( !a5 ) { v24 = a4 - a1; v25 = a1 - a3; v43 = a4 - v6; if ( v7 >= v25 ) v7 = v25; v47 = a4 - v7; v26 = v6 - v7; v27 = v7 + 1; v48 = v27; if ( !v8 ) return v27; v28 = 4 * v24; if ( (4 * v24) > 0x40 ) v28 = 64; v45 = v27 + v26; v29 = (v27 + v26) & 0xF; memmove(Dst, (v8 + 4 * v29), v28); v30 = 4 * v27; if ( (4 * v27) > 0x40 ) v30 = 64; v31 = v26 & 0xF; memmove((v8 + 4 * (v47 & 0xF)), (v8 + 4 * v31), v30); v32 = 4 * v43; if ( (4 * v43) > 0x40 ) v32 = 64; memmove((v8 + 4 * v31), Dst, v32); if ( !a6 ) return v48; v33 = v29; if ( v29 < v29 + v43 ) { v34 = (v8 + 4 * v29 + 214); do { Dst[v33++] = *v34 >> 15; v34 += 2; } while ( v33 < v29 + v43 ); } v35 = (v45 - 1) & 0xF; if ( v35 >= v31 ) { v36 = (v8 + 4 * ((v27 + v47 - 1) & 0xF) + 214); v37 = (v8 + 4 * ((v45 - 1) & 0xF) + 214); v38 = v35 - v31 + 1; do { v39 = *v37 ^ (*v37 ^ *v36) & 0x7FFF; v37 -= 2; *v36 = v39; v36 -= 2; --v38; } while ( v38 ); v27 = v48; } v40 = v31; if ( v31 >= v31 + v43 ) return v27; v41 = (v8 + 4 * v31 + 214); do { *v41 = *v41 & 0x7FFF | (LOWORD(Dst[v40++]) << 15); v41 += 2; } while ( v40 < v31 + v43 ); return v27; } v9 = a1 - a4; v10 = a3 - a1; v42 = a1 - a4; v48 = 16 - v7; if ( 16 - v7 >= v10 ) v48 = v10; if ( !v8 ) return v48; v11 = 4 * v9; if ( (4 * v9) > 0x40 ) v11 = 64; v12 = (v8 + 4 * (a4 & 0xF)); v44 = a4 & 0xF; memmove(Dst, v12, v11); v13 = 4 * v48; if ( (4 * v48) > 0x40 ) v13 = 64; memmove(v12, (v8 + 4 * v7), v13); v14 = 4 * v42; if ( (4 * v42) > 0x40 ) v14 = 64; memmove((v8 + 4 * ((a4 + v48) & 0xF)), Dst, v14); if ( !a6 ) return v48; v15 = a4 & 0xF; if ( v44 < v44 + v42 ) { v16 = (v8 + 4 * v44 + 214); do { Dst[v15++] = *v16 >> 15; v16 += 2; } while ( v15 < v44 + v42 ); } if ( v7 < v48 + v7 ) { v17 = (v8 + 4 * v7 + 214); v18 = v12 + 107; v19 = v48; do { v20 = *v17 ^ (*v17 ^ *v18) & 0x7FFF; v17 += 2; *v18 = v20; v18 += 2; --v19; } while ( v19 ); } v21 = a4 & 0xF; if ( v44 >= v44 + v42 ) return v48; v22 = (v8 + 4 * (v44 + v48) + 214); do { *v22 = *v22 & 0x7FFF | (LOWORD(Dst[v21++]) << 15); v22 += 2; } while ( v21 < v44 + v42 ); return v48; } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдмрд╛рдХреА рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдХреЗрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред
рд╣рдо рдЗрди рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ 16 рд╕реЗ 64 рд╕рдорд╛рд╡реЗрд╢реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдКрдВрдЪрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред рдлрд┐рд░, рд╕реВрдЪрдХрд╛рдВрдХ 39 рдХреЗ рддрд╣рдд рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рдордиреЗ, рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдбрд╛рд▓реЗрдВред рдирдИ рдкрдВрдХреНрддрд┐ рдкрдВрдХреНрддрд┐ 38 рдХреА рдКрдВрдЪрд╛рдИ рдХреА рдирдХрд▓ рдХрд░реЗрдЧреАред
рдЖрдЗрдП рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦреЗрдВ, рдореИрдВрдиреЗ рдмреЛрд▓реНрдб рдЕрдВрддрд░ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛:


рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗрдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж
рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:
0 рдИ, 04, 07, 00, 05, 0 рдП, 09, 0 рдПрдл, 03, 06, 08, 0 рдбреА, 01, 0 рдмреА, 0 рд╕реА, 020 рдИ, 04, 07, 00, 05, 0 рдП, 09, 0 рдПрдл, 03, 06, 08, 0 рдбреА, 01, 0 рдмреА, 0 рд╕реА, 02
рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:
05, 2B, 35, 45, 4B, 50, 5B, 6B, 7B, 8B, A5, AB, B0, B5, E0, 10005, 2B, 35, 45, 4B, 50, 5B, 6B, 7B, 8B, A5, AB, B0, B5, E0, 100
рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:
06, 02, 0E, 09, 01, 07, 0F, 0C , 00, 0A, 04, 0B, 03, 08, 0D, 0506, 02, 0E, 09, 01, 07, 0F, 05, 0C , 00, 0A, 04, 0B, 03, 08, 0D
рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:
10, 15, 20, 25, 30, 75 , 85, 90, 9B, A0, C5, CB, D0, D5, E5, F010, 15, 20, 25, 30, F0 , 85, 90, 9B, A0, C5, CB, D0, D5, E5, F0
рддреАрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:рддреАрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:
0 рд╕реА, 08, 0 рдИ, 07, 0 рдП, 01, 06, 0 рдПрдл, 09, 0 рдбреА, 00, 05, 0 рдмреА, 02, 04, 0303 , 0 рд╕реА, 08, 0 рдИ, 07, 0 рдП, 01, 06, 0 рдПрдл, 09, 0 рдбреА, 00, 05, 0 рдмреА, 02, 04
рддреАрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:рддреАрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:
0B, 1B, 3B, 40 , 55, 60, 65, 70, 80, 95, BB, C0, DB, EB, F5, FB0B, 1B, 3B, 75 , 55, 60, 65, 70, 80, 95, BB, C0, DB, EB, F5, FB
рдЪреМрдереЗ рд╕рдореВрд╣ рдореЗрдВ рдСрдлрд╕реЗрдЯ:рдЪреМрдереЗ рд╕рдореВрд╣ рдореЗрдВ рдСрдлрд╕реЗрдЯ:
_00
рдЪреМрдереЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:рдЪреМрдереЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:
_40

рдпрд╣ рд╡рд╣реА рдерд╛ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛: рдПрдХреНрд╕реЗрд▓ рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ 7 (39 рдФрд░ 0xF) рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдСрдлрд╕реЗрдЯ 0x05 рд╣реИ, рдкрдВрдХреНрддрд┐ рдХреА рдКрдБрдЪрд╛рдИ рдХреЛ рд╕реВрдЪрдХрд╛рдВрдХ 6 рдкрд░ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐, рдЬреЛ рдСрдлрд╕реЗрдЯ 05 рдереА, рдХреЛ рдЕрдЧрд▓реЗ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╕рдореВрд╣, рдФрд░ рд╡рд╣рд╛рдБ рд╕реЗ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛ рдЪреМрдереЗ рдореЗрдВ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрджрд┐ред


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ 29 рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдХреЛ рд╣рдЯрд╛рдиреЗ рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред


рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗрдкрдВрдХреНрддрд┐ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж
рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:
0 рдИ, 04, 07, 00, 05, 0 рдП, 09, 0 рдПрдл, 03, 06, 08, 0 рдбреА, 01, 0 рдмреА, 0 рд╕реА, 020 рдИ, 04, 07, 00, 05, 0 рдП, 09, 0 рдПрдл, 03, 06, 08, 0 рдбреА, 01, 0 рд╕реА, 02, 0 рдмреА
рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:
05, 2B, 35, 45, 4B, 50, 5B, 6B, 7B, 8B, A5, AB , B0, B5, E0, 10005, 2B, 35, 45, 4B, 50, 5B, 6B, 7B, 8B, A5, 85 , B0, B5, E0, 100
рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:
06 , 02, 0E, 09, 01, 07, 0F, 05, 0C, 00, 0A, 04, 0B, 03, 08, 0D02, 0 рдИ, 09, 01, 07, 0 рдПрдл, 05, 0 рд╕реА, 00, 0 рдП, 04, 0 рдмреА, 03, 08, 0 рдбреА, 06
рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:
10, 15, 20, 25, 30, F0, 85 , 90, 9B, A0, C5, CB, D0, D5, E5, F010, 15, 20, 25, 30, F0, 75 , 90, 9B, A0, C5, CB, D0, D5, E5, F0
рддреАрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:рддреАрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди:
03 , 0 рд╕реА, 08, 0 рдИ, 07, 0 рдП, 01, 06, 0 рдПрдл, 09, 0 рдбреА, 00, 05, 0 рдмреА, 02, 040 рд╕реА, 08, 0 рдИ, 07, 0 рдП, 01, 06, 0 рдПрдл, 09, 0 рдбреА, 00, 05, 0 рдмреА, 02, 04, 03
рддреАрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:рддреАрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:
0B, 1B, 3B, 75 , 55, 60, 65, 70, 80, 95, BB, C0, DB, EB, F5, FB0B, 1B, 3B, 40 , 55, 60, 65, 70, 80, 95, BB, C0, DB, EB, F5, FB
рдЪреМрдереЗ рд╕рдореВрд╣ рдореЗрдВ рдСрдлрд╕реЗрдЯ:рдЪреМрдереЗ рд╕рдореВрд╣ рдореЗрдВ рдСрдлрд╕реЗрдЯ:
0000
рдЪреМрдереЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:рдЪреМрдереЗ рд╕рдореВрд╣ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдорд╛рди:
4050

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЬрдм рдХреЛрдИ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд░рд┐рд╡рд░реНрд╕ рдСрдкрд░реЗрд╢рди рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЪреМрдереЗ рд╕рдореВрд╣ рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдкрдВрдХреНрддрд┐ рдХреА рдКрдБрдЪрд╛рдИ рдХреЗ рдорд╛рди рдХреЛ рдЗрд╕реА рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдКрдБрдЪрд╛рдИ рд╕реЗ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ - 0208005ред


рдпрд╣ рдбреЗрдЯрд╛ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ C # рдореЗрдВ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:


InsertRow
 public static void InsertRow(SheetLayoutInfo sheetLayoutInfo, int rowIndex) { if (rowIndex >= sheetLayoutInfo.MaxRowIndexNonDefault) return; RowHeightInfo etalonRowHeightInfo = GetRowHeightCore(sheetLayoutInfo, rowIndex); RowHeightInfo newRowHeightInfo = etalonRowHeightInfo != null ? etalonRowHeightInfo.Clone() : CreateDefaultRowHeight(sheetLayoutInfo); int realGroupIndex = (rowIndex + 1) >> 4; int newRowInGroupIndex = (rowIndex + 1) & 0xF; int groupIndex; for (groupIndex = realGroupIndex + sheetLayoutInfo.GroupIndexDelta; groupIndex < sheetLayoutInfo.RowsGroups.Count; groupIndex++, newRowInGroupIndex = 0) { if (groupIndex < 0) continue; if (groupIndex == SheetLayoutInfo.MaxGroupsCount) break; RowsGroupInfo rowsGroupInfo = sheetLayoutInfo.RowsGroups[groupIndex]; if (rowsGroupInfo == null) { if ((newRowHeightInfo.Flags & CustomHeightMask) == 0) continue; rowsGroupInfo = new RowsGroupInfo(); sheetLayoutInfo.RowsGroups[groupIndex] = rowsGroupInfo; } int rowInfoIndex = rowsGroupInfo.Indices[newRowInGroupIndex]; RowHeightInfo lastRowHeightInGroup; if (rowInfoIndex == -1 || rowsGroupInfo.HeightInfos.Count < SheetLayoutInfo.MaxRowsCountInGroup) { lastRowHeightInGroup = GetRowHeightCore(sheetLayoutInfo, ((groupIndex - sheetLayoutInfo.GroupIndexDelta) << 4) + SheetLayoutInfo.MaxRowsCountInGroup - 1); Array.Copy(rowsGroupInfo.Indices, newRowInGroupIndex, rowsGroupInfo.Indices, newRowInGroupIndex + 1, SheetLayoutInfo.MaxRowsCountInGroup - 1 - newRowInGroupIndex); rowsGroupInfo.HeightInfos.Add(newRowHeightInfo); rowsGroupInfo.Indices[newRowInGroupIndex] = rowsGroupInfo.HeightInfos.Count - 1; } else { int lastIndex = rowsGroupInfo.Indices[SheetLayoutInfo.MaxRowsCountInGroup - 1]; lastRowHeightInGroup = rowsGroupInfo.HeightInfos[lastIndex]; Array.Copy(rowsGroupInfo.Indices, newRowInGroupIndex, rowsGroupInfo.Indices, newRowInGroupIndex + 1, SheetLayoutInfo.MaxRowsCountInGroup - 1 - newRowInGroupIndex); rowsGroupInfo.HeightInfos[lastIndex] = newRowHeightInfo; rowsGroupInfo.Indices[newRowInGroupIndex] = lastIndex; } newRowHeightInfo = lastRowHeightInGroup ?? CreateDefaultRowHeight(sheetLayoutInfo); } if ((newRowHeightInfo.Flags & CustomHeightMask) != 0 && groupIndex != SheetLayoutInfo.MaxGroupsCount) { SetRowHeight(((groupIndex - sheetLayoutInfo.GroupIndexDelta) << 4) + newRowInGroupIndex, newRowHeightInfo.Value, newRowHeightInfo.Flags, sheetLayoutInfo); } else { sheetLayoutInfo.MaxRowIndexNonDefault = Math.Min(sheetLayoutInfo.MaxRowIndexNonDefault + 1, SheetLayoutInfo.MaxRowsCount); } } 

RemoveRow
 public static void RemoveRow(SheetLayoutInfo sheetLayoutInfo, int rowIndex) { if (rowIndex >= sheetLayoutInfo.MaxRowIndexNonDefault) return; int realGroupIndex = rowIndex >> 4; int newRowInGroupIndex = rowIndex & 0xF; int groupIndex; for (groupIndex = realGroupIndex + sheetLayoutInfo.GroupIndexDelta; groupIndex < sheetLayoutInfo.RowsGroups.Count; groupIndex++, newRowInGroupIndex = 0) { if (groupIndex < -1) continue; if (groupIndex == -1) { sheetLayoutInfo.RowsGroups.Insert(0, null); sheetLayoutInfo.GroupIndexDelta++; groupIndex = 0; } if (groupIndex == SheetLayoutInfo.MaxGroupsCount) break; var newRowHeightInfo = groupIndex == SheetLayoutInfo.MaxGroupsCount - 1 ? null : GetRowHeightCore(sheetLayoutInfo, (groupIndex - sheetLayoutInfo.GroupIndexDelta + 1) << 4); RowsGroupInfo rowsGroupInfo = sheetLayoutInfo.RowsGroups[groupIndex]; if (rowsGroupInfo == null) { if (newRowHeightInfo == null || (newRowHeightInfo.Flags & CustomHeightMask) == 0) continue; rowsGroupInfo = new RowsGroupInfo(); sheetLayoutInfo.RowsGroups[groupIndex] = rowsGroupInfo; } if (newRowHeightInfo == null) { newRowHeightInfo = CreateDefaultRowHeight(sheetLayoutInfo); } int rowInfoIndex = rowsGroupInfo.Indices[newRowInGroupIndex]; if (rowInfoIndex == -1) { for (int i = newRowInGroupIndex; i < SheetLayoutInfo.MaxRowsCountInGroup - 1; i++) { rowsGroupInfo.Indices[i] = rowsGroupInfo.Indices[i + 1]; } rowsGroupInfo.HeightInfos.Add(newRowHeightInfo); rowsGroupInfo.Indices[SheetLayoutInfo.MaxRowsCountInGroup - 1] = rowsGroupInfo.HeightInfos.Count - 1; } else { for(int i = newRowInGroupIndex; i < rowsGroupInfo.HeightInfos.Count - 1; i++) { rowsGroupInfo.Indices[i] = rowsGroupInfo.Indices[i + 1]; } rowsGroupInfo.Indices[rowsGroupInfo.HeightInfos.Count - 1] = rowInfoIndex; rowsGroupInfo.HeightInfos[rowInfoIndex] = newRowHeightInfo; } } if(rowIndex <= sheetLayoutInfo.MinRowIndexNonDefault) { sheetLayoutInfo.MinRowIndexNonDefault = Math.Max(sheetLayoutInfo.MinRowIndexNonDefault - 1, 0); } } 

рдЖрдк рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛрдб GitHub рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ


рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдирд╣реАрдВ рд╣реИ рдЬрдм рдПрдХреНрд╕реЗрд▓ рдХреЛрдб рджрд┐рд▓рдЪрд╕реНрдк рдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рд╣реИрд░рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдмрд╛рд░ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╡рд╣ рдХреИрд╕реЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдореБрджрд╛рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд▓ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕реАрдорд╛ рдХреА рдКрдВрдЪрд╛рдИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ (рд╕реНрдкреЙрдЗрд▓рд░: рдПрд╕рдХреНрдпреВрдЖрд░рдЯреА рдЕрдкрдШрдЯрди рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрд╛рд░рдгреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд░рдХрдо рдХреЛ рд░реЛрдХрдирд╛), рдЖрдк рд╡рд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдореЗрдВ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ ред

Source: https://habr.com/ru/post/hi435426/


All Articles