Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2012, 15:49   #1
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию Работа с canvas. Delphi

Доброго времени суток уважаемые программисты.
Написал код, который позволяет вывести текст, прочитанный из файла просто на форму (без использования memo, label и прочего!), но он выводится в одну строку...
Код:
procedure TForm1.outtxt;
var
 LF: TLogFont;
 NewFont: HFONT;
 q:integer;
begin
    if GetObject(Font.Handle, SizeOf(LF), @LF)<>0 then
    begin
      LF.lfFaceName:='Arial';
      LF.lfHeight:=20;
    //   Создаем новый фонт
      NewFont:=CreateFontIndirect(LF);
    if NewFont<>0 then
     begin
      with Form1.Canvas do begin
        TextOut(10, 90, '') ;
        for q:=1 to N do
         TextOut(PenPos.X, PenPos.Y, a[q]);
         sleep(500);
        end;
     end;
  end;
end;
Что необходимо чтобы текст выводился на форму, но не в одну строку, а как положено (т.е. если уперлись в правый край формы, перешли на новую строку) , и при достижении конца формы (ну её низа), текст смещался на одну строку вверх, и продолжал бы выводиться пока не закончится.
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 01.12.2012, 16:46   #2
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

Надо проверять укладывается ли позиция+TextWidth(строка) в ширину области вывода, если нет - устанавливать координаты на новую строку и/или предварительно разбивать строку на части.
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 01.12.2012, 16:54   #3
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

MihalNik, это что то в этом духе должно быть?
Код:
 for q:=i to N do
         TextOut(PenPos.X, PenPos.Y, a[q]);
          if PenPos.X+TextWidth(a[q])>200 then begin
         Form1.Canvas.MoveTo(Form1.Canvas.PenPos.X-200,
                       Form1.Canvas.PenPos.Y+10);
                       end;
если да, то как верно будет?? Код выше не работает, ничего не изменилось...
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 01.12.2012, 17:10   #4
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Разобрался с выводом не в строку, вот так вот работает:
Код:
procedure TForm1.outtxt;
var
  q: integer;
begin
  with Form1.Canvas do 
  begin
    for q := 1 to N do 
    begin
      TextOut(PenPos.X, PenPos.Y, a[q]);
      if PenPos.X + TextWidth(a[i]) > 250 then begin
        Form1.Canvas.MoveTo(Form1.Canvas.PenPos.X - (254 + TextWidth(a[i])),
                       Form1.Canvas.PenPos.Y + 20);
      end;
      sleep(100);
    end;
  end;
end;
Как теперь модернизировать это чтобы при выводе текста, когда места на форме уже не хватает (достигли низа формы), весь текст сдвигался на строку вверх?
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 01.12.2012, 17:14   #5
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

Перерисовывать если нельзя рассчитать предварительно верхнюю позицию (текст меняется)
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 01.12.2012, 17:17   #6
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

а поподробнее?
примерчик бы хотя бы посмотреть какой нибудь?
как то я слабо пока что представляю как это реализовать...
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...

Последний раз редактировалось McFrey; 01.12.2012 в 17:22.
McFrey вне форума Ответить с цитированием
Старый 01.12.2012, 17:35   #7
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

Высота текста = высота одной строки*к-во строк +м/устрочный интервал*(к-во строк -1). Какой-нибудь TextHeight(строка) м.б.
Пример - ищите "многострочный текст в ..." или "разбить строку в ..." (на строки). Есть, например, для ячеек таблиц (для TRect областей).
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 01.12.2012, 20:58   #8
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

а что мне даст высота текста если я её посчитаю....
мда....задачка....третий час сижу не могу текст по форме сдвинуть, это вабще реально?
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 01.12.2012, 21:10   #9
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

Вам нужна функция вывода текста с n-ой строки, т.е. рассчитать a[q] начиная с которой рисовать текст от верха формы? Если Вы собираетесь просто сдвинуть область TRect - тогда это CopyRect.
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 01.12.2012, 21:21   #10
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Вот у нас форма к примеру высота=265, ширина 256.
Я вывожу текст на неё, начиная от верхнего края вот таким образом
Код:
procedure TForm1.outtxt;
var
  q: integer;
begin
  with Form1.Canvas do
  begin
    for q := 1 to N do
    begin
      TextOut(PenPos.X, PenPos.Y, a[q]);
      if PenPos.X + TextWidth(a[i]) > 250 then begin
        Form1.Canvas.MoveTo(Form1.Canvas.PenPos.X - (240 + TextWidth(a[i])),
                       Form1.Canvas.PenPos.Y + 20);
      end;
      sleep(50);
    end;
  end;
end;
Постепенно форма заполняется строками. Когда следующая строка уже не влезет в границы формы (т.е. как бы будет ниже) мне необходимо самую первую строку с формы убрать, вторую поставить на её место, третью на место второй и так далее, делать это до тех пор пока не закончится текст.
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование квадрата. Работа на Canvas Файзулка Мультимедиа в Delphi 8 26.02.2010 14:34
Работа с Form.Canvas Fr_DWARF Компоненты Delphi 4 23.12.2009 17:02
работа с Canvas BloodMaX Общие вопросы Delphi 7 21.12.2009 21:49
Рисование квадрата, работа на canvas lubov_morkov Помощь студентам 2 02.06.2009 13:01
работа с CANVAS BuT@JL Помощь студентам 6 30.11.2008 22:18