Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
3-26894
BoxTer
2002-08-19 18:57
2002.09.09
Eof & Bof


3-26907
vlv
2002-08-20 12:23
2002.09.09
---|Ветка была без названия|---


1-27097
MsGuns
2002-08-27 20:02
2002.09.09
Вылет на попытке высветить форму-заставку


1-26969
Oleg_Gashev
2002-08-28 01:14
2002.09.09
Невизуальный компонент


1-26990
EternalWonderer
2002-08-27 09:27
2002.09.09
Распознавание голосовых команд.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский