Error: identifier idents no member "Handle"

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

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

Error: identifier idents no member "Handle"

Сообщение Iv_ » 08.01.2011 23:09:11

Добрый день.
Программировать начинал с Turbo Delphi Explorer, теперь решил пересесть на Lazarus.
В своих программах, для отображения листингов расчетов использовал модули ExprDraw и ExprMake, разработанные Григорьевым Антоном. Модули, в общем-то представляют собой два файла с расширением .pas (ExprDraw.pas и ExprMake.pas) и отлично отрисовывают любые формулы. В Lazarus столкнулся с некоторыми проблемами при их использовании, которые до сих пор не решены.

Изначально была вот такая ошибка:
на строчку:
Код: Выделить всё
FFont.OnChange:=FontNotify;

ExprDraw.pas(791,32) Error: Wrong number of parameters specified for call to "FontNotify"
Решилась постановкой @:
Код: Выделить всё
FFont.OnChange:=@FontNotify;

Далее возникла вот такакая ошибка:
на строчку:
Код: Выделить всё
procedure TExprClass.SetNext;

ExprDraw.pas(818,25) Error: function header doesn't match any method of this class "TExprClass.SetNext;"
решилась вместе с первой проблемой включением режима совместимости с Delphi:
Код: Выделить всё
{$mode Delphi}

Теперь вылазят ошибки, с которыми я не знаю. что делать... был бы поопытнее, переписал бы эти модули.
Собственно - ошибки:
В процедуре по отрисовыванию знака "набла" на строчку:
Код: Выделить всё
lfHeight:=-MulDiv(GetDeviceCaps(Canvas.Handle,LogPixelSY),Font.Size,72);

ExprDraw.pas(3741,48) Error: identifier idents no member "Handle"
пробовал закомментировать все, что связано с "набла", т.к. мне она не нужна, но получил следующее:
В описании:
Код: Выделить всё
  type TExprBuilder=class
                      protected
                       Build:Boolean;
                       P:Integer;
                       S:string;
                       function Preprocess(S:string):string;

ExprMake.pas(12,44) Error: Duplicate identifier "S"
Вроде действительно - дублируется, но в Delphi это все работало... Помогите разобраться, пожалуйста.

У меня Lazarus 0.9.28.2 бета fpc 2.2.4 под Windows Vista. В Ubuntu 10.10 ситуация такая же.
Iv_
новенький
 
Сообщения: 36
Зарегистрирован: 08.01.2011 22:52:44

Re: Error: identifier idents no member "Handle"

Сообщение Padre_Mortius » 08.01.2011 23:37:16

ExprMake.pas(12,44) Error: Duplicate identifier "S"
Вроде действительно - дублируется, но в Delphi это все работало... Помогите разобраться, пожалуйста.

Переименуйте переменную S в, например, Str или aStr
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Error: identifier idents no member "Handle"

Сообщение Iv_ » 08.01.2011 23:48:46

Логично, спасибо. Но тут проблема глубже зарылась...
Там есть следующие функции типа: function BuildExpr(Expr:string):TExprClass; Они тоже дублируются.
Переменная Expr используется вообще по всему модулю в обоих файлах...
Я попробую и ее заменить, но, не уверен за результат.
Спасибо.
Если интересно, то сами модули можно скачать тут (всего 52 КБ):
http://www.delphisources.ru/pages/sourc ... awing.html
Может более понятно станет.

Добавлено спустя 25 минут 36 секунд:
Прошу прощения.
Во втором файле тоже поставил режим совместимости с делфи, и лазарус ругаться на дублирование перестал.
Там же закомментировал все, что касалось наблы. добрались до своего файла с программой.

Добавлено спустя 8 минут 49 секунд:
И ещё, не подскажете, почему ругается вот на это:

Код: Выделить всё
// процедура для вывода ед. изм. типа "кг/см2" курсивом
procedure har5(Cnv:TCanvas; x,y:integer; s1:string);
  var Expr: TExprClass;
      FOld: HFont;
  begin
   FOld:=Cnv.Font.Handle;
   Expr:=BuildExpr(s1);
   Expr:=TExprChain.Create(Expr);
   Expr.Font.Size:=8;
   Expr.Font.Name:='Tahoma';
   Expr.Canvas:=Cnv;
   Expr.Draw(x,y,ehLeft,evTop);
   Expr.Free;
   Cnv.Font.Handle:=FOld;
  end;


Unit1.pas(32,2) Warning: Misplaced global compiler switch
Unit1.pas(37,18) Error: Identifier not found "HFont"
Unit1.pas(37,18) Error: Error in type definition
Unit1.pas(39,19) Warning: Symbol "Handle" is deprecated
Unit1.pas(51,13) Warning: Symbol "Handle" is deprecated
Unit1.pas(51,25) Error: Incompatible type for arg no. 1: Got "<erroneous type>", expected "LongWord"
Unit1.pas(66) Fatal: There were 3 errors compiling module, stopping


И еще, если ставлю в своем файле режим совместимости с делфи:
вместо {$R *.lfm} ставлю {$mode Delphi}
все компилируется, но форма - пустая.
если оставляю как есть - {$R *.lfm} вылетает ошибка:
c:lazarus0928fpc2.2.4bini386-win32windres.exe: can't open file `TForm1': No such file or directory
Unit1.pas(59,2) Error: Error while linking


Добавлено спустя 9 минут 21 секунду:
И, раз уж затронул эту тему...
Как подобные вещи должны быть написаны под Лазарусом?
Например, как сохранить старый стиль шрифта, чтобы после изменений его вернуть?
Iv_
новенький
 
Сообщения: 36
Зарегистрирован: 08.01.2011 22:52:44

Re: Error: identifier idents no member "Handle"

Сообщение Vadim » 09.01.2011 06:14:40

Iv_ писал(а):вместо {$R *.lfm} ставлю {$mode Delphi}

Это, мягко говоря, совершенно разные вещи. Их нельзя ставить одно вместо другого. К примеру, у Вас есть сковородка, чтобы жарить яишницу и вилка, чтобы эту яишницу есть. Теперь представьте, что Вы сковородку заменили вилкой и попытались изжарить на ней яишницу. :)
{$R *.lfm} - эта директива включает в Вашу программу ресурсный файл с описание формы. В этом файле с расширением .lfm находится описание формы и расположения на ней всех нужных программе элементов - размеры, координаты и т.п. Вы файл с описанием формы изъяли. ;)
{$mode Delphi} - эта директива указывает компилятору режим совместимости с Delphi.
Логично предположить, что если Ваша программа должна компилироваться в режиме совместимости с Delphi и в Вашей программе используется форма с каими то элементами управления, то должны присутствовать обе директивы.

Добавлено спустя 6 минут 32 секунды:
Iv_ писал(а):как сохранить старый стиль шрифта, чтобы после изменений его вернуть?

Точно так же, как это делалось в Delphi.
Стиль шрифта - это обощённое название параметров шрифта. Следовательно, те прараметры шрифта, которые Вы изменяете, Вы должны сохранить. Например, название, размер, признак наклонности и т.п. Если Вам, впоследствии, нужно отменить изменения, то Вы считываете эти сохранённые где-нибудь (в доп. переменных или в ini-файле) параметры.

Добавлено спустя 19 минут 51 секунду:
Iv_ писал(а):Unit1.pas(37,18) Error: Identifier not found "HFont"

Это типичная ошибка невнимательного программиста. :)
Все определения типов данных описаны в каких-то определённых модулях. Вы модуль с определением HFont подключили? ;)
если не знаете, где описано определение этого типа, воспользуйтесь контекстным поиском - ищите, в каком файле находится строка "HFont =".
Iv_ писал(а):Unit1.pas(37,18) Error: Error in type definition

Эта ошибка полностью связана с той, что Выше - устраните первую, вторая пропадёт автоматически.
***********************
P.S. Хочу заметить, что есть более изящный способ сохранения параметров шрифта, не связанный с описанием многочисленных его параметров:
1. Объявить переменную типа TFont.
2. Назначить ему специальным методом параметры другой переменной типа TFont, который Вы хотите сохранить.
Код: Выделить всё
Var
  FOld: TFont;
Begin
  FOld:=TFont.Create;
  FOld.Assign(Cnv.Font);
  ...
End;

Очень важно! Эта переменная, FOld, должна быть доступна из того места, откуда Вы будете восстанавливать старые параметры шрифта. По всей видимости эту переменную надо сделать членом класса формы и создавать в событии OnCreate этой формы.
************************
Iv_ писал(а):Unit1.pas(51,25) Error: Incompatible type for arg no. 1: Got "<erroneous type>", expected "LongWord"

Опять типичная ошибка невнимательного программиста. ;)
Вы подсовываете компилятору неправильный тип данных. Он от Вас ожидает тип LongWord, а Вы ему суёте чёрте что и в попе бантик. :)
Строка эта, в том исходнике, что Вы тут привели, отсутствует, поэтому смотрите её сами, где в ней проблема.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Error: identifier idents no member "Handle"

Сообщение Iv_ » 09.01.2011 10:09:37

Спасибо, Vadim. Вы многое мне прояснили. Пошел все править : )

Добавлено спустя 3 часа 49 минут 45 секунд:
Ещё вопрос остался.
c:lazarus0928fpc2.2.4bini386-win32windres.exe: can't open file `TForm1': No such file or directory
этот файл точно есть, я нашел его по поиску. Чего тут может не нравиться?
Iv_
новенький
 
Сообщения: 36
Зарегистрирован: 08.01.2011 22:52:44

Re: Error: identifier idents no member "Handle"

Сообщение Vadim » 09.01.2011 16:08:16

{$R *.lfm} - должно быть.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Error: identifier idents no member "Handle"

Сообщение Iv_ » 09.01.2011 16:40:22

Это все есть. Сижу и читаю про то, что вы мне объяснили.
Заодно пробую, что получится. Вот, создал тест,

Код: Выделить всё
unit Unit1;

//{$mode objfpc}{$H+}
{$mode Delphi}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons,
  ExtCtrls, StdCtrls, ExprDraw, ExprMake;

type

  { TForm1 }

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Edit1: TEdit;
    Image1: TImage;
    procedure BitBtn1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}


// процедура для вывода ед. изм. типа "кг/см2" курсивом
procedure har5(Cnv:TCanvas; x,y:integer; s1:string);
  var Expr: TExprClass;
//      FOld: HFont;
  begin
//   FOld:=Cnv.Font.Handle;
   Expr:=BuildExpr(s1);
   Expr:=TExprChain.Create(Expr);
   Expr.Font.Size:=8;
   Expr.Font.Name:='Tahoma';
   Expr.Canvas:=Cnv;
   Expr.Draw(x,y,ehLeft,evTop);
   Expr.Free;
//   Cnv.Font.Handle:=FOld;
  end;

{ TForm1 }

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   har5(Form1.Image1.Canvas,5,5,'кг//см^2');
end;

end.


Ошибка про невозможность открыть файл ввиду его отсутствия осталась.
Iv_
новенький
 
Сообщения: 36
Зарегистрирован: 08.01.2011 22:52:44

Re: Error: identifier idents no member "Handle"

Сообщение Vadim » 09.01.2011 18:20:18

Iv_
Тогда надо посмотреть на весь проект, так мне ничего в голову не приходит. Выложите сюда архив со всеми исходниками.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Error: identifier idents no member "Handle"

Сообщение Iv_ » 09.01.2011 20:54:25

Да, в общем-то в том коде, который я выложил и есть весь проект. Я тестировал как будут выводиться формулы в Лазарусе...
Чтобы не мучиться сразу с большой программой.
Вот тут можно скачать весь проект целиком:
http://fayloobmennik.net/302458
Iv_
новенький
 
Сообщения: 36
Зарегистрирован: 08.01.2011 22:52:44

Re: Error: identifier idents no member "Handle"

Сообщение svk12 » 10.01.2011 02:14:04

Iv_ писал(а):Спасибо, Vadim. Вы многое мне прояснили. Пошел все править : )

Добавлено спустя 3 часа 49 минут 45 секунд:
Ещё вопрос остался.
c:lazarus0928fpc2.2.4bini386-win32windres.exe: can't open file `TForm1': No such file or directory
этот файл точно есть, я нашел его по поиску. Чего тут может не нравиться?


Ваша версия FPC не поддерживает использование файлов .lfm.
Следует обновиться, например, отсюда :
ftp://ftp.freepascal.org/pub/lazarus/
svk12
постоялец
 
Сообщения: 408
Зарегистрирован: 09.06.2008 18:42:47

Re: Error: identifier idents no member "Handle"

Сообщение Iv_ » 10.01.2011 10:02:17

to svk12
Спасибо, но...
1) У меня Lazarus 0.9.28.2 бета fpc 2.2.4. Там, куда вы указали выложено то же самое.
2) Другие программы, компилируются и работают нормально, хотя тоже используют файл .lfm (насколько я понял - это файл, содержащий форму и т.д.).
Iv_
новенький
 
Сообщения: 36
Зарегистрирован: 08.01.2011 22:52:44

Re: Error: identifier idents no member "Handle"

Сообщение Vadim » 10.01.2011 13:01:35

Iv_
У меня Ваш проект скомпилировался без ошибок и запустился.
Попробуйте на этот проект плюнуть, а создать совсем новый, с нуля.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Error: identifier idents no member "Handle"

Сообщение Iv_ » 10.01.2011 14:16:39

Спасибо. Последовал вашему совету. Скомпилировалось.
Еще заметил пару особенностей, может поясните:

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, Buttons, ExprDraw, ExprMake;

type

  { TForm1 }

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Image1: TImage;
    procedure BitBtn1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

// процедура для вывода ед. изм. типа "кг/см2" курсивом
procedure har5(Cnv:TCanvas; x,y:integer; s1:string);
  var Expr: TExprClass;
//      FOld: HFont;
  begin
//   FOld:=Cnv.Font.Handle;
   Expr:=BuildExpr(s1);
   Expr:=TExprChain.Create(Expr);
   Expr.Font.Size:=8;
   Expr.Font.Name:='Tahoma';
   Expr.Canvas:=Cnv;
   Expr.Draw(x,y,ehLeft,evTop);
   Expr.Free;
//   Cnv.Font.Handle:=FOld;
  end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   har5(Form1.Image1.Canvas,5,5,'кг//см^2');
end;

initialization
  {$I Unit1.lrs}

end. 


Изменилась секция implementation

Код: Выделить всё
//Раньше:
implementation
{$R *.lfm}
//Сейчас:
implementation
{ TForm1 }
//То бишь - она стала пустой.

И появилась еще одна секция перед последним END. и выглядит так:
Код: Выделить всё
initialization
  {$I Unit1.lrs}

Почему так произошло?

И еще, при нажатии на кнопку у меня весь квадрат (Image1) черным заливается.
Я уже решал эту проблему более аккуратным написанием, но хотелось бы знать, почему так происходит?
Iv_
новенький
 
Сообщения: 36
Зарегистрирован: 08.01.2011 22:52:44

Re: Error: identifier idents no member "Handle"

Сообщение Odyssey » 10.01.2011 15:29:42

Iv_ писал(а):Изменилась секция implementation ... И появилась еще одна секция перед последним END. и выглядит так:
Код: Выделить всё
initialization
  {$I Unit1.lrs}

Почему так произошло?

FPC версии 2.2.4 не поддерживал подключение ресурсов в стиле Delphi ({$R resourcefile}), поэтому Lazarus обходит это с помощью подключения lrs-файлов через include. Поддержка ресурсов появилась в FPC 2.4.0. Актуальная на данный момент версия FPC -- 2.4.2.

Варианты: можно работать с той версией, которая есть, оставив {$I Unit1.lrs}, либо обновиться до новых Lazarus и FPC, и тогда использовать {$R *.lfm}.

Если решите обновиться: Хотя версия 0.9.30 ещё не выпущена, последние тестовые сборки 0.9.29 считаются релиз-кандидатами, и теоретически должны быть относительно стабильны. Тестовую сборку можно скачать с этой страницы. Прямая ссылка на инсталлятор для Win32: ftp://ftp.hu.freepascal.org/pub/lazarus ... -win32.exe
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Error: identifier idents no member "Handle"

Сообщение Vadim » 10.01.2011 15:33:27

Iv_ писал(а):Код: Выделить всё
initialization
{$I Unit1.lrs}

Почему так произошло?

Не знаю. У меня таких метаморфоз не происходит. Правда и версия у меня 0.9.29. :)
Iv_ писал(а):И еще, при нажатии на кнопку у меня весь квадрат (Image1) черным заливается.
Я уже решал эту проблему более аккуратным написанием, но хотелось бы знать, почему так происходит?

Здесь нужно мнение кого-то из теоретиков. :) А практически - надо принудительно поставить нужный Вам цвет кисти. Вот, для примера:
Код: Выделить всё
procedure TForm1.FormShow(Sender: TObject);
begin
  Image1.Canvas.Brush.Color:=clWhite;
  Image1.Canvas.FillRect(Image1.ClientRect);
end;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru