Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.16;
Скачать: CL | DM;

Вниз

array of Const и TVarRec   Найти похожие ветки 

 
Циркуль   (2008-10-06 12:56) [0]

Пытаюсь реализовать передачу в функцию Format() массива значений с неизвестным заранее количеством параметров.

Для примера слепил следющее:

var
 V: array of TVarRec;
 I: Integer;
 S: ShortString;
begin
 SetLength(V, 3);
 for I := Low(V) to High(V) do
 begin
   V[I].VType := vtString;
   S := ShortString(IntToStr(I));
   V[I].VString := @S;
 end;
 Caption := Format("%s %s %s" , V);
end;


Во первых не уверен, что верно присваиваю (раскопал такой код где-то в сети)

S := ShortString(IntToStr(I));
V[I].VString := @S;

Во вторых, не смотря на то, что код отрабатывает, не падая, в результате Caption получается "2 2 2", хотя по идее должен быть "0 1 2".

Короче, вопрос такой, как правильно инициализировать array of TVarRec строковыми значениями, что бы оно потом корректоно обрабатывалось функцией Format ?


 
Сергей М. ©   (2008-10-06 13:06) [1]

var
V: array of TVarRec;
I: Integer;
p: PShortString;
begin
SetLength(V, 3);
for I := Low(V) to High(V) do
begin
  V[I].VType := vtString;
  New(V[I].VString);
  V[I].VString^ := IntToStr(I);
end;
Memo.Lines.Add(Format("%s %s %s" , V));
end;


 
Циркуль   (2008-10-06 13:11) [2]

Спасибо, работает.

А после не нужно сделать

 for I := Low(V) to High(V) do
   Dispose(V[I].VString);

???


 
Сергей М. ©   (2008-10-06 13:16) [3]

По идее не нужно


 
Сергей М. ©   (2008-10-06 13:20) [4]

Вру.
нужно, иначе утечка


 
Циркуль   (2008-10-06 13:23) [5]

Спасибо :)


 
Игорь Шевченко ©   (2008-10-06 14:45) [6]

unit main;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Edit4: TEdit;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
 Arr: array of TVarRec;
begin
 SetLength(Arr, 3);
 Arr[0].VType := vtAnsiString;
 Arr[1].VType := vtAnsiString;
 Arr[2].VType := vtAnsiString;
 Arr[0].VAnsiString := PChar(Edit1.Text);
 Arr[1].VAnsiString := PChar(Edit2.Text);
 Arr[2].VAnsiString := PChar(Edit3.Text);
 Edit4.Text := Format("%s %s %s", Arr);
end;

end.


 
Циркуль   (2008-10-06 15:52) [7]

Спасибо, Игорь.

А нет ли опасности, если использовать приведение к PСhar не свойства, а

Arr[x].VAnsiString := PChar(функция, возвращающая string);

что Arr[x].VAnsiString к моменту вызова Format(.., Arr)  будет указывать на область памяти, забитую мусором (или что там произойдет Result"ом функции) ?


 
Игорь Шевченко ©   (2008-10-06 15:59) [8]


> А нет ли опасности, если использовать приведение к PСhar
> не свойства, а
>
> Arr[x].VAnsiString := PChar(функция, возвращающая string);
>


Нет, опасности нет, потому что внутренняя реализация функции, возвращающей AnsiString, подразумевает, что буфер для строки-результата передается одним из параметров в функцию, то есть, он всегда находится на стороне вызывающего, следовательно, между вызовом функции и вызовом format он никуда не денется.


 
Циркуль   (2008-10-06 16:14) [9]

Т.е. в переводе с русского на более простой русский, то при

Arr[0].VAnsiString := PChar(stringfunc);
Arr[1].VAnsiString := PChar(stringfunc);
Arr[2].VAnsiString := PChar(stringfunc);

компилятор создаст неявно три локальных переменных, в которых и будут храниться получаемые результаты функций и которые будут "жить" до выхода из области видимости (как "обычные" локальные переменные) ?


 
Игорь Шевченко ©   (2008-10-06 16:25) [10]


> компилятор создаст неявно три локальных переменных, в которых
> и будут храниться получаемые результаты функций и которые
> будут "жить" до выхода из области видимости (как "обычные"
> локальные переменные) ?


абсолютно верно


 
Leonid Troyanovsky ©   (2008-10-06 21:54) [11]


> Циркуль   (06.10.08 12:56)  
> Пытаюсь реализовать передачу в функцию Format() массива
> значений с неизвестным заранее количеством параметров.

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/bb86dafbdd6277e9
see also
http://groups.google.com/group/fido7.ru.delphi/msg/150e16846702e545

--
Regards, LVT.


 
MBo ©   (2008-10-07 05:12) [12]

может, еще будет полезно:
http://rvelthuis.de/articles/index.html



Страницы: 1 вся ветка

Текущий архив: 2008.11.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
11-1195526191
Danger
2007-11-20 05:36
2008.11.16
Эмулятор WinCE


15-1221991549
Кое кто
2008-09-21 14:05
2008.11.16
Скачивалка


2-1223512199
AlexDan
2008-10-09 04:29
2008.11.16
Реестр..


15-1221765851
Sergio666
2008-09-18 23:24
2008.11.16
Delphi 2007 и символ подчеркивания


15-1221830990
AlexDan
2008-09-19 17:29
2008.11.16
Книга..