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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2010, 11:33   #1
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию Процедура, рисующая дерево.

Здравствуйте уважаемые форумчане ))
я создал процедуру, которая, по-идее должна рисовать дерево(данные, собранные в динамическую структуру) на форме. подобно она процедуре формирования дерева- рекурсивна. Так вот что-то не работает....не знаю почему (не рисует ни одной чёрточки)
Я запускал программу пошагово, компилятор (можно так сказать? ) заходит в процедуру и проходит в ней все необходимые команды, но дерево не рисуется (на form2 из юнита holst.pas). Может просто цвет каким-то образом совпадает с цветом фона ? Прикрепляю архив.
А вот это код рекурсивной процедуры (которая как-бы должна рисовать) из юнита risdereva.pas:
Код:
unit risdereva;

interface
uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,sozdereva, holst ;
procedure risuemego ( x,y,xkop,ykop,leftx,lefty,
rightx,righty,radius:integer; uk1,uk1kop: pelement ) ;
implementation
procedure risuemego ( x,y,xkop,ykop,leftx,lefty,
rightx,righty,radius:integer; uk1,uk1kop: pelement ) ;
begin
  if uk1<>nil then
  begin
    xkop:=x;
    ykop:=y;
    uk1kop:=uk1;
    form2.Canvas.Pen.color:=clblack;
    form2.canvas.Ellipse(x-radius,y-radius,x+radius,y+radius);
    form2.Canvas.TextOut(x-10,y+10, uk1^.infa);
     if uk1^.left<>nil then
    begin
      form2.Canvas.Pen.color:=clblack;
      Form2.canvas.Pen.Style:=psSolid;
      form2.canvas.MoveTo(x-17,y+17);
      form2.canvas.LineTo(x-17+leftx,y+17+lefty);
      x:= x-17+leftx-17;
      y:= y+17+lefty+17;
      uk1:=uk1^.left;
      risuemego (x,y,xkop,ykop,leftx,lefty,
      rightx,righty,radius, uk1,uk1kop ) ;
    end;
    if uk1kop^.right<>nil then
    begin
      form2.Canvas.Pen.color:=clblack;
      form2.Canvas.Pen.Style:=psSolid;
      form2.Canvas.MoveTo(xkop+17,ykop+17);
      form2.Canvas.LineTo(xkop+17+rightx,ykop+17+righty);
      x:= xkop-17+rightx-17;
      y:= ykop+17+righty+17;
      uk1:=uk1kop^.right;
      risuemego (x,y,xkop,ykop,leftx,lefty,
      rightx,righty,radius, uk1,uk1kop ) ;
    end;
    
  end;

end;

end.
Прошу подсказать- что же здесь неправильно ?
Вложения
Тип файла: zip 555.zip (63.2 Кб, 23 просмотров)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось vedro-compota; 13.05.2010 в 11:34. Причина: чтоб понятней было 0)))
vedro-compota вне форума Ответить с цитированием
Старый 13.05.2010, 16:38   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

положите Image на форму и нарисуйте на нем.
потому что вообще то надо рисовать каждый раз когда обновляется окно.
буфера нет(изначально)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.05.2010, 16:51   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Можно проще - вызывать эту процедуру в OnPaint контрола, на котором рисуется. В данном случае формы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.05.2010, 17:33   #4
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
потому что вообще то надо рисовать каждый раз когда обновляется окно.
Не могли бы пояснить )) или где прочитать можно...
Цитата:
вызывать эту процедуру в OnPaint контрола, на котором рисуется.
и это тоже как-то не понятно ...
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 13.05.2010, 17:44   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас есть кадр, надо каждый раз подставлять новый.
почитать...хм...ну WinAPI, там поймете все это.

насчет слов Виталия.
у формы есть событие OnPaint именно в нем вызывайте процедуру прорисовки дерева.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.05.2010, 20:32   #6
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию ок

положил на форму Image, и изменил часть кода процедуры рисования. теперь так:
Код:
unit risdereva;

interface
uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,sozdereva, holst ;
procedure risuemego ( x,y,xkop,ykop,leftx,lefty,
rightx,righty,radius:integer; uk1,uk1kop: pelement ) ;
implementation
procedure risuemego ( x,y,xkop,ykop,leftx,lefty,
rightx,righty,radius:integer; uk1,uk1kop: pelement ) ;
begin
  if uk1<>nil then
  begin
    xkop:=x;
    ykop:=y;
    uk1kop:=uk1;
    form2.image1.Canvas.Pen.color:=clblack;
    form2.image1.canvas.Ellipse(x-radius,y-radius,x+radius,y+radius);
    form2.image1.Canvas.TextOut(x-10,y+10, uk1^.infa);
     if uk1^.left<>nil then
    begin
      form2.Canvas.Pen.color:=clblack;
      Form2.canvas.Pen.Style:=psSolid;
      form2.canvas.MoveTo(x-17,y+17);
      form2.canvas.LineTo(x-17+leftx,y+17+lefty);
      x:= x-17+leftx-17;
      y:= y+17+lefty+17;
      uk1:=uk1^.left;
      risuemego (x,y,xkop,ykop,leftx,lefty,
      rightx,righty,radius, uk1,uk1kop ) ;
    end;
    if uk1kop^.right<>nil then
    begin
      form2.Canvas.Pen.color:=clblack;
      form2.Canvas.Pen.Style:=psSolid;
      form2.Canvas.MoveTo(xkop+17,ykop+17);
      form2.Canvas.LineTo(xkop+17+rightx,ykop+17+righty);
      x:= xkop-17+rightx-17;
      y:= ykop+17+righty+17;
      uk1:=uk1kop^.right;
      risuemego (x,y,xkop,ykop,leftx,lefty,
      rightx,righty,radius, uk1,uk1kop ) ;
    end;
    
  end;

end;

end.
но ничего не происходит ( не рисуется) . может всё дело в том , что я открываю форму уже после рисования ( рисую на дополнительной форме)
прикреплю изменённый архив.
Вложения
Тип файла: zip 555-1.zip (64.0 Кб, 25 просмотров)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 14.05.2010, 20:13   #7
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Вот поправил. Один раз в проверке, один раз перед созданием. Осталось исправить работу функции, но это уже не мои заботы =)
Вложения
Тип файла: zip Задача5.zip (463.1 Кб, 68 просмотров)
TwiX вне форума Ответить с цитированием
Старый 14.05.2010, 20:44   #8
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию ага!

Вижу, что изменён изначальные параметр "х" (теперь он равен половине ширины формы) но в чём ключевое изменение - не понимаю....)) почему теперь рисует?
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 14.05.2010, 20:50   #9
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию аааааааа

понял.....форма теперь появляется сразу....но было не так задумано. Но спасибо за помощь, искренне вам ,TwiX, благодарен. 0)))
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 14.05.2010, 21:25   #10
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Нет, форму можно и скрыть. Забыл убрать) В функции не задвались X и Y, и поэтому в функцию вместо Y передавалось большое число, и рисовалось всё за формой.
TwiX вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна программа рисующая схему базы MySQL veter_s_morya Софт 3 28.12.2010 19:03
Процедура в процедура в C++ Builder Ecosasha C++ Builder 2 06.06.2009 17:17
Дерево MAcK Общие вопросы Delphi 7 13.06.2008 17:30
Дерево Rifler Паскаль, Turbo Pascal, PascalABC.NET 1 06.05.2008 08:42
Есть ли прога рисующая алгоритмы? Cyberbest Помощь студентам 6 04.05.2008 21:25