Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2017, 02:31   #11
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Серёга Русич Посмотреть сообщение
Я пробовал вставлять Application.ProcessMessages. Но куда бы я его не вставил - программа перестает работать, как только дойдет до этой строчки кода.
Вот код проекта с этой попыткой хорошо бы увидеть своими глазами. Ибо я не верю!
northener вне форума Ответить с цитированием
Старый 17.03.2017, 02:55   #12
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Серёга Русич Посмотреть сообщение
Я пробовал вставлять Application.ProcessMessages. Но куда бы я его не вставил - программа перестает работать, как только дойдет до этой строчки кода.
Хотелось бы видеть эти пробы.
northener вне форума Ответить с цитированием
Старый 08.04.2017, 19:25   #13
Серёга Русич
Пользователь
 
Регистрация: 11.05.2011
Сообщений: 31
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Хотелось бы видеть эти пробы.
Цитата:
Сообщение от northener Посмотреть сообщение
Вот код проекта с этой попыткой хорошо бы увидеть своими глазами. Ибо я не верю!
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
Button1.Enabled:=False;
Button2.Enabled:=False;
Edit1.Enabled:=False;
Edit2.Enabled:=False;

NomerStroki:=StrToInt(Form1.Edit1.Text)-1;
KolvoKlientov:=0;

Form1.ProgressBar1.Max:=(StrToInt(Form1.Edit2.Text)-StrToInt(Form1.Edit1.Text))+1;

For OdnaStroka:=1 to (StrToInt(Form1.Edit2.Text)-StrToInt(Form1.Edit1.Text))+1 do
begin
NomerStroki:=NomerStroki+1;
KolvoKlientov:=KolvoKlientov+1;

ClientDir:=ExtractFilePath(ParamStr(0)) + 'Content\Done\' + Form1.StringGrid1.Cells[28, NomerStroki];
CreateDir(ClientDir);

Progress:=KolvoKlientov+1;
DataReg:=Copy(Form1.StringGrid1.Cells[16, NomerStroki], 4, 2);

end;

Form2.SignZav.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Data\Signatures\' + IntToStr(Random(79)) + '.png');

StrZav:=Copy(Form1.StringGrid1.Cells[1, NomerStroki], 1, 4)+Copy(Form1.StringGrid1.Cells[2, NomerStroki], 1, 1);
IZav:=length(StrZav);
NachZav:=AnsiUpperCase(copy(StrZav,1,1));
KonecZav:=AnsiLowerCase(copy(StrZav,2,IZav));
StrZav:=NachZav+KonecZav;

Form2.Label5.Font.Name:=StrZavFont1;
Form2.Label5.Font.Size:=StrToInt(StrZavSize1);
if StrZavChar1='RUSSIAN_CHARSET'
then Form2.Label5.Font.Charset:=RUSSIAN_CHARSET
else Form2.Label5.Font.Charset:=ANSI_CHARSET;

Form2.Label5.Top:=StrToInt(StrZavTop1);
Form2.Label5.Caption:=StrZav;

//Репаинт формы
Form2.Repaint;

//Сохранение в файл готового изображения при помощи скриншота
bmp:=tbitmap.Create;
SendJPG:=TJPEGImage.Create;
bmp.Width:=form2.Width;
bmp.Height:=form2.Height;
BitBlt(bmp.Canvas.Handle,0,0,form2.Width,form2.Height,getdc(form2.handle),0,0,SRCCOPY);
SendJPG.Assign(bmp);
Form1.DoneImage.Picture.Assign(SendJPG);
Form1.DoneImage.Picture.SaveToFile(ClientDir + '\' + Form1.StringGrid1.Cells[5, NomerStroki] + ' ' + Form1.StringGrid1.Cells[6, NomerStroki] + '_1' + '.jpg');

//Освобождение переменных
bmp.Free;
SendJPG.Free;


//Form3.Label11.Caption:=StringGrid1.Cells[13, 1];
Form3.Label11.Caption:=Copy(Form1.StringGrid1.Cells[16, NomerStroki], 1, 2) + ' ' + DataReg1 + ' ' + Copy(Form1.StringGrid1.Cells[16, NomerStroki], 7, 4) + 'г.';
Form3.Label1.Caption:=Form1.StringGrid1.Cells[17, NomerStroki];
Form3.Label2.Caption:=Form1.StringGrid1.Cells[19, NomerStroki];
Form3.Label3.Caption:=Form1.StringGrid1.Cells[20, NomerStroki];
If Form1.StringGrid1.Cells[21, NomerStroki] <>'' Then Form3.Label4.Caption:=Form1.StringGrid1.Cells[21, NomerStroki];
If Form1.StringGrid1.Cells[22, NomerStroki] <>'' Then Form3.Label5.Caption:=Form1.StringGrid1.Cells[22, NomerStroki];
If Form1.StringGrid1.Cells[23, NomerStroki] <>'' Then Form3.Label6.Caption:=Form1.StringGrid1.Cells[23, NomerStroki];
Form3.Label7.Caption:=Form1.StringGrid1.Cells[11, NomerStroki];


Form3.Label8.Caption:=Form1.StringGrid1.Cells[24, NomerStroki];
Form3.Label9.Caption:=Form1.StringGrid1.Cells[25, NomerStroki];
Form3.Label10.Caption:=Form1.StringGrid1.Cells[26, NomerStroki];
Form3.Label15.Caption:=Form1.StringGrid1.Cells[27, NomerStroki];

Form3.SignZav.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Data\Signatures\' + IntToStr(Random(79)) + '.png');

Form3.Label12.Caption:= Copy(Form1.StringGrid1.Cells[5, NomerStroki], 1, 2);
Form3.Label13.Caption:= Copy(Form1.StringGrid1.Cells[5, NomerStroki], 3, 2);
Form3.Label14.Caption:= Form1.StringGrid1.Cells[6, NomerStroki];

//Репаинт формы
Form3.Repaint;

//Сохранеине в файл готового изображения при помощи скриншота
bmp:=tbitmap.Create;
SendJPG:=TJPEGImage.Create;
bmp.Width:=form3.Width;
bmp.Height:=form3.Height;
BitBlt(bmp.Canvas.Handle,0,0,form3.Width,form3.Height,getdc(form3.handle),0,0,SRCCOPY);
SendJPG.Assign(bmp);
Form1.DoneImage.Picture.Assign(SendJPG);
Form1.DoneImage.Picture.SaveToFile(ClientDir + '\' + Form1.StringGrid1.Cells[5, NomerStroki] + ' ' + Form1.StringGrid1.Cells[6, NomerStroki] + '_2' + '.jpg');

//Освобождение переменных
bmp.Free;
SendJPG.Free;

//Внести данные из таблицы в лейблы
Form4.Label1.Caption:=Form1.StringGrid1.Cells[28, NomerStroki];
Form4.Label2.Caption:=Form1.StringGrid1.Cells[1, NomerStroki]; 
Form4.Label3.Caption:=Form1.StringGrid1.Cells[2, NomerStroki]; 
Form4.Label4.Caption:=Form1.StringGrid1.Cells[3, NomerStroki]; 

Form4.Label6.Caption:=Form1.StringGrid1.Cells[29, NomerStroki];
Form4.Label7.Caption:=Form1.StringGrid1.Cells[30, NomerStroki];
Form4.Label9.Caption:=Form1.StringGrid1.Cells[31, NomerStroki];

Form4.Label5.Caption:=Copy(Form1.StringGrid1.Cells[4, NomerStroki], 1, 2) + ' ' + DataRogd1 + ' ' + Copy(Form1.StringGrid1.Cells[4, NomerStroki], 7, 4) + ' года';

Form4.label1.Font.Color:=RGB(39,40,37);
Form4.label2.Font.Color:=RGB(39,40,37);
Form4.label3.Font.Color:=RGB(39,40,37);
Form4.label4.Font.Color:=RGB(39,40,37);
Form4.label5.Font.Color:=RGB(39,40,37);
Form4.label6.Font.Color:=RGB(39,40,37);
Form4.label7.Font.Color:=RGB(39,40,37);
Form4.label8.Font.Color:=RGB(39,40,37);
Form4.label9.Font.Color:=RGB(39,40,37);
Form4.label10.Font.Color:=RGB(39,40,37);

Form4.Height:=Form4.Image1.Height;
Form4.Width:=Form4.Image1.Width;

//Репаинт формы
Form4.Repaint;

//Сохранеине в файл готового изображения при помощи скриншота
bmp:=tbitmap.Create;
SendJPG:=TJPEGImage.Create;
bmp.Width:=form4.Width;
bmp.Height:=form4.Height;
BitBlt(bmp.Canvas.Handle,0,0,form4.Width,form4.Height,getdc(form4.handle),0,0,SRCCOPY);
SendJPG.Assign(bmp);
Form1.DoneImage.Picture.Assign(SendJPG);
Form1.DoneImage.Picture.SaveToFile(ClientDir + '\' + Form1.StringGrid1.Cells[28, NomerStroki] + '.jpg');

//Освобождение переменных
bmp.Free;
SendJPG.Free;

Form1.Label2.Caption:='Готово: ' + IntToStr(KolvoKlientov) + '/' + IntToStr((StrToInt(Form1.Edit2.Text)-StrToInt(Form1.Edit1.Text))+1);
Form1.Refresh;
  Form1.ProgressBar1.Position:=Progress;
  
Application.ProcessMessages;

  If OdnaStroka=(StrToInt(Form1.Edit2.Text)-StrToInt(Form1.Edit1.Text))+1 then
begin
Form1.Repaint;
Form1.Button1.Enabled:=True;
Form1.Button2.Enabled:=True;
Form1.Edit1.Enabled:=True;
Form1.Edit2.Enabled:=True;
Form1.Repaint;
end;

end;
Серёга Русич вне форума Ответить с цитированием
Старый 09.04.2017, 01:49   #14
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Серёга Русич Посмотреть сообщение
Код:
Ну ясен пень вы восприняли Application.ProcessMessages как волшебную палочку. Т.е. стоит эту строку вставить в код, как сразу всё будет "шоколадно". Но это не так.
northener вне форума Ответить с цитированием
Старый 09.04.2017, 11:56   #15
Серёга Русич
Пользователь
 
Регистрация: 11.05.2011
Сообщений: 31
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Ну ясен пень вы восприняли Application.ProcessMessages как волшебную палочку. Т.е. стоит эту строку вставить в код, как сразу всё будет "шоколадно". Но это не так.
Собственно, да. Насколько я понял - Application.ProcessMessages "показывает" пользователю уже выполненную часть кода (т.е. именно ту, что в листинге стоит до него), вот я и подумал, что поставив его в конце цикла каждый раз будет обновляться прогресс бар и лейбл с указанием количества выполненных циклов. Не пойму, в чем именно я ошибаюсь. Информацию о методе прочитал тут: http://www.delphi-manual.ru/processmessages.php и тут: http://www.delphisources.ru/pages/fa...smessages.html
Укажите, пожалуйста, в чем именно моя ошибка или же дайте ссылку на "правильное" описание метода
Серёга Русич вне форума Ответить с цитированием
Старый 08.05.2017, 21:43   #16
Серёга Русич
Пользователь
 
Регистрация: 11.05.2011
Сообщений: 31
По умолчанию

Вопрос наконец решил. Оказалось - не доглядел наименование одного их используемых файлов (который вставлялся рандомно)
Но теперь следующая беда, на 3280-3281 цикле подряд выползают 3 ошибки (скрины прикрепил):
Изображения
Тип файла: png Error.png (4.6 Кб, 36 просмотров)
Тип файла: png Error1.png (4.7 Кб, 63 просмотров)
Тип файла: png Error2.png (6.3 Кб, 59 просмотров)
Серёга Русич вне форума Ответить с цитированием
Старый 15.04.2019, 13:45   #17
Alecks
 
Регистрация: 11.06.2012
Сообщений: 6
По умолчанию

Люди, кто разобрался с этой Application.ProcessMessages в цикле?
У меня есть кнопка (ее код наведен ниже) по нажатию на которую происходит типа включение анимации на компоненте image, потом запускается цикл который должен этот анимированый обект подвинуть вправо на 130, после чего анимация на обекте останавливается. Так вот для того чтоб перемещение было по шагово, а не зависание, а потом один прыжок на 130, вставил Application.ProcessMessages, но тут началось что-то не понятное, сначала обект сдивгается на 1, а потом зависание на 20 секунд и все, дальше кнопка стает активная, но анимация не остановилась. Тоесть получается, что когда програма впервые сталкивается из Application.ProcessMessages, то цикл ганяет в пустую, не выполняя ничего, а когда выходит из цикла, то и все остальные команды в процедуре (тоесть заложеные в кнопке) тоже не выполняются.
Что делать, почему не работает?

procedure TForm4.But_RightClick(Sender: TObject);
var
i:integer;
begin
if move_acces(1,'R')=1 then
begin
form4.Pani_A.AnimationBitmap:=form4 .Pani.MultiResBitmap.Items[3].Bitmap;
form4.Pani_A.Enabled:=true;
form4.Pani_A.Start;
for I := 1 to 130 do
begin
form4.Pani.Position.X:=form4.Pani.P osition.X+1;
sleep(20);
label3.Text:=floattostr(form4.Pani. Position.X);
label4.Text:=floattostr(form4.Pani. Position.y);
Application.ProcessMessages;
end;
form4.Pani_A.Stop;
mas_pole[mas_p[1].x,mas_p[1].y]:=0;
mas_pole[mas_p[1].x+1,mas_p[1].y]:=1;
mas_p[1].x:=mas_p[i].x+1;
end
else
ShowMessage('УВАГА!'+#13+'В цьому напрямку хід не можливий!');
end;
Alecks вне форума Ответить с цитированием
Старый 15.04.2019, 14:40   #18
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Alecks Посмотреть сообщение
for I := 1 to 130 do
Выкидывайте этот цикл (вместе с кодом внутри).

добавляйте на форму таймер и в нём двигайте на нужное число точек.
на But_RightClick просто включайте таймер.
по достижении результата - просто выключайте таймер.
всё.
никаких Application.ProcessMessages не нужно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.04.2019, 17:26   #19
Alecks
 
Регистрация: 11.06.2012
Сообщений: 6
По умолчанию

Так в том то и проблема, что не хочется через таймер выключать анимацию, ибо компонент FloatAnimation прекрасно перемещает обьект по форме, но почему-то, как показывает практика, в одну сторону он двигает компонент с одной скоростью, в другую с другой, хотя все параметры устанавливаются одинаковые. Вот потом и приходится долго и нудно подбирать, для таймера, время которое уйдет на перемещение обьекта с анимацией в ту или иную сторону.
По этому и хотел схитрить с помощю простого перемещения в цикле, из периодическим прериванием на прорисовку.
Alecks вне форума Ответить с цитированием
Старый 15.04.2019, 17:32   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Alecks Посмотреть сообщение
Так в том то и проблема, что не хочется через таймер выключать анимацию
не выключайте.


Цитата:
Сообщение от Alecks Посмотреть сообщение
Вот потом и приходится долго и нудно подбирать, для таймера, время которое уйдет на перемещение обьекта с анимацией в ту или иную сторону.
По этому и хотел схитрить с помощю простого перемещения в цикле, из периодическим прериванием на прорисовку.
вместо цикла используйте таймер.
Application.ProcessMessages не нужен.


p.s. хотя, я бы задумался, зачем нужен компонент, который
Цитата:
Сообщение от Alecks Посмотреть сообщение
в одну сторону он двигает компонент с одной скоростью, в другую с другой, хотя все параметры устанавливаются одинаковые
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему прерывается работа программы после чтения их файла? Вероника99 Помощь студентам 1 26.01.2014 19:06
Как из метода X в потоке А, вызвать метод Y и чтобы он работал в потоке B ? lawliet93 C# (си шарп) 0 09.03.2013 18:16
Почему прерывается поиск в MS. Word Pavel229 Общие вопросы Delphi 0 18.07.2011 10:22
Действие lines.add не завершает свего дествия, т.е прерывается NiKiToZZ- Помощь студентам 1 13.02.2011 13:53
Поток прерывается самостоятельно Ferrum26 Общие вопросы Delphi 7 28.07.2010 15:36