Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Разбивка выполнения процедуры  [new]
noram
Member

Откуда: Москва
Сообщений: 64
Давно сталкиваюсь с проблемой "разбивки" выполнения процедуры. Извинити, если буду коряво излагать свой вопрос, но мне он кажется трудным. Иногда при выполнении процедуры не все выполняется, что должно выполняться. Но если тот кусок, который не выполняется перенести в другую процедуру и запустить ее после выполнения первой прцедуры, то все выполняется. Есть ли какой нибудь способ "не разбивать" такую процедуру, что бы она вся выполнялась за один раз.
Мне кажется, хорошо иллюстрирует то, что мне надо After Show, когда OnShow не может выполнить все, что нужно и мы выполняем остаток кода After Show.
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;
22 июл 20, 14:31    [22171724]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50850

noram
Есть ли какой нибудь способ "не разбивать" такую процедуру, что бы она вся выполнялась за
один раз.

Да: запускать её только тогда, когда есть все необходимые условия для её полного выполнения.
Или опять же да: не заставлять процедуру делать больше одного дела.

Posted via ActualForum NNTP Server 1.5

22 июл 20, 14:37    [22171728]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
noram
Member

Откуда: Москва
Сообщений: 64
Хороший совет!
Прцедура сделала свое дело, пытаемся из под нее запустить другую прецедуду - не получатся. Но если запускаем другую процедуру после выполненя первой, скажем, нажатием кнопки - получается.
22 июл 20, 14:54    [22171736]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
noram
Прцедура сделала свое дело, пытаемся из под нее запустить другую прецедуду - не получатся. Но если запускаем другую процедуру после выполненя первой, скажем, нажатием кнопки - получается.
Наверное у вас ошибка в программе. Код будет? Как не работает и как работает?

Может стоит убрать из кода конструкцию
try
  ........
except
end;
?
22 июл 20, 15:23    [22171764]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62846
Блог
noram
Иногда при выполнении процедуры не все выполняется, что должно выполняться

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

  • по тем или иным причинам (например, из-за неправильного условия в if) выполнение не приходит на этот участок кода
  • программа доходит до этого участка кода и происходит ошибка (вылетает исключение)
  • программа доходит до этого участка кода и происходит ошибка (исключения не вылетает, а устанавливается код ошибки, возвращается false итп)
  • программа доходит до этого участка кода и таинственным образом ничего не делает (тогда надо лезть глубже и смотреть почему - например, потому что внутри ещё один if, или например она пытается послать сообщение окну, которого ещё нет, и т. д. и т. п.)

Запомните: если код не работает - не надо пытаться поменять его по принципу "авось так заработает". Надо разобраться, понять что происходит неправильно, и менять его, имея ясную картину происходящего. Тогда у Вас просто не останется причин задавать такие вопросы.
22 июл 20, 15:30    [22171773]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
noram
Member

Откуда: Москва
Сообщений: 64
Не работает "тихо". Ни ругается, ни не ругается, просто ничего не делает.
Опять же, хорошая иллюстрация AfterShow - некоторые вещи можно сделать только после After Show.
Спасибо, но я кажется нашел решение.
procedure TFormMain.SomeProcedure; 
begin
  // Some code
  Timer1.Enabled := True;
end;

Может дело в ассонхронизации?
22 июл 20, 15:35    [22171782]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6353
_Vasilisk_
noram
Прцедура сделала свое дело, пытаемся из под нее запустить другую прецедуду - не получатся. Но если запускаем другую процедуру после выполненя первой, скажем, нажатием кнопки - получается.
Наверное у вас ошибка в программе. Код будет? Как не работает и как работает?


А мне сдается, что ТС просто запутался в разных OnХХХХХ событиях. Навскидку - что-то пытаемся сделать с созданной, но еще не показанной формой. Вот и шлет свои дополнительные сообщения. Получается классика : PostMessage()->событие на OnХХХХ отработало-> выставились дополнительные свойства, отработало WinAPI -> поймали посланный message -> сделали то, что хотели, но не смогли в изначальном OnXXXXX обработчике.
22 июл 20, 15:37    [22171785]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50850

noram
Ни ругается, ни не ругается, просто ничего не делает.

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

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

Нет, проблема в прокладке.

Posted via ActualForum NNTP Server 1.5

22 июл 20, 15:41    [22171789]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
noram
Member

Откуда: Москва
Сообщений: 64
DarkMaster, мне кажется, Вы правы....
22 июл 20, 15:48    [22171802]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62846
Блог
Ладно, это бесполезно. Просто через несколько лет какому-нибудь бедолаге придётся переписывать уйму говнокода. Или что более вероятно, её выкинут и со словами "Какое же Дельфи говно" перепишут на C#.
22 июл 20, 16:00    [22171818]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2367
Чего прицепились к человеку? Действительно, на OnShow далеко не всё можно делать, и в данном случае чтобы разобраться - надо хорошо представлять себе потроха VCL и тонкости работы с WinApi. Для большинства прикладников это не особо то и нужно
22 июл 20, 20:12    [22171948]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50850

Большинству прикладников и OnShow вообще использовать не нужно. Но пытаются же. А раз
решили создавать себе приключения на пятую точку, так зачем останавливаться на
достигнутом? Само время отправляться в джунгли потрохов VCL, где много диких багов.

Posted via ActualForum NNTP Server 1.5

22 июл 20, 22:06    [22171995]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
noram
Member

Откуда: Москва
Сообщений: 64
Спасибо, white nigger оксюморон за поддержку. Да, такие ситуации возникают во сновном, когда рабоаешь с WunApi. Но сегодня нашел (как мне кажется) элегантное решение - там, где программа не срабатывает, переносим этом код в таймер и, как я уже указал - Timer.Enabled := True;
Это проще, чем конструкции, которыми я пользовался в AfterSow - проще и уневирсальней....
22 июл 20, 22:24    [22171998]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
DimaBr
Member

Откуда:
Сообщений: 11808
noram
там, где программа не срабатывает, переносим этом код в таймер и, как я уже указал - Timer.Enabled := True;

Хотелось бы всё такие увидеть где именно программа не срабатывает.
Всё обсуждение - "а давайте Я угадаю, что у ТС не срабатывает"
22 июл 20, 22:48    [22172008]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6353
noram
Спасибо, white nigger оксюморон за поддержку. Да, такие ситуации возникают во сновном, когда рабоаешь с WunApi. Но сегодня нашел (как мне кажется) элегантное решение - там, где программа не срабатывает, переносим этом код в таймер и, как я уже указал - Timer.Enabled := True;
Это проще, чем конструкции, которыми я пользовался в AfterSow - проще и уневирсальней....


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

P.S. И да - код в студию.
23 июл 20, 03:13    [22172069]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
noram
Member

Откуда: Москва
Сообщений: 64
ОК, код в студию... Такая ситуация у меня возникает не впервые, но вот последний case.
Есть форма, которая обрамлена рамкой. Рамка рисуется в родительской форме для всех форм проекта.
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 через таймер, как показывал - все работает.
23 июл 20, 08:50    [22172098]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
DimaBr
Member

Откуда:
Сообщений: 11808
ЖЕСТЬ !!!
И таймер помогает прорисовать форму !!!
23 июл 20, 09:00    [22172101]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62846
Блог
Dimitry Sibiryakov
Большинству прикладников и OnShow вообще использовать не нужно

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

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

Я же сказал: 22171818
А через год-другой он будет на форуме учить других.
23 июл 20, 09:45    [22172120]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6017
noram,

есть

procedure TForm1.FormShow(Sender: TObject);
var
  s: string;
begin
  s := 'Hello world!!!';
  TThread.ForceQueue(nil,
    procedure
    begin
      ShowMessage(s);
    end
  );
end;

IDE правда гнётся из-за такого кода и для полной крректности нужно дописывать дополнение которое удалит из очереди вашу процедуру, в случае уничтожения формы

Сообщение было отредактировано: 23 июл 20, 11:07
23 июл 20, 11:06    [22172174]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
noram
Member

Откуда: Москва
Сообщений: 64
kealon(Ruslan) Спасибо за ценный совет! Класс! Работает...
23 июл 20, 11:22    [22172183]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50850

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

"Прикладники" делают что-то полезное пользователю. "Не прикладники" делают такую вот фигню
с бордюрчиками.

Posted via ActualForum NNTP Server 1.5

23 июл 20, 12:08    [22172221]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
Дарю
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;
23 июл 20, 12:59    [22172276]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62846
Блог
_Vasilisk_
Дарю

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

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;


Сообщение было отредактировано: 23 июл 20, 13:03
23 июл 20, 13:05    [22172283]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
DimaBr
Member

Откуда:
Сообщений: 11808
Вот так нужно рисовать

К сообщению приложен файл. Размер - 20Kb
23 июл 20, 13:28    [22172313]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выполнения процедуры  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 348
DimaBr
Вот так нужно рисовать

Очень ленивый вариант))
23 июл 20, 14:35    [22172373]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить