uses System.Windows.Forms, GraphABC;
//
procedure DownKey(ch: integer);begin
Write(ch,’ ‘,ChrAnsi(ch),’ *** ');
if (ch = 27) then Halt;
end;
begin
OnKeyDown:= DownKey;
while (1=1) do begin
Sleep(40);
end;
end.
Нажатия F1…F9 нормально, F10…F12 срабатывают через “пень-колоду”
Используйте принципы Markdown чтобы вставлять код
```
код
```
По теме - попробуйте после одного нажатия любой из F10…F12 - нажать стрелку вниз. Это винда делает, а не GraphABC…
Впрочем .Net позволяет это отключить, если напрямую использовать оригинальный обработчик:
uses GraphABC;
procedure DownKey(ch: integer);
begin
Write(ch, ' ', ChrAnsi(ch), ' *** ');
if (ch = 27) then Halt;
end;
begin
MainForm.KeyDown += (o,e)->
begin
// DownKey(Ord(e.KeyCode));
if e.KeyCode = System.Windows.Forms.Keys.Escape then
MainForm.Close;
$'{e.KeyCode} ({Ord(e.KeyCode)}): {e.Modifiers}'.Println;
e.Handled := true; // Говорим дальше не пытаться обрабатывать
end;
end.
Спасибо за подсказку!!
Прилагаю исходник. Много мусора - не для критики…
В левом нижнем углу записи численных значениях координат и записи “что есть что” выведены на экран: во первых наоборот и с права на лево…
Раньше применял стандартные координаты. А этот фокус - с применением Coordinate.SetMathematic; и SetCoordinateOrigin(0+2,1009-2); - из левого нижнего RecBin.pas (4,4 КБ)
Прошу помочь.
Оксакалы - молчат. Пока что…
А тем временем, я продолжаю изучать вопрос.
Прилагаю исходник, маленькая программа для уяснения: что и как работает. Пока что, при переводе в математические координаты, точно что приводит к невозможности поставить контрольное чтение переменных величин.
Я обратил внимание на терминологию переписки участников форума об исходных процедурах и функциях из Borland Pascal. Если говорить об удобстве выполнения расчетов по любой дисциплине обучения в институте, то рано или поздно, у ученика возникает потребность выяснения - глядя на зигзаг кривой, возникает вопрос, а куда это она загибается… какие данные имеют численные значения по ходу исполнения программы ??
Мы все учились когда то… так и пишу: был способ временно остановить программу - а не прекратить работу программы, путем исполнения программы по частям с переводом курсора или чтением TexOut() … получить численные значения переменной…, Этот способ назывался Ch=ReadKey - и никаких подробностей.
К сожалению - это я так понял, что в настоящее время такой способ уходит куда то в параллельный мир Юзерсов PascalABCnet… от куда вернуться обратно не получается.
Итого, 2 вопроса:
-
Вернуть в PascalABCnet Ch=ReadKey - очень многие студенты скажут спасибо тов. Осипов!!! и тов. Test1.pas (1,7 КБ) модераторам форума!!
-
Или ПОЖАЛУЙСТА, покажите мне аналог с примером. Вычисления в OnMouseDown:=MouseDown; OnMouseUp:=MouseUp; потому что установка переменны в теле Mouse (или KeyDown, по описанным переменным в головной процедуре (программе) - что-то не очень хорошо получается … очень многие студенты скажут спасибо тов. Осипов!!! и тов. модераторам форума!!
ИТОГО: в описании СПРАВКА: “Класс GraphABCCoordinate графического окна”, описание “Свойства класса GraphABCCoordinate”, в равной степени относятся к “Методы класса GraphABCCoordinate”, где записано:
procedure SetMathematic; Устанавливает правую систему координат (ось OY направлена вверх, ось OX - вправо) procedure SetStandard; Устанавливает левую систему координат (ось OY направлена вниз, ось OX - вправо).
получается, что … при установке Сoordinate.SetMathematic; работа CoordinateOrigin (0,0); и Coordinate.SetOrigin(0,0); - одинакова.
А именно: property OriginX: integer; X-координата начала координат относительно левого верхнего угла окна property OriginY: integer; Y-координата начала координат относительно левого верхнего угла окна, ЧИТАЕМ еще раз: относительно левого верхнего угла окна…
и вся графика уходит вверх за пределы видимости…
Поэтому, вынужденно ставлю
CoordinateOrigin (0,Ydelta);
Coordinate.SetOrigin(0,Ydelta);, где Ydelta - высота окна.
Тогда вся графика появляется в границах окна.
Все тоже саме, если ввести свои координаты теле программы с самого начала, так как показано
в if mb=2 then begin
// xVv2 := x;
y:=(y-Ydelta)*(-1);
// yVv2 := y;
SetWindowCaption(‘ПРОЕКТ. Координаты курсора X, Y от Лев.Ниж. угла: ‘+’(’+IntToStr(x)+‘, ‘+IntToStr(y)+’)’);
System.Console.Beep(500,200);
end;
А замысел был хороший - “переход в математические координаты из левого нижнего угла окна”.
ВСем спасибо за посильную помощь…
Звучит будто вы описываете отладку (F7/F8 и красные точки останова, который можно ставить нажимая на панеле слева), но потом идёт что то про TextOut
и ReadKey
- и становиться непонятно, про что вы вообще.
TextOut
существует и уже даёт вам смотреть значения переменных, хоть и очень неудобно, потому что надо пере-компилировать и пере-запустить чтобы посмотреть значение какой-то другой переменной… А как ReadKey
помогло бы??? Оно на паузу ставит только 1 поток выполнения в консольной программе, а не всю программу. Ну и собственно есть оно, в виде методов класса Console
(ставите точку после имени этого класса на отдельной строчке и читаете).
У меня затруднение.
Type
Pr = record
// Next: Pointer;
n: Integer;
x: Integer;
y: Integer;
z: Integer;
// Last: Pointer;
end; // record
procedure MouseDown(x,y,mb: integer);
if mb=1 then begin …
vX:=x; vY:=(y-Ydelta)*(-1); SetWindowCaption(‘ПРОЕКТ. В математической системе координат: ‘+’(’+IntToStr(vX)+‘, ‘+IntToStr(vY)+’)’);
Coordinate.SetMathematic; SetCoordinateOrigin(0,Ydelta);
x1:=1640; y1:=790; x2:=1690; y2:= 830; If (vx>x1)AND(vy>y1)AND(vx<x2)AND(vy<y2) then begin…
хорошо - находит эту кнопку на экране и другие кнопки…
while (not EOF(fRec))OR(GAlfa <= 360) do begin // MyCount:=MyCount+1; NomRead:=NomRead+1; Read(fRec, Rec);
PutPixel(vX,vY, clRed);
Но, в цикле 2700 обращений… обрабатывается полностью 20%… потом происходит аппаратное прерывание… программа завершается. vN:=Rec.n; // If vN=100 Then vN:=Rec.n; vX:=Rec.x; // vY:=Rec.y; //Ycc:=Round(RvecSin(RAlfa)); vZ:=Rec.z; //Zcc:=Round(RvecCos(RAlfa)); // - для последующей записи…
Однако, если все это исполнять в основном теле программы - все работает без выбора вариантов - тех или иных кнопок на экране…
В Borland - “к гадалке не ходи”, это было понятно как.установить координаты X,Y и получить координаты X, Y - в теле программы, а не в юзере… Draph.ABC… путем обращения к перехвату x, y в обработчике MouseDown.
Иными словами, как передать значение установленное в лабиринтах юзера Graph… в Procedure MouseDown(x,y,mb: integer); для чтения в теле программы.
И вротой вопрос. КАк подвесить на переменную типа Pointer (да, Вы ввели новый ссылочный тип…) выбранный мной курсором участок изображения экрана . ВСем спасибо.
и третий вопрос. - Был “затухший” разговор про возможность получения мной материалов Вашей переписки с чиновниками по вопросу изменения рекомендованного Министерством ПО для базового обучения в школе.
И что???
Ещё раз
Отредактируйте своё сообщение для начала - потому что пока что не читабельно.