Форум: "Media";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
ВнизНе могу вовремя сфотографировать форму Найти похожие ветки
← →
Лев (2006-05-08 18:06) [0]Здравствуйте, уважаемые знатоки!
Проблема такая:
Есть форма, на ней есть несколько панелей (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-08 22:47) [1]По какому собственно событию снимаем скрин?
OnClick
OnMouseDown
OnMouseUp
?
← →
Лев (2006-05-08 23:02) [2]Скрин снимаем так:
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;
При нажатии на панель...
← →
Rial © (2006-05-09 00:59) [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-09 01:16) [4]Rial ©
Big thanks!!!
Помогло Application.ProcessMessages;
Как сам не додумался - не знаю, вроде же очевидно: просто не происходит обработки событий до снятия скрина, а значит и форма не перерисовывается!
На самом деле столько всего перепробовал :)
Просто меня достала уже эта ошибка, я и так лабу раньше всех сделал, сдал, а он (препод) мне, на те вам еще заданьице...
Спасибо еще раз!
← →
Лев (2006-05-09 01:18) [5]А про код, я бы хоть всю прогу выложил, просто думал, что за это заругают (мол, чего выкидываешь столько кода, кто в нем разбираться будет, и т.п.).
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.058 c