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

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

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

Ответить
Аватара пользователя
ANTIKLAN
новенький
Сообщения: 55
Зарегистрирован: 25.02.2015 08:21:42

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

Сообщение ANTIKLAN »

Всем привет!
Обновился на 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 02:15:55, всего редактировалось 1 раз.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

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

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

  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;                                 
Аватара пользователя
ANTIKLAN
новенький
Сообщения: 55
Зарегистрирован: 25.02.2015 08:21:42

Сообщение ANTIKLAN »

Я посмотрел исходник и посмотрел список изменений для 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

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

Сообщение Лекс Айрин »

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

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

result:= IntToStr(Info.FixedInfo.FileVersion[0])+'.'+IntToStr(Info.FixedInfo.FileVersion[1])+'.'+IntToStr(Info.FixedInfo.FileVersion[2])+'.'+IntToStr(Info.FixedInfo.FileVersion[3]);
 
Аватара пользователя
ANTIKLAN
новенький
Сообщения: 55
Зарегистрирован: 25.02.2015 08:21:42

Сообщение ANTIKLAN »

Лекс Айрин писал(а):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?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

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

А насчет понимания... просто все явно переделали.
Аватара пользователя
ANTIKLAN
новенький
Сообщения: 55
Зарегистрирован: 25.02.2015 08:21:42

Сообщение ANTIKLAN »

В общем разобрался я =) По описанию в 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;

Всем спасибо кто откликнулся =)
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

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

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

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

И ни где не получается найти решение проблемы. Гуглил. Предлагают какие-то странные не работающие алгоритмы.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

Добавлено спустя 49 секунд:
Для образца - посмотри код RxVersInfo
Там это уже все сделано.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

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

Спасибо, воспользовался RxVersionInfo
Ответить