Difference between revisions of "Cocoa Internals/Memo"
From Lazarus wiki
Jump to navigationJump to searchm (→See Also) |
|||
Line 34: | Line 34: | ||
===Inserting into Scroll View=== | ===Inserting into Scroll View=== | ||
The process is straight-forward - allocate scroll view, use NSTextView as it's document view | The process is straight-forward - allocate scroll view, use NSTextView as it's document view | ||
+ | <source lang="delphi"> | ||
+ | procedure TForm1.FormShow(Sender: TObject); | ||
+ | var | ||
+ | txt : NSTextView; | ||
+ | sc : NSScrollView; | ||
+ | begin | ||
+ | txt := NSTextView.alloc.initWithFrame(NSMakeRect(10,ClientHeight-10-50,50,50)); | ||
+ | |||
+ | // making the maximum size - maximum! | ||
+ | // 10000000 is a "magic constant" could be found in Apple documents | ||
+ | txt.setMaxSize( NSMakeSize(10000000, 10000000)); | ||
+ | // preventing textContainer from following the width of NSTextView | ||
+ | txt.textContainer.setWidthTracksTextView(false); | ||
+ | // making TextContainer large enough. | ||
+ | txt.textContainer.setContainerSize ( NSMakeSize( 10000000, 1024)); | ||
+ | // making NSTextView to resize automatically to the text boundries (max width) | ||
+ | txt.setHorizontallyResizable(true); | ||
+ | |||
+ | sc := NSScrollView.alloc.initWithFrame(NSMakeRect(10,ClientHeight-10-150,150,150)); | ||
+ | sc.setHasVerticalScroller(true); | ||
+ | sc.setHasHorizontalScroller(true); | ||
+ | sc.setAutohidesScrollers(true); | ||
+ | sc.setDocumentView(txt); | ||
+ | |||
+ | NSView(Self.Handle).addSubView(sc); | ||
+ | end; | ||
+ | </source> | ||
==See Also== | ==See Also== |
Revision as of 06:11, 29 December 2017
TMemo widgetset is implemented over NSTextView and NSScrollView
NSTextView
By default NSTextView is designed to be constantly word-wrapped. Disabling word-wrapping could be quite complicated from a start due to odd-default values chosen by Apple, as well as complex (yet flexible) Text Layout system.
- NSTextView is a "cocoa" control, however it's not drawing the text by it's own it's also using:
- NSTextContainer. Both NSTextContainer and NSTextView settings influence on how the text is rendered in the end.
The example shows, of creating NSTextView that automatically resizes itself horizontally. However NSTextView doesn't provide its own scrollbars, thus no scrollbars would be seen.
procedure TForm1.FormShow(Sender: TObject);
var
txt : NSTextView;
begin
txt := NSTextView.alloc.initWithFrame(NSMakeRect(10,ClientHeight-10-50,50,50));
txt.setFont(NSFont.systemFontOfSize(NSFont.systemFontSizeForControlSize(NSRegularControlSize)));
// making the maximum size - maximum!
// 10000000 is a "constant" could be found in Apple documentation
txt.setMaxSize( NSMakeSize(10000000, 10000000));
// preventing textContainer from following the width of NSTextView
txt.textContainer.setWidthTracksTextView(false);
// making TextContainer large enough.
txt.textContainer.setContainerSize ( NSMakeSize( 10000000, 1024));
// making NSTextView to resize automatically to the text boundries (max width)
txt.setHorizontallyResizable(true);
NSView(Self.Handle).addSubView(txt);
end;
The next step is actually to embed NSTextView into ScrollView (as a documentView).
Inserting into Scroll View
The process is straight-forward - allocate scroll view, use NSTextView as it's document view
procedure TForm1.FormShow(Sender: TObject);
var
txt : NSTextView;
sc : NSScrollView;
begin
txt := NSTextView.alloc.initWithFrame(NSMakeRect(10,ClientHeight-10-50,50,50));
// making the maximum size - maximum!
// 10000000 is a "magic constant" could be found in Apple documents
txt.setMaxSize( NSMakeSize(10000000, 10000000));
// preventing textContainer from following the width of NSTextView
txt.textContainer.setWidthTracksTextView(false);
// making TextContainer large enough.
txt.textContainer.setContainerSize ( NSMakeSize( 10000000, 1024));
// making NSTextView to resize automatically to the text boundries (max width)
txt.setHorizontallyResizable(true);
sc := NSScrollView.alloc.initWithFrame(NSMakeRect(10,ClientHeight-10-150,150,150));
sc.setHasVerticalScroller(true);
sc.setHasHorizontalScroller(true);
sc.setAutohidesScrollers(true);
sc.setDocumentView(txt);
NSView(Self.Handle).addSubView(sc);
end;
See Also
- Cocoa Internals
- Tracking the Size of a Text View - Apple's official documentation explains how text size is tracked between NSViewText and NSViewContainer
- Putting an NSTextView Object in an NSScrollView - Apple's official documentation on how to place NSTextView into a scrollview.
- How to Disable Word-Wrap of NSTextview - stackoverflow discussion of the problem.