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;
CheckBox в RichEdit
Здравствуйте уважаемые программисты, у меня к вам немного необычная задачка. Собственно как реализовать подобное: идет множество абзацев со своим форматированием и т. п. и в начале каждого абзаца стоит чекбокс с галочкой, чтоб был массив с хранением выбранных абзацев и отлавливалось событие нажатия на тот или иной чекбокс? :rolleyes::confused:
Я бы поместил слева от RichEdit'а панель, на которой бы рисовал все нужные чекбоксы (типа как панель в редакторе Delphi, на котором отмечаются номера строк, брейкпоинты, закладки, и т.д.).
тут пока искал другая мысль пришла, будет ли проще сделать так: динамически создавать панельки где стоит checkbox с align=alLeft и также динамически созданный richedit с align=alClient, и для каждого абзаца по одной такой панельке помещенных в один ScrollBox?
Как отловить событие прокрутки ползунком таких компонентов как DrawGrid, RichEdit ListBox и т. д. ? возможно этот вопрос уже задавали, но я что-то ничего не нашел.
Цитата: Гудвин
.. и также динамически созданный richedit с align=alClient, и для каждого абзаца по одной такой панельке помещенных в один ScrollBox?
Кушать будет много.. А что в итоге-то это будет, можно поинтересоваться? В смысле, для чего, может еще какое решение подойдет, (например VirtualTreeView :))?
Цитата: Гудвин
Как отловить событие прокрутки ползунком таких компонентов как DrawGrid, RichEdit ListBox и т. д. ?
Или создать потомка, или подменить оконную процедуру, после чего отлавливать WM_VSCROLL.
Кстати RichEdit долен поддерживать OLE-объекты, можно свой чекбокс ActiveX-ом сделать попробовать..
virtualtreeview не юзал, спасибо, канить на досуге посмотрю
с OLE RichEdit'a изнутри работать вообще ни разу не пробовал :rolleyes:
щас сделал с динамическими панелями, немножко ресурсозатратно но хоть так.
вот только не могу вспомнить как отключить прорисовку компонентов на время пока они в цикле создаются? :confused:
Код:
сюда хочу какнибудь ещё onClick добавить, чтоб активный panel другим цветом выделялся.
эээ... а нельзя было это в StringGrid-е сделать?
а как?
Код:
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;
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 или посмотреть может можно будет каждой ячейке свой формат задать.
OnClick добавить просто:
Panel.OnClick := OnClickFunc; :)
Между прочим, для задачи, как описал ее Гудвин, ИМХО, VirtualTreeView - самое то.
А так VirtualTreeView мощная штука, тока форматирование самому рисовать придется..
Цикл прорисовки останавливается функцией LockWindowUpdate()
Цитата: Phodopus
Так может ему там редактировать чего надо, в этом-самом RichEdit-е?
Не спорю, хотя зачем вот для этого:
Цитата:
это типа библиотечный склад, после поиска по базе выводится инфа о найденных книгах (в несколько строк с разным форматированием, типа автор, год издания и т. д.), из найденного пользователь выбирает несколько и далее работает с выбранной кучей.
использовать RichEdit? Ну не для этого он. Хозяин-барин, как грицца... :rolleyes:
спасибо, сейчас смотрю этот компонент.