PDA

View Full Version : سوال: ایجاد مکث در حلقه



joooje
یک شنبه 06 آذر 1390, 17:21 عصر
سلام به همه
من با کد زیر دارم یه برنامه رو تو برنامم باز میکنم

var
H : Cardinal;
begin
Form2.Show;
ShellExecute(Handle, nil, PChar('C:\Windows\notepad.exe'), nil, nil, SW_HIDE);
H := FindWindow(nil, PChar('Untitled - Notepad'));
Windows.SetParent(H, Form2.Handle);
ShowWindow(H, SW_SHOWMAXIMIZED);
end;

خب این کد برای Notepad درست جواب میده
ولی برای بعضی برنامه ها مشکل داره
مشکلشم اینه که وقتی دستور میدم که برنامه رو باز کنه ، برنامه با تاخیر باز میشه و برنامه من دیگه پنجره ی اون رو پیدا نمیکنه که parentش کنه
حالا من میخوام یه حلقه بسازم و قبل از دستور parent چک کنم که آیا این پنجره وجود داره یا نه
و هر وقت باز شد ، دستور parent بدم
ولی نمیدونم چطور میشه تو اجرای یک حلقه مکث زمانی ایجاد کرد
یعنی برای اجرای هر بار حلقه مثلا 1 ثانیه مکث کنه
البته نمی خوام از تایمر استفاده کنم
و یا اگر راه دیگه ای برای این کار هست راهنمایی کنید
و یه سوال دیگه
آیا میشه کاری کرد که یه حلقه تا بینهایت تکرار بشه مگر اینکه خودمون اون رو متوقف کنیم
و کدی که بشه یه حلقه رو متوقف کرد وجود داره؟
ممنون از راهنماییتون

البته جستجو هم کردم
یه نفر این کد رو پیشنهاد کرده بود

for i:= 1 to 100 do begin
if(i mod 5)<>0 then Continue;
d:= d + i;
end;

ولی به نظرم کد استانداردی نبود!!

کسی گفته بود به جای For از While استفاده کنید
و من اصلا نمیدونم While چی هست و نحوه کارش چطوره
اگه در مورد این کد هم (While) راهنمایی کنید ممنون میشم

یوسف زالی
یک شنبه 06 آذر 1390, 19:34 عصر
سلام.
فکر می کنم دستورش این بود:
WaitForInputIdle(PI.hProcess, INFINITE); // delphi
باعث میشه تا برنامه پاسخ نده منتظر اجراش بمونه.
نیازی به هیچ حلقه ای نداره.
این رو زیر دستور اجرا بگذارید. (البته تو نمونه من با create process کار شده بود)
اینم مثالش:

function ExecuteProcess(const ExecuteFile : PAnsiChar): boolean;
var
PI: TProcessInformation;
SI: TStartupInfo;
begin
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(TStartupInfo);
SI.dwFlags := STARTF_USESHOWWINDOW;
SI.wShowWindow := SW_SHOWNORMAL;
Result := CreateProcess(nil, ExecuteFile, nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI);
if Result then
WaitForInputIdle(PI.hProcess, INFINITE);
end;

joooje
یک شنبه 06 آذر 1390, 19:50 عصر
سلام و ممنون
کدی که گذاشتید عمل نمیکرد
یعنی باز هم بدون منتظر بودن دستور parent اجرا میشه و بعد برنامه باز میشه
یا شایدم من بلد نبودم ازش استفاده کنم
به جای PI.hProcess که کاردینال هست چی باید بزارم؟ (چون خودش که گیر بهش میده)
ولی فکر کنم مشخصات پروسسی که شما create کردید باید باشه
حالا من چی بجاش بزارم
به جاش H و Handle رو بر اساس کد خودم گذاشتم
ولی بازم کار نداد
ممنون میشم راهنمایی کنید

یوسف زالی
یک شنبه 06 آذر 1390, 19:54 عصر
این رو در متغیر ها اضافه کرده بودم؟

PI: TProcessInformation; // delphi
SI: TStartupInfo; // delphi

اون هم در حقیقت process ID هست. نه Handle

joooje
یک شنبه 06 آذر 1390, 20:34 عصر
خب ولی من که تو کدم برای اجرا process ID ندارن
ShellExecute(Handle, nil, PChar('C:\Windows\notepad.exe'), nil, nil, SW_HIDE);

یعنی منظورتون اینه که کلا از کد پایین که نوشتید استفاده کنم؟

یوسف زالی
یک شنبه 06 آذر 1390, 20:49 عصر
به جای دستورتون از همون تابعی که گفتم استفاده کنید.

loo30fer
یک شنبه 06 آذر 1390, 21:48 عصر
برو به این تاپیک (http://barnamenevis.org/showthread.php?311429-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D9%81%D8%A7%DB%8C%D9%84-%D8%AF%D8%B1-%D9%81%D8%B1%D9%85-%28-%D8%B5%D9%81%D8%AD%D9%87-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B4%D8%AF%D9%87%29/page2)

joooje
یک شنبه 06 آذر 1390, 23:26 عصر
سلام دوست من
ممنون بابت اون لینکی که دادید
یه نمونه اونجا بود که توش از همون while استفاده شده بود و مشکل من رو حل کرد

while H = 0 do
ممنون بابت راهنماییتون