Помощь - Поиск - Пользователи - Календарь
Полная версия: работа с текстом в графическом режиме
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
18192123
Вот такая задачка:
В верхней левой и в правой нижней части экрана произволь-ным цветом создайте две прямоугольных области с одной общей точкой. Залейте их разным цветом и выведите внутри каждой области, соответственно, одно из следующих сообще-ний: «Question 1» и «Question 2»

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


Uses Crt, Graph;
const x = 320; y = 175;
var
DriverVar, ModeVar, a, b, a_, b_: integer;

begin
clrscr;
Writeln ('vvedite odni razmeri');
readln (a);
readln (b);
Writeln ('teperi sledyuchie');
readln (a_);
readln (b_);

DriverVar := Detect;
InitGraph (DriverVar, ModeVar,'');

SetBkColor(13);
setcolor(15);
bar(x+b,y+a,x,y);
SetTextStyle(0,1,1);
OutTextXY( (x + b) div 2, (y + a) div 2, 'Question 1');
setfillstyle(7,15);
bar(x,y,x-a_,y-b_);
SetTextStyle(0,0,2);
OutTextXY( (x - a_) div 2, (y - b_) div 2, 'Question 2');

readln;

closegraph;
end.


volvo
А теперь скажи, ЧТО надо ввести, чтобы получить ВООБЩЕ какой-нибудь прямоугольник, а не несколько отдельных линий?

И сразу же вопрос №2 - за счет чего ты хочешь
Цитата
чтобы текст не выходил за пределы прямоугольников
? Чтобы все, что НЕ поместилось - обрезалось? Или уменьшать размер шрифта?
18192123
Цитата(volvo @ 26.02.2007 21:14) *



И спвзу эе вопрос №2 - за счет чего ты хочешь ? Чтобы все, что НЕ поместилось - обрезалось? Или уменьшать размер шрифта?

уменьшать размер шрифта




Добавлено через 2 мин.
Цитата(volvo @ 26.02.2007 21:14) *

А теперь скажи, ЧТО надо ввести, чтобы получить ВООБЩЕ какой-нибудь прямоугольник, а не несколько отдельных линий?


Не пойму смысл этого вопроса! Ведь я использую процедуру для построения именно всего прямоугольника через координаты верхнего левого угла и нижнего правого.
Алена
Цитата
Не пойму смысл этого вопроса!
В программе есть ввод данных? ReadLn запрашивается? Что надо ввести, чтобы получить прямоугольники? При вводе произвольных данных прямоугольников не получается... Скажи ТОЧНО, какие цифры ты вводишь...

Добавлено через 40 сек.
Почему надо все время ДОГАДЫВАТЬСЯ? dry.gif
18192123
Цитата(Алена @ 27.02.2007 21:16) *

В программе есть ввод данных? ReadLn запрашивается? Что надо ввести, чтобы получить прямоугольники? При вводе произвольных данных прямоугольников не получается... Скажи ТОЧНО, какие цифры ты вводишь...

Добавлено через 40 сек.
Почему надо все время ДОГАДЫВАТЬСЯ? dry.gif

Пусть а=150, b=150, а_=180, b_=90
Почему при произвольных данных прямоугольники не получаются? ведь, в принципе, пользователь может ввести любые параметры для прямоугольников...
TarasBer
Розовый фон. Гламурненько... Глазам неприятно.
СетФиллСтиль - первый параметр - стиль заливки. Вы выбрали заливку клеточками. Второй параметр - цвет.
У меня такой вариант работает:


uses
Crt, Graph;

const
x = 320; y = 240;
S1 = 'Question 1';
S2 = 'Question 2';

var
DriverVar, ModeVar, a, b, a_, b_: integer;
W1, W2: integer;

begin
clrscr;
Writeln ('vvedite odni razmeri');
readln (a);
readln (b);
Writeln ('teperi sledyuchie');
readln (a_);
readln (b_);
DriverVar := Detect;
InitGraph (DriverVar, ModeVar,'');
SetTextJustify(CenterText, CenterText);
setcolor(15);
setfillstyle(1,GREEN);
bar(x+b,y+a,x,y);
SetTextStyle(4,0,4);
W1 := TextWidth(S1);
SetTextStyle(4, 1, a shl 2 div w1);
OutTextXY(x + b shr 1, y + a shr 1, S1);
setfillstyle(1,CYAN);
bar(x,y,x-a_,y-b_);
SetTextStyle(4,0,4);
W2 := TextWidth(S2);
SetTextStyle(4, 0, a_ shl 2 div w2);
OutTextXY(x - a_ shr 1, y - b_ shr 1, S2);
readln;
closegraph;
end.



