powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Разбивка выполнения процедуры
25 сообщений из 33, страница 1 из 2
Разбивка выполнения процедуры
    #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
Разбивка выполнения процедуры
    #39982729
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noramЕсть ли какой нибудь способ "не разбивать" такую процедуру, что бы она вся выполнялась за
один раз.

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

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

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

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

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


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


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

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

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

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

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


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

P.S. И да - код в студию.
...
Рейтинг: 0 / 0
Разбивка выполнения процедуры
    #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
Разбивка выполнения процедуры
    #39982930
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖЕСТЬ !!!
И таймер помогает прорисовать форму !!!
...
Рейтинг: 0 / 0
Разбивка выполнения процедуры
    #39982944
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Большинству прикладников и OnShow вообще использовать не нужно

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

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

Я же сказал: 22171818
А через год-другой он будет на форуме учить других.
...
Рейтинг: 0 / 0
Разбивка выполнения процедуры
    #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
Разбивка выполнения процедуры
    #39982984
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan) Спасибо за ценный совет! Класс! Работает...
...
Рейтинг: 0 / 0
Разбивка выполнения процедуры
    #39983009
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerТут, конечно, вопрос, где ты проводишь границу между "прикладниками" и не"прикладниками"...

"Прикладники" делают что-то полезное пользователю. "Не прикладники" делают такую вот фигню
с бордюрчиками.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Разбивка выполнения процедуры
    #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
Разбивка выполнения процедуры
    #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
Разбивка выполнения процедуры
    #39983083
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так нужно рисовать
...
Рейтинг: 0 / 0
Разбивка выполнения процедуры
    #39983118
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr
Вот так нужно рисовать

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


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