Recent

Author Topic: [SOLVED] macOS: TMemo.Lines vs TMemo.Text and PosEx()  (Read 486 times)

trev

  • Full Member
  • ***
  • Posts: 202
[SOLVED] macOS: TMemo.Lines vs TMemo.Text and PosEx()
« on: July 10, 2019, 02:36:44 pm »
In the never-ending saga that is my application, I have discovered that my text search fails (ie using PosEx fails to correctly locate the search characters in the TMemo) if I assign lines read from a file to a TMemo using TMemo.Lines := strList rather than TMemo.Text := strList.Text.

It appears to me to be related to the number of lines and therefore likely the LineEndings are causing the issue.

macOS 10.14.5, Lazarus v2.10 (trunk), FPC 3.0.4 or FPC 3.3.1 (trunk).

Curiously it works fine under:

o  Ubuntu 18.04 64 bit with Lazarus v1.8.2; FPC v3.0.4;
o  FreeBSD 12.0 64 bit with Lazarus v2.00;  FPC v3.0.4; and
o  Windows 10 64 bit cross-compiled under macOS for 32 bit

using either method.

Easy enough to work around now that I figured out what is going on, but... I doubt it should be happening.
« Last Edit: July 12, 2019, 02:48:25 am by trev »
o Lazarus v2.1.0 r61775, FPC v3.3.1 r42640, macOS 10.14.6 (with sup update), Xcode 10.3
o Lazarus v2.1.0 r61574, FPC v3.3.1 r42318, FreeBSD 12.0 (Parallels VM)
o Lazarus v2.1.0 r61574, FPC v3.0.4, Ubuntu 18.04 (Parallels VM)

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2267
    • havefunsoft.com
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #1 on: July 10, 2019, 03:15:27 pm »
In the never-ending saga that is my application, I have discovered that my text search fails (ie using PosEx fails to correctly locate the search characters in the TMemo) if I assign lines read from a file to a TMemo using TMemo.Lines := strList rather than TMemo.Text := strList.Text.

It appears to me to be related to the number of lines and therefore likely the LineEndings are causing the issue.
where do you search at Memo.Text or Memo.Lines.Text? (something else?)
Patron Cocoa Widgetset development https://www.patreon.com/skalogryz

marcov

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 7438
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #2 on: July 10, 2019, 04:24:54 pm »
Did you use posex(substr,wholestr,value) and not  (wholestr,substr). Show more code.

lucamar

  • Hero Member
  • *****
  • Posts: 2017
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #3 on: July 10, 2019, 05:40:40 pm »
Note also that for memos it's best to use UTF8Pos() and UTF8RPos(). Pos(), PosEx(), RPos(), etc. tend to fail for anything other than single-byte character strings.

Another thing to take into account: The string functions return a 1-based position but SelStart, etc. are 0-based.

And that's not counting the problems with UTF8-BOM, ZWJs, etc. :)
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus 2.0.2/2.0.4  - FPC 3.0.4 on:
(K|L)Ubuntu 12..16, Windows XP SP3, various DOSes.

trev

  • Full Member
  • ***
  • Posts: 202
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #4 on: July 11, 2019, 08:33:24 am »
In the never-ending saga that is my application, I have discovered that my text search fails (ie using PosEx fails to correctly locate the search characters in the TMemo) if I assign lines read from a file to a TMemo using TMemo.Lines := strList rather than TMemo.Text := strList.Text.

It appears to me to be related to the number of lines and therefore likely the LineEndings are causing the issue.
where do you search at Memo.Text or Memo.Lines.Text? (something else?)

Code: Pascal  [Select]
  1.   // we have a match...
  2.   else
  3.     begin
  4.       // select characters to highlight
  5.       Memo.SelStart := PosEx(UpperCase(Edit.Text), UpperCase(Memo.Text), searchOFS) - 1;
  6.       Memo.SelLength := Length(Edit.Text);
  7.       searchOFS := Memo.SelStart + 1;
  8.     end;    
  9.  
o Lazarus v2.1.0 r61775, FPC v3.3.1 r42640, macOS 10.14.6 (with sup update), Xcode 10.3
o Lazarus v2.1.0 r61574, FPC v3.3.1 r42318, FreeBSD 12.0 (Parallels VM)
o Lazarus v2.1.0 r61574, FPC v3.0.4, Ubuntu 18.04 (Parallels VM)

trev

  • Full Member
  • ***
  • Posts: 202
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #5 on: July 11, 2019, 08:34:03 am »
Did you use posex(substr,wholestr,value) and not  (wholestr,substr). Show more code.

Yes, see above.
o Lazarus v2.1.0 r61775, FPC v3.3.1 r42640, macOS 10.14.6 (with sup update), Xcode 10.3
o Lazarus v2.1.0 r61574, FPC v3.3.1 r42318, FreeBSD 12.0 (Parallels VM)
o Lazarus v2.1.0 r61574, FPC v3.0.4, Ubuntu 18.04 (Parallels VM)

trev

  • Full Member
  • ***
  • Posts: 202
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #6 on: July 11, 2019, 08:38:52 am »
Note also that for memos it's best to use UTF8Pos() and UTF8RPos(). Pos(), PosEx(), RPos(), etc. tend to fail for anything other than single-byte character strings.

The files contain PIC microcontroller config word settings, registers, interrupts etc and are definitely always going to be single byte characters... yeah, I know, famous last words ;)

Quote
Another thing to take into account: The string functions return a 1-based position but SelStart, etc. are 0-based.

Aware and accounted for.
o Lazarus v2.1.0 r61775, FPC v3.3.1 r42640, macOS 10.14.6 (with sup update), Xcode 10.3
o Lazarus v2.1.0 r61574, FPC v3.3.1 r42318, FreeBSD 12.0 (Parallels VM)
o Lazarus v2.1.0 r61574, FPC v3.0.4, Ubuntu 18.04 (Parallels VM)

lucamar

  • Hero Member
  • *****
  • Posts: 2017
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #7 on: July 11, 2019, 02:25:18 pm »
Try using:
Code: Pascal  [Select]
  1. Memo.Lines.AddStrings(StringList, True);
or even
Code: Pascal  [Select]
  1. Memo.Lines.Assign(StringList);

Any of those should work right everywhere.

Also, I'm assuming (because your "we have a match") that you test that PosEx > 0 somewhere? If not your search should be more lke:
Code: Pascal  [Select]
  1.   // we have a match...
  2.   else
  3.     begin
  4.       searchOFS := PosEx(UpperCase(Edit.Text), UpperCase(Memo.Text), searchOFS);
  5.       if searchOFS > 0 then begin
  6.         Memo.SelStart := searchOFS - 1;
  7.         Memo.SelLength := Length(Edit.Text);
  8.       end else
  9.         ShowMessage('Not found');
  10.     end;
« Last Edit: July 11, 2019, 02:33:58 pm by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus 2.0.2/2.0.4  - FPC 3.0.4 on:
(K|L)Ubuntu 12..16, Windows XP SP3, various DOSes.

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2267
    • havefunsoft.com
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #8 on: July 11, 2019, 03:26:16 pm »
Code: Pascal  [Select]
  1.       Memo.SelStart := PosEx(UpperCase(Edit.Text), UpperCase(Memo.Text), searchOFS) - 1;
try r61567 please
Patron Cocoa Widgetset development https://www.patreon.com/skalogryz

trev

  • Full Member
  • ***
  • Posts: 202
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #9 on: July 12, 2019, 03:11:12 am »
Try using:
Code: Pascal  [Select]
  1. Memo.Lines.AddStrings(StringList, True);

The assignment with the above takes approx 10s vs 1ms for:
Code: Pascal  [Select]
  1. Memo.Text := strList.Text;

Quote
or even
Code: Pascal  [Select]
  1. Memo.Lines.Assign(StringList);

Any of those should work right everywhere.

Only at the cost of a huge performance hit (28s): see https://forum.lazarus.freepascal.org/index.php/topic,45733.0.html

Quote
Also, I'm assuming (because your "we have a match") that you test that PosEx > 0 somewhere? If not your search should be more like:

You assumed right.
o Lazarus v2.1.0 r61775, FPC v3.3.1 r42640, macOS 10.14.6 (with sup update), Xcode 10.3
o Lazarus v2.1.0 r61574, FPC v3.3.1 r42318, FreeBSD 12.0 (Parallels VM)
o Lazarus v2.1.0 r61574, FPC v3.0.4, Ubuntu 18.04 (Parallels VM)

trev

  • Full Member
  • ***
  • Posts: 202
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #10 on: July 12, 2019, 03:12:36 am »
try r61567 please

Thanks Dmitry - yes, that fixed the text location issue.
o Lazarus v2.1.0 r61775, FPC v3.3.1 r42640, macOS 10.14.6 (with sup update), Xcode 10.3
o Lazarus v2.1.0 r61574, FPC v3.3.1 r42318, FreeBSD 12.0 (Parallels VM)
o Lazarus v2.1.0 r61574, FPC v3.0.4, Ubuntu 18.04 (Parallels VM)

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2267
    • havefunsoft.com
Re: macOS: TMemo.Lines vs TMemo.Text and PosEx()
« Reply #11 on: July 12, 2019, 04:37:18 am »
Thanks Dmitry - yes, that fixed the text location issue.
Keep that in mind: https://wiki.lazarus.freepascal.org/Cocoa_Internals/Text_Controls#Forcing_Lines_Breaks
(in case you need to load/save files across systems)
Patron Cocoa Widgetset development https://www.patreon.com/skalogryz