|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.04.2008, 08:17 | #1 |
Пользователь
Регистрация: 19.04.2008
Сообщений: 13
|
Переменная не декрементируется
Здраствуйте все столкнулся с такой проблемкой на дельфе. Уже несколько дней с ней вожусь а никак найти выход не могу.
При обработке windows сообщения wm_Char. Одна из переменных должна декрементироваться, если сработает условие. Но я проверял ее значение после Current := Current - 1; она каким-то магическим способом не уменьшается на один. Вот исходный код: Код:
|
19.04.2008, 08:38 | #2 |
Пользователь
Регистрация: 19.04.2008
Сообщений: 66
|
Слушай, ты перемен. сначала обнули, чтоб их декр-инкрментировать
(Current := 0) По тому и чехорда. Кстати, используй сис функции "DEC()" и "INC()", они работают быстрее. Вот!
Нет таких проблем, которых мы не можем себе создать
|
19.04.2008, 08:45 | #3 |
Пользователь
Регистрация: 19.04.2008
Сообщений: 13
|
Переменная обнуляется при создании формы, а я где-то читал что наоборот запись типа a := a -1 быстрее чем dec(a)!
|
19.04.2008, 08:49 | #4 |
Пользователь
Регистрация: 19.04.2008
Сообщений: 66
|
Я тоже так когда-то думал! Ты всё-таки обнули!
А вообще если ты с ассемблером бы сталкивался то сразу мне поверил насчёт DEC() и INC().
Нет таких проблем, которых мы не можем себе создать
|
19.04.2008, 09:02 | #5 |
Пользователь
Регистрация: 19.04.2008
Сообщений: 13
|
Обнулять не могу в этой функции, а то потеряется значение, обнуляется при создании формы(повторюсь). Эта переменная используется в других функциях. Поясню суть моей проги, что-то типа тренажера на клаве. Из правого верхнего угла по таймеру "выходят" буквы, которые рисуются на PaintBoxе. Букву, которую нужно нажать выделяется тоже картинкой. За вывод выделения отвечает переменная Current.
|
19.04.2008, 09:09 | #6 |
Пользователь
Регистрация: 19.04.2008
Сообщений: 66
|
Да я понял,понял в крейте нулишь. Ага. А как ты определил
что не декр
Нет таких проблем, которых мы не можем себе создать
|
19.04.2008, 09:20 | #7 |
Пользователь
Регистрация: 19.04.2008
Сообщений: 13
|
|
19.04.2008, 09:32 | #8 |
Пользователь
Регистрация: 19.04.2008
Сообщений: 66
|
Верняк увидишь, если:
поставь стоп точку на следующем операторе после проверяемого. Как компилить будешь, там и посмотришь . компилер встанет на стоп точке. Там под курсором всё состояние светиться. - а вообще более менее полный код нужен. Как вывесишь там и посмотрим. Мне кажется что лаг не Current.
Нет таких проблем, которых мы не можем себе создать
|
19.04.2008, 09:42 | #9 |
Пользователь
Регистрация: 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; |
19.04.2008, 10:38 | #10 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Нет никаких оснований считать что
Current:=Current-1; не работает. Вы же выводите значение после изменения, а какое значение было до этого не знаете. По таймеру переменная то-же меняется. Отключите хотя-бы его и посмотрите. Если вы решили не использовать отладчик, выводите значение в ListBox. Вот тогда будет видна последовательность изменений переменной. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Странная переменная. | 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 |