PDA

View Full Version : سوال: ساخت فانكشن ShowModal جديد



SayeyeZohor
دوشنبه 29 خرداد 1391, 01:26 صبح
با سلام خدمت دوستان
من يك برنامه نوشتم كه فايل هاي اجرايي رو اجرا مي كنه و Parent آن ها رو خودش قرار ميده (با استفاده از هندل آن ها)
يك مشكلي وجود داره وقتي كه Parent يك فرم يا برنامه به اين فرم اصلي من اختصاص پيدا مي كنه اگر فرم MDI يا فرزند من يك فرم رو به صورت Showmodal اجرا كنه Enable فرم MDI من False نمي شه

من يك فانكشن نوشتم كه اين كار رو انجام ميده
اما مي خوام از اين فانكشن به اين صورت استفاده بشه -- > Form3.NewShowmodal;
در صورتي كه الان به اين صورت هستش -- > NewShowModal(Form3);

خلاصه اينكه :

نحوه تبديل
NewShowModal(Form3); -- > Form3.NewShowmodal;

سورس نمونه هم گذاشتم
http://s3.picofile.com/file/7411808381/NEWShowModal.rar.html

http://up.vatandownload.com/images/z0l30zsrby0w7x50tvpx.jpg


http://up.vatandownload.com/images/t6m4qpl8dn9l4gbsw19y.jpg

Ananas
دوشنبه 29 خرداد 1391, 03:15 صبح
سلام.
ببین اینطوری میشه :

procedure TForm3.NewShowModal3;
begin
NewShowModal(Self);
end;

این تابع رو داخل کلاس فرم3 هم معرفی کن.

SayeyeZohor
دوشنبه 29 خرداد 1391, 04:44 صبح
ممنون:لبخندساده:
ولي اين درست نيست:ناراحت:
من مي خوام اين يك تابع كلي باشه
مثل خود تابع TCustomForm.ShowModal; با اين تفاوت كه فقط به جاي ShowModal از NewShowModal من استفاده بشه
يعني TCustomForm.NewShowModal;

اينم فانكشن NewShowModal من :

FUNCTION NewShowModal(FName: TCustomForm): Integer;
var
OldForm: TCustomForm;
BEGIN
OldForm := Screen.ActiveForm;
OldForm.Enabled := False;
try
FName.ShowModal;
finally
Result := FName.ModalResult;
OldForm.Enabled := True;
end;
END;

Felony
دوشنبه 29 خرداد 1391, 08:11 صبح
تو برنامتون یک فرم به نام FormNewShowModal بسازید و تابع NewShowModal تون رو به صورت Public براش تعریف کنید و کدش رو هم به صورت زیر تغییر بدید :

procedure NewShowModal: Integer;
var
OldForm: TCustomForm;
BEGIN
OldForm := Screen.ActiveForm;
OldForm.Enabled := False;
try
Self.ShowModal;
finally
Result := Self.ModalResult;
OldForm.Enabled := True;
end;
END;

حالا باقی فرم های برنامتون رو به جای اینکه از TForm مشتق کنید از FormNewShowModal مشتق کنید تا روال تعریف شده در بالا رو ازش به ارث ببرن .

SayeyeZohor
دوشنبه 29 خرداد 1391, 13:49 عصر
خيلي ممنون مجتبي جان
جهت استفاده دوستان عزيز

unit UFormNewShowModal;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TFormNewShowModal = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
FUNCTION NewShowModal: Integer;
end;

var
FormNewShowModal: TFormNewShowModal;

implementation

{$R *.dfm}

FUNCTION TFormNewShowModal.NewShowModal: Integer;
var
OldForm: TCustomForm;
BEGIN
OldForm := Screen.ActiveForm;
OldForm.Enabled := False;
TRY
Self.ShowModal;
FINALLY
Result := Self.ModalResult;
OldForm.Enabled := True;
END;
END;

end.

Felony
دوشنبه 29 خرداد 1391, 18:34 عصر
خوب سوالت چی هست ؟! میخوای این کد رو هم تو هم کلاس پدر قرار بدی ؟ تو همون بلوک Try ... Finally بعد از Self.ShowModal قرارش بده ، کدت هم باید به صورت زیر تغییر کنه :

IF Self.ModalResult = mrOk THEN ShowMessage('MrOk') ELSE ShowMessage('MrCancel');

SayeyeZohor
دوشنبه 29 خرداد 1391, 21:03 عصر
پروژه هايي كه قراره از اين فانكشن استفاده كنند زياد هستند
هر كدوم بايد باز بشند و كدهاشون تغيير كنند و دوباره كامپايل بشند
خواستم ببينم مي شه كاري كرد كه :


1- ;Use UFormNewShowModal

2- تبديل ;Form1: TForm1; به ;Form1: TFormNewShowModal

3- تبديل ;Form1.ShowModal به ;Form1.NewShowModal


چند تا از اين سه مرحله بالا رو يا همش به صورت اتوماتيك انجام بشند؟
ممنون از لطفت

SayeyeZohor
دوشنبه 29 خرداد 1391, 21:16 عصر
خوب سوالت چی هست ؟! میخوای این کد رو هم تو هم کلاس پدر قرار بدی ؟ تو همون بلوک Try ... Finally بعد از Self.ShowModal قرارش بده ، کدت هم باید به صورت زیر تغییر کنه :

IF Self.ModalResult = mrOk THEN ShowMessage('MrOk') ELSE ShowMessage('MrCancel');

سوالم اين نبود

Felony
دوشنبه 29 خرداد 1391, 21:16 عصر
در داخل IDE دلفی منو Search رو باز کنید و گزینه Replace رو انتخاب کنید ، باقی مراحل هم واضح هستند .

SayeyeZohor
دوشنبه 29 خرداد 1391, 21:30 عصر
مي دونم عزيز
تقريبا 250 تا پروژه ست
بازم ممنون

Felony
سه شنبه 30 خرداد 1391, 05:10 صبح
اگر تغییرات در تمام پروژه ها شبیه هم هست یک برنامه بنویسید فایل های پروژه ها رو باز کنه و تغییرات لازم رو اعمال کنه و توسط توابع Command Line و ارسال اون ها به کامپایلر دلفی برنامه ها رو کامپایل کنید .

SayeyeZohor
سه شنبه 30 خرداد 1391, 07:55 صبح
چه طوري كامپايل كنم با Command؟

