Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование нестандартных форм. Скины для программы


Страницы:   1 2

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]

Удалено модератором


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо