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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2012, 21:50   #11
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,669
По умолчанию

Код:
rect1, rect2: TRect;
D: Integer;
...
  rect1:= Form1.ClientRect;
  rect2:= rect1;
  rect1.Bottom:= rect1.Bottom - D;
  rect2.Top:= rect2.Top + D;
  Form1.Canvas.CopyRect(rect1, Form1.Canvas, rect2);
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 01.12.2012, 22:26   #12
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

MihalNik, огромное спасибо, вот так вот работает, т.е. все сдвигается так как нужно! Только после сдвига, выводится одна и таже строчка постоянно, ну последняя на которой и произошел сдвиг, не знаете как устранить?
Код:
procedure TForm1.outtxt;
var
  q: integer;
      rect1, rect2: TRect;
  D: 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);
          if PenPos.Y>275 then begin
      D:=20;
      rect1:= Form1.ClientRect;
      rect2:= rect1;
      rect1.Bottom:= rect1.Bottom - D;
      rect2.Top:= rect2.Top + D;
      Form1.Canvas.CopyRect(rect1, Form1.Canvas, rect2);
      end;
      end;
      sleep(10);
    end;
  end;
end;
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 01.12.2012, 22:41   #13
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,669
По умолчанию

Возможно TextOut в конце идти должен
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 01.12.2012, 23:01   #14
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Код:
procedure TForm1.outtxt;
var
  q: integer;
      rect1, rect2: TRect;
  D: Integer;
begin
  with Form1.Canvas do
  begin
    for q := 1 to N do
    begin
      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);
          if PenPos.Y>275 then begin
      D:=20;
      rect1:=Rect(0,0,255,283);
      rect2:= rect1;
      rect1.Bottom:= rect1.Bottom - D;
      rect2.Top:= rect2.Top + D;
      Form1.Canvas.CopyRect(rect1, Form1.Canvas, rect2);
      Form1.Canvas.MoveTo(Form1.Canvas.PenPos.X - (240 + TextWidth(a[i])),
                       Form1.Canvas.PenPos.Y - 20);
      end;
      end;
      TextOut(PenPos.X, PenPos.Y, a[q]);
      sleep(10);
    end;
  end;
end;
Вот конечный вариант, немного коряво, но работает, может "потомкам" пригодится =)
Отдельное, большое спасибо MihalNik
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 01.12.2012, 23:20   #15
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Успешно применяю:
Код:
function AddMultiLineText(aText: string; Canv: TCanvas; Bound: Tpoint): Integer;
var
  i, c, res: Word;
  sl: TStringList;
  s: string;
  TH: Integer;

  function AddRow(astr: string): Boolean;
  begin
    Canv.TextOut(Bound.X, res * TH + Bound.Y, astr);
  end;

  function Addline(astr, aword: string): Boolean;
  begin
    Result := Canv.TextWidth(astr + aword) >= Canv.ClipRect.Right - Bound.X;
    if Result then
    begin
      AddRow(astr);
      inc(res)
    end;
  end;

  procedure WordDivider;
  begin
    StringReplace(atext, '  ', ' ', [rfReplaceAll]); // kill all double-space
    SL.Delimiter := ' ';
    SL.DelimitedText := aText; // divide all Text into words
  end;

begin
  SL := TStringList.Create;
  WordDivider;
  Res := 0;
  s := '';
  TH := Canv.TextHeight('1') - 10;
  c := SL.Count - 1;
  for i := 0 to c do
  begin
    if Addline(s, sl[i]) then // if string fits then inscribe it
      s := ''; // and Clear it
    s := s + sl[i] + ' '; // and Add a word
    if (i = c) and (s <> '') then // if needed Add last string
    begin
      AddRow(s);
      inc(res);
    end;
  end;
  Result := res;
  FreeAndNil(SL);
end;
Даём текст и канвас куда выводить, также отступ в виде тпоинт (по х и по у с каждой края канваса). Возращает кол-во строк полученных при разбиении. При превышении текстом размеров канваса, ессно строки просто не отрисуются.
phomm вне форума Ответить с цитированием
Старый 02.12.2012, 00:19   #16
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

phomm, я правильно понимаю, что если текст не влезет в отведенную для него "канву" то его и не отобразит??или уже ночь и мой мозг спит?

Если б все было так просто....а бился я над тем как раз, что если текст не влезет то все равно должен отображать...

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

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

Конечно, не отобразит.
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 02.12.2012, 09:37   #18
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

вот проект похожий, только рисует на DC=0
Выходить Alt+F4
Вложения
Тип файла: rar Матрица хд.rar (315.1 Кб, 13 просмотров)
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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