Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.24;
Скачать: CL | DM;

Вниз

Не могу вовремя сфотографировать форму   Найти похожие ветки 

 
Лев   (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 вся ветка

Текущий архив: 2006.12.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
15-1164966699
zorik
2006-12-01 12:51
2006.12.24
создать иконки


2-1165234394
Галинка
2006-12-04 15:13
2006.12.24
Как поместить на кнопку глиф


2-1165317382
IgorMish
2006-12-05 14:16
2006.12.24
Процедура сворачивания окна


15-1165243674
zdm
2006-12-04 17:47
2006.12.24
"Красота Висты"


10-1126797420
Juice
2005-09-15 19:17
2006.12.24
Свойство не сохраняется