![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток всем. Подскажите,я эту процедуру:
Код:
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
|
||||
|
||||
|
Canvas:TCanvas; не инициализирована.
|
|
#3
|
||||
|
||||
|
Код:
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
|
|||
|
|||
|
Цитата:
Цитата:
|
|
#5
|
|||
|
|||
|
у тебя 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
|
|||
|
|||
|
Благодарю,lmikle.Вроде работает.
|
|
#7
|
|||
|
|||
|
А вот ещё:
Код:
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
|
|||
|
|||
|
угу... перед 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
|
|||
|
|||
|
Угу..вы тоже когда-то так писали.Благодарю ещё раз.Не понимаю только почему это так повлияло?Всё заработало.
|
|
#10
|
|||
|
|||
|
Ну, я так не писал никогда. У меня были хорошие учителя, кторые сразу отучили меня от писания " в лоб".
Весь фокус в var. Дело в том, что если не указан var, то сколько ты не меняй значение переменной, снаружи процедуры оно не изменеися. Почитай о передаче параметров в функции по значению и по ссылке. Фактически var - это указание передавать значение по ссылке. |
|
#11
|
|||
|
|||
|
Цитата:
Код:
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
|
|||
|
|||
|
Код:
Canvas.Pen.Color:=clred; И убери, наконец, ненужные exit'ы... |
|
#13
|
|||
|
|||
|
Вот еще вопрос.
Эта процедура рисует прямоугольник,изменяющий цвет прои щелчке, с текстом(спасибо 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
|
|||
|
|||
|
Всё, не надо.Нашёл ошибку.
|
|
#15
|
|||
|
|||
|
Мда... ну потизхоньку учишься
![]() Теперь почисти код своей процедуры от явного бреда и будет уже совсем неплохо... |