ورود

View Full Version : سوال: اجرای یک پروسیجر دقیقا بعد از اتمام یک پروسیجر دیگه



یوسف زالی
سه شنبه 11 تیر 1392, 11:17 صبح
سلام.
کد زیر رو ببینید:


procedure MainProc;
begin
DoSomething..
end;

procedure AfterProc;
begin
DoOtherSome..
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MainProc;
MainProc;
Sleep(1000);
MainProc;
Application.ProcessMessages;
MainProc;
.
.
end;



می خوام دقیقا بعد از اجرا و "بیرون آمدن از محدوده پروسیجر" مورد نظر، AfterProc ران شه.
واضحه که نمی خوام کال کردن در خود MainProc اتفاق بیفته. نمی تونم کدها رو زیر کال کردن هم استفاده کنم چون اون متد در اصل یک رویداد اینترناله که بهش دسترسی ندارم.
راهی که فعلا دارم کج دار و مریز استفاده می کنم، استفاده از یک تایمره، ولی در سرعت های بالا گند می زنه.
نمی شه مثلا با رجیسترها یا گرفتن آدرس متد ... کاری کرد که هروقت دقیقا از یک پروسیجر RetN شدیم بره سراغ کاری که ما میگیم؟

اگر می تونستم فراخوان یک پروسیجر رو در برگشت از رویدادی که آدرسش رو دارم اینجکت کنم فکر کنم مساله حل می شه.

متشکرم

Ananas
سه شنبه 11 تیر 1392, 14:55 عصر
سلام.
چرا یک تابع نمینویسی که این دو تا رو به ترتیب اجرا کنه بعد او تابع رو هر جا خواستی بجای تابع اولی استفاده کنی؟

یوسف زالی
سه شنبه 11 تیر 1392, 15:05 عصر
نه دیگه نمیشه!
ببین:
رویدادی درونی وجود داره که از سمت رابط های Com فایر می شه. دقیقا در پروسیجر فراخوان کننده این رویداد و بعد از فراخوانی دستوراتی وجود داره.


procedure DoEvent;
begin
if Assigned(FOnEvent) then
FOnEvent(Self);

DoSomething;
end;

حالا اگر کد رو در رویداد بنویسیم، کد ما بعد از FOnEvent و قبل از DoSomething اجرا خواهد شد.
این تابع هم به دلیل Private بودن قابل ارث بری و تغییرات نیست.
دنبال راهی هستم که بشه کد خودمون رو دقیقا بعد از DoSomething اجرا کنیم. یعنی با داشتن آدرس DoEvent بتونیم دقیقا بعدش یک کاری کنیم.

arash_ebrahimi_nk
سه شنبه 11 تیر 1392, 21:49 عصر
اگه فقط کارت با رجیستر و Ret راه میافته:

قبل از return یعنی دقیقا قبل از end میتونی یه push اضافه بکنی با آدرس اون پروسیجری که میخوای
مثلا
asm
push @AfterProc
end;

یوسف زالی
سه شنبه 11 تیر 1392, 22:58 عصر
نه دیگه، بعد از end باید یاشه.
دلایلش بالا گفته شد.

arash_ebrahimi_nk
چهارشنبه 12 تیر 1392, 08:56 صبح
شما میگی وقتی return شد بره به یه پروسیجر دیگه منم روشش رو گفتم

اگه نمیتونید آدرس AfterProc رو مستقیم بگیرید نام کلاسش رو هم اولش بنویسید اگه کلاسی داره (مثلا TProcClass.AfterProc) یا از هر روشی که میدونید آدرس رو بگرید و push بکنید بعد از Return برنامه از اونجا ادامه پیدا میکنه.

یوسف زالی
چهارشنبه 12 تیر 1392, 12:15 عصر
آرش جان؛ زدن نداره که!
تست می کنم حتما روشتون رو.
امیدوارم جواب کار من رو بده.
ممنون.