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

Le9ent

Новичок
Доброго времени суток уважаемые форумчане.
Давно использую ботву и сейчас задался целью упростить однообразные действия.
К примеру часть кода для создания чекбокса:
Код:
BtnSetCursor(Test1CheckBox, GetSysCursorHandle(32649));
BtnSetVisibility(Test1CheckBox, False);
Test1CheckBox:= BtnCreate(WizardForm.Handle, 100, 15, 15, 15, 'BoxImage.png', 0, True);
BtnSetEvent(Test1CheckBox, BtnClickEventID, WrapBtnCallback(@Test1Click, 1));
И данных элементов множество, меняется только название чекбокса, события по клику на него и координаты. Думал добавить какую нибудь процедуру или функцию, наподобие:
Код:
procedure Test1Click(hBtn: HWND);
begin
end;

procedure CheckBox(aName, aEvent: String; aLeft, aTop, aWidth, aHeight: Integer);
begin
  BtnSetCursor(aName, GetSysCursorHandle(32649));
  BtnSetVisibility(aName, False);
  aName:= BtnCreate(WizardForm.Handle, aLeft, aTop, aWidth, aHeight, 'BoxImage.png', 0, True);
  BtnSetEvent(aName, BtnClickEventID, WrapBtnCallback(@aEvent, 1));
end;

Test1:= CheckBox('NewChBox1', 'Test1Click'; 21, 161, 13, 13);
В итоге не завелось:

Screenshot_1.png

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

LexBell

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

Shegorat

Lord of Madness
Администратор
Всё верно, неправильные типы параметров. И ещё, почему функции присвоения курсора и видимость кнопки устанавливаются ДО создания кнопки?
Так правильнее будет
Код:
function CheckBox(aEvent: TBtnEventProc; aLeft, aTop, aWidth, aHeight: Integer): HWND;
var
  aName: HWND;
begin
  aName:= BtnCreate(WizardForm.Handle, aLeft, aTop, aWidth, aHeight, 'BoxImage.png', 0, True);
  BtnSetCursor(aName, GetSysCursorHandle(32649));
  BtnSetVisibility(aName, False);
  BtnSetEvent(aName, BtnClickEventID, WrapBtnCallback(aEvent, 1));
  Result:= aName;
end;

****
Test1CheckBox:= CheckBox(@Test1Click, 21, 161, 13, 13);
 
Последнее редактирование:

Le9ent

Новичок
Еще немного отвлеку Вас.
При создании чекбокса я добавляю к нему так сказать предпросмотр.
Навел мышь отобразилась картинка (подказка), убрал - исчезла.

Код:
[Code]

var
  Test1CheckBox: HWND;
  preview_1: Longint;

procedure Test1_MouseMove(hBtn: HWND);
begin
  ImgSetVisibility(preview_1, True);
  ImgApplyChanges(WizardForm.Handle);
end;

procedure Test1_MouseLeave(hBtn: HWND);
begin
  ImgSetVisibility(preview_1, False);
  ImgApplyChanges(WizardForm.Handle);
end;

procedure Create();
begin
  preview_1:= ImgLoad(WizardForm.Handle, 'preview_img.png', ScaleX(125), ScaleY(15), ScaleX(75), ScaleY(110), True, True);

  BtnSetEvent(Test1CheckBox, BtnMouseMoveEventID, WrapBtnCallback(@Test1_MouseMove, 1));
  BtnSetEvent(Test1CheckBox, BtnMouseLeaveEventID, WrapBtnCallback(@Test1_MouseLeave, 1));
end;
Соответственно сколько чекбоксов столько и процедур (Test1_MouseMove, Test1_MouseMove).
Так вот раз создание самого чекбокса теперь упрощено до одной строки можно ли теперь объединить новую функцию из примера выше с данным функционалом. Т.е. берем за основу:
Код:
procedure Preview_MouseMove(hBtn: HWND);
begin
  ImgSetVisibility(preview_1, True);
  ImgApplyChanges(WizardForm.Handle);
end;

procedure Preview_MouseLeave(hBtn: HWND);
begin
  ImgSetVisibility(preview_1, False);
  ImgApplyChanges(WizardForm.Handle);
end;

function CheckBox(aEvent: TBtnEventProc; aLeft, aTop, aWidth, aHeight: Integer): HWND;
var
  aName: HWND;
begin
  aName:= BtnCreate(WizardForm.Handle, aLeft, aTop, aWidth, aHeight, 'BoxImage.png', 0, True);
  BtnSetCursor(aName, GetSysCursorHandle(32649));
  BtnSetVisibility(aName, False);
  BtnSetEvent(aName, BtnClickEventID, WrapBtnCallback(aEvent, 1));
  BtnSetEvent(aName, BtnMouseMoveEventID, WrapBtnCallback(@Preview_MouseMove, 1));
  BtnSetEvent(aName, BtnMouseLeaveEventID, WrapBtnCallback(@Preview_MouseLeave, 1));
  Result:= aName;
end;

****
Test1CheckBox:= CheckBox(@Test1Click, 21, 161, 13, 13);
Как правильно прописать чтобы до процедур (Preview_MouseLeave, Preview_MouseMove) из функции передавался параметр, который будет использоваться взамен текущего preview_1
 
Последнее редактирование:

Shegorat

Lord of Madness
Администратор
P.S.: Заменил только Result:= aName;
Прошу прощения, издержки C++ разработчика. Инно рядом не было, писал на коленке

Как правильно прописать чтобы до процедур (Preview_MouseLeave, Preview_MouseMove) из функции передавался параметр, который будет использоваться взамен текущего preview_1
Можно сделать общие функции onMouseLeave, onMouseEnter. Примерно так:
Код:
procedure Preview_MouseMove(hBtn: HWND);
begin
  case hBtn of 
    checkBox1: begin
      ImgSetVisibility(preview_1, True);
    end;
    checkBox2: begin 
      ImgSetVisibility(preview_2, True);
    end;
  end;

  ImgApplyChanges(WizardForm.Handle);
end;
 

LexBell

Борода
Супер модератор
Le9ent, там передается хендл кнопки, можно его использовать, что можно найти в примерах, собственно:
Код:
procedure Test1_MouseMove(hBtn: HWND);
var
img : LongInt;
begin
  case hBtn of
    Test1CheckBox: img :=preview_1;
    Test2CheckBox: img :=preview_2;
    Test3CheckBox: img :=preview_3;
  end;
  ImgSetVisibility(img, True);
  ImgApplyChanges(WizardForm.Handle);
end;
 
Сверху