PDA

View Full Version : ساختtabsheet جدید با مشخصات tabsheet قبلی با زدن یه button



djscsi
سه شنبه 18 تیر 1387, 03:00 صبح
اقا من میخام مثلا با click رو یه button یه tabsheet جدید با هر انچه که در tabsheet قبلی هست ساخته بشه مثلا روی قبلی یه button و یه edit و یه .... هست من میخام با click روی اون button یه tabsheet جدید با همون چیزا که در tabsheet قبلی هست ساخته بشه با همون مشخصات
ممنون

amin_alexi
سه شنبه 18 تیر 1387, 10:11 صبح
سلام من یه چیزی دستپاشکسته واست نوشتم ... ببین بدردت می خوره !

procedure TForm1.Button2Click(Sender: TObject);
Var
tab2:TTabSheet;
I:integer;
Edt:TEdit;
begin
tab2:= TTabSheet.Create(PageControl1);
tab2.PageControl:=PageControl1;
tab2.Name:='sheet2';
tab2.Caption:='sheet2_cap';
PageControl1.ActivePage:=tab2;
For I:=0 to ComponentCount-1 Do
Begin
If (Components[I] is TEdit) Then
If (Components[I] as TEdit).parent=TabSheet1 Then
Begin
Edt:=TEdit.Create(tab2);
Edt.Parent:=tab2;
End;
End;
end;

حالا اگه Botton هم باشه خودت اضافه کن ...

Hsimple11
سه شنبه 18 تیر 1387, 12:21 عصر
فقط دیگر نیازی به چک کردن اینکه کامپوننتها Edit هستند ندارید. چون تمام کنترلهای قرار است ساخته شوند.

djscsi
سه شنبه 18 تیر 1387, 13:33 عصر
ممنون دوست عزیز ولی این فقط یک بار این کارو انجام میده من میخام برای هر چند بار این کار تکرار بشه ممنون میشم کمکم کنید

If (Components[i] is TEdit) Then
If (Components[i] as TEdit).parent=TabSheet1 Then
Begin
Edt:=TEdit.Create(tab2);
Edt.Parent:=tab2;
End;
End;
اینو که شما گفتید برای edit بود برای webbrowser چطور ؟
ممنون

Hsimple11
سه شنبه 18 تیر 1387, 19:25 عصر
If (Components[i] is TEdit) Then را حذف کنید.
در مورد سوال دوم :
شما این ساخت سایر کنترلها را فقط برای Button2 نوشته اید. یک پروسیجر تعریف کنید که برای هر دکمه ای که ساخته میشود این کدها تکرار شود. در واقع دکمه ها را بر مبنای روال مشخصی بسازید و به آنها Name های مشخصی بدهید مثلا Btn1، Btn2،...

djscsi
سه شنبه 18 تیر 1387, 21:23 عصر
If (Components[i] is TEdit) Then را حذف کنید.
در مورد سوال دوم :
شما این ساخت سایر کنترلها را فقط برای Button2 نوشته اید. یک پروسیجر تعریف کنید که برای هر دکمه ای که ساخته میشود این کدها تکرار شود. در واقع دکمه ها را بر مبنای روال مشخصی بسازید و به آنها Name های مشخصی بدهید مثلا Btn1، Btn2،...

شاید سوال رو بد پرسیدم من منظورم این بود که به جای edit من میخام webbrowser باشه من این کد رو نوشتم ارور داد ببین شما می تونی کاری کنی
من به جای

If (Components[i] is TEdit) Then
If (Components[i] as TEdit).parent=TabSheet1 Then
Begin
Edt:=TEdit.Create(tab2);
Edt.Parent:=tab2;
End;
End;
نوشتم

If (Components[i] is twebbrowser) Then
If (Components[i] as twebbrowser).parent=TabSheet1 Then
Begin
web:=twebbrowser.Create(tab2[j]);
web.Parent:=tab2[j];
End;
که ارور داد

Hsimple11
سه شنبه 18 تیر 1387, 21:57 عصر
ممنون دوست عزیز ولی این فقط یک بار این کارو انجام میده من میخام برای هر چند بار این کار تکرار بشه ممنون میشم کمکم کنید

مگه این سوال اول شما نبود؟

در مورد سوال دومتان ببینید متغیر Web را از نوع TWebBrowser تعریف کرده اید.
TWebBrowser Parent شما Tabsheet1 هست؟
[tab2[jچیست؟ Tabsheet بعدی شما؟؟

djscsi
چهارشنبه 19 تیر 1387, 00:23 صبح
ممنون جواب سوال اول رو خودم پیدا کردم یه ارایه تعریف کردم با اندیس j همون[tab[j که دیدید

در مورد سوال دومتان ببینید متغیر Web را از نوع TWebBrowser تعریف کرده اید.منم همین کارو کردم

TWebBrowser Parent شما Tabsheet1 هست؟مشکل همینجاست خط 2و 5
[QUOTE]If (Components[i] is twebbrowser) Then
If (Components[i] as twebbrowser).parent=TabSheet1 Then
Begin
web:=twebbrowser.Create(tab2[j]);
web.Parent:=tab2[j];
End;[/QUOTE
]

Hsimple11
چهارشنبه 19 تیر 1387, 13:09 عصر
If (Components[i] as twebbrowser).parent=TabSheet1 Then
شما در شرط خود تنها زمانی WebBrowser بعدی را میسازید که Parent آن Tabsheet1 شما باشد.
مسلما برای کنترل بعدی دیگر Parent شما Tabsheet1 نیست. در واقع شما باید در هر مرحله WebBrowser ای را بسازید که Parent آن مثلا [Tab2[j-1 بوده و Parent WebBrowser شما [Tab2[j باشد. در ضمن باید Parent شما قبل از اجرای این دستور وجود داشته باشد.

جدا از این ، چه نیازی به چک کردن دارید؟ در پست اولتان گفته بودید که تمام کنترلهایی که در Tabsheet هستند را میخواهید در بعدی بسازید. پس نیازی به چک کردن این موارد ندارید.

djscsi
چهارشنبه 19 تیر 1387, 17:32 عصر
مسلما برای کنترل بعدی دیگر Parent شما Tabsheet1 نیست. در واقع شما باید در هر مرحله WebBrowser ای را بسازید که Parent آن مثلا [Tab2[j-1 بوده و Parent WebBrowser شما [Tab2[j باشد. در ضمن باید Parent شما قبل از اجرای این دستور وجود داشته باشد.
بله این دقیقا همون کاریه که میخام بکنم یعنی parent اون web (که از نوع twebbrowser تعریف کردم)tabsheet تعریف کنم ارور میده چه طور این کارو کنم؟بهتر بگم این خط درستش چطوری میشه؟

web.Parent:=tab2[j];

Hsimple11
چهارشنبه 19 تیر 1387, 20:30 عصر
پست قبل را با دقت بخوانید.

djscsi
پنج شنبه 20 تیر 1387, 00:28 صبح
شما هم یه نگاه به 2 پست اخر من بنداز شم تو پست قبلی فقط گفتی چه کار کن در حالی که خودمم میخام همون کارو کنم ولی نمیشه لطفا پست قبلی منو یه بار دیگه بخون من درست اون کد رو می خام
ممنون

Hsimple11
پنج شنبه 20 تیر 1387, 01:40 صبح
گفتم پست قبل را با دقت بخوانید،
جواب شما داده شده بود :

Tabsheet مثلا [Tab2[j شما در ابتدا ساخته می شود و به آن یک نام نسبت میدهید. کد چک Parent Tabsheet خود نام Tabsheet ای را بدهید که کنترل شما در حال حاضر بر روی آن واقع است نه Tabsheet ای که در حال حاضر ساخته اید. یعنی در مثال بالا اگر [Tab2[j را ساخته اید [1-Tab2[j را به عنوان Parent چک کنید. در ضمن Name های خود را هم Unique بسازید.

سوال : در مورد Tab2 آن را به چه صورت آرایه تعریف کرده اید؟

djscsi
پنج شنبه 20 تیر 1387, 19:17 عصر
اقا اینایی رو که میگی کدشو بزار تا بفهمم مکنظورت چیه
شما یه نگا به این بنداز ببین درستش چیه و کجاش ایراد داره فقط خاهش میکنم کد درستشو بزار نه این که بگو این کارو بکن اون کارو بکن من اگه می دونستم که اصلا این سوال رو مطرح نمی کردم
ممنون

procedure TForm1.ab1Click(Sender: TObject);
Var
tab2:array [1..100] of TTabSheet;
I:integer;
Edt:Tedit;web:twebbrowser;
begin
tab2[j]:= TTabSheet.Create(PageControl1);
tab2[j].ImageIndex:=4;
tab2[j].PageControl:=PageControl1;
tab2[j].Caption:='untitled'+inttostr(j);
PageControl1.ActivePage:=tab2[j];
For I:=0 to ComponentCount-1 Do
Begin
If (Components[i] is twebbrowser) Then
If (Components[i] as twebbrowser).parent=TabSheet1 Then
Begin
web:=twebbrowser.Create(tab2[j]);
web.Parent:=tab2[j];
End;
End;
j:=j+1;

end;

سوال : در مورد Tab2 آن را به چه صورت آرایه تعریف کرده اید؟
ا ; tab2:array [1..100] of TTabSheet

Hsimple11
جمعه 21 تیر 1387, 15:04 عصر
شما متغیری با عنوان Tab2 را از کلاس TTabsheet تعریف کرده اید اما تا زمانی که خصوصیت آرایه بودن را برای آن تعریف نکنید نمیتوانید از آن مانند آرایه استفاده کنید و به آن اندیس دهید. در واقع بایستی یک کلاس بسازید و یک Property بصورت آرایه در آن تعریف کنید. این کار باعث میشود زمانی که میخواهید یک نمونه از کلاس خود را بسازید بتوانید به آن ویژگیهای آرایه بودن را نسبت دهید.
چون این سایت برای راهنمایی بیشتر است تا گذاشتن کد جستجو کنید اگر موفق نشدید بفرمایید تا در پست بعد کدش را برایتان بنویسم.

djscsi
جمعه 21 تیر 1387, 23:26 عصر
چون این سایت برای راهنمایی بیشتر است تا گذاشتن کد جستجو کنید اگر موفق نشدید بفرمایید تا در پست بعد کدش را برایتان بنویسم.

عزیز من شما خودت میبینی که چند روز الاف اینم خوب اگه من کدشو بدست اورده بودم که دیگه اینجا پست نمیدادم حالا اگه میشه شما لطف کن و کدشو بنویس
ممنون

Hsimple11
شنبه 22 تیر 1387, 02:30 صبح
چیزی به غیر از توضیحات قبل نیست.


type
MyTab = array[1..100] of TTabSheet;
Var
Tab2 : MyTab;
.
.
.

procedure TForm1.ab1Click(Sender: TObject);
Var
I,J : Integer;
Web : TWebBrowser;
begin
J:=2;
Tab2[J]:= TTabSheet.Create(PageControl1);
Tab2[J].PageControl:=PageControl1;
PageControl1.ActivePage:=Tab2[J];
For I:=0 to ComponentCount-1 Do
Begin
If (Components[I] is TWebBrowser) Then
If (Components[I] as TWebBrowser).parent=Tab2[J-1] Then
Begin
Web := TWebBrowser.Create(Tab2[J]);
Web.Parent:=Tab2[J];
End;
End;
Inc(J);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Tab2[1]:=TabSheet1;
end;

djscsi
شنبه 22 تیر 1387, 14:26 عصر
ممنون hisimple11 جان ولی مشکل درست همین جاست یه نگا به عکس بنداز اون 2 تا خطی که نشون دادم با قرمز همونا ارور میدن ارورها هم تو کادر زرد اوردم
http://i37.tinypic.com/256zp5t.jpg

Hsimple11
شنبه 22 تیر 1387, 17:30 عصر
دوست گرامی
دلیل این خطا این است که خاصیت Parent یک کنترلی که از قبل ساخته شده قابل تغییر دادن نیست (Readonly). و فقط زمانی که کنترل خود را در زمان اجرا میسازیم میتوانیم Parent آنرا تعیین کنیم. این کد برای بار اول درست کار میکند اما دلیل خطا آن است که شما بایستی متغیر Web را نیز بصورت آرایه تعریف کنید تا برای هر دفعه و Tabsheet های بعدی نیز تغییر کند. درواقع web شما بار اول ساخته میشود و در tabsheet بعدی دیگر نمیتوان Parent آنرا تغییر داد.
Web را بصورت آرایه تعریف کنید که هربار در هر Tabsheet که ساخته میشود یک شماره به آن اضافه شود و این کد را به این صورت تغییر دهید :


Web[a].parent:=tab2[j]

djscsi
یک شنبه 23 تیر 1387, 00:08 صبح
procedure TForm1.ab1Click(Sender: TObject);
Var
I,j: Integer;
Web: array [1..100]of TWebBrowser;
begin
J:=2;
Tab2[J]:= TTabSheet.Create(PageControl1);
Tab2[J].PageControl:=PageControl1;
Tab2[j].ImageIndex:=4; Tab2[j].Caption:='untitled'+inttostr(j);
PageControl1.ActivePage:=Tab2[J];
For I:=0 to ComponentCount-1 Do
Begin
If (Components[i] is TWebBrowser) Then
If (Components[i] as TWebBrowser).parent=Tab2[J-1] Then
Begin
Web[j] := TWebBrowser.Create(Tab2[J]);
Web[j].parent:=Tab2[J];
End;
End;
Inc(J);
end;
ممنون ولی بازم همون ارورها رو داد

Hsimple11
یک شنبه 23 تیر 1387, 01:25 صبح
برای اولین بار Error میدهد یا دفعات بعد؟
کد من یه اشکال کوچیک داشت و اون اینکه J:=2 را باید جابجا کنید. میتوانید آن را در قسمت متغیرهای کل برنامه تعریف کنید و مساوی 2 قرار دهید :


var
Form1: TForm1;
J : Integer = 2;

djscsi
یک شنبه 23 تیر 1387, 23:51 عصر
سوالتون رو نفهمیدم ولی هم بار اول و هم دفعه های بعدی ارور میده و اصلا کامپایل نمیشه درست تو این خطها
//If (Components[i] as TWebBrowser).parent=Tab2[J-1] Then
// Web[j].parent:=Tab2[J];
درست همون ارورها که تو پست قبلی عکسو گذاشته بودمو میدن ارور اول برای خط اولی و ارور دوم برای خط دومی

Hsimple11
دوشنبه 24 تیر 1387, 02:29 صبح
من این کد را امتحان نکرده بودم. مشکل شما در WebBrowser است. این کنترل همانند Edit یا... Parent ای از نوع TWinControl ندارد. در واقع WebBrowser یک Automation Object است (Automation به توانایی یک برنامه یا کنترل -Automation Object-اطلاق میشود که بتواند در برنامه دیگری نیز علاوه بر برنامه ای که در آن قرار دارد عمل کند) و برای اینکار به یک واسط (Interface) نیاز دارد. از طریق این واسط متدها و خصوصیات آن در اختیار برنامه های دیگر نیز قرار میگیرد.


PageControl1.Pages[PageControl1.ActivePageIndex].Free;
with TWebBrowser.Create(Self) do
begin
Parent := Tab2;
...
end;

djscsi
دوشنبه 24 تیر 1387, 03:06 صبح
procedure TForm1.ab1Click(Sender: TObject);
Var
I: Integer;
Web: array [1..100]of TWebBrowser;
begin
//J:=2;
Tab2[J]:= TTabSheet.Create(PageControl1);
Tab2[J].PageControl:=PageControl1;
Tab2[j].ImageIndex:=4; Tab2[j].Caption:='untitled'+inttostr(j);
PageControl1.ActivePage:=Tab2[J];
For I:=0 to ComponentCount-1 Do
Begin
If (Components[i] is TWebBrowser) Then
//If (Components[i] as TWebBrowser).parent=Tab2[J-1] Then
Begin
// Web[j] := TWebBrowser.Create(Tab2[J]);
// Web[j].parent:=Tab2[J];
PageControl1.Pages[PageControl1.ActivePageIndex].Free;
with TWebBrowser.Create(Self) do
begin
Parent := Tab2[j];
end;
End;
End;
Inc(J);
end;
من اینو نوشتم ولی خط Parent := Tab2[j]; دقیقا همون ارور cannot assign to a read-only property رو میده
اطفا اگه میشه درست شده و کامل این کد رو بنویس
ممنون

B-Vedadian
دوشنبه 24 تیر 1387, 08:33 صبح
Parent در مورد WebBrowser یک IDispatcher هستش، برای اینکه پنجره مرورگر رو تب مورد نظرتون ظاهر بشه، از ParentWindow استفاده کنید.


with TWebBrowser.Create(Self) do
begin
ParentWindow := Tab2[j].Handle;
.
.
.
end;

Hsimple11
دوشنبه 24 تیر 1387, 15:15 عصر
بهتر است آرایه خود را هم پاک کنید در رویداد Oncreate مینویسیم که برای هر تعداد Tabsheet و نه 100 تا کار کند. در قسمت متغیرهای کل برنامه:


var
Form1: TForm1;
Tab2: TTabSheet;
WEB: TWebBrowser;



Tab2 := TTabSheet.Create(PageControl1);
with Tab2 do
begin
Parent := PageControl1;
PageControl := PageControl1;
end;

WEB := TWebBrowser.Create(Self);
WEB.ParentWindow :=Tab2.Handle;
pageControl1.ActivePage:= Tab2;
end;


موفق باشید.

Hsimple11
سه شنبه 25 تیر 1387, 01:47 صبح
در مورد Button ها و هر کنترل دیگری نیز کدهای قبل مربوط به Edit را تکرار کنید.

djscsi
چهارشنبه 26 تیر 1387, 01:40 صبح
اگر میشه در مورد گرفتن لینک هم یه توضیحی بدید
مثلا من توی صفحه وب روی یک لینک کلیک میکنم من می خام ادرس لینک توی یه edit قرار بگیره باید چه کار کنم
با تشکر فراوان از b-vedadianو به ویژه hisimple

B-Vedadian
چهارشنبه 26 تیر 1387, 08:07 صبح
از رويداد OnBeforeNavigate2 استفاده کن. درست قبل اينکه به لينک کليک شده منتقل بشه، فراخواني ميشه.