[Решено]Ошибка компиляции. Прошу помощи.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

[Решено]Ошибка компиляции. Прошу помощи.

Сообщение ANTIKLAN » 09.06.2016 13:50:56

Всем привет!
Обновился на Lazarus 1.6 и перестала работать в процедуре эта строка: AboutVersionLabel.Caption := 'Версия: ' + FileVersionInfo.getVersionSetting('FileVersion');
Ошибка выдаваемая при компиляции: Error: identifier idents no member "getVersionSetting"

Вот сама отказавшая процедура:
Код: Выделить всё
procedure TAboutForm.FormCreate(Sender: TObject);
var
  FileVersionInfo: TFileVersionInfo;
begin
  FileVersionInfo := TFileVersionInfo.Create(nil);
  FileVersionInfo.FileName := Application.ExeName;
  AboutVersionLabel.Caption := 'Версия: ' + FileVersionInfo.getVersionSetting('FileVersion');
  FileVersionInfo.Free;
end;

Скажите правильно ли я понимаю что это из-за изменений в самом модуле fileinfo? И если да, то научите пожалуйста как устранять подобные проблемы. Прошу доходчивых объяснений чтобы пришло понимание. :)
Последний раз редактировалось ANTIKLAN 10.06.2016 03:15:55, всего редактировалось 1 раз.
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42

Re: Ошибка компиляции. Прошу помощи.

Сообщение Лекс Айрин » 09.06.2016 14:23:20

в случае глюков всегда стоит посмотреть реализацию (когда понятно что требует процедура/функция) и примеры использования. Ну и поиск по форуму не помешает.

на форуме уже есть, но выкладываю чтобы долго не искать рабочий пример:

Код: Выделить всё
  function get_version_info: string;
uses
  Forms, ExtCtrls, Classes, FileInfo; 
.....
implementation

{$R *.lfm}
uses main, SysUtils;
function get_version_info: string;
// initialize a bunch of stuff for this app when the form is first opened
// [0] = Major version, [1] = Minor ver, [3] = Revision, [4] = Build Number
// The above values can be found in the menu: Project > Project Options > Version Info
// Add the following to your uses statement: vinfo, versiontypes
var
   Info: TVersionInfo;
begin
  Info := TVersionInfo.Create;
  Info.Load(HINSTANCE);
  // grab just the Build Number
  result:= IntToStr(Info.FixedInfo.FileVersion[0])+'.'+IntToStr(Info.FixedInfo.FileVersion[1])+'.'+IntToStr(Info.FixedInfo.FileVersion[2])+'.'+IntToStr(Info.FixedInfo.FileVersion[3]);
  Info.Free;
end;                                 
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Ошибка компиляции. Прошу помощи.

Сообщение ANTIKLAN » 09.06.2016 15:39:18

Я посмотрел исходник и посмотрел список изменений для Lazarus 1.6 там говорится что теперь надо делать через ReadFileInfo. Вот выдержка из текста:
TVersionInfo (fileinfo unit) re-implemented in a platform independent way
Old behaviour: GetVersionSetting method would read file information.
New behaviour: The ReadFileInfo call will read the information. The global GetProgramVersion call will extract the program major/minor/revision/build version in 1 single call.
Reason: The unit now uses FPC resources on all platforms, and can now be used to read external resources.
Remedy: Use the ReadFileInfo call to get the version information. Add relevant units for desired resource support to your uses clause; e.g. if you need to read Windows .exe file info, add winpeimagereader

Но как делать я не понимаю. Поясните кто-нибудь.
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42

Re: Ошибка компиляции. Прошу помощи.

Сообщение Лекс Айрин » 09.06.2016 17:04:59

ANTIKLAN, я привел в прошлом посте полностью работоспособный пример, выдранный из работающей проги. Единственное замечание по нему это модуль main -- его включение придется убрать. Не доглядел.
Если не собираешься играться с положением элементов, то просто вставляй к себе. Если собираешься, то обрати внимание на строку
Код: Выделить всё
result:= IntToStr(Info.FixedInfo.FileVersion[0])+'.'+IntToStr(Info.FixedInfo.FileVersion[1])+'.'+IntToStr(Info.FixedInfo.FileVersion[2])+'.'+IntToStr(Info.FixedInfo.FileVersion[3]);
 
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Ошибка компиляции. Прошу помощи.

Сообщение ANTIKLAN » 09.06.2016 17:37:48

Лекс Айрин писал(а):ANTIKLAN, я привел в прошлом посте полностью работоспособный пример, выдранный из работающей проги. Единственное замечание по нему это модуль main -- его включение придется убрать. Не доглядел.
Если не собираешься играться с положением элементов, то просто вставляй к себе. Если собираешься, то обрати внимание на строку
Код: Выделить всё
result:= IntToStr(Info.FixedInfo.FileVersion[0])+'.'+IntToStr(Info.FixedInfo.FileVersion[1])+'.'+IntToStr(Info.FixedInfo.FileVersion[2])+'.'+IntToStr(Info.FixedInfo.FileVersion[3]);
 

Да мне вообще то хотелось разобраться со своим примером. Мне знания нужны, а не готовые решения, которые я буду тупо без понимания вставлять. Хотя и за это тоже спасибо. Может все таки разберем изменение, которое было сделано в Lazaarus 1.6?
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42

Re: Ошибка компиляции. Прошу помощи.

Сообщение Лекс Айрин » 09.06.2016 18:40:53

ANTIKLAN, у тебя есть как работало и как стало.... сравнивай.

У меня на всех компах стоят транковые версии, правда немножко устаревшие... так что как оно было в версии до 1.7 (1.6) я не смогу посмотреть при всем желании. А пример... просто обсуждали и я встроил в свою прогу, так как вручную писать версию задалбывает.

А насчет понимания... просто все явно переделали.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Ошибка компиляции. Прошу помощи.

Сообщение ANTIKLAN » 10.06.2016 03:04:25

В общем разобрался я =) По описанию в Wiki FreePascal. Вот ссылка: http://wiki.freepascal.org/Show_Application_Title,_Version,_and_Company
Теперь мой код должен быть таким:
Код: Выделить всё
procedure TAboutForm.FormCreate(Sender: TObject);
var
  FileVersionInfo: TFileVersionInfo;
begin
  FileVersionInfo := TFileVersionInfo.Create(nil);
  FileVersionInfo.FileName := Application.ExeName;
  FileVersionInfo.ReadFileInfo;
  AboutVersionLabel.Caption := 'Версия: ' + FileVersionInfo.VersionStrings.Values['FileVersion'];
  FileVersionInfo.Free;
end;

Всем спасибо кто откликнулся =)
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42

Re: [Решено]Ошибка компиляции. Прошу помощи.

Сообщение jsa » 13.10.2020 15:45:31

Вот это
FileVersionInfo.FileName := Application.ExeName;
не обязательно.
по умолчанию, будет исполняемая программа.

С самой программой нет проблемы.
А вот узнать версию других exe-шников не возможно.

Если задать например
FileVersionInfo.FileName := 'C:\Windows\notepad.exe'
то будет ошибка - cannot find resource reader for extension '.exe'

И ни где не получается найти решение проблемы. Гуглил. Предлагают какие-то странные не работающие алгоритмы.
jsa
постоялец
 
Сообщения: 172
Зарегистрирован: 28.11.2017 13:46:04

Re: [Решено]Ошибка компиляции. Прошу помощи.

Сообщение alexs » 14.10.2020 10:18:07

Подключи модуль winpeimagereader

Добавлено спустя 49 секунд:
Для образца - посмотри код RxVersInfo
Там это уже все сделано.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3943
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: [Решено]Ошибка компиляции. Прошу помощи.

Сообщение jsa » 15.10.2020 15:34:07

alexs писал(а):Там это уже все сделано.

Спасибо, воспользовался RxVersionInfo
jsa
постоялец
 
Сообщения: 172
Зарегистрирован: 28.11.2017 13:46:04


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru