Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 19.10.2020
Сообщений: 41

Копирование из Variant массива в массив обычного типа

02.09.2021, 16:12. Показов 5271. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Данные изначально копируется из Excel таблицы, потом заносятся в перменную типа variant.
Мне нужно получить эти данные в обычный двумерный массив для дальнейшей работы.
Не могу никак разобраться, каким способом или функцией можно провести преобразование.

Delphi
1
2
3
4
5
6
7
8
ar
  Form2: TForm2;
  Excel: Variant;
  FileName:TFileName;
   MyMass: Variant;
      Mass: array of array of Double;
 type
  TDoubleArray = array of array of Double;
Вот код. Перенос из Excel
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
procedure TForm2.Button3Click(Sender: TObject);
const
   xlCellTypeLastCell = $0000000B;
var
   ExcelApp, ExcelSheet: OLEVariant;
 
   x, y: Integer;
begin
   // создание OLE-объекта Excel
   ExcelApp := CreateOleObject('Excel.Application');
 
   // открытие книги Excel
   ExcelApp.Workbooks.Open('C:\DELPHI\Синусоида\test3\XY.xlsx');
 
   // открытие листа книги
   ExcelSheet := ExcelApp.Workbooks[1].WorkSheets[1];
 
   // выделение последней задействованной ячейки на листе
   ExcelSheet.Cells.SpecialCells(xlCellTypeLastCell).Activate;
 
   // получение значений размера выбранного диапазона
   x := ExcelApp.ActiveCell.Row;
   y := ExcelApp.ActiveCell.Column;
 
   // присвоение массиву диапазона ячеек на листе
   MyMass := ExcelApp.Range['A1', ExcelApp.Cells.Item[X, Y]].Value;
 
   // закрытие книги и очистка переменных
   ExcelApp.Quit;
   ExcelApp := Unassigned;
   ExcelSheet := Unassigned;
   // назначение размера StringGrid по размеру полученного диапазона ячеек
StringGrid1.RowCount := x;
StringGrid1.ColCount := y;
 
// заполнение таблицы StringGrid значениями массива
for x := 1 to StringGrid1.ColCount do
  for y := 1 to StringGrid1.RowCount do
      StringGrid1.Cells[x-1, y-1] := MyMass[y, x];
end;
Здесь пытаюсь данные перенести из первого массива во второй и вывести их в мемо для проверки.



Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
unction VarToArrayInt(const V: Variant): TDoubleArray;
var
  I: integer;
begin
  if VarIsArray(V) then begin
    SetLength(Result, VarArrayHighBound(V, 1) + 1);
    for I:= 0 to High(Result) do Result[I]:= V[I];
  end else begin
    SetLength(Result, 1);
    Result[0]:= V;
  end;
end;
procedure TForm2.Button4Click(Sender: TObject);
  var  x,y :integer;
  begin
   for x := 1 to StringGrid1.ColCount -1 do
  for y := 1 to StringGrid1.RowCount -1 do
   Begin
     mass[y,x]:=MyMass[y,x];
     memo1.Lines.Add(FloatToStr(mass[x,y]));
 
end;
Буду рад любой помощи!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.09.2021, 16:12
Ответы с готовыми решениями:

Как записать в массив типа variant значение типа double?
Есть массив массивов типа variant. В первой ячейке (элементе) текст, в остальных 4 нули. Текст-1 0 0 0 0 С массивом, 3 ячейками...

Копирование обычного или вариантного массива в Excel, в чем разница?
Сразу к задаче: задача заполнять динамический массив из массивов в два значения - т.е. двумерный (тип Double) в течение 15 мин данными....

Ассемблерная вставка: копирование содержимого массива типа char в n-раз больший массив
Собственно задание: Написать программу, осуществляющую копирование содержимого массива типа char в n-раз больший массив, при этом каждый...

24
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
03.09.2021, 10:34
Лучший ответ Сообщение было отмечено Gorrikvorik как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Gorrikvorik Посмотреть сообщение
По идеи нельзя же выводить в двумерном массиве только одну часть? Получается надо разбить на два массива и по очереди их заполнять?
это как? Я даже не могу себе представить такую конструкцию мысленно в голове оО
0
0 / 0 / 0
Регистрация: 19.10.2020
Сообщений: 41
03.09.2021, 10:48  [ТС]
Да, все четко!
Спасибо Вам большое!
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
03.09.2021, 11:00
пожалуста
0
0 / 0 / 0
Регистрация: 19.10.2020
Сообщений: 41
03.09.2021, 16:13  [ТС]
Цитата Сообщение от Arcor Посмотреть сообщение
f ConvertVarToDouble2D(VarArr, DblArr) then
    begin
      for i := 0 to Length(DblArr) - 1 do
        begin
          for j := 0 to Length(DblArr[i]) - 1 do
            begin
              S := S + FloatToStr(DblArr[i, j]) + '      '
            end;
Если позволите, глупый вопрос но необходимый. Как мне получать допустим не все значения,а скажем первые 1000 или 5000?
При изменении границ в цикле все рушится(
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
03.09.2021, 17:39
Цитата Сообщение от Gorrikvorik Посмотреть сообщение
Если позволите, глупый вопрос но необходимый. Как мне получать допустим не все значения,а скажем первые 1000 или 5000?
При изменении границ в цикле все рушится(
что должно быть 1000 или 5000? строк? столбцов? вообще элементов?

ну по сути если массив

A := 1 2 3 4 5 6 7 8 9 и мне надо получить первые 3 то

for i := 0 to 3 - 1 do

пройдет только 1 2 3 элемента, что у вас там не выходит я не знаю.

Щаз я потрапезничаю и включу телепатор, мож пойму проблему, а то на голодный желудок мозг не хватает энергии для включения телепатора
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.09.2021, 17:39

Нужно из обычного массива изменить на многоуровневый массив данных
function get_correct_answers($test){ if(!$test) return false; global $db; $query="SELECT q.id AS question_id, a.id AS...

Как преобразовать объект типа Variant в объект пользовательского типа?
Как преобразовать объект типа Variant в объект пользовательского типа, т.е в объект класса, который я создал? Вот строчка, из GetUser()...

Копирование в текстовый файл из потока fstream массива типа char
Всем привет! У меня довольно простой, но очень важный для меня вопрос, ответ на который пока не очевиден... Если я средствами Windows...

Сформировать массив типа bool из массива типа char
Доброго времени суток! После ввода элементов массива вылазит ошибка "Необработанное исключение: System.NullReferenceException ... "...

Преобразование массива типа char в массив типа float
Хорош ли следующий способ преобразования массива типа char в массив типа float? #include <stdio.h> #include <locale.h> ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru