Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Длина текста через 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.03 c
1-1107244877
cad2206
2005-02-01 11:01
2005.02.13
Нормальный вид формы при обработке??!!


1-1106831301
qwe
2005-01-27 16:08
2005.02.13
инсталяция


1-1107121682
haM3r
2005-01-31 00:48
2005.02.13
TRichEdit проблема со сменой цвета текста


1-1106837691
novice_man
2005-01-27 17:54
2005.02.13
Динамическая библиотека и указатель.


14-1106675558
Ломброзо
2005-01-25 20:52
2005.02.13
Электрические библиотеки