Re: !!!Пожалуста помогите!!!
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.03.02 20:40
Оценка:
Здравствуйте Иванов Иван Петрович, Вы писали:

ИИП>Мне нужна програмка , которая бы написанный текст на Pascal`е в копаненте Memo(например) выполнялась в делфи ???!!!???

ИИП>Помогите пожалуста.

Гм. Я понимаю, людям некогда учить русский язык, будем учить Delphi.
Хорошо.
Сделать компилятор, который прямо генерит Паскаль-код, а потом его выполняет, весьма сложно. Это я так. К слову.

Предоставить возможность написать функцию, а потом вызвать ее из кода того же приложения и даже получить результат, можно сравнительно легко, если ограничиться одной сигнатурой. Например, функции вида

function DoSomething(Param: Integer): Integer;
begin
  if Param<=1 then return param else return DoSomething(Param-1);
end;

достаточно легко обработать следующим образом:
предварить процедурку кодом типа
library RandGeneratedId46721454;
function <%parsedfunctionname%>(Param: Integer): Integer; forward;
exports <%parsedfunctionname%>;

и добавить в конец код
begin end.

Полученный текст скинуть на диск, компильнуть dcc, потом загрузить полученный dll (LoadLibrary) и законопатить функцию при помощи GetProcAddress. Надеюсь, парсинг текста в поисках имени функции не представляет проблемы.
Подход можно расширить — поддерживать не одну сигнатуру, а несколько.

Второй вариант интерпретации столь детально сформулированной задачи таков: надо скомпилировать программу на дельфи целиком, т.е. в Memo лежит текст вида

program TheProgram;
uses Classes, SysUtils, Messages, Windows, CustomCode;
type
  TForm1 = class(TCustomForm, IComplexDispatchExtension, IStream, IWebBrowser2)
    ...
  end;
var
  WillItCrash: variant;
begin
  WillItCrash:= TForm1.Create(TComponent(Application));
  try
    FreeLibrary(GetModuleHandle('Ole32.dll');
    WillItCrash.FakeMethod(TObject(@WillItCrash).ClassName)
  finally
    VarClear(WillItCrash);
  end;
end;

, то это будет довольно сложно компилять. Потому, что модуль CustomCode, использованный в строке 2, может лежать непонятно где. А попытки писать в таком приложении на псевдопаскале, типа
program Pascal32Program;
var
  Hello: String;
begin
  Hello:= "USA";
//  Hello:= "World"; // NB: Do not forget to uncomment in international version!
  WriteLn(FormatStr("Hello, %s!", [Hello])); 
end;

кончатся печально — пока линкеру не сказано, что это консольное приложение, никаких WriteLn не будет.

Мораль: для того, чтобы сделать более полноценное решение, которое бы выполнялась в делфи ???!!!???, надо понимать, что за текст на Pascal`е предполагается быть в копаненте Memo(например)
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.