Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.04 c
5-1145509652
DimaBr
2006-04-20 09:07
2006.12.24
Left Top компонета


4-1155880530
vodvorezlaya
2006-08-18 09:55
2006.12.24
Помогите разобраться с таблицей атомов


2-1165574989
.ruslan
2006-12-08 13:49
2006.12.24
Как зепретить в Richedit ставить курсор?


8-1146214120
QuickFinder
2006-04-28 12:48
2006.12.24
DelphiX


15-1165178576
Real
2006-12-03 23:42
2006.12.24
Тюнеры от AverMedia - управление громкостью





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский