السلام عليكم
اود من اصحاب الخبرة ان يبينو ا الفرق بين هذين الكودين:
كفكرة عامة عندي فورم رئيسي وفورم ثانوي
عند استدعاء الفورم الثانوي من الفورم الرئيسي بواسطة زر مثلا سيظهر الفورم الثانوي والذي يحوي
عددا من اللافتات ومربعات الادخال (ايديت) وزر الاغلاق وزر اوكي!! طبعا عددها غير معروف الا عند لحظة انشاء الفورم الثانوي ولنتخيل العدد هو من اختيار المستخدم في الفورم الرئيسي وعند اختيار العدد يوضع ضمن متحول عام فوق الامبلمنتيشن ليراه الفورم الثانوي
السؤال هو التالي :
ما هو الفرق تماما جدا بين الطريقتين التاليتين:
اولا :
اعمل الفورم الثانوي في زمن التصميم وبه مثلا 100 لافتة (هو الحد الاعلى لدى المستخدم اي اصلا لا يستطيع المستخدم اختيار اكبر من ذلك)
وكذلك 100 ايديت وزرين واضع كلللللل الاحداث اللازمة
للعلم انا اهتم باحداث onkeypress onkeydown
طبعا كل الافتات والايديتات مخفية !!!
عند كبس زر ما في الفورم الاساسي انشئ لبفورم الثانوي اي
application.createform(tform2,form2);
وفي حدث الكرييت له ارى المتحول كم قيمته مثلا 30 فاجعل 30 لا فتة و30ايدت ظاهرة واضبط مكان الزرين اوكي واغلاق واظبط حجم الفورم الثانوي!!!
وعند الانتهاء من الفورم الثانوي وعند اغلاقه او ضغط اوكي اعمل له كلوز
وفي حدث الكلوز اضع action:= cafree
هذه الطريقة الاولى والتي افضلها (لكن هي غبية بعض الشيئ ) المهم انها من ناحية الذاكرة انشات الفورم ليس عند اقلاع البرنامج وايضا عند اغلاق الفورم حررته من الذاكرة فهل عليها اشكال؟؟؟؟
الطريقة الثانية هي التالي وهذا كودها (صراحة هي احترافية اكثر لكن معقدة بلا طعمة اقصد ما في داعي للتعقيد ما دامت الاولى متوفرة!!!)
انشات فورم اساسي فقط عند اقلاع البرنامج وعند ضغط الزر انشات الفورم الثانوي
لكن في زمن التنفيذ انشات الثانوي ب
application.createform(tform2,form2)
عليه فقط زرين اغلاق واوكي اما الافتات والاديتات فبالشكل التالي انشاتها:
هذا الكود الكلي للفورم او الوحدة الثانوية
unit fmDifferentSMS
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfmDifferentSMS = class(TForm)
btOK: TButton;
lbMsgLength: TLabel;
btCancel: TButton;
Label3: TLabel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure btOKClick(Sender: TObject);
procedure btCancelClick(Sender: TObject);
procedure TheEditChange(Sender: TObject); //لاحظ هذا الاجراء
procedure TheEditEnter(Sender: TObject); //لاحظ هذا الاجراء
procedure TheEditKeyPress(Sender: TObject; var Key: Char); //لاحظ هذا الاجراء
procedure TheEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); //لاحظ هذا الاجراء
procedure FormShow(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmDifferentSMS: TfmDifferentSMS;
implementation
uses UntSendSMS; //الفورم الاساسي
{$R *.dfm}
function ShowStatus(Sender: TEdit): String;
var
CharNum, MsgNum: Integer;
begin
CharNum:= Length(Sender.Text) mod 43;
MsgNum:= (length(Sender.Text) div 43)+ 1;
if (CharNum= 0) and (Sender.Text <> '') then CharNum:= 43;
if (Length(Sender.Text) mod 43)= 0 then MsgNum:= MsgNum- 1;
if (Sender as TEdit).Text= '' then MsgNum:= 1;
Result:= inttostr(CharNum)+ ' of 43 Char(s) '+ inttostr(MsgNum)+ ' Message(s) '+(fmDifferentSMS.FindComponent('lb'+ copy((Sender as TEdit).Name, 3, 2)) as TLabel).Caption;
end;
procedure TfmDifferentSMS.TheEditChange(Sender: TObject);
begin
lbMsgLength.Caption:= ShowStatus(Sender as TEdit);
end;
procedure TfmDifferentSMS.TheEditEnter(Sender: TObject);
begin
lbMsgLength.Caption:= ShowStatus(Sender as TEdit);
end;
procedure TfmDifferentSMS.TheEditKeyPress(Sender: TObject; var Key: Char);
begin
if (Key= #13) or (Key= #27) then
Key:= #0;
end;
procedure TfmDifferentSMS.TheEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
ob: TObject;
begin
if Key= 13 then
begin
ob:= FindComponent('ed'+ inttostr(strtoint(copy(TEdit(Sender).Name, 3, 2))+ 1)); //لاحظ هذا التعقيد!!
if ob <> nil then
begin
(ob as TEdit).SetFocus;
(ob as TEdit).SelectAll;
end else begin
btOK.SetFocus;
btOkClick(btOk);
end;
end;
end;
procedure TfmDifferentSMS.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:= caFree;
end;
procedure TfmDifferentSMS.FormCreate(Sender: TObject);
var
i: Integer;
ed: TEdit;
lb: TLabel;
begin
for i:= 0 to CounterMob- 1 do
begin
lb:= TLabel.Create(Self);
lb.Parent:= Self;
lb.Top:= 34+ (i* 26);
lb.Left:= 10;
lb.Caption:= 'To: '+ SendTo;
lb.Name:= 'lb'+ IntToStr(i);
ed:= TEdit.Create(Self);
ed.Parent:= self;
ed.Top:= 30+ (i* 26);
ed.Left:= 135;
ed.Width:= 325;
ed.Name:= 'ed'+ IntToStr(i);
ed.Text:= '';
ed.OnChange:= TheEditChange;
ed.OnEnter:= TheEditEnter;
ed.OnKeyPress:= TheEditKeyPress;
ed.OnKeyDown:= TheEditKeyDown;
end;
btOk.Left:= 170;
btOk.Top:= 35+ (CounterMob* 26);
btCancel.Left:= 255;
btCancel.Top:= 35+ (CounterMob* 26);
end;
procedure TfmDifferentSMS.btOKClick(Sender: TObject);
var
i: Integer;
tmp: String;
CorrectCounterMessage: Integer;
begin
for i:= 0 to 99 do
Msg:= '';
CounterMsg:= 0;
CorrectCounterMessage:= 0;
for i:= 0 to CounterMob- 1 do
begin
tmp:= (FindComponent('ed'+ inttostr(i)) as TEdit).Text;
if tmp= '' then
begin
//any thing
end;
end; //for
if CorrectCounterMessage > 100 then
begin
MessageDlg('You can send 100 messages maximum!'#13'Every one 43 char(s) maximum!', mtError, [mbOK], 0);
Exit;
end;
if MessageBox(fmDifferentSMS.Handle, PChar('You will send '+ inttostr(CorrectCounterMessage)+ ' message(s) to different mobile(s) number.'), 'Confirmation', MB_OKCANCEL)= ID_CANCEL then
Exit;
Close;
end;
procedure TfmDifferentSMS.btCancelClick(Sender: TObject);
var
i: integer;
begin
for i:= 0 to 99 do
Msg:= '';
Close;
end;
procedure TfmDifferentSMS.FormShow(Sender: TObject);
begin
(FindComponent('ed0') as TEdit).SetFocus; //لاحظ هذا
end;
procedure TfmDifferentSMS.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var
i: integer;
begin
if (Sender as TForm).Name <> 'fmDifferentSMS' then
for i:= 0 to 99 do
Msg:= '';
CanClose:= true;
end;
procedure TfmDifferentSMS.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key= #27 then
Key:= #0;
end;
end.هل الطريقتان بينهما اختلاف من ناحية ادارة الذاكرة؟؟؟؟
ان كان لا فانا افضل الطريقة الاولى!!!!
ارجو ممن لديه الخبرة الادلاء برايه
وسؤال على الهامش لماذ عند صنع برنامج فقط فورم اي افتح الدلفي ثم اضغط اف 9 ساجد ان حجم تالبرنامج بالذاكرة من البروسس حوالي 3 ميغا !!! وهو ضخم جدا جدا
كيف اخفف الحجم بالذاكرة ؟؟؟
ان كان يحتاج تفصيل ممكن وضعه بمشاركة مستقلة لتعم الفائدة
وشكرا لكم مقدما