Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Разбивка выполнения процедуры / 25 сообщений из 33, страница 1 из 2
22.07.2020, 14:31
    #39982725
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
Давно сталкиваюсь с проблемой "разбивки" выполнения процедуры. Извинити, если буду коряво излагать свой вопрос, но мне он кажется трудным. Иногда при выполнении процедуры не все выполняется, что должно выполняться. Но если тот кусок, который не выполняется перенести в другую процедуру и запустить ее после выполнения первой прцедуры, то все выполняется. Есть ли какой нибудь способ "не разбивать" такую процедуру, что бы она вся выполнялась за один раз.
Мне кажется, хорошо иллюстрирует то, что мне надо After Show, когда OnShow не может выполнить все, что нужно и мы выполняем остаток кода After Show.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
const
  WM_AFTER_SHOW = WM_USER + 300; // custom message
  procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;
procedure someForm.FormShow(Sender: TObject);
begin
 // Что делаем, потом посылаем message
 PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
end;
procedure TMForm.WmAfterShow(var Msg: TMessage);
begin
//Довыпоняем то, что не получилось OnShow
end;
...
Рейтинг: 0 / 0
22.07.2020, 14:37
    #39982729
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
noramЕсть ли какой нибудь способ "не разбивать" такую процедуру, что бы она вся выполнялась за
один раз.

Да: запускать её только тогда, когда есть все необходимые условия для её полного выполнения.
Или опять же да: не заставлять процедуру делать больше одного дела.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.07.2020, 14:54
    #39982736
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
Хороший совет!
Прцедура сделала свое дело, пытаемся из под нее запустить другую прецедуду - не получатся. Но если запускаем другую процедуру после выполненя первой, скажем, нажатием кнопки - получается.
...
Рейтинг: 0 / 0
22.07.2020, 15:23
    #39982754
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
noram
Прцедура сделала свое дело, пытаемся из под нее запустить другую прецедуду - не получатся. Но если запускаем другую процедуру после выполненя первой, скажем, нажатием кнопки - получается.
Наверное у вас ошибка в программе. Код будет? Как не работает и как работает?

Может стоит убрать из кода конструкцию
Код: pascal
1.
2.
3.
4.
try
  ........
except
end;

?
...
Рейтинг: 0 / 0
22.07.2020, 15:30
    #39982760
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
noram
Иногда при выполнении процедуры не все выполняется, что должно выполняться

Эта фраза показывает, что Вы не контролируете происходящее в написанном Вами коде и пытаетесь "нашаманить" работающее решение, в результате чего и пришли к подобным корявостям. Для нормальной работы необходимо разобраться, что именно происходит в таких случаях. Вы пишете: не выполняется то, что должно. Здесь следует задать вопрос: почему? Это может быть:

  • по тем или иным причинам (например, из-за неправильного условия в if) выполнение не приходит на этот участок кода
  • программа доходит до этого участка кода и происходит ошибка (вылетает исключение)
  • программа доходит до этого участка кода и происходит ошибка (исключения не вылетает, а устанавливается код ошибки, возвращается false итп)
  • программа доходит до этого участка кода и таинственным образом ничего не делает (тогда надо лезть глубже и смотреть почему - например, потому что внутри ещё один if, или например она пытается послать сообщение окну, которого ещё нет, и т. д. и т. п.)
...
Рейтинг: 0 / 0
22.07.2020, 15:35
    #39982763
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
Не работает "тихо". Ни ругается, ни не ругается, просто ничего не делает.
Опять же, хорошая иллюстрация AfterShow - некоторые вещи можно сделать только после After Show.
Спасибо, но я кажется нашел решение.
Код: pascal
1.
2.
3.
4.
5.
procedure TFormMain.SomeProcedure; 
begin
  // Some code
  Timer1.Enabled := True;
end;


Может дело в ассонхронизации?
...
Рейтинг: 0 / 0
22.07.2020, 15:37
    #39982765
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
_Vasilisk_
noram
Прцедура сделала свое дело, пытаемся из под нее запустить другую прецедуду - не получатся. Но если запускаем другую процедуру после выполненя первой, скажем, нажатием кнопки - получается.
Наверное у вас ошибка в программе. Код будет? Как не работает и как работает?


А мне сдается, что ТС просто запутался в разных OnХХХХХ событиях. Навскидку - что-то пытаемся сделать с созданной, но еще не показанной формой. Вот и шлет свои дополнительные сообщения. Получается классика : PostMessage()->событие на OnХХХХ отработало-> выставились дополнительные свойства, отработало WinAPI -> поймали посланный message -> сделали то, что хотели, но не смогли в изначальном OnXXXXX обработчике.
...
Рейтинг: 0 / 0
22.07.2020, 15:41
    #39982768
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
noramНи ругается, ни не ругается, просто ничего не делает.

Так не бывает.

noramМожет дело в ассонхронизации?

Нет, проблема в прокладке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.07.2020, 15:48
    #39982775
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
DarkMaster, мне кажется, Вы правы....
...
Рейтинг: 0 / 0
22.07.2020, 16:00
    #39982783
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
Ладно, это бесполезно. Просто через несколько лет какому-нибудь бедолаге придётся переписывать уйму говнокода. Или что более вероятно, её выкинут и со словами "Какое же Дельфи говно" перепишут на C#.
...
Рейтинг: 0 / 0
22.07.2020, 20:12
    #39982836
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
Чего прицепились к человеку? Действительно, на OnShow далеко не всё можно делать, и в данном случае чтобы разобраться - надо хорошо представлять себе потроха VCL и тонкости работы с WinApi. Для большинства прикладников это не особо то и нужно
...
Рейтинг: 0 / 0
22.07.2020, 22:06
    #39982862
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
Большинству прикладников и OnShow вообще использовать не нужно. Но пытаются же. А раз
решили создавать себе приключения на пятую точку, так зачем останавливаться на
достигнутом? Само время отправляться в джунгли потрохов VCL, где много диких багов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.07.2020, 22:24
    #39982864
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
Спасибо, white nigger оксюморон за поддержку. Да, такие ситуации возникают во сновном, когда рабоаешь с WunApi. Но сегодня нашел (как мне кажется) элегантное решение - там, где программа не срабатывает, переносим этом код в таймер и, как я уже указал - Timer.Enabled := True;
Это проще, чем конструкции, которыми я пользовался в AfterSow - проще и уневирсальней....
...
Рейтинг: 0 / 0
22.07.2020, 22:48
    #39982869
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
noram
там, где программа не срабатывает, переносим этом код в таймер и, как я уже указал - Timer.Enabled := True;

Хотелось бы всё такие увидеть где именно программа не срабатывает.
Всё обсуждение - "а давайте Я угадаю, что у ТС не срабатывает"
...
Рейтинг: 0 / 0
23.07.2020, 03:13
    #39982905
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
noram
Спасибо, white nigger оксюморон за поддержку. Да, такие ситуации возникают во сновном, когда рабоаешь с WunApi. Но сегодня нашел (как мне кажется) элегантное решение - там, где программа не срабатывает, переносим этом код в таймер и, как я уже указал - Timer.Enabled := True;
Это проще, чем конструкции, которыми я пользовался в AfterSow - проще и уневирсальней....


Решение странноватое, если честно... PostMessage() выглядел как-то более элегантно.

P.S. И да - код в студию.
...
Рейтинг: 0 / 0
23.07.2020, 08:50
    #39982927
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
ОК, код в студию... Такая ситуация у меня возникает не впервые, но вот последний case.
Есть форма, которая обрамлена рамкой. Рамка рисуется в родительской форме для всех форм проекта.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TIniTemplate.setFBorder(cl : TColor);
begin
  Canvas.Pen.Color := cl;
  Canvas.Pen.Width := 2;
  Canvas.MoveTo(1,FormBar.Height);
  Canvas.LineTo(1, ClientHeight - 3);
  Canvas.MoveTo(1,ClientHeight - 3);
  Canvas.LineTo(ClientWidth, ClientHeight - 2);
  Canvas.MoveTo(ClientWidth - 2, FormBar.Height);
  Canvas.LineTo(ClientWidth - 2, ClientHeight);
end;


Есть процедура, которая динамически создает кнопки в DBGrid, причем кнопки надо переодически переписывать, в зависимости от того, в каком виде представлен DBGrid. При этой процедуре (по какой то причине) нарисованая рамка становится прерывистой - пробелы возникают напртив кнопок - некрасиво... Запускаю процедуру создания кнопок, потом вызываю setFBorder(cl : TColor), чтобы перерисовать это безобразия - ничего не происходит.. ни ругани, ни не ругани. Вызываю setFBorder через таймер, как показывал - все работает.
...
Рейтинг: 0 / 0
23.07.2020, 09:00
    #39982930
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
ЖЕСТЬ !!!
И таймер помогает прорисовать форму !!!
...
Рейтинг: 0 / 0
23.07.2020, 09:45
    #39982944
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
Dimitry Sibiryakov
Большинству прикладников и OnShow вообще использовать не нужно

Ну почему же. Довольно много операций стоит делать именно в нём. Тут, конечно, вопрос, где ты проводишь границу между "прикладниками" и не"прикладниками"...

DimaBr
ЖЕСТЬ !!!
И таймер помогает прорисовать форму !!!

Я же сказал: 22171818
А через год-другой он будет на форуме учить других.
...
Рейтинг: 0 / 0
23.07.2020, 11:06
    #39982976
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
noram,

есть

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TForm1.FormShow(Sender: TObject);
var
  s: string;
begin
  s := 'Hello world!!!';
  TThread.ForceQueue(nil,
    procedure
    begin
      ShowMessage(s);
    end
  );
end;


IDE правда гнётся из-за такого кода и для полной крректности нужно дописывать дополнение которое удалит из очереди вашу процедуру, в случае уничтожения формы
...
Рейтинг: 0 / 0
23.07.2020, 11:22
    #39982984
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
kealon(Ruslan) Спасибо за ценный совет! Класс! Работает...
...
Рейтинг: 0 / 0
23.07.2020, 12:08
    #39983009
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
softwarerТут, конечно, вопрос, где ты проводишь границу между "прикладниками" и не"прикладниками"...

"Прикладники" делают что-то полезное пользователю. "Не прикладники" делают такую вот фигню
с бордюрчиками.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.07.2020, 12:59
    #39983053
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
Дарю
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TIniTemplate.setFBorder(cl : TColor);
begin
  FColor := cl;
  Invalidate;
end;

procedure TIniTemplate.Paint;
begin
  inherited Paint;
  Canvas.Pen.Color := FColor;
  Canvas.Pen.Width := 2;
  Canvas.MoveTo(1,FormBar.Height);
  Canvas.LineTo(1, ClientHeight - 3);
  Canvas.MoveTo(1,ClientHeight - 3);
  Canvas.LineTo(ClientWidth, ClientHeight - 2);
  Canvas.MoveTo(ClientWidth - 2, FormBar.Height);
  Canvas.LineTo(ClientWidth - 2, ClientHeight);
end;
...
Рейтинг: 0 / 0
23.07.2020, 13:05
    #39983060
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
_Vasilisk_
Дарю

Ну ещё ты начни плохому учить.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TIniTemplate.Paint;
begin
  inherited Paint;
  Canvas.Pen.Color := FColor;
  Canvas.Pen.Width := 2;
  Canvas.Polyline([Point(3, FormBar.Height), Point(3, ClientHeight - 3), Point(ClientWidth - 3, ClientHeight - 3), Point(ClientWidth - 3, FormBar.Height)]);
end;
...
Рейтинг: 0 / 0
23.07.2020, 13:28
    #39983083
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
Вот так нужно рисовать
...
Рейтинг: 0 / 0
23.07.2020, 14:35
    #39983118
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка выполнения процедуры
DimaBr
Вот так нужно рисовать

Очень ленивый вариант))
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Разбивка выполнения процедуры / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]