![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамический массив [D5, Win95/98, Win2k]
BJValentine © (2002-05-20 09:58:00)Ребята, как мне в программе организовать динамический массив, чтобы можно было задать ему размер не фиксированный, программно и работать с ним?
USAtyj (2002-05-21 12:42:00) [1]Пожалуй правильнее будет так:
FCells: Variant;
Excel: Variant;
...
...
FCells:=VarArrayCreate([1,ROWS_COUNT,1,COLUMNS_COUNT],varVariant);
...
i:=0;
while not(MyDataSet.EOF) do
begin
FCells[i,1]:=MyDataSet.FieldByName("F1").AsFloat;
FCells[i,2]:=MyDataSet.FieldByName("F2").AsInteger;
FCells[i,3]:=MyDataSet.FieldByName("F3").AsString;
FCells[i,4]:=MyDataSet.FieldByName("F4").AsInteger;
FCells[i,5]:=MyDataSet.FieldByName("F5").AsFloat;
...
FCells[i,COLUMNS_COUNT]:=FieldByName("Fn").AsFloat;
Inc(i);
Next;
end;
Excel.ActiveSheet.Range[Excel.ActiveSheet.Cells[1,1],Excel.ActiveSheet.Cells[MyDataSet.RecordCount,COLUMNS_COUNT]]:=FCells;
USAtyj (2002-05-21 12:32:00) [2]
FCells: Variant;
Excel: Variant;
...
...
FCells:=VarArrayCreate([1,ROWS_COUNT,1,COLUMNS_COUNT],varVariant);
...
while not(MyDataSet.EOF) do
begin
FCells[i,1]:=FieldByName("F1").AsFloat;
FCells[i,2]:=FieldByName("F2").AsInteger;
FCells[i,3]:=FieldByName("F3").AsString;
FCells[i,4]:=FieldByName("F4").AsInteger;
FCells[i,5]:=FieldByName("F5").AsFloat;
Inc(i);
Next;
end;
Excel.ActiveSheet.Range[Excel.ActiveSheet.Cells[1,1],Excel.ActiveSheet.Cells[MyDataSet.RecordCount,COLUMNS_COUNT]]:=FCells;
koks (2002-05-21 10:10:00) [3]2 BJVValentine - то, что ты хочешь сделать оччень хорошо описано в "Королевстве Delphi". Пощи там в статьях. Назывется "По волнам интеграции".
antonl (2002-05-21 01:55:00) [4]С динамическими массивами я лично предпочитаю не связоватся появляется много трудно уловимых глюков. Лучше использовать TList или TCollection.
BJValentine (2002-05-20 20:53:00) [5]Ребят, помогите, ну?!
BJValentine (2002-05-20 19:45:00) [6]Извините, но ламерство иногда берёт верх. Ситуация на самом деле следующая. Я перегоняю большие массивы данных в Excel таким способом:
var V: OleVariant;
XL: Variant;
begin
......
V:=VarArrayCreate([0,0],VarVariant);
......
V[0]:=VarArrayOf([значение1, значение2, ...., значениеN]);
XL.range["A1:N1"]:=V[0];
......
end;
таким образом я перегоняю данные построчно. А как можно сделать, чтобы загнать все данные из базы данных в массив, а затем одним махом сбросить их в Excel?
cult (2002-05-20 18:48:00) [7]мВо:
нет, это уж слишком:)Она работает от его длины, замеренной уже после вызова. И глючит... ужасно(Access Violation..). Пришлось все массивы вытащить из параметров в возвращаемые значения. Так - работает.
pb (2002-05-20 16:06:00) [8]var
av:Array of array of Variant;
begin
setLength(av,2,5);
end;
MBo (2002-05-20 16:00:00) [9]>cult
не должно быть. может, вызывающая проц. обращается к уже несуществующему элементу?
cult (2002-05-20 15:54:00) [10]мВо:
это я знаю, дело в другом, кажется, если в процедуре менять размерность передаваемого массива, то в вызвавшей процедуре это вызывает глюки.
BJValentine (2002-05-20 15:36:00) [11]Это всё класно, а как обьявить двумерный динамический массив типа OleVariant?
Alan_v (2002-05-20 15:29:00) [12]Можно и просто
procedure Do(a: array of integer)
MBo (2002-05-20 15:09:00) [13]вроде нет глюков, надо только объявить тип
type
ArrInt=array of integer;
и в процедуре
procedure DoSmth(a:ArrInt);
cult (2002-05-20 15:04:00) [14]А вот можно ли как-нибудь передавать в процедуру динамический массив, и в процедуре изменять его размеры? У меня при передаче по Var это вызывало чудовищные глюки...
MBo (2002-05-20 14:58:00) [15]и не забудь, что нумерация с 0, т.е. в указанном примере последний элемент - Massiv[9]
denis_v (2002-05-20 14:54:00) [16]Все гениальное просто - лучше не придумаешь!
Виктор Щербаков (2002-05-20 10:14:00) [17]var Massiv: array of Sometype; // объявляешь
...
SetLength(Massiv, 10); // задаешь размер
Massiv[1] := SomeVar; // работаешь