Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль

В избранное