PDA

View Full Version : ایجاد tab sheet در حال اجرا برنامه



jamjid
پنج شنبه 27 مهر 1385, 13:03 عصر
یه فرمی دارم که در آن یه کامپوننت page control قرار داده شده ..چطوری می تونم در حال اجرا برنامه با زدن روی button یه tab sheet به آن اظافه بشه و هر تعداد tab sheetخواستیم ایجاد کنیم و مشکلی برای نام tab sheet ها ایجاد نشه؟

ghabil
پنج شنبه 27 مهر 1385, 13:17 عصر
with TTabSheet.Create(PageControl1) do
begin
Parent := PageControl1;
PageControl := PageControl1;
Caption := 'test';
اگر خواستی اسمش رو هم بده نخواستی هم نده خودش میده ...
end;

jamjid
پنج شنبه 27 مهر 1385, 15:05 عصر
چطوری میتونم توی این tab sheet ها ایجاد شده کامپوننت های دیگری هم بگذارم ؟ مثلا برای هر کدام یه edit , button بگذارم ؟

** چطوری میتونم نام tab sheet های ایجاد شده را بدست بیارم؟

ghabil
پنج شنبه 27 مهر 1385, 18:17 عصر
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);

jamjid
یک شنبه 30 مهر 1385, 11:54 صبح
ممنون که کارم را راه انداختی ولی هر کامپوننتی را نمیشه برای tab sheetها گذاشت!
مثلا کامپوننت web browser
برای گذاشتن کامپوننت web browser در tab sheet ها چه دستوری بنویسم؟
دستور ایجاد tab sheet را گفتید (ممنون ) دستور پاک کردن tab sheet فعال را هم بگید ممنون میشم

ghabil
یک شنبه 30 مهر 1385, 17:27 عصر
چرا نمیشه ؟!


with TWebBrowser.Create(Self) do
begin
Parent := ATabSheet;
...
end;


اینم پاک کردن اکتیو:


PageControl1.Pages[PageControl1.ActivePageIndex].Free;

jamjid
دوشنبه 01 آبان 1385, 17:22 عصر
جناب قابیل از این دستور در حال اجرا خطا می گیره اگر روشی دیگه بلدی بنویسید ممنون میشم مشکلش نمی دانم چیه ولی فقط روی تب شیت فعلی(فعال) کار میکنه روی تب شیت دیگه (تب شیت بعدی) که می خوام امتحان کنم خطا میگیره

ghabil
دوشنبه 01 آبان 1385, 17:52 عصر
چه ایرادی میگیره؟ کدومشون؟

jamjid
دوشنبه 01 آبان 1385, 22:57 عصر
فرض کن 4 تا تب شیت ایجاد کردیم روی تب شیت فعال که باشی دکمه که برای بسته شدن تب شیت را می زنی بسته میشه و خود به خود اولین تب شیت میشه فعال بعد روی هر تب شیت دیگه ای دکمه بسته شدن را بزنی این متن پیغام خطا را میده
raised exception class EAbstractError with message 'Abstract Error'.

Process stopped. Use Step or Run to continue.


یه مشکل دیگه اینکهبرای یه دکمه تعریف کردم که در تب شیت فعال روی edit در تب شیت جیزی بنویسه ولی روی editروی تب شیت آخری می نویسه

ghabil
سه شنبه 02 آبان 1385, 14:47 عصر
ببین تو کدهایی که نوشتی اشتباه کردی کدهاتو بزار ببینیم ...

jamjid
چهارشنبه 03 آبان 1385, 19:17 عصر
سلام برنامه که شروع به نوشتن آن کردم یه 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 که برای بستن تب شیت فعال هست همانطور که گفتم در حال اجرا خطا می گیره

اگه کد ها بد نوشته شده یا درست نوشته نشده بگذارید روی حرفه ای نبودن من منتظر جوابتون هستم..

ghabil
پنج شنبه 04 آبان 1385, 02:35 صبح
اصلا به تب شیت ها کاری نداره که تو یک متغییر Global به نام WB گرفتی بعد هر تبی که میسازی Assignش میکنی به آخرین webBrowserی که میسازی خب بعد طبیعیه که وقتی مثلا میگی WB.Navigate این WB داره به آخرین WebBrowserی که ساختی اشاره کنه .
به نظر من بجای این کار باتنها رو اصلا بزار بالای PageContorler و از هر کدوم یکدونه بساز ، بعد اول هر کدوم بگو WebBrowser ابشیت فعال رو بدست بیارند و بعد روش کار کنند... اگر هم میخوای بزاری روی تب شیتها Ownerشون رو هم ATabSheet بده یعنی Create(ATabSheet)

jamjid
شنبه 06 آبان 1385, 11:58 صبح
جناب قابیل ممنون .... اگه باتن ها را بالای page control بگذارم بعد با چه دستوری web browser تب شیت فعال را بدست آورم که بتونم روش کار کنم

ghabil
شنبه 06 آبان 1385, 18:29 عصر
AnAcitveWB := PageControl1.Pages[PageControl1.ActivePageIndex].FindChildControl('اسم WebBrowserی که ساختی') as TWebBrowser;
AnAcitveWB.Navigate('http://yahoo.com');

jamjid
یک شنبه 07 آبان 1385, 23:01 عصر
این AnAcitveWB چی ؟ متغیر از چه نوعی ؟ توضیح بیشتر بدید لطفا

ghabil
یک شنبه 07 آبان 1385, 23:37 عصر
از نوع TWebBrowser دیگه یعنی یک Refrence گرفتی که هر کاری خواستی بتونی با WebBrowserی که روی TabSheetفعال هست بکنی و هی نخوای دوباره پیداش کنی...

jamjid
چهارشنبه 10 آبان 1385, 19:33 عصر
من باتن ها را آوردم بیرون و برای 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.

مشکل از کجاست؟

ghabil
چهارشنبه 10 آبان 1385, 20:53 عصر
خب معلومه که AV میگیری ، WB اسم متغیرته ، اسم کامپونت که نیست باید اونجا اسم کامپونت رو مینوشتی اصلا کدت رو باید اینطوری مینوشتی :


AnAcitveWB := PageControl1.Pages[PageControl1.ActivePageIndex].FindChildControl('WebBrowser1) as TWebBrowser;
AnAcitveWB.Navigate('http://www.google.com');

ضمنا تو که متغییر WB رو داری اصلا نمیخواست دیگه AnActiveWB رو تعریف کنی... همون مینوشتی WB :=Pagecontrol....
راستی اگه زمانی که داری وب بروسر رو روی تب شیت تعریف میکنی بهش اسم داده باشی دیگه بجای webBrowser1 باید اون اسمی که دادی رو بنویسی

jamjid
پنج شنبه 11 آبان 1385, 19:04 عصر
این کار را کردم ولی جواب نداد و همان پیغام خطا ی قبلی را می داد

ghabil
پنج شنبه 11 آبان 1385, 22:57 عصر
خب حتما اسم WebBrowserت رو تعیین کردی تو همین کدها بگر هم بهت گفتم چه جوری میتونی اسمش رو تعیین کنی زمانی که داری میسازیش هم گفتم چجوری میتونی پیداش کنی ، به هر حال تا وقتی AV میگیری ماله اینه که اسمش رو درست سرچ نمیکنی...

jamjid
جمعه 12 آبان 1385, 18:41 عصر
سلام از این بابت که اینقدر به من لطف دارید ممنون
ولی من دیگه موندم چه کارکنم ؟
من برای تعریف وب بروسر این کد رو نوشتم

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 نگیره

با تشکر

ghabil
شنبه 13 آبان 1385, 02:05 صبح
آقا من که بهت گفته بودم Create(Slef( نکن !!! برگد کدهارو بخون معلومه AV میگیری...

jamjid
شنبه 13 آبان 1385, 13:29 عصر
WB := TWebBrowser.Create(ATabSheet);

گذاشتم جواب نداد
WB := TWebBrowser.Create(nil);

گذاشتم جواب نداد

من اصلا نمدونم مشکل از کجاست و این خطا از چیه ؟

چطوری میشه برای این WB اسم گذاشت تا در باتن ها اسمش رو به کار ببریم

ghabil
شنبه 13 آبان 1385, 19:50 عصر
ببین سعی کن خودت هم متوجه بشی چی کار میکنی ، تونوقت دیگه اینطوری گیج نمیشی ، وقتی میزنی


WB := TWebBrowser.Create(ATabSheet);

Owner وب بروسرت میشه اون تب شیتی که روشه در نتیجه وقتی توی Childs تبشیت میگردی پیداش میکنه . اما اگر با Self بروسر رو Creat کنی اونوقت Owner بروسر میشه فرمت و دیگه اگر تو childs تب شیت دنبالش بگردی پیدا نمیشه. اگر جایشو نمیفهمی بگو بیشتر توضیح بدم.

حالا یک استپ عقبتر : وقتی داری وب بروسر رو Creat میکنی میتونی یک خط هم بنویسی


WB.NAme = 'TabWebBrowser'

اگه اینو بزاری بعدا که میخوای Findchildcontrol بکنی همین اسم رو جستجو میکنی اگر نزاشتی اونوقت اسمش شده WebBrowser1 (به شرطی که با ATabSheet کریت کرده باشی).

به همین سادگیه اصلا هم گیج نشو فکر هم نکن داره اتفاق عجیب قریبی میفته ..

jamjid
یک شنبه 14 آبان 1385, 14:14 عصر
وقتی که بخواهی نام به wb بدی این خطا رو میده

cannot assing to a read-only property
اگه اسم تعریف نکنی و FindChildControl('WebBrowser1') بنویسی همان AV می گیره
در هردو حالت هم با ATabSheet کریت کردم

ghabil
دوشنبه 15 آبان 1385, 00:58 صبح
ببین داری یک جای دیگه اشتباه میکنی کل کدت رو بزار یک نگاهی بکنیم.

jamjid
دوشنبه 15 آبان 1385, 18:47 عصر
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.
این همه کدی که من نوشتم

ghabil
دوشنبه 15 آبان 1385, 21:04 عصر
تو که اینو گذاشتی DFMش رو هم میزاشتی دیگه که اجرا کنم کدتو...

jamjid
پنج شنبه 18 آبان 1385, 18:36 عصر
اینم کل پروژه
http://hosseindn.persiangig.com/webbrowser.rar
منتظر جواب هستم

ghabil
شنبه 20 آبان 1385, 22:15 عصر
آقا راست میگفتی این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;

jamjid
پنج شنبه 25 آبان 1385, 23:00 عصر
آقا قابیل ممنون
ببینم برای دسترسی به منوی favorites و history دستوری داری ؟