BG Development


  Reply to this topicStart new topicStart Poll

> Ексел юсерформ меню, помощ
ivayleto
Публикувано на: 24-02-2022, 17:30
Quote Post



Име: Ивайло Илиев
Група: Потребител
Ранг: Новопостъпил

Мнения: 2
Регистриран на: 24.02.22



Здравейте, може ли помощ отнотно файлът. Опитах да го подкарам на 64 битов Ексел, но не се получава. Смених дефинициите с PtrSafe, но пак нищо не се получи. Опитах да променя Long->LongPtr, "Type mismatch". Засега стигам до това да се стартира формата с менютата, но когато се избере меню нищо не се случва, а трябва да се появи съответния месидж. На 32 бита ексел върви без проблем. но искам да го използвам и на 64 бита и на 32.

Моля за помощ!

Прикачен файл ( Брой сваляния: 29 )
Прикачен файл  Menu_maker_Original.zip
PMEmail Poster
Top
ici
Публикувано на: 24-02-2022, 19:45
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 17872
Регистриран на: 06.06.04



Сложи кода тук във [ CODE ] секция, без интервалите.


--------------------
Ние не сме в една лодка, ние сме в една буря. Лодките са различни.

Следващият път когато се почувстваш ненужен, грозен и недооценен, помни че освен това си и тъп.
PMEmail PosterUsers Website
Top
Антон Яначков
Публикувано на: 24-02-2022, 19:53
Quote Post



Име: Антон Яначков
Група: Потребител
Ранг: Почетен член

Мнения: 2621
Регистриран на: 27.07.16



Използвай този шаблон за деклариране на АПИ функциите и всичко ще се оправи.
Един и същ файл ще работи безпроблемно и на 32 и на 64 битова машина.

ПРИМЕР:
#If VBA7 Then
'Декларираме АПИ функция за 64 битова машина за изпращане фокуса в прозорец с известен hwnd
Public Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As LongPtr

'Декларираме АПИ функция за 64 битова машина за извеждане на прозорец най-отгоре с известен hwnd
Public Declare PtrSafe Function BringWindowToTop Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
'.....И така нататък за всички АПИ функции, а също и разни променливи или константи, които подаваш на функциите
#Else
'Декларираме АПИ функция за 32 битова машина за изпращане фокуса в прозорец с известен hwnd
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
'Декларираме АПИ функция за 32 битова машина за извеждане на прозорец най-отгоре с известен hwnd
Public Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
#End If

Това, което си написал за показване на формата е ненужно:
#If VBA6 Then
'// A drawback to this method is
'// you CANNOT use vbModeless....
'// I'm working on this.
frmTask.Show
#Else
Sorry
#End If

Това е елементарен стандартен метод Show и той работи и се пише по един и същи начин.
И на 32 битова машина и на 64 битова е достатъчно да напишеш:
frmTask.Show
Но при процедурата за инициализация
Private Sub UserForm_Initialize()
имаш извикване на процедура Call CreateAPIMenu, която сигурно използва някоя АПИ функция и ако намяш декларация на използваните АПИ за двата вида машини, ще срине програмата.

Сега Внимавай!
Ако тръгнеш да налучкваш декларацията за 64 битова машина, като просто подменяш примерно Long с LongPrt и Declare c Declare PtrSafe, то вероятността да сгрешиш е голяма.
Търсиш точната декларация на всяка една API функция в интернет и не забравяш, че тя пък работи с променливи, които също могат да бъдат от различен тип и трябва да ги декларираш също по различен начин.

PMEmail PosterUsers Website
Top
ivayleto
Публикувано на: 25-02-2022, 10:18
Quote Post



Име: Ивайло Илиев
Група: Потребител
Ранг: Новопостъпил

Мнения: 2
Регистриран на: 24.02.22



QUOTE (Антон Яначков @ 24-02-2022, 19:53)
Използвай този шаблон за деклариране на АПИ функциите и всичко ще се оправи.
Един и същ файл ще работи безпроблемно и на 32 и на 64 битова машина.

ПРИМЕР:
#If VBA7 Then
  'Декларираме АПИ функция за 64 битова машина за изпращане фокуса в прозорец с известен hwnd
Public Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As LongPtr

  'Декларираме АПИ функция за 64 битова машина за извеждане на прозорец най-отгоре с известен hwnd
Public Declare PtrSafe Function BringWindowToTop Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
  '.....И така нататък за всички АПИ функции, а също и разни променливи или константи, които подаваш на функциите
#Else
'Декларираме АПИ функция за 32 битова машина за изпращане фокуса в прозорец с известен hwnd
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
'Декларираме АПИ функция за 32 битова машина за извеждане на прозорец най-отгоре с известен hwnd
Public Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
#End If

Това, което си написал за показване на формата е ненужно:
    #If VBA6 Then
        '// A drawback to this method is
        '// you CANNOT use vbModeless....
        '// I'm working on this.
        frmTask.Show
    #Else
        Sorry
    #End If

Това е елементарен стандартен метод Show и той работи и се пише по един и същи начин.
И на 32 битова машина и на 64 битова е достатъчно да напишеш:
frmTask.Show
Но при процедурата за инициализация
Private Sub UserForm_Initialize()
имаш извикване на процедура Call CreateAPIMenu, която сигурно използва някоя АПИ функция и ако намяш декларация на използваните АПИ за двата вида машини, ще срине програмата.

Сега Внимавай!
Ако тръгнеш да налучкваш декларацията за 64 битова машина, като просто подменяш примерно Long с LongPrt и Declare c Declare PtrSafe, то вероятността да сгрешиш е голяма.
Търсиш точната декларация на всяка една API функция в интернет и не забравяш, че тя пък работи с променливи, които също могат да бъдат от различен тип и трябва да ги декларираш също по различен начин.

Здравейте, благодаря за насоките. Направих всичко както ме насочихте, дефинирах Api функциите за 32 и 64 бита (поне така мисля). Узерформата се компилира но когато стигне до
[CODE]g_lpMyWndProc = SetWindowLongPtr(g_hForm, GWL_WNDPROC, AddressOf HookWinProc)[CODE]
стойността му става 140712738041436^, формата не се зарежда, а точно обратното ексел се затваря. Може ли да погледнете и да ме насочите, защо се получава така. Благодаря Ви предварително.

Това мнение е било редактирано от ivayleto на 25-02-2022, 10:19

Прикачен файл ( Брой сваляния: 37 )
Прикачен файл  Menu_maker_Original_64_32.zip
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0