Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1226151544
аврам
2008-11-08 16:39
2008.12.21
потоки


2-1226464717
Gans
2008-11-12 07:38
2008.12.21
Отчеты в Xls


15-1223761025
МемТест
2008-10-12 01:37
2008.12.21
Под Windows XP максимум памяти - это 2 или 4 Гб?


15-1224814529
Slider007
2008-10-24 06:15
2008.12.21
С днем рождения ! 24 октября 2008 пятница


15-1224236239
DevilDevil
2008-10-17 13:37
2008.12.21
Чем D6 лучше, чем D5, а D7 - лучше D6 ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский