RusFAQ.ru: Программирование на Delphi
Информационный Канал Subscribe.Ru |
/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi
Выпуск № 166
от 29.06.2005, 00:00
Администратор: | Калашников О.А. |
В номере: | Вопросов: 8, Ответов: 24 |
Вопрос № 22541: Здраствуйте эксперты. У меня такой вопрос: 1)Как мне в мою прогу вставить анимированного персонажа как в ворде,икселе? 2)Как мне поместить прогу в трей что бы понажатию на иконку всплывало меню? 3)Как в дельфи проигрывать сжатые ф...
Вопрос № 22543: Здравствуйте, уважаемые эксперты. Как можно вывести данные в Excel, Word. Хотелось бы примеры, с объединением ячеек, изменениями границ, форматов, шрифта. Можно ссылочку или исходники?...
Вопрос № 22544: Здравствуйте всем! Я хочу сделать игру "Танки"... как мне сделать так чтоб с клавиатуры незовисимо управлялись два объекта (например Button1,Button2) И как вычислить что моя кнопка уперлась в другой объект нахо...
Вопрос № 22545: Добрый деньЙ Большое спасибо всем оказавшим помощь (вопрос 22239 о TDBF). Может быть кто-нибудь посоветует в таком вопросе... Приходится работать с DBF без BDE - и только так. Известные мне наборы компонетов, которые это поддерживают - Apollo...
Вопрос № 22555: Здравствуйте уважаемые эксперты. Помогите решить задачу. Необходимо разработать калькулятор который выполняет 4 арифметических действия и выполняет специальную функцию Вычислить интеграл Y=интеграл от a до b dx/x по формуле трапеций Y=((...
Вопрос № 22563: Уважаемые эксперты! Помогите пожалуйста! Нужно разработать приложение которое выполняет при нажатии на BUTTON на форме спец функцию и выво дит результат в EDIT. Надо вычислмть многочлен Чебышева по формуле Т[n+1]=2*x*T[n]-T[n-1], причем T[0]=1 a T[1]...
Вопрос № 22568: Уточняю вопрос по поводу регулятора громкости. Требуется крутить не изображение внутри Image, а сам компонент Image вокруг определенной точки на форме посредством Image.left и Image.top. С геометрией у меня туговато. Спасибо всем, кто проникс...
Вопрос № 22569: Здраствуйте уважаемые експерты. У меня такой вопрос, как мне зделать так чтобы время надо былобы вводить в поле Edit (смотрите приложение), и желательно часы и минуты в разные поля Edit (Edit1 и Edit2),приведите пожалуйста примеры.Заранее спасибо....
Вопрос № 22.541 |
Здраствуйте эксперты. У меня такой вопрос: 1)Как мне в мою прогу вставить анимированного персонажа как в ворде,икселе? 2)Как мне поместить прогу в трей что бы понажатию на иконку всплывало меню? 3)Как в дельфи проигрывать сжатые фильмы? |
Отправлен: 23.06.2005, 00:12 Вопрос задал: newinfo2005 (статус: 2-ой класс) Всего ответов отправлено: 7 |
Отвечает: Delphin Здравствуйте, newinfo2005! 1. Какой еще анимированый персонаж?? Чтоли помощник по работе? Чудо это? Если да то это чудо завется Microsoft Agent и постовляется с системами выше XP как встроенный ActiveX компонент. Импортируй ActiveX и юзай. Для того чтоб он еще и говорил нужен Microsoft Speech Api который идет тоже как ActiveX но загружается отдельно с сайта M$. Если нужна конкретная реализация то свяжитесь сомной и мы вместе что-нить сделаем. ICQ: 77778851. Mail: delphinster@gmail.com тока это сообщение напомните. 2. На сегодняшний день существует просто огромнное колличество таких компонентов. Лучше всего RxLibray ( Целый компонент пак ) и JVCL ( Тоже компонент пак, там вы найдеет и это и много другого. Так-же можно через WinAPI > CreateNotifyIcon ( Вроде так ). Если нужен пример опять же свяжитесь сомной. 3. Я не понял что имеется ввиду под сжатый фильм. Наверно сжатый кодеком? Например DivX? Для его проигрывания нужен сам кодек и MediaPlayer вроде экрана выступает TPanel. Нужен пример? Свяжись сомной. Удачи. !!! --------- Ищу сервис пак для школы ^))) |
Ответ отправил: Delphin (статус: 6-ой класс) Отправлен: 23.06.2005, 00:51 Оценка за ответ: 5 Комментарий оценки: Я с тобой обязательно свяжусь!!! |
Отвечает: sir henry Здравствуйте, newinfo2005! 1. Это не просто персонаж, а специально сделаное окно. Если Вы установите себе офис 97, то там прямо видно, что этот персонаж сидит именно в окошке. Вот ссылка по этому вопросу: http://www.goldfaq.ru/modules/mydownloads/singlefile.php?cid=5&lid=9 2. См пример в приложении. 3. Непосредственно в Дельфи - сложно, нужно знать алгоритмы сжатия-расжатия. Проще всего, если у Вас установлен уже соответствующий кодек, воспроизводить файл с помощью какого-либо пригрывателя. Сам файл открывать с помощью функции ShellExecute(). Приложение: |
Ответ отправил: sir henry (статус: Профессор) Отправлен: 23.06.2005, 06:11 |
Отвечает: Gin Здравствуйте, newinfo2005! 2) unit USysTray; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus; { Константа WM_USER используется в приложении для определения собственных сообщений. Значения от 0 до (WM_USER-1) зарезервированы для системных сообщений. } const MyTrayIcon = WM_USER + 123; type TForm1 = class(TForm) BCreate: TButton; BDelete: TButton; PopupMenu1: TPopupMenu; MRestore: TMenuItem; MClose: TMenuItem; MDelete: TMenuItem; BHide: TButton; procedure BDeleteClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure MCloseClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure BCreateClick(Sender: TObject); procedure MRestoreClick(Sender: TObject); procedure BHideClick(Sender: TObject); procedure MDeleteClick(Sender: TObject); private { Private declarations } procedure MTIcon(var a: TMessage); message MyTrayIcon; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses ShellAPI; var NID: TNotifyIconData; procedure TForm1.FormCreate(Sender: TObject); begin Application.ShowMainForm := false; with NID do begin cbSize := SizeOf(TNotifyIconData); Wnd := Handle; uId := 1; uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; uCallbackMessage := MyTrayIcon; hIcon := Application.Icon('E:ПрограммированиеКартинкиЗначек.ico'); // Application.Icon.Handle; szTip := 'Мое приложение'; end; Shell_NotifyIcon(NIM_ADD, @NID); end; procedure TForm1.FormDestroy(Sender: TObject); begin Shell_NotifyIcon(NIM_DELETE, @NID); end; procedure TForm1.MTIcon(var a: TMessage); var P, D, C, V: TPoint; begin case a.lParam of // обработка обратных сообщений WM_LBUTTONDBLCLK: //по нажатию левой клавиши, WM_RBUTTONUP по правой begin Show; SetForegroundWindow(Handle); end; WM_RBUTTONDOWN: begin GetCursorPos(P); GetCursorPos(D); GetCursorPos(C); GetCursorPos(V); PopupMenu1.Popup(P.X, P.Y); PopupMenu1.Popup(D.X, D.Y); PopupMenu1.Popup(C.X, C.Y); PopupMenu1.Popup(V.X, V.Y); end; end; end; procedure TForm1.MRestoreClick(Sender: TObject); begin Show; end; procedure TForm1.MCloseClick(Sender: TObject); begin Close; end; procedure TForm1.MDeleteClick(Sender: TObject); begin Shell_NotifyIcon(NIM_DELETE, @NID); BCreate.Enabled := true; BDelete.Enabled := false; BHide.Enabled := false; Show; end; procedure TForm1.BCreateClick(Sender: TObject); begin Shell_NotifyIcon(NIM_ADD, @NID); BCreate.Enabled := false; BDelete.Enabled := true; BHide.Enabled := true; end; procedure TForm1.BDeleteClick(Sender: TObject); begin Shell_NotifyIcon(NIM_DELETE, @NID); BCreate.Enabled := true; BDelete.Enabled := false; BHide.Enabled := false; end; procedure TForm1.BHideClick(Sender: TObject); begin Visible := false; // Application.ShowMainForm := false; end; end. С Уважением, Gin. |
Ответ отправил: Gin (статус: 9-ый класс) Отправлен: 23.06.2005, 07:26 |
Отвечает: Ерёмин Андрей Здравствуйте, newinfo2005! 1. Этот вопрос уже множество раз обсуждался здесь, да и на каждом программерском форуме. Сделать это можно с помощью ActiveX. Запускаем Delphi, выбираем Component - Import ActiveX Control. В окошке выбираем Microsoft Agent Control и нажимаем Install. На вкладке ActiveX палитры компонент появится соответствующий компонент. Вот с помощью него и создаются помощники (агенты), как в Office и Windows XP. Подробнейшее руководство по работе с этим компонентом находится вот здесь: http://www.delphi.int.ru/download.php?id=70. 2. Сначала нужно установить какой-нибудь компонент, позволяющий добавлять иконки в трей. Например, Cool Tray Icon (http://www.delphi.int.ru/download.php?id=20). Затем установить этот компонент и использовать в своей программе. Меню следует "прикрепить" через свойство PopupMenu. 3. А разве через стандартный TMediaPlayer нельзя? По-моему, если в системе установлены необходимые кодеки, то фильмы будут проигрываться и таким образом. --------- Жизнь - игра, в которой нет setup'а... |
Ответ отправил: Ерёмин Андрей (статус: 10-ый класс) Отправлен: 23.06.2005, 09:01 |
Отвечает: Jadd Здравствуйте, newinfo2005! 1) Тут придется немного поработать. Делаешь форму. Кидаешь на нее TAnimate. Рисуешь анимашки (в формате avi) твоего персонажа на разные события. А дальше нужно проигрывать эти события. Т.е.,к примеру, на сохранение файла проигрываешь тот сюжет, который для этого подходит. 2) Тут есть два выхода: или изобретать "велосипед" роясь в winAPI и писать через NotifyIcon, либо взять уже готовое. Все зависит от твоего желания и времени. Если времени мало, я бы порекомендовал RxLib. Там есть компонента, которая и меню покажет, и сделает значек анимированным. 3) Имеется ввиду mpeg4, divX? Видишь ли, дружок. Это - тема для поллитры. Просто так их не проиграешь. Но выход, как всегда, есть. Опять же, либо изучай формат, в котором хранятся файлы ( а это будет долгим делом), либо топай на www.torry.net и ищи там компоненту, которая уже делает что-то подобное (сразу оговорюсь, что скорее всего она будет платной). А иначе никак. Довольно обидно иногда, что люди воспринимают Дельфи не как мощную систему разработки приложений, а как волшебный котелок, в который нужно шепнуть заветное слово и оттуда все появится. Все компоненты и весь код - труд не одного программера. --------- Если в сердце дверь закрыта, нужно в печень постучаться |
Ответ отправил: Jadd (статус: Студент) Отправлен: 23.06.2005, 09:13 |
Отвечает: VBA Здравствуйте, newinfo2005! Чтобы поместить прогу в трей необходимо использовать API функция Shell_NotifyIcon и структуру данных TNotifyIconData. TNotifyIconData=Record cbSize: DWORD; //размер этой структуры Wnd: HWND; //хендл окна, который будет получать все сообщения uID: UINT; //программно-зависимый идентификатор иконки в трее uFlags: UINT; //флаги (NIF_ICON, NIF_MESSAGE, NIF_TIP) uCallbackMessage: UINT; //идентификатор сообщений hIcon: HICON; //иконка szTip: array [0..63] of AnsiChar; //хинт End; Function Shell_NotifyIcon(dmMessage:Cardinal; lpData:PNotifyIconData):Boolean; dmMessage - идентификатор посылаемого сообщения (NIM_ADD-для добавления иконки в трей, NIM_DELETE-для удаления иконки из трея, NIM_MODIFY-для изменения иконки). lpData - указатель на описанную выше структуру. В общем для добавления иконки в трей заполняем структуру (указываем хинт, иконку и т.д.), а потом вызываем функцию: Var Data:TNotifyIconData; Begin With Data Do Begin //заполнение структуры End; Shell_NotifyIcon(NIM_ADD,@Data); End; --------- Неправ вечно юзер, ибо прав всегда Админ! |
Ответ отправил: VBA (статус: 5-ый класс) Отправлен: 23.06.2005, 09:59 |
Отвечает: And1 Здравствуйте, newinfo2005! 1) Анимированный персонаж аля "ворд" можно сделать с помощью MS Agent. MS Agent - специальный компонент от мелкомягких, с помощью которго можно сделать помощника (шаблоны помощников уже там есть - скрепка, котик, шавка и др. :), но нужно выкачивать отдельно). Пробегитесь по этим ссылкам: www.microsoft.com/MS Agent activex.microsoft.com/activex/controls/agent2/MS Agent.exe - здесь можно скачать это "счастье" А вообще, наберите в гугле "MS Agent" - будет что почитать, скачать и т.п. 2) Можно всё написать на WinAPI - здесь различные FAQ'и вам в помощь, там полно этого добра. А есть более простой способ - нужен специальный компонент, например CoolTrayIcon или RxTrayIcon из пакета RxLib (я пользуюсь последним, надёжнее...). Работать с ними проще некуда кидаете компонент на форму, кидаете PopupMenu, цепляете в свойствах компонента (трея) PopupMenu и готово. А дальше для каждого компонента различные свойства и методы нужно "мурыжить" :) 3) Можно исхитриться и заставить винду саму прогирать фильм :) Например так в uses добавили ShellApi и на какое-нибудь событие вешаем следующий код: ShellExecute (0,nil,'имя_фильма.расширение', nil,'директория_в_которой_находится_фильм',SW_SHOWNORMAL); А если "по-правильному" самому проигрывать фильм, то будет много гиморра: -поиск в винде установленных кодеков -использование этих кодеков -и ещё много чего... или искать специальный компонеент для проигрывания видео, но и он может быть глючным :) Удачи! |
Ответ отправил: And1 (статус: 3-ий класс) Отправлен: 23.06.2005, 11:10 |
Вопрос № 22.543 |
Здравствуйте, уважаемые эксперты. Как можно вывести данные в Excel, Word. Хотелось бы примеры, с объединением ячеек, изменениями границ, форматов, шрифта. Можно ссылочку или исходники? |
Отправлен: 23.06.2005, 08:41 Вопрос задал: Serg80 (статус: Посетитель) Всего ответов отправлено: 4 |
Отвечает: Ерёмин Андрей Здравствуйте, Serg80! Вот подробнейшие статьи на эту тему: http://www.delphi.int.ru/download.php?id=50 http://www.delphi.int.ru/download.php?id=51 --------- Жизнь - игра, в которой нет setup'а... |
Ответ отправил: Ерёмин Андрей (статус: 10-ый класс) Отправлен: 23.06.2005, 09:06 |
Отвечает: sir henry Здравствуйте, Serg80! В Дельфи есть целая закладка с компонентами для работы с Офмсом. Используйте их, тогда Вы получите подсказку по функциям, как у родных компонентов Дельфи. Ссылки: http://delphiworld.narod.ru/base/on_waves_of_integrations.html http://delphiworld.narod.ru/base/on_waves_of_integrations2.html http://delphiworld.narod.ru/base/on_waves_of_integrations3.html Яндекс или Гугл Вам найдет тучу ссылок. Получить подробную справку по функционалу VBA (а работа с Офисом - это оно и есть) Вы можете окрыв Ворд или Эксель (раздел VBA). Это по поводу изменения границ и форматов. Однако мое мнение - лучше пользоваться уже готовым шаблоном и просто запихивать туда данные, это съэкономит кучу времени на формирование. |
Ответ отправил: sir henry (статус: Профессор) Отправлен: 23.06.2005, 09:18 |
Отвечает: VBA Здравствуйте, Serg80! Для работы с Word Excel и т.д. можно использовать компоненты WordDocument, WordFont, WordParagraphFormat и др. на вкладке Servers (COM). Как их использовать? См. хелп (несколькими строками тут не обойдешься). --------- Неправ вечно юзер, ибо прав всегда Админ! |
Ответ отправил: VBA (статус: 5-ый класс) Отправлен: 23.06.2005, 10:10 |
Отвечает: Gin Здравствуйте, Serg80! Легче ссылчку - delphiworld.narod.ru Там много чего найдешь. С Уважением, Gin. |
Ответ отправил: Gin (статус: 9-ый класс) Отправлен: 23.06.2005, 10:13 |
Вопрос № 22.544 |
Здравствуйте всем! Я хочу сделать игру "Танки"... как мне сделать так чтоб с клавиатуры незовисимо управлялись два объекта (например Button1,Button2) И как вычислить что моя кнопка уперлась в другой объект нахождение положения посредством свойств Left,Top мне кажется не подходит... Всем огромное спасибо!!! |
Отправлен: 23.06.2005, 09:18 Вопрос задал: Dadaev Zaur (статус: Посетитель) Всего ответов отправлено: 2 |
Отвечает: Jadd Здравствуйте, Dadaev Zaur! А почему не подходит? Ведь перпятствие - графический объект со своими координатами, как и твой танк. А тут придется не только Left и Top сравнивать, но и, в случае заднего хода и хода направо налево, сравнивать все остальные координаты. А "упертость" в объект обрабатывается простым "нереагированием" на нажатие клавиш. А если ты программишь для управления двумя объектами с одной клавы, то просто пишешь обработчик событий с клавы для этих клавиш, как и для всех остальных, но управление передаешь не в 1-й танк, а во второй. Были в свое время книги про AI и написание игр. Поищи на netz.ru. Там точно есть книги по программированию игр (большинство на английском). Я думаю, это поможет тебе. --------- Если в сердце дверь закрыта, нужно в печень постучаться |
Ответ отправил: Jadd (статус: Студент) Отправлен: 23.06.2005, 09:30 Оценка за ответ: 4 Комментарий оценки: Спасибо за адрес, где я могу найти книгу по написанию игры... |
Отвечает: Ерёмин Андрей Здравствуйте, Dadaev Zaur! А как Вы, собственно, делаете игру? Судя по тексту вопроса, это TImage, TButton и т.п.? Если да, то ни в коем случае не занимайтесь этим. Игры так не делаются. Кроме того, даже если что-то и получится, то при перемещении компонентов будут постоянно мерцания от перерисовки. В случае "Танков" лучше всего воспользоваться графическим 2D-движком. Самый распространнёный - DelphiX. Найти его не так сложно (поиск по слову "UnDelphiX"). В этом движке следует создавать для каждого танка отдельный спрайт, у которого опять-таки будут позиции на плоскости (аналоги Left и Top). Ну а проверить, "упёрся" ли спрайт в стену, например, можно так (Wall - стена, Tank - танк): If (Tank.Left + Tank.Width) >= Wall.Left Then {упёрся} Else {не упёрся}. Изучение движка займёт некоторое количество времени, однако впоследствии Вы не пожалеете, что сделали это. Писать на DelphiX очень легко. --------- Жизнь - игра, в которой нет setup'а... |
Ответ отправил: Ерёмин Андрей (статус: 10-ый класс) Отправлен: 23.06.2005, 10:01 Оценка за ответ: 5 Комментарий оценки: Спасибо за ответ, я обязательно посмотрю этот графический движок, я и раньше слышал про нее, но никак не решался... |
Вопрос № 22.545 |
Добрый деньЙ Большое спасибо всем оказавшим помощь (вопрос 22239 о TDBF). Может быть кто-нибудь посоветует в таком вопросе... Приходится работать с DBF без BDE - и только так. Известные мне наборы компонетов, которые это поддерживают - Apollo, Halcyon, TDbf, не поддерживают SQL (т.е. фактически являются аналогом Table). Нет ли у кого информации о таких наборах компонент, которые бы работали с DBF без BDE и поддерживали бы SQL (хотя бы аналогично Query)? |
Отправлен: 23.06.2005, 10:48 Вопрос задал: Зенков Валентин Валентинович (статус: Посетитель) Всего ответов отправлено: 3 |
Отвечает: Denisss Здравствуйте, Зенков Валентин Валентинович! Попробуйте KADao v.9.0 http://www.torry.net/db/direct/db_msother/kadao90.zip в описании сказано, что можно с его помощью, через Microsoft DAO подключиться к базе dbf, а также у него есть свойства Query и Table |
Ответ отправил: Denisss (статус: 7-ой класс) Отправлен: 23.06.2005, 11:09 |
Отвечает: Jadd Здравствуйте, Зенков Валентин Валентинович! ADOQuery. Только придется работать через OleDB. Я лично так и делаю. --------- Если в сердце дверь закрыта, нужно в печень постучаться |
Ответ отправил: Jadd (статус: Студент) Отправлен: 23.06.2005, 11:29 |
Отвечает: sir henry Здравствуйте, Зенков Валентин Валентинович! Apollo поддерживает SQL. В доказательство вот ссылка: http://www.hotsoft.ru/VISTA/apollo_sql.htm |
Ответ отправил: sir henry (статус: Профессор) Отправлен: 23.06.2005, 11:47 |
Вопрос № 22.555 |
Здравствуйте уважаемые эксперты. Помогите решить задачу. Необходимо разработать калькулятор который выполняет 4 арифметических действия и выполняет специальную функцию Вычислить интеграл Y=интеграл от a до b dx/x по формуле трапеций Y=((b-a)/2n)*(Y0+2Y1+…+2Yn-1+Yn) где n-количество отрезков разбиения; а Yo,Y1,…Yn- значение функции на концах отрезков. Вычислить с точностью Е=10-3,10-4,10-5.на выбор т.е на калькуляторе должно быть окно в котором мы выбираем точность 1)Ниже приведено решение самого калькулятора правда с ошибкой(FloatToStr® не хочет понимать) что нужно сделать чтобы заработало? 2) Как сделать что бы калькулятор вычислял специальную функцию? Напишите пожалуйста в самой форме, исправьте что нужно”у меня на форме 16 кнопок из них 10цифр(button1-10), 4 арифметич операций(button11 12 13 14),степень(button15),=(button16),и 2 панели ) Приложение: |
Отправлен: 23.06.2005, 13:52 Вопрос задал: Н.В.П (статус: Посетитель) Всего ответов отправлено: 1 |
Отвечает: sir henry Здравствуйте, Н.В.П! 1) А почему Вы решили, что конструкция "FloatToStr®" будет работать? Это вообще фигня какая-то. Вы что, справку по этой функции не читали? На всякий случай привожу синтаксис: string:=FloatToStr(Value), где Value - это число с плавающей точкой. Хочу предупредить, что в числе должна стоять ЗАПЯТАЯ, на точку она выкинет ошибку. Для того, чтобы преобразовать в строку число с точкой, необходимо использовать процедуру Val(S; var V; var Code: Integer). Сразу обращаю внимание, что это именно процедура, т.е. никаких значений она не возвращает. 2) Ничего друго предложить невозможно, как завести для специальной функции специальную кнопочку. :) Неужели проблема состоит в том, что Вы не можете кнопку на форму добавить? Не верю. :) |
Ответ отправил: sir henry (статус: Профессор) Отправлен: 24.06.2005, 12:20 |
Вопрос № 22.563 |
Уважаемые эксперты! Помогите пожалуйста! Нужно разработать приложение которое выполняет при нажатии на BUTTON на форме спец функцию и выво дит результат в EDIT. Надо вычислмть многочлен Чебышева по формуле Т[n+1]=2*x*T[n]-T[n-1], причем T[0]=1 a T[1]=x, т.е. надо найти T[n+1] для заданного n и x. |
Отправлен: 23.06.2005, 20:53 Вопрос задал: KENT (статус: Посетитель) Всего ответов отправлено: 1 |
Отвечает: sir henry Здравствуйте, KENT! Ну дык разрабатывайте. Кто ж Вам мешает? Если проблемя возникнет ВО ВРЕМЯ разработки, тогда и пишите про эту конкретную проблему. А то что Вы написали сейчас, называется не "помогите", а "сделайте за меня". Пожалуйста, описывайте конкретную проблему, которая у Вас возникла при программировании, а то не ясно, как Вам помогать. Скажите, Вы можете вычислить многочлен Чебышева по приведеной Вами формуле на бумаге, т.е. без применения какого-либо языка программирования? |
Ответ отправил: sir henry (статус: Профессор) Отправлен: 24.06.2005, 12:27 |
Вопрос № 22.568 |
Уточняю вопрос по поводу регулятора громкости. Требуется крутить не изображение внутри Image, а сам компонент Image вокруг определенной точки на форме посредством Image.left и Image.top. С геометрией у меня туговато. Спасибо всем, кто проникся проблемой. Да и еще, можно давать ссылки на компаненты :) |
Отправлен: 23.06.2005, 22:48 Вопрос задал: Yarick (статус: Посетитель) Всего ответов отправлено: 3 |
Отвечает: Gin Здравствуйте, Yarick! 1) procedure RotateRight(BitMap: tImage); var FirstC, LastC, c, r: integer; procedure FixPixels(c, r: integer); var SavePix, SavePix2: tColor; i, NewC, NewR: integer; begin SavePix := Bitmap.Canvas.Pixels[c, r]; for i := 1 to 4 do begin newc := BitMap.Height - r + 1; newr := c; SavePix2 := BitMap.Canvas.Pixels[newc, newr]; Bitmap.Canvas.Pixels[newc, newr] := SavePix; SavePix := SavePix2; c := Newc; r := NewR; end; end; begin if BitMap.Width <> BitMap.Height then exit; BitMap.Visible := false; with Bitmap.Canvas do begin firstc := 0; lastc := BitMap.Width; for r := 0 to BitMap.Height div 2 do begin for c := firstc to lastc do begin FixPixels(c, r); end; inc(FirstC); Dec(LastC); end; end; BitMap.Visible := true; end; 2) procedure RotateBitmap(Bitmap: TBitmap; Angle: Double; BackColor: TColor); type TRGB = record B, G, R: Byte; end; pRGB = ^TRGB; pByteArray = ^TByteArray; TByteArray = array[0..32767] of Byte; TRectList = array[1..4] of TPoint; var x, y, W, H, v1, v2: Integer; Dest, Src: pRGB; VertArray: array of pByteArray; Bmp: TBitmap; procedure SinCos(AngleRad: Double; var ASin, ACos: Double); begin ASin := Sin(AngleRad); ACos := Cos(AngleRad); end; function RotateRect(const Rect: TRect; const Center: TPoint; Angle: Double): TRectList; var DX, DY: Integer; SinAng, CosAng: Double; function RotPoint(PX, PY: Integer): TPoint; begin DX := PX - Center.x; DY := PY - Center.y; Result.x := Center.x + Round(DX * CosAng - DY * SinAng); Result.y := Center.y + Round(DX * SinAng + DY * CosAng); end; begin SinCos(Angle * (Pi / 180), SinAng, CosAng); Result[1] := RotPoint(Rect.Left, Rect.Top); Result[2] := RotPoint(Rect.Right, Rect.Top); Result[3] := RotPoint(Rect.Right, Rect.Bottom); Result[4] := RotPoint(Rect.Left, Rect.Bottom); end; function Min(A, B: Integer): Integer; begin if A < B then Result := A else Result := B; end; function Max(A, B: Integer): Integer; begin if A > B then Result := A else Result := B; end; function GetRLLimit(const RL: TRectList): TRect; begin Result.Left := Min(Min(RL[1].x, RL[2].x), Min(RL[3].x, RL[4].x)); Result.Top := Min(Min(RL[1].y, RL[2].y), Min(RL[3].y, RL[4].y)); Result.Right := Max(Max(RL[1].x, RL[2].x), Max(RL[3].x, RL[4].x)); Result.Bottom := Max(Max(RL[1].y, RL[2].y), Max(RL[3].y, RL[4].y)); end; procedure Rotate; var x, y, xr, yr, yp: Integer; ACos, ASin: Double; Lim: TRect; begin W := Bmp.Width; H := Bmp.Height; SinCos(-Angle * Pi / 180, ASin, ACos); Lim := GetRLLimit(RotateRect(Rect(0, 0, Bmp.Width, Bmp.Height), Point(0, 0), Angle)); Bitmap.Width := Lim.Right - Lim.Left; Bitmap.Height := Lim.Bottom - Lim.Top; Bitmap.Canvas.Brush.Color := BackColor; Bitmap.Canvas.FillRect(Rect(0, 0, Bitmap.Width, Bitmap.Height)); for y := 0 to Bitmap.Height - 1 do begin Dest := Bitmap.ScanLine[y]; yp := y + Lim.Top; for x := 0 to Bitmap.Width - 1 do begin xr := Round(((x + Lim.Left) * ACos) - (yp * ASin)); yr := Round(((x + Lim.Left) * ASin) + (yp * ACos)); if (xr > -1) and (xr < W) and (yr > -1) and (yr < H) then begin Src := Bmp.ScanLine[yr]; Inc(Src, xr); Dest^ := Src^; end; Inc(Dest); end; end; end; begin Bitmap.PixelFormat := pf24Bit; Bmp := TBitmap.Create; try Bmp.Assign(Bitmap); W := Bitmap.Width - 1; H := Bitmap.Height - 1; if Frac(Angle) <> 0.0 then Rotate else case Trunc(Angle) of -360, 0, 360, 720: Exit; 90, 270: begin Bitmap.Width := H + 1; Bitmap.Height := W + 1; SetLength(VertArray, H + 1); v1 := 0; v2 := 0; if Angle = 90.0 then v1 := H else v2 := W; for y := 0 to H do VertArray[y] := Bmp.ScanLine[Abs(v1 - y)]; for x := 0 to W do begin Dest := Bitmap.ScanLine[x]; for y := 0 to H do begin v1 := Abs(v2 - x) * 3; with Dest^ do begin B := VertArray[y, v1]; G := VertArray[y, v1 + 1]; R := VertArray[y, v1 + 2]; end; Inc(Dest); end; end end; 180: begin for y := 0 to H do begin Dest := Bitmap.ScanLine[y]; Src := Bmp.ScanLine[H - y]; Inc(Src, W); for x := 0 to W do begin Dest^ := Src^; Dec(Src); Inc(Dest); end; end; end; else Rotate; end; finally Bmp.Free; end; end; Пример использования: RotateBitmap(FBitmap, 17.23, clWhite); 3) В приложении не совсем то, но близко. С Уважением, Gin. Приложение: |
Ответ отправил: Gin (статус: 9-ый класс) Отправлен: 23.06.2005, 23:51 |
Отвечает: Ерёмин Андрей Здравствуйте, Yarick! Можно, конечно, с помощью TImage сделать, но это очень муторно. Придётся самому поворачивать изображение программно. Это будет работать, но долго. Лучше использовать компонент JvRotateImage (http://www.jedivcl.org). --------- Жизнь - игра, в которой нет setup'а... |
Ответ отправил: Ерёмин Андрей (статус: 10-ый класс) Отправлен: 24.06.2005, 09:28 |
Отвечает: sir henry Здравствуйте, Yarick! Зачем крутить TImage если можно крутить изображение? TImage вообще не предназначен, чтобы его крутили. Наоборот, внутри него можно строить ЛЮБЫЕ изображения, в том числе и поворачиваемые вокруг своей оси (типа как сделано в программных студиях, том поворачиваются именно изображения ручек, а не компонент, на котором выведено изображение). Image.Left и Image.Top - это координата верхнего левого угла компонента на форме. Как бы Вы не извращались с этими координатами, повернуть что-либо только с помощью них не удасться никогда. Ссылки уже были, пользуйтесь. Да и сами в Яндексе или в Гугле можете свободно поискать. :) |
Ответ отправил: sir henry (статус: Профессор) Отправлен: 24.06.2005, 12:34 |
Вопрос № 22.569 |
Здраствуйте уважаемые експерты. У меня такой вопрос, как мне зделать так чтобы время надо былобы вводить в поле Edit (смотрите приложение), и желательно часы и минуты в разные поля Edit (Edit1 и Edit2),приведите пожалуйста примеры.Заранее спасибо.
Приложение: |
Отправлен: 23.06.2005, 23:06 Вопрос задал: Staskin (статус: Посетитель) Всего ответов отправлено: 3 |
Отвечает: Malish Здравствуйте, Staskin! Вот как я понял вопрос: в Edit1 вносим часы , в Edit2 - минуты. И ждем когда совпадет. var Time:TDateTime; begin while(true) do begin Edit3.Text := TimeToStr(Now); Edit3.Update ; Edit4.Text := (Edit1.Text+':'+Edit2.Text+':00'); Edit4.Update; if (Edit3.Text = Edit4.Text) then begin ShowMessage('Vremya'); break; end; Sleep(500); end; end; Можно через DecodeTime(Time : TDateTime , var Hour,Min,Sec,MSec :word) просто строку в Edit"ах приводишь к word и сравниваешь с Hour и Min. Зато в этом случае не важны секунды. Вообще можно придумать много разного. Только если делаешь как показан код, то используй потоки!!! |
Ответ отправил: Malish (статус: Студент) Отправлен: 23.06.2005, 23:41 Оценка за ответ: 5 |
Отвечает: sir henry Здравствуйте, Staskin! Чтобы вводить, ничего делать специально не надо, просто вводите и все. Может быть Вам нужно преобразовывать введенные значения в формат времени? Или Вам нужны функции сравнения разных форматов времени? Пожалуйста сформулируйте вопрос более понятным образом. |
Ответ отправил: sir henry (статус: Профессор) Отправлен: 24.06.2005, 12:38 Оценка за ответ: 4 |
Отвечает: Jadd Здравствуйте, Staskin! Юзай функции DecodeDate и EncodeDate. --------- Если в сердце дверь закрыта, нужно в печень постучаться |
Ответ отправил: Jadd (статус: Студент) Отправлен: 24.06.2005, 22:51 |
© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.
Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки:
comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль
В избранное | ||