Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2008, 08:17   #1
Hypermaster
Пользователь
 
Аватар для Hypermaster
 
Регистрация: 19.04.2008
Сообщений: 13
По умолчанию Переменная не декрементируется

Здраствуйте все столкнулся с такой проблемкой на дельфе. Уже несколько дней с ней вожусь а никак найти выход не могу.
При обработке windows сообщения wm_Char. Одна из переменных должна декрементироваться, если сработает условие. Но я проверял ее значение после Current := Current - 1; она каким-то магическим способом не уменьшается на один. Вот исходный код:

Код:
procedure TfmWorkArea.WmChar (var Msg: TWMChar);
begin
 
 if Msg.CharCode = VK_ESCAPE then
 begin
  Timer.Enabled := false;
  PopupMenu.Popup(left-50 + width div 2, top-50 + height div 2);
  Timer.Enabled := true;
  exit;
 end;
  
  if chr(Msg.CharCode) = Images[NumChr] then
 begin

  Timer.Enabled := false;
  NumChr := NumChr + 1;
  Current:=Current-2;
  l:=true;
  Application.Title := inttostr(current);
  PatBlt(PaintBox.Canvas.Handle, 0, 0, PaintBox.ClientWidth, PaintBox.ClientHeight, WHITENESS);
  PatBlt(ResBmp.Canvas.Handle, 0, 0, ResBmp.Width, ResBmp.Height, WHITENESS);

  i := 1;
  DrawWorkArea();
  Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0))+'images\select.bmp');
  DrawTransparentBmp(ResBmp.Canvas,ResBmp.Width-146-Current*98, Current*89,Bitmap,clwhite);
  PaintBox.Canvas.Draw(0,0,ResBmp);
  Timer.Enabled := true;
 end;
end;
Hypermaster вне форума Ответить с цитированием
Старый 19.04.2008, 08:38   #2
MusicMan
Пользователь
 
Аватар для MusicMan
 
Регистрация: 19.04.2008
Сообщений: 66
По умолчанию

Слушай, ты перемен. сначала обнули, чтоб их декр-инкрментировать
(Current := 0) По тому и чехорда. Кстати, используй сис функции
"DEC()" и "INC()", они работают быстрее. Вот!
Нет таких проблем, которых мы не можем себе создать
MusicMan вне форума Ответить с цитированием
Старый 19.04.2008, 08:45   #3
Hypermaster
Пользователь
 
Аватар для Hypermaster
 
Регистрация: 19.04.2008
Сообщений: 13
По умолчанию

Цитата:
Сообщение от MusicMan Посмотреть сообщение
Слушай, ты перемен. сначала обнули, чтоб их декр-инкрментировать
(Current := 0) По тому и чехорда. Кстати, используй сис функции
"DEC()" и "INC()", они работают быстрее. Вот!
Переменная обнуляется при создании формы, а я где-то читал что наоборот запись типа a := a -1 быстрее чем dec(a)!
Hypermaster вне форума Ответить с цитированием
Старый 19.04.2008, 08:49   #4
MusicMan
Пользователь
 
Аватар для MusicMan
 
Регистрация: 19.04.2008
Сообщений: 66
По умолчанию

Я тоже так когда-то думал! Ты всё-таки обнули!
А вообще если ты с ассемблером бы сталкивался то
сразу мне поверил насчёт DEC() и INC().
Нет таких проблем, которых мы не можем себе создать
MusicMan вне форума Ответить с цитированием
Старый 19.04.2008, 09:02   #5
Hypermaster
Пользователь
 
Аватар для Hypermaster
 
Регистрация: 19.04.2008
Сообщений: 13
По умолчанию

Обнулять не могу в этой функции, а то потеряется значение, обнуляется при создании формы(повторюсь). Эта переменная используется в других функциях. Поясню суть моей проги, что-то типа тренажера на клаве. Из правого верхнего угла по таймеру "выходят" буквы, которые рисуются на PaintBoxе. Букву, которую нужно нажать выделяется тоже картинкой. За вывод выделения отвечает переменная Current.
Hypermaster вне форума Ответить с цитированием
Старый 19.04.2008, 09:09   #6
MusicMan
Пользователь
 
Аватар для MusicMan
 
Регистрация: 19.04.2008
Сообщений: 66
По умолчанию

Да я понял,понял в крейте нулишь. Ага. А как ты определил
что не декр
Нет таких проблем, которых мы не можем себе создать
MusicMan вне форума Ответить с цитированием
Старый 19.04.2008, 09:20   #7
Hypermaster
Пользователь
 
Аватар для Hypermaster
 
Регистрация: 19.04.2008
Сообщений: 13
По умолчанию

Цитата:
Сообщение от MusicMan Посмотреть сообщение
Да я понял,понял в крейте нулишь. Ага. А как ты определил
что не декр
Этой строчкой
Application.Title := inttostr(current);
Может смешно но мне все равно было какие использовать средства отладки!
Hypermaster вне форума Ответить с цитированием
Старый 19.04.2008, 09:32   #8
MusicMan
Пользователь
 
Аватар для MusicMan
 
Регистрация: 19.04.2008
Сообщений: 66
По умолчанию

Верняк увидишь, если:
поставь стоп точку на следующем операторе после
проверяемого. Как компилить будешь, там и посмотришь
. компилер встанет на стоп точке. Там под курсором всё состояние светиться.
- а вообще более менее полный код нужен.
Как вывесишь там и посмотрим. Мне кажется что лаг
не Current.
Нет таких проблем, которых мы не можем себе создать
MusicMan вне форума Ответить с цитированием
Старый 19.04.2008, 09:42   #9
Hypermaster
Пользователь
 
Аватар для Hypermaster
 
Регистрация: 19.04.2008
Сообщений: 13
По умолчанию

Мне скрывать нечего, все равно эту прогу я не продаю и не на коммерческой она будет основе. Для знакомой дипломку делаю.
unit main;

interface

procedure DrawTransparentBmp(Cnv: TCanvas; x,y: Integer; Bmp: TBitmap; clTransparent: TColor);
begin
{опущу описание так как не смысла}
end;

procedure TfmWorkArea.WmChar (var Msg: TWMChar);
begin

if Msg.CharCode = VK_ESCAPE then
begin
Timer.Enabled := false;
PopupMenu.Popup(left-50 + width div 2, top-50 + height div 2);
Timer.Enabled := true;
exit;
end;

if chr(Msg.CharCode) = Images[NumChr] then
begin

Timer.Enabled := false;
NumChr := NumChr + 1;
Current:=Current-1;
Application.Title := inttostr(current);
PatBlt(PaintBox.Canvas.Handle, 0, 0, PaintBox.ClientWidth, PaintBox.ClientHeight, WHITENESS);
PatBlt(ResBmp.Canvas.Handle, 0, 0, ResBmp.Width, ResBmp.Height, WHITENESS);

i := 1;
DrawWorkArea();
Bitmap.LoadFromFile(ExtractFilePath (ParamStr(0))+'images\select.bmp');
DrawTransparentBmp(ResBmp.Canvas,Re sBmp.Width-146-Current*98, Current*89,Bitmap,clwhite);
PaintBox.Canvas.Draw(0,0,ResBmp);
Timer.Enabled := true;
end;
end;


procedure DrawWorkArea(); //рекурсивная функция вывода "видимых" букв
begin
with main.fmWorkArea do
begin
Bitmap.LoadFromFile(ExtractFilePath (ParamStr(0))+'images\'+Images[length(Images)-i]+'.bmp');
DrawTransparentBmp(ResBmp.Canvas,Pa intBox.Width-140-(i-1)*98,0+(i-1)*90,Bitmap,clwhite);
inc(i);
if (i<8) and (i<Length(Images)+1) then DrawWorkArea();
end;
end;

procedure TfmWorkArea.FormCreate(Sender: TObject);
var Save: Longint;
begin
Bitmap:=TBitmap.Create; //этот объект умеет работать с bmp
ResBmp:=TBitmap.Create; //создаем еще один такой же объект
height := 730;
width := 750;
PaintBox.Height := Height;
PaintBox.Width := Width;
ResBmp.Width := PaintBox.Width;
ResBmp.Height:= PaintBox.Height;
//обнуляем переменные
Count := 0;
Pos := 0;
NumChr:= 0;
Current := 0;
Alphabit[0] := 'а'; Alphabit[1] := 'р';
Alphabit[2] := 'б'; Alphabit[3] := 'с';
Alphabit[4] := 'в'; Alphabit[5] := 'т';
Alphabit[6] := 'г'; Alphabit[7] := 'у';
Alphabit[8] := 'д'; Alphabit[9] := 'ф';
Alphabit[10] := 'е';Alphabit[11] := 'х';
Alphabit[12] := 'ж';Alphabit[13] := 'ц';
Alphabit[14] := 'з';Alphabit[15] := 'ч';
Alphabit[16] := 'и';Alphabit[17] := 'ш';
Alphabit[18] := 'й';Alphabit[19] := 'щ';
Alphabit[20] := 'к';Alphabit[21] := 'ь';
Alphabit[22] := 'л';Alphabit[23] := 'ы';
Alphabit[24] := 'м';Alphabit[25] := 'ъ';
Alphabit[26] := 'н';Alphabit[27] := 'э';
Alphabit[28] := 'о';Alphabit[29] := 'ю';
Alphabit[30] := 'п';Alphabit[31] := 'я';
Randomize; // а это чтобы буквы случайно номально выходились

{убираем заголовок формы}
Save:=GetWindowLong(Handle, GWL_STYLE);
if (Save and WS_CAPTION)=WS_CAPTION then
begin
case BorderStyle of
bsSingle, bsSizeable:
SetWindowLong(Handle, GWL_STYLE, Save and (not WS_CAPTION) or WS_BORDER);
bsDialog:
SetWindowLong(Handle, GWL_STYLE, Save and
(not WS_CAPTION) or DS_MODALFRAME or WS_DLGFRAME);
end;
Height:=Height-GetSystemMetrics(SM_CYCAPTION);
Refresh;
end;

end;

procedure TfmWorkArea.TimerTimer(Sender: TObject);
begin
if (Count = 30) then
begin
Level := Level + 1 ;
if Level = 4 then
begin
Timer.Enabled := false;
ShowMessage('Поздравляю, вы прошли успешно все уровни сложности этого тура.'+#13+' Добро пожаловать в следующий тур!');
exit;
end;
Timer.Enabled := false;
ShowMessage('Поздравляю,вы дошли до '+intToStr(level)+'-го уровня');

//эта функция по мнению автора быстро очищает канву
PatBlt(PaintBox.Canvas.Handle, 0, 0, PaintBox.ClientWidth, PaintBox.ClientHeight, WHITENESS);
Count := 0;
Pos := 0;

Timer.Interval := Timer.Interval div Level;
Timer.Enabled := true;
end;

if Pos = 7 then
begin
PatBlt(PaintBox.Canvas.Handle, 0, 0, PaintBox.ClientWidth, PaintBox.ClientHeight, WHITENESS);
Pos := 0;
end;
SetLength(Images, count+1);
Images[count] := Alphabit[Random(31)];
//очищаем канву
PatBlt(PaintBox.Canvas.Handle, 0, 0, PaintBox.ClientWidth, PaintBox.ClientHeight, WHITENESS);
PatBlt(ResBmp.Canvas.Handle, 0, 0, ResBmp.Width, ResBmp.Height, WHITENESS);
//обновляем вспомогательную переменную и выводим обновленную канву
i := 1;

DrawWorkArea();


if Current = 7 then
begin
ShowMessage('You are lost');
Timer.Enabled := false;
exit;
end;
{выделяем текущую букву}
Bitmap.LoadFromFile(ExtractFilePath (ParamStr(0))+'images\select.bmp');
DrawTransparentBmp(ResBmp.Canvas,Re sBmp.Width-146-Current*98,0+Current*89,Bitmap,clwh ite);
PaintBox.Canvas.Draw(0,0,ResBmp);
Pos := Pos + 1;
Count := Count + 1;
Current := Current + 1;

end;
Hypermaster вне форума Ответить с цитированием
Старый 19.04.2008, 10:38   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Нет никаких оснований считать что

Current:=Current-1;

не работает.

Вы же выводите значение после изменения, а какое значение было до этого не знаете. По таймеру переменная то-же меняется. Отключите хотя-бы его и посмотрите. Если вы решили не использовать отладчик, выводите значение в ListBox. Вот тогда будет видна последовательность изменений переменной.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странная переменная. GreenDan Помощь студентам 6 25.08.2008 19:35
Динамическая переменная kezman Общие вопросы C/C++ 1 29.07.2008 13:49
Переменная в № ячейки valerij Microsoft Office Excel 2 24.05.2008 18:58
Что за переменная EmptyStr shurik_7866 Общие вопросы Delphi 2 15.10.2007 18:23