Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2016, 14:41   #1
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию структура юнита

Добрый день, решил вынести Функции и процедуры в отдельные юниты...
И тут вопрос возник, код:
Код:
unit GetFileVersionUnit;

interface

uses idhttp,System.Classes, IdComponent,VCL.Forms,System.SysUtils,System.Types,Winapi.Windows;




var
work,max:integer;

    procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
    procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCountMax: Int64);
    procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);


implementation

{Функция возвращает версию файла}
function GetFileVersion(const FileName: string): integer;
type
  PDWORD = ^DWORD;
  PLangAndCodePage = ^TLangAndCodePage;
  TLangAndCodePage = packed record
    wLanguage: WORD;
    wCodePage: WORD;
  end;
  PLangAndCodePageArray = ^TLangAndCodePageArray;
  TLangAndCodePageArray = array[0..0] of TLangAndCodePage;
var
  loc_InfoBufSize: DWORD;
  loc_InfoBuf: PChar;
  loc_VerBufSize: DWORD;
  loc_VerBuf: PChar;
  cbTranslate: DWORD;
  lpTranslate: PDWORD;
  i: DWORD;
  temp,rez:String;
begin
  Result := 0;
  if (Length(FileName) = 0) or (not Fileexists(FileName)) then
    Exit;
  loc_InfoBufSize := GetFileVersionInfoSize(PChar(FileName), loc_InfoBufSize);
  if loc_InfoBufSize > 0 then
  begin
    loc_VerBuf := nil;
    loc_InfoBuf := AllocMem(loc_InfoBufSize);
    try
      if not GetFileVersionInfo(PChar(FileName), 0, loc_InfoBufSize, loc_InfoBuf)
        then
        exit;
      if not VerQueryValue(loc_InfoBuf, '\\VarFileInfo\\Translation',
        Pointer(lpTranslate), DWORD(cbTranslate)) then
        exit;
      for i := 0 to (cbTranslate div SizeOf(TLangAndCodePage)) - 1 do
      begin
        if VerQueryValue(loc_InfoBuf,PChar(Format('StringFileInfo\0%x0%x\FileVersion', [PLangAndCodePageArray(lpTranslate)[i].wLanguage,PLangAndCodePageArray(lpTranslate)[i].wCodePage])),Pointer(loc_VerBuf),DWORD(loc_VerBufSize)) then
        begin
          temp:= loc_VerBuf;

          rez:=copy(temp,1, POS('.',temp)-1  );

          Result := strtoint(rez);
          Break;
        end;
      end;
    finally
      FreeMem(loc_InfoBuf, loc_InfoBufSize);
    end;
  end;
end;


{Блок функций, показывающей проценты загрузкир}
function procent:integer;
var
 temp:integer;
begin
 temp:=100*work;
 result:= temp div  max;
end;
procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
work:=AWorkCount;
//form1.statusbar1.Panels[2].Text:='Определение версии на сервере: '+inttostr(procent)+'%';
end;

procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
max:=AWorkCountMax;
end;

procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
//form1.statusbar1.Panels[2].Text:='Определение версии на сервере: 100%';
end;


{Функция, принимающая ссылку, загружающая файл и определяющая версию файла}
Function DownloadGetVersion(URL:String):integer;
var
http:Tidhttp;
q :tmemorystream;
begin
q:=TMemoryStream.Create;
http:=tidhttp.Create(nil);


  {ниже блок динамических процедур(если был бы компоннент не динамический
   я бы прописывал в онстатусе/создается процедура на основе оригинальной
    и вставляется к названию)}
  http.OnWork :=     IdHTTP1Work;
  http.OnWorkBegin:= IdHTTP1WorkBegin;
  http.OnWorkEnd :=  IdHTTP1WorkEnd;


  application.ProcessMessages;

    TRY
    http.Get(PChar('URL'),q);

    q.Position := 0;
    q.SaveToFile(extractfilepath(application.ExeName)+'updating.exe' );
    q.Free;
    EXCEPT

    END;

  //удаляю файл после проверки
  if fileexists(extractfilepath(application.ExeName)+'updating.exe') then
  deletefile(pchar(extractfilepath(application.ExeName)+'updating.exe'));


end;



end.
ругается так:

Цитата:
[dcc32 Error] GetFileVersionUnit.pas(117): E2009 Incompatible types: 'method pointer and regular procedure'
[dcc32 Error] GetFileVersionUnit.pas(118): E2009 Incompatible types: 'method pointer and regular procedure'
[dcc32 Error] GetFileVersionUnit.pas(119): E2009 Incompatible types: 'method pointer and regular procedure'
я так понимаю, я не там объявил процедуры...
Свои старые программы глянул (рабочие) данные процедуры у меня вообще в type обьявлены, не помню уже зачем так писал ) там все в datemodule было.... но в юните не работает

Куда вписать
Код:
    procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
    procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCountMax: Int64);
    procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
чтобы данные процедуры стали видны в функции DownloadGetVersion
aesoem вне форума Ответить с цитированием
Старый 01.11.2016, 14:55   #2
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию

и так не работает....
Код:
unit GetFileVersionUnit;

interface

uses idhttp,System.Classes, IdComponent,VCL.Forms,System.SysUtils,System.Types,Winapi.Windows;


     procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
    procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCountMax: Int64);
    procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);



var
work,max:integer;


implementation

...............................
aesoem вне форума Ответить с цитированием
Старый 01.11.2016, 14:58   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

нужно сделать процедуры методами класса. см. ответ на Stack Overflow
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.11.2016, 14:59   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Посмотри на описание типа OnWork. Там в конце стоит of Object, что значит - ожидается процедура объектного типа, по другому - являющаяся методом класса
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.11.2016, 15:13   #5
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию

если я правильно понял, в юните без формы, это работать не будет?
чет не получается...

Последний раз редактировалось aesoem; 01.11.2016 в 15:19.
aesoem вне форума Ответить с цитированием
Старый 01.11.2016, 23:52   #6
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Цитата:
Сообщение от aesoem Посмотреть сообщение
если я правильно понял, в юните без формы, это работать не будет?
чет не получается...
Будет.

Последний раз редактировалось Replicant; 01.11.2016 в 23:55.
Replicant вне форума Ответить с цитированием
Старый 02.11.2016, 02:09   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Replicant Посмотреть сообщение
Будет.
В "юните" не будет. Ну разве только он будет присоединен к модулю формы с помощью директивы {$I}
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенос юнита в делфи в другой проект Mushtandoit Помощь студентам 7 02.06.2011 08:47
Разделение на два юнита Alexandr000006 Помощь студентам 4 17.03.2011 19:09
Как вызвать функцию из юнита? Des Общие вопросы Delphi 5 06.11.2010 12:47
Как распаковать фаил из юнита kakawkin Общие вопросы Delphi 2 23.08.2010 16:55
Использование собственного типа для юнита Алекс Ялта Gamedev - cоздание игр: Unity, OpenGL, DirectX 17 26.03.2009 15:55