В общем, если можно, маленькую программу чтобы он, например, мог открыть существующий файл EXCEL, прочитать конкретную ячейку, запись в конкретной ячейке, …
Вот страница на msdn. Там есть ссылка на скачку архива и в архиве файл [MS-XLS].pdf
, в нём 1070 страниц описания кодировки))). Попробуйте ещё поискать готовые библиотеки в интернете, которые за вас будут всё читать/записывать… Ищите для языка C
, их можно подключить к паскалю. Ну в общем на 5 строчек программу для такого сложного формата не написать. Но вроде есть какие то простые форматы которые тоже открывает эксель. Это другой тип файлов и там будет не хватать большего количества элементов.
И ещё, переписать 1 ячейку не выйдет, это всегда загрузка всего файла, изменения и после этого сохранение файла целиком.
Поискал по Интернету, нашел метод, использовал и Вашу помощь, но нет результат. Прилагаю код программы. Помогите пожалуйста.Program5.pas (975 Байт)
Вы для чего перемешали коды PascalABC.NET и C# ? Я не давал решения, лишь пояснил, что нужно подключить в Паскаль по аналогии с С#. Но как это сделать, я не знаю, потому что у C# ссылка подключается к проекту через Reference.
Ну у меня по крайней мере удалось запустить… Но что можно делать с System.__ComObject
я не представляю, преобразование real
к нему работает, а назад нет.
{apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'Microsoft.Office.Interop.Excel.dll'}
begin
var app := new Microsoft.Office.Interop.Excel.ApplicationClass();
app.Visible := false;
app.Workbooks.Open('D:\Excel.xls', System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing);
var ws := app.Workbooks[1].Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
ws.Cells[1, 1] := real(25.32);
writeln(ws.Cells[1, 1].GetType);
//System.Windows.Forms.MessageBox.Show(ws.Cells[1, 1].GetType.ToString);
//var g := real(ws.Cells._Default[1, 1]) * 2;
//app.Quit();
//System.Windows.Forms.MessageBox.Show(g.ToString);
//writeln(g);
writeln('ok');
readln;
end.
Это же превосходно! По крайней мере, вот так он запускается и потом уходит из памяти. А с прочим разберемся!
{$reference 'Microsoft.Office.Interop.Excel.dll'}
begin
var oExcel:=new Microsoft.Office.Interop.Excel.ApplicationClass;
oExcel.Visible:=true;
Readln;
oExcel:=nil;
end.
Desktop.tar.gz (665,4 КБ)
Вычислить функцию 3-ln(2-3x) для x:=1/ 0,1/ 2, используя только динамические переменные.
var x:real; y^:real; begin new(y); read(x); y:=3-ln(2-3*x); write(y); end.
Задача написана неправильно, указатели(ссылочный тип) не стоит использовать?
Ну во первых прочитайте в справке как правильно использовать указатели потому что у вас даже в var запись не правильная. И зачем вы использовали указатели, какой по вашему прок от них тут?
Только динамичные переменные значит что у вас нету var
перед begin
, все var
находятся между begin
и end
, то есть var x := ReadInteger
вместо read(x)
, к примеру.
У Вас что, задача на ТурбоПаскале? Кто-то отыскал задачник, выпущенный до 1994 года? Ну кому РЕАЛЬНО может понадобиться, простите мой французский, долбиться с указателями и прочей ерундой в PascalABC.NET, если все var-переменные, объявленные в блоке, в нем создаются, а при выходе из блока автоматически уничтожаются? Ибо как все они фактически объекты. Динамические )))
нет, конечно) но вот это уже не мне знать, так уж повелось)
Для использования динамический переменных используем сылочный тип. Переменные сылочного типа являются статическими. Предполгал, что указатель и динамические переменные связаны. Ну ладно.
var y:=real;
new(y);
var x:=readinteger;
y:=3-ln(2-3/x);
write(y);
end.```
так правильнее? упд - в справке динамические переменные нет
Видимо, Вы так и не поняли… В PascalABC.NET ВООБЩЕ НЕТ ПРОСТЫХ ПЕРЕМЕННЫХ в том понимании, какое приписывалось им в ранних версиях: указатель на несколько байт в памяти, хранящих значение переменной. Поэтому все Ваши попытки работать с какими-то мифическими “динамическими переменными” заканчиваются пшиком. Вы пытаетесь на базе полноценного объекта, принадлежащего некоему классу, реализующему тот или иной базовый тип, смоделировать работу с управляемой памятью. Зачем - видимо и Вам непонятно.
begin
...
begin
var x:=readinteger;
var y:=3-ln(2-3/x);
write(y)
end;
...
end.
Здесь “переменные” х и у - самые что ни на есть “динамические”.- они не существуют вне блока, где описаны.
Непонятно, но теорию нужную я прикрепил в архиве, если её внимательно расммотреть. Но раз уж вы утверждаете, что это не правильно так делать. Ладно. На этом закончим.
Я не утверждаю, я высказываю свое мнение. Возможно, оно ошибочное, но тогда меня поправят.
Я сказал посмотреть про указатели в справке. Наберите pointer в поиске в справке.
Насчёт динамических переменных:
begin
begin
var b:integer;
end;
end.
В данной программе переменной b
выделяется память когда программа доходит до var b:integer;
. После этого программа доходит до первого end;
, через некоторое веремя, которое не возможно заметить но можно смоделировать процедурой System.GC.Collect
, сборщик мусора пройдёт по всей памяти и заметит что b
уже невозможно использовать(если вы попытаетесь использовать эту переменную после первого end
- компилятор такую программу не примет, скажет что b
неизвестное имя). Раз b
больше невозможно никак использовать - сборщик мусора удалить часть памяти в которой хранилось b
. Поэтому b
называется динамичной переменной, на неё выделило память не сразу при запуске программы и отчистило память до того как программа была завершена(ну или возможно была такая, сборщик мусора не так часто срабатывает, разве что если RAM переполняется). То есть b
динамичная потому что память выделяется динамично, в процессе выполнения. А статичной переменная может считаться если для неё var
прописан до первого begin
, потому что она будет существовать с запуска и до завершения программы.
Если что то не поняли - попытайтесь перечитать это сообщение ещё пару раз, если что то всё же не понятно - спрашивайте.
P.S. begin
и end
у меня только чтоб показать что память под b
будет освобождена до последнего end
, то есть раньше конца программы.
Вернемся к началу.
Если “динамическими” автор вопроса называет переменные, под которые память выделяется “ручками”, то задача неразрешима в принципе. Понадобятся указатели на такие переменные, которые суть статические.
b переменная размерного типа и размещается на стеке, уничтожается обычым ассемблерным ret, а не сборщиком мусора.
Статические-переменные типа указатели указывают путь к адресу ячейки памяти динамических переменных. То есть по сути мы добиваемся динамических переменных с помощью статических-переменных указаталей. Возможно или скорее всего, я ошибаюсь. Но ладно. Сам попробую найти решения задачи другими способами. Так что, спасибо всем кто не потруднился написать. Насчет справки - я всегда читаю теорию, потом задаю вопросы. Но иногда выходит, что сколько не читай, трудно осваиваются данные. Либо мало понимания языка, либо сам текст трудно объяснен для “новичков”.
Да, действительно это превосходно! Спасибо. Первый шаг прошел, т.е. запись в ячейках EXCEL программно. Но пока у меня не получается чтение из ячеек EXCEL программно. Попробовал разные варианты, но пока результатов на счет чтения нет. Прилагаю последний файлProgram5.pas (1,1 КБ). Жду Вашей помощи
Да, действительно это превосходно! Спасибо. Первый шаг прошел, т.е. запись в ячейках EXCEL программно. Но пока у меня не получается чтение из ячеек EXCEL программно. Попробовал разные варианты, но пока результатов на счет чтения нет. Прилагаю последний файл Program5.pas (1,1 КБ). Может попробуем дальше и находим этот метод. Заранее благодарю!