Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];

Вниз

---|Ветка была без названия|---   Найти похожие ветки 

 
Юрий К   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
4-28368
Axis_of_Evil
2002-10-28 09:37
2002.12.09
Памагитя!


8-28154
()utLaw
2002-08-23 00:23
2002.12.09
Как прочитать картинки JPG и TIFF (нужен компонент)


3-27840
cutter-pro
2002-11-20 17:40
2002.12.09
Каскадное удаление в Paradox


14-28296
teebot
2002-11-11 10:51
2002.12.09
Посоветуйте беcплатный хостинг с поддержкой CGI.


1-28096
KidMan
2002-11-27 17:02
2002.12.09
Горю! Сдавать программу через 2 дня! :((





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский