یه فرمی دارم که در آن یه کامپوننت page control قرار داده شده ..چطوری می تونم در حال اجرا برنامه با زدن روی button یه tab sheet به آن اظافه بشه و هر تعداد tab sheetخواستیم ایجاد کنیم و مشکلی برای نام tab sheet ها ایجاد نشه؟
یه فرمی دارم که در آن یه کامپوننت page control قرار داده شده ..چطوری می تونم در حال اجرا برنامه با زدن روی button یه tab sheet به آن اظافه بشه و هر تعداد tab sheetخواستیم ایجاد کنیم و مشکلی برای نام tab sheet ها ایجاد نشه؟
with TTabSheet.Create(PageControl1) do
begin
Parent := PageControl1;
PageControl := PageControl1;
Caption := 'test';
اگر خواستی اسمش رو هم بده نخواستی هم نده خودش میده ...
end;
چطوری میتونم توی این tab sheet ها ایجاد شده کامپوننت های دیگری هم بگذارم ؟ مثلا برای هر کدام یه edit , button بگذارم ؟
** چطوری میتونم نام tab sheet های ایجاد شده را بدست بیارم؟
var
ATabSheet: TTTabSheet;
begin
ATabSheet := TTabSheet.Create(PageControl1)
with ATabSheet do
begin
Parent := PageControl1;
PageControl := PageControl1;
Caption := 'test';
end;
// یک Button روی TabSheet:
with TButton.Create(Self) do
begin
Caption := 'test';
Parent := ATabSheet;
end;
//نام TabSheet
ShowMessage(ATabSheet.Name);
ممنون که کارم را راه انداختی ولی هر کامپوننتی را نمیشه برای tab sheetها گذاشت!
مثلا کامپوننت web browser
برای گذاشتن کامپوننت web browser در tab sheet ها چه دستوری بنویسم؟
دستور ایجاد tab sheet را گفتید (ممنون ) دستور پاک کردن tab sheet فعال را هم بگید ممنون میشم
چرا نمیشه ؟!
with TWebBrowser.Create(Self) do
begin
Parent := ATabSheet;
...
end;
اینم پاک کردن اکتیو:
PageControl1.Pages[PageControl1.ActivePageIndex].Free;
جناب قابیل از این دستور در حال اجرا خطا می گیره اگر روشی دیگه بلدی بنویسید ممنون میشم مشکلش نمی دانم چیه ولی فقط روی تب شیت فعلی(فعال) کار میکنه روی تب شیت دیگه (تب شیت بعدی) که می خوام امتحان کنم خطا میگیره
فرض کن 4 تا تب شیت ایجاد کردیم روی تب شیت فعال که باشی دکمه که برای بسته شدن تب شیت را می زنی بسته میشه و خود به خود اولین تب شیت میشه فعال بعد روی هر تب شیت دیگه ای دکمه بسته شدن را بزنی این متن پیغام خطا را میده
raised exception class EAbstractError with message 'Abstract Error'.
Process stopped. Use Step or Run to continue.
یه مشکل دیگه اینکهبرای یه دکمه تعریف کردم که در تب شیت فعال روی edit در تب شیت جیزی بنویسه ولی روی editروی تب شیت آخری می نویسه
ببین تو کدهایی که نوشتی اشتباه کردی کدهاتو بزار ببینیم ...
سلام برنامه که شروع به نوشتن آن کردم یه IE تب دار است نمونه ای هم از این برنامه دیدم ولی خواستم خودم این برنامه را بنویسم .
البته من برنامه نویس خوبی نیستم و این چند خط برنامه ای هم که نوشتم با کمک شما دوست عزیز بوده
کد ایجاد تب شیت با تمام اشیا موجود در آن ۞ اسامی که در مقابل on click اشیا هستند نام توابع می باشد ۞
Var Form1: TForm1;
ATabSheet: TTabSheet;
bt:TButton;
btb:TButton;
btf:TButton;
ed:TEdit;
WB: TWebBrowser;
ATabSheet := TTabSheet.Create(PageControl1);
with ATabSheet do
begin
Parent := PageControl1;
PageControl := PageControl1;
end;
// close Button in TabSheet:
bt:=TButton.Create(Self);
bt.Caption := 'x';
bt.OnClick:= pageControl1.Pages[PageControl1.ActivePageIndex].Free;
bt.Parent := ATabSheet;
bt.top:=7;
bt.left:=768;
bt.Width:=15;
bt.Height:=15;
// go Button in TabSheet:
bt:=TButton.Create(Self);
bt.Caption := 'GO';
bt.OnClick:=go;
bt.Parent := ATabSheet;
bt.top:=44;
bt.left:=745;
bt.Width:=39;
bt.Height:=22;
// edit in TabSheet:
//with TEdit.Create(Self) do
ed:=tedit.Create(self);
ed.Parent := ATabSheet;
ed.top:=44;
ed.left:=3;
ed.Width:=735;
// back btn in TabSheet:
btb:=TButton.Create(self);
btb.Caption := 'BACK';
btb.OnClick:= back;
btb.Parent := ATabSheet;
btb.top:=10;
btb.left:=15;
btb.Width:=75;
btb.Height:=30;
btb.Enabled:=false;
// forward btn in TabSheet:
btf:=TButton.Create(self);
btf.Caption := 'FORWARD';
btf.OnClick:=goforward;
btf.Parent := ATabSheet;
btf.top:=10;
btf.left:=95;
btf.Width:=75;
btf.Height:=30;
btf.Enabled:=false;
// stop btn in TabSheet:
bt:=TButton.Create(self);
bt.Caption := 'STOP';
bt.OnClick:=stop;
bt.Parent := ATabSheet;
bt.top:=10;
bt.left:=175;
bt.Width:=75;
bt.Height:=30;
// refresh btn in TabSheet:
bt:=TButton.Create(self);
bt.Caption := 'REFRESH';
bt.Parent := ATabSheet;
bt.top:=10;
bt.left:=255;
bt.Width:=75;
bt.Height:=30;
// home btn in TabSheet:
bt:=TButton.Create(self);
bt.Caption := 'HOME';
bt.OnClick:=gohome;
bt.Parent := ATabSheet;
bt.top:=10;
bt.left:=335;
bt.Width:=75;
bt.Height:=30;
// go search btn in TabSheet:
bt:=TButton.Create(self);
bt.Caption := 'SEARCH';
bt.OnClick:=gosearch;
bt.Parent := ATabSheet;
bt.top:=10;
bt.left:=415;
bt.Width:=75;
bt.Height:=30;
// web browser in TabSheet:
WB := TWebBrowser.Create(Self);
WB.ParentWindow :=ATabSheet.Handle;
wb.Top:=71;
wb.Left:=1;
wb.Width:=790;
wb.Height:=452;
wb.Offline:=true;
wb.FullScreen:=false;
wb.GoHome;
ed.Text:=wb.LocationURL;
// برای اینکه تب شیت ایجاد شده نشان داده شود.
pageControl1.ActivePage:=ATabSheet;
end;
&& تابع gosearch برای go search btn &&
WB.Navigate('http://www.google.com');
ed.Text:='http://www.google.com
@ اولین مشکل اینکه وقتی روی go search btn کلیک می کنم به جای اینکه در تب شیت فعال به سایت گوگل برود در آخرین تب شیت به این سایت می رود.
@ مشکل دوم اینکه وقتی روی دکمه پرینت کلیک می کنم به جای اینکه سایت موجود در تب شیت فعال به printpreview برود سایت موجود در تب شیت آخر به printpreview می رود.
&& دستور برای نشان دادن printpreview &&
WB.ControlInterface.ExecWB(olecmdid_printpreview,o lecmdexecopt_dontpromptuser,EmptyParam,EmptyParam) ;
&& دستور برای zoom کردن سایت &&
wb.OleObject.document.body.style.zoom:=2.0;
@ بازم مثل قبل zoom سایت روی web browser تب شیت آخر انجام میشه
@@خلاصه کلام : هر عملی روی تب شیت آخر ایجاد میشه
@@ آن دکمه close btn که برای بستن تب شیت فعال هست همانطور که گفتم در حال اجرا خطا می گیره
اگه کد ها بد نوشته شده یا درست نوشته نشده بگذارید روی حرفه ای نبودن من منتظر جوابتون هستم..
اصلا به تب شیت ها کاری نداره که تو یک متغییر Global به نام WB گرفتی بعد هر تبی که میسازی Assignش میکنی به آخرین webBrowserی که میسازی خب بعد طبیعیه که وقتی مثلا میگی WB.Navigate این WB داره به آخرین WebBrowserی که ساختی اشاره کنه .
به نظر من بجای این کار باتنها رو اصلا بزار بالای PageContorler و از هر کدوم یکدونه بساز ، بعد اول هر کدوم بگو WebBrowser ابشیت فعال رو بدست بیارند و بعد روش کار کنند... اگر هم میخوای بزاری روی تب شیتها Ownerشون رو هم ATabSheet بده یعنی Create(ATabSheet)
جناب قابیل ممنون .... اگه باتن ها را بالای page control بگذارم بعد با چه دستوری web browser تب شیت فعال را بدست آورم که بتونم روش کار کنم
AnAcitveWB := PageControl1.Pages[PageControl1.ActivePageIndex].FindChildControl('اسم WebBrowserی که ساختی') as TWebBrowser;
AnAcitveWB.Navigate('http://yahoo.com');
این AnAcitveWB چی ؟ متغیر از چه نوعی ؟ توضیح بیشتر بدید لطفا
از نوع TWebBrowser دیگه یعنی یک Refrence گرفتی که هر کاری خواستی بتونی با WebBrowserی که روی TabSheetفعال هست بکنی و هی نخوای دوباره پیداش کنی...
من باتن ها را آوردم بیرون و برای search دستور زیر را نوشتم
AnAcitveWB := PageControl1.Pages[PageControl1.ActivePageIndex].FindChildControl('WB') as TWebBrowser;
AnAcitveWB.Navigate('http://www.google.com');
ولی با پیغام خطا زیر روبرو شدم
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 004678AE in module' project1.exe'.Read of address 000002F8'.
Process stopped. Use Step or Run to continue.
مشکل از کجاست؟
خب معلومه که AV میگیری ، WB اسم متغیرته ، اسم کامپونت که نیست باید اونجا اسم کامپونت رو مینوشتی اصلا کدت رو باید اینطوری مینوشتی :
AnAcitveWB := PageControl1.Pages[PageControl1.ActivePageIndex].FindChildControl('WebBrowser1) as TWebBrowser;
AnAcitveWB.Navigate('http://www.google.com');
ضمنا تو که متغییر WB رو داری اصلا نمیخواست دیگه AnActiveWB رو تعریف کنی... همون مینوشتی WB :=Pagecontrol....
راستی اگه زمانی که داری وب بروسر رو روی تب شیت تعریف میکنی بهش اسم داده باشی دیگه بجای webBrowser1 باید اون اسمی که دادی رو بنویسی
این کار را کردم ولی جواب نداد و همان پیغام خطا ی قبلی را می داد
خب حتما اسم WebBrowserت رو تعیین کردی تو همین کدها بگر هم بهت گفتم چه جوری میتونی اسمش رو تعیین کنی زمانی که داری میسازیش هم گفتم چجوری میتونی پیداش کنی ، به هر حال تا وقتی AV میگیری ماله اینه که اسمش رو درست سرچ نمیکنی...
سلام از این بابت که اینقدر به من لطف دارید ممنون
ولی من دیگه موندم چه کارکنم ؟
من برای تعریف وب بروسر این کد رو نوشتم
WB := TWebBrowser.Create(Self);
WB.ParentWindow :=ATabSheet.Handle;
wb.Top:=41;
wb.Left:=1;
wb.Width:=785;
wb.Height:=445;
wb.Offline:=true;
wb.GoHome;
حالا شما می گید چه طوری تعریفش کنم و اسمش رو تعیین کنم تا AV نگیره
با تشکر
آقا من که بهت گفته بودم Create(Slef( نکن !!! برگد کدهارو بخون معلومه AV میگیری...
WB := TWebBrowser.Create(ATabSheet);
گذاشتم جواب نداد
WB := TWebBrowser.Create(nil);
گذاشتم جواب نداد
من اصلا نمدونم مشکل از کجاست و این خطا از چیه ؟
چطوری میشه برای این WB اسم گذاشت تا در باتن ها اسمش رو به کار ببریم
ببین سعی کن خودت هم متوجه بشی چی کار میکنی ، تونوقت دیگه اینطوری گیج نمیشی ، وقتی میزنی
WB := TWebBrowser.Create(ATabSheet);
Owner وب بروسرت میشه اون تب شیتی که روشه در نتیجه وقتی توی Childs تبشیت میگردی پیداش میکنه . اما اگر با Self بروسر رو Creat کنی اونوقت Owner بروسر میشه فرمت و دیگه اگر تو childs تب شیت دنبالش بگردی پیدا نمیشه. اگر جایشو نمیفهمی بگو بیشتر توضیح بدم.
حالا یک استپ عقبتر : وقتی داری وب بروسر رو Creat میکنی میتونی یک خط هم بنویسی
WB.NAme = 'TabWebBrowser'
اگه اینو بزاری بعدا که میخوای Findchildcontrol بکنی همین اسم رو جستجو میکنی اگر نزاشتی اونوقت اسمش شده WebBrowser1 (به شرطی که با ATabSheet کریت کرده باشی).
به همین سادگیه اصلا هم گیج نشو فکر هم نکن داره اتفاق عجیب قریبی میفته ..
وقتی که بخواهی نام به wb بدی این خطا رو میده
cannot assing to a read-only property
اگه اسم تعریف نکنی و FindChildControl('WebBrowser1') بنویسی همان AV می گیره
در هردو حالت هم با ATabSheet کریت کردم
ببین داری یک جای دیگه اشتباه میکنی کل کدت رو بزار یک نگاهی بکنیم.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, OleCtrls, SHDocVw, ExtCtrls, Menus,ActiveX,
Buttons;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
New1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
Timer2: TTimer;
Save1: TMenuItem;
N2: TMenuItem;
PrintStup1: TMenuItem;
N3: TMenuItem;
WO1: TMenuItem;
Navigate1: TMenuItem;
Back1: TMenuItem;
Forward1: TMenuItem;
Stop1: TMenuItem;
Refresh1: TMenuItem;
Home1: TMenuItem;
Zomein1: TMenuItem;
RealSize1: TMenuItem;
FindOnThisPage1: TMenuItem;
Sourse1: TMenuItem;
About1: TMenuItem;
Help1: TMenuItem;
About2: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
N4: TMenuItem;
N5: TMenuItem;
GroupBox1: TGroupBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
BitBtn6: TBitBtn;
PageControl1: TPageControl;
Button1: TButton;
TabSheet1: TTabSheet;
procedure Button1Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure Save1Click(Sender: TObject);
procedure PrintStup1Click(Sender: TObject);
procedure WO1Click(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure go (Sender: TObject);
end;
var
Form1: TForm1;
ATabSheet: TTabSheet;
bt:TButton;
ed:TEdit;
WB: TWebBrowser;
implementation
uses Math;
{$R *.dfm}
procedure tform1.go (Sender: TObject);
begin
wb.Navigate(ed.Text);
ATabSheet.Caption:=ed.Text;
end;
////***** for save page******\\\\
procedure WB_SaveAs_HTML(WB:TWebBrowser; const FileName : string);
var
PersistStream: IPersistStreamInit;
Stream: IStream;
FileStream: TFileStream;
begin
if not Assigned(WB.Document) then
begin
ShowMessage('Document not loaded!');
Exit;
end;
PersistStream := WB.Document as IPersistStreamInit;
FileStream := TFileStream.Create(FileName, fmCreate);
try
Stream := TStreamAdapter.Create(FileStream, soReference) as IStream;
if Failed(PersistStream.Save(Stream, True)) then
ShowMessage('SaveAs HTML fail!');
finally
FileStream.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ATabSheet := TTabSheet.Create(PageControl1);
with ATabSheet do
begin
Parent := PageControl1;
PageControl := PageControl1;
end;
// ?? close Button ??? TabSheet:
bt:=TButton.Create(ATabSheet);
bt.Caption := 'x';
bt.OnClick:=Exit1Click;
bt.Parent := ATabSheet;
bt.top:=0;
bt.left:=768;
bt.Width:=15;
bt.Height:=15;
// ?? go Button ??? TabSheet:
bt:=TButton.Create(ATabSheet);
bt.Caption := 'GO';
bt.OnClick:=go;
bt.Parent := ATabSheet;
bt.top:=16;
bt.left:=740;
bt.Width:=39;
bt.Height:=21;
// ?? edit ??? TabSheet:
ed:=tedit.Create(ATabSheet);
ed.Parent := ATabSheet;
ed.top:=16;
ed.left:=3;
ed.Width:=735;
// ?? web browser ??? TabSheet:
WB := TWebBrowser.Create(ATabSheet);
WB.ParentWindow :=ATabSheet.Handle;
wb.Top:=41;
wb.Left:=1;
wb.Width:=785;
wb.Height:=445;
wb.Offline:=true;
wb.GoHome;
ed.Text:=wb.LocationURL;
pageControl1.ActivePage:=ATabSheet;
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
pageControl1.Pages[PageControl1.ActivePageIndex].Free;
end;
//for open html page
procedure TForm1.N1Click(Sender: TObject);
begin
If OpenDialog1.Execute then begin
ed.Text:=OpenDialog1.FileName ;
wb.Navigate(ed.Text);
end;
end;
//for save html page
procedure TForm1.Save1Click(Sender: TObject);
begin
if savedialog1.Execute then
begin
WB_SaveAs_HTML(WB,savedialog1.FileName+'.Html');
end;
end;
//for print the page
procedure TForm1.PrintStup1Click(Sender: TObject);
begin
WB.ControlInterface.ExecWB(olecmdid_printpreview,o lecmdexecopt_dontpromptuser,EmptyParam,EmptyParam) ;
end;
//work offline true or false
procedure TForm1.WO1Click(Sender: TObject);
begin
if wo1.Checked=true then begin
wo1.Checked:=false;
wb.Offline:=false;
end
else begin wb.Offline:=true; wo1.Checked:=true; end;
end;
procedure TForm1.BitBtn6Click(Sender: TObject);
begin
WB := PageControl1.Pages[PageControl1.ActivePageIndex].FindChildControl('WebBrowser1') as TWebBrowser;
WB.Navigate('http://www.google.com');
end;
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
WB := PageControl1.Pages[PageControl1.ActivePageIndex].FindChildControl('WebBrowser1') as TWebBrowser;
WB.GoHome;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
WB := PageControl1.Pages[PageControl1.ActivePageIndex].FindChildControl('WebBrowser1') as TWebBrowser;
WB.GoBack;
end;
end.
این همه کدی که من نوشتم
تو که اینو گذاشتی DFMش رو هم میزاشتی دیگه که اجرا کنم کدتو...
اینم کل پروژه
http://hosseindn.persiangig.com/webbrowser.rar
منتظر جواب هستم
آقا راست میگفتی اینWrapper خاک بر سر هم Name هم Parentش ReadOnly هستند و Name رو هم خودش خالی ست میکنه ، برای همین کد رو اینطوری عوض کن :
در پیدا کردن بروسر :
var
i: Integer;
begin
with PageControl1.Pages[PageControl1.ActivePageIndex] do
for i:= 0 to ComponentCount - 1 do
if Components[i] is TWebBrowser then WB := Components[i] as TWebBrowser;
WB.GoBack;
آقا قابیل ممنون
ببینم برای دسترسی به منوی favorites و history دستوری داری ؟