-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcopyttab.pas
150 lines (107 loc) · 3.26 KB
/
copyttab.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
unit copyTTab;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms,Controls, Graphics, ComCtrls,dialogs,StdCtrls;
type PTTabSheet = ^TTabSheet;
function SpawnNewTab(var PageControl: TPageControl;CloneIdx : integer; newName : string ; out page : TTabSheet; out Memo :Tmemo) : boolean;
implementation
// code from:
// https://forum.lazarus.freepascal.org/index.php/topic,37456.msg251745.html#msg251745
procedure CopyProperties(FromControl, ToControl: TControl);
var
TempMem: TMemoryStream;
FromName: string;
begin
FromName := FromControl.Name;
FromControl.Name := '';
try
TempMem := TMemoryStream.Create;
try
try
TempMem.WriteComponent(FromControl);
TempMem.Position := 0;
TempMem.ReadComponent(ToControl);
except
on E: Exception do
begin
ShowMessage( 'Error: '+ E.ClassName + #13#10 + E.Message );
end;
end;
finally
TempMem.Free;
end;
finally
FromControl.Name := FromName;
end;
end;
function CloneControl(FromControl: TControl): TControl;
var
C: TControl;
begin
Result := TControlClass(FromControl.ClassType).Create(FromControl.Owner);
if FromControl.Name <> '' then
Result.Name := FromControl.Name + '_';
CopyProperties(FromControl, Result);
if FromControl is TWinControl then
for C in TWinControl(FromControl).GetEnumeratorControls do
CloneControl(C).Parent := TWinControl(Result);
end;
//////////// Implementation for PobierakYT///////////////////////////////////////////////////
function _StripUnicode(const Input: string): string;
var
i: integer;
begin
Result := '';
for i := 1 to Length(Input) do
if Ord(Input[i]) < 128 then
Result := Result + Input[i];
end;
function _StripWrongChars(const Input: string): string;
var
i: Integer;
begin
Result:='';
for i := 1 to Length(Input) do
begin
if Input[i] in ['0'..'9', 'A'..'Z', 'a'..'z'] then
Result := Result + Input[i];
end;
end;
{function CloneTabEx(FromControl: TControl; newName : string): TControl;
var
C: TControl;
begin
Result := TControlClass(FromControl.ClassType).Create(FromControl.Owner);
Result.Name := newName;
CopyProperties(FromControl, Result);
if FromControl is TWinControl then
for C in TWinControl(FromControl).GetEnumeratorControls do
CloneControl(C).Parent := TWinControl(Result);
end; }
function SpawnNewTab(var PageControl: TPageControl;CloneIdx : integer; newName : string ; out page : TTabSheet; out Memo :Tmemo) : boolean;
var
safeName : string; // component name stripped from special characters
i:integer;
begin
safeName := 'C'+_StripUnicode(newName);
safeName := _StripWrongChars(safename);
//page := CloneTabEx(PageControl.Pages[0],safeName ) as TTabSheet;
page := CloneControl(PageControl.Pages[0] ) as TTabSheet;
page.PageControl := PageControl;
page.Parent := PageControl;
for i := 0 to page.ControlCount-1 do
begin
page.Controls[i].name := safeName +'___' + inttostr(i);
page.Controls[i].Parent := page;
if ( page.Controls[i] is TMemo ) then
begin
Memo := page.Controls[i] as TMemo;
break;
end;
end;
Memo.Lines.Clear();
page.Caption := newName;
PageControl.ActivePage := page;
end;
end.