Загрузка констант из файла.

Тема в разделе "Delphi - Система", создана пользователем Myc0n, 2 июл 2010.

  1. Myc0n

    Myc0n Гость

    Народ, скажите, можно ли как нибудь загружать константы из файла?
    И вообще, можно ли менять константы в уже откомпилированном файле?
     
  2. VahaC

    VahaC Well-Known Member

    Регистрация:
    10 янв 2007
    Сообщения:
    116
    Симпатии:
    0
    На то они и константы чтоб их значения никогда не изменялись
     
  3. Myc0n

    Myc0n Гость

    Код (Delphi):
    const
    b = 123
    c = 456
    d = 100500
    e = 321
    var aray: array[1..b] of integer;
    Чет типа того, только там всего больше и все более запутано. Можно, конечно, переделать массив "aray" в динамический, а константы в переменные но там у меня гемора будет...
     
  4. Myc0n

    Myc0n Гость

    Мне надо все значения, идущие после слова const сохранить в файл и чтобы при запуске программы они оттуда выгружались и становились на саое место.
     
  5. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    А никто легкой жизни не обещал... гемор - профессиональная болезнь программистов... ;)
    Да, Delphi разрешает позволяет изменять значения констант... но только для констант типизированных (и ни в коем случае для истинных).
    Код (Delphi):
    const
    {$WRITEABLECONST ON} // Директива компилятора разрешает изменение значений констант (синоним {$J+})
    b: Integer = 123; // Типизированная константа, значение можно поменять в коде программы
    {$WRITEABLECONST OFF} // Директива запрещает изменение значений для констант ниже
    c: Integer = 456; // Типизированная константа, значение нельзя поменять в коде программы
    d = 100500; // Не типизированная (истинная константа). В коде доступна только для чтения.
    Изменить значение типизированной константы ( b ) можно например так
    Код (Delphi):
    //...
    var
    constCheck: Integer;
    //...
    implementation

    uses IniFiles;

    //...
    initialization
    if FileExists('c:\consts.ini') then
    begin
    with TIniFile.Create('c:\consts.ini') do
    begin
    constCheck := ReadInteger('consts','b',-1);
    if (constCheck > 1) then b := constCheck;
    Free;
    end;
    end;

    end.
    К сожалению изменить таким образом длину массива объявленного как статический
    Код (Delphi):
    var aray: array[1..b] of integer;
    не удастся... :( Потому как для статических массивов выделяемая память определяется на этапе компиляции.
    Поэтому только через "гемор" как Вы выразились...
    Вариант первый:
    Код (Delphi):
    var aray: array of integer; // Объявляем массив как динамический
    // после изменения константы ( b ) выставляем длину массива
    SetLength(aray,b);
    // Тогда в коде программы юзаем массив таким образом
    for i := Low(aray) to High(aray) do
    begin
    // aray[i] bla bla что то делаем с элементом массива
    end;
    Вариант второй:
    Код (Delphi):
    var aray: array[1..High(Word)] of Integer; // Объявляем массив как статический с заведомо большей (чем будет использоваться в коде) длиной
    // Тогда после изменения константы ( b ) в коде программы юзаем массив таким образом
    for i := 1 to b do
    begin
    // aray[i] bla bla что то делаем с элементом массива
    end;
    Ну... или жесткий вариант типа такого... ;)
    Код (Delphi):
    // Пишем класс, который будет вести себя статический массив :-)
    type
    TtipaStaticArray = class
    private
    FLowInd: Integer;
    FHighInd: Integer;
    FData: array of Integer;
    function Get(Index: Integer): Integer;
    procedure Put(Index: Integer; const Value: Integer);
    public
    constructor Create(LowInd, HighInd:Integer);
    destructor Destroy; override;
    property Items[Index: Integer]: Integer read Get write Put; default;
    property Low_: Integer read FLowInd;
    property High_: Integer read FHighInd;
    end;
    //...
    implementation

    { TtipaStaticArray }

    constructor TtipaStaticArray.Create(LowInd, HighInd: Integer);
    var
    i: Integer;
    begin
    FLowInd := LowInd;
    FHighInd := HighInd;
    SetLength(FData,FHighInd-FLowInd+1);
    for i := Low(FData) to High(FData) do
    FData[i] := 0;
    end;

    destructor TtipaStaticArray.Destroy;
    begin
    SetLength(FData,0);
    inherited;
    end;

    function TtipaStaticArray.Get(Index: Integer): Integer;
    begin
    Result := FData[Index-FLowInd];
    end;

    procedure TtipaStaticArray.Put(Index: Integer; const Value: Integer);
    begin
    FData[Index-FLowInd] := Value;
    end;
    Создаем экземпляр
    Код (Delphi):
     var
    aray: TtipaStaticArray;
    //...
    aray := TtipaStaticArray.Create(1,b);
    Юзаем
    Код (Delphi):
     for i := aray.Low_ to aray.High_ do
    begin
    // aray[i] bla bla что то делаем с элементом "типамассива"
    end;

    for i := 1 to b do
    begin
    // aray[i] bla bla что то делаем с элементом "типамассива"
    end;
    Можно и еще вариантов напридумывать... была бы фантазия и... гемороусидчивость :)
     
  6. Myc0n

    Myc0n Гость

    Большое вам спасибо!
    Похоже, гемороусидчивость мне сейчас понадобится. :)
     
Загрузка...

Поделиться этой страницей