OberonCore
https://forum.oberoncore.ru/

Не работает Oberon-2 код
https://forum.oberoncore.ru/viewtopic.php?f=30&t=817
Страница 1 из 1

Автор:  Edward Ivanov [ Четверг, 10 Январь, 2008 22:56 ]
Заголовок сообщения:  Не работает Oberon-2 код

Привет!
Я использую XDS Oberon-2.
Создаю статус-бар. Это работает.
Не могу его разбить на parts (отсеки), получается только single-part.
Интересно, что Modulа-2 код работает.
В SendMessage третий параметр - длина маcсива, четвертый - сам адрес массива.
Даже M2ADR не помог для обероновского кода.
В чем может быть дело?
...

IMPORT CC := CommCtrl;
IMPORT W := Windows;

...
PROCEDURE CreateStatusBar (hWnd: W.HWND);
VAR
style: W.WS_SET;
arrWidthsSB: ARRAY 6 OF INTEGER;
-- arrWidthsSB: ARRAY [0..5] OF INTEGER;

BEGIN
style := W.WS_CHILD + W.WS_VISIBLE + W.WS_BORDER
+ W.WS_CLIPSIBLINGS + SYSTEM.VAL(W.WS_SET, CC.SBARS_SIZEGRIP);

hwndSB := W.CreateWindowEx (W.WS_EX_SET{}, CC.STATUSCLASSNAME, "",
W.WS_CHILD + W.WS_VISIBLE,
0, 0, 0, 0, hWnd,
SYSTEM.VAL (W.HMENU, IDC_MAIN_STATUS), W.MyInstance(), NIL);

arrWidthsSB[0] := 125;
arrWidthsSB[1] := 225;
arrWidthsSB[2] := 325;
arrWidthsSB[3] := 375;
arrWidthsSB[4] := 500;
arrWidthsSB[5] := -1;

W.SendMessage (hwndSB, CC.SB_SETPARTS, SYSTEM.VAL (W.WPARAM, LEN(arrWidthsSB)), SYSTEM.VAL (W.LPARAM, SYSTEM.ADR(arrWidthsSB)));

(* Oberon-2, не работает !!! *)
-- W.SendMessage (hwndSB, CC.SB_SETPARTS, SYSTEM.CAST (W.WPARAM, LEN(arrWidthsSB)), SYSTEM.CAST (W.LPARAM, SYSTEM.ADR(arrWidthsSB)));
-- или вот так
-- W.SendMessage (hwndSB, CC.SB_SETPARTS, SYSTEM.CAST (W.WPARAM, LEN(arrWidthsSB)), SYSTEM.CAST (W.LPARAM, SYSTEM.M2ADR(arrWidthsSB)));

END CreateStatusBar;

Автор:  Александр Ильин [ Пятница, 11 Январь, 2008 08:23 ]
Заголовок сообщения:  Re: Не работает Oberon-2 код

Edward Ivanov писал(а):
(* Oberon-2, не работает !!! *)
-- W.SendMessage (hwndSB, CC.SB_SETPARTS, SYSTEM.CAST (W.WPARAM, LEN(arrWidthsSB)), SYSTEM.CAST (W.LPARAM, SYSTEM.ADR(arrWidthsSB)));
-- или вот так
-- W.SendMessage (hwndSB, CC.SB_SETPARTS, SYSTEM.CAST (W.WPARAM, LEN(arrWidthsSB)), SYSTEM.CAST (W.LPARAM, SYSTEM.M2ADR(arrWidthsSB)));

Вообще-то, SYSTEM.CAST - это как раз Модула, а Оберон - SYSTEM.VAL.

Автор:  Edward Ivanov [ Пятница, 11 Январь, 2008 10:04 ]
Заголовок сообщения:  Re: Не работает Oberon-2 код

Да, невнимательно вставил copy-paste. Извиняюсь.
Но проблема все равно остается.

Автор:  Александр Ильин [ Пятница, 11 Январь, 2008 10:47 ]
Заголовок сообщения:  Re: Не работает Oberon-2 код

Edward Ivanov писал(а):
Да, невнимательно вставил copy-paste. Извиняюсь.
Но проблема все равно остается.

Какая проблема-то? Я указал вам на противоречие в вашем посте. Если это из-за copy-paste, то исправьте ваше первое сообщение (кнопка "правка").

Противоречие в том, что вы пишете, что не работает код на Обероне, а сами приводите в качестве неработающего код на Модуле. А тот код, который по-вашему работает - на самом деле Оберон, хотя вы почему-то называете его Модулой.
Из вашего поста я понял, что код с SYSTEM.VAL работает, а с SYSTEM.CAST - не работает. SYSTEM.VAL - процедура Оберона, а не Модулы.

Уточните, в чём по-вашему проблема.
Тулбар создали? - Да.
На Обероне? - Да.
Проблема в том, что на Модуле с помощью SYSTEM.CAST не получается?
В том, что SYSTEM.CAST работает не так, как SYSTEM.VAL?
Или ещё в чём-то?

PS: Тоже работаю на XDS Oberon-2. Правда, тулбары не создавал.

Автор:  Edward Ivanov [ Пятница, 11 Январь, 2008 12:16 ]
Заголовок сообщения:  Re: Не работает Oberon-2 код

Тулбары тут ни при чем, мы о статусбарах.
В XDS\Samples\Generic есть проект создания простейшего гуевого приложения.
Я его модифицировал минимально, смотрите обработку сообщения WM_CREATE главного окна приложения.
Чтобы исключить коллизии, код приводить не буду, вместо этого создал архив с проектами и исходниками.
В нем две папки c исходниками - Generic (Modula-2) и Generic2 (Oberon-2).
И исполняемые файлы в них.

Проблема вот в чем - статусбар создается. В модуле он нарезается на сегменты. В обероне - нет.
Вот это мне и непонятно - код почти один в один.

Вложения:
SAMPLES.zip [82.62 КБ]
Скачиваний: 400

Автор:  Александр Ильин [ Пятница, 11 Январь, 2008 13:06 ]
Заголовок сообщения:  Re: Не работает Oberon-2 код

Ну вот, совсем другое дело.

Есть такая опция компилятора: M2BASE16. По умолчанию она выключена. Если её включить, то тип INTEGER в языке Модула будет 16 бит, а по умолчанию - 32 бита. См. также опцию M2ADDTYPES.

В реализации XDS Oberon тип INTEGER всегда имеет размер 16 бит. Windows ожидает массив 32-битных чисел. В обероновских исходниках в данном случае следует использовать тип LONGINT.

Автор:  Edward Ivanov [ Пятница, 11 Январь, 2008 14:33 ]
Заголовок сообщения:  Re: Не работает Oberon-2 код

Александр, спасибо за отменный ответ!
В самом деле, все заработало как надо.
Придется попристальнее взглянуть на опции.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/