Page 1 of 1

tag used as memo

Posted: Thu Jul 30, 2015 4:36 pm
by wdias
Hello everyone!

I've been working on a project that allows the users to create their own documents templates. Each template may have fields(tags) and its contents may be stored in a database.

There are some tags that is necessary have more than one line. So here is my problem, when I try to get the text of such tag, I get just one line of the tag.

My question is. Is it possible to get the text of the entire tag?

PS: I'm using the InsertStringTag function.

thanks in advance

Posted: Fri Jul 31, 2015 4:59 pm
by Sergey Tkachenko
Tags can contain multiline strings.
This code shows a messagebox containing multiline text:

Code: Select all

  RichViewEdit1.InsertStringTag('aaa', '1'#13'2'#13'3');
  Application.MessageBox(PChar(RichViewEdit1.GetCurrentTag), 'Tag', 0);
Items having multiline tags can be saved and loaded in RVF format.

Posted: Fri Jul 31, 2015 6:10 pm
by wdias
hi, thanks for your answer, but i'm still in doubt. I couldn't explain correctly because my english is too bad.

You showed me how to put a tag with multiline text RichViewEdit1.InsertStringTag('aaa', '1'#13'2'#13'3');. I want to know if is possible put a text with multilines, just the opposite that showed.
RichViewEdit1.InsertStringTag('1'#13'2'#13'3', 'aaa');


I'm using InsertStringTag to put a tag, it serves as a index to get the text of the tag. For example: RichViewEdit1.InsertStringTag('text that I want to get in multi lines', 'tag_memo');

[/img]

Posted: Fri Jul 31, 2015 6:43 pm
by Sergey Tkachenko
In InsertStringTag, the string must not contain line break characters.
There is a method InsertText that can insert multiline text, but it does not support tags.

If you need to insert a multiline text with tag, use a function like this:

Code: Select all

var sl: TStringList;
    rve: TCustomRichViewEdit;
    i: Integer;
begin
  sl := TStringList.Create;
  sl.Text := '1'#13'2'#13'3';
  rve := RichViewEdit1.TopLevelEditor;
  rve.BeginUndoGroup(rvutInsert);
  rve.SetUndoGroupMode(True);
  rve.BeginUpdate;
  for i := 0 to sl.Count-1 do begin
    rve.InsertStringTag(sl[i], 'tag example');
    if i<sl.Count-1 then
      rve.InsertText(#13);
  end;
  rve.EndUpdate;
  rve.SetUndoGroupMode(False);
  sl.Free;
end;

Posted: Thu Aug 06, 2015 7:27 pm
by wellington.dias
hello, everyone!

Thank you Sergey for the help.

I've made this function, if anyone is interested.

It is attending my needs when I want to get a Tag text with multilines.


///alteração 06/08/2015
///função que pega todas as linhas de um field de multilinhas
function TFEditor.GetMultilineFieldText(rv : TCustomRichView; const AField:string; ItemNo:Integer): string;
var
sValue: string;
i:integer;
vItem : TCustomRVItemInfo;
bTagDiferent, bLastItem : boolean;
begin
GetFieldValue(rv, AField, ItemNo);

sValue := '';
i := itemNo;
repeat
vItem := rv.GetItem(i);
bTagDiferent := (vItem.Tag <> AField);
bLastItem := rv.ItemCount -1 = i;
if not bTagDiferent then begin
sValue := sValue + ' '+#13 + vItem.ItemText;
end;
i := i+1;
until (bTagDiferent or bLastItem);
result := sValue;
end;