Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.07.2010, 19:50
Pigmalion Pigmalion вне форума
Прохожий
 
Регистрация: 01.07.2010
Сообщения: 20
Репутация: 10
Вопрос Ошбка. Процедура в процедуре

Доброго времени суток всем. Подскажите,я эту процедуру:
Код:
  
 procedure EnterText(x,y:integer;s:string);
     var
      Canvas:TCanvas;
   begin
     Canvas.Font.Size   := 12;
     Canvas.Font.Color  := clBlack;
     Canvas.TextOut(x,y,s);
   end;
Подставляю сюда
Код:
procedure TForm1.Block(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if (Bl) then
   begin
    canvas.Brush.Color:=clwhite;
    canvas.Rectangle(60,50,180,110);
   procedure EnterText(62,70,'Some text');
    BL:= not BL;
    exit;
    end;
   begin
if not BL then
     begin
      canvas.pen.Style:=pssolid;
      canvas.Brush.Color:=clred;
      canvas.Rectangle(60,50,180,110);
      procedure EnterText(62,70,'Some text');
      BL:= true;
      exit;
     end;
    end;
end;
Ошибка.Если пропустить прога глючит(
Ответить с цитированием
  #2  
Старый 06.07.2010, 19:54
Аватар для urahara
urahara urahara вне форума
Новичок
 
Регистрация: 16.01.2010
Сообщения: 86
Репутация: 35
По умолчанию

Canvas:TCanvas; не инициализирована.
__________________
Arrrgh
Ответить с цитированием
  #3  
Старый 06.07.2010, 19:57
Аватар для PeKpyT
PeKpyT PeKpyT вне форума
Прохожий
 
Регистрация: 06.07.2010
Адрес: Internet
Сообщения: 3
Репутация: 10
По умолчанию

Код:
procedure TForm1.Block(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if (Bl) then
   begin
    canvas.Brush.Color:=clwhite;
    canvas.Rectangle(60,50,180,110);
procedure EnterText(62,70,'Some text');
    BL:= not BL;
    exit;
    end;
   begin
if not BL then
     begin
      canvas.pen.Style:=pssolid;
      canvas.Brush.Color:=clred;
      canvas.Rectangle(60,50,180,110);
 procedure EnterText(62,70,'Some text');
      BL:= true;
      exit;
     end;
    end;
end;

Ключевого слова procedure там не должно быть! просто EnterText(62,70,'Some text')
Ответить с цитированием
  #4  
Старый 06.07.2010, 20:07
Pigmalion Pigmalion вне форума
Прохожий
 
Регистрация: 01.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от urahara
Canvas:TCanvas; не инициализирована.
А как инициализировать?
Цитата:
Ключевого слова procedure там не должно быть! просто EnterText(62,70,'Some text')
Это я знаю,при копировании перепутал)
Ответить с цитированием
  #5  
Старый 06.07.2010, 20:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

у тебя Canvas должно в процедуру EnterText передаваться извне.
т.е:
Код:
 procedure EnterText(Canvas : TCanvas; x,y:integer;s:string);
   begin
     Canvas.Font.Size   := 12;
     Canvas.Font.Color  := clBlack;
     Canvas.TextOut(x,y,s);
   end;

Соответсвенно, в вызове указывай тот Canvas, с которым работаешь.

ЗЫ. Если ты работаешь с канвой формы, то можно сделать процедуру без передачи канвы - убираешь указание Canvas, а процедуру делаешь методом формы. в этом случае процедура будет обращаться к канве формы.
Ответить с цитированием
  #6  
Старый 06.07.2010, 20:26
Pigmalion Pigmalion вне форума
Прохожий
 
Регистрация: 01.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

Благодарю,lmikle.Вроде работает.
Ответить с цитированием
  #7  
Старый 06.07.2010, 22:51
Pigmalion Pigmalion вне форума
Прохожий
 
Регистрация: 01.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

А вот ещё:
Код:
 procedure CreateBlock(Canvas:TCanvas;x,y,z,x1,y1,x2,y2:integer;
  Pr:boolean;s:string);
begin
if Pr then
    begin
     Canvas.Brush.Color:=clgreen;
     Canvas.rectangle(x1,y1,x2,y2);
     Canvas.Font.Size:=z;
     Canvas.Font.Color:=clBlack;
     Canvas.TextOut(x,y,s);
     Pr:= not Pr;
    exit;
    end;
if not Pr then
    begin
     Canvas.Brush.Color:=clred;
     Canvas.rectangle(x1,y1,x2,y2);
     Canvas.Font.Size:=z;
     Canvas.Font.Color:=clBlack;
     Canvas.TextOut(x,y,s);
     Pr:= true;
    exit;
   end;
  end;
Вроде всё правильно.Процедура должна менять цвет прямоугольника при щелчке и обратно.Закрашивает в новый, а обратно никак.
Ответить с цитированием
  #8  
Старый 06.07.2010, 22:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

угу... перед Pr в описании функции поставь var.
и вообще, кто так пишет???
Код:
procedure CreateBlock(Canvas:TCanvas;x,y,z,x1,y1,x2,y2:integer;
  var Pr:boolean;s:string);
begin
  if Pr 
    then Canvas.Brush.Color:=clgreen;
    else Canvas.Brush.Color:=clred;

  Canvas.rectangle(x1,y1,x2,y2);
  Canvas.Font.Size:=z;
  Canvas.Font.Color:=clBlack;
  Canvas.TextOut(x,y,s);
  Pr:= not Pr;
end;
Ответить с цитированием
  #9  
Старый 06.07.2010, 23:14
Pigmalion Pigmalion вне форума
Прохожий
 
Регистрация: 01.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

Угу..вы тоже когда-то так писали.Благодарю ещё раз.Не понимаю только почему это так повлияло?Всё заработало.
Ответить с цитированием
  #10  
Старый 06.07.2010, 23:32
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

Весь фокус в var. Дело в том, что если не указан var, то сколько ты не меняй значение переменной, снаружи процедуры оно не изменеися. Почитай о передаче параметров в функции по значению и по ссылке. Фактически var - это указание передавать значение по ссылке.
Ответить с цитированием
  #11  
Старый 07.07.2010, 02:43
Pigmalion Pigmalion вне форума
Прохожий
 
Регистрация: 01.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Ну, я так не писал никогда. У меня были хорошие учителя, кторые сразу отучили меня от писания " в лоб".
"Эх.мне бы таких учителей, а то приходится самому всякое непонятное писать и разбираться во всём этом. Т.е. здесь
Код:
procedure PaintLine(Canvas:TCanvas;x1,y1,x2,y2:integer);
 begin
  Canvas.Pen.Width:=5;
  Canvas.Brush.Color:=clred;
  Canvas.MoveTo(x1,y1);
  Canvas.LineTo(x2,y2);
 exit;
 end;
тоже цвет на красный из стандартного черного меняться не будет?
Ответить с цитированием
  #12  
Старый 07.07.2010, 02:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
Canvas.Pen.Color:=clred;

И убери, наконец, ненужные exit'ы...
Ответить с цитированием
  #13  
Старый 07.07.2010, 20:25
Pigmalion Pigmalion вне форума
Прохожий
 
Регистрация: 01.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

Вот еще вопрос.
Эта процедура рисует прямоугольник,изменяющий цвет прои щелчке, с текстом(спасибо lmikle - упростил)

Код:
procedure CreateBlock(Canvas:TCanvas;x,y,z,x1,y1,x2,y2:integer;
 var Pr:boolean;s:string);
begin
  if Pr
    then Canvas.Brush.Color:=clgreen
    else Canvas.Brush.Color:=clred;
  Canvas.rectangle(x1,y1,x2,y2);
  Canvas.Font.Size:=z;
  Canvas.Font.Color:=clBlack;
  Canvas.TextOut(x,y,s);
  Pr:= not Pr;
end;,

а эта должна изменять цвет линии при щелчке на двух прямоугольниках,которые она соединяет:

Код:
procedure PaintLine(Canvas:Tcanvas;x1,y1,x2,y2:integer;
var Pr1,Pr2,Pr3:Boolean);
begin
 if  not Pr1 and not Pr2 then
  Pr3:=true;
   if Pr3 then
    Canvas.Pen.Color:=clgreen
    else Canvas.Pen.Color:=clred;
     Canvas.Pen.Width:=5;
     Canvas.MoveTo(x1,y1);
     Canvas.LineTo(x2,y2);
     Pr1:= Pr1;
     Pr2:= Pr2;
     Pr3:=not Pr3;
  end;

Но не изменяет, а если перенести Pr:= not Pr; во вторую(как я думал из-за этого первая перекрывает данные второй процедуры),то тоже ничего не выходит.
Ответить с цитированием
  #14  
Старый 09.07.2010, 22:34
Pigmalion Pigmalion вне форума
Прохожий
 
Регистрация: 01.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

Всё, не надо.Нашёл ошибку.
Ответить с цитированием
  #15  
Старый 09.07.2010, 22:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Мда... ну потизхоньку учишься
Теперь почисти код своей процедуры от явного бреда и будет уже совсем неплохо...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:33.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025