Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2012, 16:58   #1
mutb
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 10
Лампочка Bitbtn в две строчки

Так как толкового ответа не нашёл, а все посылают делать панели, пришлось заморачиваться пробовать и тестировать. Но наткнулся на один косяк и не могу разобраться.
У меня есть база, делфи её читает и создаёт динамические BitBtn.
Вот часть кода:
Код:
 var
 b: TBitBtn;     
  R : TRect;  
  Buff : array[0..255] of Char;
Код:
   ...
   b:=TBitBtn.Create(Self);
   b.Parent:=Self;
   b.Top:=380;  
   b.Height:=69;  
   b.Width:=95;   
   b.Tag:=Form1.ADOQuery1.Recordset.Fields[0].Value;  
   b.Caption:=Form1.ADOQuery1.Recordset.Fields[1].Value; 
   b.OnClick:=Form1.proba; 
                         //для переноса названия
   if  b.Caption <> '' then
         begin
          b.Glyph.Canvas.Font := Self.Font;
          b.Glyph.Width  := b.Width - 1;
          b.Glyph.Height := b.Height - 1;
          R := Bounds(0, 0, b.Glyph.Width, 0);
          StrPCopy(Buff, b.Caption);
          b.Caption := '';
          DrawText(b.Glyph.Canvas.Handle,Buff,StrLen(Buff),R,
           DT_CENTER or DT_WORDBREAK or DT_CALCRECT);
          OffsetRect(R,(b.Glyph.Width - R.Right) div 2,
          (b.Glyph.Height - R.Bottom) div 2);
           DrawText(b.Glyph.Canvas.Handle,Buff,StrLen(Buff),R,
           DT_CENTER or DT_WORDBREAK);
          end;

           b.Show;
           Form1.ADOQuery1.Recordset.MoveNext; 
          end;
          ...
Все создается отлично и названия кнопок переносится на несколько строк, но вот если я уничтожаю все кноки через free во время работы программы и потом запускаю процедуру создания заново. То у кнопок отсутствуют названия. То есть кнопки создаются, но чистые. Может надо какой-то из параметров обнулить? Просьба помочь

