Sequal suggest:

* add combo box with recent prompts
* add Sequal logo with link in lower corner of dialog
* remove port number from API url
* unify user agent
* remember form dimensions and last prompt
This commit is contained in:
Ansgar Becker
2023-05-08 07:10:31 +02:00
parent d5acd1358a
commit 184b064f1b
5 changed files with 413 additions and 33 deletions

View File

@ -2,40 +2,138 @@ object SequalSuggestForm: TSequalSuggestForm
Left = 0
Top = 0
Caption = 'SequalSuggestForm'
ClientHeight = 292
ClientWidth = 418
ClientHeight = 361
ClientWidth = 484
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'Segoe UI'
Font.Style = []
Position = poOwnerFormCenter
OnClose = FormClose
OnCreate = FormCreate
OnShow = FormShow
DesignSize = (
418
292)
484
361)
TextHeight = 15
object Label1: TLabel
object imgSequalLogo: TImage
Left = 8
Top = 8
Width = 34
Top = 328
Width = 90
Height = 25
Cursor = crHandPoint
Hint = 'https://sequal.dev/'
Anchors = [akLeft, akBottom]
Picture.Data = {
0954506E67496D61676589504E470D0A1A0A0000000D494844520000005A0000
00190806000000B16439C0000000017352474200AECE1CE90000000467414D41
0000B18F0BFC6105000000097048597300000EC300000EC301C76FA864000009
B24944415478DAED980B5094D71580775960792D8BB0A202BEAA5551A4152546
69699D248A48126C498C89557CA68D54273144D2888DC4884D529BD64E9292D2
181363EA23A6254A2198061A47298528A22286C1CAF09087BC9F02DBEFC2FD37
BF2B558648653ADC993BFBEFDD7BCE3DE73BE79E7BFFD56A86DAFFA469EFB601
83BD8D1B372EB2BABAFA41F16C6B6B7BA4A6A6E6FDFEE819027D9B3672E4C8B7
CBCBCBD788673B3BBBDDD7AF5FDFD01F3D43A06FD300FD06A07F269E01BD0BD0
9BFAA36708F46DDA80811E3B76ECB8FAFAFAD9CDCDCDDE3A9D4EE3E0E050EAEC
EC7CAAB8B8F8F2AD148D183162727B7BFB9C969616935EAF6F4236372222222B
2121A1FD56721E1E1E414D4D4D336C6C6CEC0D06C3B9AB57AFA6C4C5C5D9C6C7
C707A3CB9E296DF413F4F63367CE6867CF9E3DA7B5B5D595F962CDECB2B2B24A
2B9513E9DF96CF85F402EB35BDBCBC46E1DF9CB6B6B6B15A1A3E96D8DBDB6702
F4261FFB0BBA3A628FB7C646DBE0716045FD0DA0E7CF9FEF989E9EFE724747C7
DAAEAE2E17B3D9DC1309AD5683534D8E8E8E6F6ED9B2E5F99898980EB5C2F1E3
C7BB959494FC1AB965C8D92BE3020486E512A40DD7AE5D4BB736047D3E9D9D9D
7F42EE01E42C3204E8A3A0A0A05F6466666601DAC0701D7D12BD02D03A409F05
B4AF04FD10A093AC546FA7BF209F77D12D6056AF5E6DBB6FDFBE5F022B8A35DD
AC7D04F85E4F4FCF4D4545452DDF0474D5C284683EB6D14B21FCA8E9D8BA1C0B
6816791707962B0BE370218B77A178220689C00B38BBC804CB42A3478F369496
96FE0D60731550F472E63B33669063AD6E6E6E0B81FDB92AFB8D9595951938EB
AF8CA1BF8D6ECB988EF929D812487717C9419FAA02FD25E3D325E830401FB5F2
338E1E2B9F5FA347AB7C4C447695CAC7521E31B573B4029D39EF33E727FD055D
FD50A287B9BD43EC24A374EC0353F2BA27B4D2F1E9387E0627B522B26CE127C2
C2C292030303BB76EEDC195255557590CC73C0B076223E05E78A6456BE4ED66D
94469C462ECAC7C7278F60182835EBD99A31E237B6E5B979F3E6CD4A49496915
DF9D9C9C763267B374B893EF2FA27B3FFAF4757575AB917B46715C82F6A557F6
11B4C8A4ADD6A0B1EB7EE67E0A5411FC06D65C191010904A503BD8C93F6A6868
7807FFED845E7777F719F87CBA3FA06B567FE8D059569FA9E932F724918DF605
327A87562A5B545151F189D8C240C9A7D6FAAA85870F1F1E06504FEE91C53897
79F1E2C57A5F5F5F9F4B972EE511002390AAA87B01C02D56CB51AB0F022D4264
0F8E2DA2161F0394212727270F83C748E82F017DAB5A0EE07B586FC59D043D71
E2442F7C9C85BD93B0F73C608F59D99A8EADC172FDC7597F7F7F40CBAC9E6CBE
DEB15EA3B329B6313AFECE7DDFB2B69B325A96883D2E2E2E8946A3311F9855BD
29E3108BA01C1C14994770FE02B0C76A6B6B1DE5CF426F33C6AFC0F8B724D05F
0134861D1140B6FC4BAC85C3CDDEDEDE7E57AE5C2952EB36994C41E8FE42D6EE
3B02BAB7E6EFEF6F601D23764DE102904810C6C89F44097DAFBFA07B6B961A0D
DC778862A4F25DD6DB4A7A010B9C00D4018291ADFC4E2D7B16875F955F9BE90D
428C6E56E9D76B64AD62FE7EE63F4EF04271EAA808107A0B2951D38F1C39D2A2
368AECF3B97CF9F2791C37DC49D0AB56ADB23B7CF8F0C3C82F62FD69047214DD
9D672759AACC92C9C0810E0909B1CFC8C8D88CA235D4B131CA4D4005DE4C0DDE
410DDD228744FD8DEF56429DE5F70ECDCDD7456178A78823FD5DF4AE04781859
9E241C43EEECA4499366508A3AD5429C0D5E403D4F0933DE0A3410C2388CFB04
9AF2E7CE8E3B44F0E659DD361AE9F98C7B323EF019ADB4B973E73A512EFC8131
13A5B3E8F761C468095BE3EAEA1A82C1295CDBA2A8B9BBC53825E200D7BC8DD4
3D27CDD719AD9590B1DFACE3B31128951C34C1353535E9C2594A47D9840913A6
161414D4AA6D107772764FAEBC2E5A409F3A754AC7A1FA253B6FBA8084AED0EA
EAEA64B52C656C07017ADE1A34A5F08DC6C6C66E609C359709F8ABE2EE3C6CD8
B0B2C2C24271FB38407F6440412F58B0C0961705478C36723A5F3B79F264B332
813AE6969F9F9F86F133C57740BFC2D6DFCCE7F7019B214B401606DC63AD7CF1
E2C576172E5C30646767D71298EE2D326AD4A831AC950744838085A321D4C914
B51C63510473B7CC3C0B6871CDA4C46591D1DDB650CE9EA2BEBEA99605E0DFF9
FD876AD0B1B1B13A5E804E93307E624D6E1ADF23D827D472EAC370C040032D1A
839FC3111716FC33CF9156C6A761FC7D72EE5640BFC416D6033007E3A7CA03F4
E7C8FD5E9191500E60D80232B71628CF88AD2BB3EE530277BF74F0B49F9FDF42
74952BD94CC03F43AF975465012DE777DF6494CCA49C3D08B43C6ABDE3F1E3C7
A3C9F66D2AD3BB41878787DB262525E552BA7CB1D5CC417E8F389095492269C8
F634D50BD78081160B891788EEBA05D8839489249E75287E18C7C2C53CC6DA31
7216DBFAACF84E663C06F4FD8A1C003F66F873F1568B53E1C8DE2BE601BA869B
C477C9E42BE23B5BFE01A0A72AE700C0AE88608A7B2C010D63C8D9DCD3F4D6A0
29014B28591F2A7556D458D6CBA38F64CD71AC75892029AFE096D241A045023D
2A81E5A1E737C85E253001ACB9097D46D5DDFD1B81AE0AF943281F62AD76AE78
F1A6A36B8B2C359ACC88C68157AC0F41A509C818FB2401D9A31EE716B199B178
9CECF50F2A71C746F752C0A6A9C709522C418AEBE5D015017B0AE75FE4ABA735
6865A7F07B442F6B1DE2F753E87C4D0EBD4E7F5A3C708DFC0E81163BC5DD9265
24873C2B7208761909B548FEB492BE47824E00F45A09BA4F7F93568526ECE285
E56991C65A3BDD648FBFAE29B8010E77DC1F00FBA7280BC000770CEEC2F12AFA
3FC47F1DC03AD39B624EF4D9C05E0FEC7B11198603E2067215C33E2310BFE50A
F6EFDEE4D81D61ACB70199690220EB7C452DDF26D661EC2B4DCFD5F006D0A205
0505D97103D9889D4B58D3035075ACF53137A2389E4398F29C9CBA8FFE47458E
5D358DF562919B837E67E636B0661A7EC760E323046189A6E7307F997E5C828E
02F48F25E80F907DBB0FA0DF03F4324017699DF57E1E87229B7BCDC2E5CB97EB
7373730D386C0E0E0EAEDBBB776FC7ED948BB674E9523D6F7D0660756EDFBEBD
2E3434B4AB2F72DC248C044A9B9595A5DC3EBCE9E7E9AEBD8156375EA39DA8EF
AD04B74F6B893673E64C97929212470EFAE6D4D4D4A6BECAF5B5552D4CF882AD
12C496F9C894BCAE3B4883F5FF6801FA9CE6BF64F4606ED5E18946735BC779F6
8597C646BBC6746C5DA2181F027D871B652390B2F14F8D785BB6B59962FA646D
F7FF3F8315B48FA6E74F7B71DD125BFB5BF48ABB6D545F1AA09702FA2DC81E31
253F19A98C0F4AD0DC52C4CD40FC8F22FEEB1075FB595E8EEAEFB65D7D695CED
1C3422416C6D5AC8E6EBCAF8A004FDFFD8FE03833BE76573FF7FB80000000049
454E44AE426082}
OnClick = imgSequalLogoClick
end
object lblRecentPrompts: TLabel
Left = 8
Top = 11
Width = 87
Height = 15
Caption = 'Label1'
Caption = 'Recent prompts:'
end
object memoPrompt: TMemo
Left = 8
Top = 32
Width = 402
Height = 89
Top = 37
Width = 468
Height = 84
Anchors = [akLeft, akTop, akRight]
EditMargins.Auto = True
Lines.Strings = (
'Give me column a, b and c from table foobar')
ScrollBars = ssBoth
TabOrder = 0
WantTabs = True
WordWrap = False
end
object btnGenerateSQL: TButton
Left = 288
Left = 354
Top = 127
Width = 122
Height = 25
@ -47,8 +145,8 @@ object SequalSuggestForm: TSequalSuggestForm
object memoGeneratedSQL: TSynMemo
Left = 8
Top = 158
Width = 402
Height = 95
Width = 468
Height = 164
SingleLineMode = False
Anchors = [akLeft, akTop, akRight, akBottom]
Font.Charset = DEFAULT_CHARSET
@ -80,8 +178,8 @@ object SequalSuggestForm: TSequalSuggestForm
FontSmoothing = fsmNone
end
object btnExecute: TButton
Left = 288
Top = 259
Left = 354
Top = 328
Width = 122
Height = 25
Anchors = [akRight, akBottom]
@ -92,8 +190,8 @@ object SequalSuggestForm: TSequalSuggestForm
OnClick = btnExecuteClick
end
object btnClose: TButton
Left = 207
Top = 259
Left = 273
Top = 328
Width = 75
Height = 25
Anchors = [akRight, akBottom]
@ -103,8 +201,8 @@ object SequalSuggestForm: TSequalSuggestForm
TabOrder = 4
end
object btnHelp: TButton
Left = 126
Top = 259
Left = 192
Top = 328
Width = 75
Height = 25
Anchors = [akRight, akBottom]
@ -112,4 +210,15 @@ object SequalSuggestForm: TSequalSuggestForm
TabOrder = 5
OnClick = btnHelpClick
end
object comboRecentPrompts: TComboBox
Left = 136
Top = 8
Width = 340
Height = 23
AutoDropDownWidth = True
Style = csDropDownList
Anchors = [akLeft, akTop, akRight]
TabOrder = 6
OnSelect = comboRecentPromptsSelect
end
end

View File

@ -5,7 +5,8 @@ interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, SynEdit, SynMemo, extra_controls, apphelpers,
IdHTTP, IdSSLOpenSSL, System.JSON, dbconnection;
IdHTTP, IdSSLOpenSSL, System.JSON, dbconnection, Vcl.Imaging.pngimage,
Vcl.ExtCtrls;
type
TSequalSuggestForm = class(TExtForm)
@ -14,14 +15,18 @@ type
memoGeneratedSQL: TSynMemo;
btnExecute: TButton;
btnClose: TButton;
Label1: TLabel;
btnHelp: TButton;
imgSequalLogo: TImage;
comboRecentPrompts: TComboBox;
lblRecentPrompts: TLabel;
procedure btnHelpClick(Sender: TObject);
procedure btnGenerateSQLClick(Sender: TObject);
procedure btnExecuteClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure imgSequalLogoClick(Sender: TObject);
procedure comboRecentPromptsSelect(Sender: TObject);
private
{ Private declarations }
FConnection: TDBConnection;
@ -68,6 +73,7 @@ var
JsonBodyStr, JsonResponseStr: String;
JsonBodyStream: TStringStream;
JsonTmp: TJSONValue;
ComboIdx: Integer;
begin
// Call suggest API
HttpReq := TIdHTTP.Create;
@ -76,6 +82,7 @@ begin
SSLio.SSLOptions.SSLVersions := [sslvTLSv1_1, sslvTLSv1_2];
HttpReq.Request.ContentType := 'application/json';
HttpReq.Request.CharSet := 'utf-8';
HttpReq.Request.UserAgent := apphelpers.UserAgent(Self);
JsonBodyStr := '{"prompt": '+JsonEncode(memoPrompt.Text)+', "type":'+JsonEncode(EngineType)+'}';
//showmessage(jsonbodystr);
@ -83,7 +90,7 @@ begin
try
Screen.Cursor := crHourGlass;
JsonResponseStr := HttpReq.Post('https://api.sequal.dev:2000/simple-suggest', JsonBodyStream);
JsonResponseStr := HttpReq.Post('https://api.sequal.dev/simple-suggest', JsonBodyStream);
JsonTmp := TJSONObject.ParseJSONValue(JsonResponseStr);
memoGeneratedSQL.Text := JsonTmp.FindValue('data').Value;
btnExecute.Enabled := Length(Trim(memoGeneratedSQL.Text)) > 0;
@ -95,6 +102,15 @@ begin
end;
HttpReq.Free;
JsonBodyStream.Free;
// Add to recent prompts if not already done
ComboIdx := comboRecentPrompts.Items.IndexOf(memoPrompt.Text);
if ComboIdx = -1 then
comboRecentPrompts.Items.Insert(0, memoPrompt.Text)
else if ComboIdx > 0 then
comboRecentPrompts.Items.Move(ComboIdx, 0);
comboRecentPrompts.ItemIndex := 0;
Screen.Cursor := crDefault;
end;
@ -104,26 +120,51 @@ begin
ShellExec('https://sequal.dev/our-plans');
end;
procedure TSequalSuggestForm.comboRecentPromptsSelect(Sender: TObject);
begin
memoPrompt.Text := comboRecentPrompts.Text;
end;
procedure TSequalSuggestForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
// Store GUI setup
AppSettings.WriteIntDpiAware(asSequalSuggestWindowWidth, Self, Width);
AppSettings.WriteIntDpiAware(asSequalSuggestWindowHeight, Self, Height);
AppSettings.WriteString(asSequalSuggestPrompt, memoPrompt.Text);
AppSettings.WriteString(asSequalSuggestRecentPrompts, Implode(DELIM, comboRecentPrompts.Items));
end;
procedure TSequalSuggestForm.FormCreate(Sender: TObject);
begin
HasSizeGrip := True;
Caption := MainForm.actSequalSuggest.Caption;
end;
procedure TSequalSuggestForm.FormShow(Sender: TObject);
var
RecentPromptsText: String;
RecentPromptsList: TStringList;
begin
// Restore GUI setup
Width := AppSettings.ReadIntDpiAware(asSequalSuggestWindowWidth, Self);
Height := AppSettings.ReadIntDpiAware(asSequalSuggestWindowHeight, Self);
RecentPromptsText := AppSettings.ReadString(asSequalSuggestRecentPrompts);
RecentPromptsList := Explode(DELIM, RecentPromptsText);
comboRecentPrompts.Items.AddStrings(RecentPromptsList);
FConnection := MainForm.ActiveConnection;
memoPrompt.Text := 'Write me a '+EngineType+' query to select column a, b and c from table foobar';
memoPrompt.TextHint := 'Write me a '+EngineType+' query to select column a, b and c from table foobar';
memoPrompt.Text := AppSettings.ReadString(asSequalSuggestPrompt);
if Length(Trim(memoPrompt.Text)) = 0 then
memoPrompt.Text := memoPrompt.TextHint;
comboRecentPrompts.ItemIndex := comboRecentPrompts.Items.IndexOf(memoPrompt.Text);
end;
procedure TSequalSuggestForm.imgSequalLogoClick(Sender: TObject);
begin
// Logo clicked
ShellExec(TControl(Sender).Hint);
end;
procedure TSequalSuggestForm.btnExecuteClick(Sender: TObject);

