Форум: "Основная";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
ВнизFormat function & VarArray Найти похожие ветки
← →
oomneeq (2002-08-26 23:21) [0]Мое почтение, мастера!
напомню описание:
Format(const Format: string; const Args: array of const)
Вопрос:
Как можно подсунуть на место Args переменную?
Ну вот так я пытаюсь:
var SubstArray:Variant;
...
SubstArray:=VarArrayCreate([0, SubstCount-1], varVariant);
for i := 0 to Pred(SubstCount) do begin
SubstArray[i]:=XXX.FieldByName(FN[i]).AsString;
end;
потом пробую
S:="%s,%s ....%s ";
S:=Format(S,SubstArray); //и так
S:=Format(S,VarArrayRef(SubstArray)); //и cяк
несовместимые говорит, Array и Variant !
Помогите, люди добрые, победить!
← →
oomneeq (2002-08-27 13:52) [1]Что, так все сложно ?
Дык было б просто я б и сам смог ... :)
Однака попробую упростить вопрос.
Ecть функции в качестве параметра допускающие конструкцию
[X1,X2,.......XN]
причем этими иксами могут быть какие угодно переменные
Как можно всю такую конструкцию присвоить переменной
Еще точнее что за тип должна иметь такая переменная чтоб
это присваивание было возможно?
V:T??????
V:=[X1,X2,.......XN];
← →
McSimm (2002-08-27 13:57) [2]При такой формулировке (2й вариант) ответ прост - Никак.
Такого типа переменной нет.
← →
McSimm (2002-08-27 14:07) [3]Извиняюсь, мой ответ вводит в заблуждение.
Можно:
var V: array of TVarRec;
...
Format(S, V);
Однако построить такой массив в run-time занятие малоприятное.
Лучше поискать другой подход
← →
McSimm (2002-08-27 14:15) [4]Если все-же хочешь идти этим путем, делается это примерно так:
var V: array of TVarRec;
S: ShortString;
begin
SetLength(V, 2);
S := "пример строки";
V[0].VType := vtInteger;
V[0].VInteger := 10;
V[1].VType := vtString;
V[1].VString := @S;
Caption := Format("%d - %s", V);
end;
← →
oomneeq (2002-08-27 14:15) [5]Да-с.
Именно так и сделал.
С интежерами несложно, а вот когда стринг, то головняк :(
McSimm, спасибо за отзыв.
← →
Ученик (2002-08-27 14:28) [6]Вытащил похожее, не проверял
type
TVarArray = array of TVarRec;
procedure CreateValues(Fields : array of TField; var Values : TVarArray);
var
Field : TField;
i : Integer;
V : PVarRec;
begin
SetLength(Values, High(Fields) + 1);
for i := 0 to High(Fields) do begin
Field := Fields[i];
V := @Values[i];
case Field.DataType of
ftAutoInc,
ftSmallint,
ftInteger,
ftWord : begin
V^.VType := vtInteger;
V^.VInteger := Field.AsInteger;
end;
ftBoolean : begin
V^.VType := vtBoolean;
V^.VBoolean := Field.AsBoolean;
end;
ftFloat,
ftCurrency,
ftBCD : begin
GetMem(V^.VExtended, SizeOf(Extended));
V^.VType := vtExtended;
V^.VExtended^ := Field.AsFloat;
end;
ftString,
ftDate,
ftTime,
ftDateTime : begin
GetMem(V^.VString, SizeOf(ShortString));
V^.VType := vtString;
V^.VString^ := Field.AsString;
end;
else begin
V^.VType := vtPointer;
V^.VPointer := nil;
end
end
end
end;
procedure DestroyValues(var Values : TVarArray);
var
i : Integer;
V : PVarRec;
begin
for i := 0 to High(Values) do begin
V := @Values[i];
case V^.VType of
vtString : FreeMem(V^.VString);
vtExtended : FreeMem(V^.VExtended);
end
end;
Values := NIL
end;
← →
oomneeq (2002-08-27 17:02) [7]Ученик, в твоем коде
реализована та же (похоже, единственно возможная) идея.
Упомянутый мною головняк заключается в заботе о создании/освобождении памяти для элементов отдельных типов (непростых) както string, extended
Спасибо однако и тебе.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c