1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Вопрос Упростить однообразные действия

Тема в разделе "Inno Setup", создана пользователем Le9ent, 26 мар 2020.

  1. Пользователь

    Регистрация:
    21 июл 2012
    Сообщения:
    38
    Симпатии:
    2
    Пол:
    Мужской
    Доброго времени суток уважаемые форумчане.
    Давно использую ботву и сейчас задался целью упростить однообразные действия.
    К примеру часть кода для создания чекбокса:
    Код (Inno):
    1. BtnSetCursor(Test1CheckBox, GetSysCursorHandle(32649));
    2. BtnSetVisibility(Test1CheckBox, False);
    3. Test1CheckBox:= BtnCreate(WizardForm.Handle, 100, 15, 15, 15, 'BoxImage.png', 0, True);
    4. BtnSetEvent(Test1CheckBox, BtnClickEventID, WrapBtnCallback(@Test1Click, 1));
    И данных элементов множество, меняется только название чекбокса, события по клику на него и координаты. Думал добавить какую нибудь процедуру или функцию, наподобие:
    Код (Inno):
    1.  
    2. procedure Test1Click(hBtn: HWND);
    3. begin
    4. end;
    5.  
    6. procedure CheckBox(aName, aEvent: String; aLeft, aTop, aWidth, aHeight: Integer);
    7. begin
    8.   BtnSetCursor(aName, GetSysCursorHandle(32649));
    9.   BtnSetVisibility(aName, False);
    10.   aName:= BtnCreate(WizardForm.Handle, aLeft, aTop, aWidth, aHeight, 'BoxImage.png', 0, True);
    11.   BtnSetEvent(aName, BtnClickEventID, WrapBtnCallback(@aEvent, 1));
    12. end;
    13.  
    14. Test1:= CheckBox('NewChBox1', 'Test1Click'; 21, 161, 13, 13);
    В итоге не завелось:

    Screenshot_1.png

    Я не силен в написании процедур, явно чтото не так делаю.
     
  2. Борода Супер модератор

    Регистрация:
    15 июн 2011
    Сообщения:
    757
    Симпатии:
    612
    Пол:
    Мужской
    WrapBtnCallback(@aEvent, 1)); тут косяк
    aEvent: String - точнее, тут.
    Мне немного некогда скачивать ботву и вспоминать, чего там, но тебе нужен точно не String. Нужно передавать указатель на процедуру. Должно быть что-то вроде
    aEvent: Pointer
    Test1:= CheckBox('NewChBox1', Test1Click(nil); 21, 161, 13, 13);
    Я не гарантирую, что именно так заведется, но направление вроде понятно )
     
    Le9ent нравится это.
  3. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    790
    Симпатии:
    1.147
    Пол:
    Мужской
    Всё верно, неправильные типы параметров. И ещё, почему функции присвоения курсора и видимость кнопки устанавливаются ДО создания кнопки?
    Так правильнее будет
    Код (Text):
    1. function CheckBox(aEvent: TBtnEventProc; aLeft, aTop, aWidth, aHeight: Integer): HWND;
    2. var
    3.   aName: HWND;
    4. begin
    5.   aName:= BtnCreate(WizardForm.Handle, aLeft, aTop, aWidth, aHeight, 'BoxImage.png', 0, True);
    6.   BtnSetCursor(aName, GetSysCursorHandle(32649));
    7.   BtnSetVisibility(aName, False);
    8.   BtnSetEvent(aName, BtnClickEventID, WrapBtnCallback(aEvent, 1));
    9.   Result:= aName;
    10. end;
    11.  
    12. ****
    13. Test1CheckBox:= CheckBox(@Test1Click, 21, 161, 13, 13);
    14.  
     
    Последнее редактирование: 26 мар 2020
    YURSHAT и Le9ent нравится это.
  4. Пользователь

    Регистрация:
    21 июл 2012
    Сообщения:
    38
    Симпатии:
    2
    Пол:
    Мужской
    P.S.: Заменил только Result:= aName;
    Огромное человеческое Спасибо Вам.
     
  5. Пользователь

    Регистрация:
    21 июл 2012
    Сообщения:
    38
    Симпатии:
    2
    Пол:
    Мужской
    Еще немного отвлеку Вас.
    При создании чекбокса я добавляю к нему так сказать предпросмотр.
    Навел мышь отобразилась картинка (подказка), убрал - исчезла.

    Код (Inno):
    1. [Code]
    2.  
    3. var
    4.   Test1CheckBox: HWND;
    5.   preview_1: Longint;
    6.  
    7. procedure Test1_MouseMove(hBtn: HWND);
    8. begin
    9.   ImgSetVisibility(preview_1, True);
    10.   ImgApplyChanges(WizardForm.Handle);
    11. end;
    12.  
    13. procedure Test1_MouseLeave(hBtn: HWND);
    14. begin
    15.   ImgSetVisibility(preview_1, False);
    16.   ImgApplyChanges(WizardForm.Handle);
    17. end;
    18.  
    19. procedure Create();
    20. begin
    21.   preview_1:= ImgLoad(WizardForm.Handle, 'preview_img.png', ScaleX(125), ScaleY(15), ScaleX(75), ScaleY(110), True, True);
    22.  
    23.   BtnSetEvent(Test1CheckBox, BtnMouseMoveEventID, WrapBtnCallback(@Test1_MouseMove, 1));
    24.   BtnSetEvent(Test1CheckBox, BtnMouseLeaveEventID, WrapBtnCallback(@Test1_MouseLeave, 1));
    25. end;
    Соответственно сколько чекбоксов столько и процедур (Test1_MouseMove, Test1_MouseMove).
    Так вот раз создание самого чекбокса теперь упрощено до одной строки можно ли теперь объединить новую функцию из примера выше с данным функционалом. Т.е. берем за основу:
    Код (Inno):
    1. procedure Preview_MouseMove(hBtn: HWND);
    2. begin
    3.   ImgSetVisibility(preview_1, True);
    4.   ImgApplyChanges(WizardForm.Handle);
    5. end;
    6.  
    7. procedure Preview_MouseLeave(hBtn: HWND);
    8. begin
    9.   ImgSetVisibility(preview_1, False);
    10.   ImgApplyChanges(WizardForm.Handle);
    11. end;
    12.  
    13. function CheckBox(aEvent: TBtnEventProc; aLeft, aTop, aWidth, aHeight: Integer): HWND;
    14. var
    15.   aName: HWND;
    16. begin
    17.   aName:= BtnCreate(WizardForm.Handle, aLeft, aTop, aWidth, aHeight, 'BoxImage.png', 0, True);
    18.   BtnSetCursor(aName, GetSysCursorHandle(32649));
    19.   BtnSetVisibility(aName, False);
    20.   BtnSetEvent(aName, BtnClickEventID, WrapBtnCallback(aEvent, 1));
    21.   BtnSetEvent(aName, BtnMouseMoveEventID, WrapBtnCallback(@Preview_MouseMove, 1));
    22.   BtnSetEvent(aName, BtnMouseLeaveEventID, WrapBtnCallback(@Preview_MouseLeave, 1));
    23.   Result:= aName;
    24. end;
    25.  
    26. ****
    27. Test1CheckBox:= CheckBox(@Test1Click, 21, 161, 13, 13);
    Как правильно прописать чтобы до процедур (Preview_MouseLeave, Preview_MouseMove) из функции передавался параметр, который будет использоваться взамен текущего preview_1
     
    Последнее редактирование: 26 мар 2020
  6. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    790
    Симпатии:
    1.147
    Пол:
    Мужской
    Прошу прощения, издержки C++ разработчика. Инно рядом не было, писал на коленке

    Можно сделать общие функции onMouseLeave, onMouseEnter. Примерно так:
    Код (Text):
    1.  
    2. procedure Preview_MouseMove(hBtn: HWND);
    3. begin
    4.   case hBtn of
    5.     checkBox1: begin
    6.       ImgSetVisibility(preview_1, True);
    7.     end;
    8.     checkBox2: begin
    9.       ImgSetVisibility(preview_2, True);
    10.     end;
    11.   end;
    12.  
    13.   ImgApplyChanges(WizardForm.Handle);
    14. end;
     
    Le9ent нравится это.
  7. Борода Супер модератор

    Регистрация:
    15 июн 2011
    Сообщения:
    757
    Симпатии:
    612
    Пол:
    Мужской
    Le9ent, там передается хендл кнопки, можно его использовать, что можно найти в примерах, собственно:
    Код (Inno):
    1. procedure Test1_MouseMove(hBtn: HWND);
    2. var
    3. img : LongInt;
    4. begin
    5.   case hBtn of
    6.     Test1CheckBox: img :=preview_1;
    7.     Test2CheckBox: img :=preview_2;
    8.     Test3CheckBox: img :=preview_3;
    9.   end;
    10.   ImgSetVisibility(img, True);
    11.   ImgApplyChanges(WizardForm.Handle);
    12. end;
     
    Le9ent нравится это.
  8. Пользователь

    Регистрация:
    21 июл 2012
    Сообщения:
    38
    Симпатии:
    2
    Пол:
    Мужской
    Это я должен был написать ) из-за своей навязчивости.

    @LexBell , @Shegorat спасибо !!!
     

Поделиться этой страницей