PDA

View Full Version : نمایش چند frame در یک فرم



sensual_boy
پنج شنبه 08 آذر 1386, 11:24 صبح
سلام وعرض احترام خدمت اساتید محترم
من یه فرم اصلی دارم که چند Frame رو میخوام توی این فرم نمایش بدم.
به طرزی که با فشردن کلیدی ، میخوام frame دیگری نمایش داده شود
یا بهتر بگم یه frame توی فرم آوردم با چه کدی جای این frame رو با frameهای دیگه تغییر بدم

JAFO_IRAN
پنج شنبه 08 آذر 1386, 12:11 عصر
سلام

جای فریم مثل هر المان دیگری با Top و Left تعیین میشه

اما اگر میخواهی فریم را مخفی کنی و یکی دیگه رو نشون بدی میشه از Visible استفاده کنی.

ارادت

sensual_boy
پنج شنبه 08 آذر 1386, 12:14 عصر
یعنی با هیچ کدی نمیشه اونو تغییر داد؟

JAFO_IRAN
پنج شنبه 08 آذر 1386, 12:20 عصر
سلام

؟؟؟؟؟؟؟؟

هر 3 موجودی که نام بردم property فریم هستند و با کد قابل تغییر هستند.



AFrame.Left := 50;
AFrame.Visible := False;
AnotherFrame.Visible := True;

Farhads
پنج شنبه 08 آذر 1386, 12:45 عصر
سلام


frame1.SendToBack;


frame1.BringToFront;

vcldeveloper
پنج شنبه 08 آذر 1386, 19:52 عصر
یک فیلد از نوع TFrame در فرم تعریف کنید، هر زمان که خواستید فریمی را نمایش بدید، به آن نسبت بدید. مثلا:


interface

type
TFrameClass = class of TFrame;

TForm1 = class(TForm)
// Your components list
private
FActiveFrame : TFrame;
public
procedure SetActiveFrame(NewFrame: TFrameClass);
end;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.SetActiveFrame(NewFrame: TFrameClass);
begin
if Assigned(FActiveFrame) then
FreeAndNil(FActiveFrame);
FActiveFrame := NewFrame.Create(Self);
try
FActiveFrame.Parent := Panel1;
FActiveFrame.Show;
except
// Write your own exception handling code here.
end;
end;
در کد بالا، FActiveFrame به عنوان یک فیلد برای TForm1 تعریف شده. متد SetActiveFrame کلاس هر فریمی که ساختید را میگیره و با استفاده از FActiveFrame یک نمونه از آن میسازه و نمایش میده. در این کد از Panel1 به عنوان Parent فریم ها استفاده شده.
نحوه استفاده:
مثلا فرض کنیم شما کلاس فریمی درست کردید با نام TMyFrame. برای نمایش آن در Panel1 کافی هست که یونیت آن را به لیست uses از یونیتی که TForm1 در آن تعریف شده اضاف کنید و متد SetActiveFrame را فراخوانی کنید:

SetActiveFrame(TMyFrame);این کد باعث میشه که اگر از قبل فریمی در حال نمایش بوده، Free بشه و یک نمونه از TMyFrame جایگزین آن بشه.
با توجه به آنکه Owner فریم های ساخته شده Self (در اینجا برابر است با Form1) در نظر گرفته شده، با آزاد شدن Form1، فریمی هم که در در حال نمایش داده شدن است، آزاد می شود.

Hsimple11
پنج شنبه 03 مرداد 1387, 21:06 عصر
میخواستم در مورد Frame ها بیشتر بدونم. اساسا فرقی با Forms ندارند؟ بهتر بگم با استفاده زیاد و ساختن و آزاد کردن آنها و از تعداد زیادی از آنها هیچ اشکالی بوجود نمی آید؟
برای دسترسی به کنترلهای یک Frame از یونیتهای دیگر، حتما باید متغیری از کلاس مربوطه تعریف کنیم؟
چرا یونیت مربوط به اونا رو زمان استفاده در یک یونیت دیگه در کنار بقیه یونیتهای بقیه فرمها قرار نمیدیم؟

ممنونم.

vcldeveloper
جمعه 04 مرداد 1387, 02:41 صبح
Frame این قابلیت را داره که بشه از آن در فرم ها و سایر فریم ها (یعنی بصورت چند فریم داخل هم) استفاده کرده. از طرفی فریم ها را میشه بصورت کامپوننت هم ذخیره کرد تا بعدا از آنها استفاده بشه. نکته دیگه اینه که هر تغییری که در فریم بدید، بالافاصله در تمام نمونه هایی که از آن فریم در فرمها و فریم های برنامه استفاده کردید، منعکس میشه.


برای دسترسی به کنترلهای یک Frame از یونیتهای دیگر، حتما باید متغیری از کلاس مربوطه تعریف کنیم؟
متوجه نشدم منظورتون چیه، ولی دسترسی به کنترل ها و اجزاء یک فریم، دقیقا مثل دسترسی به اجزاء یک فرم در برنامه هست.


چرا یونیت مربوط به اونا رو زمان استفاده در یک یونیت دیگه در کنار بقیه یونیتهای بقیه فرمها قرار نمیدیم؟
اینم متوجه نشدم که منظورتون چیه!

Hsimple11
جمعه 04 مرداد 1387, 20:41 عصر
متوجه نشدم منظورتون چیه، ولی دسترسی به کنترل ها و اجزاء یک فریم، دقیقا مثل دسترسی به اجزاء یک فرم در برنامه هست.

شاید سوالم خیلی ساده باشه ولی چرا وقتی در فرم دیگه ای نام فریم رو مینویسیم نمیشناسه یا میخواهیم به کنترلهای اون دسترسی پیدا کنیم مثلا :

Frame1.Edit1. ....

vcldeveloper
شنبه 05 مرداد 1387, 01:19 صبح
چرا وقتی در فرم دیگه ای نام فریم رو مینویسیم نمیشناسه
باید...
1- یونیت مربوط به آن در بخش Uses آمده باشه.
2- نمونه ایی از اون Frame ساخته شده باشه.
برای فرم ها خود دلفی بطور پیش فرض همزمان با ساخت کلاس مربوطه (مثلا TForm1) یک متغیر هم از آن نوع ایجاد میکنه (مثلا Form1). ولی برای Frame ها اینطوری نیست. یا شما Frame را در زمان طراحی به فرم اضافه می کنید، که در این صورت حکم یک کامپوننت را داره و شما همونطوری که به سایر کامپوننت های یک فرم دسترسی پیدا می کنید، به فریم هم می تونید دسترسی داشته باشید. یا از Frame در Runtime استفاده می کنید، در این صورت باید خودتون یک نمونه از آن را Create کنید، مثل کاری که در پست شماره 6 همین تاپیک انجام شده.

Hsimple11
شنبه 05 مرداد 1387, 01:50 صبح
یا از Frame در Runtime استفاده می کنید، در این صورت باید خودتون یک نمونه از آن را Create کنید

با تشکر؛ من از همین روش برای ساخت Frame ها استفاده کردم و متغیر خودم رو هم (Frame1) رو از کلاس TFrame1 در بخش متغیرهای یونیت Frame1 تعریف کردم ولی وقتی میخوام از فرم دیگر به کنترلی در Frame1 دسترسی پیدا کنم (Frame1.Edit1) در زمان اجرا AV میده. Frame1 رو در متغیرهای یونیت همین فرم هم تعریف کردم باز هم...

vcldeveloper
شنبه 05 مرداد 1387, 08:19 صبح
یعنی در یونیت مربوط به TFrame1 یک بخش var ایجاد کردید و توش Frame1: TFrame1 را نوشتید؟
بعد Frame1 کجا Create میشه؟

Hsimple11
شنبه 05 مرداد 1387, 11:25 صبح
یعنی در یونیت مربوط به TFrame1 یک بخش var ایجاد کردید و توش Frame1: TFrame1 را نوشتید؟
بعد Frame1 کجا Create میشه؟

بله ولی در خود یونیت فرمی که فریم رو از توش فراخوانی میکردم هم این متغیر رو تعریف کردم ولی بازهم AV داد. چون طبق فرمایش شما وقتی در Onclick دکمه ای در یونیت فرم، فریم Create میشه نباید در یونیت خود فریم، Frame1 رو تعریف کرد ولی من هرجا تعریف کردم بازهم...


ممنون و متشکر...

Hsimple11
شنبه 05 مرداد 1387, 19:42 عصر
مشکل از محل تعریف متغیر است؟

vcldeveloper
یک شنبه 06 مرداد 1387, 03:36 صبح
مشکل از محل تعریف متغیر است؟
نه. شما فقط باید یک متغیر از نوع کلاس مربوطه تعریف کنید و قبل از استفاده ازش هم آن را Create کنید. مثل مابقی کلاس ها و کامپوننت ها. شاید مشکل از جای دیگه ایی باشه. می تونید یک نمونه سورس کد از کاری که انجام میدید و خطا دریافت می کنید، آپلود کنید؟

Hsimple11
یک شنبه 06 مرداد 1387, 12:18 عصر
بله حتما :

Hsimple11
یک شنبه 06 مرداد 1387, 20:20 عصر
مشکل از کد منه؟

vcldeveloper
یک شنبه 06 مرداد 1387, 20:47 عصر
مشکل از کد منه؟بله. شما فریم را که ساختید، آن را به ActiveFr اختصاص میدید، اما در کد Button1Click سعی می کنید به متغیر Frame2 دسترسی پیدا کنید، در حالی که Frame2 اصلا Create نشده، بجاش ActiveFr را Create کردید.
کد شما باید اینطوری میشد:

TFrame2(ActiveFr).Edit1.Text:='';دقت کنید که اون روش ساخت Frame ها در Runtime که در صفحه قبل کدش گذاشته شد، برای مواقعی که هر Frame کاملا مستقل عمل میکنه مناسب هست، چون در آنجا شما متغیر خود را با TFrame میسازید. برای دسترسی به اجزاء کلاس TFrame2 شما باید TFrame را TypeCast کنید. پس دو راه دارید:
1- Frameها را بر اساس یک کلاس واحد Create نکنید، مثلا:


procedure TForm1.ShowFrame(FrameID : integer);
var
Frame : TFrame;
begin
case FrameID of
1 : begin
Frame := TFrame1.Create(Self);
Frame.Parent := Panel1;
Frame.Show;
end;
2 : begin
Frame := TFrame2.Create(Self);
Frame.Parent := Panel1;
Frame.Show;
end;
end;

end;

2- عملکردهای مشترک فریم ها را که ممکن هست از داخل فرم اصلی استفاده شوند را در یک کلاس Frame پایه تعریف کنید، بعد Frameهای جدید را از آن کلاس مشتق بگیرید.