View Full Version : سوال: ساخت فانكشن ShowModal جديد
  
SayeyeZohor
دوشنبه 29 خرداد 1391, 02: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, 04:15 صبح
سلام.
ببین اینطوری میشه :
procedure TForm3.NewShowModal3;
begin
  NewShowModal(Self);
end;
این تابع رو داخل کلاس فرم3 هم معرفی کن.
SayeyeZohor
دوشنبه 29 خرداد 1391, 05: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, 09: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, 14: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, 19:34 عصر
خوب سوالت چی هست ؟! میخوای این کد رو هم تو هم کلاس پدر قرار بدی ؟ تو همون بلوک Try ... Finally بعد از Self.ShowModal قرارش بده ، کدت هم باید به صورت زیر تغییر کنه :
 IF Self.ModalResult = mrOk THEN ShowMessage('MrOk') ELSE ShowMessage('MrCancel');
SayeyeZohor
دوشنبه 29 خرداد 1391, 22:03 عصر
پروژه هايي كه قراره از اين فانكشن استفاده كنند زياد هستند
هر كدوم بايد باز بشند و كدهاشون تغيير كنند و دوباره كامپايل بشند
خواستم ببينم مي شه كاري كرد كه :
1- ;Use UFormNewShowModal
2- تبديل ;Form1: TForm1;  به  ;Form1: TFormNewShowModal
3- تبديل ;Form1.ShowModal  به  ;Form1.NewShowModal
چند تا از اين سه مرحله بالا رو يا همش به صورت اتوماتيك انجام بشند؟
ممنون از لطفت
SayeyeZohor
دوشنبه 29 خرداد 1391, 22:16 عصر
خوب سوالت چی هست ؟! میخوای این کد رو هم تو هم کلاس پدر قرار بدی ؟ تو همون بلوک Try ... Finally بعد از Self.ShowModal قرارش بده ، کدت هم باید به صورت زیر تغییر کنه :
 IF Self.ModalResult = mrOk THEN ShowMessage('MrOk') ELSE ShowMessage('MrCancel');
 
سوالم اين نبود
Felony
دوشنبه 29 خرداد 1391, 22:16 عصر
در داخل IDE دلفی منو Search رو باز کنید و گزینه Replace رو انتخاب کنید ، باقی مراحل هم واضح هستند .
SayeyeZohor
دوشنبه 29 خرداد 1391, 22:30 عصر
مي دونم عزيز
تقريبا 250 تا پروژه ست
بازم ممنون
Felony
سه شنبه 30 خرداد 1391, 06:10 صبح
اگر تغییرات در تمام پروژه ها شبیه هم هست یک برنامه بنویسید فایل های پروژه ها رو باز کنه و تغییرات لازم رو اعمال کنه و توسط توابع Command Line و ارسال اون ها به کامپایلر دلفی برنامه ها رو کامپایل کنید .
SayeyeZohor
سه شنبه 30 خرداد 1391, 08:55 صبح
چه طوري كامپايل كنم با Command؟
Felony
سه شنبه 30 خرداد 1391, 09: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, 05:19 صبح
آقا يك مشكل
وقتي فرم دومم از TFormNewShowModal مشتق ميشه ديگه نمي تونم از كامپوننت هاي فرم دومم استفاده كنم
مثال : 
1- ;Use UFormNewShowModal
 
2- تبديل ;Form1: TForm1;  به  ;Form1: TFormNewShowModal
 
3- تبديل ;Form1.ShowModal  به  ;Form1.NewShowModal
4 - Form1.Button1.Caption := 'aaa';
Felony
پنج شنبه 08 تیر 1391, 09:50 صبح
یک نمونه برنامه که این مشکل رو داره قرار بدید .
SayeyeZohor
جمعه 09 تیر 1391, 03:18 صبح
دانلود يك سورس مشكل دار (http://s3.picofile.com/file/7422135692/Error_ShowNew_Modal.rar.html)
Felony
جمعه 09 تیر 1391, 05:18 صبح
لینک مشکل داره .
SayeyeZohor
جمعه 09 تیر 1391, 08:01 صبح
دانلود سورس بدون مشكل (http://barnamenevis.org/attachment.php?attachmentid=88918)
Felony
جمعه 09 تیر 1391, 08:59 صبح
اون نحوه ارث بری کاملا اشتباه هست ، فایل ضمیمه پروژه اصلاح شده هست .
برای ارث بری میتونی از منوی File و انتخاب گزینه New -> Other وارد پنجره New Items بشید و در شاخه Inheritable Items فرم مورد نظر که قراره ازش شیئی مشتق کنید رو انتخاب کنید تا به صورت خودکار این عملیات انجام بشه .
SayeyeZohor
شنبه 17 تیر 1391, 13: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, 17: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, 17:09 عصر
با ايده گرفتن از Showmodal خود ويندوز
SayeyeZohor
شنبه 17 تیر 1391, 17:12 عصر
دانلود سورس (http://s1.picofile.com/file/7429833010/TestShowModal.rar.html)
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.