Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1105607387
Yurisimus
2005-01-13 12:09
2005.02.13
Посоветуйте хороший DBGrid


14-1106739159
ПЛОВ
2005-01-26 14:32
2005.02.13
Чем открыть *.LDF и *.MDF


3-1105162091
va
2005-01-08 08:28
2005.02.13
БД - IntraWeb


3-1105514080
Scorpio
2005-01-12 10:14
2005.02.13
Как соединить 2 таблицы ч/з ADO


1-1107088550
ТехникПТО
2005-01-30 15:35
2005.02.13
Еще один маленький не сложный вопрос





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский