Вопрос Проблема с загрузкой строк из файла

nik1967

Old Men
Проверенный
Доброго времени суток!
Столкнулся с такой проблемой: есть файл, примерно такого содержания
ProfOpts.png
Код:
FBCHUNKS       „—ч   ЅZBВ                     
   textLanguage    2   
   EnableRumble    1       IsFemalePathfinder    0       EnableTelemetry    0       tutorialsActive    1       AutoLevelUp    0   
   ToggleAim    0       AutoWeaponSwap    0       CameraAutomaticShoulderSwap    0       ShowDialogTones    1       EnableAimAssist    1   
   ToggleSprint    0       questTrackerActive    0   
   TogglePowers    0       PlayerHelmetVisibility    1       SquadHelmetVisibility    1       GameDifficulty    0       FOVMultiplier       1.000000       voiceOverLanguage    2       savedGameplaySettings    1       subtitleEnabled    0 (     
   ach_045_v    0       ach_045_so    0
При выполнении функции LoadStringsFromFile отображается только FBCHUNKS - из самого начала. Как можно сделать, чтобы отображалось всё содержимое файла? Для чего? Ну, например, я ищу в этих строках voiceOverLanguage - мне нужно значение (в данном случае - 2), нужная субстрока находится в 6-ой строке, но при попытке получить значение получаю не то, что нужно. Пытаюсь получить номер позиции (Indx) нужной субстроки (Pos(keyFind,strArr)) - получаю 0.
 

Ramiro Cruzo

Новичок
Код:
function LoadStringFromFile(const FileName: String; var S: AnsiString): Boolean;
LoadStringFromFile can only load ANSI characters, you will need to do it in TCustomMemoryStream or TFilestream.
 

Nemko

Дилетант
Модератор
nik1967, я тут посмотрел, количество пробелов до значение одинаковое и решил попробовать. Что вышло может пойдет, но только повторюсь если количество пробелов одинаковое, а если туплю, не серчайте.

Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
  Text: array[1..10] of TNewEdit;
  StrID: array[1..10] of String;
////////////////////////////
function GetValue(strFilename, keyFind: String): string;
var
  i, vPos: Integer;
  strArr: TArrayOfString;
begin

LoadStringsFromFile(strFilename, strArr);

for i:=0 to GetArrayLength(strArr) - 1 do
  begin
    if (Pos(keyFind, strArr[i]) > 0) then
      begin
        vPos:=Pos(keyFind, strArr[i]);
        Delete(strArr[i], 1, vPos + Length(keyFind) + 3);
        Result:=strArr[i];
        SetLength(Result, (Length(strArr[i]) - Length(Result)) + 1);
    end;
  end;
end;
////////////////////////////
procedure InitializeWizard;
var
  i: Integer;
begin
  WizardForm.OuterNotebook.Hide;
  WizardForm.InnerNotebook.Hide;
  WizardForm.Bevel.Hide;
  WizardForm.Bevel1.Hide;
  WizardForm.NextButton.Width:=0;
// Искомые строки
  StrID[1]:='PlayerHelmetVisibility';
  StrID[2]:='ShowDialogTones';
  StrID[3]:='GameDifficulty';
  StrID[4]:='textLanguage';
  StrID[5]:='EnableRumble';
  StrID[6]:='ach_045_so';
  StrID[7]:='ToggleSprint';
  StrID[8]:='ach_045_v';
  StrID[9]:='savedGameplaySettings';
  StrID[10]:='AutoLevelUp';
// Далее заполнеение
for i:=1 to 10 do begin
Text[i]:=TNewEdit.Create(WizardForm);
with Text[i] do begin
  Parent:=WizardForm;
  Font.Size:=10;
  Color:=clGray;
  BorderStyle:=bsNone;
  SetBounds(ScaleX(200), Scaley(i*30), ScaleX(16), Scaley(16));
  Text:=' '+GetValue(ExpandConstant('{src}\Text.txt'), StrID[i]);
end;

TLabel.Create(WizardForm);
with TLabel.Create(WizardForm) do begin
  Parent:=WizardForm;
  Font.Size:=10;
  Transparent:=False;
  Color:=clGray;
  SetBounds(ScaleX(10), Scaley(i*30), ScaleX(180), Scaley(16));
  Caption:=StrID[i];
end;
end;
end;
 

Вложения

Shegorat

Lord of Madness
Администратор
Nemko,
Так не получится, там не пробелы а бинарная структура такого типа
Код:
typedef struct {
    uint32  flags;
    uint32  name_len;
    char    name[name_len];
    uint32  val_len;
    char    value[val_len];
} option;

struct {
  char    id[8];
  uint16  version;
  byte    u[36];

  uint32  count;
  option options[count] <optimize=false>;  

  uint32  count2;
  option options2[count2] <optimize=false>; 
} ProfOpts;
 

L-e-o-N

Старожил
LoadStringsFromFile загружает все строки в виде массива (просто нужно перебрать в цикле все элементы)
 

Ramiro Cruzo

Новичок
Was a bit free xD

Код:
function ScanFileValue(const filename: String; const forString: String;
  dst, valsize: integer): integer; stdcall cdecl;
filename: File to scan
forString: Scan String (voiceOverLanguage)
dst: Distance of required value from the string, in your case its 5
valsize: Size of value, like integers are 4 bytes, etc etc
 

Вложения

  • 242.8 KB Просмотры: 16

Nemko

Дилетант
Модератор
Ramiro Cruzo, what am I doing wrong ?

Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: "scn.dll"; Flags: "DontCopy";

[Code]
var
  Text: array[1..10] of TNewEdit;
  StrID: array[1..10] of String;

function ScanFileValue(const filename: String; const forString: String; dst, valsize: integer): Integer; external 'ScanFileValue@{tmp}\scn.dll stdcall delayload';

function InitializeSetup: Boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\scn.dll')) then ExtractTemporaryFile('scn.dll');
  Result:=True;
end;

procedure InitializeWizard;
var
  i: Integer;
begin
  WizardForm.OuterNotebook.Hide;
  WizardForm.InnerNotebook.Hide;
  WizardForm.Bevel.Hide;
  WizardForm.Bevel1.Hide;
  WizardForm.NextButton.Width:=0;

  StrID[1]:='PlayerHelmetVisibility';
  StrID[2]:='ShowDialogTones';
  StrID[3]:='GameDifficulty';
  StrID[4]:='textLanguage';
  StrID[5]:='EnableRumble';
  StrID[6]:='ach_045_so';
  StrID[7]:='ToggleSprint';
  StrID[8]:='ach_045_v';
  StrID[9]:='savedGameplaySettings';
  StrID[10]:='AutoLevelUp';

for i:=1 to 10 do begin
Text[i]:=TNewEdit.Create(WizardForm);
with Text[i] do begin
  Parent:=WizardForm;
  Font.Size:=10;
  Color:=clGray;
  BorderStyle:=bsNone;
  SetBounds(ScaleX(200), Scaley(i*30), ScaleX(16), Scaley(16));
  Text:=' '+IntToStr(ScanFileValue(ExpandConstant('{src}\Text.txt'), StrID[i], 5, 4));
end;

TLabel.Create(WizardForm);
with TLabel.Create(WizardForm) do begin
  Parent:=WizardForm;
  Font.Size:=10;
  Transparent:=False;
  Color:=clGray;
  SetBounds(ScaleX(10), Scaley(i*30), ScaleX(180), Scaley(16));
  Caption:=StrID[i];
end;
end;
end;
Без имени-1.jpg
 

nik1967

Old Men
Проверенный
Ramiro Cruzo,
Код:
MsgBox(IntToStr(ScanFileValue(ExpandConstant('{src}\ProfOpts'), 'voiceOverLanguage', 5, 4)), mbInformation, MB_OK);
2017-04-17_003055.png
2017-04-17_002925.png
А как потом изменить найденное значение на своё? Например 0 на 5?
 
Сверху