• R/O
  • SSH
  • HTTPS

dzbdslauncher: 提交


Commit MetaInfo

修訂42 (tree)
時間2021-09-13 00:16:28
作者dummzeuch

Log Message

(empty log message)

Change Summary

差異

--- tags/1.0.7/src/Velthuis.Console.pas (nonexistent)
+++ tags/1.0.7/src/Velthuis.Console.pas (revision 42)
@@ -0,0 +1,941 @@
1+{ }
2+{ File: Velthuis.Console.pas }
3+{ Function: Console unit, similar to the Crt unit in Turbo Pascal. }
4+{ Language: Delphi 5 and above }
5+{ Author: Rudolph Velthuis }
6+{ Copyright: (c) 2006,2008 Rudy Velthuis }
7+{ Disclaimer: This code is freeware. All rights are reserved. }
8+{ This code is provided as is, expressly without a warranty }
9+{ of any kind. You use it at your own risk. }
10+{ }
11+{ If you use this code, please credit me. }
12+{ }
13+// taken from https://github.com/rvelthuis/Consoles
14+// -- 2020-02-29 twm
15+
16+unit Velthuis.Console;
17+
18+{$IFDEF CONDITIONALEXPRESSIONS}
19+ {$IF CompilerVersion >= 17.0}
20+ {$DEFINE INLINES}
21+ {$IFEND}
22+ {$IF RTLVersion >= 14.0}
23+ {$DEFINE HASERROUTPUT}
24+ {$IFEND}
25+{$ENDIF}
26+
27+interface
28+
29+uses Windows;
30+
31+const
32+ // Background and foreground colors
33+ Black = 0;
34+ Blue = 1;
35+ Green = 2;
36+ Cyan = 3;
37+ Red = 4;
38+ Magenta = 5;
39+ Brown = 6;
40+ LightGray = 7;
41+
42+ // Foreground colors
43+ DarkGray = 8;
44+ LightBlue = 9;
45+ LightGreen = 10;
46+ LightCyan = 11;
47+ LightRed = 12;
48+ LightMagenta = 13;
49+ Yellow = 14;
50+ White = 15;
51+
52+ // Blink attribute, to be or-ed with background colors.
53+ Blink = 128;
54+
55+ // Text modes:
56+ BW40 = 0; // 40x25 B/W on Color Adapter
57+ CO40 = 1; // 40x25 Color on Color Adapter
58+ BW80 = 2; // 80x25 B/W on Color Adapter
59+ CO80 = 3; // 80x25 Color on Color Adapter
60+ Mono = 7; // 80x25 on Monochrome Adapter
61+ Font8x8 = 256; // Add-in for ROM font
62+
63+ // Mode constants for 3.0 compatibility of original CRT unit }
64+ C40 = CO40;
65+ C80 = CO80;
66+
67+
68+// Turbo/Borland Pascal Crt routines:
69+
70+// Waits for keypress and returns the key pressed. If the key is not an ASCII
71+// key, #0 is returned, and a successive ReadKey will give the extended key
72+// code of the key.
73+function ReadKey: Char;
74+
75+// Checks whether a key was pressed.
76+function KeyPressed: Boolean;
77+
78+// Puts the cursor at the given coordinates on the screen.
79+procedure GotoXY(X, Y: Smallint);
80+
81+// Returns the current X position of the cursor.
82+function WhereX: Integer;
83+
84+// Returns the current Y position of the cursor.
85+function WhereY: Integer;
86+
87+// Sets text foreground color.
88+procedure TextColor(Color: Byte); overload;
89+
90+// Gets text forground color.
91+function TextColor: Byte; overload;
92+
93+// Sets text background color.
94+procedure TextBackground(Color: Byte); overload;
95+
96+// Gets text background color.
97+function TextBackground: Byte; overload;
98+
99+// Sets text mode.
100+procedure TextMode(Mode: Word);
101+
102+// Sets text colors to low intensity
103+procedure LowVideo;
104+
105+// Sets text colors to high intensity
106+procedure HighVideo;
107+
108+// Sets text attribute to value at startup.
109+procedure NormVideo;
110+
111+// Clears the entire screen, or, if a window is set, the entire window,
112+// in the current background color.
113+procedure ClrScr;
114+
115+// Clears until the end of the line, in the current background color.
116+procedure ClrEol;
117+
118+// Inserts a line at the current cursor position.
119+procedure InsLine;
120+
121+// Deletes the line at the current cursor position.
122+procedure DelLine;
123+
124+// Sets a window, into which all successive output will go. You can reset the
125+// window to full screen by calling Window with a zero or negative value
126+// for Left.
127+procedure Window(Left, Top, Right, Bottom: Integer);
128+
129+// Displays message and waits for the next key press. Displays key
130+// and returns.
131+function Pause(const Msg: string = ''): Char;
132+
133+type
134+ // Plays a sound at the given frequency (in Herz).
135+ TSoundProc = procedure(Frequency: Smallint);
136+
137+ // Stops the sound started with Sound.
138+ TNoSoundProc = procedure;
139+
140+ // Delays for the given amount of milliseconds, or as close as possible.
141+ TDelayProc = procedure(Millisecs: Integer);
142+
143+ // Plays a sound at the given frequency (in Hz) and duration (in ms).
144+ TBeepProc = procedure(Frequency, Duration: Smallint);
145+
146+var
147+ Sound: TSoundProc;
148+ NoSound: TNoSoundProc;
149+ Delay: TDelayProc;
150+ Beep: TBeepProc;
151+
152+// Additional routines:
153+
154+function ScreenWidth: Smallint;
155+function ScreenHeight: Smallint;
156+function BufferWidth: Smallint;
157+function BufferHeight: Smallint;
158+
159+var
160+ TextWindow: TSmallRect;
161+ TextAttr: Byte;
162+ DefaultAttr: Byte;
163+ ScreenMode: Byte;
164+ BufferSize: TCoord;
165+ ScreenSize: TCoord;
166+ StdIn, StdOut: THandle;
167+ StdErr: THandle;
168+ LastMode: Word;
169+ WindMin: Word;
170+ WindMax: Word;
171+ CheckBreak: Boolean;
172+
173+implementation
174+
175+uses SysUtils;
176+
177+type
178+ PKey = ^TKey;
179+ TKey = record
180+ KeyCode: Smallint;
181+ Normal: Smallint;
182+ Shift: Smallint;
183+ Ctrl: Smallint;
184+ Alt: Smallint;
185+ end;
186+
187+const
188+ CKeys: array[0..88] of TKey = (
189+ (KeyCode: VK_BACK; Normal: $8; Shift: $8; Ctrl: $7F; Alt: $10E; ),
190+ (KeyCode: VK_TAB; Normal: $9; Shift: $10F; Ctrl: $194; Alt: $1A5; ),
191+ (KeyCode: VK_RETURN; Normal: $D; Shift: $D; Ctrl: $A; Alt: $1A6),
192+ (KeyCode: VK_ESCAPE; Normal: $1B; Shift: $1B; Ctrl: $1B; Alt: $101),
193+ (KeyCode: VK_SPACE; Normal: $20; Shift: $20; Ctrl: $103; Alt: $20),
194+ (KeyCode: Ord('0'); Normal: Ord('0'); Shift: Ord(')'); Ctrl: - 1; Alt: $181),
195+ (KeyCode: Ord('1'); Normal: Ord('1'); Shift: Ord('!'); Ctrl: - 1; Alt: $178),
196+ (KeyCode: Ord('2'); Normal: Ord('2'); Shift: Ord('@'); Ctrl: $103; Alt: $179),
197+ (KeyCode: Ord('3'); Normal: Ord('3'); Shift: Ord('#'); Ctrl: - 1; Alt: $17A),
198+ (KeyCode: Ord('4'); Normal: Ord('4'); Shift: Ord('$'); Ctrl: - 1; Alt: $17B),
199+ (KeyCode: Ord('5'); Normal: Ord('5'); Shift: Ord('%'); Ctrl: - 1; Alt: $17C),
200+ (KeyCode: Ord('6'); Normal: Ord('6'); Shift: Ord('^'); Ctrl: $1E; Alt: $17D),
201+ (KeyCode: Ord('7'); Normal: Ord('7'); Shift: Ord('&'); Ctrl: - 1; Alt: $17E),
202+ (KeyCode: Ord('8'); Normal: Ord('8'); Shift: Ord('*'); Ctrl: - 1; Alt: $17F),
203+ (KeyCode: Ord('9'); Normal: Ord('9'); Shift: Ord('('); Ctrl: - 1; Alt: $180),
204+ (KeyCode: Ord('A'); Normal: Ord('a'); Shift: Ord('A'); Ctrl: $1; Alt: $11E),
205+ (KeyCode: Ord('B'); Normal: Ord('b'); Shift: Ord('B'); Ctrl: $2; Alt: $130),
206+ (KeyCode: Ord('C'); Normal: Ord('c'); Shift: Ord('C'); Ctrl: $3; Alt: $12E),
207+ (KeyCode: Ord('D'); Normal: Ord('d'); Shift: Ord('D'); Ctrl: $4; Alt: $120),
208+ (KeyCode: Ord('E'); Normal: Ord('e'); Shift: Ord('E'); Ctrl: $5; Alt: $112),
209+ (KeyCode: Ord('F'); Normal: Ord('f'); Shift: Ord('F'); Ctrl: $6; Alt: $121),
210+ (KeyCode: Ord('G'); Normal: Ord('g'); Shift: Ord('G'); Ctrl: $7; Alt: $122),
211+ (KeyCode: Ord('H'); Normal: Ord('h'); Shift: Ord('H'); Ctrl: $8; Alt: $123),
212+ (KeyCode: Ord('I'); Normal: Ord('i'); Shift: Ord('I'); Ctrl: $9; Alt: $117),
213+ (KeyCode: Ord('J'); Normal: Ord('j'); Shift: Ord('J'); Ctrl: $A; Alt: $124),
214+ (KeyCode: Ord('K'); Normal: Ord('k'); Shift: Ord('K'); Ctrl: $B; Alt: $125),
215+ (KeyCode: Ord('L'); Normal: Ord('l'); Shift: Ord('L'); Ctrl: $C; Alt: $126),
216+ (KeyCode: Ord('M'); Normal: Ord('m'); Shift: Ord('M'); Ctrl: $D; Alt: $132),
217+ (KeyCode: Ord('N'); Normal: Ord('n'); Shift: Ord('N'); Ctrl: $E; Alt: $131),
218+ (KeyCode: Ord('O'); Normal: Ord('o'); Shift: Ord('O'); Ctrl: $F; Alt: $118),
219+ (KeyCode: Ord('P'); Normal: Ord('p'); Shift: Ord('P'); Ctrl: $10; Alt: $119),
220+ (KeyCode: Ord('Q'); Normal: Ord('q'); Shift: Ord('Q'); Ctrl: $11; Alt: $110),
221+ (KeyCode: Ord('R'); Normal: Ord('r'); Shift: Ord('R'); Ctrl: $12; Alt: $113),
222+ (KeyCode: Ord('S'); Normal: Ord('s'); Shift: Ord('S'); Ctrl: $13; Alt: $11F),
223+ (KeyCode: Ord('T'); Normal: Ord('t'); Shift: Ord('T'); Ctrl: $14; Alt: $114),
224+ (KeyCode: Ord('U'); Normal: Ord('u'); Shift: Ord('U'); Ctrl: $15; Alt: $116),
225+ (KeyCode: Ord('V'); Normal: Ord('v'); Shift: Ord('V'); Ctrl: $16; Alt: $12F),
226+ (KeyCode: Ord('W'); Normal: Ord('w'); Shift: Ord('W'); Ctrl: $17; Alt: $111),
227+ (KeyCode: Ord('X'); Normal: Ord('x'); Shift: Ord('X'); Ctrl: $18; Alt: $12D),
228+ (KeyCode: Ord('Y'); Normal: Ord('y'); Shift: Ord('Y'); Ctrl: $19; Alt: $115),
229+ (KeyCode: Ord('Z'); Normal: Ord('z'); Shift: Ord('Z'); Ctrl: $1A; Alt: $12C),
230+ (KeyCode: VK_PRIOR; Normal: $149; Shift: $149; Ctrl: $184; Alt: $199),
231+ (KeyCode: VK_NEXT; Normal: $151; Shift: $151; Ctrl: $176; Alt: $1A1),
232+ (KeyCode: VK_END; Normal: $14F; Shift: $14F; Ctrl: $175; Alt: $19F),
233+ (KeyCode: VK_HOME; Normal: $147; Shift: $147; Ctrl: $177; Alt: $197),
234+ (KeyCode: VK_LEFT; Normal: $14B; Shift: $14B; Ctrl: $173; Alt: $19B),
235+ (KeyCode: VK_UP; Normal: $148; Shift: $148; Ctrl: $18D; Alt: $198),
236+ (KeyCode: VK_RIGHT; Normal: $14D; Shift: $14D; Ctrl: $174; Alt: $19D),
237+ (KeyCode: VK_DOWN; Normal: $150; Shift: $150; Ctrl: $191; Alt: $1A0),
238+ (KeyCode: VK_INSERT; Normal: $152; Shift: $152; Ctrl: $192; Alt: $1A2),
239+ (KeyCode: VK_DELETE; Normal: $153; Shift: $153; Ctrl: $193; Alt: $1A3),
240+ (KeyCode: VK_NUMPAD0; Normal: Ord('0'); Shift: $152; Ctrl: $192; Alt: - 1),
241+ (KeyCode: VK_NUMPAD1; Normal: Ord('1'); Shift: $14F; Ctrl: $175; Alt: - 1),
242+ (KeyCode: VK_NUMPAD2; Normal: Ord('2'); Shift: $150; Ctrl: $191; Alt: - 1),
243+ (KeyCode: VK_NUMPAD3; Normal: Ord('3'); Shift: $151; Ctrl: $176; Alt: - 1),
244+ (KeyCode: VK_NUMPAD4; Normal: Ord('4'); Shift: $14B; Ctrl: $173; Alt: - 1),
245+ (KeyCode: VK_NUMPAD5; Normal: Ord('5'); Shift: $14C; Ctrl: $18F; Alt: - 1),
246+ (KeyCode: VK_NUMPAD6; Normal: Ord('6'); Shift: $14D; Ctrl: $174; Alt: - 1),
247+ (KeyCode: VK_NUMPAD7; Normal: Ord('7'); Shift: $147; Ctrl: $177; Alt: - 1),
248+ (KeyCode: VK_NUMPAD8; Normal: Ord('8'); Shift: $148; Ctrl: $18D; Alt: - 1),
249+ (KeyCode: VK_NUMPAD9; Normal: Ord('9'); Shift: $149; Ctrl: $184; Alt: - 1),
250+ (KeyCode: VK_MULTIPLY; Normal: Ord('*'); Shift: Ord('*'); Ctrl: $196; Alt: $137),
251+ (KeyCode: VK_ADD; Normal: Ord('+'); Shift: Ord('+'); Ctrl: $190; Alt: $14E),
252+ (KeyCode: VK_SUBTRACT; Normal: Ord('-'); Shift: Ord('-'); Ctrl: $18E; Alt: $14A),
253+ (KeyCode: VK_DECIMAL; Normal: Ord('.'); Shift: Ord('.'); Ctrl: $153; Alt: $193),
254+ (KeyCode: VK_DIVIDE; Normal: Ord('/'); Shift: Ord('/'); Ctrl: $195; Alt: $1A4),
255+ (KeyCode: VK_F1; Normal: $13B; Shift: $154; Ctrl: $15E; Alt: $168),
256+ (KeyCode: VK_F2; Normal: $13C; Shift: $155; Ctrl: $15F; Alt: $169),
257+ (KeyCode: VK_F3; Normal: $13D; Shift: $156; Ctrl: $160; Alt: $16A),
258+ (KeyCode: VK_F4; Normal: $13E; Shift: $157; Ctrl: $161; Alt: $16B),
259+ (KeyCode: VK_F5; Normal: $13F; Shift: $158; Ctrl: $162; Alt: $16C),
260+ (KeyCode: VK_F6; Normal: $140; Shift: $159; Ctrl: $163; Alt: $16D),
261+ (KeyCode: VK_F7; Normal: $141; Shift: $15A; Ctrl: $164; Alt: $16E),
262+ (KeyCode: VK_F8; Normal: $142; Shift: $15B; Ctrl: $165; Alt: $16F),
263+ (KeyCode: VK_F9; Normal: $143; Shift: $15C; Ctrl: $166; Alt: $170),
264+ (KeyCode: VK_F10; Normal: $144; Shift: $15D; Ctrl: $167; Alt: $171),
265+ (KeyCode: VK_F11; Normal: $185; Shift: $187; Ctrl: $189; Alt: $18B),
266+ (KeyCode: VK_F12; Normal: $186; Shift: $188; Ctrl: $18A; Alt: $18C),
267+ (KeyCode: $DC; Normal: Ord('\'); Shift: Ord('|'); Ctrl: $1C; Alt: $12B),
268+ (KeyCode: $BF; Normal: Ord('/'); Shift: Ord('?'); Ctrl: - 1; Alt: $135),
269+ (KeyCode: $BD; Normal: Ord('-'); Shift: Ord('_'); Ctrl: $1F; Alt: $182),
270+ (KeyCode: $BB; Normal: Ord('='); Shift: Ord('+'); Ctrl: - 1; Alt: $183),
271+ (KeyCode: $DB; Normal: Ord('['); Shift: Ord('{'); Ctrl: $1B; Alt: $11A),
272+ (KeyCode: $DD; Normal: Ord(']'); Shift: Ord('}'); Ctrl: $1D; Alt: $11B),
273+ (KeyCode: $BA; Normal: Ord(';'); Shift: Ord(':'); Ctrl: - 1; Alt: $127),
274+ (KeyCode: $DE; Normal: Ord(''''); Shift: Ord('"'); Ctrl: - 1; Alt: $128),
275+ (KeyCode: $BC; Normal: Ord(','); Shift: Ord('<'); Ctrl: - 1; Alt: $133),
276+ (KeyCode: $BE; Normal: Ord('.'); Shift: Ord('>'); Ctrl: - 1; Alt: $134),
277+ (KeyCode: $C0; Normal: Ord('`'); Shift: Ord('~'); Ctrl: - 1; Alt: $129)
278+ );
279+
280+var
281+ ExtendedChar: Char = #0;
282+
283+function FindKeyCode(KeyCode: Smallint): PKey; {$IFDEF INLINES}inline;{$ENDIF}
284+var
285+ I: Integer;
286+begin
287+ for I := 0 to High(CKeys) do
288+ if CKeys[I].KeyCode = KeyCode then
289+ begin
290+ Result := @CKeys[I];
291+ Exit;
292+ end;
293+ Result := nil;
294+end;
295+
296+// This has a complexity of 11, because of the if else ladder.
297+// That bugs me a bit. Looking for something more elegant.
298+function TranslateKey(const Rec: TInputRecord; State: Integer; Key: PKey; KeyCode: Integer): Smallint;
299+begin
300+ if State and (RIGHT_ALT_PRESSED or LEFT_ALT_PRESSED) <> 0 then
301+ Result := Key^.Alt
302+ else if State and (RIGHT_CTRL_PRESSED or LEFT_CTRL_PRESSED) <> 0 then
303+ Result := Key^.Ctrl
304+ else if State and SHIFT_PRESSED <> 0 then
305+ Result := Key^.Shift
306+ else if KeyCode in [Ord('A')..Ord('Z')] then
307+ Result := Ord(Rec.Event.KeyEvent.AsciiChar)
308+ else
309+ Result := Key^.Normal;
310+end;
311+
312+function ConvertKey(const Rec: TInputRecord; Key: PKey): Smallint;
313+ {$IFDEF INLINES}inline;{$ENDIF}
314+begin
315+ if Assigned(Key) then
316+ Result := TranslateKey(Rec, Rec.Event.KeyEvent.dwControlKeyState,
317+ Key, Rec.Event.KeyEvent.wVirtualKeyCode)
318+ else
319+ Result := -1
320+end;
321+
322+function ReadKey: Char;
323+var
324+ InputRec: TInputRecord;
325+ NumRead: Cardinal;
326+ KeyMode: DWORD;
327+ KeyCode: Smallint;
328+begin
329+ if ExtendedChar <> #0 then
330+ begin
331+ Result := ExtendedChar;
332+ ExtendedChar := #0;
333+ Exit;
334+ end
335+ else
336+ begin
337+ Result := #$FF;
338+ GetConsoleMode(StdIn, KeyMode);
339+ SetConsoleMode(StdIn, 0);
340+ repeat
341+ ReadConsoleInput(StdIn, InputRec, 1, NumRead);
342+ if (InputRec.EventType and KEY_EVENT <> 0) and
343+ InputRec.Event.KeyEvent.bKeyDown then
344+ begin
345+ if InputRec.Event.KeyEvent.AsciiChar <> #0 then
346+ begin
347+ // From Delphi 2009 on, Result is WideChar
348+ Result := Chr(Ord(InputRec.Event.KeyEvent.AsciiChar));
349+ Break;
350+ end;
351+ KeyCode := ConvertKey(InputRec,
352+ FindKeyCode(InputRec.Event.KeyEvent.wVirtualKeyCode));
353+ if KeyCode > $FF then
354+ begin
355+ ExtendedChar := Chr(KeyCode and $FF);
356+ Result := #0;
357+ Break;
358+ end;
359+ end;
360+ until False;
361+ SetConsoleMode(StdIn, KeyMode);
362+ end;
363+end;
364+
365+function KeyPressed: Boolean;
366+var
367+ InputRecArray: array of TInputRecord;
368+ NumRead: DWORD;
369+ NumEvents: DWORD;
370+ I: Integer;
371+ KeyCode: Word;
372+begin
373+ Result := False;
374+ GetNumberOfConsoleInputEvents(StdIn, NumEvents);
375+ if NumEvents = 0 then
376+ Exit;
377+ SetLength(InputRecArray, NumEvents);
378+ PeekConsoleInput(StdIn, InputRecArray[0], NumEvents, NumRead);
379+ for I := 0 to High(InputRecArray) do
380+ begin
381+ if (InputRecArray[I].EventType and Key_Event <> 0) and
382+ InputRecArray[I].Event.KeyEvent.bKeyDown then
383+ begin
384+ KeyCode := InputRecArray[I].Event.KeyEvent.wVirtualKeyCode;
385+ if not (KeyCode in [VK_SHIFT, VK_MENU, VK_CONTROL]) then
386+ begin
387+ if ConvertKey(InputRecArray[I], FindKeyCode(KeyCode)) <> -1 then
388+ begin
389+ Result := True;
390+ Exit;
391+ end;
392+ end;
393+ end;
394+ end;
395+end;
396+
397+procedure TextColor(Color: Byte);
398+begin
399+ LastMode := TextAttr;
400+ TextAttr := (TextAttr and $F0) or (Color and $0F);
401+ SetConsoleTextAttribute(StdOut, TextAttr);
402+end;
403+
404+procedure TextBackground(Color: Byte);
405+begin
406+ LastMode := TextAttr;
407+ TextAttr := (TextAttr and $0F) or ((Color shl 4) and $F0);
408+ SetConsoleTextAttribute(StdOut, TextAttr);
409+end;
410+
411+procedure LowVideo;
412+begin
413+ LastMode := TextAttr;
414+ TextAttr := TextAttr and $F7;
415+ SetConsoleTextAttribute(StdOut, TextAttr);
416+end;
417+
418+procedure HighVideo;
419+begin
420+ LastMode := TextAttr;
421+ TextAttr := TextAttr or $08;
422+ SetConsoleTextAttribute(StdOut, TextAttr);
423+end;
424+
425+procedure NormVideo;
426+begin
427+ TextAttr := DefaultAttr;
428+ SetConsoleTextAttribute(StdOut, TextAttr);
429+end;
430+
431+// The following functions are independent of TextWindow.
432+
433+function GetCursorX: Integer; {$IFDEF INLINES}inline;{$ENDIF}
434+var
435+ BufferInfo: TConsoleScreenBufferInfo;
436+begin
437+ GetConsoleSCreenBufferInfo(StdOut, BufferInfo);
438+ Result := BufferInfo.dwCursorPosition.X;
439+end;
440+
441+function GetCursorY: Integer; {$IFDEF INLINES}inline;{$ENDIF}
442+var
443+ BufferInfo: TConsoleScreenBufferInfo;
444+begin
445+ GetConsoleSCreenBufferInfo(StdOut, BufferInfo);
446+ Result := BufferInfo.dwCursorPosition.Y;
447+end;
448+
449+procedure SetCursorPos(X, Y: Smallint);
450+var
451+ NewPos: TCoord;
452+begin
453+ NewPos.X := X;
454+ NewPos.Y := Y;
455+ SetConsoleCursorPosition(StdOut, NewPos);
456+end;
457+
458+// The following functions are relative to TextWindow.
459+
460+procedure ClrScr;
461+var
462+ StartPos: TCoord;
463+ Len, NumWritten: DWORD;
464+ I: Integer;
465+begin
466+ if (TextWindow.Left = 0) and (TextWindow.Top = 0) and
467+ (TextWindow.Right = BufferSize.X - 1) and
468+ (TextWindow.Bottom = BufferSize.Y - 1) then
469+ begin
470+ StartPos.X := 0;
471+ StartPos.Y := 0;
472+ Len := BufferSize.X * BufferSize.Y;
473+ FillConsoleOutputCharacterA(StdOut, ' ', Len, StartPos, NumWritten);
474+ FillConsoleOutputAttribute(StdOut, TextAttr, Len, StartPos, NumWritten);
475+ if NumWritten < Len then
476+ begin
477+ ScreenSize.X := ScreenWidth;
478+ ScreenSize.Y := ScreenHeight;
479+ end;
480+ end
481+ else
482+ begin
483+ Len := TextWindow.Right - TextWindow.Left + 1;
484+ StartPos.X := TextWindow.Left;
485+ for I := TextWindow.Top to TextWindow.Bottom do
486+ begin
487+ StartPos.Y := I;
488+ FillConsoleOutputCharacterA(StdOut, ' ', Len, StartPos, NumWritten);
489+ FillConsoleOutputAttribute(StdOut, TextAttr, Len, StartPos, NumWritten);
490+ end;
491+ end;
492+ GotoXY(1, 1);
493+end;
494+
495+procedure GotoXY(X, Y: Smallint);
496+begin
497+ Inc(X, TextWindow.Left - 1);
498+ Inc(Y, TextWindow.Top - 1);
499+ if (X >= TextWindow.Left) and (X <= TextWindow.Right) and
500+ (Y >= TextWindow.Top) and (Y <= TextWindow.Bottom) then
501+ SetCursorPos(X, Y);
502+end;
503+
504+procedure ClrEol;
505+var
506+ Len: Integer;
507+ Pos: TCoord;
508+ NumWritten: DWORD;
509+begin
510+ Len := TextWindow.Right - GetCursorX + 1;
511+ Pos.X := GetCursorX;
512+ Pos.Y := GetCursorY;
513+ FillConsoleOutputCharacterA(StdOut, ' ', Len, Pos, NumWritten);
514+ FillConsoleOutputAttribute(StdOut, TextAttr, Len, Pos, NumWritten);
515+end;
516+
517+procedure Scroll(Left, Top, Right, Bottom: Integer; Distance: Integer = 0);
518+var
519+ Rect: TSmallRect;
520+ Fill: TCharInfo;
521+ NewPos: TCoord;
522+begin
523+ Fill.AsciiChar := ' ';
524+ Fill.Attributes := TextAttr;
525+ if Distance = 0 then
526+ Distance := Bottom - Top + 1;
527+ Rect.Left := Left;
528+ Rect.Right := Right;
529+ Rect.Top := Top;
530+ Rect.Bottom := Bottom;
531+ NewPos.X := Left;
532+ NewPos.Y := Top + Distance;
533+ ScrollConsoleScreenBufferA(StdOut, Rect, @Rect, NewPos, Fill);
534+end;
535+
536+procedure InsLine;
537+begin
538+ Scroll(TextWindow.Left, GetCursorY,
539+ TextWindow.Right, TextWindow.Bottom, 1);
540+end;
541+
542+procedure DelLine;
543+begin
544+ Scroll(TextWindow.Left, GetCursorY,
545+ TextWindow.Right, TextWindow.Bottom, -1);
546+end;
547+
548+function Validate(X1, Y1, X2, Y2: Integer): Boolean;
549+ {$IFDEF INLINES}inline;{$ENDIF}
550+begin
551+ Result := (X1 < X2) and (Y1 < Y2) and
552+ (X1 >= 0) and (X2 < BufferSize.X) and
553+ (Y1 >= 0) and (Y2 < BufferSize.Y);
554+end;
555+
556+procedure WriteText(Line: PAnsiChar; Len: Integer);
557+var
558+ NumWritten: DWORD;
559+begin
560+ SetConsoleTextAttribute(StdOut, TextAttr);
561+ WriteConsoleA(StdOut, Line, Len, NumWritten, nil);
562+end;
563+
564+// Replacement for TTextRec.InOutFunc and TTextRec.FlushFunc for the Output
565+// and ErrOutput pseudo-textfiles.
566+// This is generally only used if a text window is set, otherwise this is
567+// handled by the runtime library.
568+function NewTextOut(var T: TTextRec): Integer;
569+var
570+ ReadPtr, WritePtr: PAnsiChar;
571+ Line: AnsiString;
572+ DistanceToEdge: Integer;
573+
574+ // Moves cursor to start of line, updates DistanceToEdge.
575+ procedure CarriageReturn;
576+ begin
577+ SetCursorPos(TextWindow.Left, GetCursorY);
578+ DistanceToEdge := TextWindow.Right - TextWindow.Left + 1;
579+ end;
580+
581+ // Moves cursor down one line. If necessary, scrolls window.
582+ procedure LineFeed; {$IFDEF INLINES}inline;{$ENDIF}
583+ begin
584+ if GetCursorY < TextWindow.Bottom then
585+ SetCursorPos(GetCursorX, GetCursorY + 1)
586+ else
587+ Scroll(TextWindow.Left, TextWindow.Top, TextWindow.Right,
588+ TextWindow.Bottom, -1);
589+ end;
590+
591+ // Store one char in write buffer.
592+ procedure CharToWriteBuffer(C: AnsiChar);
593+ begin
594+ WritePtr^ := C;
595+ Inc(WritePtr);
596+ Dec(DistanceToEdge);
597+ end;
598+
599+ // True if at right edge of window.
600+ function WriteLine: Boolean;
601+ begin
602+ WritePtr^ := #0;
603+ WriteText(PAnsiChar(Line), WritePtr - PAnsiChar(Line));
604+ Result := DistanceToEdge = 0;
605+ WritePtr := PAnsiChar(Line);
606+ DistanceToEdge := TextWindow.Right - TextWindow.Left + 1;
607+ end;
608+
609+ // Converts tabs to spaces, since WriteConsole will do its own tabbing when
610+ // it encounters a #9, which is of course independent of this unit's
611+ // TextWindow settings.
612+ procedure ProcessTab;
613+ var
614+ Num, I: Integer;
615+ begin
616+ Num := 8 - (WritePtr - PAnsiChar(Line)) mod 8;
617+ if Num > DistanceToEdge then
618+ Num := DistanceToEdge;
619+ for I := 1 to Num do
620+ CharToWriteBuffer(' ');
621+ end;
622+
623+begin
624+ SetLength(Line, BufferSize.X); // Line only contains one line of windowed text.
625+ WritePtr := PAnsiChar(Line);
626+ ReadPtr := T.BufPtr;
627+ DistanceToEdge := TextWindow.Right - GetCursorX + 1;
628+ while T.BufPos > 0 do
629+ begin
630+ while (T.BufPos > 0) and (DistanceToEdge > 0) do
631+ begin
632+ case ReadPtr^ of
633+ #7: Windows.Beep(800, 200); // this is what my internal speaker uses.
634+ #8: begin
635+ Dec(WritePtr);
636+ Inc(DistanceToEdge);
637+ end;
638+ #9: ProcessTab;
639+ // LineFeed is not just a line feed, it takes the function of #13#10
640+ #10: begin
641+ WriteLine;
642+ CarriageReturn;
643+ LineFeed;
644+ end;
645+ #13: begin
646+ WriteLine;
647+ CarriageReturn;
648+ end;
649+ else
650+ CharToWriteBuffer(ReadPtr^);
651+ end;
652+ Inc(ReadPtr);
653+ Dec(T.BufPos);
654+ end;
655+ if WriteLine then
656+ begin
657+ CarriageReturn;
658+ // If TexWindow.Right is at the edge of the screen, WriteConsole will
659+ // already do a linefeed.
660+ if TextWindow.Right <> ScreenWidth - 1 then
661+ LineFeed;
662+ end;
663+ end;
664+ Result := 0;
665+end;
666+
667+var
668+ OldInOutFunc: Pointer;
669+ OldFlushFunc: Pointer;
670+
671+procedure Window(Left, Top, Right, Bottom: Integer);
672+begin
673+ Dec(Left);
674+ Dec(Top);
675+ Dec(Right);
676+ Dec(Bottom);
677+ if Validate(Left, Top, Right, Bottom) then
678+ begin
679+ TextWindow.Left := Left;
680+ TextWindow.Top := Top;
681+ TextWindow.Right := Right;
682+ TextWindow.Bottom := Bottom;
683+ if (Left > 0) or (Top > 0) or
684+ (Right < BufferSize.X - 1) or (Bottom < BufferSize.Y - 1) then
685+ // Text must be contained in window
686+ begin
687+ OldInOutFunc := TTextRec(Output).InOutFunc;
688+ OldFlushFunc := TTextRec(Output).FlushFunc;
689+ TTextRec(Output).InOutFunc := @NewTextOut;
690+ TTextRec(Output).FlushFunc := @NewTextOut;
691+ SetCursorPos(Left, Top);
692+ end;
693+ end
694+ else
695+ begin
696+ TextWindow.Left := 0;
697+ TextWindow.Right := BufferSize.X - 1;
698+ TextWindow.Top := 0;
699+ TextWindow.Bottom := BufferSize.Y - 1;
700+ SetCursorPos(0, 0);
701+ if Assigned(OldInOutFunc) then
702+ begin
703+ TTextRec(Output).InOutFunc := OldInOutFunc;
704+ OldInOutFunc := nil;
705+ end;
706+ if Assigned(OldFlushFunc) then
707+ begin
708+ TTextRec(Output).FlushFunc := OldFlushFunc;
709+ OldFlushFunc := nil;
710+ end;
711+ end;
712+ WindMin := (TextWindow.Left and $FF) or (TextWindow.Top and $FF) shl 8;
713+ WindMax := (TextWindow.Right and $FF) or (TextWindow.Bottom and $FF) shl 8;
714+end;
715+
716+procedure HardwareSound(Frequency: Smallint);
717+asm
718+ CMP AX,37
719+ JB @@1
720+ MOV CX,AX
721+ MOV AL,$B6
722+ OUT $43,AL
723+ MOV AX,$3540
724+ MOV DX,$0012
725+ DIV CX
726+ OUT $42,AL
727+ MOV AL,AH
728+ OUT $42,AL
729+ MOV AL,3
730+ OUT $61,AL
731+@@1:
732+end;
733+
734+procedure HardwareNoSound;
735+asm
736+ MOV AL,0
737+ OUT $61,AL
738+end;
739+
740+procedure HardwareDelay(Millisecs: Integer);
741+begin
742+ Sleep(Millisecs);
743+end;
744+
745+procedure HardwareBeep(Frequency, Duration: Smallint);
746+begin
747+ Sound(Frequency);
748+ Delay(Duration);
749+ NoSound;
750+end;
751+
752+type
753+ TSoundState = (ssPending, ssPlaying, ssFreed);
754+
755+var
756+ CurrentFrequency: Integer;
757+ SoundState: TSoundState;
758+
759+// On Windows NT and later, direct port access is prohibited, so there is
760+// no way to use HardwareSound and HardwareNoSound.
761+//
762+// Since probably every note played by Sound will be delimited by some kind
763+// of Delay, the playing of the note is deferred to Delay. Sound only stores
764+// the frequency and sets the SoundState to ssPending. Delay now knows both
765+// parameters, and can use Windows.Beep.
766+//
767+// Note that such code is not reentrant.
768+
769+procedure SoftwareSound(Frequency: Smallint);
770+begin
771+ // $123540 div Frequency must be <= $7FFF, so Frequency must be >= 37.
772+ if Frequency >= 37 then
773+ begin
774+ CurrentFrequency := Frequency;
775+ SoundState := ssPending;
776+ end;
777+end;
778+
779+procedure SoftwareDelay(Millisecs: Integer);
780+begin
781+ if SoundState = ssPending then
782+ begin
783+ SoundState := ssPlaying;
784+ Windows.Beep(CurrentFrequency, MilliSecs);
785+ SoundState := ssFreed;
786+ end
787+ else
788+ Sleep(MilliSecs);
789+end;
790+
791+procedure SoftwareBeep(Frequency, Duration: Smallint);
792+begin
793+ if Frequency >= 37 then
794+ begin
795+ SoundState := ssPlaying;
796+ Windows.Beep(Frequency, Duration);
797+ SoundState := ssFreed;
798+ end;
799+end;
800+
801+procedure SoftwareNoSound;
802+begin
803+ Windows.Beep(CurrentFrequency, 0);
804+ SoundState := ssFreed;
805+end;
806+
807+function WhereX: Integer;
808+begin
809+ Result := GetCursorX - TextWindow.Left + 1;
810+end;
811+
812+function WhereY: Integer;
813+begin
814+ Result := GetCursorY - TextWindow.Top + 1;
815+end;
816+
817+procedure GetScreenSizes(var Width, Height: Smallint);
818+var
819+ BufferInfo: TConsoleScreenBufferInfo;
820+begin
821+ GetConsoleScreenBufferInfo(StdOut, BufferInfo);
822+ Width := BufferInfo.srWindow.Right - BufferInfo.srWindow.Left + 1;
823+ Height := BufferInfo.srWindow.Bottom - BufferInfo.srWindow.Top + 1;
824+end;
825+
826+function ScreenWidth: Smallint;
827+var
828+ Height: Smallint;
829+begin
830+ GetScreenSizes(Result, Height);
831+end;
832+
833+function ScreenHeight: Smallint;
834+var
835+ Width: Smallint;
836+begin
837+ GetScreenSizes(Width, Result);
838+end;
839+
840+procedure GetBufferSizes(var Width, Height: Smallint);
841+var
842+ BufferInfo: TConsoleScreenBufferInfo;
843+begin
844+ GetConsoleScreenBufferInfo(StdOut, BufferInfo);
845+ Width := BufferInfo.dwSize.X;
846+ Height := BufferInfo.dwSize.Y;
847+end;
848+
849+function BufferWidth: Smallint;
850+var
851+ Height: Smallint;
852+begin
853+ GetBufferSizes(Result, Height);
854+end;
855+
856+function BufferHeight: Smallint;
857+var
858+ Width: Smallint;
859+begin
860+ GetBufferSizes(Width, Result);
861+end;
862+
863+function TextColor: Byte;
864+begin
865+ Result := TextAttr and $0F;
866+end;
867+
868+function TextBackground: Byte;
869+begin
870+ Result := (TextAttr and $F0) shr 4;
871+end;
872+
873+procedure TextMode(Mode: Word);
874+begin
875+ Window(0, 0, 0, 0);
876+ NormVideo;
877+end;
878+
879+function Pause(const Msg: string = ''): Char;
880+begin
881+ if Msg = '' then
882+ Write('Press any key... ')
883+ else
884+ Write(Msg);
885+ Result := ReadKey;
886+end;
887+
888+procedure InitScreenMode;
889+var
890+ BufferInfo: TConsoleScreenBufferInfo;
891+begin
892+ Reset(Input);
893+ Rewrite(Output);
894+ StdIn := TTextRec(Input).Handle;
895+ StdOut := TTextRec(Output).Handle;
896+{$IFDEF HASERROUTPUT}
897+ Rewrite(ErrOutput);
898+ StdErr := TTextRec(ErrOutput).Handle;
899+{$ELSE}
900+ StdErr := GetStdHandle(STD_ERROR_HANDLE);
901+{$ENDIF}
902+ if not GetConsoleScreenBufferInfo(StdOut, BufferInfo) then
903+ begin
904+ SetInOutRes(GetLastError);
905+ Exit;
906+ end;
907+ TextWindow.Left := 0;
908+ TextWindow.Top := 0;
909+ TextWindow.Right := BufferInfo.dwSize.X - 1;
910+ TextWindow.Bottom := BufferInfo.dwSize.Y - 1;
911+ TextAttr := BufferInfo.wAttributes and $FF;
912+ DefaultAttr := TextAttr;
913+ BufferSize := BufferInfo.dwSize;
914+ ScreenSize.X := BufferInfo.srWindow.Right - BufferInfo.srWindow.Left + 1;
915+ ScreenSize.Y := BufferInfo.srWindow.Bottom - BufferInfo.srWindow.Top + 1;
916+ WindMin := 0;
917+ WindMax := (ScreenSize.X and $FF) or (ScreenSize.Y and $FF) shl 8;
918+ LastMode := CO80;
919+ OldInOutFunc := nil;
920+ OldFlushFunc := nil;
921+ if Win32Platform = VER_PLATFORM_WIN32_NT then
922+ begin
923+ Sound := SoftwareSound;
924+ NoSound := SoftwareNoSound;
925+ Delay := SoftwareDelay;
926+ Beep := SoftwareBeep;
927+ end
928+ else
929+ begin
930+ Sound := HardwareSound;
931+ NoSound := HardwareNoSound;
932+ Delay := HardwareDelay;
933+ Beep := HardwareBeep;
934+ end;
935+end;
936+
937+initialization
938+ InitScreenMode;
939+
940+end.
941+
--- tags/1.0.7/src/dzBdsLauncher.dpr (nonexistent)
+++ tags/1.0.7/src/dzBdsLauncher.dpr (revision 42)
@@ -0,0 +1,17 @@
1+program dzBdsLauncher;
2+
3+{$APPTYPE CONSOLE}
4+
5+uses
6+ System.SysUtils,
7+ u_dzBdsLauncher in 'u_dzBdsLauncher.pas',
8+ Velthuis.Console in 'Velthuis.Console.pas',
9+ u_dzStdOut in 'u_dzStdOut.pas';
10+
11+{$R *_version.res}
12+{$R *_icon.res}
13+{$R *_manifest.res}
14+
15+begin
16+ Main;
17+end.
--- tags/1.0.7/src/dzBdsLauncher.dproj (nonexistent)
+++ tags/1.0.7/src/dzBdsLauncher.dproj (revision 42)
@@ -0,0 +1,1237 @@
1+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2+ <PropertyGroup>
3+ <Base>True</Base>
4+ <AppType>Console</AppType>
5+ <Config Condition="'$(Config)'==''">Debug</Config>
6+ <FrameworkType>None</FrameworkType>
7+ <MainSource>dzBdsLauncher.dpr</MainSource>
8+ <Platform Condition="'$(Platform)'==''">Win32</Platform>
9+ <ProjectGuid>{4CA0A90D-F239-46ED-A855-D1C0E0DEDAC1}</ProjectGuid>
10+ <ProjectVersion>19.1</ProjectVersion>
11+ <TargetedPlatforms>1</TargetedPlatforms>
12+ </PropertyGroup>
13+ <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
14+ <Base>true</Base>
15+ </PropertyGroup>
16+ <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
17+ <Base_Win32>true</Base_Win32>
18+ <CfgParent>Base</CfgParent>
19+ <Base>true</Base>
20+ </PropertyGroup>
21+ <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
22+ <Base_Win64>true</Base_Win64>
23+ <CfgParent>Base</CfgParent>
24+ <Base>true</Base>
25+ </PropertyGroup>
26+ <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
27+ <Cfg_1>true</Cfg_1>
28+ <CfgParent>Base</CfgParent>
29+ <Base>true</Base>
30+ </PropertyGroup>
31+ <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
32+ <Cfg_1_Win32>true</Cfg_1_Win32>
33+ <CfgParent>Cfg_1</CfgParent>
34+ <Cfg_1>true</Cfg_1>
35+ <Base>true</Base>
36+ </PropertyGroup>
37+ <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
38+ <Cfg_2>true</Cfg_2>
39+ <CfgParent>Base</CfgParent>
40+ <Base>true</Base>
41+ </PropertyGroup>
42+ <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
43+ <Cfg_2_Win32>true</Cfg_2_Win32>
44+ <CfgParent>Cfg_2</CfgParent>
45+ <Cfg_2>true</Cfg_2>
46+ <Base>true</Base>
47+ </PropertyGroup>
48+ <PropertyGroup Condition="'$(Base)'!=''">
49+ <SanitizedProjectName>dzBdsLauncher</SanitizedProjectName>
50+ <DCC_DUPLICATE_CTOR_DTOR>false</DCC_DUPLICATE_CTOR_DTOR>
51+ <DCC_DcuOutput>..\dcu\$(Platform)\$(Config)</DCC_DcuOutput>
52+ <DCC_Define>NO_TRANSLATION;NO_TRANSLATION_HINT;$(DCC_Define)</DCC_Define>
53+ <DCC_E>false</DCC_E>
54+ <DCC_ExeOutput>..\</DCC_ExeOutput>
55+ <DCC_F>false</DCC_F>
56+ <DCC_K>false</DCC_K>
57+ <DCC_N>false</DCC_N>
58+ <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
59+ <DCC_S>false</DCC_S>
60+ <DCC_SYMBOL_PLATFORM>false</DCC_SYMBOL_PLATFORM>
61+ <DCC_UNIT_PLATFORM>false</DCC_UNIT_PLATFORM>
62+ <DCC_UnitSearchPath>..\libs\dzlib\src;..\libs\dzlib\jedi_inc;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
63+ <PostBuildEvent><![CDATA[call ..\buildtools\postbuild.cmd $(OUTPUTDIR)$(OUTPUTNAME)
64+$(PostBuildEvent)]]></PostBuildEvent>
65+ <PreBuildEvent><![CDATA[call ..\buildtools\prebuild.cmd $(PROJECTPATH)
66+$(PreBuildEvent)]]></PreBuildEvent>
67+ <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
68+ <VerInfo_Locale>2057</VerInfo_Locale>
69+ </PropertyGroup>
70+ <PropertyGroup Condition="'$(Base_Win32)'!=''">
71+ <BT_BuildType>Debug</BT_BuildType>
72+ <DCC_ConsoleTarget>true</DCC_ConsoleTarget>
73+ <DCC_MapFile>3</DCC_MapFile>
74+ <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
75+ <DCC_UsePackage>DBXSqliteDriver;bindcompdbx;IndyIPCommon;RESTComponents;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;ccpack;vclFireDAC;IndySystem;tethering;svnui;dsnapcon;FireDACADSDriver;VirtualTreesR;FireDACMSAccDriver;fmxFireDAC;vclimg;FireDAC;vcltouch;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;soaprtl;DbxCommonDriver;FireDACIBDriver;fmx;fmxdae;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;inetdbxpress;IndyProtocols;FireDACCommonODBC;FireDACCommonDriver;AutoSuffix;inet;fmxase;$(DCC_UsePackage)</DCC_UsePackage>
76+ <Manifest_File>(None)</Manifest_File>
77+ <UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
78+ <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
79+ <VerInfo_Locale>1033</VerInfo_Locale>
80+ </PropertyGroup>
81+ <PropertyGroup Condition="'$(Base_Win64)'!=''">
82+ <DCC_ConsoleTarget>true</DCC_ConsoleTarget>
83+ <DCC_UsePackage>DBXSqliteDriver;bindcompdbx;IndyIPCommon;RESTComponents;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;vclFireDAC;IndySystem;tethering;dsnapcon;FireDACADSDriver;VirtualTreesR;FireDACMSAccDriver;fmxFireDAC;vclimg;FireDAC;vcltouch;vcldb;bindcompfmx;FireDACSqliteDriver;FireDACPgDriver;inetdb;soaprtl;DbxCommonDriver;FireDACIBDriver;fmx;fmxdae;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;inetdbxpress;IndyProtocols;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)</DCC_UsePackage>
84+ <UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
85+ <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
86+ </PropertyGroup>
87+ <PropertyGroup Condition="'$(Cfg_1)'!=''">
88+ <DCC_DebugDCUs>true</DCC_DebugDCUs>
89+ <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
90+ <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
91+ <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
92+ <DCC_Optimize>false</DCC_Optimize>
93+ <DCC_RemoteDebug>true</DCC_RemoteDebug>
94+ </PropertyGroup>
95+ <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
96+ <DCC_RemoteDebug>false</DCC_RemoteDebug>
97+ <VerInfo_Locale>1033</VerInfo_Locale>
98+ </PropertyGroup>
99+ <PropertyGroup Condition="'$(Cfg_2)'!=''">
100+ <DCC_DebugInformation>0</DCC_DebugInformation>
101+ <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
102+ <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
103+ <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
104+ </PropertyGroup>
105+ <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
106+ <VerInfo_Locale>1033</VerInfo_Locale>
107+ </PropertyGroup>
108+ <ItemGroup>
109+ <DelphiCompile Include="$(MainSource)">
110+ <MainSource>MainSource</MainSource>
111+ </DelphiCompile>
112+ <DCCReference Include="u_dzBdsLauncher.pas"/>
113+ <DCCReference Include="Velthuis.Console.pas"/>
114+ <DCCReference Include="u_dzStdOut.pas"/>
115+ <BuildConfiguration Include="Release">
116+ <Key>Cfg_2</Key>
117+ <CfgParent>Base</CfgParent>
118+ </BuildConfiguration>
119+ <BuildConfiguration Include="Base">
120+ <Key>Base</Key>
121+ </BuildConfiguration>
122+ <BuildConfiguration Include="Debug">
123+ <Key>Cfg_1</Key>
124+ <CfgParent>Base</CfgParent>
125+ </BuildConfiguration>
126+ </ItemGroup>
127+ <ProjectExtensions>
128+ <Borland.Personality>Delphi.Personality.12</Borland.Personality>
129+ <Borland.ProjectType>Application</Borland.ProjectType>
130+ <BorlandProject>
131+ <Delphi.Personality>
132+ <Source>
133+ <Source Name="MainSource">dzBdsLauncher.dpr</Source>
134+ </Source>
135+ <Excluded_Packages>
136+ <Excluded_Packages Name="$(BDSBIN)\dcloffice2k260.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
137+ <Excluded_Packages Name="$(BDSBIN)\dclofficexp260.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
138+ </Excluded_Packages>
139+ </Delphi.Personality>
140+ <Deployment Version="3">
141+ <DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule">
142+ <Platform Name="OSX32">
143+ <Overwrite>true</Overwrite>
144+ </Platform>
145+ </DeployFile>
146+ <DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule">
147+ <Platform Name="iOSSimulator">
148+ <Overwrite>true</Overwrite>
149+ </Platform>
150+ </DeployFile>
151+ <DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule">
152+ <Platform Name="iOSSimulator">
153+ <Overwrite>true</Overwrite>
154+ </Platform>
155+ </DeployFile>
156+ <DeployFile LocalName="..\dzBdsLauncher.exe" Configuration="Debug" Class="ProjectOutput">
157+ <Platform Name="Win32">
158+ <RemoteName>dzBdsLauncher.exe</RemoteName>
159+ <Overwrite>true</Overwrite>
160+ </Platform>
161+ </DeployFile>
162+ <DeployClass Name="AdditionalDebugSymbols">
163+ <Platform Name="iOSSimulator">
164+ <Operation>1</Operation>
165+ </Platform>
166+ <Platform Name="OSX32">
167+ <RemoteDir>Contents\MacOS</RemoteDir>
168+ <Operation>1</Operation>
169+ </Platform>
170+ <Platform Name="Win32">
171+ <Operation>0</Operation>
172+ </Platform>
173+ </DeployClass>
174+ <DeployClass Name="AndroidClassesDexFile">
175+ <Platform Name="Android">
176+ <RemoteDir>classes</RemoteDir>
177+ <Operation>1</Operation>
178+ </Platform>
179+ <Platform Name="Android64">
180+ <RemoteDir>classes</RemoteDir>
181+ <Operation>1</Operation>
182+ </Platform>
183+ </DeployClass>
184+ <DeployClass Name="AndroidFileProvider">
185+ <Platform Name="Android">
186+ <RemoteDir>res\xml</RemoteDir>
187+ <Operation>1</Operation>
188+ </Platform>
189+ <Platform Name="Android64">
190+ <RemoteDir>res\xml</RemoteDir>
191+ <Operation>1</Operation>
192+ </Platform>
193+ </DeployClass>
194+ <DeployClass Name="AndroidGDBServer">
195+ <Platform Name="Android">
196+ <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
197+ <Operation>1</Operation>
198+ </Platform>
199+ </DeployClass>
200+ <DeployClass Name="AndroidLibnativeArmeabiFile">
201+ <Platform Name="Android">
202+ <RemoteDir>library\lib\armeabi</RemoteDir>
203+ <Operation>1</Operation>
204+ </Platform>
205+ <Platform Name="Android64">
206+ <RemoteDir>library\lib\armeabi</RemoteDir>
207+ <Operation>1</Operation>
208+ </Platform>
209+ </DeployClass>
210+ <DeployClass Name="AndroidLibnativeArmeabiv7aFile">
211+ <Platform Name="Android64">
212+ <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
213+ <Operation>1</Operation>
214+ </Platform>
215+ </DeployClass>
216+ <DeployClass Name="AndroidLibnativeMipsFile">
217+ <Platform Name="Android">
218+ <RemoteDir>library\lib\mips</RemoteDir>
219+ <Operation>1</Operation>
220+ </Platform>
221+ <Platform Name="Android64">
222+ <RemoteDir>library\lib\mips</RemoteDir>
223+ <Operation>1</Operation>
224+ </Platform>
225+ </DeployClass>
226+ <DeployClass Name="AndroidServiceOutput">
227+ <Platform Name="Android">
228+ <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
229+ <Operation>1</Operation>
230+ </Platform>
231+ <Platform Name="Android64">
232+ <RemoteDir>library\lib\arm64-v8a</RemoteDir>
233+ <Operation>1</Operation>
234+ </Platform>
235+ </DeployClass>
236+ <DeployClass Name="AndroidServiceOutput_Android32">
237+ <Platform Name="Android64">
238+ <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
239+ <Operation>1</Operation>
240+ </Platform>
241+ </DeployClass>
242+ <DeployClass Name="AndroidSplashImageDef">
243+ <Platform Name="Android">
244+ <RemoteDir>res\drawable</RemoteDir>
245+ <Operation>1</Operation>
246+ </Platform>
247+ <Platform Name="Android64">
248+ <RemoteDir>res\drawable</RemoteDir>
249+ <Operation>1</Operation>
250+ </Platform>
251+ </DeployClass>
252+ <DeployClass Name="AndroidSplashStyles">
253+ <Platform Name="Android">
254+ <RemoteDir>res\values</RemoteDir>
255+ <Operation>1</Operation>
256+ </Platform>
257+ <Platform Name="Android64">
258+ <RemoteDir>res\values</RemoteDir>
259+ <Operation>1</Operation>
260+ </Platform>
261+ </DeployClass>
262+ <DeployClass Name="AndroidSplashStylesV21">
263+ <Platform Name="Android">
264+ <RemoteDir>res\values-v21</RemoteDir>
265+ <Operation>1</Operation>
266+ </Platform>
267+ <Platform Name="Android64">
268+ <RemoteDir>res\values-v21</RemoteDir>
269+ <Operation>1</Operation>
270+ </Platform>
271+ </DeployClass>
272+ <DeployClass Name="Android_Colors">
273+ <Platform Name="Android">
274+ <RemoteDir>res\values</RemoteDir>
275+ <Operation>1</Operation>
276+ </Platform>
277+ <Platform Name="Android64">
278+ <RemoteDir>res\values</RemoteDir>
279+ <Operation>1</Operation>
280+ </Platform>
281+ </DeployClass>
282+ <DeployClass Name="Android_DefaultAppIcon">
283+ <Platform Name="Android">
284+ <RemoteDir>res\drawable</RemoteDir>
285+ <Operation>1</Operation>
286+ </Platform>
287+ <Platform Name="Android64">
288+ <RemoteDir>res\drawable</RemoteDir>
289+ <Operation>1</Operation>
290+ </Platform>
291+ </DeployClass>
292+ <DeployClass Name="Android_LauncherIcon144">
293+ <Platform Name="Android">
294+ <RemoteDir>res\drawable-xxhdpi</RemoteDir>
295+ <Operation>1</Operation>
296+ </Platform>
297+ <Platform Name="Android64">
298+ <RemoteDir>res\drawable-xxhdpi</RemoteDir>
299+ <Operation>1</Operation>
300+ </Platform>
301+ </DeployClass>
302+ <DeployClass Name="Android_LauncherIcon36">
303+ <Platform Name="Android">
304+ <RemoteDir>res\drawable-ldpi</RemoteDir>
305+ <Operation>1</Operation>
306+ </Platform>
307+ <Platform Name="Android64">
308+ <RemoteDir>res\drawable-ldpi</RemoteDir>
309+ <Operation>1</Operation>
310+ </Platform>
311+ </DeployClass>
312+ <DeployClass Name="Android_LauncherIcon48">
313+ <Platform Name="Android">
314+ <RemoteDir>res\drawable-mdpi</RemoteDir>
315+ <Operation>1</Operation>
316+ </Platform>
317+ <Platform Name="Android64">
318+ <RemoteDir>res\drawable-mdpi</RemoteDir>
319+ <Operation>1</Operation>
320+ </Platform>
321+ </DeployClass>
322+ <DeployClass Name="Android_LauncherIcon72">
323+ <Platform Name="Android">
324+ <RemoteDir>res\drawable-hdpi</RemoteDir>
325+ <Operation>1</Operation>
326+ </Platform>
327+ <Platform Name="Android64">
328+ <RemoteDir>res\drawable-hdpi</RemoteDir>
329+ <Operation>1</Operation>
330+ </Platform>
331+ </DeployClass>
332+ <DeployClass Name="Android_LauncherIcon96">
333+ <Platform Name="Android">
334+ <RemoteDir>res\drawable-xhdpi</RemoteDir>
335+ <Operation>1</Operation>
336+ </Platform>
337+ <Platform Name="Android64">
338+ <RemoteDir>res\drawable-xhdpi</RemoteDir>
339+ <Operation>1</Operation>
340+ </Platform>
341+ </DeployClass>
342+ <DeployClass Name="Android_NotificationIcon24">
343+ <Platform Name="Android">
344+ <RemoteDir>res\drawable-mdpi</RemoteDir>
345+ <Operation>1</Operation>
346+ </Platform>
347+ <Platform Name="Android64">
348+ <RemoteDir>res\drawable-mdpi</RemoteDir>
349+ <Operation>1</Operation>
350+ </Platform>
351+ </DeployClass>
352+ <DeployClass Name="Android_NotificationIcon36">
353+ <Platform Name="Android">
354+ <RemoteDir>res\drawable-hdpi</RemoteDir>
355+ <Operation>1</Operation>
356+ </Platform>
357+ <Platform Name="Android64">
358+ <RemoteDir>res\drawable-hdpi</RemoteDir>
359+ <Operation>1</Operation>
360+ </Platform>
361+ </DeployClass>
362+ <DeployClass Name="Android_NotificationIcon48">
363+ <Platform Name="Android">
364+ <RemoteDir>res\drawable-xhdpi</RemoteDir>
365+ <Operation>1</Operation>
366+ </Platform>
367+ <Platform Name="Android64">
368+ <RemoteDir>res\drawable-xhdpi</RemoteDir>
369+ <Operation>1</Operation>
370+ </Platform>
371+ </DeployClass>
372+ <DeployClass Name="Android_NotificationIcon72">
373+ <Platform Name="Android">
374+ <RemoteDir>res\drawable-xxhdpi</RemoteDir>
375+ <Operation>1</Operation>
376+ </Platform>
377+ <Platform Name="Android64">
378+ <RemoteDir>res\drawable-xxhdpi</RemoteDir>
379+ <Operation>1</Operation>
380+ </Platform>
381+ </DeployClass>
382+ <DeployClass Name="Android_NotificationIcon96">
383+ <Platform Name="Android">
384+ <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
385+ <Operation>1</Operation>
386+ </Platform>
387+ <Platform Name="Android64">
388+ <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
389+ <Operation>1</Operation>
390+ </Platform>
391+ </DeployClass>
392+ <DeployClass Name="Android_SplashImage426">
393+ <Platform Name="Android">
394+ <RemoteDir>res\drawable-small</RemoteDir>
395+ <Operation>1</Operation>
396+ </Platform>
397+ <Platform Name="Android64">
398+ <RemoteDir>res\drawable-small</RemoteDir>
399+ <Operation>1</Operation>
400+ </Platform>
401+ </DeployClass>
402+ <DeployClass Name="Android_SplashImage470">
403+ <Platform Name="Android">
404+ <RemoteDir>res\drawable-normal</RemoteDir>
405+ <Operation>1</Operation>
406+ </Platform>
407+ <Platform Name="Android64">
408+ <RemoteDir>res\drawable-normal</RemoteDir>
409+ <Operation>1</Operation>
410+ </Platform>
411+ </DeployClass>
412+ <DeployClass Name="Android_SplashImage640">
413+ <Platform Name="Android">
414+ <RemoteDir>res\drawable-large</RemoteDir>
415+ <Operation>1</Operation>
416+ </Platform>
417+ <Platform Name="Android64">
418+ <RemoteDir>res\drawable-large</RemoteDir>
419+ <Operation>1</Operation>
420+ </Platform>
421+ </DeployClass>
422+ <DeployClass Name="Android_SplashImage960">
423+ <Platform Name="Android">
424+ <RemoteDir>res\drawable-xlarge</RemoteDir>
425+ <Operation>1</Operation>
426+ </Platform>
427+ <Platform Name="Android64">
428+ <RemoteDir>res\drawable-xlarge</RemoteDir>
429+ <Operation>1</Operation>
430+ </Platform>
431+ </DeployClass>
432+ <DeployClass Name="Android_Strings">
433+ <Platform Name="Android">
434+ <RemoteDir>res\values</RemoteDir>
435+ <Operation>1</Operation>
436+ </Platform>
437+ <Platform Name="Android64">
438+ <RemoteDir>res\values</RemoteDir>
439+ <Operation>1</Operation>
440+ </Platform>
441+ </DeployClass>
442+ <DeployClass Name="DebugSymbols">
443+ <Platform Name="iOSSimulator">
444+ <Operation>1</Operation>
445+ </Platform>
446+ <Platform Name="OSX32">
447+ <RemoteDir>Contents\MacOS</RemoteDir>
448+ <Operation>1</Operation>
449+ </Platform>
450+ <Platform Name="Win32">
451+ <Operation>0</Operation>
452+ </Platform>
453+ </DeployClass>
454+ <DeployClass Name="DependencyFramework">
455+ <Platform Name="OSX32">
456+ <RemoteDir>Contents\MacOS</RemoteDir>
457+ <Operation>1</Operation>
458+ <Extensions>.framework</Extensions>
459+ </Platform>
460+ <Platform Name="OSX64">
461+ <RemoteDir>Contents\MacOS</RemoteDir>
462+ <Operation>1</Operation>
463+ <Extensions>.framework</Extensions>
464+ </Platform>
465+ <Platform Name="Win32">
466+ <Operation>0</Operation>
467+ </Platform>
468+ </DeployClass>
469+ <DeployClass Name="DependencyModule">
470+ <Platform Name="iOSDevice32">
471+ <Operation>1</Operation>
472+ <Extensions>.dylib</Extensions>
473+ </Platform>
474+ <Platform Name="iOSDevice64">
475+ <Operation>1</Operation>
476+ <Extensions>.dylib</Extensions>
477+ </Platform>
478+ <Platform Name="iOSSimulator">
479+ <Operation>1</Operation>
480+ <Extensions>.dylib</Extensions>
481+ </Platform>
482+ <Platform Name="OSX32">
483+ <RemoteDir>Contents\MacOS</RemoteDir>
484+ <Operation>1</Operation>
485+ <Extensions>.dylib</Extensions>
486+ </Platform>
487+ <Platform Name="OSX64">
488+ <RemoteDir>Contents\MacOS</RemoteDir>
489+ <Operation>1</Operation>
490+ <Extensions>.dylib</Extensions>
491+ </Platform>
492+ <Platform Name="Win32">
493+ <Operation>0</Operation>
494+ <Extensions>.dll;.bpl</Extensions>
495+ </Platform>
496+ </DeployClass>
497+ <DeployClass Required="true" Name="DependencyPackage">
498+ <Platform Name="iOSDevice32">
499+ <Operation>1</Operation>
500+ <Extensions>.dylib</Extensions>
501+ </Platform>
502+ <Platform Name="iOSDevice64">
503+ <Operation>1</Operation>
504+ <Extensions>.dylib</Extensions>
505+ </Platform>
506+ <Platform Name="iOSSimulator">
507+ <Operation>1</Operation>
508+ <Extensions>.dylib</Extensions>
509+ </Platform>
510+ <Platform Name="OSX32">
511+ <RemoteDir>Contents\MacOS</RemoteDir>
512+ <Operation>1</Operation>
513+ <Extensions>.dylib</Extensions>
514+ </Platform>
515+ <Platform Name="OSX64">
516+ <RemoteDir>Contents\MacOS</RemoteDir>
517+ <Operation>1</Operation>
518+ <Extensions>.dylib</Extensions>
519+ </Platform>
520+ <Platform Name="Win32">
521+ <Operation>0</Operation>
522+ <Extensions>.bpl</Extensions>
523+ </Platform>
524+ </DeployClass>
525+ <DeployClass Name="File">
526+ <Platform Name="Android">
527+ <Operation>0</Operation>
528+ </Platform>
529+ <Platform Name="Android64">
530+ <Operation>0</Operation>
531+ </Platform>
532+ <Platform Name="iOSDevice32">
533+ <Operation>0</Operation>
534+ </Platform>
535+ <Platform Name="iOSDevice64">
536+ <Operation>0</Operation>
537+ </Platform>
538+ <Platform Name="iOSSimulator">
539+ <Operation>0</Operation>
540+ </Platform>
541+ <Platform Name="OSX32">
542+ <RemoteDir>Contents\Resources\StartUp\</RemoteDir>
543+ <Operation>0</Operation>
544+ </Platform>
545+ <Platform Name="OSX64">
546+ <RemoteDir>Contents\Resources\StartUp\</RemoteDir>
547+ <Operation>0</Operation>
548+ </Platform>
549+ <Platform Name="Win32">
550+ <Operation>0</Operation>
551+ </Platform>
552+ </DeployClass>
553+ <DeployClass Name="iOS_AppStore1024">
554+ <Platform Name="iOSDevice64">
555+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
556+ <Operation>1</Operation>
557+ </Platform>
558+ </DeployClass>
559+ <DeployClass Name="iPad_AppIcon152">
560+ <Platform Name="iOSDevice64">
561+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
562+ <Operation>1</Operation>
563+ </Platform>
564+ <Platform Name="iOSSimulator">
565+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
566+ <Operation>1</Operation>
567+ </Platform>
568+ </DeployClass>
569+ <DeployClass Name="iPad_AppIcon167">
570+ <Platform Name="iOSDevice64">
571+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
572+ <Operation>1</Operation>
573+ </Platform>
574+ <Platform Name="iOSSimulator">
575+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
576+ <Operation>1</Operation>
577+ </Platform>
578+ </DeployClass>
579+ <DeployClass Name="iPad_Launch1024x768">
580+ <Platform Name="iOSDevice32">
581+ <Operation>1</Operation>
582+ </Platform>
583+ <Platform Name="iOSDevice64">
584+ <Operation>1</Operation>
585+ </Platform>
586+ <Platform Name="iOSSimulator">
587+ <Operation>1</Operation>
588+ </Platform>
589+ </DeployClass>
590+ <DeployClass Name="iPad_Launch1536x2048">
591+ <Platform Name="iOSDevice32">
592+ <Operation>1</Operation>
593+ </Platform>
594+ <Platform Name="iOSDevice64">
595+ <Operation>1</Operation>
596+ </Platform>
597+ <Platform Name="iOSSimulator">
598+ <Operation>1</Operation>
599+ </Platform>
600+ </DeployClass>
601+ <DeployClass Name="iPad_Launch1668">
602+ <Platform Name="iOSDevice32">
603+ <Operation>1</Operation>
604+ </Platform>
605+ <Platform Name="iOSDevice64">
606+ <Operation>1</Operation>
607+ </Platform>
608+ <Platform Name="iOSSimulator">
609+ <Operation>1</Operation>
610+ </Platform>
611+ </DeployClass>
612+ <DeployClass Name="iPad_Launch1668x2388">
613+ <Platform Name="iOSDevice32">
614+ <Operation>1</Operation>
615+ </Platform>
616+ <Platform Name="iOSDevice64">
617+ <Operation>1</Operation>
618+ </Platform>
619+ <Platform Name="iOSSimulator">
620+ <Operation>1</Operation>
621+ </Platform>
622+ </DeployClass>
623+ <DeployClass Name="iPad_Launch2048x1536">
624+ <Platform Name="iOSDevice32">
625+ <Operation>1</Operation>
626+ </Platform>
627+ <Platform Name="iOSDevice64">
628+ <Operation>1</Operation>
629+ </Platform>
630+ <Platform Name="iOSSimulator">
631+ <Operation>1</Operation>
632+ </Platform>
633+ </DeployClass>
634+ <DeployClass Name="iPad_Launch2048x2732">
635+ <Platform Name="iOSDevice32">
636+ <Operation>1</Operation>
637+ </Platform>
638+ <Platform Name="iOSDevice64">
639+ <Operation>1</Operation>
640+ </Platform>
641+ <Platform Name="iOSSimulator">
642+ <Operation>1</Operation>
643+ </Platform>
644+ </DeployClass>
645+ <DeployClass Name="iPad_Launch2224">
646+ <Platform Name="iOSDevice32">
647+ <Operation>1</Operation>
648+ </Platform>
649+ <Platform Name="iOSDevice64">
650+ <Operation>1</Operation>
651+ </Platform>
652+ <Platform Name="iOSSimulator">
653+ <Operation>1</Operation>
654+ </Platform>
655+ </DeployClass>
656+ <DeployClass Name="iPad_Launch2388x1668">
657+ <Platform Name="iOSDevice32">
658+ <Operation>1</Operation>
659+ </Platform>
660+ <Platform Name="iOSDevice64">
661+ <Operation>1</Operation>
662+ </Platform>
663+ <Platform Name="iOSSimulator">
664+ <Operation>1</Operation>
665+ </Platform>
666+ </DeployClass>
667+ <DeployClass Name="iPad_Launch2732x2048">
668+ <Platform Name="iOSDevice32">
669+ <Operation>1</Operation>
670+ </Platform>
671+ <Platform Name="iOSDevice64">
672+ <Operation>1</Operation>
673+ </Platform>
674+ <Platform Name="iOSSimulator">
675+ <Operation>1</Operation>
676+ </Platform>
677+ </DeployClass>
678+ <DeployClass Name="iPad_Launch2x">
679+ <Platform Name="iOSDevice64">
680+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
681+ <Operation>1</Operation>
682+ </Platform>
683+ <Platform Name="iOSSimulator">
684+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
685+ <Operation>1</Operation>
686+ </Platform>
687+ </DeployClass>
688+ <DeployClass Name="iPad_Launch768x1024">
689+ <Platform Name="iOSDevice32">
690+ <Operation>1</Operation>
691+ </Platform>
692+ <Platform Name="iOSDevice64">
693+ <Operation>1</Operation>
694+ </Platform>
695+ <Platform Name="iOSSimulator">
696+ <Operation>1</Operation>
697+ </Platform>
698+ </DeployClass>
699+ <DeployClass Name="iPad_LaunchDark2x">
700+ <Platform Name="iOSDevice64">
701+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
702+ <Operation>1</Operation>
703+ </Platform>
704+ <Platform Name="iOSSimulator">
705+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
706+ <Operation>1</Operation>
707+ </Platform>
708+ </DeployClass>
709+ <DeployClass Name="iPad_Notification40">
710+ <Platform Name="iOSDevice64">
711+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
712+ <Operation>1</Operation>
713+ </Platform>
714+ <Platform Name="iOSSimulator">
715+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
716+ <Operation>1</Operation>
717+ </Platform>
718+ </DeployClass>
719+ <DeployClass Name="iPad_Setting58">
720+ <Platform Name="iOSDevice64">
721+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
722+ <Operation>1</Operation>
723+ </Platform>
724+ <Platform Name="iOSSimulator">
725+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
726+ <Operation>1</Operation>
727+ </Platform>
728+ </DeployClass>
729+ <DeployClass Name="iPad_SpotLight80">
730+ <Platform Name="iOSDevice64">
731+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
732+ <Operation>1</Operation>
733+ </Platform>
734+ <Platform Name="iOSSimulator">
735+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
736+ <Operation>1</Operation>
737+ </Platform>
738+ </DeployClass>
739+ <DeployClass Name="iPhone_AppIcon120">
740+ <Platform Name="iOSDevice64">
741+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
742+ <Operation>1</Operation>
743+ </Platform>
744+ <Platform Name="iOSSimulator">
745+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
746+ <Operation>1</Operation>
747+ </Platform>
748+ </DeployClass>
749+ <DeployClass Name="iPhone_AppIcon180">
750+ <Platform Name="iOSDevice64">
751+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
752+ <Operation>1</Operation>
753+ </Platform>
754+ <Platform Name="iOSSimulator">
755+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
756+ <Operation>1</Operation>
757+ </Platform>
758+ </DeployClass>
759+ <DeployClass Name="iPhone_Launch1125">
760+ <Platform Name="iOSDevice32">
761+ <Operation>1</Operation>
762+ </Platform>
763+ <Platform Name="iOSDevice64">
764+ <Operation>1</Operation>
765+ </Platform>
766+ <Platform Name="iOSSimulator">
767+ <Operation>1</Operation>
768+ </Platform>
769+ </DeployClass>
770+ <DeployClass Name="iPhone_Launch1136x640">
771+ <Platform Name="iOSDevice32">
772+ <Operation>1</Operation>
773+ </Platform>
774+ <Platform Name="iOSDevice64">
775+ <Operation>1</Operation>
776+ </Platform>
777+ <Platform Name="iOSSimulator">
778+ <Operation>1</Operation>
779+ </Platform>
780+ </DeployClass>
781+ <DeployClass Name="iPhone_Launch1242">
782+ <Platform Name="iOSDevice32">
783+ <Operation>1</Operation>
784+ </Platform>
785+ <Platform Name="iOSDevice64">
786+ <Operation>1</Operation>
787+ </Platform>
788+ <Platform Name="iOSSimulator">
789+ <Operation>1</Operation>
790+ </Platform>
791+ </DeployClass>
792+ <DeployClass Name="iPhone_Launch1242x2688">
793+ <Platform Name="iOSDevice32">
794+ <Operation>1</Operation>
795+ </Platform>
796+ <Platform Name="iOSDevice64">
797+ <Operation>1</Operation>
798+ </Platform>
799+ <Platform Name="iOSSimulator">
800+ <Operation>1</Operation>
801+ </Platform>
802+ </DeployClass>
803+ <DeployClass Name="iPhone_Launch1334">
804+ <Platform Name="iOSDevice32">
805+ <Operation>1</Operation>
806+ </Platform>
807+ <Platform Name="iOSDevice64">
808+ <Operation>1</Operation>
809+ </Platform>
810+ <Platform Name="iOSSimulator">
811+ <Operation>1</Operation>
812+ </Platform>
813+ </DeployClass>
814+ <DeployClass Name="iPhone_Launch1792">
815+ <Platform Name="iOSDevice32">
816+ <Operation>1</Operation>
817+ </Platform>
818+ <Platform Name="iOSDevice64">
819+ <Operation>1</Operation>
820+ </Platform>
821+ <Platform Name="iOSSimulator">
822+ <Operation>1</Operation>
823+ </Platform>
824+ </DeployClass>
825+ <DeployClass Name="iPhone_Launch2208">
826+ <Platform Name="iOSDevice32">
827+ <Operation>1</Operation>
828+ </Platform>
829+ <Platform Name="iOSDevice64">
830+ <Operation>1</Operation>
831+ </Platform>
832+ <Platform Name="iOSSimulator">
833+ <Operation>1</Operation>
834+ </Platform>
835+ </DeployClass>
836+ <DeployClass Name="iPhone_Launch2436">
837+ <Platform Name="iOSDevice32">
838+ <Operation>1</Operation>
839+ </Platform>
840+ <Platform Name="iOSDevice64">
841+ <Operation>1</Operation>
842+ </Platform>
843+ <Platform Name="iOSSimulator">
844+ <Operation>1</Operation>
845+ </Platform>
846+ </DeployClass>
847+ <DeployClass Name="iPhone_Launch2688x1242">
848+ <Platform Name="iOSDevice32">
849+ <Operation>1</Operation>
850+ </Platform>
851+ <Platform Name="iOSDevice64">
852+ <Operation>1</Operation>
853+ </Platform>
854+ <Platform Name="iOSSimulator">
855+ <Operation>1</Operation>
856+ </Platform>
857+ </DeployClass>
858+ <DeployClass Name="iPhone_Launch2x">
859+ <Platform Name="iOSDevice64">
860+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
861+ <Operation>1</Operation>
862+ </Platform>
863+ <Platform Name="iOSSimulator">
864+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
865+ <Operation>1</Operation>
866+ </Platform>
867+ </DeployClass>
868+ <DeployClass Name="iPhone_Launch320">
869+ <Platform Name="iOSDevice32">
870+ <Operation>1</Operation>
871+ </Platform>
872+ <Platform Name="iOSDevice64">
873+ <Operation>1</Operation>
874+ </Platform>
875+ <Platform Name="iOSSimulator">
876+ <Operation>1</Operation>
877+ </Platform>
878+ </DeployClass>
879+ <DeployClass Name="iPhone_Launch3x">
880+ <Platform Name="iOSDevice64">
881+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
882+ <Operation>1</Operation>
883+ </Platform>
884+ <Platform Name="iOSSimulator">
885+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
886+ <Operation>1</Operation>
887+ </Platform>
888+ </DeployClass>
889+ <DeployClass Name="iPhone_Launch640">
890+ <Platform Name="iOSDevice32">
891+ <Operation>1</Operation>
892+ </Platform>
893+ <Platform Name="iOSDevice64">
894+ <Operation>1</Operation>
895+ </Platform>
896+ <Platform Name="iOSSimulator">
897+ <Operation>1</Operation>
898+ </Platform>
899+ </DeployClass>
900+ <DeployClass Name="iPhone_Launch640x1136">
901+ <Platform Name="iOSDevice32">
902+ <Operation>1</Operation>
903+ </Platform>
904+ <Platform Name="iOSDevice64">
905+ <Operation>1</Operation>
906+ </Platform>
907+ <Platform Name="iOSSimulator">
908+ <Operation>1</Operation>
909+ </Platform>
910+ </DeployClass>
911+ <DeployClass Name="iPhone_Launch750">
912+ <Platform Name="iOSDevice32">
913+ <Operation>1</Operation>
914+ </Platform>
915+ <Platform Name="iOSDevice64">
916+ <Operation>1</Operation>
917+ </Platform>
918+ <Platform Name="iOSSimulator">
919+ <Operation>1</Operation>
920+ </Platform>
921+ </DeployClass>
922+ <DeployClass Name="iPhone_Launch828">
923+ <Platform Name="iOSDevice32">
924+ <Operation>1</Operation>
925+ </Platform>
926+ <Platform Name="iOSDevice64">
927+ <Operation>1</Operation>
928+ </Platform>
929+ <Platform Name="iOSSimulator">
930+ <Operation>1</Operation>
931+ </Platform>
932+ </DeployClass>
933+ <DeployClass Name="iPhone_LaunchDark2x">
934+ <Platform Name="iOSDevice64">
935+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
936+ <Operation>1</Operation>
937+ </Platform>
938+ <Platform Name="iOSSimulator">
939+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
940+ <Operation>1</Operation>
941+ </Platform>
942+ </DeployClass>
943+ <DeployClass Name="iPhone_LaunchDark3x">
944+ <Platform Name="iOSDevice64">
945+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
946+ <Operation>1</Operation>
947+ </Platform>
948+ <Platform Name="iOSSimulator">
949+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
950+ <Operation>1</Operation>
951+ </Platform>
952+ </DeployClass>
953+ <DeployClass Name="iPhone_Notification40">
954+ <Platform Name="iOSDevice64">
955+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
956+ <Operation>1</Operation>
957+ </Platform>
958+ <Platform Name="iOSSimulator">
959+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
960+ <Operation>1</Operation>
961+ </Platform>
962+ </DeployClass>
963+ <DeployClass Name="iPhone_Notification60">
964+ <Platform Name="iOSDevice64">
965+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
966+ <Operation>1</Operation>
967+ </Platform>
968+ <Platform Name="iOSSimulator">
969+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
970+ <Operation>1</Operation>
971+ </Platform>
972+ </DeployClass>
973+ <DeployClass Name="iPhone_Setting58">
974+ <Platform Name="iOSDevice64">
975+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
976+ <Operation>1</Operation>
977+ </Platform>
978+ <Platform Name="iOSSimulator">
979+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
980+ <Operation>1</Operation>
981+ </Platform>
982+ </DeployClass>
983+ <DeployClass Name="iPhone_Setting87">
984+ <Platform Name="iOSDevice64">
985+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
986+ <Operation>1</Operation>
987+ </Platform>
988+ <Platform Name="iOSSimulator">
989+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
990+ <Operation>1</Operation>
991+ </Platform>
992+ </DeployClass>
993+ <DeployClass Name="iPhone_Spotlight120">
994+ <Platform Name="iOSDevice64">
995+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
996+ <Operation>1</Operation>
997+ </Platform>
998+ <Platform Name="iOSSimulator">
999+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
1000+ <Operation>1</Operation>
1001+ </Platform>
1002+ </DeployClass>
1003+ <DeployClass Name="iPhone_Spotlight80">
1004+ <Platform Name="iOSDevice64">
1005+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
1006+ <Operation>1</Operation>
1007+ </Platform>
1008+ <Platform Name="iOSSimulator">
1009+ <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
1010+ <Operation>1</Operation>
1011+ </Platform>
1012+ </DeployClass>
1013+ <DeployClass Name="ProjectAndroidManifest">
1014+ <Platform Name="Android">
1015+ <Operation>1</Operation>
1016+ </Platform>
1017+ <Platform Name="Android64">
1018+ <Operation>1</Operation>
1019+ </Platform>
1020+ </DeployClass>
1021+ <DeployClass Name="ProjectiOSDeviceDebug">
1022+ <Platform Name="iOSDevice32">
1023+ <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
1024+ <Operation>1</Operation>
1025+ </Platform>
1026+ <Platform Name="iOSDevice64">
1027+ <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
1028+ <Operation>1</Operation>
1029+ </Platform>
1030+ </DeployClass>
1031+ <DeployClass Name="ProjectiOSDeviceResourceRules">
1032+ <Platform Name="iOSDevice32">
1033+ <Operation>1</Operation>
1034+ </Platform>
1035+ <Platform Name="iOSDevice64">
1036+ <Operation>1</Operation>
1037+ </Platform>
1038+ </DeployClass>
1039+ <DeployClass Name="ProjectiOSEntitlements">
1040+ <Platform Name="iOSDevice32">
1041+ <RemoteDir>..\</RemoteDir>
1042+ <Operation>1</Operation>
1043+ </Platform>
1044+ <Platform Name="iOSDevice64">
1045+ <RemoteDir>..\</RemoteDir>
1046+ <Operation>1</Operation>
1047+ </Platform>
1048+ </DeployClass>
1049+ <DeployClass Name="ProjectiOSInfoPList">
1050+ <Platform Name="iOSDevice32">
1051+ <Operation>1</Operation>
1052+ </Platform>
1053+ <Platform Name="iOSDevice64">
1054+ <Operation>1</Operation>
1055+ </Platform>
1056+ <Platform Name="iOSSimulator">
1057+ <Operation>1</Operation>
1058+ </Platform>
1059+ </DeployClass>
1060+ <DeployClass Name="ProjectiOSLaunchScreen">
1061+ <Platform Name="iOSDevice64">
1062+ <RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
1063+ <Operation>64</Operation>
1064+ </Platform>
1065+ <Platform Name="iOSSimulator">
1066+ <RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
1067+ <Operation>64</Operation>
1068+ </Platform>
1069+ </DeployClass>
1070+ <DeployClass Name="ProjectiOSResource">
1071+ <Platform Name="iOSDevice32">
1072+ <Operation>1</Operation>
1073+ </Platform>
1074+ <Platform Name="iOSDevice64">
1075+ <Operation>1</Operation>
1076+ </Platform>
1077+ <Platform Name="iOSSimulator">
1078+ <Operation>1</Operation>
1079+ </Platform>
1080+ </DeployClass>
1081+ <DeployClass Name="ProjectOSXDebug">
1082+ <Platform Name="OSX64">
1083+ <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
1084+ <Operation>1</Operation>
1085+ </Platform>
1086+ </DeployClass>
1087+ <DeployClass Name="ProjectOSXEntitlements">
1088+ <Platform Name="OSX32">
1089+ <RemoteDir>..\</RemoteDir>
1090+ <Operation>1</Operation>
1091+ </Platform>
1092+ <Platform Name="OSX64">
1093+ <RemoteDir>..\</RemoteDir>
1094+ <Operation>1</Operation>
1095+ </Platform>
1096+ </DeployClass>
1097+ <DeployClass Name="ProjectOSXInfoPList">
1098+ <Platform Name="OSX32">
1099+ <RemoteDir>Contents</RemoteDir>
1100+ <Operation>1</Operation>
1101+ </Platform>
1102+ <Platform Name="OSX64">
1103+ <RemoteDir>Contents</RemoteDir>
1104+ <Operation>1</Operation>
1105+ </Platform>
1106+ </DeployClass>
1107+ <DeployClass Name="ProjectOSXResource">
1108+ <Platform Name="OSX32">
1109+ <RemoteDir>Contents\Resources</RemoteDir>
1110+ <Operation>1</Operation>
1111+ </Platform>
1112+ <Platform Name="OSX64">
1113+ <RemoteDir>Contents\Resources</RemoteDir>
1114+ <Operation>1</Operation>
1115+ </Platform>
1116+ </DeployClass>
1117+ <DeployClass Required="true" Name="ProjectOutput">
1118+ <Platform Name="Android">
1119+ <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
1120+ <Operation>1</Operation>
1121+ </Platform>
1122+ <Platform Name="Android64">
1123+ <RemoteDir>library\lib\arm64-v8a</RemoteDir>
1124+ <Operation>1</Operation>
1125+ </Platform>
1126+ <Platform Name="iOSDevice32">
1127+ <Operation>1</Operation>
1128+ </Platform>
1129+ <Platform Name="iOSDevice64">
1130+ <Operation>1</Operation>
1131+ </Platform>
1132+ <Platform Name="iOSSimulator">
1133+ <Operation>1</Operation>
1134+ </Platform>
1135+ <Platform Name="Linux64">
1136+ <Operation>1</Operation>
1137+ </Platform>
1138+ <Platform Name="OSX32">
1139+ <RemoteDir>Contents\MacOS</RemoteDir>
1140+ <Operation>1</Operation>
1141+ </Platform>
1142+ <Platform Name="OSX64">
1143+ <RemoteDir>Contents\MacOS</RemoteDir>
1144+ <Operation>1</Operation>
1145+ </Platform>
1146+ <Platform Name="Win32">
1147+ <Operation>0</Operation>
1148+ </Platform>
1149+ </DeployClass>
1150+ <DeployClass Name="ProjectOutput_Android32">
1151+ <Platform Name="Android64">
1152+ <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
1153+ <Operation>1</Operation>
1154+ </Platform>
1155+ </DeployClass>
1156+ <DeployClass Name="ProjectUWPManifest">
1157+ <Platform Name="Win32">
1158+ <Operation>1</Operation>
1159+ </Platform>
1160+ <Platform Name="Win64">
1161+ <Operation>1</Operation>
1162+ </Platform>
1163+ </DeployClass>
1164+ <DeployClass Name="UWP_DelphiLogo150">
1165+ <Platform Name="Win32">
1166+ <RemoteDir>Assets</RemoteDir>
1167+ <Operation>1</Operation>
1168+ </Platform>
1169+ <Platform Name="Win64">
1170+ <RemoteDir>Assets</RemoteDir>
1171+ <Operation>1</Operation>
1172+ </Platform>
1173+ </DeployClass>
1174+ <DeployClass Name="UWP_DelphiLogo44">
1175+ <Platform Name="Win32">
1176+ <RemoteDir>Assets</RemoteDir>
1177+ <Operation>1</Operation>
1178+ </Platform>
1179+ <Platform Name="Win64">
1180+ <RemoteDir>Assets</RemoteDir>
1181+ <Operation>1</Operation>
1182+ </Platform>
1183+ </DeployClass>
1184+ <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
1185+ <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
1186+ <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
1187+ <ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
1188+ <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
1189+ <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/>
1190+ <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
1191+ <ProjectRoot Platform="OSX64" Name="$(PROJECTNAME).app"/>
1192+ <ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/>
1193+ <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
1194+ </Deployment>
1195+ <Platforms>
1196+ <Platform value="Win32">True</Platform>
1197+ <Platform value="Win64">False</Platform>
1198+ </Platforms>
1199+ </BorlandProject>
1200+ <ProjectFileVersion>12</ProjectFileVersion>
1201+ </ProjectExtensions>
1202+ <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
1203+ <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
1204+ <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
1205+ <PropertyGroup Condition="'$(Config)'=='Debug' And '$(Platform)'=='Win32'">
1206+ <PreBuildEvent>call ..\buildtools\prebuild.cmd $(PROJECTPATH)</PreBuildEvent>
1207+ <PreBuildEventIgnoreExitCode>False</PreBuildEventIgnoreExitCode>
1208+ <PreLinkEvent/>
1209+ <PreLinkEventIgnoreExitCode>False</PreLinkEventIgnoreExitCode>
1210+ <PostBuildEvent>call ..\buildtools\postbuild.cmd $(OUTPUTDIR)$(OUTPUTNAME)</PostBuildEvent>
1211+ <PostBuildEventIgnoreExitCode>False</PostBuildEventIgnoreExitCode>
1212+ </PropertyGroup>
1213+ <PropertyGroup Condition="'$(Config)'=='Debug' And '$(Platform)'=='Win64'">
1214+ <PreBuildEvent>call ..\buildtools\prebuild.cmd $(PROJECTPATH)</PreBuildEvent>
1215+ <PreBuildEventIgnoreExitCode>False</PreBuildEventIgnoreExitCode>
1216+ <PreLinkEvent/>
1217+ <PreLinkEventIgnoreExitCode>False</PreLinkEventIgnoreExitCode>
1218+ <PostBuildEvent>call ..\buildtools\postbuild.cmd $(OUTPUTDIR)$(OUTPUTNAME)</PostBuildEvent>
1219+ <PostBuildEventIgnoreExitCode>False</PostBuildEventIgnoreExitCode>
1220+ </PropertyGroup>
1221+ <PropertyGroup Condition="'$(Config)'=='Release' And '$(Platform)'=='Win32'">
1222+ <PreBuildEvent>call ..\buildtools\prebuild.cmd $(PROJECTPATH)</PreBuildEvent>
1223+ <PreBuildEventIgnoreExitCode>False</PreBuildEventIgnoreExitCode>
1224+ <PreLinkEvent/>
1225+ <PreLinkEventIgnoreExitCode>False</PreLinkEventIgnoreExitCode>
1226+ <PostBuildEvent>call ..\buildtools\postbuild.cmd $(OUTPUTDIR)$(OUTPUTNAME)</PostBuildEvent>
1227+ <PostBuildEventIgnoreExitCode>False</PostBuildEventIgnoreExitCode>
1228+ </PropertyGroup>
1229+ <PropertyGroup Condition="'$(Config)'=='Release' And '$(Platform)'=='Win64'">
1230+ <PreBuildEvent>call ..\buildtools\prebuild.cmd $(PROJECTPATH)</PreBuildEvent>
1231+ <PreBuildEventIgnoreExitCode>False</PreBuildEventIgnoreExitCode>
1232+ <PreLinkEvent/>
1233+ <PreLinkEventIgnoreExitCode>False</PreLinkEventIgnoreExitCode>
1234+ <PostBuildEvent>call ..\buildtools\postbuild.cmd $(OUTPUTDIR)$(OUTPUTNAME)</PostBuildEvent>
1235+ <PostBuildEventIgnoreExitCode>False</PostBuildEventIgnoreExitCode>
1236+ </PropertyGroup>
1237+</Project>
--- tags/1.0.7/src/dzBdsLauncher.manifest.in (nonexistent)
+++ tags/1.0.7/src/dzBdsLauncher.manifest.in (revision 42)
@@ -0,0 +1,53 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+<!--
3+ This manifest tells Windows Vista to Windows 10 not to virtualize any file
4+ or registry access. Also, it disables themes support.
5+ -->
6+ <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
7+ <assemblyIdentity version="1.0.0.0"
8+ processorArchitecture="*"
9+ name="template from dzlib build tools"
10+ type="win32"/>
11+<!-- We do not want themes support
12+ <dependency>
13+ <dependentassembly>
14+ <assemblyidentity type="win32"
15+ name="Microsoft.Windows.Common-Controls"
16+ version="6.0.0.0"
17+ publickeytoken="6595b64144ccf1df"
18+ language="*" processorarchitecture="*">
19+ </assemblyidentity>
20+ </dependentassembly>
21+ <dependency>
22+ -->
23+ <description>This application was built using buildtools from dzlib</description>
24+ <!-- COMPATIBILITY SECTION SPECIFIES IF APP IS COMPLIANT
25+ DISABLES PCA IF SPECIFIED -->
26+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
27+ <application>
28+ <!-- We support Windows Vista -->
29+ <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
30+ <!-- We support Windows 7 -->
31+ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
32+ <!-- We support Windows 8 -->
33+ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
34+ <!-- We support Windows 8.1 -->
35+ <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
36+ <!-- We support Windows 10 -->
37+ <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
38+ </application>
39+ </compatibility>
40+
41+ <!-- TRUSTINFO SECTION SPECIFIES REQUESTED PERMISSIONS AND
42+ UIPI DISABLEMENT (SPECIAL CONDITIONS APPLY TO UIPI DISABLEMENT)-->
43+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
44+ <security>
45+ <requestedPrivileges>
46+ <requestedExecutionLevel
47+ level="asInvoker"
48+ uiAccess="false"
49+ />
50+ </requestedPrivileges>
51+ </security>
52+ </trustInfo>
53+</assembly>
\ No newline at end of file
--- tags/1.0.7/src/dzBdsLauncher_version.ini (nonexistent)
+++ tags/1.0.7/src/dzBdsLauncher_version.ini (revision 42)
@@ -0,0 +1,25 @@
1+[Version Info]
2+AutoIncBuild=0
3+Build=306
4+MajorVer=1
5+MinorVer=0
6+Release=7
7+Private=0
8+Special=0
9+Revision=
10+
11+[Version Info Keys]
12+FileVersion=1.0.7.306
13+ProductVersion={today}
14+FileDescription=dzBdsLauncher
15+OriginalFilename=dzBdsLauncher
16+Comments=
17+CompanyName=dummzeuch.de
18+InternalName=dzBdsLauncher
19+LegalCopyright=Thomas Mueller, 2019-{ThisYear}
20+LegalTrademarks=T. Mueller
21+ProductName=dzBdsLauncher
22+BuildDateTime={today}
23+PrivateBuild=
24+SpecialBuild=
25+
--- tags/1.0.7/src/u_dzBdsLauncher.pas (nonexistent)
+++ tags/1.0.7/src/u_dzBdsLauncher.pas (revision 42)
@@ -0,0 +1,515 @@
1+unit u_dzBdsLauncher;
2+
3+{$DEFINE WAIT_BEFORE_CALL}
4+
5+{$IFDEF RELEASE}
6+{$UNDEF WAIT_BEFORE_CALL}
7+{$ENDIF}
8+
9+interface
10+
11+uses
12+ Winapi.Windows,
13+ System.SysUtils,
14+ System.Classes,
15+ u_dzTranslator;
16+
17+procedure Main;
18+
19+implementation
20+
21+uses
22+ System.StrUtils,
23+ System.Generics.Collections,
24+ System.IniFiles,
25+ u_dzExecutor,
26+ u_dzClassUtils,
27+ u_dzStringUtils,
28+ u_dzFileUtils,
29+ u_dzTypes,
30+ u_dzStdOut;
31+
32+type
33+ TDelphiVersion = (
34+ dvUnknown,
35+ dv6, dv7,
36+ dv2005, dv2006,
37+ dv2007, dv2009, dv2010,
38+ dvXE, dvXE2, dvXE3, dvXE4, dvXE5, dvXE6, dvXE7, dvXE8,
39+ dv10, dv10_1, dv10_2, dv10_3, dv10_4,
40+ dv11);
41+ TDelphiVersionSet = set of TDelphiVersion;
42+
43+type
44+ TDelphiInfo = class
45+ private
46+ FName: string;
47+ FRegKey: string;
48+ FDllSuffix: string;
49+ FExtensions: TStringArray;
50+ FProjectVersions: TStringArray;
51+ public
52+ constructor Create(const _Name, _RegKey, _DllSuffix: string;
53+ const _ProjectVersions: TStringArray;
54+ const _Extensions: TStringArray);
55+ destructor Destroy; override;
56+ procedure CallIde(const _Param: string);
57+ function HasProductVersion(const _ProdVer: string): Boolean;
58+ function HasExtension(const _Ext: string): Boolean;
59+ property Name: string read FName;
60+ property RegKey: string read FRegKey;
61+ property DllSuffix: string read FDllSuffix;
62+ end;
63+
64+{ TDelphiInfo }
65+
66+constructor TDelphiInfo.Create(const _Name, _RegKey, _DllSuffix: string;
67+ const _ProjectVersions: TStringArray;
68+ const _Extensions: TStringArray);
69+begin
70+ inherited Create;
71+ FName := _Name;
72+ FRegKey := _RegKey;
73+ FDllSuffix := _DllSuffix;
74+ FProjectVersions := _ProjectVersions;
75+ FExtensions := _Extensions;
76+end;
77+
78+destructor TDelphiInfo.Destroy;
79+begin
80+ inherited;
81+end;
82+
83+function TDelphiInfo.HasExtension(const _Ext: string): Boolean;
84+var
85+ Ext: string;
86+begin
87+ Assert(Leftstr(_Ext, 1) = '.');
88+ Ext := TailStr(_Ext, 2);
89+ Result := (IndexText(Ext, FExtensions) <> -1);
90+end;
91+
92+function TDelphiInfo.HasProductVersion(const _ProdVer: string): Boolean;
93+begin
94+ Result := (IndexText(_ProdVer, FProjectVersions) <> -1);
95+end;
96+
97+procedure TDelphiInfo.CallIde(const _Param: string);
98+var
99+ Exe: TExecutor;
100+ Executable: string;
101+ Idx: Integer;
102+begin
103+ if not TRegistry_TryReadString('SOFTWARE\' + FRegKey, 'App', Executable) then
104+ raise Exception.CreateFmt('Could not read value App from registry key "%s"', [FRegKey]);
105+ StdOut.WriteLn(ccLightGreen, 'Calling Delphi %s', [Name]);
106+ StdOut.WriteLn(ccLightGreen, Executable + ' ' + _Param);
107+{$IFDEF WAIT_BEFORE_CALL}
108+ StdOut.Pause;
109+{$ENDIF}
110+
111+ Exe := TExecutor.Create;
112+ try
113+ Exe.Exename := Executable;
114+ Exe.Commandline := _Param;
115+ if DebugHook <> 0 then begin
116+ // When we are running in the debugger, the following environment variables have been
117+ // set by the IDE and must be deleted in order to not confuse the IDE we want to start
118+ // (Delphi 6 and 7 are particularly prone to failing if we don't do that).
119+ Idx := Exe.Environment.IndexOfName('DELPHI');
120+ if Idx <> -1 then
121+ Exe.Environment.Delete(Idx);
122+ Idx := Exe.Environment.IndexOfName('BDS');
123+ if Idx <> -1 then
124+ Exe.Environment.Delete(Idx);
125+ end;
126+ // just in case I need to inspect the environmen variables again:
127+ // exe.Exename := 'C:\Program Files\JPSoft\TCMD17x64\tcc.exe';
128+ // exe.Commandline := '';
129+ Exe.doExecute(True);
130+ finally
131+ FreeAndNil(Exe);
132+ end;
133+end;
134+
135+type
136+ TDelphiInfoList = class(TDictionary<TDelphiVersion, TDelphiInfo>)
137+ private
138+ function CheckDllSuffix(_sl: TStringList; const _ProjVer: string;
139+ const _Possibles: TDelphiVersionSet): TDelphiVersion;
140+ function CheckDprojContent(const _fn: string): TDelphiVersion;
141+ function GetDelphiVersionForDproj(const _fn: string): TDelphiVersion;
142+ procedure HandleDproj(const _fn: string);
143+ procedure HandleGroupProj(const _fn: string);
144+ procedure HandleBdsProj(const _fn: string);
145+ procedure HandleDof(const _fn: string);
146+ procedure HandleDprOrDpk(const _fn: string);
147+ function CheckExcludedPackages(_sl: TStringList; const _Possibles: TDelphiVersionSet): TDelphiVersion;
148+ public
149+ constructor Create;
150+ procedure HandleFile(const _fn: string);
151+ end;
152+
153+constructor TDelphiInfoList.Create;
154+begin
155+ inherited Create;
156+ Add(dv6, TDelphiInfo.Create('6', 'Borland\Delphi\6.0', '60', ['6.0'], ['6']));
157+ Add(dv7, TDelphiInfo.Create('7', 'Borland\Delphi\7.0', '70', ['7.0'], ['7']));
158+ Add(dv2005, TDelphiInfo.Create('2005', 'Borland\BDS\3.0', '90', [], ['2005']));
159+ Add(dv2006, TDelphiInfo.Create('2006', 'Borland\BDS\4.0', '100', [], ['2006']));
160+ Add(dv2007, TDelphiInfo.Create('2007', 'Borland\BDS\5.0', '110', [], ['2007']));
161+ Add(dv2009, TDelphiInfo.Create('2009', 'CodeGear\BDS\6.0', '120', ['12.0'], ['2009']));
162+ Add(dv2010, TDelphiInfo.Create('2010', 'CodeGear\BDS\7.0', '140', ['12.0'], ['2010']));
163+ Add(dvXE, TDelphiInfo.Create('XE', 'Embarcadero\BDS\8.0', '150', ['12.2', '12.3'], ['XE', 'XE1']));
164+ Add(dvXE2, TDelphiInfo.Create('XE2', 'Embarcadero\BDS\9.0', '160', ['13.4'], ['XE2']));
165+ Add(dvXE3, TDelphiInfo.Create('XE3', 'Embarcadero\BDS\10.0', '170', ['14.3', '14.4'], ['XE3']));
166+ Add(dvXE4, TDelphiInfo.Create('XE4', 'Embarcadero\BDS\11.0', '180', ['14.4', '14.6'], ['XE4']));
167+ Add(dvXE5, TDelphiInfo.Create('XE5', 'Embarcadero\BDS\12.0', '190', ['15.1', '15.3'], ['XE5']));
168+ Add(dvXE6, TDelphiInfo.Create('XE6', 'Embarcadero\BDS\14.0', '200', ['15.4'], ['XE6']));
169+ Add(dvXE7, TDelphiInfo.Create('XE7', 'Embarcadero\BDS\15.0', '210', ['16.0', '16.1'], ['XE7']));
170+ Add(dvXE8, TDelphiInfo.Create('XE8', 'Embarcadero\BDS\16.0', '220', ['17.2'], ['XE8']));
171+ Add(dv10, TDelphiInfo.Create('10', 'Embarcadero\BDS\17.0', '230', ['18.0', '18.1'], ['10', '10-0', '10.0', '10_0']));
172+ Add(dv10_1, TDelphiInfo.Create('10.1', 'Embarcadero\BDS\18.0', '240', ['18.1', '18.2'], ['10-1', '10.1', '10_1']));
173+ Add(dv10_2, TDelphiInfo.Create('10.2', 'Embarcadero\BDS\19.0', '250', ['18.2', '18.3', '18.4'], ['10-2', '10.2', '10_2']));
174+ Add(dv10_3, TDelphiInfo.Create('10.3', 'Embarcadero\BDS\20.0', '260', ['18.5', '18.6', '18.7', '18.8'], ['10-3', '10.3', '10_3']));
175+ Add(dv10_4, TDelphiInfo.Create('10.4', 'Embarcadero\BDS\21.0', '270', ['19.0', '19.1', '19.2'], ['10-4', '10.4', '10_4']));
176+ Add(dv11, TDelphiInfo.Create('11', 'Embarcadero\BDS\22.0', '280', ['19.3'], ['11']));
177+end;
178+
179+function TDelphiInfoList.CheckDllSuffix(_sl: TStringList; const _ProjVer: string;
180+ const _Possibles: TDelphiVersionSet): TDelphiVersion;
181+const
182+ START_TAG = '<DllSuffix>';
183+ END_TAG = '</DllSuffix>';
184+var
185+ i: Integer;
186+ s: string;
187+ len: Integer;
188+ Item: TPair<TDelphiVersion, TDelphiInfo>;
189+ dv: TDelphiVersion;
190+begin
191+ for i := 0 to _sl.Count - 1 do begin
192+ s := Trim(_sl[i]);
193+ if StartsText(START_TAG, s) and EndsText(END_TAG, s) then begin
194+ len := Length(s);
195+ s := Copy(s, Length(START_TAG) + 1, len - Length(START_TAG) - Length(END_TAG));
196+ if s <> '' then begin
197+ StdOut.WriteLn(_('Found DllSuffix %s'), [s]);
198+ if _Possibles <> [] then begin
199+ for dv in _Possibles do begin
200+ if SameText(s, Self.Items[dv].DllSuffix) then begin
201+ StdOut.WriteLn(_('DllSuffix %s was used by Delphi %s'), [s, Self.Items[dv].Name]);
202+ Exit(dv); //==>
203+ end;
204+ end;
205+ end else begin
206+ for Item in Self do begin
207+ if SameText(s, Item.Value.DllSuffix) then begin
208+ StdOut.WriteLn(_('DllSuffix %s was used by Delphi %s'), [s, Item.Value.Name]);
209+ Exit(Item.Key); //==>
210+ end;
211+ end;
212+ end;
213+ raise Exception.CreateFmt(
214+ _('Cannot determine Delphi version for ProjectVersion "%s" and DllSuffix "%s"'),
215+ [_ProjVer, s]);
216+ end;
217+ end;
218+ end;
219+ Result := dvUnknown;
220+end;
221+
222+function TDelphiInfoList.CheckExcludedPackages(_sl: TStringList;
223+ const _Possibles: TDelphiVersionSet): TDelphiVersion;
224+const
225+ START_TAG = '<Excluded_Packages Name="';
226+ END_TAG1 = '">';
227+var
228+ i: Integer;
229+ s: string;
230+ len: Integer;
231+ dv: TDelphiVersion;
232+begin
233+ Assert(_Possibles <> []);
234+
235+ Result := dvUnknown;
236+ for i := 0 to _sl.Count - 1 do begin
237+ s := Trim(_sl[i]);
238+ if StartsText(START_TAG, s) then begin
239+ len := Pos(END_TAG1, s);
240+ if len > 0 then begin
241+ s := Copy(s, Length(START_TAG) + 1, len - Length(START_TAG) - Length(END_TAG1) + 1);
242+ end else
243+ Continue; //==^
244+
245+ for dv in _Possibles do begin
246+ if EndsText(Items[dv].DllSuffix + '.bpl', s) then begin
247+ StdOut.WriteLn(Format(_('Found an excluded package with Delphi %s suffix.'), [Items[dv].Name]));
248+ Result := dv;
249+ Exit; //==>
250+ end;
251+ end;
252+ end;
253+ end;
254+end;
255+
256+function TDelphiInfoList.CheckDprojContent(const _fn: string): TDelphiVersion;
257+const
258+ START_TAG = '<ProjectVersion>';
259+ END_TAG = '</ProjectVersion>';
260+var
261+ sl: TStringList;
262+ i: Integer;
263+ s: string;
264+ len: Integer;
265+ Item: TPair<TDelphiVersion, TDelphiInfo>;
266+ Possibles: TDelphiVersionSet;
267+begin
268+ Result := dvUnknown;
269+ sl := TStringList.Create;
270+ try
271+ sl.LoadFromFile(_fn);
272+ for i := 0 to sl.Count - 1 do begin
273+ s := Trim(sl[i]);
274+ if StartsText(START_TAG, s) and EndsText(END_TAG, s) then begin
275+ len := Length(s);
276+ s := Copy(s, Length(START_TAG) + 1, len - Length(START_TAG) - Length(END_TAG));
277+ if s <> '' then begin
278+ StdOut.WriteLn(_('Found ProjectVersion "%s"'), [s]);
279+ for Item in Self do begin
280+ if Item.Value.HasProductVersion(s) then begin
281+ if Result = dvUnknown then begin
282+ StdOut.WriteLn(_('ProjectVersion "%s" was used by Delphi %s'), [s, Item.Value.Name]);
283+ Result := Item.Key;
284+ end else begin
285+ // duplicate ProjectVersion (we assume that not more than two Delphi versions
286+ // used the same ProjectVersion, which has been the case up to Delphi 10.4)
287+ StdOut.Warning.WriteLn(_('ProjectVersion "%s" can be Delphi %s or %s, checking for DllSuffix'),
288+ [s, Self.Items[Result].Name, Item.Value.Name]);
289+ Possibles := [Result, Item.Key];
290+ Result := CheckDllSuffix(sl, s, Possibles);
291+ if Result = dvUnknown then begin
292+ StdOut.Warning.WriteLn(_('Did not find DllSuffix, checking Excluded_Packages'));
293+ Result := CheckExcludedPackages(sl, Possibles);
294+ end;
295+ Exit; //==>
296+ end;
297+ end;
298+ end;
299+ if Result <> dvUnknown then begin
300+ Exit; //==>
301+ end;
302+ StdOut.Warning.WriteLn(_('ProjectVersion "%s" unkonwn checking for DllSuffix'), [s]);
303+ Result := CheckDllSuffix(sl, s, [dv10..dv10_3]);
304+ if Result = dvUnknown then begin
305+ StdOut.Warning.WriteLn(_('Did not find DllSuffix, checking Excluded_Packages'));
306+ Result := CheckExcludedPackages(sl, Possibles);
307+ end;
308+ Exit; //==
309+ end else
310+ raise Exception.CreateFmt(_('Cannot determine Delphi version for ProjectVersion "%s"'), [s]);
311+ end;
312+ end;
313+ // no <ProjectVersion> means Delphi 2007
314+ StdOut.WriteLn(_('No ProjectVersion found, assuming Delphi 2007'));
315+ Result := dv2007;
316+ finally
317+ FreeAndNil(sl);
318+ end;
319+end;
320+
321+function TDelphiInfoList.GetDelphiVersionForDproj(const _fn: string): TDelphiVersion;
322+var
323+ fno: string;
324+ dir: string;
325+ Suffix: string;
326+ Item: TPair<TDelphiVersion, TDelphiInfo>;
327+begin
328+ dir := ExtractFileDir(_fn);
329+ fno := ChangeFileExt(ExtractFileName(_fn), '');
330+ Suffix := ExtractFileExt(fno);
331+ if Suffix <> '' then begin
332+ StdOut.WriteLn(_('Suffix is %s'), [Suffix]);
333+ for Item in Self do begin
334+ if Item.Value.HasExtension(Suffix) then
335+ Exit(Item.Key); //==>
336+ end;
337+ end;
338+ StdOut.Warning.WriteLn(_('No known suffix detected, reading DPROJ file.'));
339+ Result := CheckDprojContent(_fn);
340+end;
341+
342+procedure TDelphiInfoList.HandleDproj(const _fn: string);
343+var
344+ dv: TDelphiVersion;
345+begin
346+ dv := GetDelphiVersionForDproj(_fn);
347+ Items[dv].CallIde(_fn);
348+end;
349+
350+procedure TDelphiInfoList.HandleGroupProj(const _fn: string);
351+const
352+ START_TAG = '<Projects Include="';
353+ END_TAG1 = '">';
354+ END_TAG2 = '" />';
355+var
356+ sl: TStringList;
357+ i: Integer;
358+ s: string;
359+ len: Integer;
360+ dir: string;
361+ dv: TDelphiVersion;
362+begin
363+ sl := TStringList.Create;
364+ try
365+ sl.LoadFromFile(_fn);
366+ for i := 0 to sl.Count - 1 do begin
367+ s := Trim(sl[i]);
368+ if StartsText(START_TAG, s) then begin
369+ len := Length(s);
370+ if EndsText(END_TAG1, s) then begin
371+ s := Copy(s, Length(START_TAG) + 1, len - Length(START_TAG) - Length(END_TAG1));
372+ end else if EndsText(END_TAG2, s) then begin
373+ s := Copy(s, Length(START_TAG) + 1, len - Length(START_TAG) - Length(END_TAG2));
374+ end else
375+ Continue; //==^
376+
377+ dir := ExtractFileDir(_fn);
378+ s := TFileSystem.ExpandFileNameRelBaseDir(s, dir);
379+ StdOut.WriteLn(_('First project is: %s'), [s]);
380+ dv := GetDelphiVersionForDproj(s);
381+ Items[dv].CallIde(_fn);
382+ Exit; //==>
383+ end;
384+ end;
385+ finally
386+ FreeAndNil(sl);
387+ end;
388+ raise Exception.CreateFmt(_('Could not determine Delhpi version for %s'), [_fn]);
389+end;
390+
391+procedure TDelphiInfoList.HandleBdsProj(const _fn: string);
392+const
393+ START_TAG = '<Excluded_Packages Name="';
394+ END_TAG1 = '">';
395+ END_TAG2 = '" />';
396+var
397+ sl: TStringList;
398+ DprFn: string;
399+ dv: TDelphiVersion;
400+begin
401+ sl := TStringList.Create;
402+ try
403+ sl.LoadFromFile(_fn);
404+ dv := CheckExcludedPackages(sl, [dv2005, dv2006]);
405+ if dv <> dvUnknown then begin
406+ DprFn := ChangeFileExt(_fn, '.dpr');
407+ Items[dv].CallIde(DprFn);
408+ Exit; //==>
409+ end;
410+ finally
411+ FreeAndNil(sl);
412+ end;
413+ raise Exception.CreateFmt(_('Could not determine Delhpi version for %s'), [_fn]);
414+end;
415+
416+procedure TDelphiInfoList.HandleDof(const _fn: string);
417+var
418+ Ini: TMemIniFile;
419+ Version: string;
420+ DprFn: string;
421+begin
422+ DprFn := ChangeFileExt(_fn, '.dpr');
423+ Ini := TMemIniFile.Create(_fn);
424+ try
425+ Version := Ini.readString('FileVersion', 'Version', '');
426+ if Version = '6.0' then
427+ Items[dv6].CallIde(DprFn)
428+ else if Version = '7.0' then
429+ Items[dv7].CallIde(DprFn)
430+ else
431+ raise Exception.CreateFmt(_('Could not determine Delhpi version for %s'), [_fn]);
432+ finally
433+ FreeAndNil(Ini);
434+ end;
435+end;
436+
437+procedure TDelphiInfoList.HandleDprOrDpk(const _fn: string);
438+var
439+ fn: string;
440+begin
441+ // we can't determine the Delphi version based on the DPR file, so we look for a corresponding
442+ // DPROJ, BDSPROJ or DOF file
443+ fn := ChangeFileExt(_fn, '.dproj');
444+ if FileExists(fn) then begin
445+ HandleDproj(fn);
446+ end else begin
447+ fn := ChangeFileExt(_fn, '.bdsproj');
448+ if FileExists(fn) then begin
449+ HandleBdsProj(fn);
450+ end else begin
451+ fn := ChangeFileExt(_fn, '.dof');
452+ if FileExists(fn) then begin
453+ HandleDof(fn);
454+ end;
455+ end;
456+ end;
457+end;
458+
459+procedure TDelphiInfoList.HandleFile(const _fn: string);
460+var
461+ Ext: string;
462+begin
463+ Ext := ExtractFileExt(_fn);
464+ if SameText(Ext, '.dpr') then begin
465+ StdOut.WriteLn('DPR file detected');
466+ HandleDprOrDpk(_fn);
467+ end else if SameText(Ext, '.dpk') then begin
468+ StdOut.WriteLn('DPK file detected');
469+ HandleDprOrDpk(_fn);
470+ end else if SameText(Ext, '.dproj') then begin
471+ StdOut.WriteLn('DPROJ file detected');
472+ HandleDproj(_fn);
473+ end else if SameText(Ext, '.groupproj') then begin
474+ StdOut.WriteLn('GROUPPROJ file detected');
475+ HandleGroupProj(_fn);
476+ end else if SameText(Ext, '.bdsproj') then begin
477+ StdOut.WriteLn('BDSPROJ file detected');
478+ HandleBdsProj(_fn);
479+ end else if SameText(Ext, '.dof') then begin
480+ StdOut.WriteLn('DOF file detected');
481+ HandleDof(_fn);
482+ end else
483+ raise Exception.Create('Only .dproj or .groupproj files are supported.');
484+end;
485+
486+procedure Main;
487+var
488+ fn: string;
489+ List: TDelphiInfoList;
490+begin
491+ try
492+ StdOut.WriteLn('dzBdsLauncher was called as:');
493+ StdOut.WriteLn(ccWhite, GetCommandLine);
494+ if ParamCount <> 1 then
495+ raise Exception.Create('You must pass excatly one .dproj or .groupproj file as parameter.');
496+
497+ List := TDelphiInfoList.Create;
498+ try
499+ fn := ParamStr(1);
500+ List.HandleFile(fn);
501+ finally
502+ FreeAndNil(List);
503+ end;
504+ except
505+ on E: Exception do begin
506+ StdOut.Error.WriteLn('%s: %s', [E.ClassName, E.Message]);
507+ StdOut.Pause('Press enter');
508+ end;
509+ end;
510+end;
511+
512+end.
513+
514+
515+
--- tags/1.0.7/src/u_dzStdOut.pas (nonexistent)
+++ tags/1.0.7/src/u_dzStdOut.pas (revision 42)
@@ -0,0 +1,200 @@
1+unit u_dzStdOut;
2+
3+interface
4+
5+uses
6+ SysUtils,
7+ Velthuis.Console;
8+
9+type
10+ TConsoleColors = (
11+ // Background and foreground colors
12+ ccBlack = Velthuis.Console.Black,
13+ ccBlue = Velthuis.Console.Blue,
14+ ccGreen = Velthuis.Console.Green,
15+ ccCyan = Velthuis.Console.Cyan,
16+ ccRed = Velthuis.Console.Red,
17+ ccMagenta = Velthuis.Console.Magenta,
18+ ccBrown = Velthuis.Console.Brown,
19+ ccLightGray = Velthuis.Console.LightGray,
20+
21+ // Foreground colors
22+ ccDarkGray = Velthuis.Console.DarkGray,
23+ ccLightBlue = Velthuis.Console.LightBlue,
24+ ccLightGreen = Velthuis.Console.LightGreen,
25+ ccLightCyan = Velthuis.Console.LightCyan,
26+ ccLightRed = Velthuis.Console.LightRed,
27+ ccLightMagenta = Velthuis.Console.LightMagenta,
28+ ccYellow = Velthuis.Console.Yellow,
29+ ccWhite = Velthuis.Console.White);
30+
31+type
32+ TStdOut = class
33+ private
34+ type
35+ TColoredText = record
36+ private
37+ FStdOut: TStdOut;
38+ FColor: TConsoleColors;
39+ procedure Init(_StdOut: TStdOut; _Color: TConsoleColors);
40+ public
41+ procedure Write(const _Text: string); overload;
42+ procedure Write(const _Format: string; const _Params: array of const); overload;
43+ procedure WriteLn(const _Text: string); overload;
44+ procedure WriteLn(const _Format: string; const _Params: array of const); overload;
45+ end;
46+ private
47+ function GetTextColor: TConsoleColors;
48+ procedure SetTextColor(_Color: TConsoleColors);
49+ public
50+ Error: TColoredText;
51+ Warning: TColoredText;
52+ Hint: TColoredText;
53+ Success: TColoredText;
54+ constructor Create(_ErrorColor: TConsoleColors = ccLightRed;
55+ _WarningColor: TConsoleColors = ccYellow;
56+ _HintColor: TConsoleColors = ccWhite;
57+ _SuccessColor: TConsoleColors = ccLightGreen;
58+ _DefaultColor: TConsoleColors = ccLightGray);
59+ destructor Destroy; override;
60+
61+ procedure Write(const _Text: string); overload;
62+ procedure Write(const _Format: string; const _Params: array of const); overload;
63+ procedure Write(_Color: TConsoleColors; const _Text: string); overload;
64+ procedure Write(_Color: TConsoleColors; const _Format: string; const _Params: array of const); overload;
65+
66+ procedure WriteLn(const _Text: string); overload;
67+ procedure WriteLn(const _Format: string; const _Params: array of const); overload;
68+ procedure WriteLn(_Color: TConsoleColors; const _Text: string); overload;
69+ procedure WriteLn(_Color: TConsoleColors; const _Format: string; const _Params: array of const); overload;
70+
71+ procedure Pause(const _Msg: string = '');
72+ end;
73+
74+var
75+ StdOut: TStdOut = nil;
76+
77+implementation
78+
79+{ TStdOut }
80+
81+constructor TStdOut.Create(_ErrorColor: TConsoleColors = ccLightRed;
82+ _WarningColor: TConsoleColors = ccYellow;
83+ _HintColor: TConsoleColors = ccWhite;
84+ _SuccessColor: TConsoleColors = ccLightGreen;
85+ _DefaultColor: TConsoleColors = ccLightGray);
86+begin
87+ inherited Create;
88+ Error.Init(Self, _ErrorColor);
89+ Warning.Init(Self, _WarningColor);
90+ Hint.Init(Self, _HintColor);
91+ Success.Init(Self, _SuccessColor);
92+
93+ Velthuis.Console.TextBackground(Black);
94+ SetTextColor(_DefaultColor);
95+end;
96+
97+destructor TStdOut.Destroy;
98+begin
99+ inherited;
100+end;
101+
102+function TStdOut.GetTextColor: TConsoleColors;
103+begin
104+ Result := TConsoleColors(Velthuis.Console.TextColor);
105+end;
106+
107+procedure TStdOut.Pause(const _Msg: string = '');
108+begin
109+ Velthuis.Console.Pause(_Msg)
110+end;
111+
112+procedure TStdOut.SetTextColor(_Color: TConsoleColors);
113+begin
114+ Velthuis.Console.TextColor(Ord(_Color));
115+end;
116+
117+procedure TStdOut.Write(const _Text: string);
118+begin
119+ System.Write(Output, _Text);
120+end;
121+
122+procedure TStdOut.Write(const _Format: string; const _Params: array of const);
123+begin
124+ Self.Write(Format(_Format, _Params));
125+end;
126+
127+procedure TStdOut.Write(_Color: TConsoleColors; const _Text: string);
128+var
129+ LastColor: TConsoleColors;
130+begin
131+ LastColor := GetTextColor;
132+ SetTextColor(_Color);
133+ Self.Write(_Text);
134+ SetTextColor(LastColor);
135+end;
136+
137+procedure TStdOut.Write(_Color: TConsoleColors; const _Format: string; const _Params: array of const);
138+begin
139+ Self.Write(_Color, Format(_Format, _Params));
140+end;
141+
142+procedure TStdOut.WriteLn(const _Text: string);
143+begin
144+ System.WriteLn(Output, _Text);
145+end;
146+
147+procedure TStdOut.WriteLn(const _Format: string; const _Params: array of const);
148+begin
149+ Self.WriteLn(Format(_Format, _Params));
150+end;
151+
152+procedure TStdOut.WriteLn(_Color: TConsoleColors; const _Text: string);
153+var
154+ LastColor: TConsoleColors;
155+begin
156+ LastColor := GetTextColor;
157+ SetTextColor(_Color);
158+ Self.WriteLn(_Text);
159+ SetTextColor(LastColor);
160+end;
161+
162+procedure TStdOut.WriteLn(_Color: TConsoleColors; const _Format: string; const _Params: array of const);
163+begin
164+ Self.WriteLn(_Color, Format(_Format, _Params));
165+end;
166+
167+{ TStdOut.TColoredText }
168+
169+procedure TStdOut.TColoredText.Init(_StdOut: TStdOut; _Color: TConsoleColors);
170+begin
171+ FStdOut := _StdOut;
172+ FColor := _Color;
173+end;
174+
175+procedure TStdOut.TColoredText.Write(const _Format: string; const _Params: array of const);
176+begin
177+ FStdOut.Write(FColor, _Format, _Params);
178+end;
179+
180+procedure TStdOut.TColoredText.Write(const _Text: string);
181+begin
182+ FStdOut.Write(FColor, _Text);
183+end;
184+
185+procedure TStdOut.TColoredText.WriteLn(const _Text: string);
186+begin
187+ FStdOut.WriteLn(FColor, _Text);
188+end;
189+
190+procedure TStdOut.TColoredText.WriteLn(const _Format: string; const _Params: array of const);
191+begin
192+ FStdOut.WriteLn(FColor, _Format, _Params);
193+end;
194+
195+initialization
196+ StdOut := TStdOut.Create;
197+finalization
198+ FreeandNil(StdOut);
199+end.
200+
Show on old repository browser