Текущий архив: 2002.12.09;
Скачать: CL | DM;
Вниз---|Ветка была без названия|--- Найти похожие ветки
← →
Юрий К (2002-11-18 23:15) [0]Уважаемые мастера!
На форуме озвучивали идею "разбора полетов" начинающих программистов. Рискнул выложить свой первый блин...
http://delphi.mastak.ru/cgi-bin/download.pl?get=1037649842&n=0
Может быть мой код слишком приметивен для этого, но чтобы научиться писать более сложные вещи, нужно сначала научиться писать ГРАМОТНО. За основу взят пример из FAQ ( к сожалению не сохранил имени автора )."как вывести текст под углом", механизм работы которого так, до конца и не понял. О trutype шрифтах знаю только лишь, что каждая буква описывается
формулой и это позволяет маштабировать шрифт. ИМХО я не думаю, что эта тема требует досконального изучения, но и не хочется быть обезъяной, бездумно повтаряющей чужой код. Может кто-то подскажет источник, доступный для понимания начинающих где описаны другие свойства шрифтов.
Руководствуясь принципом "лучший компонент - написанный собственно ручно" дописал стандартному TLabel одно единственное свойство Rotate - поворот на произвольный угол. Корректно ли я это сделал? ЗЫ: Доступ в InterNet катострофически ограничен, прошу пишите на EMаli... С уважением Константинов Юрий.
← →
Jeer (2002-11-18 23:28) [1]<научиться писать ГРАМОТНО>
слишком приметивен
<О trutype шрифтах>
True
<написанный собственно ручно">
собственноручно
← →
Jeer (2002-11-18 23:41) [2]Хороший учебник родного (русского) языка + свои мозги + немного чужого опыта + Вера в свои силы + Воля = ..
С надеждой на оправдание уважения..
← →
Игорь Шевченко (2002-11-19 10:31) [3]По теме:
unit RotateLabel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, WinTypes, WinProcs;
type
TRotateLabel = class(TLabel)
private
{ Private declarations }
FRotate:real;
procedure SetRotate(Value:real);
protected
{ Protected declarations }
procedure Paint; override;
public
{ Public declarations }
published
{ Published declarations }
property Rotate:real read FRotate write SetRotate;
end;
procedure Register;
procedure CanvasSetAngle(C: TCanvas; A: Single);
implementation
procedure Register;
begin
RegisterComponents("Samples", [TRotateLabel]);
end;
//Из FAQ ( к сожалению не сохранил имени автора)
procedure CanvasSetAngle(C: TCanvas; A: Single);
var
LogRec: TLOGFONT; {Font informationen}
begin
GetObject(C.Font.Handle,SizeOf(LogRec),Addr(LogRec));
LogRec.lfEscapement := Trunc(A*10);
C.Font.Handle := CreateFontIndirect(LogRec);
end;
// Установка значения 0 <= FRotate < 360
procedure TRotateLabel.SetRotate(Value: real);
begin
if FRotate <> Value then
begin
if Value >= 0
then FRotate := Value - Trunc( Value / 360 ) * 360
else FRotate := 360 + Value + Trunc( Value / 360 ) * 360;
Invalidate;
end;
end;
//Перерисовка TRotateLabel
procedure TRotateLabel.Paint;
//Координаты вывода текста
var x,y:integer;
//Высота и ширина текста без учета угла поворота
wtext,htext:integer;
//Высота и ширина области вывода текста
wBlock,hBlock:integer;
//Координаты вывода области текста
BlockPoint:TPoint;
begin
with Canvas do
begin
//Определение ширины и высоты текста
wtext:=TextWidth(caption);
htext:=TextHeight(caption);
//определение высоты и ширины области вывода текста
wBlock:=Trunc(ABS(wtext*cos(Pi*Rotate/180))+ABS(htext*sin(Pi*Rotate/180)));
hBlock:=Trunc(ABS(wtext*sin(Pi*Rotate/180))+ABS(htext*cos(Pi*Rotate/180)));
BlockPoint.x:=0;
BlockPoint.y:=0;
//Проверка условий выравнивания текста
if AutoSize then
begin
width:=wBlock;
height:=hBlock;
end
else
begin
//Выравнивание по вертикали
case Layout of
tlCenter: BlockPoint.y:=(height-hBlock)div 2;
tlBottom: BlockPoint.y:=height-hBlock;
end;
//Выравнивание по горизонтали
case Alignment of
taCenter: BlockPoint.x:=(width-wBlock)div 2;
taRightJustify: BlockPoint.x:=width-wBlock;
end;
end;
//Расчет координат вывода текста
if Rotate<=90 then
begin
x:=BlockPoint.x;
y:=BlockPoint.y+Trunc(wtext*sin(Pi*Rotate/180));
end
else if Rotate<=180 then
begin
x:=BlockPoint.x+ABS(Trunc(wtext*cos(Pi*Rotate/180)));
y:=BlockPoint.y+hBlock;
end
else if Rotate<=270 then
begin
x:=BlockPoint.x+wBlock;
y:=BlockPoint.y+hBlock-ABS(Trunc(wtext*sin(Pi*Rotate/180)));
end
else
begin
x:=BlockPoint.x+wBlock-Trunc(wtext*cos(Pi*Rotate/180));
y:=BlockPoint.y;
end;
//Вывод текста на Canvas
Canvas.Font:=Self.Font;
Brush.Color:=Self.Color;
Pen.Color:=Self.Color;
Rectangle(0,0,width,height);
CanvasSetAngle(Canvas, FRotate);
Canvas.TextOut(x, y, Caption);
end;
end;
end.
1. Радует наличие комментариев.
2. Не радует их немногочисленность и немногословность.
3. Код не анализировал :-)
С уважением,
← →
Anatoly Podgoretsky (2002-11-19 10:43) [4]Отсутствует обработка на ошибки, например GetObject(C.Font.Handle,SizeOf(LogRec),Addr(LogRec));
По оформлению: Должны выбрасывать не нудные комментарии и пустые секции в описании класса
TRotateLabel = class(TLabel)
private
FRotate:real;
procedure SetRotate(Value: Real);
protected
procedure Paint; override;
published
property Rotate: Real read FRotate write SetRotate;
end;
← →
Юрий К (2002-11-19 17:33) [5]<Jeer © (18.11.02 23:28)>
извините за описки, спешил...
<Игорь Шевченко © (19.11.02 10:31)
1. Радует наличие комментариев.
2. Не радует их немногочисленность и немногословность.>
<Anatoly Podgoretsky © (19.11.02 10:43)
Должны выбрасывать не нудные комментарии... >
Как быть? Предлагаю: в коде ставить сноски ( как в книге ) и в конце подробно описывать, что и как хотел сделать, дабы не отвлекать более сведующих на чтение не интересных им комментариев
<Anatoly Podgoretsky © (19.11.02 10:43)
Отсутствует обработка на ошибки, например GetObject...>
Именно это я в первую очередь и хотел бы услышать! Где и какие могут возникнуть исключения и как избежать их возникновения...
Ставлю себе первую галочку: "ВСЕГДА проверять подобные функции на <> nil". Еще очень интересуют темы: "утечка памяти", "совместимость с другими ОС", и еще "это ... будет работать быстрее" и т.п.
Страницы: 1 вся ветка
Текущий архив: 2002.12.09;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.008 c