Жаль, ответа до сих пор нет. У меня тоже этот вопрос стоит: 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.
Нет, конечно. По сути, это же и есть аспект по оси 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.