Я смотрю, в этой теме сплошные кошки на аватарах...
T i m e
Цитата
Я смотрю, в этой теме сплошные кошки на аватарах...

Да уж кошачее собрание... smile.gif Прикольно.
TarasBer, а тебя прога при маленьких значениях всё равно текст за пределы выкидывает... Ну там конечно можно ещё стили менять текста (там ведь в разных стилях размер бывает совсем маленький) и меняя размер можно ущемлять его в прямоугольники или если нельзя ущемить вообще не выводить... Но я сомневаюсь что ему такая намудрённость нужна...
18192123
Цитата(TarasBer @ 27.02.2007 22:56) *


Вроде поняла..кроме одного момента...

W1 := TextWidth(S1);
SetTextStyle(4, 1, a shl 2 div w1);
OutTextXY(x + b shr 1, y + a shr 1, S1);




Каково назначение здесь первой строки? И откуда shl, shr ?
volvo
Цитата
Каково назначение здесь первой строки?
Вычисление ширины текста, вестимо..

Цитата
И откуда shl, shr ?
А у тебя на клавиатуре кнопка F1 есть? Откуда она там? И самое главное, ЗАЧЕМ? Набери shl в Паскале и нажми Ctrl + F1 - узнаешь, иначе обсуждение очень быстро выйдет за рамки заданной тобой темы...
18192123
Цитата(volvo @ 28.02.2007 1:01) *



Набери shl в Паскале и нажми Ctrl + F1 - узнаешь, иначе обсуждение очень быстро выйдет за рамки заданной тобой темы...

Не могли бы вы дать ссылку, где об этом можно подробно почитать (а то у меня Паскаль не русифицирован.... unsure.gif )
Ozzя
Цитата(18192123 @ 8.03.2007 23:51) *

Не могли бы вы дать ссылку, где об этом можно подробно почитать (а то у меня Паскаль не русифицирован.... unsure.gif )

Литература
18192123

SetTextStyle(4, 1, a shl 2 div w1);



выражение a shl 2 div w1, как я поняла, используется в качестве размера шрифта...
но объясните мне пожалуйста в чём его смысл ? (нашла, что операция shl обеспечивает сдвиг на определенное кол-во разрядов влево)
TarasBer
Цитата(18192123 @ 9.03.2007 19:50) *


SetTextStyle(4, 1, a shl 2 div w1);



выражение a shl 2 div w1, как я поняла, используется в качестве размера шрифта...
но объясните мне пожалуйста в чём его смысл ? (нашла, что операция shl обеспечивает сдвиг на определенное кол-во разрядов влево)

На положительные целые числа операция shl x дейтвует такде, как и умножение на 2 в степени x. А shr x означает делние на 2 в степени x. НО: умножение, а тем более деление может отнимать очень много времени, а побитовый сдвиг делается намного (в несколько десятков раз) быстрее. В маленьких программах разница во времени незаметна, но в серьёзных программах иногда приходится делать всё при помощи быстрых битовых операций.
Bokul
Конечно не по теме, но где можно бы почитать о применении логических операций к числам?
volvo
В поиске есть, suriv спрашивал когда-то, в "Теоретических вопросах" ...

Добавлено через 3 мин.
Здесь тоже было: Не пойму!
18192123
Цитата(TarasBer @ 9.03.2007 20:29) *

На положительные целые числа операция shl x дейтвует такде, как и умножение на 2 в степени x. А shr x означает делние на 2 в степени x. НО: умножение, а тем более деление может отнимать очень много времени, а побитовый сдвиг делается намного (в несколько десятков раз) быстрее. В маленьких программах разница во времени незаметна, но в серьёзных программах иногда приходится делать всё при помощи быстрых битовых операций.

а почему нужно именно 2 в выражении a shl 2 div w1?
TarasBer
Цитата(18192123 @ 9.03.2007 20:43) *

а почему нужно именно 2 в выражении a shl 2 div w1?

Потому что мне захотелось умножить именно на 2^2=4.
18192123
Цитата(TarasBer @ 9.03.2007 20:55) *

Потому что мне захотелось умножить именно на 2^2=4.

спасибо! теперь всё ясно!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.