السلام عليكم
ارجو أن تساعدوني في حل مشكلتي
أن لا أحب البرامج التي تنبثق فيها الكثير من الفورمز Forms
لذلك قررت أن اعتمد في البرنامج الجديد الذي أعمل عليه على الإطارات الكثيرة التي أنشئها على Panel تتوسط الإطار العام للبرنامج
طبعا ليكون البرنامج خفيفا لا يمكن وضع كل الإطارات في زمن التصميم (Design -Time) والانتقال بينها بخاصية الإظهار والإخفاء (Show/Hide) بل يجب إنشائها ديناميكيا في اثناء تنفيذ البرنامج (Run Time)
المشكلة أنني أريد اضافة خاصية الرجوع إلى الإطار السابق دون فقدان البيانات المدخلة عيه (back) وذلك يوفر مرونة كبيرة للمستخدم
طبعا عدد الإطارات التي يمكن الرجوع إليها سيكون محدودا ( مثلاٌ 4 أو 5)
-----------------
لتحقيق ذلك فكرت في الاعتماد على PageControl تحتوي على أربعة Tabsheet (قمت بوضع خاصية Tabvisible إلى False)
وقمت بكتابة التالي
private
FCurrentFrame: TFrame;
procedure SetCurrentFrame(Value: TFrame);
public
property CurrentFrame: TFrame read FCurrentFrame write SetCurrentFrame;
end;
var
Form1: TForm1;
n: integer;
// Const Max_Frame_History = 3;
implementation
uses Frame01, Frame02, Frame03;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if Form1.VirtualTable1.Locate('Frame', 'Frame1', [loCaseInsensitive]) then
Form1.PageControl1.ActivePageIndex:= Form1.VirtualTable1Num.AsInteger
else
begin
Form1.CurrentFrame := TFrame1.Create(nil);
with Form1.VirtualTable1 do
begin
edit1.Text:=Inttostr(PageControl1.ActivePageIndex);
Locate('Num', PageControl1.ActivePageIndex, [loCaseInsensitive]);
edit;
VirtualTable1Frame.AsString := 'Frame1';
Post
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Form1.VirtualTable1.Locate('Frame', 'Frame2', [loCaseInsensitive]) then
Form1.PageControl1.ActivePageIndex:= Form1.VirtualTable1Num.AsInteger
else
begin
Form1.CurrentFrame := TFrame2.Create(nil);
with Form1.VirtualTable1 do
begin
Locate('Num', PageControl1.ActivePageIndex, [loCaseInsensitive]);
edit;
VirtualTable1Frame.AsString := 'Frame2';
Post
end;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Form1.VirtualTable1.Locate('Frame', 'Frame3', [loCaseInsensitive]) then
Form1.PageControl1.ActivePageIndex:= Form1.VirtualTable1Num.AsInteger
else
begin
Form1.CurrentFrame := TFrame3.Create(nil);
with Form1.VirtualTable1 do
begin
Locate('Num', PageControl1.ActivePageIndex, [loCaseInsensitive]);
edit;
VirtualTable1Frame.AsString := 'Frame3';
Post
end;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Form1.CurrentFrame := nil;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
n:=0;
end;
procedure TForm1.SetCurrentFrame(Value: TFrame);
begin
if Value <> FCurrentFrame then
begin
if assigned(FCurrentFrame) then
FreeAndNil(FCurrentFrame);
FCurrentFrame := Value;
if assigned(FCurrentFrame) then
begin
if PageControl1.ActivePageIndex = 0 then
if n=0 then
FCurrentFrame.Parent := TabSheet1
else
FCurrentFrame.Parent := TabSheet2
else if PageControl1.ActivePageIndex = 1 then
FCurrentFrame.Parent := TabSheet2
else if PageControl1.ActivePageIndex = 2 then
FCurrentFrame.Parent := TabSheet3
else if PageControl1.ActivePageIndex = 3 then
FCurrentFrame.Parent := TabSheet1;
if PageControl1.ActivePageIndex<3 then
if n=0 then
n:=1
else
PageControl1.ActivePageIndex := PageControl1.ActivePageIndex + 1
else
PageControl1.ActivePage:= TabSheet1;
FCurrentFrame.Align := alClient;
end;
end;
end;لم يعمل معي هذا الكود للأسف ولم أفهم لماذا