Предложения по усовершенствованию, добавление фич, TODO

Автоматическое создание no-Steam игр из GCF, поддержка модов на Source и GoldSource, распаковка *.SID файлов.
Сообщение
Автор
South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#31 Сообщение 28.05.2009, 13:16

$t@t!c_V()1D писал(а):А реализация-то долгая будет %). Загвоздка в том, что ограничение преодолевается лишь частично - nsDialogs конечно создает всё, что душе угодно, но так называемый "Parented control" не создает. То есть, если я создаю контрол, то я не могу привязать его ко вкладке, а только к главной форме.
Отсюда следует, что

1. Можно нахимичить со стилем контрола и всунуть ему Вкладку в качестве родителя. Но, как показывает практика, у меня это плохо...ужасно плохо получается (или у WinAPI это плохо получается - уж не знаю кто здесь более виноват. Может это вообще не очень-то и осуществимо). Но если это как-нибудь осуществимо (South, подскажи мне %) ), то я буду склоняться за этот принцип.
хм, а с чего ты взял, что сможешь привязать контрол к вкладке? давай-ка попробуем разобраться что есть табконтрол с точки зрения винды. по сути это окошко с картинкой на нем (закладки это всего лишь картинка). это одно окно, которому посылая сообщение ты можешь получить в ответ какая из закладок в данный момент нарисована активной (ну и куча других специфических сообщений для данного класса). поэтому свои контролы не надо привязывать к табконтролу.

далее, с точки зрения делфи, чтобы больше вопросов не было. там есть 2 компонента tabcontrol и pagecontrol.
tabcontrol - обертка винапишного. только все сообщения реализованы в виде методов и свойств. более там никаких новшеств вроде бы нет.
pagecontrol - тоже обертка systabcontrol32. сами страницы реализованы в виде отдельных окон, которые скрываются/показываются (или уничтожаются/создаются точно не знаю) в зависимости от выбранной закладки. и родитель у них соответственно не tabcontrol, а tabcontrol.parent. именно на эти окна ты и помещаешь свои компоненты. соответственно они показываются/скрываются с окнами (страницами) pagecontrol'а. вобщем никаких премудростей

собственно в своем примере я тебе предложил упрощенную реализацию pagecontrola. в качестве страниц были использованы TPanel с помещенными на них компонентами. и скрывались/показывались именно эти панельки (а вместе с ними и эдиты, чекбоксы, батоны). NSIS я конечно не знаю, но думаю, что аналог TPanel там должен быть и тебе никто не мешает поместить на такие панели свои компоненты и соответственно показывать нужную. если в NSIS работа построена на диалогах, то в качестве страниц pagecontrol'а можно использовать отдельные диалоговые окна и также как с панельками показывать/скрывать их.

ЗЫ реализацию tabcontrol и pagecontrol в делфи на самом деле не смотрел, но думаю, что не далек от истины :)

ЗЗЫ лектор из меня хреновый, но надеюсь ты понял, что я тут понаписал

Добавлено спустя 36 минут 22 секунды:
ну и скрин для наглядности
Изображение
обрати внимание, что SysTabControl32 - отдельное окно, а закладки - отдельные диалоги
все пропало

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#32 Сообщение 28.05.2009, 14:15

То, что закладки - это отдельные диалоги, я знал. Я вот про эту загвоздку и говорю. Невозможно создать несколько диалогов с помощью системы, которая навязывается NSIS-ом. Я могу лишь переделать кнопки снизу главной формы (там, наверх переместить, под вкладки заскинировать). Можно сделать также, что Дельфиновая VCL-ная форма (-ы) будет отображаться на главной форме через присвоение ей родителя "в лице" главного окна (создаваться форма (-ы) будет (-ут) через Main.dll).

South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#33 Сообщение 29.05.2009, 10:32

$t@t!c_V()1D писал(а):Невозможно создать несколько диалогов с помощью системы, которая навязывается NSIS-ом.
тады ой. странная система, которую позиционируют одной из лучших, или ты чего-то не знаешь.
$t@t!c_V()1D писал(а):Можно сделать также, что Дельфиновая VCL-ная форма (-ы) будет отображаться на главной форме через присвоение ей родителя "в лице" главного окна (создаваться форма (-ы) будет (-ут) через Main.dll)
можно конечно, но грамотно (лучше сказать - красиво) ты это сделать скорее всего не сможешь. на таскбаре будет появляться отдельная кнопка. чтобы ее скрыть в длл нужно будет передать TApplication. или рисовать форму на апи, тоже думаю не очень радостное занятие.

поставлю вопрос по другому. можно ли средствами NSIS (не используя винапи) создать кастомную форму и показать ее? и про аналог TPanel ты ничего не тсказал

ЗЫ можешь привести кусок кода, в котором ты создаешь какую-нибудь кнопку, эдит, чекбокс (что-нибудь) на главной форме? задание ей родителя, left, top, width, height, caption (в принципе больше не надо). хочу посмотреть как это в NSIS выглядит. или ты это все в библиотеках делаешь?
все пропало

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#34 Сообщение 29.05.2009, 11:51

South писал(а):тады ой. странная система, которую позиционируют одной из лучших, или ты чего-то не знаешь.
Ну, я имел ввиду одновременно. Я создаю, по сути, обычный инсталлятор со своими (custom) страницами. Так вот: одна страница - один диалог. Не более. Со вкладками же как:
  1. Создается SysTabControl32
  2. Добавляются вкладки.
  3. По мере тыкания на вкладки, создаются и разрушаются (или показываются и скрываются уже созданные) разные диалоги, созданные на этих вкладках.
Ведь так?
South писал(а):и про аналог TPanel ты ничего не сказал
А что это вообще такое, я понять никак не могу :%) . Это то же таб, только без вкладок? Если да, то я просто не привык видеть его в таком состоянии :pardon: .
South писал(а):можно конечно, но грамотно (лучше сказать - красиво) ты это сделать скорее всего не сможешь.
Так само собой %) . Я только с nsDialogs понял, что значит писать интерфейс на Си, где рулит CreateWindow[Ex] %) .
South писал(а):можешь привести кусок кода, в котором ты создаешь какую-нибудь кнопку, эдит, чекбокс (что-нибудь) на главной форме? задание ей родителя, left, top, width, height, caption (в принципе больше не надо). хочу посмотреть как это в NSIS выглядит. или ты это все в библиотеках делаешь?
Ну, само собой в библиотеках. nsDialogs - это и есть библиотека (для справки, NSIS-плагины вызываются способом DLL::Function [/NOUNLOAD] Param1 Param2). Плагин, который и создает кастомные страницы по контролам. Это, напимер, макросом

Код: Выделить всё

  nsDialogs::Create /NOUNLOAD 1018
	Pop $Conf_IO ;Main Dialog HWND
... (типа, еще кучка контролов создается)
${NSD_CreateButton} 143u 125u 48u 14u "$(MapSPButton1)" # macro creates button with the <int>u coordinates and Language String caption MapSPButton1
Pop $Map.SPBtn # Control HWND
${NSD_OnClick} $Map.SPBtn PageLeave #hang the notification function onto the control thru its HWND
...
;=== Show what we got ====
 nsDialogs::Show ;And here it waits 'til the user wants to change the page
Комменты на английском, чтобы легче переносилось между скриптами (NIS Edit не очень жалует 1251-ую %) )
А это собственно вызов DLL без макроса

Код: Выделить всё

...
nsDialogs::CreateControl /NOUNLOAD ${__NSD_Combobox_CLASS} \
       "${__NSD_Combobox_STYLE}|${CBS_SORT}" \
       ${__NSD_Combobox_EXSTYLE} 3u 126u 139u 120u "$save"
Pop $Map.Save.Combo                      
${NSD_OnChange} $Map.Save.Combo PageLeave
...
Если можешь подсказать, как можно "впихнуть" VCL-ную форму на диалоговое окно главной страницы, да чтоб управлялась нормально эта форма из-под Main.DLL, то...ну...благодарность, не могу и не способен на что-то большее в рамках данноого форума :pardon: .

South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#35 Сообщение 29.05.2009, 18:46

$t@t!c_V()1D писал(а):Ну, я имел ввиду одновременно. Я создаю, по сути, обычный инсталлятор со своими (custom) страницами. Так вот: одна страница - один диалог.
все равно странная система
$t@t!c_V()1D писал(а): 3. По мере тыкания на вкладки, создаются и разрушаются (или показываются и скрываются уже созданные) разные диалоги, созданные на этих вкладках.

Ведь так?
нет не так. эти разные диалоги создаются НЕ на вкладках. они сами по себе. родитель у них такой же как у самого табконтрол

код глянул
я правильно понимаю, что тебе для создания контрола и нормальной работы с ним достаточно знать хэндл родительского окна?
если да, то реально ли тебе перевести следующий код в NSIS?

Код: Выделить всё

var
  tcStyle:Cardinal;
  hTabCtrl1:HWND;
begin
  tcStyle:=TCS_HOTTRACK or TCS_FOCUSONBUTTONDOWN or TCS_TABS{ or TCS_TOOLTIPS};
  hTabCtrl1:=tcCreate(Form1.Handle,8,8,Form1.ClientWidth-16,120,0,tcStyle);
  if hTabCtrl1>0 then begin
    tcPageAdd(hTabCtrl1,'Page1',0);
    tcPageAdd(hTabCtrl1,'Страница 2',1);
    CreateWindow('BUTTON', 'button1', WS_CHILD or WS_VISIBLE, 8, 8, 70, 21, tcGetPageHandle(hTabCtrl1,0), 0, hInstance, nil);
    CreateWindow('EDIT', 'edit1', WS_CHILD or WS_VISIBLE or WS_BORDER, 8, 28, 70, 21, tcGetPageHandle(hTabCtrl1,1), 0, hInstance, nil);
  end;
end;
Добавлено спустя 12 минут 29 секунд:
описание функций
function tcCreate(hParent:HWND; Left, Top, Width, Height:integer; tcExStyle, tcStyle:Cardinal):HWND; stdcall;
//создает SysTabControl
//hParent - хэндл родительского окна
//Left, Top, Width, Height - и так понятно
//tcExStyle - расширенный стиль окна. константы WS_EX_...
//tcStyle - стиль окна. константы WS_... и TCS_...

procedure tcPageAdd(hTabCtrl:HWND; Title:PAnsiChar; Index:integer); stdcall;
//добавляет закладку и окно, которое будет соответствовать этой закладке
//hTabCtrl - хэндл табконтрола, которому нужно добавить закладку
//Title - заголовок/надпись на закладке
//Index - индекс закладки (не должно быть одинаковых, кажется)

function tcGetPageHandle(hTabCtrl:HWND;PageIndex:integer):HWND; stdcall;
//получает хэндл окна (страницы) для указанной закладки
//hTabCtrl - хэндл табконтрола, для которого указывается индекс закладки
//PageIndex - индекс закладки, для которой нужно получить хэндл соответствующего ей окна

procedure tcDestroy; stdcall;
//очистить память, выполнять при закрытии программы
скрытие/показ окон с контролами автоматом

Добавлено спустя 2 минуты 41 секунду:
dll забыл
PageControl.7z
(9.88 КБ) 194 скачивания
PageControl.7z
(9.88 КБ) 194 скачивания
ЗЫ длл написана кое-как, но если ты сможешь ее подключить к своему проекту и попользоваться хотя бы тем что есть, то могу дописать что нужно или исходники тебе отдам, сам допишешь
все пропало

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#36 Сообщение 30.05.2009, 12:46

Что-то не очень выходит :pardon: . Скинь лучше исходники...я пока что-нибудь ещё с этим сделаю %) .

South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#37 Сообщение 30.05.2009, 13:34

$t@t!c_V()1D писал(а):Что-то не очень выходит :pardon: . Скинь лучше исходники...я пока что-нибудь ещё с этим сделаю %) .
честно говоря куда проще я не знаю, подключить длл, вызвать функцию и запомнить хэндл. никаких извращений не требуется. если NSIS этого не может, то хз что в нем хорошего и за что его люди хвалят

держи, разбирайся
SysTabControl32.7z
(156.94 КБ) 192 скачивания
SysTabControl32.7z
(156.94 КБ) 192 скачивания
кода, который действительно имеет значение строк 20-30 всего
все пропало

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#38 Сообщение 30.05.2009, 14:21

South писал(а):честно говоря куда проще я не знаю, подключить длл, вызвать функцию и запомнить хэндл. никаких извращений не требуется. если NSIS этого не может, то хз что в нем хорошего и за что его люди хвалят
Да, не в том дело. Хвалить-то может и правильно делают. Ведь зачем-то же я его выбрал и, более того, несмотря на некоторые недостатки, мне он более привлекателен, чем Inno.

Просто, при создании страницы, плагин (в данном случае nsDialogs) создает свою форму, отличную от главной. То есть это отдельный контрол. И так получется, что есть $HWNDPARENT - хендл главного окна, которое можно просмотреть люьым подобием Resource Hacker-a, и, в моём случае, $Conf_IO - хендл создаваемой плагином nsDialogs формы.

Так вот, при ипользовании в качестве родителя $HWNDPARENT - все норм (ну, как норм: свои-то контролы я не удалил, а создал поверх них, но это не в счет), а если выбрать $Conf_IO, то Птица падает. Может я что-то не так делаю, сейчас разбиратсья буду.

Чуть позже отпишусь о результатах.

Добавлено спустя 22 минуты 49 секунд:
Так, а может тогда попробовать создать Таб nsDialogs-ом, а потом перехватить управление на свою DLL? Правда, с другими контролами опять же беда...хотя, можно самому создать список контролов (ну, или по мере создания, вбивать их в тот или иной массив), принадлежащих первой, второй, 3-ей и т.д. страницам.

А потом, по мере смены вкладок скрывать те или иные контролы, что сложены в массивы.

South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#39 Сообщение 30.05.2009, 15:14

$t@t!c_V()1D писал(а):при ипользовании в качестве родителя $HWNDPARENT - все норм (ну, как норм: свои-то контролы я не удалил, а создал поверх них, но это не в счет), а если выбрать $Conf_IO, то Птица падает.
если окно с хэнлом $Conf_IO может иметь дочерние окна (те же кнопки), то все должно работать
$t@t!c_V()1D писал(а):Так, а может тогда попробовать создать Таб nsDialogs-ом, а потом перехватить управление на свою DLL?
смысл какой в этом? тебе чтобы отловить переключение закладок надо сабклассить родительское окно (потому что именно родитель получает сообщение о смене закладок). думаю средствами нсиса ты это не сделаешь, поэтому и предлагал сразу отдельную длл, ну или в существующие код переписать. да и не понятно - неужели так сложно вызвать tcCreate? или твоя птичка тут падает? если падает, то надо разбираться, возможно такому окну не нравится переопределение оконной процедуры, попробуй закомментировать

Код: Выделить всё

SetWindowLong(hParent,GWL_USERDATA,SetWindowLong(hParent,GWL_WNDPROC,LongInt(@TabCtrlProc)));
, хоть увидишь создался у тебя табконтрол или нет
$t@t!c_V()1D писал(а):Правда, с другими контролами опять же беда...хотя, можно самому создать список контролов (ну, или по мере создания, вбивать их в тот или иной массив), принадлежащих первой, второй, 3-ей и т.д. страницам.
ну и на фига городить? смотри длл-ку внимательнее (tcPageAdd). при добавлении закладки создается окно, которое будет соответствовать этой закладке, вот на этом окне и размещай свои контролы, а механизм скрытия/показа нужного (вместе с твоими контролами естественно) уже реализован
все пропало

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#40 Сообщение 30.05.2009, 16:13

South писал(а):смысл какой в этом? тебе чтобы отловить переключение закладок надо сабклассить родительское окно (потому что именно родитель получает сообщение о смене закладок). думаю средствами нсиса ты это не сделаешь
Уже сделано! :lol: Помнишь, ты мне как-то кидал исходник для отрисовки иконок в ListBox'e - так вот, чтоб это нормально функционировало на NSIS-платформе, я сделал перехват сообщении родительского окна и формы nsDialogs примерно этим способом (да, да!):

Код: Выделить всё

SetWindowLong(hParent,GWL_USERDATA,SetWindowLong(hParent,GWL_WNDPROC,LongInt(@TabCtrlProc)));
South писал(а):если окно с хэнлом $Conf_IO может иметь дочерние окна (те же кнопки), то все должно работать
Должно, но не работает :Search: ! Видать, nsDialogs что-то ещё делает с этими контролами...я не в силах узнать Что это.

Собственно, поэтому я и предлагаю создать Таб через nsDialogs, а потом работать с ним (между прочим, с Listbox-ом я так и работаю ;) ) через Main.DLL

Кстати, функция SetParent для контролов думаешь сработает?

Добавлено спустя 23 минуты 37 секунд:
Нет, слушай, жопа полная :( . Только что попробовал SetParent - фигня. Всё дело лишь в том, что в качестве родительского контрола нельзя задать Таб или какой-либо другой контрол. ВСЁ !

Я предлагаю: оставить кнопки снизу (пусть они служат этакими "вкладками") и заняться лучше ListView-контролом :pardon: .

South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#41 Сообщение 31.05.2009, 00:54

я все больше и больше убеждаюсь, что либо ты не знаешь NSIS, либо это очень не совершенная система
могу сказать только одно - в инно я с легкостью воткну табконтрол на любую закладку.
думаю, что это займет всего несколько строчек кода
все пропало

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#42 Сообщение 31.05.2009, 07:58

Ну, я же сказал. Специфичен мой выбор. Но я заставлю эту систему работать через "не хочу" :) . Даже из принципа!

Добавлено спустя 1 час 4 минуты 39 секунд:
Нет, я-таки это сделал! Пришлось:
  • Создать отдельный контрол, который служит родителем для Таба.
  • Создать Таб с помощью nsDialogs.
  • А перехват сообщении таба автоматически лег на плечи прежнего перехватчика :P .
  • Создал массивы с контролами для каждой из страниц. И, по мере сокрытия и показа табов, контролы, принадлежащие тем или иным страницам, будут соответственно скрываться или раскрываться.
Только так (и это БигМак %)).

Добавлено спустя 20 минут 56 секунд:
Да, ещё забыл сказать.
Несмотря на то, что я-таки сделал с грехом пополам вкладки, осуществлять эту идею полностью будет ещё дольше, т.к. разные страницы используют разные плагины для создания собственных страниц.
  • Главная держится на nsDialogs
  • Опции Source- и Goldsource-модификаций - InstallOptionsEx
  • Опции программы - InstallOptionsEx
  • SiD Unpacker - InstallOptions
Если взяться за перевод всех страниц на nsDialogs, то на это уйдет ещё время.

Короче говоря, банальная лень и нежелание наживать ещё пару тысяч жуков prankster . Лучше осуществить задумку с ListView и не париться.

M1ke
Модератор
Модератор
Сообщения: 1464
Зарегистрирован: 17.06.2007
Откуда: 54
Благодарил (а): 2 раза
Поблагодарили: 90 раз
Контактная информация:

#43 Сообщение 01.07.2009, 15:26

текущее состояние интерфейса%)
1.jpg
1.jpg (43.69 КБ) 1597 просмотров
1.jpg
1.jpg (43.69 КБ) 1597 просмотров
Изображение
Изображение
Изображение

Аватара пользователя
Vit_amiN
Супермодератор
Супермодератор
Сообщения: 2509
Зарегистрирован: 01.02.2007
Откуда: Over Old Hills
Благодарил (а): 15 раз
Поблагодарили: 91 раз

#44 Сообщение 01.07.2009, 16:06

Советую в интерфейсе обращаться на "Вы"
Последний раз редактировалось M1ke 01.07.2009, 17:23, всего редактировалось 1 раз.
Причина: примем во внимание%)
Изображение

Мои русификаторы и другие полезные файлы здесь
ЗАПОМНИТЕ, ПОИСК — БЛИЖАЙШИЙ ПУТЬ К ИСТИНЕ!

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#45 Сообщение 01.07.2009, 17:35

А что не нравится-то в том? Это ж, мол, чтоб ближе к пользователю было. А про уважение и всякую такую бла-бла-блу забудь - это тебе не оф. форум какой-нибудь (ну, я так полагаю, надеясь, что Имп думает примерно так же), а CSmania.RU...баалин :D .

Ответить Вложения 4