Felony
سه شنبه 30 خرداد 1391, 08:14 صبح
پدیده ای به نام گوگل ! (http://www.google.com/search?hl=fa&q=compile+delphi+project+using+command+line&oq=compile+delphi+project+using+command+line&aq=f&aqi=&aql=&gs_l=serp.3...2826.9584.0.10055.0.0.0.0.0.0.0.0..0 .0...0.0.GZh3H9oClbE)

SayeyeZohor
پنج شنبه 08 تیر 1391, 04:19 صبح
آقا يك مشكل
وقتي فرم دومم از TFormNewShowModal مشتق ميشه ديگه نمي تونم از كامپوننت هاي فرم دومم استفاده كنم
مثال :


1- ;Use UFormNewShowModal

2- تبديل ;Form1: TForm1; به ;Form1: TFormNewShowModal

3- تبديل ;Form1.ShowModal به ;Form1.NewShowModal

4 - Form1.Button1.Caption := 'aaa';

Felony
پنج شنبه 08 تیر 1391, 08:50 صبح
یک نمونه برنامه که این مشکل رو داره قرار بدید .

SayeyeZohor
جمعه 09 تیر 1391, 02:18 صبح
دانلود يك سورس مشكل دار (http://s3.picofile.com/file/7422135692/Error_ShowNew_Modal.rar.html)

Felony
جمعه 09 تیر 1391, 04:18 صبح
لینک مشکل داره .

SayeyeZohor
جمعه 09 تیر 1391, 07:01 صبح
دانلود سورس بدون مشكل (http://barnamenevis.org/attachment.php?attachmentid=88918)

Felony
جمعه 09 تیر 1391, 07:59 صبح
اون نحوه ارث بری کاملا اشتباه هست ، فایل ضمیمه پروژه اصلاح شده هست .

برای ارث بری میتونی از منوی File و انتخاب گزینه New -> Other وارد پنجره New Items بشید و در شاخه Inheritable Items فرم مورد نظر که قراره ازش شیئی مشتق کنید رو انتخاب کنید تا به صورت خودکار این عملیات انجام بشه .

SayeyeZohor
شنبه 17 تیر 1391, 12:57 عصر
سلام
كمك فوري
يك مشكل تازه با اين فانكشن :

http://barnamenevis.org/attachment.php?attachmentid=89337

http://barnamenevis.org/attachment.php?attachmentid=89338

http://barnamenevis.org/attachment.php?attachmentid=89339

دانلود همين سورسي كه ايراد داره (http://s1.picofile.com/file/7429833010/TestShowModal.rar.html)

SayeyeZohor
شنبه 17 تیر 1391, 16:08 عصر
براي استفاده دوستان :
يكي از همكارام زحمتشو كشيدند

ببينين ايرادي نداره؟


unit UFormNShowModal;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TFormNShowModal = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
FUNCTION ShowNewModal: Integer;
end;

var
FormNShowModal: TFormNShowModal;
TaskActiveWindow: HWnd = 0;
TaskFirstWindow: HWnd = 0;
TaskFirstTopMost: HWnd = 0;
DisablingWindows: Boolean = False;

implementation

uses NewYearUnit;

{$R *.dfm}

FUNCTION TFormNShowModal.ShowNewModal: Integer;
var
OldForm:TCustomForm;
WindowList: TTaskWindowList;
LSaveFocusState: TFocusState;
SaveCursor: TCursor;
SaveCount: Integer;
ActiveWindow: HWnd;
BEGIN
OldForm := Screen.ActiveForm;
OldForm.Enabled := False;
ShowMessage(OldForm.Name);
TRY
CancelDrag;
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
ReleaseCapture;
Application.ModalStarted;
try
{ RecreateWnd could change the active window }
ActiveWindow := GetActiveWindow;
Include(FFormState, fsModal);
if (PopupMode = pmNone) and (Application.ModalPopupMode <> pmNone) then
begin
RecreateWnd;
HandleNeeded;
{ The active window might have become invalid, refresh it }
if (ActiveWindow = 0) or not IsWindow(ActiveWindow) then
ActiveWindow := GetActiveWindow;
end;
LSaveFocusState := SaveFocusState;
Screen.SaveFocusedList.Insert(0, Screen.FocusedForm);
Screen.FocusedForm := Self;
SaveCursor := Screen.Cursor;
Screen.Cursor := crDefault;
SaveCount := Screen.CursorCount;
WindowList := DisableTaskWindows(0);
try
Show;
try
SendMessage(Handle, CM_ACTIVATE, 0, 0);
ModalResult := 0;
repeat
Application.HandleMessage;
if Application.Terminated then ModalResult := mrCancel else
if ModalResult <> 0 then CloseModal;
until ModalResult <> 0;
Result := ModalResult;
SendMessage(Handle, CM_DEACTIVATE, 0, 0);
if GetActiveWindow <> Handle then ActiveWindow := 0;
finally
Hide;
end;
finally
if Screen.CursorCount = SaveCount then
Screen.Cursor := SaveCursor
else Screen.Cursor := crDefault;
EnableTaskWindows(WindowList);
if Screen.SaveFocusedList.Count > 0 then
begin
Screen.FocusedForm := TCustomForm(Screen.SaveFocusedList.First);
Screen.SaveFocusedList.Remove(Screen.FocusedForm);
end else Screen.FocusedForm := nil;
{ ActiveWindow might have been destroyed and using it as active window will
force Windows to activate another application }
if (ActiveWindow <> 0) and not IsWindow(ActiveWindow) then
// ActiveWindow := FindTopMostWindow(0);
if ActiveWindow <> 0 then
SetActiveWindow(ActiveWindow);
RestoreFocusState(LSaveFocusState);
Exclude(FFormState, fsModal);
end;
finally
Application.ModalFinished;
end;

FINALLY
Result := Self.ModalResult;
OldForm.Enabled := True;
OldForm.BringToFront;
END;
END;


function FindTopMostWindow(ActiveWindow: HWnd): HWnd;
var
EnumProc: TFNWndEnumProc; // keep a reference to the delegate!
begin
// TaskActiveWindow := ActiveWindow;
TaskFirstWindow := 0;
TaskFirstTopMost := 0;
// EnumProc := @DoFindWindow;
EnumThreadWindows(GetCurrentThreadID, EnumProc, 0);
if TaskFirstWindow <> 0 then
Result := TaskFirstWindow
else
Result := TaskFirstTopMost;
end;

function DoFindWindow(Window: HWnd; Param: LPARAM): Bool; {$IFNDEF CLR}stdcall;{$ENDIF}
begin
if (Window <> TaskActiveWindow) and (Window <> Application.Handle) and IsWindowVisible(Window) and IsWindowEnabled(Window) then
if GetWindowLong(Window, GWL_EXSTYLE) and WS_EX_TOPMOST = 0 then
begin
if TaskFirstWindow = 0 then TaskFirstWindow := Window;
end
else
begin
if TaskFirstTopMost = 0 then TaskFirstTopMost := Window;
end;
Result := True;
end;



end.

SayeyeZohor
شنبه 17 تیر 1391, 16:09 عصر
با ايده گرفتن از Showmodal خود ويندوز

SayeyeZohor
شنبه 17 تیر 1391, 16:12 عصر
دانلود سورس (http://s1.picofile.com/file/7429833010/TestShowModal.rar.html)