Возможность компиляции Delphi2 проекта в Lazarus?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение Electric » 25.01.2020 13:36:21

Снег Север писал(а):Electric, добавьте в секцию uses в 'Undo.pas название модуля Controls.


Да, помогло, эта ошибка исчезла. Но вылезли новые, уже что-то с названием цветов:

Код: Выделить всё
if (Imagoo.TapItem.checked) then begin
      pComp^.pImg_s^.canvas.font.color := clFuchsia;
    end else begin
      pComp^.pImg_s^.canvas.font.color := clBlack;
    end;


Код: Выделить всё
with pComp^.pImg_s^.canvas do begin
      pen.color := clWhite;
      pen.width := 1;
      brush.color := clWhite;
      brush.style := bsSolid;
      rectangle(0,ipu,pComp^.pImg_s^.width,ipu+pComp^.pImg_s^.height div 2);
    end;


Пишет:

Error: TapChanger.pas: Undeclared identifier: 'clFuchsia'
Error: TapChanger.pas: Undeclared identifier: 'clBlack'
Error: TapChanger.pas: Undeclared identifier: 'clWhite'
Error: TapChanger.pas: Undeclared identifier: 'bsSolid'


Добавлено спустя 39 минут 46 секунд:
Добавил в uses файла TapChanger модуль Graphics - проект скомпилировался на Delphi 3 :D .

Добавлено спустя 46 минут 31 секунду:
В новую виртуалку установил Delphi 4, затем сторонние компоненты. Запускаю компиляцию и на этих фрагментах кода вылетают ошибки:

Код: Выделить всё
pEnabled := @pClrWire_s^.enabled;

Код: Выделить всё
pEnabled        := @Enabled;

Код: Выделить всё
pNEnabled    := @pName_s^.Enabled;


Ошибка во всех трех случаях:

[Error] Skemadef.pas: Varible required
[Fatal Error] Enumenu.pas: Could not compile used unit 'Skemadel'


Сама переменная pClrWire_s в коде - это какой-то указатель на изображение:
Код: Выделить всё
pClrWire_s : TpImage;      {pointer to an image of colored wire}
Electric
незнакомец
 
Сообщения: 9
Зарегистрирован: 19.01.2020 20:23:50

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение Cheb » 03.02.2020 05:05:27

Вангую, что компилятор путается, адрес чего вычислять.
Попробуй
Код: Выделить всё
pEnabled := @(pClrWire_s^.enabled);

Я у себя в движке @ всегда со скобками использую - не помню уже, почему, но возможно, именно поэтому.
Похоже, компилятор трактует @pClrWire_s^.enabled как @(pClrWire_s)^.enabled , тупо кастуя указатель к бестиповому.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение Electric » 04.02.2020 15:36:42

Cheb писал(а):Вангую, что компилятор путается, адрес чего вычислять.
Попробуй
Код: Выделить всё
pEnabled := @(pClrWire_s^.enabled);

Я у себя в движке @ всегда со скобками использую - не помню уже, почему, но возможно, именно поэтому.
Похоже, компилятор трактует @pClrWire_s^.enabled как @(pClrWire_s)^.enabled , тупо кастуя указатель к бестиповому.


Не помогло. Та же ошибка.
Electric
незнакомец
 
Сообщения: 9
Зарегистрирован: 19.01.2020 20:23:50

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение Снег Север » 04.02.2020 18:46:13

Electric, в делфи ошибка "Varible required" обычно сигнализирует, что неправильно применяется оператор @ (ссылка). Например, к классу - в делфи класс, это уже ссылка. Получется ссылка на ссылку и компилятор впадает в ступор... Надо внимательно разбираться с такими местами, ето требует времени, разумеется.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2465
Зарегистрирован: 27.11.2007 16:14:47

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение Cheb » 05.02.2020 04:27:02

Тогда у меня исчерпались идеи. Дельфи 4 была последняя версия, которой я пользовался - после этого пересел на фри паскаль, за исключением краткого экскурса в сторону турбо дельфи експлорер (2006 ?) Но я в те годы был таким нубом, что не запомнил особенностей той версии.

Может быть, там где-то включилось {$T+} она же {$TypedAddress On} ?
Если она вообще была в той версии.
1.
Код: Выделить всё
pEnabled := pointer(@(pClrWire_s^.enabled));

2. Убедиться, что поле enabled не превратилось в тыкву (например, что это не свойство и не функция).
3. Убедиться, что тип(pClrWire_s^) - это запись, а не иная неведома зверушка вроде дедовского object.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение SSerge » 05.02.2020 10:25:48

Cheb писал(а):Тогда у меня исчерпались идеи.


У дельфей начиная с какой-то версии, стало запрещено присваивать указателям, имеющим тип, значения безымянных указателей (pointer) без прямого кастинга, т.е. TmyType(pointer) или (pointer as TmyType).
Это наверное и выползает.
SSerge
энтузиаст
 
Сообщения: 870
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение iskander » 05.02.2020 13:05:48

SSerge писал(а):У дельфей начиная с какой-то версии, стало запрещено присваивать указателям, имеющим тип, значения безымянных указателей (pointer) без прямого кастинга

Что-то сомнительно.
Во всяком случае текущая справка утверждает:
Delphi Language Guide писал(а):Type Compatibility.
Every type is compatible with itself.
Two distinct types are compatible if they satisfy at least one of the following conditions.
...
One type is Pointer (an untyped pointer) and the other is any pointer type.
...
iskander
постоялец
 
Сообщения: 241
Зарегистрирован: 08.01.2012 18:43:34

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение Снег Север » 05.02.2020 17:50:53

iskander писал(а):One type is Pointer (an untyped pointer) and the other is any pointer type.

Не помню как там в древних версиях, но сейчас это работает в одну сторону - переменной pointer можно присвоить любую ссылку, но не наоборот, там уже потребуется приведение типов.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2465
Зарегистрирован: 27.11.2007 16:14:47

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение Electric » 05.02.2020 17:52:38

Снег Север писал(а):Electric, в делфи ошибка "Varible required" обычно сигнализирует, что неправильно применяется оператор @ (ссылка). Например, к классу - в делфи класс, это уже ссылка. Получется ссылка на ссылку и компилятор впадает в ступор... Надо внимательно разбираться с такими местами, ето требует времени, разумеется.


Причина скорее всего в этом, но пофиксить её малореально. Я в свое время имел дело только с Delphi 7, писал на нем простейшие калькуляторы, но указатели и ссылки для меня, что в дельфях, что в си плюсах - темный лес.
TpImage упоминается в нескольких файлах проекта, это указатель на TImage.

Код: Выделить всё
type 
  TpImage = ^TImage;


соответственно, pClrWire_s по типу является указателем TpImage:

Код: Выделить всё
pClrWire_s : TpImage;


pEnabled в свою очередь - это константа и ссылка на nil.

Код: Выделить всё
const
pEnabled : ^boolean   = nil;


Добавлено спустя 27 минут 22 секунды:
Cheb писал(а):Может быть, там где-то включилось {$T+} она же {$TypedAddress On} ?


Нет, этих директив (?) в коде проекта не найдено.

Cheb писал(а):1.
Код: Выделить всё
pEnabled := pointer(@(pClrWire_s^.enabled));

2. Убедиться, что поле enabled не превратилось в тыкву (например, что это не свойство и не функция).
3. Убедиться, что тип(pClrWire_s^) - это запись, а не иная неведома зверушка вроде дедовского object.


Пункт 1 ничего не изменил, с остальными пытаюсь разобраться.
Electric
незнакомец
 
Сообщения: 9
Зарегистрирован: 19.01.2020 20:23:50

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение iskander » 05.02.2020 18:33:53

Снег Север писал(а):сейчас это работает в одну сторону - переменной pointer можно присвоить любую ссылку, но не наоборот, там уже потребуется приведение типов.

Следующий фрагмент без особых возражений компилируется в Delphi 10.3 CE:
Код: Выделить всё
type
  TRec = record a, b: Int64 end;
  PRec = ^TRec;

procedure Test;
var
  r: TRec;
  p, p1: Pointer;
  pr, pr1: PRec;
  I: Integer;
begin
  pr := @r;
  p := pr;
  p1 := @I;
  pr1 := p1;
  pr1 := @I;
  p := pr1;
end;

Что я делаю не так?
iskander
постоялец
 
Сообщения: 241
Зарегистрирован: 08.01.2012 18:43:34

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение Cheb » 12.02.2020 17:38:06

Код: Выделить всё
const
pEnabled : ^boolean   = nil;

Код: Выделить всё
pEnabled :=

Тащемта, имеет место недокументированный хак. Сто раз получилось, а в стопицотый - облом.

Встречайте: {$J, она же {$WRITEABLECONST

http://docs.embarcadero.com/products/ra ... s_xml.html объясняет:
In early versions of Delphi and Object Pascal, typed constants were always writeable, corresponding to the {$J+} state. Old source code that uses writeable typed constants must be compiled in the {$J+} state, but for new applications it is recommended that you use initialized variables and compile your code in the {$J-} state.

Фри Паскаль эту байду по умолчанию ставит в ON, а вот как насчёт четвёртого дельфи?
Возможно, именно там запретили пользоваться типизованными константами, как переменными.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Возможность компиляции Delphi2 проекта в Lazarus?

Сообщение Electric » 13.02.2020 19:59:38

Тащемта, имеет место недокументированный хак. Сто раз получилось, а в стопицотый - облом.

Встречайте: {$J, она же {$WRITEABLECONST


Я пробовал раньше добавлять эту директиву в проблемный skemadef.pas файл, который выдавал ошибку "variable required", но это ни на что не влияло. Только сейчас решил добавить эту директиву в главный файл проекта сразу после "unit", и это привело к изменениям. Компилятор не пишет ничего про те прежние ошибки в skemadef (возможно он не доходит до них), он находит целую кучу ошибок в главном файле. Пытаюсь понять, что к чему.

Добавлено спустя 16 минут 10 секунд:
Куча ошибок в главном файле исчезла, когда я заменил проблемную переменную на указатель на неё.
После этого ошибки в главном файле исчезли, возникли в другом файле и тоже с указателями :)

Код: Выделить всё
unit Paramrep;
{$J+}
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, StdCtrls, ComCtrls, Tabnotbk, ExtCtrls, Tab, Utildef, Skemadef,
  Imagodef, Routines, Buttons, Earthflt, shortcir, printers,PQrelay, polygon,
  recloser;

type
  TParamForm = class(TForm)
    TetMenu: TMainMenu;
    FileMenu: TMenuItem;
    PageItem: TMenuItem;
    PrintItem: TMenuItem;
    SaveItem: TMenuItem;
    N1: TMenuItem;
    ExitItem: TMenuItem;
    EditItem: TMenuItem;
    TabItem: TMenuItem;
    DelItem: TMenuItem;
    ButPanel: TPanel;
    Params: TTabbedNotebook;
    ParamMemo: TMemo;


далее упоминание по тексту последней переменной ParamMemo вызывает ошибку "Incompatible types: TMemo and TRichEdit"

Код: Выделить всё
procedure TParamForm.FormCreate(Sender: TObject);
{initialize the form position etc.}
var
  ii : integer;  {index}
begin
  {initialize the memos}
  for ii := 1 to maxmem do begin     {clear pointers to memos initially}
    MemoPntrArr[ii] := nil;
  end;
  MemoPntrArr[1] := @ParamMemo;
Electric
незнакомец
 
Сообщения: 9
Зарегистрирован: 19.01.2020 20:23:50

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru