Real audio is not skinnable? Woz3qK (woz3qk@mail.ru) Спецвыпуск: Хакер, номер #050, стр. 050-074-4 Label1.Height:=intValue; strValue:=skinINI.ReadString('Track', 'Text', ''); Label1.Caption:=strValue; {устанавоиваем шрифт текста} strValue:=skinINI.ReadString('Track', 'FontName', 'System'); Label1.Font.Name:=strValue; {установим цвет} Label1.Font.Color:=RGB( skinINI.ReadInteger('Track', 'FontColorR', 0), skinINI.ReadInteger('Track', 'FontColorG', 0), skinINI.ReadInteger('Track', 'FontColorB', 0) ) end; А теперь обо всем по порядку. Переменные intValue и strValue используются как временные - в них мы будем помещать считанные с INI-файла значения. В первой переменной будут находиться числовые значения, а во второй - строковые. Conf - это INI-файл, который содержит имя директории, содержащей текущий скин (который в данный момент используется, а при смене скина это значение меняется). В переменной Path мы и прочитаем это имя каталога. Далее читаем из каталога со скином файл skin.ini. Числовые значения параметров (SizeX, PosY и т.д) помещаем в intStr, а затем в соответствии с этими значениями изменяем размеры и позиции элементов (например - Image2.Width, Label1.Top). Для чтения строк нам понадобится strValue. Строковые значения у нас имеют имя файла, текст и имя шрифта. Переменные sPlayMDown. sPlayMUp имеют тип TPicture. sPlayMDown содержит картинку, которая отображается при нажатии на этот элемент формы. А вторая (sPlayMUp) - картинку, отображаемую при отпускании кнопки мыши. При чтении sPalyMUp мы сразу же устанавливаем эту картинку в качестве картинки элемента, чтобы ее сразу было видно. Label1.Font.Name принимает значение с именем шрифта, который мы собираемся использовать. Обрати внимание, что при отсутствии в системе этого шрифта возникнет ошибка (Label1.Font.Color содержит в себе цвет текста). У нас цвет хранится в виде трех составляющих, и нужно перевести этот цвет в RGB. Для этого - одноименная функция RGB, которая принимает три значения байт и преобразовывает их. Все. Теперь приступим к обработчикам. Ниже приведены обработчики событий нажатия и отпускания кнопок мыши для второго image, a остальные, разумеется, можно увидеть в исходнике на диске. procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {при нажатии на картинку, она меняется} Image2.Picture:=sPlayMDown; end; procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {возвращаем все на родину} Image2.Picture:=sPlayMUp; end; Кстати, неплохо было бы написать обработчик ошибок, чтобы проверять отсутствие файла, неверные параметры и проч. Начинающие программисты забывают про это, а потом в самый неподходящий момент всплывают соответствующие глюки. Со временем приходит автоматизм и кодеры при открытии, чтении из файла, при переводе строк в числа и наоборот бессознательно ставят try, catch, finally (SEH правит миром! - прим. AvaLANche'а). Это я перекладываю на широкие плечи читателя. Нужные элементы можно добавлять по аналогии. Как видно из листинга и INI-файла, у имаджей (кроме фона) есть две картинки. Одна - в нормальном состоянии, а вторая - при нажатии. Потому я и использую OnMouseDown. Когда срабатывает событие на нажатие кнопки мыши, картинка меняется, а когда срабатывает OnMouseUp - восстанавливается прежняя. Я советую применить еще и картинку при наведении на image. Сделать это можно при событии OnMouseMove. Выглядит действительно приятно. |