Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2015, 15:44   #61
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так и родилась собственно идея протолкнуть свой язык, диалект которого уже был готов.
Забавно. А каким образом он появился? Ты его под что-то другое разрабатывал?
Vapaamies вне форума Ответить с цитированием
Старый 04.05.2015, 16:21   #62
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Неа. Сама Алиса появилась как шутка. Сидел, пнимаиш, на заводе. Делать нечего. Скучал. А тут в инете кто-то завел спор о Книге Дракона. Ну и понеслась - Война Гиков. Кто что нес, иногда такую чушь что прям ужос. ОкадЭмики хреновы. Одни кричали что это невозможно без комманды суперкакеров, другие говорили что это вообще бессмысленно и хлопотно и не окупится, третиь еще что-то выдумывали... Я и решил, все равно делать нече, попробую ка я ченить сделать неожиданное. Например написать компилятор, который бы попрал все теоретические основы, писанные до сих пор светилами общества. Саботаж прям такой устроить. Писькин бунт. Ну а тут еще и корреспондентом журнала стал. Так родилась статья "Компилятор домашнего приготовления". Ссыль в топе. А не, вру. Нема ссыли.
Ну вот:
http://www.programmersclub.ru/%D0%9A...D%D0%B8%D1%8F/
Ну или вот: http://allfiles.ws/tag/kompilyator-d...rigotovleniya/
Остатки того сильного проекта.

Плюс повлияла работа с Автолиспом из Автокада.
Вот так и получилось что я попытался разработать свою концепцию создания ПО, дабы показать что вообще-то ниче сложного в этом нет.
Так что как и Кернигана получилось начать с баловства.
Наверное если бы журнал не закрылся я бы там докрутился до серьезного более менее компилятора, но... увы.
Хотя не жалею. Интерпретаторы сейчас в моде. Нативный код всетки устаревает по концепциям по мере развития ИТ индустрии.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.05.2015, 16:44   #63
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Писькин бунт.
Да, годная мотивация.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Нативный код всетки устаревает по концепциям по мере развития ИТ индустрии.
Я бы поостерегся от таких высказываний.

Чтобы получить результат, нужно вкладываться. А мир, по большому счету, вкладывался только в один компилируемый язык. Ну хорошо, полтора языка. Этот язык сложен, но это ведь не единственный компилируемый язык!

Теперь, как мне кажется, в мире наблюдается реннесанс компилируемых языков, фиксирующий достижения и простоту интерпретируемых языков в родном для процессора коде. Если сделать годный компилируемый язык, можно попасть в струю.
Vapaamies вне форума Ответить с цитированием
Старый 04.05.2015, 17:01   #64
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Я бы поостерегся от таких высказываний.
Сомнительно, я думаю что вечно на 0 и 1 сидеть не будем. язык понравился, однако такой соус из разкривушек....
Человек_Борща вне форума Ответить с цитированием
Старый 04.05.2015, 17:38   #65
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
такой соус из разкривушек....
На то он и писькин, бунт этот
Цитата:
Я бы поостерегся от таких высказываний.
А я уже ниче не боюсь. Уж почитай как год с лишним. Уже пофик что обо мне скажут.
Цитата:
Если сделать годный компилируемый язык, можно попасть в струю.
Ну может и можно, только мне ближе правило "Не стой под струей" )))
Я уж как нибудь без мейнстрима обойдусь. А то занесет еще куда Билл свой messageBox не гонял...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.05.2015, 21:27   #66
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Функции из DLL.

Тут спрашивали не буду ли я оснащать Алису работой с ДЛЛ.
Оснастил. На базовом уровне. Так сказать прощадку для старта подготовил. Как показала практика, и это тоже не является какой-то сверхсложной задачей.

Итак, пример:
Код:
(u32 := dll name='user32.dll')
(write (call u32.MessageBoxA stdcall integer=0 pchar='123' pchar='qwe' integer=16) (call u32.error))
Объект принимает параметр name с именем и (или) путем к библиотеке, и загружает ее.
Вызов функции принимает в качестве параметра модель вызова и список параметров. Имя параметра - тип. Пока реализовал два: integer и pchar.
По факту integer попадает как 4байтовое значение в стек, а pchar как указатель на значение. Результат функции тоже возвращается.

Теперь исходник.
Создал допкласс:
Код:
TAlisaDLL=class(TAlisaOperator)
private
 DLLHandle:THandle;
 DLLName,Error:AnsiString;
 OsErrorCode:Integer;
 DLLParam:Array of TAlisaDLLParam;
public
  function InitMe:Variant; override;
  Function Exe:Variant; override;
  Destructor Destroy;override;
end;
DLLHandle - хендл библы
DLLName - имя библы. На всяк случай.
DLLParam - стек подготовленных параметров для функции:
Код:
TAlisaDLLParam=record
  p:Pointer; //Указатель на данные, или просто 4 байтовое значение, что помещается в стек
  atype:byte; //Тип значения
  aLen:Cardinal; //Длина в байтах значения
end;
Загрузка библы:
Код:
function TAlisaDLL.InitMe: Variant;
begin
 Result:=true; Error:='';
 DLLName:=EvalParamAsString('name','');
 if DLLName='' then begin
  Result:=false;
  Error:='DLL name not assigned';
  exit;
 end;

 DLLHandle:=LoadLibrary(PAnsiChar(DLLName));
 if DLLHandle=0 then begin
  Result:=false;
  OsErrorCode:=GetLastOSError;
  Error:='DLL cannot be loaded. Error code '+IntToStr(OsErrorCode)+' - '+SysErrorMessageUTF8(OsErrorCode);
  exit;
 end;

end;
Думаю понятно что тут происходит. Если библа не указана - от ворот поворот. Если загрузить ее не удается - "панночка выкатывает гарбуза" и досвидосик.

Теперь сам вызов. Пока реализована только stdcall модель, как самая популярная в виндухе.
Код:
function TAlisaDLL.Exe: Variant;
var FuncName,modelname:AnsiString;  ProcAddr:Pointer;
    arglen,resval:Cardinal;
    args:Array of Pointer;

  ...
   Тут процедуры формирующие параметры (см. ниже)
  ...
begin
 if IsCalled('error',CurOperNum+1) then begin
  Result:=error;
  exit;
 end;

 Result:=true;
 // Получаем имя прцедуры
 FuncName:=GetParam(CurOperNum+1);
 FuncName:=MyMem.ExtractPropertyName(FuncName,1);

 //Готовим систему ошибок, сбрасывая ее для вызова в ноль
 SetLastError(0);
 //Получаем адресс процедуры
 ProcAddr:=GetProcAddress(DLLHandle,PAnsiChar(FuncName));
 //Если такой нет - "гарбуза выкатуем"
 if not Assigned(ProcAddr) then begin
   Result:=false;
   OsErrorCode:=GetLastOSError;
   Error:='Cannot find function "'+FuncName+'" in "'+DLLName+'": Error code is '+IntToStr(OsErrorCode)+' - '+SysErrorMessage(OsErrorCode);
   Exit;
 end;

 SetLastError(0);
 //По умолчанию список параметров будет равен кол-ву переданного в 
 //вызов даже если там есть флаги
 //Формируем список параметров и массив, что пойдет в стек 
 //Вызываемой функции
 SetLength(args,Param.Count);
 SetLength(DLLParam,Param.Count);

 //Кол-во актуальных параметров сбрасываем в ноль
 arglen:=0;
 //По умолчанию устанавливаем модель
 modelname:='stdcall';
 //И проходи по переданному 
 for i:=CurOperNum+2 to Param.Count-1 do begin
 //Определяем, вдруг модель указана в виде флаговых параметров
  if Param[i]='cdecl' then modelname:='cdecl' else
   if Param[i]='pascal' then modelname:='pascal' else
 //Иначе это не флаг, а параметр. ЗАгоняем его в список. 
  AddParam(Param.Names[i],Eval(Param.ValueFromIndex[i]));
 end;

 dec(arglen);
 try
 //После формирования списка параметров самое интересное - передача их функции
   {$ASMMODE intel}
   if modelname='stdcall' then begin
{
 Ниче лучше не придумал кроме следующего:
 В цикле тупо засовываем параметры из сформированного массива
 в стек. После вызываем функцию.
 И получаем ее результат из EAX
}
		     asm
		      mov eax,args
		      mov ecx,[arglen]
		      @for:
		       push [eax+ecx*4]
		      loop @for
		      push [eax]
		      call [ProcAddr]
                      mov [resval],eax
		     end;
   end;
  Result:=resval;
  ClearParam;
 except
  on Exception do begin
   Result:=false;
   OsErrorCode:=GetLastOSError;
   Error:='Cannot execute function "'+FuncName+'" in "'+DLLName+'": Error code is '+IntToStr(OsErrorCode)+' - '+SysErrorMessageUTF8(OsErrorCode);
  end;
 end;

end;
I'm learning to live...

Последний раз редактировалось Stilet; 08.05.2015 в 21:36.
Stilet вне форума Ответить с цитированием
Старый 08.05.2015, 21:36   #67
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Функции из DLL (продолжение).

Функции формирования списка и его очистки такие:

Код:
  procedure AddParam(atype:string; avalue: Variant);
  var i:integer; s:pansichar;
  begin
   if atype='pchar' then begin
    DLLParam[arglen].atype:=1;
    DLLParam[arglen].aLen:=Length(avalue);
    DLLParam[arglen].p:=getmem(DLLParam[arglen].aLen);
    s:=PAnsiChar(VarToStr(avalue));
    Move(s^,DLLParam[arglen].p^,DLLParam[arglen].aLen);
   end else
   if atype='integer' then begin
    DLLParam[arglen].atype:=2;
    DLLParam[arglen].aLen:=SizeOf(integer);
    DLLParam[arglen].p:=getmem(DLLParam[arglen].aLen);
    i:=avalue;
    Move(i,DLLParam[arglen].p,DLLParam[arglen].aLen);
   end else
    exit;
   args[arglen]:=DLLParam[arglen].p;
   inc(arglen);
  end;
Код:
  procedure ClearParam;
  var i:integer;
  begin
   for i:=0 to arglen do begin
    if DLLParam[i].atype in [1] then
     Freemem(DLLParam[i].p,DLLParam[i].aLen);
   end;
   SetLength(DLLParam,0);
   SetLength(args,0);
  end;
args в результате массив, который и будет загоняться в стек, а DLLParam более подробная его версия, дублирующая и управляющая самими параметрами.
Ну и все.
Исходник в топе править не буду, а скомпиленное перезалью.

Если у кого есть идеи, как лучше сделать - подсказывайте.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2015, 16:16   #68
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию GUI в качестве HTML браузера (на базе IE)

Добавил наконец то графический интерфейс, который позволит мне теперь разрабатывать визуальные программы со всеми удобствами. Сделал это на базе браузера винды, чтоб особо не париться. Подключил эксплорер компонентом, и им управляю из кода Алисы. Естественно на события, возникающие на компонентах страницы, отображаемой в браузере Алиса реагирует, и выполняет свой код. По факту я получил IE со своим скриптовым движком.

Для начала опишу простейший пример скрипта:
Код:
(MyForm := mainform nolog w=200 h=200 y=0 align=hcenter caption='Моя бравзюшка'
  explorer=(MyIE
   onready=(
    (call MyForm.MyIE.style.css `
	    table {
		 border-collapse: collapse;
		 width: 100%;
		 color:#000000;		 
		}
		td{ 
		 background:#F8D1B4;
		 color:#000000;
		 text-align: center;
		}
		th{ 
		 background-color: #417B45;
		 color:#FFFFFF;
		 text-align: center;
		}
		.alink {
			text-decoration: underline;
			color: #000000;
			cursor:pointer;
		}
		.foundedindexes {
		 color: #000000;
		 background:#BFE1F7;
		 word-break: break-all;
		}
		caption {
			background-color: #5981cc ;
			color:#000000;
			font-size:20px;
			text-align: center;
		}		
	`)
	(s := '')
    (for (i := 0) (i < 10) (i ++)
				(s += (format ` 
				  <th><span class="alink" ifclick='(call disp.Jmak korrname="[korr]")'>[korr]</span></th>
				` korr=i  ))
    )
    	

	(call MyForm.MyIE.body.write (`
		 <div id="indexes" class="foundedindexes"></div>
		 <table width="100%" border="1">
		 <caption>
		  Таблычко
		 </caption>
		 <tr>
		 ` + s  + `
		 </tr></table>
	`))
   )
  )
)

(disp := func Jmak (
 (alert 'Жмакнули по элементу')
))


(call MyForm.show)
Здесь основные моменты:

Компонент explorer с именем MyIE, чтоб к нему можно было обращаться из Алисы.

Его событие onready - готовность документа к работе. Т.е. документ полностью загружен, и распарсен.

MyForm.MyIE.style.css - функция. которая формирует CSS документа, как ей укажешь в виде строки.

MyForm.MyIE.body.write - что-то дописывает в InnerHTML тела документа.

В основном больше пока ничего не реализовано по поводу методов работы, это я дальше сделаю. Сам факт что это есть в качестве стартапа - уже хорошо.

События описываются с помошью приставки if в качестве атрибутов тега:
Код:
<span class="alink" ifclick='(call disp.Jmak korrname="[korr]")'>[korr]</span>
Т.е. это не мешает описать onclick для JS, таким образом я получаю два скриптовых движка в браурезе.
В примере по клику на элемент вызовется функция disp.Jmak, которой передастся именованный параметр korrname.

И получаю я в результате следующее:
Безымянный.jpg
Т.е. Алиса реагирует на события на странице браузера. Это гораздо удобнее. чем создавать с нуля свой набор компонентов для интерфейса, а если учесть возможности самого HTML+JS+CSS то ЯВУ получает достаточно серьезные возможности. Я своим знакомым все чаще говорю теперь что больше не пишу на Делфи. Теперь я действительно смогу на 98% перейти на свою платформу, и реализовывать проекты только на ней. Остальные 2% - допил в Лазарусе ЯВУ, но это не в счет.

Ниже я представлю реализацию компонента браузера и его описание...

P.S. В топе экзешник обновлен. Чтоб Алиса отработала с GUI нужно передать ей параметр gui=ie для активации браузера.
I'm learning to live...

Последний раз редактировалось Stilet; 21.05.2015 в 17:09.
Stilet вне форума Ответить с цитированием
Старый 21.05.2015, 16:51   #69
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию GUI в качестве HTML браузера (на базе IE) - Кишки

Для начала надо сказать спасибо вот этой теме: http://www.freepascal.ru/forum/viewt...t=7271&p=55469
Все основное бралось из нее, за что авторам респект и уважуха. Я не очень много подобных примеров видел в интернете.

Сам модуль, описывающий браузер я прикрепил вложением, поэтому тут опишу его основные моменты.

Чтоб создать OLE в окошке необходимо изрядно попотеть. Микрософтовци как всегда сделали все массонскими путями, коих разгадать достаточно непросто, хотя и можно, если иметь терпение.

Чтоб получить окошко необходимо сам компонент описать кучей интерфейсов:
  • IStorage
  • IOleInPlaceSite
  • IOleInPlaceFrame
  • И др. для отлова событий и прочего
Это основные. Без них не обойдется. Причем их нужно не просто объявить, а именно описать. Описать их тела.

Далее вызов OleCreate, с передачей ей класса браузера, IID_IOleObject-а параметра отрисовки (OLERENDER_DRAW), и переменных, которые являются реализацией описанных в списке выше интерфейсов создает сам визуальный компонент, помещая на него ссыль в переменку типа IOleObject. После функцией DoVerb уже можно будет показать его на форме, передав ей хендл формы и область RECT, в которой браузер отрисуется.

По идее все. Компонент готов.
Далее можно получить движок, запросив интерфейс IID_IWebBrowser2, который разместился на форме, и можно с ним работать.

Я сразу же после этого создаю чистую страничку:
Код:
    url :='about:blank';
    webBrowser2.Navigate2(url, Flags, TargetFrameName, PostData, Headers);
И получаю интерфейсы на IID_IHTMLDocument2 для работы с DOM и IID_IHTMLDocument3 для присоединения к событиям клика и нажатия клавиши в текстовых полях на странице.

Все это можно увидеть в конструкторе TIExplorer.Create, в который я передаю родителя - форму.

Чтоб работать с страницей интерактивно, необходимо было присоседится к ней, получив DOM, и расставив события. Делать это можно только после того, как браузер все загрузит. За это отвечает реализация интерфейса
TWebBrowserEvent, а точнее метод Invoke.
Сам интерфейс назначается браузеру методом Advise, который есть у интерфейса IConnectionPoint.
Происходит это так:
Код:
    browserObject.QueryInterface(IID_IConnectionPointContainer, icpc);
    icpc.FindConnectionPoint(DIID_DWebBrowserEvents2, icp);
    icp.Advise(idisp, ck);
У обьекта браузера запрашивается IID_IConnectionPointContainer, в качестве опорного механизма для связи с событиями и с его помошью происходит получение интерфейса DIID_DWebBrowserEvents2, который отвечает за события. После чего в метод Advise передается переменка типа
IDispatch, которая будет интерфейсом, в теле которого будет описан код, реагирующий на события в браузере.
Этот интерфейс-обработчик у меня описан как TWebBrowserEvent = class(TInterfacedObject, IDispatch)
Как для самого браузера так и для событий клика и нажатия клавиши. По факту на каждое событие нужен свой интерфейс.
Каждый интерфейс события должен будет в методе QueryInterface возвращать свою переменную-интерфейс, назначенную как обработчик на реакцию события, поэтому их нужно несколько.
Возможно я ошибаюсь, и достаточно одного интерфейса на все все события, но как так сделать я не понял. Не важно.

Главный интерфейс, привязанный к самому браузеру обрабатывает событие полной загрузки страницы, и назначает обработчики событий. Выглядит это так:
Код:
function TWebBrowserEvent.Invoke(DispID: LongInt;const iid : TGUID;
  LocaleID : longint; Flags: Word;var params;
  VarResult,ExcepInfo,ArgErr : pointer) : HResult;stdcall;
var ev:IHTMLEventObj; evrec:TIExplorerEventRecord;
  htmlwnd:IHTMLWindow2;
  evelement:IHTMLElement;
  ssc:IHTMLStyleSheetsCollection;
  sscIndex:OleVariant;
begin

//Если страница полностью загружена
    if DispID = DISPID_NAVIGATECOMPLETE2 then begin
        if (IEMems.MyIE<>nil) then begin
//попытаемся получить ее CSS секцию
          ssc:=IHTMLStyleSheetsCollection(IEMems.ihtm.styleSheets);
          if not Assigned(ssc) then begin
//или создать ее, если такой нет
              IEMems.DocStyleSheet:=IEMems.ihtm.createStyleSheet('',0);
          end;
//Здесь вызывается некий внешний обработчк, наподобие OnDocumentComplete в Делфи
          if Assigned(IEMems.MyIE.OnReady) then
            IEMems.MyIE.OnReady(IEMems.MyIE);
        end;
        IEMems.MyIE.DocIsReady:=True;
//А вот так навешиваются события на определенный тип 
//Каждому типу - свой интерфейс-обработчик
        IEMems.doc3.attachEvent('onclick',IEMems.DispEventOnClick);
        IEMems.doc3.attachEvent('onkeypress',IEMems.DispEventOnEnter);
    end else
    if (IEMems.MyIE<>nil)and IEMems.MyIE.DocIsReady then begin


    end;
//И не забываем возвращать браузеру результат, говорящий что все удалось
    Result := S_OK;
end;
Продолжение следует...
Вложения
Тип файла: rar iexplorer.rar (6.0 Кб, 7 просмотров)
I'm learning to live...

Последний раз редактировалось Stilet; 21.05.2015 в 17:14.
Stilet вне форума Ответить с цитированием
Старый 21.05.2015, 17:07   #70
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию GUI в качестве HTML браузера (на базе IE) - Кишки 2

Навесив таким образом событие на сам браузер и реакцию для обработки его элементов переходим к самим интерфейсам, ловящим события конкретных типов (Клик и нажатие клавиши)
Код:
function TWebBrowserEventOnClick.Invoke(DispID: LongInt; const iid: TGUID;
  LocaleID: longint; Flags: Word; var params; VarResult, ExcepInfo,
  ArgErr: pointer): HResult; stdcall;
begin
  OnEventProc;
  Result := S_OK;
end; 

function TWebBrowserEventOnKeyPress.Invoke(DispID: LongInt; const iid: TGUID;
  LocaleID: longint; Flags: Word; var params; VarResult, ExcepInfo,
  ArgErr: pointer): HResult; stdcall;
begin
  OnEventProc;
  Result := S_OK;
end;
Поскольку события в целом однотипные, я в оба этих обработчика поместил один и тот де код. Вот как он выглядит в качестве процедуры

Код:
procedure OnEventProc;
var ev:IHTMLEventObj; evrec:TIExplorerEventRecord;
  htmlwnd:IHTMLWindow2;
  evelement:IHTMLElement;
begin
   if Assigned(IEMems.MyIE.OnEvent) then begin
//Мы получаем window браузера
    htmlwnd:=IEMems.ihtm.parentWindow;
//из которого извлекаем сработавшее событие, поскольку в браузере
//оно идет по всем ветвям от самого вложенного компонента до окна,
// пока bubble не остановится принудительно
    ev:=htmlwnd.Get_event;
    if ev<>nil then begin
//Если событие получено, получим элемент, на котором оно сработало
      evelement:=ev.srcElement;
//Тип события, по факту его название
      evrec.eventName:=ev.type_;
      if evelement<>nil then begin
//Тег элемента, который вызвал событие, ID, координаты и... кучу всего 
//прочего, если необходимо
        evrec.Tag:=evelement.tagName;
        evrec.ID:=evelement.id;
//вот так я извлекаю из тега с префиксом if код скрипта Алисы
//Который и будет выполняться        
        evrec.code:=VarToStr(evelement.getAttribute('if'+evrec.eventName,2));
        evrec.X:=ev.x;
        evrec.Y:=ev.y;
        evrec.KeyPressedCode:=ev.keyCode;
        evrec.KeyPressedChar:=Utf8ToAnsi(chr(evrec.KeyPressedCode));
        evrec.MouseButton:=ev.button;
      end else begin
        evrec.Tag:='';
        evrec.ID:='';
        evrec.code:='';
        evrec.KeyPressedChar:=#0;
        evrec.KeyPressedCode:=0;
        evrec.X:=-1;
        evrec.Y:=-1;
        evrec.MouseButton:=-2;
      end;
//И если код такой существует, т.е. if-атрибут не пустой - передаю
//его интерпретатору наружу компонента
      if evrec.code<>'' then
         IEMems.MyIE.OnEvent(IEMems.MyIE,evrec);
    end;
   end;
end;
Собственно все. Далее дело техники. Алиса работает в качестве скриптового двига, делая что-то свое. Более как бы браузера действия дальнейшие и не касаются.

Таким образом не сложно допилить кучу всяких реакций на остальные события, работающие в JS. Мне пока не требуется, и буду делать это по мере необходимости.

Сам компонент я тут описывать не стану, думаю достаточно заглянуть в прикрепленный файл, найти там описание TIExplorer=class(TWinControl), чтоб понять как его подключить к форме.

Вот как-то так... IE всетки полезный браузер несмотря на его кривость, и может послужить в достаточно серьезных проектах в качестве машинки для GUI. Я думаю многие согласятся, что описать интерфейс пользователя на HTML не составляет большого труда, так что можно его юзать достаточно эффективно.
I'm learning to live...

Последний раз редактировалось Stilet; 21.05.2015 в 17:16.
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хочу написать программу для себя Marishka.S Помощь студентам 7 02.10.2011 17:23