Помощь новичкам


#266

В общем, если можно, маленькую программу чтобы он, например, мог открыть существующий файл EXCEL, прочитать конкретную ячейку, запись в конкретной ячейке, …


#267

Вот страница на msdn. Там есть ссылка на скачку архива и в архиве файл [MS-XLS].pdf, в нём 1070 страниц описания кодировки))). Попробуйте ещё поискать готовые библиотеки в интернете, которые за вас будут всё читать/записывать… Ищите для языка C, их можно подключить к паскалю. Ну в общем на 5 строчек программу для такого сложного формата не написать. Но вроде есть какие то простые форматы которые тоже открывает эксель. Это другой тип файлов и там будет не хватать большего количества элементов.

И ещё, переписать 1 ячейку не выйдет, это всегда загрузка всего файла, изменения и после этого сохранение файла целиком.


#268

Поискал по Интернету, нашел метод, использовал и Вашу помощь, но нет результат. Прилагаю код программы. Помогите пожалуйста.Program5.pas (975 Байт)


#269

Вы для чего перемешали коды PascalABC.NET и C# ? Я не давал решения, лишь пояснил, что нужно подключить в Паскаль по аналогии с С#. Но как это сделать, я не знаю, потому что у C# ссылка подключается к проекту через Reference.


#270

Ну у меня по крайней мере удалось запустить… Но что можно делать с 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.

#271

Это же превосходно! По крайней мере, вот так он запускается и потом уходит из памяти. А с прочим разберемся!

{$reference 'Microsoft.Office.Interop.Excel.dll'}

begin
  var oExcel:=new Microsoft.Office.Interop.Excel.ApplicationClass;
  oExcel.Visible:=true;

  Readln;
  oExcel:=nil;
end.

#272

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.

Задача написана неправильно, указатели(ссылочный тип) не стоит использовать?


#273

Ну во первых прочитайте в справке как правильно использовать указатели потому что у вас даже в var запись не правильная. И зачем вы использовали указатели, какой по вашему прок от них тут?

Только динамичные переменные значит что у вас нету var перед begin, все var находятся между begin и end, то есть var x := ReadInteger вместо read(x), к примеру.


#274

У Вас что, задача на ТурбоПаскале? Кто-то отыскал задачник, выпущенный до 1994 года? Ну кому РЕАЛЬНО может понадобиться, простите мой французский, долбиться с указателями и прочей ерундой в PascalABC.NET, если все var-переменные, объявленные в блоке, в нем создаются, а при выходе из блока автоматически уничтожаются? Ибо как все они фактически объекты. Динамические )))


#275

нет, конечно) но вот это уже не мне знать, так уж повелось)


#276

Для использования динамический переменных используем сылочный тип. Переменные сылочного типа являются статическими. Предполгал, что указатель и динамические переменные связаны. Ну ладно.

var y:=real;
new(y);
var x:=readinteger;
y:=3-ln(2-3/x);
write(y);
end.```

так правильнее? упд - в справке динамические переменные нет

#277

Видимо, Вы так и не поняли… В PascalABC.NET ВООБЩЕ НЕТ ПРОСТЫХ ПЕРЕМЕННЫХ в том понимании, какое приписывалось им в ранних версиях: указатель на несколько байт в памяти, хранящих значение переменной. Поэтому все Ваши попытки работать с какими-то мифическими “динамическими переменными” заканчиваются пшиком. Вы пытаетесь на базе полноценного объекта, принадлежащего некоему классу, реализующему тот или иной базовый тип, смоделировать работу с управляемой памятью. Зачем - видимо и Вам непонятно.

begin
...
   begin
      var x:=readinteger;
      var y:=3-ln(2-3/x);
      write(y)
   end;
...
end.

Здесь “переменные” х и у - самые что ни на есть “динамические”.- они не существуют вне блока, где описаны.


#278

Непонятно, но теорию нужную я прикрепил в архиве, если её внимательно расммотреть. Но раз уж вы утверждаете, что это не правильно так делать. Ладно. На этом закончим.


#279

Я не утверждаю, я высказываю свое мнение. Возможно, оно ошибочное, но тогда меня поправят.


#280

Я сказал посмотреть про указатели в справке. Наберите 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, то есть раньше конца программы.


#281

Вернемся к началу.

Если “динамическими” автор вопроса называет переменные, под которые память выделяется “ручками”, то задача неразрешима в принципе. Понадобятся указатели на такие переменные, которые суть статические.


#282

b переменная размерного типа и размещается на стеке, уничтожается обычым ассемблерным ret, а не сборщиком мусора.


#284

Статические-переменные типа указатели указывают путь к адресу ячейки памяти динамических переменных. То есть по сути мы добиваемся динамических переменных с помощью статических-переменных указаталей. Возможно или скорее всего, я ошибаюсь. Но ладно. Сам попробую найти решения задачи другими способами. Так что, спасибо всем кто не потруднился написать. Насчет справки - я всегда читаю теорию, потом задаю вопросы. Но иногда выходит, что сколько не читай, трудно осваиваются данные. Либо мало понимания языка, либо сам текст трудно объяснен для “новичков”.


#285

Да, действительно это превосходно! Спасибо. Первый шаг прошел, т.е. запись в ячейках EXCEL программно. Но пока у меня не получается чтение из ячеек EXCEL программно. Попробовал разные варианты, но пока результатов на счет чтения нет. Прилагаю последний файлProgram5.pas (1,1 КБ). Жду Вашей помощи


#286

Да, действительно это превосходно! Спасибо. Первый шаг прошел, т.е. запись в ячейках EXCEL программно. Но пока у меня не получается чтение из ячеек EXCEL программно. Попробовал разные варианты, но пока результатов на счет чтения нет. Прилагаю последний файл Program5.pas (1,1 КБ). Может попробуем дальше и находим этот метод. Заранее благодарю!