Последний раз редактировалось mutb; 15.08.2012 в 17:07.
mutb вне форума Ответить с цитированием
Старый 15.08.2012, 22:23   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Не проще ли вставлять символы CRLF (#13#13) в нужное место Caption?
Как это можно делать в design-time.

Хотя, вот такой эксперимент привел к тому что надпись на кнопке появляется каждый раз:
Код:
  S : string;
...
  b := TBitBtn.Create(Self);
  b.Parent:=Self;
  b.Top:=10;
  b.Left := 10;
  b.Height:=69;
  b.Width:=95;
  b.Tag:=Form1.ADOQuery1.Recordset.Fields[0].Value;
  S := Form1.ADOQuery1.Recordset.Fields[1].Value;

  if S <> '' then begin
    b.Glyph.Canvas.Font := Self.Font;
    b.Glyph.Width := b.Width-4;
    b.Glyph.Height := b.Height-4;
    R := Bounds(0, 0, 10, 0);
    DrawText(b.Glyph.Canvas.Handle, PChar(S) ,-1, R,
                     DT_CENTER or DT_WORDBREAK or DT_CALCRECT);
    OffsetRect(R,(b.Width - R.Right) div 2, (b.Height - R.Bottom) div 2);
    DrawText(b.Glyph.Canvas.Handle, PChar(S) ,-1 , R, DT_CENTER or DT_WORDBREAK);
  end;

Последний раз редактировалось Скандербег; 15.08.2012 в 23:25.
Скандербег вне форума Ответить с цитированием
Старый 16.08.2012, 01:50   #3
mutb
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 10
По умолчанию

Но если не использовать caption, тогда в какой переменной хранится текущее имя кнопки. И как его вытащить?
Код:
nameknopka:= TBitBtn(Sender).Caption;
А теперь?
mutb вне форума Ответить с цитированием
Старый 16.08.2012, 02:29   #4
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

mutb, у тебя Дельфи какая? Начиная с 7-ой у TBitBtn есть WordWrap:
Изображения
Тип файла: jpg bitbtn.jpg (39.9 Кб, 133 просмотров)
volvo877 вне форума Ответить с цитированием
Старый 16.08.2012, 07:44   #5
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

К сожалению, имея на борту свойство WordWrap, семерка, в коей у автора развернут проект, еще не умеет переносить по словам.
Для хранения надписи можно воспользоваться стандартным приемом "перегрузки" класса:
Код:
type
  TBitBtn = class(Buttons.TBitBtn)
  public
    Text : string;
  end;
...
     b.Text := Form1.ADOQuery1.Recordset.Fields[1].Value;

    if b.Text <> '' then begin
      b.Glyph.Canvas.Font := Self.Font;
      b.Glyph.Width := b.Width-4;
      b.Glyph.Height := b.Height-4;
      R := Bounds(0, 0, 10, 0);
      DrawText(b.Glyph.Canvas.Handle, PChar(b.Text) ,-1, R,
                      DT_CENTER or DT_WORDBREAK or DT_CALCRECT);
      OffsetRect(R, (b.Width - R.Right) div 2, (b.Height - R.Bottom) div 2);
      DrawText(b.Glyph.Canvas.Handle, PChar(b.Text) ,-1 , R, DT_CENTER or DT_WORDBREAK);
    end;
Проверено на D7 - работает как задумано.
С другой стороны, надпись кнопки приходит из БД, о чем говорит эта строка:
Код:
b.Caption:=Form1.ADOQuery1.Recordset.Fields[1].Value;
и, тогда, кто мешает каждый раз при создании кнопки вытаскивать надпись из БД? Для чего-то она там храниться?

Последний раз редактировалось Скандербег; 16.08.2012 в 07:51.
Скандербег вне форума Ответить с цитированием
Старый 16.08.2012, 12:43   #6
mutb
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 10
По умолчанию

Цитата:
К сожалению, имея на борту свойство WordWrap, семерка, в коей у автора развернут проект, еще не умеет переносить по словам.
Это точно, свойство есть а эффекта 0.
Скандербег - сделал как ты написал:
Код:
type
    TBitBtn = class(Buttons.TBitBtn);
    TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    ...
Код:
 public
    { Public declarations }
      matirka:integer;
      text:string;
Код:
 b.Text:=Form1.ADOQuery1.Recordset.Fields[1].Value;
           if b.Text <> '' then
             begin
                 b.Glyph.Canvas.Font := Self.Font;
                 b.Glyph.Width := b.Width-4;
                 b.Glyph.Height := b.Height-4;
                 R := Bounds(0, 0, 10, 0);
                 DrawText(b.Glyph.Canvas.Handle, PChar(b.Text) ,-1, R,
                 DT_CENTER or DT_WORDBREAK or DT_CALCRECT);
                 OffsetRect(R,(b.Width - R.Right) div 2, (b.Height - R.Bottom) div 2);
                 DrawText(b.Glyph.Canvas.Handle, PChar(b.Text) ,-1 , R, DT_CENTER or DT_WORDBREAK);
             end;
Но все работает не совсем так, b.text добавляет в надпись кнопки ещё названия и она начинает плыть(название кнопки). Если в конце кода её обнулить (b.text) - то всё нормально. Но ведь хотелось чтобы она сохранила название

Последний раз редактировалось mutb; 16.08.2012 в 12:52.
mutb вне форума Ответить с цитированием
Старый 16.08.2012, 12:54   #7
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Цитата:
сделал как ты написал:
Вижу что не так, однако.
К какому классу относится поле "Text"? К кнопке ли?
К тому же, поле "Text" есть в далеком предке кнопки и чтобы не путались эти наименования назовите это поле как-нибудь по-другому. Хотя, если сделать точно так как показано в моем посте на кнопке будет только текст надписи. Кстати, что за "названия добавляются в надпись кнопки"?
А можно еще и проект скинуть чтобы было понятно в чем беда. На фрагментах кода не всегда ясно что к чему.

Последний раз редактировалось Скандербег; 16.08.2012 в 12:56.
Скандербег вне форума Ответить с цитированием
Старый 16.08.2012, 13:13   #8
mutb
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 10
По умолчанию

Скандербег не пойму что не так. Вроде всё как ты сказал сделал. В начале программы новый тип добавил. Объявил новую переменную (правда не понял зачем, ведь у button есть свойство текст), но всё плывёт.
Пожалуйста укажи на ошибки.

Цитата:
А можно еще и проект скинуть чтобы было понятно в чем беда. На фрагментах кода не всегда ясно что к чему.
Проект большой не хотелось бы кидать. В базе хранятся названия товаров их свойства. При запуске программы создаются кнопки из базы (которые отображают товар и группы). При нажатии на кнопку (если это группа, то старые кнопки уничтожаются, открываются новые). Если при нажатии это товар, то он добавляется в список продажи. Это я уже всё реализовал, но вот с названиями встал в ступор.
mutb вне форума Ответить с цитированием
Старый 16.08.2012, 13:31   #9
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Хорошо, даю свой пример, в котором кнопка ведет себя прилично.
Вложения
Тип файла: zip project.zip (204.4 Кб, 21 просмотров)
Скандербег вне форума Ответить с цитированием
Старый 16.08.2012, 13:46   #10
mutb
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 10
Хорошо

Скандербег очень благодарен - большое спасибо
разобрался.
mutb вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строчки в паскаль dimaua2 Помощь студентам 5 27.04.2012 17:52
программы на одну две строчки pyls Помощь студентам 0 22.05.2011 18:49
Не понимаю две строчки в коде по сумме ряда. idmessage Паскаль, Turbo Pascal, PascalABC.NET 5 10.01.2011 18:28
скрыть строчки peq Microsoft Office Excel 2 23.11.2009 20:15
сравнить 2 строчки oLMeR Общие вопросы Delphi 3 02.11.2007 11:51