Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
ВнизДлина текста через Canvas Найти похожие ветки
← →
saNat © (2005-01-27 18:26) [0]Доброго времени суток (о:
Я пишу компонент-наследник 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, если у родителя её нет.
С уважением, ЕВА
← →
MBo © (2005-01-27 18:35) [1]Как это нет?????
← →
Antonn © (2005-01-27 18:37) [2]через HDC.
← →
saNat © (2005-01-27 18:37) [3]Гм-м-м... Возможно я не прав. А как обратиться?
← →
Antonn © (2005-01-27 18:39) [4]
> А как обратиться?
[2]
← →
MBo © (2005-01-27 18:44) [5]>А как обратиться?
Обыкновенно обращаться, как всегда...
Объяви как public, если есть необходимость. Но и protected будет доступно внутри модуля с компонентом.
← →
saNat © (2005-01-27 21:08) [6]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 на выделенной строке.
А где не прав?
С уважением, ЕВА
← →
Юрий Зотов © (2005-01-28 00:36) [7]> saNat © (27.01.05 21:08) [6]
> смотрел TCustomPanel+F1, но не нашел там передаваемого
> свойства Canvas.
Такие вещи надо смотреть в исходниках, а не в справке.
> Тогда "в лоб" прописал:
Ничего не надо прописывать. Уберите и используйте Canvas предка.
← →
saNat © (2005-01-28 00:48) [8]to Юрий Зотов Вопрос первый: предок мне доступен только через AOwner - как от туда достать? И второй: А если мой компонент лежит на TPanel?.
← →
GanibalLector © (2005-01-28 00:52) [9]> найдя длину текста через Canwas.TextWidth().
GetTextExtentPoint
← →
Юрий Зотов © (2005-01-28 01:11) [10]> saNat © (28.01.05 00:48) [8]
> Вопрос первый: предок мне доступен только через AOwner
Ответ первый - извините, но эта фраза совершенно четко показывает, что Вы рановато взялись писать собственный компонент. И без обид, пожалуйста. Поверьте, это действительно так. Потому что невозможно написать нормальный компонент, не понимая разницы между владельцем и предком, между классом и экземпляром класса (а именно об этом и говорит Ваша фраза).
Что советую сделать - так это купить и проштудировать книжку по разработке компонентов. Сейчас практически в любом интернет-магазине (да и просто в магазинах, если Вы живете в крупном городе) без проблем можно найти две такие русскоязычные книги. Можно брать любую из них. Это книга В. Фаронова и книга М. Голованова с Е. Веселовым.
> И второй: ...
После прочтения книги второй вопрос исчезнет сам по себе. И очень многие другие вопросы тоже. Правда.
← →
saNat © (2005-01-28 01:12) [11]to GanibalLector А это чьё?
← →
saNat © (2005-01-28 01:18) [12]to Юрий Зотов Какие обиды (о: Однако делать нужно, паралленльно учимся... Пока пользуюсь разделом из Марко Канту, Тим Гуч с Джоном Ф. Лэм "Delphi Руководство разработчика"
← →
GanibalLector © (2005-01-28 01:33) [13]2 saNat © (28.01.05 01:12) [11]
Что значит чье?
Тебе была нужна длинна...я тебе ответил.Что не понятно?
← →
saNat © (2005-01-28 02:11) [14]to GanibalLector Просто забыл нажать F1. Уже исправился. Я правильно понял работу функции: парметрами ставим Handle области вывода текста, указатель на первый элемент строки, количество символов и структуру типа
SIZE, в которую сохраняются длина и ширина текста. В случае успеха возвращается ненулевое значение. Всё так?
← →
GanibalLector © (2005-01-28 02:30) [15]Ну,смотри.Измеряем длинну,ширину текста в панели.
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 03:52) [16]Блин, тогда я ломился в одни ворота. Можно использовать тот же самый 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". А может просто спать пора (о;
С уважением, еВА
← →
saNat © (2005-01-28 03:55) [17]Есть жуткое желание сделать свойство Canvas и передавать туда канву из вне... Но криво это... Должно же работать
← →
saNat © (2005-01-28 03:58) [18]to Юрий Зотов Вот эта книга подойдет?
"Создание компонентов в среде Delphi. Руководство разработчика (+CD-ROM)
Михаил Голованов, Евгений Веселов"
← →
jack128 © (2005-01-28 04:20) [19]saNat © (28.01.05 3:58) [18]
to Юрий Зотов Вот эта книга подойдет? "Создание компонентов в среде Delphi. Руководство разработчика (+CD-ROM)
Михаил Голованов, Евгений Веселов"
сравни с
Юрий Зотов © (28.01.05 1:11) [10]
без проблем можно найти две такие русскоязычные книги. Можно брать любую из них. Это книга В. Фаронова и книга М. Голованова с Е. Веселовым
← →
saNat © (2005-01-28 04:54) [20](о: Ну почти 2 суток без сна... Бывает
← →
saNat © (2005-01-28 12:46) [21]saNat © (28.01.05 03:52) [16] - Так в чем я неправ?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.036 c