Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2016, 19:51   #1
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию Изменить значение переменной через указатель

Здравствуйте !
Есть у меня рекорд
Код:
type
 TParamsItem = record
  Caption: UTF8String;
  Value  : Pointer;
  ....//Ещё записи
 end;
и есть функция с открытым массивом на входе

Код:
function ChangeValue (Values: array of const);
Внутри этой функции надо поменять значение ParamsItem.Value на одно из значений из входного массива. Вопрос: как это сделать не передавая функции тип переменной ?
Пока на ум пришла только идея проверить тип первой переменной из массива и разименовать указатель полагая что все переменные в массиве данного типа, но может есть более красивое решение ?

ParamsItem.Value - укатель на данные из другого рекорда, но дело в том, что это может быть что угодно (string, integer, double).
Adult_Master вне форума Ответить с цитированием
Старый 26.11.2016, 20:49   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

ParamsItem.Value указатель на другой рекорд наверно. А данные в таком массиве и так почти все как указатели передаются. Вопрос не понял, но смотри как примерно можно обрабатывать (пример для Д7 если что)
Код:
procedure ChangeValue (Values: array of const);
var i: Integer;
    b: Byte;
begin
  for i:=0 to High(Values) do begin
    b:=TVarRec(Values[i]).VType;
    case b of
    vtInteger: Form1.Memo1.Lines.Add(IntToStr(TVarRec(Values[i]).VInteger));
    vtExtended: Form1.Memo1.Lines.Add(FloatToStr(TVarRec(Values[i]).VExtended^));
    vtAnsiString: Form1.Memo1.Lines.Add(String(TVarRec(Values[i]).VAnsiString));
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ChangeValue (['QWEиии',2,0.345]);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.11.2016, 21:48   #3
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию

Я не это имел ввиду, прочитать данные из массива я знаю как, наверное не правильно объяснил, вот подробнее:
Есть некий рекорд объявленный где то в недрах программы, допустим:
Код:
TParams = record
 A: String[3];
 B: Integer;
 C: Double;
end;
Далее в другом модуле, в другом классе есть ещё один рекорд

Код:
TParamsItem = record
  Caption: UTF8String;
  Value  : Pointer;
  ....//Ещё записи
 end;
Затем в классе есть массив этих TParamsItem, так вот, в каждом элементе массива просходит примерно следующее:

ParamsItem.Value := @Params.A , но может быть и @Params.B или @Params.C ! т.е. я не знаю на какого типа данные будет указывать этот указатель.

Теперь мне нужно написать функцию

Код:
procedure ChangeValue (Values: array of const);
в которой надо сделать вот что:
ParamsItem.Value^ := Values[X] , т.е. изменить таким образом значение Params.A на Values[X] через указатель ParamsItem.Value ! Что бы это сделать надо знать какого типа данные лежат по этому указателю ! но вот как это определить ...

Последний раз редактировалось Adult_Master; 26.11.2016 в 21:50.
Adult_Master вне форума Ответить с цитированием
Старый 26.11.2016, 22:15   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

То есть узнать по Pointer тип данных, на которые он указывает? Полагаю ни как. Если они все наследники TObject то варианты есть, но это другая история
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.11.2016 в 22:23.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как значение переменной передать другой переменной? - jQuery serauto79 JavaScript, Ajax 4 05.08.2015 17:03
Не получается получить значение из функции через указатель Casper-SC Общие вопросы C/C++ 5 12.01.2012 06:32
javascript изменить значение переменной (пр:было 1234 стало 12341234) marianna14 Помощь студентам 2 27.03.2011 12:24
как изменить значение в уже созданной переменной в базе данных mysql pufystyj PHP 12 22.02.2011 23:55
Значение через указатель. Alex Cones Общие вопросы Delphi 8 24.01.2010 18:15