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

Жаль, ответа до сих пор нет. У меня тоже этот вопрос стоит: MS Excel являет собой прекрасный пользовательский интерфейс для ввода данных, их визуализации и корректировки. Структурированные данные большого объема намного удобнее хранить, к примеру, в БД MS Access, чем придумывать для этого записи Pascal. А для этого нужно вызывать соответствующие средства. CreateObject просто необходим тут. Но если в VB и Delphi подключение нужных библиотек производится в интерфейсе, то PascalABC.Net его в рамках своего IDE не предоставляет. Так есть все же возможность создать объект Word.Application и управлять им?

Забавно, однако, но ответ для C# я нашел в течение одной минуты. Сомневаюсь, что там хоть что-то менять, кроме скобочек и стиля описания переменных, придется. Ну, и подключить библиотеку, конечно. Хотя, не тестил.

Спасибо!

Вот еще вопрос, есть ли в GraphABC что-то на подобие дельфийского Bitmap.Scanline?

Вы в вопрос вчитаться не пробовали? Автор спрашивает, КАК ПОДКЛЮЧИТЬ БИБЛИОТЕКУ в PascalABC.NET, а не как решать проблему в Си-шарпе.

По-прежнему без ответа. Неужели нерешаемо? Я попробую уточнить задачу: подключить из программы PascalABC.Net 3.2 объект типа ActiveX, не принадлежащий среде .Net, т.е. такой, который в пространстве имен .Net изначально отсутствует. Его нельзя просто так подключить через что-то типа oExcel:=new Excel.Application, потому что .Net не знает, что такое Excel.

У меня на диске вот такой пример:

{$reference Microsoft.Office.Interop.Word.dll}

uses
  System,
  Microsoft.Office.Interop.Word;

begin
  var wordAppType := &Type.GetTypeFromProgID('Word.Application', true);
  var word := Activator.CreateInstance(wordAppType) as ApplicationClass;
  word.Visible := True;
  var m: object := System.Type.Missing;
  var fname: Object := 'd:\a.txt';
  var d := word.Documents.Open(fname,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m);
  word.Selection.Text := 'Hello';
end.

При попытке откомпилировать сразу же ошибка в директиве: Program1.pas(1) : Сборка ‘Microsoft.Office.Interop.Word.dll’ не найдена

И действительно, такой dll нет, да и не видел я такую никогда… может, это из какого-то супернового MS Oфиса?

У меня вот так получилось. Если просто скопировать код и запустить, то откроется Word и возникнет ошибка

Program28.pas(13) : Ошибка времени выполнения: К сожалению, файл не найден. Может, он был перемещен, переименован или удален? (d:\a.txt)

Если создать такой файл вручную и запустить программу, то файл откроется в Word’е с уже написанным текстом, но сохранить этот текст нужно опять же в Word’е (если просто выйти, то ничего не сохранится).

Возможно, у меня старая версия ОС (Windows XP SP3) и/или MS Office (2003). Что все же странно: любой майкрософтовский продукт, даже древний, но способный работать под Windows, (принадлежащий дотнет или нет - неважно) легко вызывает любой другой ActiveX объект. Я пробовал из Borland Delphi а это уже не Microsoft), из VB обращаться к MS Office, к MS Access, автоматически работать с почтой в MS Outlook из Visual FoxPro, из Delphi управлял Com-сервером, написанным на том же Visual FoxPro, обращался из макросов MS Office к собственным dll, скомпилированным в VB6 - да никаких проблем, везде достаточно или присвоить объекту New XXX.Application или СreateObject(XXX.Application) и далее спокойно выдавать в созданный объект любые команды.

Может быть дело в том, что в .Net надо предварительно подключить какое-то соответствующее пространство имен с помощью некой операции? Во вложении я поместил картинку, которую можно увидеть, подключая в VBA MS Office ActiveX объекты. Ничего этого из PascalABC.Net вызвать через New не удается.

Здравствуйте, есть ли способ перемещать указатель на следующую переменную? Например в C# это делается так:

...
byte* p;
p++;
...

Еще интересно, как работает pascal с типом IntPtr?

Все понял. Спасибо всем за помощь!

var
  a,b:byte;
  pi:pbyte;
begin
  a := 12;
  b := 16;
  pi := @a;
  writeln(pi^); //12
  pi := pointer(integer(pi)+1);
  writeln(pi^);//16
end.

Хочется совета от специалистов. Часто бывает нужно представить длинное число, пусть натуральное для простоты, в виде массива из его цифр. Такая потребность возникает в школьных задачках на определение, каких цифр больше - четных или нечетных или нахождения среднего арифметического суммы четных и нечетных цифр.

Можно ли написать менее неуклюжий код, не возвращаясь к циклам?

// PascalABC.NET 3.2, сборка 1338 от 16.11.2016
begin
  var s:='152342231';
  var a:=s.ToCharArray.Select(c->c.ToDigit).Partition(i->i.IsOdd);
  Writeln('Ср.арифм. нечетных: ',a[0].Average:0:4,
    ', ср.арифм. четных: ',a[1].Average:0:4)
end.

Ср.арифм. нечетных: 2.6000, ср.арифм. четных: 2.5000

Простой вопрос: А возможно как-то получить экспоненциальную запись числа с плавающей точкой? Или нужно самому писать функцию, которая будет возвращать строку?

Где получить? На выводе или в переменной?

// PascalABC.NET 3.2, сборка 1341 от 20.11.2016
begin
  var r:=15320;
  WritelnFormat('{0:0.#####e+0}',r);
  var s:=String.Format('{0:0.#####e+0}',r);
  Writeln(s);
end.

На выводе ) Спасибо)

"Эллипс - это круг, вписанный в прямоугольник"
                          (Афоризмы офицеров Советской Армии)

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

   Вот чего в библиотеке графики не хватает - это свойства окна Aspect(<real>), 
задающего коэффициент искажения отношением масштабов по осям y и х для всего,
что рисуется. И такого же метода (или просто параметра) для примитивов,
а еще лучше - свойство для блока begin ... end, перекрывающего глобальный аспект.

Тогда можно было бы построить все на круге, а потом изменить аспект для необходимой группы операторов.

А так пробовали?

uses GraphABC;

begin
  Coordinate.Origin := Pnt(320,240);
  Coordinate.ScaleY := 0.5;
  Pie(0,0,200,0,100);
  Pie(0,0,200,100,150);
  Pie(0,0,200,150,230);
  Pie(0,0,200,230,360);
end.
1 лайк

Нет, конечно. По сути, это же и есть аспект по оси OY !!! Беда в том, что все приходится раскапывать экспериментальным путем. Поэтому большое спасибо за подобные примеры.

Попалась мне задача. Ничего особенного, но захотелось решить её в стиле, как можно более близком к функциональному.

Условие задачи:

Заполнить целочисленный массив R из 34 элементов случайными числами в интервале [-8;8] с использованием генератора случайных чисел. Упорядочить отрицательные элементы каждой половины массива по возрастанию квадратов значений. Остальные элементы оставить на своих местах.

Реализованный алгоритм:
  • Для каждой половины массива получить список пар вида <значение отрицательного элемента><индекс в массиве>
  • Каждый список отсортировать по предложенному ключу и объединить полученные списки
  • разделить список на массивы значений и их индексов
  • отсортировать массив индексов по возрастанию
  • вставить в исходный массив R элементы из массива значений на места, указанные в массиве индексов.
// PascalABC.NET 3.2, сборка 1362 от 14.12.2016
// Внимание! Если программа не работает, обновите версию!
const
  n=34;
begin
  var R:=ArrRandom(n,-8,8); R.Println;
  var R2:=R.Select((x,i)->(x,i)).Batch(n div 2).ToArray;
  var r21:=R2[0].Where(x->x[0]<0).OrderBy(x->sqr(x[0]));
  var ind:=r21+R2[1].Where(x->x[0]<0).OrderBy(x->sqr(x[0])).ToArray;
  var ind1:=ind.UnZipTuple;
  var aVal:=ind1[0].ToArray;
  var aInd:=ind1[1].Sorted.ToArray;
  for var i:=0 to aVal.Count-1 do R[aInd[i]]:=aVal[i];
  R.Println
end.
```

-    Хотелось бы увидеть менее монструозное решение. 
    Подозреваю, что я еще пока очень мало знаю о возможностях PascalABC.NET 3.2

Я бы воспользовался очередью. Вот решение для половины массива

begin
  var a := ArrRandom(17,-8,8);
  a.Println;
  var q := new Queue<integer>(a.Where(x->x<0).Sorted);
  a.Select((x,i)->x>=0?x:q.Dequeue).Println; 
end.
1 лайк