Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Динамическое создание объекта


Автор: EDuard 7.1.2006, 13:02
Всем привет!
На форме есть Panel1:Tpanel инамически создаю на ней check:Tcheckbox, После этого нужно создать на объекте check labelq:Tlabel. Но дельфи не дает установить ее родителем check. Как можно решить эту проблему?

Автор: Albinos_x 7.1.2006, 13:24
Цитата

После этого нужно создать на объекте check labelq:Tlabel

у Tcheckbox есть свой лабел... непонятно зачем тогда ещё лабел тебе нужен у Tcheckbox...
PS: поставь родителем Panel1:Tpanel

Автор: EDuard 7.1.2006, 13:42
Albinos_x, хотца smile .
Цитата(Albinos_x @ 7.1.2006, 13:24 Найти цитируемый пост)

PS: поставь родителем Panel1:Tpanel

Тогда labelq вылазит на panel1;

Автор: FRAGNATIC 7.1.2006, 14:18
Цитата(EDuard @ 7.1.2006, 13:42 Найти цитируемый пост)

Тогда labelq вылазит на panel1;

а где ей ещё вылазить =)
может координаты просто сменить чтобы казалось что она чекбоксу пренадлежит (на чекбокс наложить)

Автор: EDuard 7.1.2006, 14:31
FRAGNATIC, нет она по любому под check получается.

Автор: sexton 7.1.2006, 14:44
Рисуй ручками Label поверх Checkbox через Canvas или просто юзай Checkbox.Caption smile

Автор: EDuard 7.1.2006, 14:50
sexton, можно подробнее

Автор: FRAGNATIC 7.1.2006, 14:56
EDuard
CheckBox1.Canvas.TextOut();
ну и там ещё много всяких извращений можно с текстом и просто ещё рисовать)

Автор: EDuard 7.1.2006, 15:33
FRAGNATIC, + у стандартного checkbox'а нет канвы.

Автор: FRAGNATIC 7.1.2006, 15:40
EDuard
не знал=) не смотрел а так сразу
ну тогда на канве Panel рисуй =)
Добавлено @ 15:37
и всётаки чем Caption чекбокса не устраивает?
Добавлено @ 15:40
Код

var
  canva: Tcanvas;
begin
  canva:=TCanvas.Create;
  canva.Handle:=GetDC(CheckBox1.Handle);
  canva.TextOut(0,0,'lol');
end;

теперь есть канва)
не забываем тока освобождать всё)

Автор: Albinos_x 7.1.2006, 15:46
Цитата(EDuard @ 7.1.2006, 13:42 Найти цитируемый пост)

Тогда labelq вылазит на panel1;

хочешь внутри квадратика писать ?

Автор: EDuard 7.1.2006, 16:08
Albinos_x, по сути проблема в том, что если у checkbox'а wordwrap=true; тогда если высота чекбокса больше чем высота текста(всего с учетом wordwrap) текст центрируется по высоте, мне нужно что бы текст выводился с верху без центрирования, поэтому хотел создать на чекбоксе лейбл. Если создаю на чекбоксе канву, то не могу вывести текст с переносом. так что пока все без результатно.
Может как-нибудь подругому можно вывести текст на чекбокс без центрирования по высоте?

Автор: Демо 7.1.2006, 19:01
Цитата(EDuard @ 7.1.2006, 17:08 Найти цитируемый пост)

Если создаю на чекбоксе канву, то не могу вывести текст с переносом.


Ну кроме TextOut есть еще и DrawText, который позволяет делать перенос.

Автор: EDuard 7.1.2006, 19:31
Демо, можно примерчик? smile

Автор: Albinos_x 7.1.2006, 21:29
пишешь canva.DrawText(
наводишь мышку и тебе показываются параметры...

Автор: EDuard 7.1.2006, 22:31
Albinos_x у канвы нет Drawtext'а, ф-ия содержиться в модуле windows.
С мышкой все понятно, вот только не прорисовывается текст.

Автор: Albinos_x 7.1.2006, 22:43
Цитата(EDuard @ 7.1.2006, 22:31 Найти цитируемый пост)

Albinos_x у канвы нет Drawtext'а, ф-ия содержиться в модуле windows.
С мышкой все понятно, вот только не прорисовывается текст.

ну да... там первый параметр нужно передать Хандле твоего канваса, второй строку, потом (наверно) количество строк, размеры надписи в параметре TRect, и последний формат текста (Cardinal)

Автор: Демо 8.1.2006, 04:32
DrawTExt надо использовать апишный.

Код

int DrawText(
  HDC hDC,          // handle to DC
  LPCTSTR lpString, // text to draw
  int nCount,       // text length
  LPRECT lpRect,    // formatting dimensions
  UINT uFormat      // text-drawing options
);



В параметре uFormat использовать значение DT_WORDBREAK...
Добавлено @ 04:36
А пример...
Ну вот такой пусть будет:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
    R: TRect;
    s: String;
begin
    R.Left := 0;
    R.Top := 0;
    R.Right := 50;
    R.Bottom := 150;
    s := 'У попа была cобака, он ее любил';
    DrawText(
        Form1.Canvas.Handle,
        PChar(s),
        Length(s),
        R,
        DT_WORDBREAK);
end;


Автор: Albinos_x 8.1.2006, 05:04
Цитата(Демо)
Length(s)

Цитата(Albinos_x @ 7.1.2006, 22:43 Найти цитируемый пост)
потом (наверно) количество строк

значит я всё таки ошибся, енто длина текста...
Цитата(Демо @ 8.1.2006, 04:32 Найти цитируемый пост)
DrawTExt надо использовать апишный.

енто тот же самый про который мы говорили...судя по данному тобой описанию

Автор: EDuard 8.1.2006, 13:09
Все понял, после создания у чекбокса пришлось еще написать refresh, ато нехотел показывать ни в какую че он там пишет.
Демо, а можно еще задать шрифт и его размер?

Автор: Albinos_x 8.1.2006, 13:44
Цитата(EDuard @ 8.1.2006, 13:09 Найти цитируемый пост)

а можно еще задать шрифт и его размер?

попробуй перед рисованием на канве:
Код

Form1.Canvas.Font.Name:='Arial';

Автор: FRAGNATIC 8.1.2006, 17:02
Цитата(EDuard @ 8.1.2006, 13:09 Найти цитируемый пост)

Демо, а можно еще задать шрифт и его размер?

вот писал когда-то
Код

procedure draw;
var
  r: TRect;
  DC: HDC;
  LogFont : TLogFont;
  GDIOBJ : HGDIOBJ;
begin
 DC:=GetDc(0);

 SetTextColor(dc,RGB(0,0,0));

 LogFont.lfItalic:=0;
 LogFont.lfUnderline:=1;
 LogFont.lfStrikeOut:=0;
 LogFont.lfWidth:=50;
 logFont.lfEscapement:=0;
 LogFont.lfHeight:=100;
 LogFont.lfOutPrecision:=OUT_TT_ONLY_PRECIS ;
 LogFont.lfClipPrecision:=CLIP_DEFAULT_PRECIS;
 LogFont.lfQuality:=ANTIALIASED_QUALITY;

 GDIOBJ:= CreateFontIndirect(LogFont);
 SelectObject(dc, GDIOBJ);

 r.Left := 200;
 r.Top := 200;
 r.Right := 800;
 r.Bottom := 800;
 DrawText(dc,'!!! texttt !!!',14,r, DT_NOCLIP or  DT_WORDBREAK);
 DeleteObject(GDIOBJ);
 ReleaseDC(0,dc);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)