View File

@ -216,7 +216,7 @@ type
asFileDialogEncoding,
asThemePreviewWidth, asThemePreviewHeight, asThemePreviewTop, asThemePreviewLeft,
asCreateDbCollation, asRealTrailingZeros,
asSequalSuggestWindowWidth, asSequalSuggestWindowHeight,
asSequalSuggestWindowWidth, asSequalSuggestWindowHeight, asSequalSuggestPrompt, asSequalSuggestRecentPrompts,
asUnused);
TAppSetting = record
Name: String;
@ -407,7 +407,7 @@ type
function DirSep: Char;
procedure FindComponentInstances(BaseForm: TComponent; ClassType: TClass; var List: TObjectList);
function WebColorStrToColorDef(WebColor: string; Default: TColor): TColor;
{function GetCurrentUserSID: String;}
function UserAgent(OwnerComponent: TComponent): String;
var
AppSettings: TAppSettings;
@ -3114,6 +3114,18 @@ begin
end;
function UserAgent(OwnerComponent: TComponent): String;
var
OS: String;
begin
if IsWine then
OS := 'Linux/Wine'
else
OS := 'Windows NT '+IntToStr(Win32MajorVersion)+'.'+IntToStr(Win32MinorVersion);
Result := APPNAME+'/'+MainForm.AppVersion+' ('+OS+'; '+ExtractFilename(Application.ExeName)+'; '+OwnerComponent.Name+')';
end;
{ Get SID of current Windows user, probably useful in the future
function GetCurrentUserSID: string;
type
@ -3488,17 +3500,11 @@ var
BytesInChunk, HeadSize, Reserved, TimeOutSeconds: Cardinal;
LocalFile: File;
DoStore: Boolean;
UserAgent, OS: String;
HttpStatus: Integer;
ContentChunk: UTF8String;
begin
DoStore := False;
if IsWine then
OS := 'Linux/Wine'
else
OS := 'Windows NT '+IntToStr(Win32MajorVersion)+'.'+IntToStr(Win32MinorVersion);
UserAgent := APPNAME+'/'+MainForm.AppVersion+' ('+OS+'; '+ExtractFilename(Application.ExeName)+'; '+FOwner.Name+')';
NetHandle := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
NetHandle := InternetOpen(PChar(UserAgent(FOwner)), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
// Do not let the user wait 30s
TimeOutSeconds := FTimeOut * 1000;
@ -3876,6 +3882,8 @@ begin
InitSetting(asMySQLBinaries, 'MySQL_Binaries', 0, False, '');
InitSetting(asSequalSuggestWindowWidth, 'SequalSuggestWindowWidth', 500);
InitSetting(asSequalSuggestWindowHeight, 'SequalSuggestWindowHeight', 400);
InitSetting(asSequalSuggestPrompt, 'SequalSuggestPrompt', 0, False, '');
InitSetting(asSequalSuggestRecentPrompts, 'SequalSuggestRecentPrompts', 0, False, '');
// Default folder for snippets
if FPortableMode then

View File

@ -3608,6 +3608,7 @@ object MainForm: TMainForm
object actSequalSuggest: TAction
Category = 'Tools'
Caption = 'Sequal Suggest'
ImageIndex = 206
OnExecute = actSequalSuggestExecute
end
end
@ -4275,6 +4276,9 @@ object MainForm: TMainForm
object menuSQLhelp2: TMenuItem
Action = actSQLhelp
end
object SequalSuggest2: TMenuItem
Action = actSequalSuggest
end
object menuQueryInsertFunction: TMenuItem
Caption = 'Insert function'
ImageIndex = 13
@ -17396,6 +17400,107 @@ object MainForm: TMainForm
C148B94B201F1348EF3F70B70BFC3F9C434FDE627F724C0000000049454E44AE
426082}
end>
end
item
Name = 'logo-sequal'
SourceImages = <
item
Image.Data = {
89504E470D0A1A0A0000000D494844520000006400000064080600000070E295
54000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
00097048597300000EC300000EC301C76FA86400000B4249444154785EED9D0B
70D4C51DC777F7FFB8BBDC25B93CA1098F189022CA432108C2A430CC54A88EA3
8D8E7D286AA7D551A9D65A6DED3843B5B5763A0547ADD23AB6B5B454C4DA6955
AC561115AD4880040AA8A00984242610925CEEFD7F6D7FBFBDA48356920BE8B8
7F673F3397BDDD7BCCFEF7BBBFC7FE33B74B140AC530D0C1D297A49E6C66E90D
CDD46E3CCC597998D0804EB8ED12F7FD1E125A5E47C3D7CDE7C6D431DEE0DB15
9F16E917DE61FD373EA50F56872576C746DDDAD6E69B89E73B0B89AFDAAC15DE
BAD8C5E75653476DEA0F6F9DC32A23DFF3BAE2A63790F15824C0F5A99526AB88
3C1CFADAD95B29A57BF1BDD9AD87B4C0BC89E27332E32B41120FBCA6476EAA77
3CC7AD4EDCF3D2EDCEFB3DD77A7DE920C93A84B0E32EC5E3841607895E534ACC
F935EB83974CBF0684C9C4EE7A8115AF3C5F6A17E61B41926B1BF5F0F23AC7DA
DDB920FD44D3ABF68E768D3830B61A7508A56CF06D39F0AA1CCF8378C25834C4
8C59D5AF16AE3CFF6A10E5E0C0AA5758D1AD8BA415C51782A49FDAA5851A66BA
F6DEAEF3926BDED80225A3A66E1346208A0F730D6835B66B138D19C10BA625C3
2B168E05511256639B66D64D90D27D7D78664988D5DCC1500CCEF9B4F486A6D7
ED3D2046D070410663583110705D446706944EE6E93DE1C47DAF6E84EF294031
9CC37D524E46E90589FDE01FA24C3DD6F8636B7B3BA5A66613C235D1980FA009
5888CEC181D94D1DF5D94D07EEC6E6E4EFDE92F2DAA51624FBF20156F1D20D9E
97CCCEB11BDBBEC9D396185C31C8A38183290574DD3DDC47ECA6F66F8395448A
7FB2D4B577774A6725520B62ED6817FD4BFD6567BDDB93249431B48E931B4414
45873C605F77B1DDDCB1189B20964877FD725BC8E603A2CC6C684EF0810CC603
3A6AEB1802E30D85DC0BBEC73B9ABC4434651C6521F9E2B4F4D0F2E7AE75C0BD
68C10BCFBC915B90147D34BD1D2D906261A0775A8F25B0EA75C745B34C482B08
C7C55E8E0009EAB522633AF5349DA385F1941D14155BBECC575A418C33C6F216
720983499D72F6763D0CD9158C203FD5051DC358A28D2B3E88151A099CAC03FC
D4903A8694DDF91DD13FC8905A686100D715A73280F859460CCDCA6E697D041B
9C03479520A3C1985925062C78E9CC340DC13AD0F520309FA4D782CFA18B32CE
1A1B8FDE7FB1F8DEC84DF54A90D1C0D3B67051817327AED5C645F78214E8B746
EFF85143D773698149E0713FB8C1637DD73DA99BE78C53828C86F0F23A9E5CDB
2856E5A1CB66DEAB4DA900911CEF437776F3C30577A79B75E31391DB163F800D
A1AF4E57F7B24E0610C57D0DE6B8397BFC3A637AD51A561931C0726C7041F9CE
6E07DEAF6993CB49E8AABACBC03A62B195FF64C1F3A74A671D88F482200B8E8A
650389DCB0E00698E5BFD1AA8A0D62BBB8A6C05BEFB0E43BCE62F069AEEEC1EB
C23220161173EE842F1BA7953DDFF7ADC7B5E2BB96A9DBEFA78AB5AB939A8341
3EB5BEE9CECC73FB6E81D57BA917CF62FEE4520D5440215C8F70C7E334A86BD4
D489565BBA3D7C73FD0F8DDAF297E3F7BD6214DEB2C8165F2829BE1104C96E3D
44930FBEC64AD75DE9C24A7E56F6E5F7565A3B0ECF218E378EC7329885115A14
242C1A021FA76D63E5917B0A6F5BFC347E3676FBD37AF12F2FFADF6A53567C25
C810F1559BF5C25B178BC1E59C7F21F3ECDE49F6F6768B272DAA9F5DCD834BA7
6A5A59F84D7CBD9534D0CA3FDFC1C257CC9132887F6E88AFDECC067EB1C918AC
7E2C033F7B31FFFF9B48822F2DE478C06551ABA983B9FBBAB997B1890EA9B139
6F223567557B346848994929140A8542A15028140A8542A15028140A8542A150
28140A8542A15028140A8542A15028140A8542E16F7CF77384F8AF36537BF707
A3EB39E784150649F4A106F5F304C5E8F09D852437EC8AD8BB3A74E8795EB31D
2F1037E4D022015E78C792815CABBCF8469023F3EF67956FDEEC0DDCF5C2267B
77673DA1340E233DF2CFBA29C59F47076951B03DB8E4F4E90557CEC9F6DFF857
1A7DE85229DD972F7EA72EB0723FA0753B63C53C9ED5793C53C213D9E2111FF1
6C098FA543ACD08C86AE982DBE439B542E4A19F18F2083F31906D8115B6B50B1
5F2F6E1A30FC8351173FCA2A0AF107A0E27AF5DA322CA4C4378204164D12EED5
EB4D0DEDC280F53C1E3CB7AF03257B28A5697CAA8D8F622125BE10C439D8CB8A
575F8C7BF72ED42795CD17BBCDE5BBDD1F271E3175DCE1F48F583D76F95ADD9C
3D5ECAF881F84210880562927B3DC931C400CF837B9CE42C6064701FF8A04ECC
793521AC6A151169C540FC612187FB73E5C15E9BA76CE8F5F1BBCD0C033A2CD7
E3341220C6DC09016CD26755E5F7D9CF085F08029955AE3CD447D15D51B15F56
1E139D4300D1186EE734A0D7966ECCB59DF2BE8D9F2AFE10A4B53757BEDFC360
70D142443D0F30D3424BE9366756BF8B0DA9DF6F532EEB54715B8F8932F3ECBE
244F5AD06BE8763EC38ABA791ED14F2B33212110D75A70751D16D2E20B41E2EB
FE25863FD4306329C1BD76F336104A380475ADA6C4829457B82AF3DC89E21559
F1852013C99FC460B2F2F0C59835C138E72789E771163689DBD6BF1AAB3DCB1E
D1CC59D5CA657D52D8EF1E4988F89197BBC26D6121C32A2D20E6C2D3C41E8105
CBE7889764C61782F45FFFA4B008B7A53717A4F301B2296A309D0F645B82174C
FBBB68B2F08C24B9915E10FB3F9D5A74CD659CA7ADA5B4C09801838AA2E4D76F
B0247D4A05C68F443BB99E86AF9A2BB5BB42A417C469CB2D0AED3D5D55E20918
CA60393C6848B8CF7B4DA9D8E7BD9DACC1427AE417645F9728B35B5A523C9E25
B0D083DA08131DC5B05C8F8D29C4DA6FF1CF99AB5F91FE5A11E93B995EDF2C4A
AFBDBFC28B6708D120AA8FE478F086229E3B95B00E99F593C46698AC3C227DFC
40A416C46AEEA0953BBE8F77799936B9FC169E76A0C77945758833103FCE18D3
6B4E1BD3DD7BF95A2DBC7C8EF4F103915A90A135032EEA9C3D5D2ED5A1BBF99C
58816F3134A24FAD14F7AF9C9663BE1003915A90F4337B45FFDC23F1D95E6FAA
5A8831D2A210D71F9643B5AA62A27FB1E2196C2ABC7B693E562505520B421C4F
F4CF79AF6711A4BC21EE7AB618F1E1C0F547004C29EBEC0CCCABD9B69F2CA0A1
6567F8661365A905C96EDA2FCAF4134D71B0103CF60EA67F7E2E8B5515BD844F
2BAE5921F7A4FB08D276D669EFA7D15F37E0296DBA3EB9FCBB5E4C645823F717
FF21150DE17BD7639516057D133F106905C96C7C7BF019E1EE07F131F9AD3F28
E78EA769630B63453F5D96C4A6F08A85E225BF20AD20BC3F256285F376F778E7
9D23C6E04DC5E1E38707F12364106D42740B6466FB633F7A56374EAFF0C5FA63
086905D1C64545DF9CD6DEAFC32047C115392366589C533C670A5CDC3A51B55D
5F8981482B48E2C1D7857F72767716F14476E4153ABA2BDB657A6DA91DBCE8AC
D7B1A9E01BE78897FC849482D8FB8FD0CAAD37E30ABD04ACE37AAF3F8DE7E00E
DFD7417745187B14DC557BCF858F6AE6ECF1CA423E09528F358A32BBB52D69BF
DDED0D9EF229DA4E08E71AAC3FE08AA838854DAF29F1557635849482B0F2B088
15947B4BBC238912B1161C7E788525B08AC8CEA27BBED28ACFF519B9F3AAFC86
948250531727E3D8BB3ABF04AE0A67BF3D6C404777556010F3BC9ACDE0AEB203
3F7FD1885C3B5F09F249E0F5246864C54271929AB3FFE8143E143F4E34BC18EA
3DAED3920248774B1E134D86E6DBF3A6A413C4DAD3252C01027A198B862E82CC
69E8FFE8E8963EE6411D8C2F7A6DD981C0E2C9E25E4BA861862FAD03914E10BB
A95D94D61BAD673A078E6AB042A7C4E51A0C3A1EBDFDFF0FC73568D884E53CBF
17DC95155BF9BCAED796FB569013FBE5CF086BDB21CD9C3BD175DEEBB9D3DADE
7605B7DC63903941FAF4B14E8B832806A4BB7DA186991762FCC86EDA4F034BA6
F856102949ADDF39EA8992FADB6EE926D7C920ED4564FFDD4AFBAF7E9CBA5D71
3CB5F304692F364254B75D5235702FC6148542F1398690FF029A8D9B27B85043
410000000049454E44AE426082}
end>
end>
Left = 593
Top = 339
@ -18422,6 +18527,21 @@ object MainForm: TMainForm
CollectionIndex = 203
CollectionName = 'server-interbase'
Name = 'server-interbase'
end
item
CollectionIndex = 204
CollectionName = 'server-firebird'
Name = 'server-firebird'
end
item
CollectionIndex = 205
CollectionName = 'server-rds-mysql'
Name = 'server-rds-mysql'
end
item
CollectionIndex = 206
CollectionName = 'logo-sequal'
Name = 'logo-sequal'
end>
ImageCollection = ImageCollectionIcons8
ImageNameAvailable = False
@ -25573,6 +25693,107 @@ object MainForm: TMainForm
C148B94B201F1348EF3F70B70BFC3F9C434FDE627F724C0000000049454E44AE
426082}
end>
end
item
Name = 'logo-sequal'
SourceImages = <
item
Image.Data = {
89504E470D0A1A0A0000000D494844520000006400000064080600000070E295
54000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
00097048597300000EC300000EC301C76FA86400000B4249444154785EED9D0B
70D4C51DC777F7FFB8BBDC25B93CA1098F189022CA432108C2A430CC54A88EA3
8D8E7D286AA7D551A9D65A6DED3843B5B5763A0547ADD23AB6B5B454C4DA6955
AC561115AD4880040AA8A00984242610925CEEFD7F6D7FBFBDA48356920BE8B8
7F673F3397BDDD7BCCFEF7BBBFC7FE33B74B140AC530D0C1D297A49E6C66E90D
CDD46E3CCC597998D0804EB8ED12F7FD1E125A5E47C3D7CDE7C6D431DEE0DB15
9F16E917DE61FD373EA50F56872576C746DDDAD6E69B89E73B0B89AFDAAC15DE
BAD8C5E75653476DEA0F6F9DC32A23DFF3BAE2A63790F15824C0F5A99526AB88
3C1CFADAD95B29A57BF1BDD9AD87B4C0BC89E27332E32B41120FBCA6476EAA77
3CC7AD4EDCF3D2EDCEFB3DD77A7DE920C93A84B0E32EC5E3841607895E534ACC
F935EB83974CBF0684C9C4EE7A8115AF3C5F6A17E61B41926B1BF5F0F23AC7DA
DDB920FD44D3ABF68E768D3830B61A7508A56CF06D39F0AA1CCF8378C25834C4
8C59D5AF16AE3CFF6A10E5E0C0AA5758D1AD8BA415C51782A49FDAA5851A66BA
F6DEAEF3926BDED80225A3A66E1346208A0F730D6835B66B138D19C10BA625C3
2B168E05511256639B66D64D90D27D7D78664988D5DCC1500CCEF9B4F486A6D7
ED3D2046D070410663583110705D446706944EE6E93DE1C47DAF6E84EF294031
9CC37D524E46E90589FDE01FA24C3DD6F8636B7B3BA5A66613C235D1980FA009
5888CEC181D94D1DF5D94D07EEC6E6E4EFDE92F2DAA51624FBF20156F1D20D9E
97CCCEB11BDBBEC9D396185C31C8A38183290574DD3DDC47ECA6F66F8395448A
7FB2D4B577774A6725520B62ED6817FD4BFD6567BDDB93249431B48E931B4414
45873C605F77B1DDDCB1189B20964877FD725BC8E603A2CC6C684EF0810CC603
3A6AEB1802E30D85DC0BBEC73B9ABC4434651C6521F9E2B4F4D0F2E7AE75C0BD
68C10BCFBC915B90147D34BD1D2D906261A0775A8F25B0EA75C745B34C482B08
C7C55E8E0009EAB522633AF5349DA385F1941D14155BBECC575A418C33C6F216
720983499D72F6763D0CD9158C203FD5051DC358A28D2B3E88151A099CAC03FC
D4903A8694DDF91DD13FC8905A686100D715A73280F859460CCDCA6E697D041B
9C03479520A3C1985925062C78E9CC340DC13AD0F520309FA4D782CFA18B32CE
1A1B8FDE7FB1F8DEC84DF54A90D1C0D3B67051817327AED5C645F78214E8B746
EFF85143D773698149E0713FB8C1637DD73DA99BE78C53828C86F0F23A9E5CDB
2856E5A1CB66DEAB4DA900911CEF437776F3C30577A79B75E31391DB163F800D
A1AF4E57F7B24E0610C57D0DE6B8397BFC3A637AD51A561931C0726C7041F9CE
6E07DEAF6993CB49E8AABACBC03A62B195FF64C1F3A74A671D88F482200B8E8A
650389DCB0E00698E5BFD1AA8A0D62BBB8A6C05BEFB0E43BCE62F069AEEEC1EB
C23220161173EE842F1BA7953DDFF7ADC7B5E2BB96A9DBEFA78AB5AB939A8341
3EB5BEE9CECC73FB6E81D57BA917CF62FEE4520D5440215C8F70C7E334A86BD4
D489565BBA3D7C73FD0F8DDAF297E3F7BD6214DEB2C8165F2829BE1104C96E3D
44930FBEC64AD75DE9C24A7E56F6E5F7565A3B0ECF218E378EC7329885115A14
242C1A021FA76D63E5917B0A6F5BFC347E3676FBD37AF12F2FFADF6A53567C25
C810F1559BF5C25B178BC1E59C7F21F3ECDE49F6F6768B272DAA9F5DCD834BA7
6A5A59F84D7CBD9534D0CA3FDFC1C257CC9132887F6E88AFDECC067EB1C918AC
7E2C033F7B31FFFF9B48822F2DE478C06551ABA983B9FBBAB997B1890EA9B139
6F223567557B346848994929140A8542A15028140A8542A15028140A8542A150
28140A8542A15028140A8542A15028140A8542E16F7CF77384F8AF36537BF707
A3EB39E784150649F4A106F5F304C5E8F09D852437EC8AD8BB3A74E8795EB31D
2F1037E4D022015E78C792815CABBCF8469023F3EF67956FDEEC0DDCF5C2267B
77673DA1340E233DF2CFBA29C59F47076951B03DB8E4F4E90557CEC9F6DFF857
1A7DE85229DD972F7EA72EB0723FA0753B63C53C9ED5793C53C213D9E2111FF1
6C098FA543ACD08C86AE982DBE439B542E4A19F18F2083F31906D8115B6B50B1
5F2F6E1A30FC8351173FCA2A0AF107A0E27AF5DA322CA4C4378204164D12EED5
EB4D0DEDC280F53C1E3CB7AF03257B28A5697CAA8D8F622125BE10C439D8CB8A
575F8C7BF72ED42795CD17BBCDE5BBDD1F271E3175DCE1F48F583D76F95ADD9C
3D5ECAF881F84210880562927B3DC931C400CF837B9CE42C6064701FF8A04ECC
793521AC6A151169C540FC612187FB73E5C15E9BA76CE8F5F1BBCD0C033A2CD7
E3341220C6DC09016CD26755E5F7D9CF085F08029955AE3CD447D15D51B15F56
1E139D4300D1186EE734A0D7966ECCB59DF2BE8D9F2AFE10A4B53757BEDFC360
70D142443D0F30D3424BE9366756BF8B0DA9DF6F532EEB54715B8F8932F3ECBE
244F5AD06BE8763EC38ABA791ED14F2B33212110D75A70751D16D2E20B41E2EB
FE25863FD4306329C1BD76F336104A380475ADA6C4829457B82AF3DC89E21559
F1852013C99FC460B2F2F0C59835C138E72789E771163689DBD6BF1AAB3DCB1E
D1CC59D5CA657D52D8EF1E4988F89197BBC26D6121C32A2D20E6C2D3C41E8105
CBE7889764C61782F45FFFA4B008B7A53717A4F301B2296A309D0F645B82174C
FBBB68B2F08C24B9915E10FB3F9D5A74CD659CA7ADA5B4C09801838AA2E4D76F
B0247D4A05C68F443BB99E86AF9A2BB5BB42A417C469CB2D0AED3D5D55E20918
CA60393C6848B8CF7B4DA9D8E7BD9DACC1427AE417645F9728B35B5A523C9E25
B0D083DA08131DC5B05C8F8D29C4DA6FF1CF99AB5F91FE5A11E93B995EDF2C4A
AFBDBFC28B6708D120AA8FE478F086229E3B95B00E99F593C46698AC3C227DFC
40A416C46AEEA0953BBE8F77799936B9FC169E76A0C77945758833103FCE18D3
6B4E1BD3DD7BF95A2DBC7C8EF4F103915A90A135032EEA9C3D5D2ED5A1BBF99C
58816F3134A24FAD14F7AF9C9663BE1003915A90F4337B45FFDC23F1D95E6FAA
5A8831D2A210D71F9643B5AA62A27FB1E2196C2ABC7B693E562505520B421C4F
F4CF79AF6711A4BC21EE7AB618F1E1C0F547004C29EBEC0CCCABD9B69F2CA0A1
6567F8661365A905C96EDA2FCAF4134D71B0103CF60EA67F7E2E8B5515BD844F
2BAE5921F7A4FB08D276D669EFA7D15F37E0296DBA3EB9FCBB5E4C645823F717
FF21150DE17BD7639516057D133F106905C96C7C7BF019E1EE07F131F9AD3F28
E78EA769630B63453F5D96C4A6F08A85E225BF20AD20BC3F256285F376F778E7
9D23C6E04DC5E1E38707F12364106D42740B6466FB633F7A56374EAFF0C5FA63
086905D1C64545DF9CD6DEAFC32047C115392366589C533C670A5CDC3A51B55D
5F8981482B48E2C1D7857F72767716F14476E4153ABA2BDB657A6DA91DBCE8AC
D7B1A9E01BE78897FC849482D8FB8FD0CAAD37E30ABD04ACE37AAF3F8DE7E00E
DFD7417745187B14DC557BCF858F6AE6ECF1CA423E09528F358A32BBB52D69BF
DDED0D9EF229DA4E08E71AAC3FE08AA838854DAF29F1557635849482B0F2B088
15947B4BBC238912B1161C7E788525B08AC8CEA27BBED28ACFF519B9F3AAFC86
948250531727E3D8BB3ABF04AE0A67BF3D6C404777556010F3BC9ACDE0AEB203
3F7FD1885C3B5F09F249E0F5246864C54271929AB3FFE8143E143F4E34BC18EA
3DAED3920248774B1E134D86E6DBF3A6A413C4DAD3252C01027A198B862E82CC
69E8FFE8E8963EE6411D8C2F7A6DD981C0E2C9E25E4BA861862FAD03914E10BB
A95D94D61BAD673A078E6AB042A7C4E51A0C3A1EBDFDFF0FC73568D884E53CBF
17DC95155BF9BCAED796FB569013FBE5CF086BDB21CD9C3BD175DEEBB9D3DADE
7605B7DC63903941FAF4B14E8B832806A4BB7DA186991762FCC86EDA4F034BA6
F856102949ADDF39EA8992FADB6EE926D7C920ED4564FFDD4AFBAF7E9CBA5D71
3CB5F304692F364254B75D5235702FC6148542F1398690FF029A8D9B27B85043
410000000049454E44AE426082}
end>
end>
Left = 689
Top = 339

View File

@ -781,6 +781,7 @@ type
Undo1: TMenuItem;
actSequalSuggest: TAction;
SequalSuggest1: TMenuItem;
SequalSuggest2: TMenuItem;
procedure actCreateDBObjectExecute(Sender: TObject);
procedure menuConnectionsPopup(Sender: TObject);
procedure actExitApplicationExecute(Sender: TObject);