Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

CheckBox в RichEdit

3.2K
19 августа 2008 года
Гудвин
186 / / 22.12.2007
Здравствуйте уважаемые программисты, у меня к вам немного необычная задачка. Собственно как реализовать подобное: идет множество абзацев со своим форматированием и т. п. и в начале каждого абзаца стоит чекбокс с галочкой, чтоб был массив с хранением выбранных абзацев и отлавливалось событие нажатия на тот или иной чекбокс? :rolleyes::confused:
303
19 августа 2008 года
makbeth
1.0K / / 25.11.2004
Я бы поместил слева от RichEdit'а панель, на которой бы рисовал все нужные чекбоксы (типа как панель в редакторе Delphi, на котором отмечаются номера строк, брейкпоинты, закладки, и т.д.).
3.2K
19 августа 2008 года
Гудвин
186 / / 22.12.2007
я так понимаю для этого нужно знать где заканчивается абзац в richedit, и отлавливать событие его прокрутки. что-то ни то ни другое как сделать я пока не нашел. :confused:
тут пока искал другая мысль пришла, будет ли проще сделать так: динамически создавать панельки где стоит checkbox с align=alLeft и также динамически созданный richedit с align=alClient, и для каждого абзаца по одной такой панельке помещенных в один ScrollBox?
3.2K
20 августа 2008 года
Гудвин
186 / / 22.12.2007
Как отловить событие прокрутки ползунком таких компонентов как DrawGrid, RichEdit ListBox и т. д. ? возможно этот вопрос уже задавали, но я что-то ничего не нашел.
14
20 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: Гудвин
.. и также динамически созданный richedit с align=alClient, и для каждого абзаца по одной такой панельке помещенных в один ScrollBox?



Кушать будет много.. А что в итоге-то это будет, можно поинтересоваться? В смысле, для чего, может еще какое решение подойдет, (например VirtualTreeView :))?

Цитата: Гудвин
Как отловить событие прокрутки ползунком таких компонентов как DrawGrid, RichEdit ListBox и т. д. ?



Или создать потомка, или подменить оконную процедуру, после чего отлавливать WM_VSCROLL.

Кстати RichEdit долен поддерживать OLE-объекты, можно свой чекбокс ActiveX-ом сделать попробовать..

3.2K
20 августа 2008 года
Гудвин
186 / / 22.12.2007
это типа библиотечный склад, после поиска по базе выводится инфа о найденных книгах (в несколько строк с разным форматированием, типа автор, год издания и т. д.), из найденного пользователь выбирает несколько и далее работает с выбранной кучей.

virtualtreeview не юзал, спасибо, канить на досуге посмотрю
с OLE RichEdit'a изнутри работать вообще ни разу не пробовал :rolleyes:

щас сделал с динамическими панелями, немножко ресурсозатратно но хоть так.
вот только не могу вспомнить как отключить прорисовку компонентов на время пока они в цикле создаются? :confused:
3.2K
20 августа 2008 года
Гудвин
186 / / 22.12.2007
а вот собственно и страшный функций добавления такой панели:
Код:
TFinded=record
    Panel:TPanel;
    Text:TRichEdit;
    check:TCheckBox;
    id:integer;
  end;
 ...
    ff:array [0..9999] of TFinded;
    ffcount:integer;
 ...
procedure TFormMain.addfinded(txt,quote:string;id:integer);
 var color:TColor;s:string;
begin
  color:=$00F5F7F8;
  ff[ffcount].id:=id;
  with ff[ffcount] do
    begin
      Panel:=TPanel.Create(ScrollBox1);
      Panel.Parent:=ScrollBox1;      
      Panel.Align:=alTop;
      Panel.BorderStyle:=bsNone;
      Panel.BevelOuter:=bvNone;
      Panel.Color:=color;
      Panel.Tag:=ffcount;
      check:=TCheckBox.Create(ff[ffcount].Panel);
      check.Parent:=ff[ffcount].Panel;
      check.Constraints.MaxHeight:=21;
      check.Constraints.MaxWidth:=21;
      check.AlignWithMargins:=true;
      check.Margins.Left:=4;
      check.Margins.Top:=2;
      check.Margins.Bottom:=0;
      check.Margins.Right:=0;
      check.Align:=alLeft;
      check.Checked:=false;
      check.Color:=color;
      check.Tag:=ffcount;
      Text:=TRichEdit.Create(ff[ffcount].Panel);
      Text.Parent:=ff[ffcount].Panel;
      Text.Align:=alClient;
      Text.BorderStyle:=bsNone;
      Text.Paragraph.FirstIndent:=8;
      Text.Paragraph.RightIndent:=8;
      Text.Color:=color;
      s:=txt;
      Text.Lines.Clear;
      Text.Lines.Add(s);
      Text.SelStart:=length(Text.Text)-length(s)-2;
      Text.SelLength:=length(s);
      Text.SelAttributes.Style:=[fsBold];
      Text.SelLength:=0;
      s:='Описание: '+QUOTE;
      Text.Lines.Add(s);
      Text.SelStart:=length(Text.Text)-length(s)-2;
      Text.SelLength:=length('Описание:');
      Text.SelAttributes.Color:=clGray;
      Text.SelLength:=0;
      Text.ReadOnly:=true;
      Text.HideSelection:=true;
      text.Tag:=ffcount;
      text.WordWrap:=false;
      panel.Height:=text.Font.Size*(text.Lines.Count+2);
    end;
  inc(ffcount);
end;


сюда хочу какнибудь ещё onClick добавить, чтоб активный panel другим цветом выделялся.
11
20 августа 2008 года
oxotnik333
2.9K / / 03.08.2007
эээ... а нельзя было это в StringGrid-е сделать?
3.2K
20 августа 2008 года
Гудвин
186 / / 22.12.2007
а как?
11
21 августа 2008 года
oxotnik333
2.9K / / 03.08.2007
вот так я делал кнопки в Билдере на OnSelectCell:
 
Код:
if (button) delete button;
    button = new TButton(this);
    button->Visible = true;
    button->Caption = "...";
    button->Parent = StringGrid1;
    TRect rect = StringGrid1->CellRect(ACol, ARow);
    rect.Left = rect.right - (rect.Bottom - rect.Top);
    if (ACol == 0)button->OnMouseDown = Button1MouseDown;
    else button->OnMouseDown = Button2MouseDown;
    button->BoundsRect = rect;

в соседних ячейках (где будет форматированный текст) таким же макаром поместить RichEdit или посмотреть может можно будет каждой ячейке свой формат задать.
14
21 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Да в принципе чекбоксы в StringGrid-е не так сложно и самому рисовать по OnDrawCell и выставлять по OnClick, если, конечно, стандартного вида достаточно (который DrawFrameControl()). А вот с RichEdit такое не прокатит.. Вообще мое, имхо, мнение - нужно иметь лишь один RichEdit. Ибо контрол он сложный. Кстати StringGrid тоже не легковесный, поэтому не думаю что есть в нем особый смысл, если только не заменить им RichEdit к-либо образом, но так понимаю это невозможно..

OnClick добавить просто:
Panel.OnClick := OnClickFunc; :)
303
21 августа 2008 года
makbeth
1.0K / / 25.11.2004
Между прочим, для задачи, как описал ее Гудвин, ИМХО, VirtualTreeView - самое то.
14
21 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Так может ему там редактировать чего надо, в этом-самом RichEdit-е?
А так VirtualTreeView мощная штука, тока форматирование самому рисовать придется..
Цикл прорисовки останавливается функцией LockWindowUpdate()
303
21 августа 2008 года
makbeth
1.0K / / 25.11.2004
Цитата: Phodopus
Так может ему там редактировать чего надо, в этом-самом RichEdit-е?


Не спорю, хотя зачем вот для этого:

Цитата:
это типа библиотечный склад, после поиска по базе выводится инфа о найденных книгах (в несколько строк с разным форматированием, типа автор, год издания и т. д.), из найденного пользователь выбирает несколько и далее работает с выбранной кучей.

использовать RichEdit? Ну не для этого он. Хозяин-барин, как грицца... :rolleyes:

3.2K
22 августа 2008 года
Гудвин
186 / / 22.12.2007
спасибо, сейчас смотрю этот компонент.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог