Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на константу массив, Работа с типизированными константами 
V
    Опции темы
lucas
Дата 26.5.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



Здравствуйте. Кто знает возможно ли то что я пытаюсь реализовать. У меня несколько констант массивов, как мне работать с ними не обращаясь на прямую. Т.е функция getConst должна возвращать определенный масив примерно так: Caption:= getConst(0)[0].s;    {='Кино'},
                         Caption:= getConst(1)[2].s;    {='Морковь'},
 

type
  TTemp = record
    s:String;
    b:Integer;
  end;

  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    function getConst(Index:Integer)://какой установить тип для получения константы
    { Public declarations }
  end;

const
  OneArray:Array[0..1] of TTemp = (
     (s: 'Кино'; b: 15),
     (s: 'Видио';   b: 25)
     );

  TwoArray:Array[0..2] of TTemp = (
     (s: 'Прокат'; b: 15),
     (s: 'Сок';   b: 25),
     (s: 'Морковь';   b: 25)
     );

var
  Form1: TForm1;

implementation

{$R *.dfm}

function getConst(Index:Integer)://какой установить тип для получения константы
begin
  case Index of
    0:   Result:= OneArray;
    1:   Result:= TwoArray;
  end;
end;  
 
PM MAIL   Вверх
Romikgy
Дата 26.5.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

type
ATTemp = Array of TTemp;

function getConst(Index:Integer): ATTemp ;

только введи в эти константы размеры массивов, а то имхо тяжко потом будет 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Dynamic
Дата 26.5.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 5.7.2004
Где: Салехард

Репутация: 12
Всего: 15



константу ты так не вернешь. Надо создать тип данных, который ты хочешь получать из getConst, типа
Код

type
  PMyArr = ^TMyArr;
  TMyArr = array of TTemp;

и передавать указатель на него, либо передавать переменную с массивом как var M: TMyArr в параметрах. 


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
lucas
Дата 26.5.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



Спасибо Dynamic Вам большое. Вы очень мне помогли. Действительно теперь все работает, но последний вопрос почему при такой схеме функция High для полученного массива возвращает не корректное значение

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

  TTemp = record
    s:String;
    b:Integer;
  end;

  PMyArr = ^TMyArr;
  TMyArr = array of TTemp;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure getConst(Index:Integer; var M: TMyArr);//какой установить тип для получения константы
    { Public declarations }
  end;

const
  OneArray:Array[0..1] of TTemp = (
     (s: 'Кино'; b: 15),
     (s: 'Видио';   b: 25)
     );

  TwoArray:Array[0..2] of TTemp = (
     (s: 'Прокат'; b: 15),
     (s: 'Сок';   b: 25),
     (s: 'Морковь';   b: 25)
     );

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.getConst(Index:Integer; var M: TMyArr );//какой установить тип для получения константы
begin
  case Index of
    0:   M:= @OneArray;
    1:   M:= @TwoArray;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  M: TMyArr;
begin
  getConst(1, M);
  caption:= InTToStr(High(M)); //Возвращает 24, а должно 2
end;

end.
  
PM MAIL   Вверх
AriX
Дата 26.5.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 16.6.2003

Репутация: 5
Всего: 19



Нужно установить длину для M массива:
Код

procedure TForm1.getConst(Index:Integer; var M: TMyArr );//какой установить тип для получения константы
begin
  case Index of    
    0: begin
      M := @OneArray;
      SetLength(M, Length(OneArray));
    end;
    1: begin
      M := @TwoArray;
      SetLength(M, Length(TwoArray));
    end;
  end;
end;
  

Это сообщение отредактировал(а) AriX - 26.5.2006, 17:03
PM MAIL   Вверх
lucas
Дата 26.5.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



Всем большое спасибо. Вопрос полностью разрешен. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.