1 |
|
---|
2 | {*****************************************************************************}
|
---|
3 | { }
|
---|
4 | { Tnt Delphi Unicode Controls }
|
---|
5 | { http://www.tntware.com/delphicontrols/unicode/ }
|
---|
6 | { Version: 2.3.0 }
|
---|
7 | { }
|
---|
8 | { Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) }
|
---|
9 | { }
|
---|
10 | {*****************************************************************************}
|
---|
11 |
|
---|
12 | unit TntGrids;
|
---|
13 |
|
---|
14 | {$INCLUDE TntCompilers.inc}
|
---|
15 |
|
---|
16 | interface
|
---|
17 |
|
---|
18 | uses
|
---|
19 | Classes, TntClasses, Grids, Windows, Controls, Messages;
|
---|
20 |
|
---|
21 | type
|
---|
22 | {TNT-WARN TInplaceEdit}
|
---|
23 | TTntInplaceEdit = class(TInplaceEdit{TNT-ALLOW TInplaceEdit})
|
---|
24 | private
|
---|
25 | function GetText: WideString;
|
---|
26 | procedure SetText(const Value: WideString);
|
---|
27 | protected
|
---|
28 | procedure UpdateContents; override;
|
---|
29 | procedure CreateWindowHandle(const Params: TCreateParams); override;
|
---|
30 | public
|
---|
31 | property Text: WideString read GetText write SetText;
|
---|
32 | end;
|
---|
33 |
|
---|
34 | TTntGetEditEvent = procedure (Sender: TObject; ACol, ARow: Longint; var Value: WideString) of object;
|
---|
35 | TTntSetEditEvent = procedure (Sender: TObject; ACol, ARow: Longint; const Value: WideString) of object;
|
---|
36 |
|
---|
37 | {TNT-WARN TCustomDrawGrid}
|
---|
38 | _TTntInternalCustomDrawGrid = class(TCustomDrawGrid{TNT-ALLOW TCustomDrawGrid})
|
---|
39 | private
|
---|
40 | FSettingEditText: Boolean;
|
---|
41 | procedure InternalSetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); dynamic; abstract;
|
---|
42 | protected
|
---|
43 | procedure SetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); override;
|
---|
44 | end;
|
---|
45 |
|
---|
46 | TTntCustomDrawGrid = class(_TTntInternalCustomDrawGrid)
|
---|
47 | private
|
---|
48 | FOnGetEditText: TTntGetEditEvent;
|
---|
49 | FOnSetEditText: TTntSetEditEvent;
|
---|
50 | function GetHint: WideString;
|
---|
51 | procedure SetHint(const Value: WideString);
|
---|
52 | function IsHintStored: Boolean;
|
---|
53 | procedure WMChar(var Msg: TWMChar); message WM_CHAR;
|
---|
54 | protected
|
---|
55 | function CreateEditor: TInplaceEdit{TNT-ALLOW TInplaceEdit}; override;
|
---|
56 | procedure InternalSetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); override;
|
---|
57 | function GetEditText(ACol, ARow: Longint): WideString; reintroduce; virtual;
|
---|
58 | procedure SetEditText(ACol, ARow: Longint; const Value: WideString); reintroduce; virtual;
|
---|
59 | protected
|
---|
60 | procedure CreateWindowHandle(const Params: TCreateParams); override;
|
---|
61 | procedure ShowEditorChar(Ch: WideChar); dynamic;
|
---|
62 | procedure DefineProperties(Filer: TFiler); override;
|
---|
63 | function GetActionLinkClass: TControlActionLinkClass; override;
|
---|
64 | procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
|
---|
65 | property OnGetEditText: TTntGetEditEvent read FOnGetEditText write FOnGetEditText;
|
---|
66 | property OnSetEditText: TTntSetEditEvent read FOnSetEditText write FOnSetEditText;
|
---|
67 | published
|
---|
68 | property Hint: WideString read GetHint write SetHint stored IsHintStored;
|
---|
69 | end;
|
---|
70 |
|
---|
71 | {TNT-WARN TDrawGrid}
|
---|
72 | TTntDrawGrid = class(TTntCustomDrawGrid)
|
---|
73 | published
|
---|
74 | property Align;
|
---|
75 | property Anchors;
|
---|
76 | property BevelEdges;
|
---|
77 | property BevelInner;
|
---|
78 | property BevelKind;
|
---|
79 | property BevelOuter;
|
---|
80 | property BevelWidth;
|
---|
81 | property BiDiMode;
|
---|
82 | property BorderStyle;
|
---|
83 | property Color;
|
---|
84 | property ColCount;
|
---|
85 | property Constraints;
|
---|
86 | property Ctl3D;
|
---|
87 | property DefaultColWidth;
|
---|
88 | property DefaultRowHeight;
|
---|
89 | property DefaultDrawing;
|
---|
90 | property DragCursor;
|
---|
91 | property DragKind;
|
---|
92 | property DragMode;
|
---|
93 | property Enabled;
|
---|
94 | property FixedColor;
|
---|
95 | property FixedCols;
|
---|
96 | property RowCount;
|
---|
97 | property FixedRows;
|
---|
98 | property Font;
|
---|
99 | property GridLineWidth;
|
---|
100 | property Options;
|
---|
101 | property ParentBiDiMode;
|
---|
102 | property ParentColor;
|
---|
103 | property ParentCtl3D;
|
---|
104 | property ParentFont;
|
---|
105 | property ParentShowHint;
|
---|
106 | property PopupMenu;
|
---|
107 | property ScrollBars;
|
---|
108 | property ShowHint;
|
---|
109 | property TabOrder;
|
---|
110 | property Visible;
|
---|
111 | property VisibleColCount;
|
---|
112 | property VisibleRowCount;
|
---|
113 | property OnClick;
|
---|
114 | property OnColumnMoved;
|
---|
115 | property OnContextPopup;
|
---|
116 | property OnDblClick;
|
---|
117 | property OnDragDrop;
|
---|
118 | property OnDragOver;
|
---|
119 | property OnDrawCell;
|
---|
120 | property OnEndDock;
|
---|
121 | property OnEndDrag;
|
---|
122 | property OnEnter;
|
---|
123 | property OnExit;
|
---|
124 | property OnGetEditMask;
|
---|
125 | property OnGetEditText;
|
---|
126 | property OnKeyDown;
|
---|
127 | property OnKeyPress;
|
---|
128 | property OnKeyUp;
|
---|
129 | {$IFDEF COMPILER_9_UP}
|
---|
130 | property OnMouseActivate;
|
---|
131 | {$ENDIF}
|
---|
132 | property OnMouseDown;
|
---|
133 | {$IFDEF COMPILER_10_UP}
|
---|
134 | property OnMouseEnter;
|
---|
135 | property OnMouseLeave;
|
---|
136 | {$ENDIF}
|
---|
137 | property OnMouseMove;
|
---|
138 | property OnMouseUp;
|
---|
139 | property OnMouseWheelDown;
|
---|
140 | property OnMouseWheelUp;
|
---|
141 | property OnRowMoved;
|
---|
142 | property OnSelectCell;
|
---|
143 | property OnSetEditText;
|
---|
144 | property OnStartDock;
|
---|
145 | property OnStartDrag;
|
---|
146 | property OnTopLeftChanged;
|
---|
147 | end;
|
---|
148 |
|
---|
149 | TTntStringGrid = class;
|
---|
150 |
|
---|
151 | {TNT-WARN TStringGridStrings}
|
---|
152 | TTntStringGridStrings = class(TTntStrings)
|
---|
153 | private
|
---|
154 | FIsCol: Boolean;
|
---|
155 | FColRowIndex: Integer;
|
---|
156 | FGrid: TTntStringGrid;
|
---|
157 | function GridAnsiStrings: TStrings{TNT-ALLOW TStrings};
|
---|
158 | protected
|
---|
159 | function Get(Index: Integer): WideString; override;
|
---|
160 | procedure Put(Index: Integer; const S: WideString); override;
|
---|
161 | function GetCount: Integer; override;
|
---|
162 | function GetObject(Index: Integer): TObject; override;
|
---|
163 | procedure PutObject(Index: Integer; AObject: TObject); override;
|
---|
164 | procedure SetUpdateState(Updating: Boolean); override;
|
---|
165 | public
|
---|
166 | constructor Create(AGrid: TTntStringGrid; AIndex: Longint);
|
---|
167 | function Add(const S: WideString): Integer; override;
|
---|
168 | procedure Assign(Source: TPersistent); override;
|
---|
169 | procedure Clear; override;
|
---|
170 | procedure Delete(Index: Integer); override;
|
---|
171 | procedure Insert(Index: Integer; const S: WideString); override;
|
---|
172 | end;
|
---|
173 |
|
---|
174 | {TNT-WARN TStringGrid}
|
---|
175 | _TTntInternalStringGrid = class(TStringGrid{TNT-ALLOW TStringGrid})
|
---|
176 | private
|
---|
177 | FSettingEditText: Boolean;
|
---|
178 | procedure InternalSetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); dynamic; abstract;
|
---|
179 | protected
|
---|
180 | procedure SetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); override;
|
---|
181 | end;
|
---|
182 |
|
---|
183 | TTntStringGrid = class(_TTntInternalStringGrid)
|
---|
184 | private
|
---|
185 | FCreatedRowStrings: TStringList{TNT-ALLOW TStringList};
|
---|
186 | FCreatedColStrings: TStringList{TNT-ALLOW TStringList};
|
---|
187 | FOnGetEditText: TTntGetEditEvent;
|
---|
188 | FOnSetEditText: TTntSetEditEvent;
|
---|
189 | function GetHint: WideString;
|
---|
190 | procedure SetHint(const Value: WideString);
|
---|
191 | function IsHintStored: Boolean;
|
---|
192 | procedure WMChar(var Msg: TWMChar); message WM_CHAR;
|
---|
193 | function GetCells(ACol, ARow: Integer): WideString;
|
---|
194 | procedure SetCells(ACol, ARow: Integer; const Value: WideString);
|
---|
195 | function FindGridStrings(const IsCol: Boolean; const ListIndex: Integer): TTntStrings;
|
---|
196 | function GetCols(Index: Integer): TTntStrings;
|
---|
197 | function GetRows(Index: Integer): TTntStrings;
|
---|
198 | procedure SetCols(Index: Integer; const Value: TTntStrings);
|
---|
199 | procedure SetRows(Index: Integer; const Value: TTntStrings);
|
---|
200 | protected
|
---|
201 | function CreateEditor: TInplaceEdit{TNT-ALLOW TInplaceEdit}; override;
|
---|
202 | procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
|
---|
203 | procedure InternalSetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); override;
|
---|
204 | function GetEditText(ACol, ARow: Longint): WideString; reintroduce; virtual;
|
---|
205 | procedure SetEditText(ACol, ARow: Longint; const Value: WideString); reintroduce; virtual;
|
---|
206 | protected
|
---|
207 | procedure CreateWindowHandle(const Params: TCreateParams); override;
|
---|
208 | procedure ShowEditorChar(Ch: WideChar); dynamic;
|
---|
209 | procedure DefineProperties(Filer: TFiler); override;
|
---|
210 | function GetActionLinkClass: TControlActionLinkClass; override;
|
---|
211 | procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
|
---|
212 | public
|
---|
213 | constructor Create(AOwner: TComponent); override;
|
---|
214 | destructor Destroy; override;
|
---|
215 | property Cells[ACol, ARow: Integer]: WideString read GetCells write SetCells;
|
---|
216 | property Cols[Index: Integer]: TTntStrings read GetCols write SetCols;
|
---|
217 | property Rows[Index: Integer]: TTntStrings read GetRows write SetRows;
|
---|
218 | published
|
---|
219 | property Hint: WideString read GetHint write SetHint stored IsHintStored;
|
---|
220 | property OnGetEditText: TTntGetEditEvent read FOnGetEditText write FOnGetEditText;
|
---|
221 | property OnSetEditText: TTntSetEditEvent read FOnSetEditText write FOnSetEditText;
|
---|
222 | end;
|
---|
223 |
|
---|
224 | implementation
|
---|
225 |
|
---|
226 | uses
|
---|
227 | SysUtils, TntSystem, TntGraphics, TntControls, TntStdCtrls, TntActnList, TntSysUtils;
|
---|
228 |
|
---|
229 | { TBinaryCompareAnsiStringList }
|
---|
230 | type
|
---|
231 | TBinaryCompareAnsiStringList = class(TStringList{TNT-ALLOW TStringList})
|
---|
232 | protected
|
---|
233 | function CompareStrings(const S1, S2: string{TNT-ALLOW string}): Integer; override;
|
---|
234 | end;
|
---|
235 |
|
---|
236 | function TBinaryCompareAnsiStringList.CompareStrings(const S1, S2: string{TNT-ALLOW string}): Integer;
|
---|
237 | begin
|
---|
238 | // must compare strings via binary for speed
|
---|
239 | if S1 = S2 then
|
---|
240 | result := 0
|
---|
241 | else if S1 < S2 then
|
---|
242 | result := -1
|
---|
243 | else
|
---|
244 | result := 1;
|
---|
245 | end;
|
---|
246 |
|
---|
247 | { TTntInplaceEdit }
|
---|
248 |
|
---|
249 | procedure TTntInplaceEdit.CreateWindowHandle(const Params: TCreateParams);
|
---|
250 | begin
|
---|
251 | TntCustomEdit_CreateWindowHandle(Self, Params);
|
---|
252 | end;
|
---|
253 |
|
---|
254 | function TTntInplaceEdit.GetText: WideString;
|
---|
255 | begin
|
---|
256 | if IsMasked then
|
---|
257 | Result := inherited Text
|
---|
258 | else
|
---|
259 | Result := TntControl_GetText(Self);
|
---|
260 | end;
|
---|
261 |
|
---|
262 | procedure TTntInplaceEdit.SetText(const Value: WideString);
|
---|
263 | begin
|
---|
264 | if IsMasked then
|
---|
265 | inherited Text := Value
|
---|
266 | else
|
---|
267 | TntControl_SetText(Self, Value);
|
---|
268 | end;
|
---|
269 |
|
---|
270 | type TAccessCustomGrid = class(TCustomGrid);
|
---|
271 |
|
---|
272 | procedure TTntInplaceEdit.UpdateContents;
|
---|
273 | begin
|
---|
274 | Text := '';
|
---|
275 | with TAccessCustomGrid(Grid) do
|
---|
276 | Self.EditMask := GetEditMask(Col, Row);
|
---|
277 | if (Grid is TTntStringGrid) then
|
---|
278 | with (Grid as TTntStringGrid) do
|
---|
279 | Self.Text := GetEditText(Col, Row)
|
---|
280 | else if (Grid is TTntCustomDrawGrid) then
|
---|
281 | with (Grid as TTntCustomDrawGrid) do
|
---|
282 | Self.Text := GetEditText(Col, Row)
|
---|
283 | else
|
---|
284 | with TAccessCustomGrid(Grid) do
|
---|
285 | Self.Text := GetEditText(Col, Row);
|
---|
286 | with TAccessCustomGrid(Grid) do
|
---|
287 | Self.MaxLength := GetEditLimit;
|
---|
288 | end;
|
---|
289 |
|
---|
290 | { _TTntInternalCustomDrawGrid }
|
---|
291 |
|
---|
292 | procedure _TTntInternalCustomDrawGrid.SetEditText(ACol, ARow: Integer; const Value: string{TNT-ALLOW string});
|
---|
293 | begin
|
---|
294 | if FSettingEditText then
|
---|
295 | inherited
|
---|
296 | else
|
---|
297 | InternalSetEditText(ACol, ARow, Value);
|
---|
298 | end;
|
---|
299 |
|
---|
300 |
|
---|
301 | { TTntCustomDrawGrid }
|
---|
302 |
|
---|
303 | function TTntCustomDrawGrid.CreateEditor: TInplaceEdit{TNT-ALLOW TInplaceEdit};
|
---|
304 | begin
|
---|
305 | Result := TTntInplaceEdit.Create(Self);
|
---|
306 | end;
|
---|
307 |
|
---|
308 | procedure TTntCustomDrawGrid.CreateWindowHandle(const Params: TCreateParams);
|
---|
309 | begin
|
---|
310 | CreateUnicodeHandle(Self, Params, '');
|
---|
311 | end;
|
---|
312 |
|
---|
313 | procedure TTntCustomDrawGrid.DefineProperties(Filer: TFiler);
|
---|
314 | begin
|
---|
315 | inherited;
|
---|
316 | TntPersistent_AfterInherited_DefineProperties(Filer, Self);
|
---|
317 | end;
|
---|
318 |
|
---|
319 | function TTntCustomDrawGrid.IsHintStored: Boolean;
|
---|
320 | begin
|
---|
321 | Result := TntControl_IsHintStored(Self);
|
---|
322 | end;
|
---|
323 |
|
---|
324 | function TTntCustomDrawGrid.GetHint: WideString;
|
---|
325 | begin
|
---|
326 | Result := TntControl_GetHint(Self);
|
---|
327 | end;
|
---|
328 |
|
---|
329 | procedure TTntCustomDrawGrid.SetHint(const Value: WideString);
|
---|
330 | begin
|
---|
331 | TntControl_SetHint(Self, Value);
|
---|
332 | end;
|
---|
333 |
|
---|
334 | function TTntCustomDrawGrid.GetEditText(ACol, ARow: Integer): WideString;
|
---|
335 | begin
|
---|
336 | Result := '';
|
---|
337 | if Assigned(FOnGetEditText) then FOnGetEditText(Self, ACol, ARow, Result);
|
---|
338 | end;
|
---|
339 |
|
---|
340 | procedure TTntCustomDrawGrid.InternalSetEditText(ACol, ARow: Integer; const Value: string{TNT-ALLOW string});
|
---|
341 | begin
|
---|
342 | if not FSettingEditText then
|
---|
343 | SetEditText(ACol, ARow, TntControl_GetText(InplaceEditor));
|
---|
344 | end;
|
---|
345 |
|
---|
346 | procedure TTntCustomDrawGrid.SetEditText(ACol, ARow: Integer; const Value: WideString);
|
---|
347 | begin
|
---|
348 | if Assigned(FOnSetEditText) then FOnSetEditText(Self, ACol, ARow, Value);
|
---|
349 | end;
|
---|
350 |
|
---|
351 | procedure TTntCustomDrawGrid.WMChar(var Msg: TWMChar);
|
---|
352 | begin
|
---|
353 | if (goEditing in Options)
|
---|
354 | and (AnsiChar(Msg.CharCode) in [^H, #32..#255]) then begin
|
---|
355 | RestoreWMCharMsg(TMessage(Msg));
|
---|
356 | ShowEditorChar(WideChar(Msg.CharCode));
|
---|
357 | end else
|
---|
358 | inherited;
|
---|
359 | end;
|
---|
360 |
|
---|
361 | procedure TTntCustomDrawGrid.ShowEditorChar(Ch: WideChar);
|
---|
362 | begin
|
---|
363 | ShowEditor;
|
---|
364 | if InplaceEditor <> nil then begin
|
---|
365 | if Win32PlatformIsUnicode then
|
---|
366 | PostMessageW(InplaceEditor.Handle, WM_CHAR, Word(Ch), 0)
|
---|
367 | else
|
---|
368 | PostMessageA(InplaceEditor.Handle, WM_CHAR, Word(Ch), 0);
|
---|
369 | end;
|
---|
370 | end;
|
---|
371 |
|
---|
372 | procedure TTntCustomDrawGrid.ActionChange(Sender: TObject; CheckDefaults: Boolean);
|
---|
373 | begin
|
---|
374 | TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults);
|
---|
375 | inherited;
|
---|
376 | end;
|
---|
377 |
|
---|
378 | function TTntCustomDrawGrid.GetActionLinkClass: TControlActionLinkClass;
|
---|
379 | begin
|
---|
380 | Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass);
|
---|
381 | end;
|
---|
382 |
|
---|
383 | { TTntStringGridStrings }
|
---|
384 |
|
---|
385 | procedure TTntStringGridStrings.Assign(Source: TPersistent);
|
---|
386 | var
|
---|
387 | UTF8Strings: TStringList{TNT-ALLOW TStringList};
|
---|
388 | i: integer;
|
---|
389 | begin
|
---|
390 | UTF8Strings := TStringList{TNT-ALLOW TStringList}.Create;
|
---|
391 | try
|
---|
392 | if Source is TStrings{TNT-ALLOW TStrings} then begin
|
---|
393 | for i := 0 to TStrings{TNT-ALLOW TStrings}(Source).Count - 1 do
|
---|
394 | UTF8Strings.AddObject(WideStringToUTF8(WideString(TStrings{TNT-ALLOW TStrings}(Source).Strings[i])),
|
---|
395 | TStrings{TNT-ALLOW TStrings}(Source).Objects[i]);
|
---|
396 | GridAnsiStrings.Assign(UTF8Strings);
|
---|
397 | end else if Source is TTntStrings then begin
|
---|
398 | for i := 0 to TTntStrings(Source).Count - 1 do
|
---|
399 | UTF8Strings.AddObject(WideStringToUTF8(TTntStrings(Source).Strings[i]),
|
---|
400 | TTntStrings(Source).Objects[i]);
|
---|
401 | GridAnsiStrings.Assign(UTF8Strings);
|
---|
402 | end else
|
---|
403 | GridAnsiStrings.Assign(Source);
|
---|
404 | finally
|
---|
405 | UTF8Strings.Free;
|
---|
406 | end;
|
---|
407 | end;
|
---|
408 |
|
---|
409 | function TTntStringGridStrings.GridAnsiStrings: TStrings{TNT-ALLOW TStrings};
|
---|
410 | begin
|
---|
411 | Assert(Assigned(FGrid));
|
---|
412 | if FIsCol then
|
---|
413 | Result := TStringGrid{TNT-ALLOW TStringGrid}(FGrid).Cols[FColRowIndex]
|
---|
414 | else
|
---|
415 | Result := TStringGrid{TNT-ALLOW TStringGrid}(FGrid).Rows[FColRowIndex];
|
---|
416 | end;
|
---|
417 |
|
---|
418 | procedure TTntStringGridStrings.Clear;
|
---|
419 | begin
|
---|
420 | GridAnsiStrings.Clear;
|
---|
421 | end;
|
---|
422 |
|
---|
423 | procedure TTntStringGridStrings.Delete(Index: Integer);
|
---|
424 | begin
|
---|
425 | GridAnsiStrings.Delete(Index);
|
---|
426 | end;
|
---|
427 |
|
---|
428 | function TTntStringGridStrings.GetCount: Integer;
|
---|
429 | begin
|
---|
430 | Result := GridAnsiStrings.Count;
|
---|
431 | end;
|
---|
432 |
|
---|
433 | function TTntStringGridStrings.Get(Index: Integer): WideString;
|
---|
434 | begin
|
---|
435 | Result := UTF8ToWideString(GridAnsiStrings[Index]);
|
---|
436 | end;
|
---|
437 |
|
---|
438 | procedure TTntStringGridStrings.Put(Index: Integer; const S: WideString);
|
---|
439 | begin
|
---|
440 | GridAnsiStrings[Index] := WideStringToUTF8(S);
|
---|
441 | end;
|
---|
442 |
|
---|
443 | procedure TTntStringGridStrings.Insert(Index: Integer; const S: WideString);
|
---|
444 | begin
|
---|
445 | GridAnsiStrings.Insert(Index, WideStringToUTF8(S));
|
---|
446 | end;
|
---|
447 |
|
---|
448 | function TTntStringGridStrings.Add(const S: WideString): Integer;
|
---|
449 | begin
|
---|
450 | Result := GridAnsiStrings.Add(WideStringToUTF8(S));
|
---|
451 | end;
|
---|
452 |
|
---|
453 | function TTntStringGridStrings.GetObject(Index: Integer): TObject;
|
---|
454 | begin
|
---|
455 | Result := GridAnsiStrings.Objects[Index];
|
---|
456 | end;
|
---|
457 |
|
---|
458 | procedure TTntStringGridStrings.PutObject(Index: Integer; AObject: TObject);
|
---|
459 | begin
|
---|
460 | GridAnsiStrings.Objects[Index] := AObject;
|
---|
461 | end;
|
---|
462 |
|
---|
463 | type TAccessStrings = class(TStrings{TNT-ALLOW TStrings});
|
---|
464 |
|
---|
465 | procedure TTntStringGridStrings.SetUpdateState(Updating: Boolean);
|
---|
466 | begin
|
---|
467 | TAccessStrings(GridAnsiStrings).SetUpdateState(Updating);
|
---|
468 | end;
|
---|
469 |
|
---|
470 | constructor TTntStringGridStrings.Create(AGrid: TTntStringGrid; AIndex: Integer);
|
---|
471 | begin
|
---|
472 | inherited Create;
|
---|
473 | FGrid := AGrid;
|
---|
474 | if AIndex > 0 then begin
|
---|
475 | FIsCol := False;
|
---|
476 | FColRowIndex := AIndex - 1;
|
---|
477 | end else begin
|
---|
478 | FIsCol := True;
|
---|
479 | FColRowIndex := -AIndex - 1;
|
---|
480 | end;
|
---|
481 | end;
|
---|
482 |
|
---|
483 | { _TTntInternalStringGrid }
|
---|
484 |
|
---|
485 | procedure _TTntInternalStringGrid.SetEditText(ACol, ARow: Integer; const Value: string{TNT-ALLOW string});
|
---|
486 | begin
|
---|
487 | if FSettingEditText then
|
---|
488 | inherited
|
---|
489 | else
|
---|
490 | InternalSetEditText(ACol, ARow, Value);
|
---|
491 | end;
|
---|
492 |
|
---|
493 | { TTntStringGrid }
|
---|
494 |
|
---|
495 | constructor TTntStringGrid.Create(AOwner: TComponent);
|
---|
496 | begin
|
---|
497 | inherited;
|
---|
498 | FCreatedRowStrings := TBinaryCompareAnsiStringList.Create;
|
---|
499 | FCreatedRowStrings.Sorted := True;
|
---|
500 | FCreatedRowStrings.Duplicates := dupError;
|
---|
501 | FCreatedColStrings := TBinaryCompareAnsiStringList.Create;
|
---|
502 | FCreatedColStrings.Sorted := True;
|
---|
503 | FCreatedColStrings.Duplicates := dupError;
|
---|
504 | end;
|
---|
505 |
|
---|
506 | destructor TTntStringGrid.Destroy;
|
---|
507 | var
|
---|
508 | i: integer;
|
---|
509 | begin
|
---|
510 | for i := FCreatedColStrings.Count - 1 downto 0 do
|
---|
511 | FCreatedColStrings.Objects[i].Free;
|
---|
512 | for i := FCreatedRowStrings.Count - 1 downto 0 do
|
---|
513 | FCreatedRowStrings.Objects[i].Free;
|
---|
514 | FreeAndNil(FCreatedColStrings);
|
---|
515 | FreeAndNil(FCreatedRowStrings);
|
---|
516 | inherited;
|
---|
517 | end;
|
---|
518 |
|
---|
519 | function TTntStringGrid.CreateEditor: TInplaceEdit{TNT-ALLOW TInplaceEdit};
|
---|
520 | begin
|
---|
521 | Result := TTntInplaceEdit.Create(Self);
|
---|
522 | end;
|
---|
523 |
|
---|
524 | procedure TTntStringGrid.CreateWindowHandle(const Params: TCreateParams);
|
---|
525 | begin
|
---|
526 | CreateUnicodeHandle(Self, Params, '');
|
---|
527 | end;
|
---|
528 |
|
---|
529 | procedure TTntStringGrid.DefineProperties(Filer: TFiler);
|
---|
530 | begin
|
---|
531 | inherited;
|
---|
532 | TntPersistent_AfterInherited_DefineProperties(Filer, Self);
|
---|
533 | end;
|
---|
534 |
|
---|
535 | function TTntStringGrid.IsHintStored: Boolean;
|
---|
536 | begin
|
---|
537 | Result := TntControl_IsHintStored(Self);
|
---|
538 | end;
|
---|
539 |
|
---|
540 | function TTntStringGrid.GetHint: WideString;
|
---|
541 | begin
|
---|
542 | Result := TntControl_GetHint(Self)
|
---|
543 | end;
|
---|
544 |
|
---|
545 | procedure TTntStringGrid.SetHint(const Value: WideString);
|
---|
546 | begin
|
---|
547 | TntControl_SetHint(Self, Value);
|
---|
548 | end;
|
---|
549 |
|
---|
550 | function TTntStringGrid.GetCells(ACol, ARow: Integer): WideString;
|
---|
551 | begin
|
---|
552 | Result := UTF8ToWideString(inherited Cells[ACol, ARow])
|
---|
553 | end;
|
---|
554 |
|
---|
555 | procedure TTntStringGrid.SetCells(ACol, ARow: Integer; const Value: WideString);
|
---|
556 | var
|
---|
557 | UTF8Str: AnsiString;
|
---|
558 | begin
|
---|
559 | UTF8Str := WideStringToUTF8(Value);
|
---|
560 | if inherited Cells[ACol, ARow] <> UTF8Str then
|
---|
561 | inherited Cells[ACol, ARow] := UTF8Str;
|
---|
562 | end;
|
---|
563 |
|
---|
564 | function TTntStringGrid.FindGridStrings(const IsCol: Boolean; const ListIndex: Integer): TTntStrings;
|
---|
565 | var
|
---|
566 | idx: integer;
|
---|
567 | SrcStrings: TStrings{TNT-ALLOW TStrings};
|
---|
568 | RCIndex: Integer;
|
---|
569 | begin
|
---|
570 | if IsCol then
|
---|
571 | SrcStrings := FCreatedColStrings
|
---|
572 | else
|
---|
573 | SrcStrings := FCreatedRowStrings;
|
---|
574 | Assert(Assigned(SrcStrings));
|
---|
575 | idx := SrcStrings.IndexOf(IntToStr(ListIndex));
|
---|
576 | if idx <> -1 then
|
---|
577 | Result := SrcStrings.Objects[idx] as TTntStrings
|
---|
578 | else begin
|
---|
579 | if IsCol then RCIndex := -ListIndex - 1 else RCIndex := ListIndex + 1;
|
---|
580 | Result := TTntStringGridStrings.Create(Self, RCIndex);
|
---|
581 | SrcStrings.AddObject(IntToStr(ListIndex), Result);
|
---|
582 | end;
|
---|
583 | end;
|
---|
584 |
|
---|
585 | function TTntStringGrid.GetCols(Index: Integer): TTntStrings;
|
---|
586 | begin
|
---|
587 | Result := FindGridStrings(True, Index);
|
---|
588 | end;
|
---|
589 |
|
---|
590 | function TTntStringGrid.GetRows(Index: Integer): TTntStrings;
|
---|
591 | begin
|
---|
592 | Result := FindGridStrings(False, Index);
|
---|
593 | end;
|
---|
594 |
|
---|
595 | procedure TTntStringGrid.SetCols(Index: Integer; const Value: TTntStrings);
|
---|
596 | begin
|
---|
597 | FindGridStrings(True, Index).Assign(Value);
|
---|
598 | end;
|
---|
599 |
|
---|
600 | procedure TTntStringGrid.SetRows(Index: Integer; const Value: TTntStrings);
|
---|
601 | begin
|
---|
602 | FindGridStrings(False, Index).Assign(Value);
|
---|
603 | end;
|
---|
604 |
|
---|
605 | procedure TTntStringGrid.DrawCell(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState);
|
---|
606 | var
|
---|
607 | SaveDefaultDrawing: Boolean;
|
---|
608 | begin
|
---|
609 | if DefaultDrawing then
|
---|
610 | WideCanvasTextRect(Canvas, ARect, ARect.Left+2, ARect.Top+2, Cells[ACol, ARow]);
|
---|
611 | SaveDefaultDrawing := DefaultDrawing;
|
---|
612 | try
|
---|
613 | DefaultDrawing := False;
|
---|
614 | inherited DrawCell(ACol, ARow, ARect, AState);
|
---|
615 | finally
|
---|
616 | DefaultDrawing := SaveDefaultDrawing;
|
---|
617 | end;
|
---|
618 | end;
|
---|
619 |
|
---|
620 | function TTntStringGrid.GetEditText(ACol, ARow: Integer): WideString;
|
---|
621 | begin
|
---|
622 | Result := Cells[ACol, ARow];
|
---|
623 | if Assigned(FOnGetEditText) then FOnGetEditText(Self, ACol, ARow, Result);
|
---|
624 | end;
|
---|
625 |
|
---|
626 | procedure TTntStringGrid.InternalSetEditText(ACol, ARow: Integer; const Value: string{TNT-ALLOW string});
|
---|
627 | begin
|
---|
628 | if not FSettingEditText then
|
---|
629 | SetEditText(ACol, ARow, TntControl_GetText(InplaceEditor));
|
---|
630 | end;
|
---|
631 |
|
---|
632 | procedure TTntStringGrid.SetEditText(ACol, ARow: Integer; const Value: WideString);
|
---|
633 | begin
|
---|
634 | FSettingEditText := True;
|
---|
635 | try
|
---|
636 | inherited SetEditText(ACol, ARow, WideStringToUTF8(Value));
|
---|
637 | finally
|
---|
638 | FSettingEditText := False;
|
---|
639 | end;
|
---|
640 | if Assigned(FOnSetEditText) then FOnSetEditText(Self, ACol, ARow, Value);
|
---|
641 | end;
|
---|
642 |
|
---|
643 | procedure TTntStringGrid.WMChar(var Msg: TWMChar);
|
---|
644 | begin
|
---|
645 | if (goEditing in Options)
|
---|
646 | and (AnsiChar(Msg.CharCode) in [^H, #32..#255]) then begin
|
---|
647 | RestoreWMCharMsg(TMessage(Msg));
|
---|
648 | ShowEditorChar(WideChar(Msg.CharCode));
|
---|
649 | end else
|
---|
650 | inherited;
|
---|
651 | end;
|
---|
652 |
|
---|
653 | procedure TTntStringGrid.ShowEditorChar(Ch: WideChar);
|
---|
654 | begin
|
---|
655 | ShowEditor;
|
---|
656 | if InplaceEditor <> nil then begin
|
---|
657 | if Win32PlatformIsUnicode then
|
---|
658 | PostMessageW(InplaceEditor.Handle, WM_CHAR, Word(Ch), 0)
|
---|
659 | else
|
---|
660 | PostMessageA(InplaceEditor.Handle, WM_CHAR, Word(Ch), 0);
|
---|
661 | end;
|
---|
662 | end;
|
---|
663 |
|
---|
664 | procedure TTntStringGrid.ActionChange(Sender: TObject; CheckDefaults: Boolean);
|
---|
665 | begin
|
---|
666 | TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults);
|
---|
667 | inherited;
|
---|
668 | end;
|
---|
669 |
|
---|
670 | function TTntStringGrid.GetActionLinkClass: TControlActionLinkClass;
|
---|
671 | begin
|
---|
672 | Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass);
|
---|
673 | end;
|
---|
674 |
|
---|
675 | end.
|
---|