Форум: "Основная";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];
Внизинициализировать объект при переходе по вкладке Найти похожие ветки
← →
monk (2008-03-07 11:55) [0]люди, пытаюсь инициализировать ОЛЕ объект при событии перехода по вкладке:
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
Pagecontrol1.ActivePage := TabSheet1;
currdir := extractfiledir(paramstr(0)) + "\";
currdir := replacestr(currdir, "\", "/");
webBrowser1.Navigate("file:///" + currdir + "1.htm");
webbrowser2.Navigate("file:///" + currdir + "editor.html");
end;
procedure TForm1.PageControl1Change(Sender: TObject);
begin
if pagecontrol1.ActivePage = TabSheet2 then begin
// Editor initialization
CurrentWB := Disp as IWebBrowser;
editor := (CurrentWB.Document as IHTMLDocument2);
editor.DesignMode := "On";
end;
end;
procedure TForm1.WebBrowser2DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
Disp := pDisp;
end;
initialization
OleInitialize(nil);
finalization
OleUninitialize;
end.
лезет ошибка доступа памяти
весь исходник в архиве:
http://dump.ru/files/o/o70146819/
← →
Сергей М. © (2008-03-07 12:14) [1]
> лезет ошибка доступа памяти
На какой строчке ?
← →
sniknik © (2008-03-07 12:36) [2]> На какой строчке ?
на
editor := (CurrentWB.Document as IHTMLDocument2);
потому, что CurrentWB как и Disp до этого не инициализирован в момент использования.
← →
Сергей М. © (2008-03-07 12:45) [3]
> CurrentWB как и Disp до этого не инициализирован в момент
> использования
Почему ?
Смотря когда табшит давить - до или после события OnDocumentComplete ..
По кр.мере CurrentWB на этот момент будет инициализирован, чего, правда, нельзя сказать о CurrentWB.Document
← →
oxffff © (2008-03-07 12:49) [4]
> sniknik © (07.03.08 12:36) [2]
Учить мат. часть не хотите?
procedure _IntfCast(var Dest: IInterface; const Source: IInterface; const IID: TGUID);
{$IFDEF PUREPASCAL}
// PIC: EBX must be correct before calling QueryInterface
var
Temp: IInterface;
begin
if Source = nil then
Dest := nil
else
begin
Temp := nil;
if Source.QueryInterface(IID, Temp) <> 0 then
Error(reIntfCastError)
else
Dest := Temp;
end;
end;
Ошибка на строчке
editor.DesignMode := "On";
← →
oxffff © (2008-03-07 12:53) [5]
> oxffff © (07.03.08 12:49) [4]
To sniknik ©
Sorry, на CurrentWB.Document не обратил внимание.
← →
monk (2008-03-07 13:44) [6]как я понимаю проблема в том что до перехода на вкладку2 webbrowser2 еще не загружен, вот и лезет ошибка.
НО загрузка его прописана в событии Form1.OnCreate, что по идее происходит ДО всех любых событий, а значит ДО события перехода по вкладке уже ДОЛЖНА быть загружена страница.
и как загрузить страницу и инициализировать объект ДО перехода по вкладке?
← →
Сергей М. © (2008-03-07 13:52) [7]
> как загрузить страницу и инициализировать объект ДО перехода
> по вкладке?
>
А зачем разрешать юзеру этот переход, если документ, с которым ассоциирована интересующая вкладка, еще не загружен полностью ?
← →
monk (2008-03-07 14:01) [8]
> А зачем разрешать юзеру этот переход, если документ, с которым
> ассоциирована интересующая вкладка, еще не загружен полностью
> ?
>
потому что так построено приложение.
на первой вкладке страница форума (которая и является главной и открывается сначала - это логично), где он выделяет текст и нажатием кнопки этот текст выделенный должен попадать в эдитор (на вторую вкладку).
гонять юзера сначала на вкладку редактора как-то неудобно, ему там нечего делать, если он на первой ничего не выделил.
← →
Сергей М. © (2008-03-07 14:10) [9]
> должен попадать в эдитор (на вторую вкладку)
Но если документ на второй вкладке еще не загружен полностью, что там делать юзеру ?
← →
sniknik © (2008-03-07 14:11) [10]> потому что так построено приложение.
"построй" по другому
получаешь интерфейс в WebBrowser2DocumentComplete ну и все остальное, нужное, делай там же/после этого.
будет правильнее (я так понимаю он и поменяться может, при загрузке другой страницы, а все связанное у тебя в создании инициализирующееся так на старое старое "смотреть" и останется, тоже будет глюк только теперь с уничтоженным обьектом, либо (т.к. это интерфейс) со стрыми данными, т.е. логический глюк.)
← →
monk (2008-03-07 14:49) [11]
> Сергей М. © (07.03.08 14:10) [9]
ты не понял, вопрос не в том что там делать юзеру, вопрос в том, как инициализировать объект до перехода по вкладке.
при запуске приложения юзер попадает на первую вкладку - и это условие не меняется.
я же не могу написать мануал пользователям:
"сначала зайдите на вкладку редактора, а потом на страницу форума (первую), они меня не поймут и наверняка спросят, - а зачем нам на вкладку редактора?" :)
> sniknik © (07.03.08 14:11) [10]
спасибо, попробую.
не, глюка не будет, разрушать объект не нужно.
п.с. сделал как советовали, теперь ошибка при вызове range
http://dump.ru/files/o/o1977486901/
← →
monk (2008-03-07 14:53) [12]качните исходник и посмотрите, если после запуска пройти на вторую вкладку, а потом вернутся на первую - выделить текст и нажать кнопу,- то все окей.
если этого не сделать (не пойти на вторую, а начать с первой) - ошибка.
вот в чем проблема...
← →
Сергей М. © (2008-03-07 15:10) [13]
> monk (07.03.08 14:49) [11]
Пока не загружен документ, вкладка должна быть либо недоступна либо невидима, тогда и перейти на нее юзер не сможет, тогда и событие PageControl1Change не возникнет, тогда и ошибки не будет.
А факт загрузки документа - это событие OnDownloadComplete того экз-ра браузера, который у тебя грузит этот документ. Вот в этом событии и инициализируй переменные, используемые в обработчике PageControl1Change, им только после этого разрешай или делай видимой соответствующую вкладку.
← →
monk (2008-03-07 15:16) [14]
> Сергей М. © (07.03.08 15:10) [13]
снова - здорово.
ты качнул исходник?
юзер не должен руками переходить на вторую вкладку.
вернее будет так - он не должен переходить ТОЛЬКО вручную, а МОЖЕТ еще с помощью кнопки на первой вкладке после выделения текста.
иначе это не автоматизация процесса будет.
так вот, делай ее недоступной или не делай - толку не будет.
поскольку объект не инициализирован до нажатия кнопки, а это нужно как-то сделать
← →
Сергей М. © (2008-03-07 15:30) [15]
> ты качнул исходник?
Нафих он мне сдался ?)
> юзер не должен руками переходить на вторую вкладку
А его никто и не заставляет - ты волен сделать это программно, если по логике на то есть необходимость.
> он не должен переходить ТОЛЬКО вручную, а МОЖЕТ еще с помощью
> кнопки на первой вкладке после выделения текста
А по барабану как он туда перейдет - кликом хоть по кнопке хоть по табшиту.
Да и клик юзером чего-то - это "ручная" операция.
А вот программная эмуляция клика - это уже элемент автоматизации, о которой ты печешься)
> делай ее недоступной или не делай - толку не будет
Как это не будет ?
Еще как будет !)
Ошибка-то исчезнет, ибо возникает она у тебя именно в обработчике смены активного табшита.
И вообще , ты про TAction[List] и централизацию логики что-нть слышал ?)
← →
sniknik © (2008-03-07 16:18) [16]> поскольку объект не инициализирован до нажатия кнопки, а это нужно как-то сделать
странно, но он похоже только при показе начинает отрабатывать (Navigate), и соответственно событие завершения.
вообщето там еще есть, другие Navigate2, посмотреть может они ведут себя по другому (параметров там больше)
или попросту отобразить внедренную часть, раз ему так хочется, это же ole обьект, т.е. сделать ему webbrowser2.DoObjectVerb(ovShow);, только это не при создании, а на onshow формы лучше наверное.
← →
Сергей М. © (2008-03-07 16:51) [17]
> он похоже только при показе начинает отрабатывать
Ну тады все просто
if (pagecontrol1.ActivePage = TabSheet2) and Assigned(Disp) then begin
← →
monk (2008-03-07 17:56) [18]урааа!!!!!!!!
спасибо sniknik
все заработало :)WebBrowser2.DoObjectVerb(OLEIVERB_SHOW);
на событие OnCreate
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.049 c