Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  1 690

•  TDictionary Custom Sort  4 277

•  Fast Watermark Sources  3 945

•  3D Designer  6 110

•  Sik Screen Capture  4 209

•  Patch Maker  4 756

•  Айболит (remote control)  4 670

•  ListBox Drag & Drop  3 810

•  Доска для игры Реверси  90 580

•  Графические эффекты  5 004

•  Рисование по маске  4 035

•  Перетаскивание изображений  3 375

•  Canvas Drawing  3 690

•  Рисование Луны  3 480

•  Поворот изображения  3 010

•  Рисование стержней  2 632

•  Paint on Shape  2 025

•  Генератор кроссвордов  2 792

•  Головоломка Paletto  2 214

•  Теорема Монжа об окружностях  2 913

•  Пазл Numbrix  1 973

•  Заборы и коммивояжеры  2 571

•  Игра HIP  1 592

•  Игра Go (Го)  1 521

•  Симулятор лифта  1 801

•  Программа укладки плитки  1 546

•  Генератор лабиринта  1 915

•  Проверка числового ввода  1 674

•  HEX View  1 855

•  Физический маятник  1 687

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Массив констант во время выполнения приложения



Автор: Peter Below

...хорошо, непосредственно это синтаксис не поддерживает, поскольку массив констант Array of Const подобен открытым массивам, главным образом в части характеристик времени компиляции. Но вы можете обойти этот неприятный момент, обладая хотя бы начальными знаниями того, как реализован открытый массив. Что нам для этого необходимо: динамически размещенный массив array of TVarRec, который "принимает" ваши параметры, и "псевдоним" (alias) функции Format, позволяющий работать с таким массивом без "ругани" со стороны компилятора.


type
  { объявляем тип для динамического массива array of TVarRecs }
  TVarArray = array[0..High(Word) div Sizeof(TVarRec) - 1] of TVarRec;
  PVarArray = ^TVarArray;

  { Объявляем alias-тип для функции Format. Передаваемые параметры будут иметь
  в стеке тот же самый порядок вызова, что и при нормальном вызове Format }
  FormatProxy = function(const aFormatStr: string; var aVarRec: TVarRec;
    highIndex: Integer): string;

  { AddVarRecs копирует параметры, передаваемые в массиве A в pRecs^, начиная
  с pRecs^[atIndex]. highIndex - самый большой доступный индекс pRecs, число
  распределенных элементов - 1. }

procedure AddVarRecs(pRecs: PVarArray; atIndex, highIndex: Integer; const A:
  array of const);
var
  i: Integer;
begin
  if pRecs <> nil then
    for i := 0 to High(A) do
    begin
      if atIndex <= highIndex then
      begin
        pRecs^[atIndex] := A[i];
        Inc(atIndex);
      end { If }
      else
        Break;
    end; { For }
end; { AddVarRecs }

procedure TScratchMain.SpeedButton2Click(Sender: TObject);
var
  p: PVarArray;
  S: string;
  Proxy: FormatProxy;
begin
  { распределяем массив для четырех параметров, индексы - 0..3 }
  GetMem(p, 4 * Sizeof(TVarRec));
  try
    { добавляем параметры последующими вызовами AddVarRecs }
    AddVarRecs(p, 0, 3, [12, 0.5, 'Шаблон']);
    AddVarRecs(p, 3, 3, ['Тест']);

    { получаем полномочия Format }
    @Proxy := @SysUtils.Format;

    { Вызов с динамически сгенерированным массивом параметров.
    Естественно, строка формата может также быть сформирована
    и во время выполнения программы. }
    S := Proxy('Целое: %d, Реальное: %4.2f, Строки: %s, %s', p^[0], 3);

    { выводим результат }
    ShowMessage(S);
  finally
    FreeMem(p, 4 * Sizeof(TVarRec));
  end;
end;

Я надеюсь вы поняли принцип. Естественно, имеются ограничения. Вы можете передавать в AddVarRecs числовые величины, строковые переменные и литералы, но не в коем случае не строковые выражения! В этом случае компилятор должен для хранения результата сформировать в стеке временную строку, передать ее в AddVarRecs (или лучше по адресу в TVarRec), и она может прекратить свое существование или может быть перезаписана в стеке другими данными, если в конечном счете вы передадите в Proxy целый массив!

Тестировалось только в Delphi 1.0!





Похожие по теме исходники

Очередность выполнения процессов




Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте