На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> работа с не стандартным ini файлом , повтор переменных в одной секции
    Доброе время суток!
    Помогите пожалуйста разобраться.
    секция:
    ExpandedWrap disabled
      [ATKindjal]
      Score = 2
      DeployInf = TRUE
      House = Atreides
      StormDamage=74  // (1*64)+10
      StormDamage=10 //only damages is never picked up
      PrimaryBuilding = ATBarracks
      UnitGroup = FromBarracks
      Terrain = Rock, Sand, NBRock, InfRock, Ramp
      UpgradedPrimaryRequired = TRUE
      Cost = 150
      BuildTime = 144
      Size = 1
      Speed = 4.0                     //game coord per update
      TurretAttach = ATKindjalGun, ATKindjalBigGun
      TurnRate = 0.2                  //radians per tick
      Armour = None, 50, InfRock
      Health = 600
      Infantry = true
      //SoundSelected = Selected
      //SoundOrdered = Ordered
      //SoundID = 00
      ViewRange = 10
      AiFoot = TRUE
      TechLevel = 4
      ReinforcementValue = 3
      Crushable = TRUE
      ChaosEffect = SmallChaosFX
      HawkEffect = SmallHawkFX
      TastyToWorms = TRUE
      WormAttraction = 3
      CanMoveAnyDirection = TRUE
      CanBeDeviated = FALSE
      CanBeRepaired = FALSE
      AIThreat = 50
       
      // LEVEL 1 ----------------------------------
      VeterancyLevel = 2  // Score required
      Health = 800
      ExtraDamage = 50        // 50% more damage - applied to all weapons
       
      // LEVEL 2 ----------------------------------
      VeterancyLevel = 10
      CanSelfRepair = 1
       
      // LEVEL 3 ----------------------------------
      VeterancyLevel = 20
      Elite = TRUE
      //ExtraRange = 50 - removed // 50% more range
      ExtraDamage = 100       // 100% more damage - applied to all weapons


    Видно переменные повторяются: //LEVEL 1 , // LEVEL 2, // LEVEL 3
    помогите вывести отдельно //LEVEL 1 , // LEVEL 2, // LEVEL 3 например в разные 3 memo =)
    С уважением,
    Volkogriz!
      1) Вы можете привести формат к стандартному виду разделив повторяющиеся поля на вложенные секции например так
      ExpandedWrap disabled
        [ATKindjal]
        Score = 2
        DeployInf = TRUE
        House = Atreides
        StormDamage=74  // (1*64)+10
        StormDamage=10 //only damages is never picked up
        PrimaryBuilding = ATBarracks
        UnitGroup = FromBarracks
        Terrain = Rock, Sand, NBRock, InfRock, Ramp
        UpgradedPrimaryRequired = TRUE
        Cost = 150
        BuildTime = 144
        Size = 1
        Speed = 4.0                     //game coord per update
        TurretAttach = ATKindjalGun, ATKindjalBigGun
        TurnRate = 0.2                  //radians per tick
        Armour = None, 50, InfRock
        Health = 600
        Infantry = true
        //SoundSelected = Selected
        //SoundOrdered = Ordered
        //SoundID = 00
        ViewRange = 10
        AiFoot = TRUE
        TechLevel = 4
        ReinforcementValue = 3
        Crushable = TRUE
        ChaosEffect = SmallChaosFX
        HawkEffect = SmallHawkFX
        TastyToWorms = TRUE
        WormAttraction = 3
        CanMoveAnyDirection = TRUE
        CanBeDeviated = FALSE
        CanBeRepaired = FALSE
        AIThreat = 50
         
        [ATKindjal/LEVEL 1]
        // LEVEL 1 ----------------------------------
        VeterancyLevel = 2  // Score required
        Health = 800
        ExtraDamage = 50        // 50% more damage - applied to all weapons
         
        [ATKindjal/LEVEL 2]
        // LEVEL 2 ----------------------------------
        VeterancyLevel = 10
        CanSelfRepair = 1
         
        [ATKindjal/LEVEL 3]
        // LEVEL 3 ----------------------------------
        VeterancyLevel = 20
        Elite = TRUE
        //ExtraRange = 50 - removed // 50% more range
        ExtraDamage = 100       // 100% more damage - applied to all weapons


      2) Вы можете написать собственный код работы с ini файлом, который учитывает особенности расположения данных.
      ExpandedWrap disabled
        type
           PPIniFileEntry = ^PIniFileEntry;
           PIniFileData   = ^TIniFileData;
           PIniFileEntry  = ^TIniFileEntry;
           TIniFileData   = packed record
              text: array of PChar;
              data: PIniFileEntry;
           end;
           TIniFileEntry  = packed record
              next: PIniFileEntry;
              node: Integer;
              item: Integer;
              text: PChar;
           end;
         
         
        // FileName - Строка с именем ini файла
        procedure LoadIniFile(FileName: String): Pointer;
        const
           defGROUP: PChar = 'common';
        var
           ini: TextFile;
           idx, grp, i: Integer;
           str, val: String;
           pak: PIniFileData;
           itm: PIniFileEntry;
           lst: PPIniFileEntry;
        begin
           pak := new(pak);
           with pak^ do begin
              grp := Low(text) - 1;
              data := nil;
              lst := @data;
              SetLength(text, 0);
              AssignFile(ini, FileName);
              Reset(ini);
              while not EOF(ini) do begin
                 ReadLn(ini, str);
                 idx := Pos('//', str);
                 if idx > 0 then
                    str := copy(str, Low(str), idx);
                 str := trim(str);
                 if Length(str) > 0 then begin
                    if (str[Low(str)] = '[') and (str[High(str)] = ']') then begin
                       str := copy(str, Low(str) + 1, Length(str) - 2);
                       grp := High(text) + 1;
                       for i := Low(text) to High(text) do
                          if text[i] = str then begin
                             grp := i;
                             break;
                          end;
                       if grp > High(text) then begin
                          SetLength(text, Length(text) + 1);
                          text[grp] := PChar(copy(str, Low(str)));
                       end;
                    end else begin
                       idx := Pos('=', str);
                       if idx > 0 then begin
                          val := copy(str, idx + 1);
                          str := copy(str, Low(str), idx);
                          if grp < Low(text) then begin
                             grp := High(text) + 1;
                             for i := Low(text) to High(text) do
                                if text[i] = defGROUP then begin
                                   grp := i;
                                   break;
                                end;
                             if grp > High(text) then begin
                                SetLength(text, Length(text) + 1);
                                text[grp] := defGROUP;
                             end;
                          end;
                          idx := High(text) + 1;
                          for i := Low(text) to High(text) do
                             if text[i] = str then begin
                                idx := i;
                                break;
                             end;
                          if idx > High(text) then begin
                             SetLength(text, Length(text) + 1);
                             text[idx] := PChar(copy(str, Low(str)));
                          end;
                          new(itm);
                          itm^.next := nil;
                          itm^.node := grp;
                          itm^.item := idx;
                          itm^.text := PChar(copy(val, Low(val));
                          lst^ := itm;
                          lst := @itm^.next;
                       end;
                    end;
                 end;
              end;
              CloseFile(ini);
           end;
           Result := pak;
        end;
         
        // aIni   - Указатель полученный от LoadIniFile
        // aGroup - Строка с именем группы
        // aField - Строка с именем поля
        // aIndex - Порядковый номер вхождения поля в группу (для нескольких одноименных полей в группе)
        //  {Как раз для вашего случая. LEVEL1 = 1, LEVEL2 = 2, LEVEL3 = 3}
        function GetValueByName(aIni: PIniFileData; aGroup, aField: String; aIndex: Integer): String;
        var
           grp, itm, i, h: Integer;
           str, sec, fld: String;
           lst: PIniFileEntry;
        begin
           Result := '';
           sec := lowercase(aGroup);
           fld := lowercase(aField);
           if not (aIni = nil) then with aIni^ do begin
              h := High(text);
              grp := j + 1;
              itm := j + 1;
              for i := Low(text) to h do begin
                 str := lowercase(text[i]);
                 if str = sec then
                    grp := i;
                 if str = fld then
                    itm := i;
                 if (grp <= h) and (itm <= h) then
                    break;
              end;
              if (grp <= h) or (itm <= h) then begin
                 lst := data;
                 h := 1;
                 while not (lst = nil) do begin
                    if (lst^.node = grp) and (lst^.item = itm) then
                       if h = aIndex then begin
                          Result := copy(lst^.text, Low(lst^.text));
                          break;
                       end else inc(h);
                    lst := lst^.next;
                 end;
              end;
           end;
        end;
         
        {Надеюст процедуру сохранения ini файла и освобождения памяти из под этой структуры с динамическим списком вы сможете написать сами}
      Код не проверял, написал в браузере, хотя должен работать. Но надеюсь с опечатками вы сами сможете справиться.
      Сообщение отредактировано: macomics -
        Именованием
        Level1.VeterancyLevel = ...

        или не изобретать велосипед и взять стандартное решение, например XML, JSON. Если так уж хочется простоты, то YAML
        Сообщение отредактировано: Fr0sT -
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0270 ]   [ 16 queries used ]   [ Generated: 1.10.22, 03:08 GMT ]