![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу вовремя сфотографировать форму [D7, WinXP]
Лев © (2006-05-08 18:06:00)Здравствуйте, уважаемые знатоки!
Проблема такая:
Есть форма, на ней есть несколько панелей (TPanel), создаются динамически еще на этапе создания формы (OnFormCreate).
Далее, когда человек нажимает на эти панели, они вжимаются (BevelOuter:=bvLowered) + на них появляется буква (Caption:='какая-либо-буква')? и после этого я снимаю принтскрин с формы вот так:
Bit.Canvas.CopyRect(Rect(0,0,Form1.ClientWidth,Form1.ClientHeight), Form1.Canvas, Rect(0,0,Form1.ClientWidth,Form1.ClientHeight));
Bit.SaveToFile(StartDir+'log\screen.bmp');
Bit: TBitmap
Естественно Bit создан заранее и размер имеет:
Form1.ClientWidth X Form1.ClientHeight
Так вот все бы ничего, т.е. все работает, форма "фотографируется" и сохраняется в файл, но!
На сохраненной картинке мы получаем состояние как бы до нажатия кнопки!!!
Т.е. панелька не вжата и буквы на ней нет!
Если можете, то гляньте на данную картинку, она наглядно иллюстрирует проблему.
Слева то, что должно быть (снято кнопкой Print Screen, после нажатия на очередную панельку), а справа то, что получается программно...
Картинка: http://img224.imageshack.us/img224/5072/prog7vw.gif
В чем может быть проблема?
!!! Только не пишите, что я рано вызвал фотографирование. Оно вызывается как надо в самом конце, после того как панелька вжата, и Caption изменен...
И еще не хотелось бы использовать задержки и таймеры, т.к. во-первых, это игра, и задержки будут бесить игрока, а во-вторых, это лабораторка, и преподаватель против таймера, сказал, что есть другие решения, мол, ищите...
Ничего не могу придумать, как-то это все не логично...
Помогите, пожалуйста!!!
Лев (2006-05-09 01:18:00) [1]А про код, я бы хоть всю прогу выложил, просто думал, что за это заругают (мол, чего выкидываешь столько кода, кто в нем разбираться будет, и т.п.).
Лев (2006-05-09 01:16:00) [2]Rial ©
Big thanks!!!
Помогло Application.ProcessMessages;
Как сам не додумался - не знаю, вроде же очевидно: просто не происходит обработки событий до снятия скрина, а значит и форма не перерисовывается!
На самом деле столько всего перепробовал :)
Просто меня достала уже эта ошибка, я и так лабу раньше всех сделал, сдал, а он (препод) мне, на те вам еще заданьице...
Спасибо еще раз!
Rial (2006-05-09 00:59:00) [3]procedure TForm1.DoScreen;
begin
inc(Sc);
Bit.Canvas.CopyRect(Bit.Canvas.ClipRect,Canvas,Canvas.ClipRect);
Bit.SaveToFile(StartDir+'log\screen_'+IntToStr(Sc)+'.bmp');
end;
Это чтобы потом глюки вдруг не повылезали.
Куча вызовов глобальных переменных или методов
(или что это у тебя там - Opened,Field),
в которых возможны ошибки.
Впредь предоставляй более полно твой код, не для NASA пишешь же.
Если не пользуешься непосредственно графическими процедурами
(вроде GDI, OpenGL, Canvas), то вставь перед
DoScreen;//И делаем скрин
Что либо из списк (не знаю, что именно поможет).
Application.ProcessMessages:
или
MyPanel.Repaint;
Лев (2006-05-08 23:02:00) [4]Скрин снимаем так:
procedure TForm1.MyPanelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if TMyPanel(Sender).BevelOuter=bvRaised then
begin
TMyPanel(Sender).BevelOuter:=bvLowered;//Тут как видно вжимаем панель
OpenPanel(TMyPanel(Sender).X,TMyPanel(Sender).Y);
end;
end;
procedure TForm1.OpenPanel(X,Y:integer);
begin
Field[x,y].Caption:=chr(Field[x,y].Sym+64);//Тут букву вписываем в панель
if Opened[1,1]=0 then
begin
Opened[1,1]:=X;
Opened[1,2]:=Y;
end else if Opened[2,1]=0 then
begin
Opened[2,1]:=X;
Opened[2,2]:=Y;
end else if Opened[3,1]=0 then
begin
Opened[3,1]:=X;
Opened[3,2]:=Y;
if (Field[Opened[1,1],Opened[1,2]].Sym=Field[Opened[2,1],Opened[2,2]].Sym) and (Field[Opened[2,1],Opened[2,2]].Sym=Field[Opened[3,1],Opened[3,2]].Sym) then
begin
GameScore:=GameScore+60;
LPic.Caption:=IntToStr(StrToInt(LPic.Caption)-1);
HideOpened;
end else begin
if (Field[Opened[1,1],Opened[1,2]].Sym=Field[Opened[2,1],Opened[2,2]].Sym) or (Field[Opened[2,1],Opened[2,2]].Sym=Field[Opened[3,1],Opened[3,2]].Sym) or (Field[Opened[1,1],Opened[1,2]].Sym=Field[Opened[3,1],Opened[3,2]].Sym) then
begin
GameScore:=GameScore-10;
end else begin
GameScore:=GameScore-15;
end;
end;
end else begin
CloseOpened;
OpenPanel(X,Y);
end;
DoScreen;//И делаем скрин
end;
procedure TForm1.DoScreen;
begin
inc(Sc);
Bit.Canvas.CopyRect(Rect(0,0,Form1.ClientWidth,Form1.ClientHeight), Form1.Canvas, Rect(0,0,Form1.ClientWidth,Form1.ClientHeight));
Bit.SaveToFile(StartDir+'log\screen_'+IntToStr(Sc)+'.bmp');
end;
При нажатии на панель...
Мефисто (2006-05-08 22:47:00) [5]По какому собственно событию снимаем скрин?
OnClick
OnMouseDown
OnMouseUp
?