PDA

View Full Version : سوال: عدم نمایش تب های پیج کنترل



nilidelphi
شنبه 05 فروردین 1391, 11:26 صبح
با سلام خدمت دوستان گرامی
ضمن تبریک سال نو تو این اول سالی یه سوال برام پیش اومده.
من با کد زیر به تعداد گروه هایم در دیتابیس تب شیت در پیج کنترل میسازم :


1-تب شیت ها نمایش داده نمیشوند.
2-من میخوام همه تب شیت هام همزاد تب شیت اولم باشند که بصورت دستی طراحی شده.

اینم کد ایجاد دینامیک :




procedure Tasli.FormShow(Sender: TObject);
var
PCTS: TTabSheet;
begin
dm.gruh.First;
while not dm.gruh.Eof do
begin
PCTS:=TTabSheet.Create(PageControl1);
PCTS.Create(PageControl1);
PCTS.Parent:=PageControl1;
PCTS.Name:='TAB'+ floattostr(dm.gruhgruh_id.Value);
PCTS.Caption:=dm.gruhgruh_name.Value;
PCTS.Visible:=true;
PageControl1.Repaint;
dm.gruh.Next;
end;
end;



ممنون میشم که یکی کمکم کنه
با تشکر

Felony
شنبه 05 فروردین 1391, 12:27 عصر
var
PCTS: TTabSheet;
begin
dm.gruh.First;
while not dm.gruh.Eof do
begin
PCTS := TTabSheet.Create(PageControl1);
PCTS.Create(PageControl1);
PCTS.Parent := PageControl1;
PCTS.PageControl := PageControl1;
PCTS.Name := 'TAB' + floattostr(dm.gruhgruh_id.Value);
PCTS.Caption := dm.gruhgruh_name.Value;
PCTS.Visible := true;
PCTS.TabVisible := true;
PageControl1.Repaint;
dm.gruh.Next;
end;
end;

nilidelphi
شنبه 05 فروردین 1391, 12:36 عصر
بسیار ممنون مجتبی جان
فقط نگفتی چیکار کنم که این تب شیت هایی که دینامیک ایجاد میشن همانند تب شیت اول که به صورت دستی در زمان طراحی ساختم باشند؟

Felony
شنبه 05 فروردین 1391, 13:04 عصر
به طور کلی این کار توسط متد Assign انجام میشه ، یعنی همچین کدی :

PCTS.Assign(TabSheet1);

ولی تا جایی که یادمه این متد برای TabSheet ها پیاده سازی نشده بود ؛ باید پراپرتی های مورد نظر رو تک تک داخل کد اختصاص بدید ، مثلا :

PCTS.Caption:= TabSheet1.Caption

nilidelphi
شنبه 05 فروردین 1391, 13:07 عصر
آخه دوست عزیز من داخل تب شیت اول چند تا کامپوننت دارم که میخوام مثل اولی باشن؟
یعنی راهی نیست؟

Felony
شنبه 05 فروردین 1391, 13:55 عصر
چیزی که الان به ذهنم میرسه استفاده از متد WriteComponent و ReadComponent کلاس TMemroyStream هست ؛ به وسیله متد WriteComponent اطلاعات مربوط به کنترل های داخل TabSheet مورد نظر ( Default ) رو ذخیره کنیم و بعد به وسیله متد ReadComponent کامپوننت ها رو روی TabSheet های دیگه بسازیم و اطلاعاتشون رو از MemoryStream بار کنیم ، یه نمونه کد برات نوشتم :

var
PCTS: TTabSheet;
MS: TMemoryStream;
ControlCount: Integer;
TempControl: TControl;
begin
PCTS := TTabSheet.Create(PageControl1);
PCTS.PageControl := PageControl1;
PCTS.Caption := 'Mojtaba';
PCTS.TabVisible := True;

// Save controls in memory
MS := TMemoryStream.Create;
try
for ControlCount := 0 to TabSheet1.ControlCount - 1 do
begin
RegisterClass(TPersistentClass(TabSheet1.Controls[ControlCount]
.ClassType));
MS.WriteComponent(TabSheet1.Controls[ControlCount]);
end;

// Load controls from meory
MS.Position := 0;
for ControlCount := 0 to TabSheet1.ControlCount - 1 do
begin
TempControl := TControlClass(TabSheet1.Controls[ControlCount].ClassType)
.Create(Nil);
PCTS.InsertControl(TempControl);
MS.ReadComponent(TempControl);
end;
finally
MS.Free;
end;
end;

nilidelphi
یک شنبه 06 فروردین 1391, 08:27 صبح
مجتبی جان بسیار ممنون از کمکی که کردی
دیروز خودمم از این روش استفاده میکردم که قسمت RegisterClass نمی نوشتم
امروز میخواستم بیام همین سوال رو مطرح کنم که خودت آقایی کردی و پیش دستی کردی.
آره بقول خودت اگه Assign کار نکنه نمونه سازی از کنترل ها و نوشتن از استریم کار ئرستیه.

خلاصه دستت درد نکنه.
لطف کردی.

nilidelphi
دوشنبه 07 فروردین 1391, 12:01 عصر
سلام دوباره
مجتبی جان به دادم برس.
من تو تب شیت1 که یه دونه DBGrid دارم که 2تا از Event هاشو هندل میکنم(یعنی تو 2تا از اونت های دی بیگرید کد نوشتم) حالا:
آقا من با استفاده از این روش(یعنی کپی برداری از کنترل های تب شیت اول که طراحی شده) تب شیت های بعدی رو ساختم و درست هم شد
حالا مشکل اساسی که بهش برخوردم اینه که رویداد هایی که تو دی بی گرید اول موجود در تب شیت اول نوشتم در دی بی گرید هایی که بصورت پویا ساختم اجرا نمیشن.
مشکل از کجا میتونه باشه عزیز جان؟؟؟؟؟؟؟؟

بسیار ممنون

Felony
دوشنبه 07 فروردین 1391, 13:26 عصر
توسط تابع GetMethodProp و SetMethodProp از کتابخانه RTTI میتونید Property مربوط به یک کنترل رو بخونید و یا بنویسید ، کد زیر رو الان نوشتم که به وسیله اون میتونید لیست Property های یک کنترل که از نوع Method هستند ( Event ) و بهشون کدی اختصاص داده شده رو به دست بیارید :

procedure GetProps(aObject: TObject; aList: TStringList);
var
Ctx: TRttiContext;
RttiType: TRttiType;
RttiProp: TRttiProperty;
begin
// Get all event property of given object that not nil ( assigned )
aList.Clear;
RttiType := Ctx.GetType(TObject(aObject).ClassInfo);
for RttiProp in RttiType.GetProperties do
if (RttiProp.PropertyType.TypeKind = tkMethod) and (GetMethodProp(aObject, RttiProp.Name).Code <> nil) then
aList.Add(RttiProp.Name);
end;

کد بالا رو میتونید تو یک حلقه به ازای هر کنترل روی TabSheet1 اجرا کنید و لیست Event هایی از کنترل جاری که بهشون کدی اختصاص داده شده رو پیدا کنید و توسط تابع GetMethodProp کد مربوط به اون Property رو بخونید و توسط SetMethodProp کد به دست آورده شده رو به یک کنترل دیگه اختصاص بدید .

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

این رو هم ببینید : http://delphi.about.com/library/weekly/aa110805a.htm

موفق باشید .

nilidelphi
سه شنبه 08 فروردین 1391, 09:42 صبح
مجتبی مرسی
ولی من که چیزی نفهمیدم.
من تو تب شیت اول فقط یک دی بی گیرید دارم که onDrawColumnCell و onColExit رو توش کد نوشتم.
حالا چون من از روش کپی کردن کنترل ها استفاده میکنم اسم دی بی گرید ها و تعدادشون رو نمیدونم.
خیلی لطف میکنی اگه مثال بزنی برام
چون من که نفهمیدم کد بالا چی میگه

مرسی عزیز

Felony
سه شنبه 08 فروردین 1391, 18:17 عصر
من تو تب شیت اول فقط یک دی بی گیرید دارم که onDrawColumnCell و onColExit رو توش کد نوشتم.
حالا چون من از روش کپی کردن کنترل ها استفاده میکنم اسم دی بی گرید ها و تعدادشون رو نمیدونم.
اگر تو TabSheet تون فقط همین 2 رویداد رو دارید خوب دستی رویدادها رو اختصاص بدید .


چون من که نفهمیدم کد بالا چی میگه
کد بالا اسم یک کنترل رو به همراه یک شئ که از کلاس TStringList مشتق شده باشه میگیره و لیست رویدادهایی از اون شئ که بهشون کدی اختصاص داده شده رو داخل StringList میریزه ، حالا شما تو یک حلقه تک تک اشیاء موجود تو TabSheet1 رو بهش میدید و لیست رویدادهایی از اون شئ که کدی بهش اختصاص پیدا کرده رو داخل StringList میگیرید ، حالا توسط تابع GetMethodProp میتونید کد مربوط به رویدادهایی که اسمششون رو داخل StringList دارید به دست بیارید و توسط تابع SetMethodProp این کد رو به رویداد مورد نظر یک شئ دیگه اختصاص بدید .

nilidelphi
چهارشنبه 09 فروردین 1391, 08:05 صبح
بصورت دستی اختصاص دادم ولی بازم کار نکرد.
آیا میتونید کدی که بصورت دستی هست رو برام بزاری ببینم با ماله آیا متفاوت هست یانه؟
دقیقا تو کدوم مرحله باید دستی این کار رو کرد؟؟؟
من در این مرحله انجام دادم ولی جواب نگرفتم :


MS := TMemoryStream.Create;
try
for CntrlCnt := 0 to TabSheet1.ControlCount - 1 do
begin
RegisterClass(TPersistentClass(TabSheet1.Controls[CntrlCnt].ClassType));
MS.WriteComponent(TabSheet1.Controls[CntrlCnt]);
end;
// Load controls from meory
MS.Position := 0;
for CntrlCnt := 0 to TabSheet1.ControlCount - 1 do
begin
TempControl := TControlClass(TabSheet1.Controls[CntrlCnt].ClassType).Create(Nil);
PCTS.InsertControl(TempControl);

(TempControl as TDBGrid).OnDrawColumnCell:=dbgrid1.OnDrawColumnCel l

MS.ReadComponent(TempControl);
end;
finally
MS.Free;
end;

nilidelphi
چهارشنبه 16 فروردین 1391, 08:01 صبح
از دوستان گرامي كسي نتونست به من در اين مورد كمكي كنه؟؟؟؟؟
من از آقاي تاجيك بسيار متشكرم ولي اين قسمت آخرشو نميتونم پياده سازي بكنم.
اگه ميشه يه راهنمايي هم بكنيد

nilidelphi
جمعه 18 فروردین 1391, 14:26 عصر
کسی نتونست این مشکل رو حل کنه؟؟؟؟