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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2011, 00:54   #1
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию Сравнить версии файлов

Здравствуйте, уже вечер/ночь, по этому эффективность мозга упала на несколько делений.

Помогите сравнить 2 записи (версии файла) такого плана: 0.0.1.0 и 0.1.0.0. Понятно, что вторая версия выше первой, но как это высчитать? Испортил уже несколько листов А4, не могу правильно их сравнить хоть убейте...

P.S.: дожидаться утра и свежих мозгов прошу не предлагать .
W0LF вне форума Ответить с цитированием
Старый 21.11.2011, 01:30   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
s1:='0.0.1.0';
s2:='0.1.0.0';
if s1<s2 then <версия в s1 более раняя, чем версия в s2>
это при условии что все номера однозначные, иначе парсить и преобразовывать прийдется
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.11.2011, 06:09   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Цитата:
Здравствуйте, уже вечер/ночь, по этому эффективность мозга упала на несколько делений.
Это очень полезная информация...

Я бы проверил так (собрано на коленке):
Код:
procedure TSDIAppForm.btn_1Click(Sender: TObject);
const
	S1 = '01.1.31.215';
	S2 = '01.1.32.215';
var
	TS1,TS2: TStringList;
  I: Integer;
  Flag:Boolean;
begin
  if S1=S2 then begin
    // Версии одинаковые
    Exit;
  end;
	TS1:=TStringList.Create;
	TS1.Delimiter:='.';
  TS1.DelimitedText:=S1;
	TS2:=TStringList.Create;
	TS2.Delimiter:='.';
  TS2.DelimitedText:=S2;
  Flag:=false;
  for I := 0 to 3 do if StrToInt(S1[I])>StrToInt(S2[I]) then Flag:=True;
  if Flag then begin
    // версия S1 новее
  end else begin
    // версия S2 новее
  end;
  TS1.Free;
  TS2.Free;
end;
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 21.11.2011, 09:33   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Johnson, идея отличнейшая! +1

а вот реализация, имхо, никуда не годится
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.11.2011, 09:45   #5
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Знаю говорю же, писал на коленке, первое что с просонья в голову пришло
Раз уж на то пошло - вариант другой на той же идее (так же, на коленке... нету тут компилятора):
Код:
function CheckVersion(const V1,V2:string):integer;
const
	S1 = '01.1.31.215';
	S2 = '01.1.32.215';
var
	TS: TStringList;
	I: Integer;
begin
	if S1=S2 then begin
		Result:=0;
		Exit;
	end;
	TS:=TStringList.Create;
	TS.Delimiter:='.';
	TS.DelimitedText:=V1+'.'+V2;
	for I := 0 to 3 do 
		if StrToInt(TS[I])>StrToInt(TS[I+4]) then begin 
			Result:=1;
			Break;
		end;
	Result:=1;
	TS.Free;
end;

....
// Использование:
S1 := '01.1.31.215';
S2 := '01.1.32.215';

case CheckVersion(S1,S2) of
	0: begin
		// Версии одинаковые
	end;
	1: begin
		// Первая версия новее
	end;
	-1: begin
		// Вторая версия новее
	end;
end;
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 21.11.2011, 10:06   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, согласен, теперь много лучше. (лишнее я бы только почистил чуток.. const внутри функции, например...

ну и позволю себе опубликовать Ваш первоначальный вариант, немножко доработанный "напильником"

Код:
function CompareVersion(const S1, S2: string): string;
var
  TS1, TS2: TStringList;
  I: Integer;
  Flag: Boolean;
begin
  if S1 = S2 then begin
    // Версии одинаковые
    CompareVersion := 'равны';
    Exit;
  end;
  try
    TS1 := TStringList.Create;
    TS1.Delimiter := '.';
    TS1.DelimitedText := S1;

    TS2 := TStringList.Create;
    TS2.Delimiter := '.';
    TS2.DelimitedText := S2;

    if TS1.Count <> TS2.Count then begin
          {строчки имеют разное число групп}
      CompareVersion := 'Сравнить нельзя - разное количество групп разрядов!';
      Exit;
    end;

    CompareVersion := 'ошибка сравнения...';
    try
      for I := 0 to TS1.Count - 1 do begin
        if StrToInt(TS1[I]) <> StrToInt(TS2[I]) then begin
          if StrToInt(TS1[I]) > StrToInt(TS2[I]) then
            CompareVersion := 'версия S1 новее'
          else
            CompareVersion := 'версия S2 новее';
          Break;
        end;
      end;
    except
    end;
  finally
    TS1.Free;
    TS2.Free;
  end;
end;

// ИСПОЛЬЗОВАНИЕ 
procedure TForm1.Button1Click(Sender: TObject);
const
   S01 = '01.1.32.215';
   S02 = '01.1.32.218';
begin
   Edit1.Text := CompareVersion(S01, S02);
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.11.2011, 10:06   #7
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

интересная реализация ))
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ
Den7656 вне форума Ответить с цитированием
Старый 21.11.2011, 17:05   #8
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

А может вот так попроще?
Код:
{Функция сравнения версий: AVer1,AVer2 - значения версий, ACompVal - результат.
 Возможные значения ACompVal:
 ACompVal<0: AVer1<AVer2
 ACompVal=0: AVer1=AVer2
 ACompVal>0: AVer1>AVer2}
function VersionCompare(const AVer1,AVer2:AnsiString; out ACompVal:Integer):Boolean;
var
  v1,v2:Integer;
begin
  try
    Result:=True;
    v1:=StrToIntDef(StringReplace(AVer1,'.','',[rfReplaceAll]),-1);
    v2:=StrToIntDef(StringReplace(AVer2,'.','',[rfReplaceAll]),-1);
    if (v1=-1) or (v2=-1) then Abort;
    ACompVal:=v1-v2;
    Result:=True;
  except
    Result:=False;
  end;
end;
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 21.11.2011, 17:24   #9
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Тоже вариант не плохой...
Но лично я стараюсь как можно реже использовать Try except end;
Слишком уж тормознутая это функция.
Да и считается "за глаза" признаком дурного тона...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 21.11.2011, 17:29   #10
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

ну, у кого там считается, честно, не встречал))) знаю ведущих программистов в одной компании, пишут на Делфи, у них в коллективе по правилам в приоритете безопасный код) да и у самого нехилый проект под рукой, который веду, там все возникающие ошибки контролируются исключениями и логгируются. т.е. если произошел сбой в работе потока, то он локализуется, логгируется, подчищается выделенная память и поток продолжает работать в штатном. Мне кажется такой подход очень перспективным, особенно при проектировании потокобезопасных классов разного назначения. Мое ПО работает 24/7, утечек нет и контроль полный кстати, не замечал чтобы try..except..finally вообще визуально замедлял работу. А у меня в приложении могут работать и 500 потоков) загрузка процессора 1-2%
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 21.11.2011 в 17:36.
3D Hunter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Версии Delphi mutabor Общие вопросы Delphi 9 22.06.2010 14:09
Версии Си L_M Общие вопросы C/C++ 1 14.05.2008 22:53
Версии Windows Veiron Windows 5 12.01.2008 16:52
Версии Delphi!!! Oleg Romanchuk Свободное общение 2 22.08.2007 10:53