Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Бизнес и карьера в интернете" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
нет.
Информационный Канал Subscribe.Ru |
Познавательное программирование
(comp.soft.prog.urisprog)Выпуск 20
Здравствуйте, Уважаемые подписчики!4>
Если отладка - процесс удаления ошибок, то программирование должно быть процессом их внесения.
- Э.Дейкстра
На заметку
Хочу рассказать об одной интересной вещи, которая присутствует во всех компиляторах C++ и Pascal.
Заключается она в следующем: индекс массива можно менять с его именем местами.
Пример, C++:
int arr[20];
arr[5]=100;
5[arr]=5[arr]+100; //Идентично предыдущей строке
printf("%d = %d",arr[5],5[arr]);
Пример, Pascal:
var
arr: array[0..19] of integer;
...
arr[5]:=100;
5[arr]:=5[arr]+100; {Идентично предыдущей строке}
writeln(arr[5],' = ',5[arr]);
Вопрос - ответ
Открыт раздел "Вопрос - ответ".
Ваши вопросы по программированию вы можете прислать по адресу urisff@inbox.ru и остальные подписчики помогут вам найти решение.
Статья
- Э.Дейкстра
На заметку
Вопрос - ответ
Статья
FAQ по созданию автозапуска.
Вступление 001.
На форуме http://www.key.ru/phorum были заданы вопросы о том, как создать при помощи Delphi свой авторан. Это меня и вдохновило на написание сего ФАКа. Я постарался ответить на вопросы, заданные в топике, а также на некоторые другие.
Вступление 010.
Не для кого не секрет, что почти любой компакт диск, купленный в любимом ларьке|переходе|латке (нужное подчеркнуть) при загрузке его в привод открывает красиво оформленное окошко, с предложением установки записанных на нем программ. Сейчас, когда почти каждый продвинутый юзер имеет в комплекте своего железного друга резак, актуальной стала проблема создания своих неотразимых авторанов для болванок. Те, кому лень думать, сразу лезут искать в инете редакторы авторанов. А что делает в этом случае программист? Правильно! - пишет свой авторан. Вот лик.без.ом по этому несложному делу мы и займемся.
- Как сделать так, чтобы моя программа стартовала при загрузке диска в привод?
- Как из моего автозапуска запустить программу установки?
- Как сделать красивые текстовые кнопки?
- Как разместить URL и E-mail на форме?
- Как сделать красивое оформление для автозапуска?
- Как сделать графические кнопки, меняющиеся при наведении мыши?
- Как убрать заголовок у формы и сделать ее размеры фиксированными?
- Если у формы нет заголовка, как ее можно перетащить мышкой?
- Если на диске много программ, как можно запускать их из списка?
- Как сделать музыкальное сопровождение?
В корневом каталоге диска необходимо поместить файл "AUTORUN.INF" с приблизительно таким содержанием:
[AUTORUN] ICON=ICON.ICO OPEN=AUTORUN.EXEЗдесь ICON.ICO - это файл с иконкой. Если хотите использовать иконку вашего приложения, то необходимо указать файл приложения. AUTORUN.EXE - это и есть приложение автозапуска, которое и будет стартовать при помещении диска в CD-привод.
Для запуска программ используется Win32API-функция ShellExecute. Для ее использования к программе нужно подключить модуль ShellAPI.
ShellExecute (hwnd: HWND, lpOperation: LPCTSTR, lpFile: LPCTSTR, lpParameters: LPCTSTR, lpDirectory: LPCTSTR, nShowCmd: INT): HINSTANCEНапример, чтобы запустить notepad.exe, нужно выполнить следующий код
ShellExecute(Handle, nil, PChar('notepad.exe'), nil, nil, SW_ShowNormal);Если переменная lpFile будет содержать путь к каталогу, то будет открыт проводник с этим каталогом. В качестве путей можно использовать как абсолютные, так и относительные.
Красивые текстовые кнопки можно сделать с помощью компонента TLabel. Хорошего эффекта можно достичь, если выставить у него шрифт Comic Sans MS. Размер шрифта тоже можно сделать покрупнее а цвет сделать поярче - синий, красный.
По событию OnClick вызываем функцию ShellExecute() с нужными параметрами
procedure TForm1.Label1Click(Sender: TObject); begin ShellExecute( Handle, nil, '..\progi\setup.exe', nil, nil, SW_SHOWNORMAL); end;По событию OnMouseMove поменяем цвет на новый
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Label 1.Font.Color:=clLime; end;А по событию OnLeave поменяем цвет обратно
procedure TForm1. Label 1MouseLeave(Sender: TObject); begin Label 1.Font.Color:=clYellow; end;
Отчасти воспользуемся ответом на предыдущий вопрос. Нужно разместить на форме TLabel. Далее по событиям OnClick, OnMouseMove и OnLeave надо написать следующие обработчики.
procedure TForm1.Label1Click(Sender: TObject); begin ShellExecute( Handle, nil, 'http://yoursite.ru',nil, nil, SW_SHOWNORMAL); // Для размещения мыла вместо урла сайта пишем mailto:yourmail@server.ru end;При наведении курсора на Label поменяем цвет на синий, а стиль шрифта сделаем подчеркнутым.
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Label1.Font.Color:=clBlue; Label.Font.Style:=[fsUnderline]; end;Когда курсор окажется за пределами Label, то восстановим цвет и стиль шрифта.
procedure TForm1.Label1MouseLeave(Sender: TObject); begin Label1.Font.Color:=clBlack; Label.Font.Style:=[]; end;
В Delphi есть замечательный компонент TImage. Сейчас я покажу, как использовать его в наших целях.
Допустим, у вас есть картинка, которую вы хотели бы использовать для украшения программы. Нужно поместить на чистую форму компонент TImage, в инспекторе объектов меняем его свойство Align на alClient. Компонент растянулся по всей форме. Теперь нужно загрузить картинку. Для этого кликните два раза в инспекторе объектов по свойству picture. Откроется окно, в котором нажмите кнопку Load: для загрузки картинки в компонент и нажмите OK.
Отлично! Картинка появилась. Но либо картинку видно не полностью, либо видны пустые места формы. Это не хорошо. Для устранения неисправности поставьте свойство Stretch в true. Замечательно выходит! Если вас не устраивает то, что вы видите, поиграйте со свойствами center и proportional. Только одно предупреждение. Не трогайте свойство Transperent. Могут возникнуть значительные тормоза с графикой.
Может есть способ проще. Например, написать свой компонент. Но я придумал такой. Кода многовато, но работает.
Для начала напишем процедуру
procedure TForm1.Button(Image:TImage; Side: byte; var but:boolean); var DR,SR:TRect; begin DR:=Rect(0,0,120,30); SR:=Rect(0,side*30,120,(side+1)*30); Image.Canvas.CopyRect(DR,Image3.Canvas,SR); if side=0 then but:=false else but:=true; end;Теперь нам понадобится два компонента типа TImage. Один будет источником для рисунков кнопок (у меня Image3), другой будет самой кнопкой (Image2). Компоненту Image2 установим размеры, какими должна обладать кнопка. У меня это 120x30. В Image3 я загружаю рисунки кнопок. Его свойство visible должно быть равно false. Еще в разделе private объявите глобальную переменную but2 типа boolean, которая будет отображать состояние кнопки (курсор наведен / не наведен).
В Image3 загрузим картинку. В нее можно нарисовать и большее количество рисунков любого содержания. Что вы увидите в своей кнопке зависит от значения параметра Side, которое вы укажите в процедуре Button().
Теперь немного о том, как работает эта процедура. Параметр Image указывает, в какую картинку будет производиться рисование кнопки. В моем примере это Image2. Параметр Side указывает, какой рисунок будет рисоваться. Для рисунка с красной надписью используем Side=0, для желтой надписи Side=1.
Строка Image.Canvas.CopyRect(DR,Image3.Canvas,SR); копирует в Image первый или второй рисунок из Image3. Если Side равно нулю, то but=false (курсор на кнопку не наведен), иначе but=true (наведен). Переменные SR и DR определяют области, из которой и в которую происходит копирование.
При создании формы компонент Image2 пустой (без картинки), поэтому его надо заполнить, вызвав Button.
procedure TForm1.FormCreate(Sender: TObject); begin Button(Image2,0,But2); end;Чтобы при наведении курсора на кнопку, она изменяла свой внешний вид, нужно в обработчик OnMouseMove у Image2 вписать
procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if not But2 then Button(Image2,1,But2); end;Если курсор на кнопку наведен, но кнопка еще не поменяла свой внешний вид (But2=false), то сделать это. И наконец на Image1, который у нас был фоновой картинкой, в OnMouseMove пишем
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if but2 then Button(Image2,0,But2); end;Проверки осуществляются, чтобы лишний раз не перерисовывать картинку в кнопке. Иначе это может вызвать нежелательные мерцания и даже тормоза.
Ну и конечно, чтобы TImage совсем походил на кнопку, нужно написать для него обработчик события OnClick.
Я описал только один из возможных принципов на примере одной кнопки. Как сделать несколько таких кнопок, подумайте сами (это полезно;).
Это совершенно элементарно.
Для того, чтобы размеры формы нельзя было изменить, установим ее свойство BorderStyle в bsDialog, bsNone или bsSingle. При значении bsSingle еще желательно свойство BorderIcons установить в [].
Если вы уже проверили все режимы BorderStyle, то заметили, что когда оно равно bsNone, то заголовок вообще исчезает. Тогда, если использовать ответ на вопрос 5, можно получить довольно красивый результат.
Например, можно перетаскивать за Image1 из вопроса 5. В разделе private понадобиться добавить три переменные
private OldX, OldY: integer; Moving: Boolean;Тогда для Image1 потребуется обработать три события..
OnMouseDown:
if button=mbLeft then begin // Если нажата левая кнопка, то moving:=true; //Состояние перетаскивания OldX:=X; // Запомнить X OldY:=Y; // Запомнить Y end;OnMouseMove:
if moving then begin // Если в состоянии перетаскивания, то Left:=Left+X-OldX; // Переместить по X Top:=Top+Y-OldY; // Переместить по Y end;OnMouseUp:
if button=mbLeft then moving:=false; // если отжата левая кнопка, то // не перетаскиваемЭти же функции можно написать и для любого другого компонента, за который хочется перетаскивать.
Суть примера такова. У нас есть ListBox1 типа TListBox. В него забиваем пути к программам. По двойному клику на нужной программе она запускается. Делается это достаточно просто.
В обработчик OnDblClick для ListBox1 пишем такой код..
procedure TForm1.ListBox1DblClick(Sender: TObject); var Name:String; begin Name:=ListBox1.Items.Strings[ListBox1.ItemIndex ]; ShellExecute( Handle, 'open', PChar(Name), nil, nil, SW_SHOWNORMAL); end;Если хотите, чтобы в листбоксе отображались названия программ, а не пути к ним, можно кинуть на форму ListBox2, в который надо набить названия, соответственно путям в ListBox1. Потом свойство ListBox1.Visible ставим в false. Обработчик ListBox1DblClick уже не нужен. Теперь можно написать обработчик OnDblClick для ListBox2 в виде..
procedure TForm1.ListBox2DblClick(Sender: TObject); var Name:String; begin Name:=ListBox1.Items.Strings[ListBox2.ItemIndex ]; ShellExecute( Handle, 'open', PChar(Name), nil, nil, SW_SHOWNORMAL); end;
Проигрывать музыку удобнее всего компонентом TMediaPlayer.
Кинем на форму экземпляр TMediaPlayer1. Его свойство visible сразу установим в false. Заодно поставим на форму и CheckBox1. У него свойство caption переименуем в "Играть музыку". Допустим, надо проиграть файл 1.mp3, находящийся в папке music на диске.
Тогда в обработчик OnCreate для формы напишем такой код
try MediaPlayer1.FileName:='.\music\1.mp3'; MediaPlayer1.Open; MediaPlayer1.Play; CheckBox1.Checked:=true; except CheckBox1.Enabled:=false; CheckBox1.Visible:=false; CheckBox1.Checked:=false; end;Тут мы открываем и включаем проигрывание файла. В том случае, если файла не существует или в системе не установлены кодеки, мы скроем CheckBox1 и ничего проигрывать не будем.
Если все же файл открылся успешно и начал воспроизводиться, то пользователю надо дать возможность его отключить при необходимости. Для этого напишем обработчик OnClick для CheckBox1.
procedure TForm1.CheckBox1Click(Sender: TObject); begin if CheckBox1.Checked then MediaPlayer1.Play else MediaPlayer1.Stop; end;
(C) Автор статьи Ермин Николай
mrw.h10.ru
Все вопросы, пожелания и предложения ссылкообмена ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Все статьи публикуются здесь только с разрешения (или рекомендации) автора.
Если вы хотите опубликовать здесь свою статью, то сделайте это, переслав её мне.
В случае, если вы будете использовать приведённые в этой рассылке материалы, не забудьте сделать ссылку на эту рассылку.
Ведущий рассылки:
Набатников Иван
urisff@inbox.ru
http://WWW.URiS.TK
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||