Вопрос Как в зависимости от диапазона разрешений в файле выполнить определенные действия

zettend

Старожил
Вопрос звучит сложно, но я попробую описать...

Разрабатываю Лаунчер без GUI для сталкера, который должен делать следующее:
  • Если разрешение до 1920x1080, то ничего не делаем
  • Если разрешение от 1920x1080 до 2560x1440, то копируем файлы N
  • Если разрешение от 2560x1440 до 3840×2160, то копируем файлы N
  • Если разрешение от 3840×2160 до ∞, то копируем файлы N
  • Если одно из действий выше успешно, то запускаем EXE файл
Разрешения берутся из файла user.ltx в формате vid_mode 2560x1440.
Данный "костыль" должен решить проблему со шрифтами на высоком разрешении.
 
Последнее редактирование:

Хамик

Старожил
@zettend, как вариант нужно сравнивать ширину и высоту, что-то типа такого (для ширины):
code_language.pascal:
[Files]
Source: "{files}\1920.txt"; DestDir: {tmp}; Flags: dontcopy
Source: "{files}\2560.txt"; DestDir: {tmp}; Flags: dontcopy
Source: "{files}\3840.txt"; DestDir: {tmp}; Flags: dontcopy

[Code]
const
  vid_mode_1 = '1920x1080';
  vid_mode_2 = '2560x1440';
  vid_mode_3 = '3840x2160';

function _DCX(s:string): string; //ширина
begin
  Result := Copy(s, 0, Pos('x', s)-1);
end;

function _DCY(s:string): string; //высота
begin
  Result := Copy(s, Pos('x', s)+1, Length(s));
end;

procedure ExtractTmpFile(const FileName: string; const DestDir: string);
begin
  if not DirExists(DestDir) then ForceDirectories(DestDir);
  ExtractTemporaryFileEx(FileName, DestDir);
end;

procedure GetExportFile();
var
  sFile, gMode: string;
  vBuf: TArrayOfString;
  i: integer;
begin
  sfile := ExpandConstant('{src}\user.ltx');
  if LoadStringsFromFile(sfile, vbuf) then
    for i:=0 to GetArrayLength(vbuf)-1 do
      begin
        if Pos(AnsiLowercase('vid_mode'), AnsiLowercase(vbuf[i])) > 0 then
          begin
            gMode := Copy(vBuf[i], Pos(' ', vbuf[i])+1, Length(vBuf[i]));
//            if ( StrToInt(_DCX(gmode)) < StrToInt(_DCX(vid_mode_1)) ) then MsgBox('Если разрешение до 1920x1080, то ничего не делаем', mbInformation, MB_OK) else
            if (StrToInt(_DCX(gmode)) > StrToInt(_DCX(vid_mode_1))) and (StrToInt(_DCX(gmode)) < StrToInt(_DCX(vid_mode_2))) then //MsgBox('Если разрешение от 1920x1080 до 2560x1440, то копируем файлы N', mbInformation, MB_OK) else
              ExtractTmpFile('1920.txt', ExpandConstant('{src}\InstallFont')) else
            if (StrToInt(_DCX(gmode)) > StrToInt(_DCX(vid_mode_2))) and (StrToInt(_DCX(gmode)) < StrToInt(_DCX(vid_mode_3))) then //MsgBox('Если разрешение от 2560x1440 до 3840x2160, то копируем файлы N', mbInformation, MB_OK) else
              ExtractTmpFile('2560.txt', ExpandConstant('{src}\InstallFont')) else
            if StrToInt(_DCX(gmode)) > StrToInt(_DCX(vid_mode_3)) then //MsgBox('Если разрешение от 3840x2160 до ?, то копируем файлы N', mbInformation, MB_OK);
              ExtractTmpFile('3840.txt', ExpandConstant('{src}\InstallFont'));
          end;
      end;
end;

procedure InitializeWizard();
begin
  GetExportFile();
end;
 
Последнее редактирование:

Andreo Fadio

Старожил
@zettend, можно так:
code_language.pascal:
[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.

[Code]
function GetScreenSize(FileName: PAnsiChar; Value: String): String;
var
  i, p: Integer;
  s, v: AnsiString;
begin
  if FileExists(FileName) then begin
    LoadStringFromFile(FileName, s);
    p:=Pos(Lowercase(Value), s);
    if p <> 0 then begin
      for i:=p+Length(Value) to Length(s) do begin
        if (s[i] = #13) or (s[i] = #13#13) then Break;
        if (s[i] = ' ') then Continue else v:=v+s[i];
      end;
      if Length(v) > 0 then Result:=String(v) else Result:='';
    end else Result:='';
 end else Result:='';
end;

function FixCostilStalker: Boolean;
var
 S: String;
 D: Integer; 
begin
  if FileExists(ExpandConstant('{src}\user.ltx')) then begin
   S:= GetScreenSize(ExpandConstant('{src}\user.ltx'), 'vid_mode');
   StringChange(S, 'x', '');
   if not (S = '') then D:= StrToInt(S) else D:= 0;
  end else D:= 0;
  if ((D > 0) and (D < 19201080)) or (D = 19201080) then
   Result:= True else Result:= False;
  if ((D > 19201080) and (D < 25601440)) or (D = 25601440) then
   if FileCopy(ExpandConstant('{tmp}\1.ltx'), ExpandConstant('{src}\файл_N.ltx'), false) then Result:= True else Result:= False;
  if ((D > 25601440) and (D < 38402160)) or (D = 38402160) then
   if FileCopy(ExpandConstant('{tmp}\2.ltx'), ExpandConstant('{src}\файл_M.ltx'), false) then Result:= True else Result:= False;
  if (D > 38402160) then
   if FileCopy(ExpandConstant('{tmp}\3.ltx'), ExpandConstant('{src}\файл_P.ltx'), false) then Result:= True else Result:= False;
  if (D = 0) then
   Result:= False;
end;

function InitializeSetup: Boolean;
var
 FixError: Integer;
begin
 SaveStringToFile(ExpandConstant('{tmp}\1.ltx'), '1', True);
 SaveStringToFile(ExpandConstant('{tmp}\2.ltx'), '2', True);
 SaveStringToFile(ExpandConstant('{tmp}\3.ltx'), '3', True);
 if FixCostilStalker then
  Exec('notepad.exe','','', SW_Show, ewNoWait, FixError);   
end;
 
Последнее редактирование:
Сверху