Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.10.2010, 22:50
Аватар для Lory
Lory Lory вне форума
Прохожий
 
Регистрация: 23.05.2010
Адрес: Москва
Сообщения: 29
Репутация: 10
Вопрос программа Метроном

Есть программа такая-Метроном
мне по нему нужно сделать аж 6 заданий...но я не понимаю ни черта(((
помогите пожалуйста разобраться...

вот такст программы
Код:
program timer;

uses
  	windows,
  	messages,
  	sysUtils; //Служебные функции Дельфи для форматирования строк и т.д.
var   
	//Глобальные переменные; используются для хранения значений,
	// не изменяющихся между вызовами процедур
   	xOffset:integer; 
   	yOffset:integer; 
   	bkmode:integer;
   	timeinterval:integer;
   	timechange:integer;

function WndProc (hWnd: THandle; Msg: integer; wParam: longint; lParam: longint): longint; stdcall; forward;

procedure WinMain; //Основной цикл обработки сообщений
  	const szClassName='Shablon';
  	var   
		wndClass:TWndClassEx; 	//имя, под которым класс зарегистрирован в системе
        	hWnd: THandle; 				//хэндл окна
        	msg:TMsg;
	begin
  		wndClass.cbSize:=sizeof(wndClass);
  		wndClass.style:=cs_hredraw or cs_vredraw;
  		wndClass.lpfnWndProc:=@WndProc;
  		wndClass.cbClsExtra:=0;
  		wndClass.cbWndExtra:=0;
  		//wndClass.hInstance:=hPrevInst; [Warning] Symbol 'HPrevInst' is deprecated 
  		wndClass.hInstance:=hInstance;
  		wndClass.hIcon:=loadIcon(0, idi_Application);
  		wndClass.hCursor:=loadCursor(0, idc_Arrow);
  		wndClass.hbrBackground:=GetStockObject(white_Brush);
  		wndClass.lpszMenuName:=nil;
  		wndClass.lpszClassName:=szClassName;
  		wndClass.hIconSm:=loadIcon(0, idi_Application);

  		RegisterClassEx(wndClass);

  		hwnd:=CreateWindowEx(
   			0,
         		szClassName, //имя класса окна
         		'Программа-таймер',    //заголовок окна
         		ws_overlappedWindow,     //стиль окна
         		10,           //Left
         		10,           //Top
        		 500,                     //Width
         		200,                     //Height
         		0,                       //хэндл родительского окна
         		0,                       //хэндл оконного меню
         		hInstance,               //хэндл экземпляра приложения
         		nil);                    //параметры создания окна

  		ShowWindow(hwnd,sw_Show);  //отобразить окно
  		updateWindow(hwnd);   //послать wm_paint оконной процедуре, минуя очередь сообщений 

  		while GetMessage(msg,0,0,0) do 
			begin //получить очередное сообщение
				TranslateMessage(msg);   //Windows транслирует сообщения от клавиатуры
				DispatchMessage(msg);    //Windows вызовет оконную процедуру
  			end; //выход по wm_quit, на которое GetMessage вернет FALSE
	end; // WinMain

function WndProc (hWnd: THandle; Msg: integer; wParam: longint; lParam: longint): longint; stdcall;
  	var 
		ps:TPaintStruct;
      	hdc:THandle;
      	rect:TRect;
      	s:shortstring; //Строка как в Турбо-Паскале
      	keystate:short;
	begin
  		result:=0;
  		//keystate:=0; [Hint]: Value assigned to 'keystate' never used. 
  		case Msg of
    			wm_create:
      			begin
        				SetTimer(hwnd,0,1000,nil); // Таймер ~1 с, посылает WM_TIMER
      			end;

			wm_timer:
      			begin
        				bkmode:=bkmode*(-1);
        				invalidateRect(hwnd,nil,true);
      			end;

    			wm_paint:
      			begin
        				hdc:=BeginPaint(hwnd,ps); //Удалить WM_PAINT из очереди и начать рисование
        				GetClientRect(hwnd,rect);
        				if bkmode=1 then 
						SetBkMode(hdc,opaque) 
					else 
						SetBkMode(hdc,transparent);
        				SetBkColor(hdc,rgb(0,0,255));
        				s:='Таймер активен. Период работы: ';
        				TextOut(hdc,xOffset+5,yOffset+5,@s[1],length(s));
        				s:=inttostr(timeinterval)+' милисекунд';
        				TextOut(hdc,xOffset+5,yOffset+20,@s[1],length(s));

        				EndPaint (hwnd,ps);
      			end;

    			wm_keydown:
      			begin
        				case wParam of
          					vk_up:
           					begin
            						keystate:=getkeystate(vk_lControl);
            						if (keystate=-128) or (keystate=-127) then 
									timechange:=500 
								else 
									timechange:=100;
            						if timeinterval<3000 then 
									timeinterval:=timeinterval+timechange;
            						SetTimer(hwnd,0,timeinterval,nil);
           					end;
          					vk_down:
           					begin
            						keystate:=getkeystate(vk_lControl);
            						if (keystate=-128) or (keystate=-127) then 
									timechange:=500 
								else timechange:=100;
            						if timeinterval>500 then 
									timeinterval:=timeinterval-timechange;
            						SetTimer(hwnd,0,timeinterval,nil);
           					end;
          					vk_left: 
							dec(xOffset);
          					vk_right: 
							inc(xOffset);
          					vk_escape:
           					begin
            						xOffset:=0;
            						yOffset:=0;
           					end; // Вернуть по умолчанию
        				end;  //case wparam
          				invalidaterect(hwnd,nil,true);
          				updateWindow(hwnd); //Перерисовать окно, не дожидаясь опустошения очереди
       			end; //wm_keydown

    			wm_destroy:
      			begin
        				killTimer(hwnd,0);
        				PostQuitMessage(0);
      			end;

    			else
      			result:=DefWindowProc(hwnd,msg,wparam,lparam);
		end; //case Msg
	end; //WndProc

begin
   	xOffset:=0; 		//Присвоение начальных значений глобальным переменным
   	yOffset:=1; 
   	bkmode:=1;
   	timeinterval:=1000;
   	timechange:=100;
  	WinMain;
end.
Admin: Пользуемся тегами!

а вот задания:

Варианты индивидуальных заданий
1.1.Сделать из метронома таймер обратного отсчета: начиная с 10000 мс, значение таймера убавляется по 1000 мс до нуля. В конце выдается сообщение (для выдачи сообщения менять строку s; вызов процедуры TextOut не трогать).
1.2.Сделать разноцветный метроном: каждые 1000 мс цвет сообщения меняется на другой по заранее заданной циклической схеме (например, синий-зеленый-желтый-синий).
1.3.Добавить возможность перемещения надписи по вертикали (задействовав вертикальные стрелки не под изменение периода таймера, а под перемещение)
1.4.Создать измеритель скорости набора на клавиатуре. Для этого сосчитать все события wm_keydown, произошедшие за заданный интервал.
1.5.Добавить возможность перетаскивания надписи мышкой (события wm_lbuttondown (начало перетаскивания) и wm_lbuttonup(конец перетаскивания))
1.6.Сделать из метронома секундомер, начинающий отсчет по нажатию какой-либо клавиши и прекращающий его по нажатию той же клавиши. Точность измерения – 0.1 сек.

очень прошу пожалуйста помогите!!!

Последний раз редактировалось Admin, 11.10.2010 в 22:55.
Ответить с цитированием
  #2  
Старый 12.10.2010, 00:18
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну тут сделано все на WinAPI.
Вся суть в том, что здесь идет работа с сообщениями, а не с событиями.
Соответствено, для реализации того, что тебе задали, тебе надо подправить соответсвующие обработчики. Например, для задачи 1.2 надо сделать следующее:
1. Завести переменную для хранения текущего цвета.
2. При старте программы инициализировать ее (в WinMain).
3. Изменить метод отрисовки так, что бы он использовал значение из этой переменной для установки цвета надписи (это в WndProc в обр. сообщения wm_paint)
4. Написать процку, которая будет менять цвет по заданной схеме (в той самой переменной).
5. Поставить вызов процки смены цвета в обработчике события от таймера (это в WndProc в обр. сообщения wm_timer).

Все. это задание готово. 5 не очень больших правок.
Ответить с цитированием
  #3  
Старый 12.10.2010, 22:32
Аватар для Lory
Lory Lory вне форума
Прохожий
 
Регистрация: 23.05.2010
Адрес: Москва
Сообщения: 29
Репутация: 10
Восклицание эх...

честно я чё то ни черта не поняла...мне нужно 2 4 и 5...
эх...текстик бы(((
Ответить с цитированием
  #4  
Старый 12.10.2010, 22:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Для второй задачи я тебе написал что надо сделать.
Для всех остальных делается примерно так же. Ну для 5ой надо просто добавить обработку доп. сообщений.

А за готовыми решениями тут принято ходить в другой раздел. В этом разделе могут решить только если задача интересная.
Ответить с цитированием
  #5  
Старый 12.10.2010, 22:55
Аватар для Lory
Lory Lory вне форума
Прохожий
 
Регистрация: 23.05.2010
Адрес: Москва
Сообщения: 29
Репутация: 10
Восклицание хммм

тогда скажи куда мне пойти чтобы мне дали решение?)
спасибо за объяснение))))))))

а вот еще:
1.Выделить функции WinAPI, используемые в программе (проще всего – создав отдельный doc-файл с программой и сделав выделение шрифтом. Результат пойдет в отчет).
2.Изучить программу-метроном. Составить список обработчиков сообщений и используемых функций winapi с кратким описанием, какая функция чему соответствует. Для получения информации о функциях можно использовать Delphi Help и MS SDK Help.


просто объяснить)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:57.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025