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

ExCode.ru - программирование на высоком уровне - выпуск 20


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

ExCode.ru - программирование на высоком уровне
Выпуск №20 ( 2005.12.11 )
Здравствуйте, уважаемые подписчики!

Сегодня уже 11 декабря, а это значит, что наш конкурс все еще продолжается. К сожалению участников не так много как хотелось бы. Вот они:
НикКол-во сообщений
yariks6
PIXEL5
Kodov4
vcustoms2
d4rkr00t2
alexpzas1
zzzig1
natrix1
У каждого из них есть реальный шанс выиграть 2 DVD диска. Составьте им конкуренцию и одержите победу. Подробнее о конкурсе Вы можете узнать здесь

Также хочу сообщить Вам об открытии новой версии нашего Магазина для программистов. Теперь дисков стало в 2 раза больше, а заказывать их стало еще удобнее. Специально для Вас мы разработали систему скидок.

За последнюю неделю в Магазине появилось 10 новых дисков

Alias MAYA - полная коллекция
Autodesk 2006
Borland JBuilder 2006 + Premium tools для Windows,Linux и Solaris
Red Hat Enterprise Linux
Интернет 2006
Математика и статистика
Полная коллекция программ от Macromedia
Программы для WEB-дизайна
Профессиональное создание анимации
Суперколлекция текстур - 1100 штук

Лидер продаж: Microsoft Visual Studio 2005.NET

Цена одного DVD - 300 руб. Доставка по всей России.


Новости копьютерного мира:
2005-12-05    Windows теснит Unix на рынке серверов
Продажи серверов выросли за последнюю четверть на 8,1%, достигнув объема $12,5 млрд., сообщают эксперты IDC. При этом эксперты сообщили о превышении рыночных прибылей Windows над доходами Unix, что случилось впервые в истории становления серверного рынка.

2005-12-05    Google назначила нового директора
Лидер поискового рынка, компания Google, торжественно назначила нового директора, которому предстоит стать в совете директоров представителем контрольного комитета. Им стала Энн Матэр.

2005-12-05    Спрос на IT-cпециалистов в ближайшие годы упадет почти вдвое?
Аналитики исследовательской компании Gartner считают, что спрос на IT-специалистов упадет почти на 40% уже в ближайшие 5 лет.

2005-12-05    iPod nano - в десятке самых продаваемых товаров Amazon.com
Компания Apple сообщила о том, что плееры новой серии - iPod nano - в предпраздничном сезоне выбились на первые места в рейтинге продукции, став одним из самых продаваемых товаров в электронном магазине Amazon.com.

2005-12-05    Sun закрыла пять уязвимостей в Java
Компания Sun Microsystems устранила 5 серьезнейших уязвимостей в Java, которые способны заметно облегчить хакерам атаку на системы, работающие под управлением Windows, Linux и Solaris. Все уязвимости касаются компоненты Java Runtime Environment, которая может встраивааться в операционную систему для просматра приложений, написанных на Java.

2005-12-05    Microsoft выпустит Exchange Server 12 только в 64-битном исполнении
Компания Microsoft в очередном стремлении стимулировать покупателей к покупке новых версий своей продукции, объявила о том, что новые версии Exchange Server 12 будут выходить исключительно в 64-битном исполнении.

2005-12-10    В Интернете заработал домен .eu
C 7 декабря ICANN и европейский регистратор EURID начали поддержку нового доменного имени верхнего уровня .eu, предназначенного для использования организациями из стран Евросоюза. Европейские власти добивались этого от ICANN около пяти лет, и в начале этого года домен был одобрен.

2005-12-10    В городах России установят бесплатные автоматы для выхода в Интернет
В Москве и других городах России начата установка "инфоматов" - "мультимедийных автоматов на базе компьютера в массивном металлическом корпусе", которые позволяют всем желающим бесплатно пользоваться доступом в Интернет и различными информационными сервисами. Этот проект реализуется в рамках федеральных целевых программ "Электронная Москва" и "Электронная Россия".

2005-12-10    Определены победители "цехового" конкурса российского интернет-сообщества "РОТОР++"
В пятницу завершилось голосование в рамках сетевого конкурса "РОТОР++" ("Российский Онлайн ТОР++"), который проводится с 2000 года международным союзом интернет-деятелей "ЕЖЕ". Этот союз существует с 1997 года, и в него в разное время входили или продолжают входить многие заметные деятели русскоязычной части Сети, причастные к созданию популярных интернет-проектов или внесшие другой вклад в информационное наполнение российского Интернета. В частности, в 2001 году несколько участников "ЕЖЕдвижения" стали "пионерами" освоения блоггерского сайта LiveJournal.com, который к настоящему моменту приобрел беспрецедентную популярность в России и известен как "Живой журнал" (ЖЖ).

2005-12-10    Ассоциация АКАР обещает удесятерение российского рынка интернет-рекламы через 5 лет
Ассоциация коммуникационных агентств России (АКАР), общественное объединение участников рынка рекламных услуг, опубликовала прогноз развития медиарекламного рынка России на период до 2010 года, пишет в пятницу газета "Коммерсант".

Статья номера:

Перемещение изображения по форме с помощью мыши


Автор: Ижогин Ян Валерьевич

Во время работы над одной программой предо мной встала задача организации перемещения нескольких изображений пользователем с помощью мыши. Я не крутой мастер DELPHI, и найденное мною решение не претендует на полноту, его недостатки я рассмотрю ниже, но я надеюсь, что опыт, приобретённый при решении будет полезен читателю.

Итак, задача. На форме размещены несколько изображений, загружаемых из внешних файлов (их имена 1.bmp, 2.bmp и т.д.).

Изображения должны быть перемещаемыми с помощью мыши.

Первое решение, пришедшее мне в голову - это решение "в лоб". Разместив на форме несколько Image, заставим их перемещаться вместе с мышью. Разместим на форме в нужных нам местах несколько (n) пустых Image, присвоим их свойству Tag значения от 1 до n - это пригодится при создании массива из них. Объявим следующие переменные:


implementation
var Pic: array[1..n] of TImage;//Сюда мы занесём наши Image
x0,y0:integer;//Это будут координаты нажатия мыши
flag:boolean;//а это тоже полезная переменная - флажок


Для первого из наших Image создадим обработчики следующих событий


{Как вы уже догадались наша форма называется MainForm}

procedure TMainForm.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If button<>mbLeft Then
flag:=false
Else begin
flag:=true;
x0:=x;
y0:=y
end
end;
{ При нажатии левой клавиши мыши над нашим Image запомним координаты нажатия
и установим флажок. Это делается для того, чтобы Image перемещался только при
опущенной левой кнопке мыши}


procedure TMainForm.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
flag:=false
end;
{При отпускании кнопки мыши, не важно какой, сбросим флажок}

procedure TMainForm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
If flag Then begin //Если флажок установлен, т.е. нажата левая копка мыши
(Sender As TImage).Left:=(Sender As TImage).Left+x-x0;
(Sender As TImage).Top:=(Sender As TImage).Top+y-y0
//Наш Image начинает перемещаться
end;
end;


Обратите внимание, что перемещается не Image1, а Sender. Созданные нами процедуры будут применены для обработки перемещений всех изображений на форме. Для этого в процедуре создания формы запишем все Image на форме в массив Pic


procedure TMainForm.FormCreate(Sender: TObject);
var i:byte;
begin
For i:=0 To MainForm.ComponentCount-1 Do
If (MainForm.Components Is TImage) Then
Pic[MainForm.Components.Tag]:=(MainForm.Components As TImage);
{Здесь мы просматриваем компоненты формы и если рассматриваемый компонент
- TImage присваеваем его в массив Pic c индексом Tag}

For i:=1 To n Do begin
Pic.Picture.LoadFromFile(IntToStr(i)+'.bmp');//Загружаем изображение
Pic.OnMouseDown:=Image1MouseDown;
Pic.OnMouseMove:=Image1MouseMove;
Pic.OnMouseUp:= Image1MouseUp
{Присваеваем нужные процедуры нужным событиям}
end
end;
{В принципе можно было бы обойтись одним циклом For, но, на мой взгляд
два цикла наглядней и проще для понимания}



Итак, полученный код позволяет разместить на форме n изображений и перемещать их с помощью мыши. Можно удовлетвориться полученным решением,если бы не одна страшная проблема - МЕРЦАНИЕ.

Я не большой мастер DELPHI, и я не знаю общего способа, как победить мерцание. Вообще, у меня возникло ощущение, что при перемещеннии Image по форме мерцания не избежать. Буду благодарен тому, кто покажет обратное. Ну в общем применение известных способов, например


MainForm.ControlStyle:=MainForm.ControlStyle+[csOpaque];


или процедуры Invalidate мне не помогло.

Следующим моим шагом было посещение Мастеров Дельфи, где я прочёл статью Михаила Христосенко "Перемещение Image'a по форме во время работы программы". Применение метода


(Sender As TImage).SetBounds((Sender As TImage).Left+x-x0,(Sender As TImage).Top+
y-y0,(Sender As TImage).width,(Sender As TImage).height);


в процедуре Image1MouseMove, рекомендованое Михаилом привело к снижению мерцания, но не избавило от него. Более того, в взрослых программах, таких как например само DELPHI,применяется третий из описанных Михаилом способов - перемещение не изображения, а его рамки.

Тогда я задумался, а не является ли применение TImage для перемещения изображения по форме тупиком. И тут я понял, что знаю компонент, на котором можно разместить изображение, и который не мерцает "по определению". Этот компонент (да простят меня Мастера Дельфи) - форма.

Итак следующий проект состоит из двух форм - FormMain и ImageForm. На ImageForm размещён пустой Image1, занимающий всю клиентскую область ImageForm. ImageForm относится к Available forms - это действие не принципиально, но экономит во время запуска приложения около 100 кб памяти. Свойство BorderStyle для ImageForm устанавливаем bsNone.

Для того, чтобы ImageForm перемещалась за Image1 создаём следующую процедуру:


procedure TImageForm.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const SC_DragMove = $F012;
begin
ReleaseCapture;
perform(WM_SysCommand, SC_DragMove, 0);
end;


На этом работа над ImageForm заканчивается.

Возвращаемся к FormMain.
Сделаем следующие объявления


implementation
const n=4; // Сколько нам нужно изображений
uses Unit2;
var Fa:array[1..n]of TImageForm;


Теперь нам нужно создать массив Fa, разместить его на форме и заполнить его изображениями. Всё это делается вручную - фокус с Tag тут уже не пройдёт. Делать это лучше не во время создания формы, а например во время активации.


procedure TFormMain.FormActivate(Sender: TObject);
var i:byte;
begin
for i:=1 to n do begin
Fa:=TImageForm.Create(Self);// Создание формы
Fa.Parent:=Self;//Без этой строки наши формы будут бегать по всему экрану
Fa.Visible:=True; //Вывод формы на экран
Fa.Image1.Picture.LoadFromFile(IntToStr(i)+'.bmp');// Загрузка картинки
Fa.Top:=i*50 //Выбор места расположения (здесь ставятся ваши значения)
end;
end;


Другой вариант - разместить на форме Timer с незначительным интервалом и разместить вышеприведённый код в процедуре OnTimer, указав в конце Timer1.Enabled:=false;

Последний штрих - установите "Отображать содержимое окна при его перетаскивании" с помощью следующей процедуры


B:Bool;//Объявите B где-нибудь после implementation


В FormCreate включите следующее


B:=True;
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, 0, @B, SPIF_SENDCHANGE)// Не проверял.


Ура! В созданная таким образом программе перемещаемые изображения не мерцают.

Однако объём памяти, занимаемый ею во время работы весьма велик. Программа состоящая из вышеприведённых процедур занимает на диске около 400 кб, а в ОП - порядка 2 мб. Попробую поискать менее ресурсоёмкое решение.

Ну вот и всё. Надеюсь, вам понравится. Обругать меня вы можете по адресу yanval@yandex.ru

C Уважением. Ян Валерьевич.


Новые статьи на сайте ExCode.ru:
НазваниеРаздел
Пишем прогу мониторинга за памятьюDelphi/Pascal » Система
Работа с директориями (папками) в ДельфиDelphi/Pascal » Система
Написание сервисов Windows NT на WinAPIDelphi/Pascal » Система
Как в Delphi изменить иконку у директорииDelphi/Pascal » Система
Использование мыши при работе с файлами (Drag & Drop)Delphi/Pascal » Система
Запуск внешнего приложения и ожидание его завершенияDelphi/Pascal » Общие
Доступ к реестру средствами APIDelphi/Pascal » Система
Сообщения Windows - введениеDelphi/Pascal » Система
Как обрабатывать сообщенияDelphi/Pascal » Система
Взаимодействие с чужими окнамиDelphi/Pascal » Система
Установка и изменение разрешения и глубины цвета из программыDelphi/Pascal » Система
Как узнать информацию о системеDelphi/Pascal » Система
FileMapping - один из способов обмена данными между процессамиDelphi/Pascal » Система
Drag & Drop в Delphi или "перетащи и брось"Delphi/Pascal » Система
Перемещение Image′а по форме во время работы приложенияDelphi/Pascal » Мультимедиа
Тэг ID3v2. ЧтениеDelphi/Pascal » Мультимедиа
Перемещение изображения по форме с помощью мышиDelphi/Pascal » Мультимедиа
Аналог функций Sound() и NoSound() под WindowsNT/2k/XPDelphi/Pascal » Мультимедиа
Ведущий рассылки: LedWorm
© ExCode.ru 2005

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

В избранное