alibek писал(а):Andrey Fedorov, ты фишку не понял
Это круто даже не тем, что возвращает Null, а тем, что второй параметр (какой мембер тебе нужно получить) является смещением по структуре.
GSerg писал(а):ибо нельзя вернуть Null
Andrey Fedorov писал(а):Да понял я - первый параметр ссылка на структуру, второй параметр - ссылка (а не смещение!) на ее члена - тут все как обычно. Но в конкретном случае это лишнее ибо все можно решить гораздо проще. А где такое может реально пригодиться - пока сходу не соображу - может и может где-то...
Andrey Fedorov писал(а):Но в конкретном случае это лишнее
GSerg писал(а):Напиши код, который один в один делает то, что делает мой, но без этого приёма.
Это возможно, я знаю. Я хочу посмотреть, как будет выглядеть этот код.
Private Type VSYSTEMTIME
wYear As Variant
wMonth As Variant
wDayOfWeek As Variant
wDay As Variant
wHour As Variant
wMinute As Variant
wSecond As Variant
wMilliseconds As Variant
End Type
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Public Property Get Hour() As Variant
Hour = GetDatePart.wHour
End Property
Public Property Get Minute() As Variant
Minute = GetDatePart.wMinute
End Property
Private Function GetDatePart() As VSYSTEMTIME
Dim t As SYSTEMTIME, tv As VSYSTEMTIME
If SendMessage(h, DTM_GETSYSTEMTIME, 0, t) = GDT_VALID Then
tv.wMinute = t.wMinute
tv.wHour = t.wHour
' ...
Else
tv.wMinute = Null
tv.wHour = Null
' ...
End If
GetDatePart = tv
End Function
alibek писал(а):Неа
Второй параметр -- таки смещение
Igor_123 писал(а):Почему другое? Это именно смещение от начала размещения структуры в памяти
alibek писал(а):Да нет же.
В UDT переменные-мемберы существуют только для удобства разработчика. В скомпилированном коде нет никаких переменных, есть только смещение в структуре.
alibek писал(а):Сделал. Как и ожидал, смещения различаются на длину мембера. Причем VarPtr(udt.first_member) совпадает с VarPtr(udt).
alibek писал(а):Сделал. Как и ожидал, смещения различаются на длину мембера. Причем VarPtr(udt.first_member) совпадает с VarPtr(udt).
alibek писал(а):В смысле, заменяет VarPtr(udt.member) на VarPtr(udt)+Len(udt.Member).
alibek писал(а):А по-моему наоборот, просто компилятор корректирует вызовы VarPtr для структур. Иначе как объяснить, что вся структура и первый мембер структуры имеют один адрес?
Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 67