![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Длина текста через Canvas [D6, Win95/98, WinXP]
saNat © (2005-01-27 18:26:00)Доброго времени суток (о:
Я пишу компонент-наследник TCustomPanel. Нужно сделать "обрезание" текста, например, по длине Width, найдя длину текста через Canwas.TextWidth().
Первоначально планировал сделать так:
Procedure TValuePanel.SetValue(Text:String);
Begin
While (Canvas.TextWidth(Text)>=(fEditButton.Left-5)) Do
Text:=Copy(Text,1,Length(Text)-1);
Caption:=' '+Text;
End;
Вопрос, где можно найти Canvas, если у родителя её нет.
С уважением, ЕВА
saNat (2005-01-28 12:46:00) [1]saNat © (28.01.05 03:52) [16]- Так в чем я неправ?
saNat (2005-01-28 04:54:00) [2](о: Ну почти 2 суток без сна... Бывает
jack128 (2005-01-28 04:20:00) [3]saNat © (28.01.05 3:58) [18]
to Юрий Зотов Вот эта книга подойдет? "Создание компонентов в среде Delphi. Руководство разработчика (+CD-ROM)
Михаил Голованов, Евгений Веселов"
сравни с
Юрий Зотов © (28.01.05 1:11) [10]
без проблем можно найти две такие русскоязычные книги. Можно брать любую из них. Это книга В. Фаронова и книга М. Голованова с Е. Веселовым
saNat (2005-01-28 03:58:00) [4]to Юрий ЗотовВот эта книга подойдет?
"Создание компонентов в среде Delphi. Руководство разработчика (+CD-ROM)
Михаил Голованов, Евгений Веселов"
saNat (2005-01-28 03:55:00) [5]Есть жуткое желание сделать свойство Canvas и передавать туда канву из вне... Но криво это... Должно же работать
saNat (2005-01-28 03:52:00) [6]Блин, тогда я ломился в одни ворота. Можно использовать тот же самый Canvas.TextWidth. Но чё-то я не понимаю.
//Описание класса
TCanvasClass=Class(TCustomControl);
TButtonEvent=Procedure Of Object;
TValuePanel=Class(TCustomPanel)
Private
fEditButton:TPanel;
fButtonClick:TButtonEvent;
Protected
Function GetValue:String;
Procedure SetValue(Text:String);
Procedure DownButton(Sender:TObject; Button:TMouseButton; Shift:TShiftState; X,Y:Integer);
Procedure ClickButton(Sender:TObject);
Procedure UpButton(Sender:TObject; Button:TMouseButton; Shift:TShiftState; X,Y:Integer);
Public
Constructor Create(AOwner:TComponent); Override;
Procedure SetBounds(ALeft,ATop,AWidth,AHeight:Integer); Override;
Published
Property Value:String
Read GetValue
Write SetValue;
Property ButtonClick:TButtonEvent
Read fButtonClick
Write fButtonClick;
Property Font;
End;
//Реализация конструктора
Constructor TValuePanel.Create(AOwner:TComponent);
Begin
Inherited Create(AOwner);
Alignment:=taLeftJustify;
Height:=29;
Width:=169;
BevelInner:=bvSpace;
BevelOuter:=bvLowered;
fEditButton:=TPanel.Create(Self);
fEditButton.Parent:=Self;
fEditButton.Top:=0;
fEditButton.Height:=Height;
fEditButton.Width:=fEditButton.Height;
fEditButton.Left:=Width-fEditButton.Width;
fEditButton.Alignment:=taCenter;
fEditButton.BevelInner:=bvRaised;
fEditButton.BevelOuter:=bvLowered;
fEditButton.Caption:='...';
fEditButton.Font:=Font;
fEditButton.OnMouseDown:=DownButton;
fEditButton.OnClick:=ClickButton;
fEditButton.OnMouseUp:=UpButton;
Value:='';
End;
//Рализация метода записи значения свойства
Procedure TValuePanel.SetValue(Text:String);
Begin
TCanvasClass(fEditButton).Canvas.TextWidth(' ');Caption:=' '+Text;
End;
В данном случае я узнаю длину текста через Canvas fEditButton. По-моему аналогичная ситуация в сравнении с вышеуказаным примером. Выпадает на выделенной строке "Control " has no parent window". А может просто спать пора (о;
С уважением, еВА
GanibalLector (2005-01-28 02:30:00) [7]Ну,смотри.Измеряем длинну,ширину текста в панели.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TCustomControlFriend = class(TCustomControl);
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;Buffer: array[0..51] of Char;QQ:TSize;
begin
for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));
for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));
GetTextExtentPoint(TCustomControlFriend(Panel1).Canvas.Handle, Buffer, 52, QQ);
Memo1.Lines.Add(inttostr(QQ.cx));
Memo1.Lines.Add(inttostr(QQ.cy));
end;
end.
saNat (2005-01-28 02:11:00) [8]to GanibalLectorПросто забыл нажать F1. Уже исправился. Я правильно понял работу функции: парметрами ставим Handle области вывода текста, указатель на первый элемент строки, количество символов и структуру типа
SIZE, в которую сохраняются длина и ширина текста. В случае успеха возвращается ненулевое значение. Всё так?
GanibalLector (2005-01-28 01:33:00) [9]2 saNat © (28.01.05 01:12) [11]
Что значит чье?
Тебе была нужна длинна...я тебе ответил.Что не понятно?
saNat (2005-01-28 01:18:00) [10]to Юрий ЗотовКакие обиды (о: Однако делать нужно, паралленльно учимся... Пока пользуюсь разделом из Марко Канту, Тим Гуч с Джоном Ф. Лэм "Delphi Руководство разработчика"
saNat (2005-01-28 01:12:00) [11]to GanibalLectorА это чьё?
Юрий Зотов (2005-01-28 01:11:00) [12]> saNat © (28.01.05 00:48) [8]
> Вопрос первый: предок мне доступен только через AOwner
Ответ первый - извините, но эта фраза совершенно четко показывает, что Вы рановато взялись писать собственный компонент. И без обид, пожалуйста. Поверьте, это действительно так. Потому что невозможно написать нормальный компонент, не понимая разницы между владельцем и предком, между классом и экземпляром класса (а именно об этом и говорит Ваша фраза).
Что советую сделать - так это купить и проштудировать книжку по разработке компонентов. Сейчас практически в любом интернет-магазине (да и просто в магазинах, если Вы живете в крупном городе) без проблем можно найти две такие русскоязычные книги. Можно брать любую из них. Это книга В. Фаронова и книга М. Голованова с Е. Веселовым.
> И второй: ...
После прочтения книги второй вопрос исчезнет сам по себе. И очень многие другие вопросы тоже. Правда.
GanibalLector (2005-01-28 00:52:00) [13]> найдя длину текста через Canwas.TextWidth().
GetTextExtentPoint
saNat (2005-01-28 00:48:00) [14]to Юрий ЗотовВопрос первый: предок мне доступен только через AOwner - как от туда достать? И второй: А если мой компонент лежит на TPanel?.
Юрий Зотов (2005-01-28 00:36:00) [15]> saNat © (27.01.05 21:08) [6]
> смотрел TCustomPanel+F1, но не нашел там передаваемого
> свойства Canvas.
Такие вещи надо смотреть в исходниках, а не в справке.
> Тогда "в лоб" прописал:
Ничего не надо прописывать. Уберите и используйте Canvas предка.
saNat (2005-01-27 21:08:00) [16]to AntonnА что такое HDC?
to MBoЧто то я не понял.
Для начала смотрел TCustomPanel+F1, но не нашел там передаваемого свойства Canvas. Тогда "в лоб" прописал:
//Описание класса
TValuePanel=Class(TCustomPanel)
Private
...
Protected
Canvas:TCanvas;
...
Procedure SetValue(Text:String);
...
Public
Constructor Create(AOwner:TComponent); Override;
...
Published
...
Property IValue:String
Read GetValue
Write SetValue;
...
End;
//Реализация констрктора
Constructor TValuePanel.Create(AOwner:TComponent);
Begin
Inherited Create(AOwner);
Alignment:=taLeftJustify;
Height:=29;
Width:=169;
BevelInner:=bvSpace;
BevelOuter:=bvLowered;
...
IValue:='';
...
End;
//Реализация метода записи свойства
Procedure TValuePanel.SetValue(Text:String);
Begin
Canvas.TextWidth(Text);
Caption:=' '+Text;
End;
В результате при записи в поле получаю Access violation на выделенной строке.
А где не прав?
С уважением, ЕВА
MBo (2005-01-27 18:44:00) [17]>А как обратиться?
Обыкновенно обращаться, как всегда...
Объяви как public, если есть необходимость. Но и protected будет доступно внутри модуля с компонентом.
Antonn (2005-01-27 18:39:00) [18]
> А как обратиться?
[2]
saNat (2005-01-27 18:37:00) [19]Гм-м-м... Возможно я не прав. А как обратиться?
Antonn (2005-01-27 18:37:00) [20]через HDC.