![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование нестандартных форм. Скины для программы
v_a_belousov © (2010-10-11 19:08:00)Здравствуйте! Заранее извиняюсь, если данный вопрос уже поднимался! В интернете видел много вопросов на форумах типа "Как сделать скины как в winamp" и т.д. Хочу написать программу которая также будет использовать скины. В данный момент есть программа, которая использует стандартные компоненты delphi... то есть менять вид формы за счет использования сторонних компонентов не вариант... создание "формы по картинке" оказалось не актуально так как в местах где картинка все красиво, а там где компоненты delphi все довольно серо(на фоне картинки)... решил сделать скины в своем приложении следующим образом:
Написать свой редактор скинов, который создает скин файл(в нем находится картинка, по которой форма обрезается и которая накладывается на форму, указаны координаты объектов создаваемых динамически(TBevel) которые прозрачны и выполняют функции объектов которые есть на форме изначально(но при применении скина все объекты становятся невидимыми кроме TBevel)).
Планирую, что редактор скинов и сама программа будут использовать мою библиотеку dll в которой есть функции сохранения, загрузки и применения скинов.
Описал все как смог. Вопрос в том корректно ли делать скины таким образом? И если поймете каким образом я планирую использовать TBevel корректно ли использовать их таким образом? Или возможно посоветуете какой-то другой способ создания скинов для программы?
Юрий Зотов (2010-10-18 22:39:00) [1]
> v_a_belousov (18.10.10 20:11) [23]
Совсем не в этом дело.
v_a_belousov (2010-10-18 20:53:00) [2]P.S.
> в Windows ведь нет понятия TForm это "примочка" delphi..
> .
Это так... не по теме...
v_a_belousov (2010-10-18 20:11:00) [3]
>
> А я всё-таки открою аФФтару секрет, в делфи все формы создаются
> динамически.
знаю) в Windows ведь нет понятия TForm это "примочка" delphi...
Плохиш (2010-10-18 16:27:00) [4]
> Форма создается динамически
А я всё-таки открою аФФтару секрет, в делфи все формы создаются динамически.
Юрий Зотов (2010-10-18 03:12:00) [5]> v_a_belousov (17.10.10 22:40) [11]
> Форма создается динамически
Да хоть сто порций. Это ничего не меняет.
Германн (2010-10-18 02:09:00) [6]
> v_a_belousov (18.10.10 02:02) [19]
Хороший ответ.
Действуй. ДМ всегда помогает желающим учиться.
v_a_belousov (2010-10-18 02:02:00) [7]
> Уверен ли ты, что твои трудозатраты окупятся?
Во всяком случае получу опыт. Пока я многих вещей не знаю и учусь чему то... а дальше видно будет.
Германн (2010-10-18 01:55:00) [8]
> В данный момент есть программа, которая использует стандартные
> компоненты delphi... то есть менять вид формы за счет использования
> сторонних компонентов не вариант
Долго старался сдерживать себя от высказываний по этому поводу.
Но теперь наверно уже пора.
Цитата из http://www.delphimaster.ru/cgi-bin/forum.pl?id=1286912340&n=18
Во вторых библиотеку которую я сейчас делаю можно будет применять к любому проекту что тоже плюс.
Это уже было давно сделано, когда Микрософт и не помышлял о темах. Называлось это WindowBlinds. Это и сейчас живет и развивается http://www.stardock.com/products/windowblinds/
Уверен ли ты, что твои трудозатраты окупятся?
v_a_belousov (2010-10-18 01:21:00) [9]
> у тебя есть кнопки F7, F8, останова, окно просмотра переменных.
> .. нажимаешь кнопку и каждом шаге смотришь чего нет...
> внезапно окажется что это не тот объект на который ты думаешь
> и выложил.
так всегда и делаю. сначала все проверяю, а если уж ничего на ум не приходит, то прошу помощи...
> массива в нормальном варианте не должно быть, каждый объект
> должен содержать собственные данные сам.
Спасибо.
> Впрочем, это дело Ваше.
Я так понимаю что правильнее все таки без массива...
sniknik (2010-10-18 00:59:00) [10]> Хорошо, но как его может не быть...
тебе видней, у тебя программа целиком, а не несвязанные кусочки в которых все по отдельности нормально, у тебя есть кнопки F7, F8, останова, окно просмотра переменных... нажимаешь кнопку и каждом шаге смотришь чего нет...
внезапно окажется что это не тот объект на который ты думаешь и выложил.
и да, массива в нормальном варианте не должно быть, каждый объект должен содержать собственные данные сам.
> Впрочем, это дело Ваше.
v_a_belousov (2010-10-18 00:58:00) [11]А впрочем извиняюсь. Конструктор ведь был в protected у меня. Вот и вся причина.
v_a_belousov (2010-10-18 00:54:00) [12]Проблему решил вот так
type // Описание типа регионов скина
TPRSBSRegions = class
public
TPRSBSRegions: array of TPRSBSRegion; // массив регионов
end;
Но хотел бы узнать почему не получается с
type // Описание типа регионов скина
TPRSBSRegions = array of TPRSBSRegion; // массив регионов
v_a_belousov (2010-10-18 00:23:00) [13]
> объекта нет.
Хорошо, но как его может не быть... или лучше спросить как сделать так чтобы он был?
sniknik (2010-10-17 23:54:00) [14]> Нет, исправляюсь.
нет не исправляешься
>> Это проще делается, в самой форме:
> Форма создается динамически, поэтому и ставлю на WindowProc
что мешает создавать динамически форму своего типа, с уже описанным событием? раз уж приспичило динамически... (вообще то по идее это как раз таки и не нужно).
> EAccessViolation В чем причина не понимаю.
объекта нет.
> может надо как-то по другому задавать размер массива?
какая разница садиться в автобус в переднюю дверь или заднюю, или в окно, или даже прыгать на него с парашютом, если автобуса НЕТ?
v_a_belousov (2010-10-17 22:40:00) [15]
> Только сдается мне, что Вы упорно продолжаете идти все тем
> же кривым путем проб и ошибок. Впрочем, это дело Ваше.
Нет, исправляюсь.
> Это проще делается, в самой форме:
Форма создается динамически, поэтому и ставлю на WindowProc
------------------------------------------------------------------
И вот такой вопрос есть. Пишу класс TPRSBSkin. Пытаюсь создать в нем функцию добавляющую новый регион:
//добавляет новый регион
procedure TPRSBSkin.AddRegion(Region: TPRSBSRegion);
//переменные
var num: integer;
begin
//
num := Length(FSkinRegions);
//
SetLength(FSkinRegions, num+1);
//
FSkinRegions[num] := TPRSBSRegion.Create;
//
FSkinRegions[num].Name := Region.Name;
FSkinRegions[num].Region := Region.Region;
FSkinRegions[num].RegionType := Region.RegionType;
FSkinRegions[num].Control := Region.Control;
FSkinRegions[num].PutPoints(Region.Points);
end;
Но на SetLength(FSkinRegions, num+1); в run-time выдает ошибку EAccessViolation В чем причина не понимаю.
type // Описание типа регионов скина
TPRSBSRegions = array of TPRSBSRegion; // массив регионов
type // Класс TPRSBSkin
TPRSBSkin = class
protected
{ Protected declaration }
constructor Create;
private
{ Private declaration }
FSkinName: ShortString; // имя скина
FSkinRegions: TPRSBSRegions; // массив регионов
..........................................................................
Подскажите пожалуйста может надо как-то по другому задавать размер массива?
Юрий Зотов (2010-10-17 15:19:00) [16]Это проще делается, в самой форме:
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
inherited;
if Msg.Result = HTCLIENT then
Msg.Result := HTCAPTION
end;
Только сдается мне, что Вы упорно продолжаете идти все тем же кривым путем проб и ошибок. Впрочем, это дело Ваше.
v_a_belousov (2010-10-17 13:43:00) [17]Теперь все переносится нормально.
v_a_belousov (2010-10-17 13:42:00) [18]Извиняюсь. Вместо WM_LBUTTONDOWN в коде написал WM_NCLBUTTONDOWN
v_a_belousov (2010-10-17 13:40:00) [19]Написал процедуру перетаскивания формы без заголовка. Назначается динамически создаваемой форме следующий WindowProc
//перенос формы без заголовка
function MDragDrop(Handle: HWND; Msg, WParam, LParam: LongInt): LongInt; stdcall;
begin
//Проверим, был ли щелчок мыши над областью формы
if Msg=WM_NCHITTEST then
begin
//перенаправляем щелчок на заголовок
Result := CallWindowProc(OldMDragDrop, Handle, WM_NCLBUTTONDOWN, HTCAPTION, LParam); end
else begin
//не перенаправляем
Result := CallWindowProc(OldMDragDrop, Handle, Msg, WParam, LParam);
end;
end;
Форма переносится, но при щелчке мыши она немного прыгает в сторону. По идее проверка должна быть не на WM_NCHITTEST а на WM_LBUTTONDOWN но тогда событие никогда не наступает.
v_a_belousov (2010-10-13 14:30:00) [20]Удалено модератором