lazarus/components/sparta/generics/examples/TQueue/TQueueProject.lpr
hnb d53cfa9c28 Merged revision(s) 51414, 51448-51450, 51468, 51473, 51477, 51480, 51483, 51486, 51511, 51543-51544, 51638, 52714, 52725-52727 from branches/free-sparta:
sparta: initial commit of "compilable" new sparta package - smart form editor. !NOTE: not for daily usage.
........
sparta: Initial conception for package for MDI: sparta_MDI. Base for sparta_DockedFormEditor package.
........
sparta: Generics.Collections library ( sync with https://github.com/dathox/generics.collections SHA fda586932bd80ef58c08f8ebf5a24316ca4ccca5)
........
sparta: smart form editor adjustment for new sparta_MDI
........
sparta: new class "TFormImpl" for MDI solution (created from TDesignedFormImpl). 
........
sparta: 
-MDI form container "TFormContainer"
-New IResizeFrame interface to handle MDI form moving
-New frame TfrFormBackgroundForMDI
........
sparta: sparta_MDI package modifications:
-new class TMultiplyResizer to menage MDI desktop
-more generic resizer: TAbstractResizer. Base for IDE resizer and TMultiplyResizer
-more advanced IResizeFrame interface


........
sparta: 
-DockedFormEditor adjustment for latest changes in mdi package
-small changes in mdi (visibility of methods).
-OnModified method for IResizeFrame

........
sparta: MDI
-simulate MDI forms order for TMultiplyResizer
-property DesignedForm: IDesignedForm for IResizeFrame
........
sparta:
-IMPORTANT! pixel perfect form resizing (fix for problems for controls with align alLeft, alRight etc on design form).
-Fix problem for windows: wrong design design window width (a little bigger than designed size) TFormImpl.SetRealBounds -> AdjustSize
........
sparta: mdi bug fix for AV in TMultiplyResizer
........
Fix compilation for FPC 3.0 (TRect changes in FPC 3.1 trunk)
........
sparta: Cannot resize the docked form designer, issue #29380 patch from Anthony Walter. Thanks!
........
sparta ToolsAPI: Delphi compatible ToolsAPI/DesignIDE interface at XE2 level (proxy for IDEIntf). Initial commit (no functionality yet), just interfaces and classes without implementation:

designeditors.pas:
-TComponentEditor

designintf.pas:
-Interfaces: IEventInfo, IClass, IActivatable, IDesignObject, IDesignPersistent, IDesignerSelections, IDesigner60, IDesigner70, IDesigner80, IDesigner100, IDesigner, IComponentEditor
-TBaseComponentEditor
-RegisterComponentEditor

designmenus.pas:
-Interfaces: IMenuItems, IMenu, IMainMenu, IPopupMenu, IMenuItem

 
 


........
when form is removed we need to remove all handlers located in collections FFormsStack and FForms. Necessary to avoid AV.
........
sparta: more correct and simpler calculation of form border for Windows
........
sparta: 
  * Fix for loop error for resize. Highly visible problem for docked forms/frames with Align=alClient. 
  * New THookFrame class as new meta class for Frames.
........
updated lpl
........

git-svn-id: trunk@52728 -
2016-07-20 10:40:03 +00:00

90 lines
2.5 KiB
ObjectPascal

// Generic types for FreeSparta.com and FreePascal!
// Original version by keeper89.blogspot.com, 2011
// FPC version by Maciej Izak (hnb), 2014
program TQueueProject;
{$MODE DELPHI}
{$APPTYPE CONSOLE}
uses
SysUtils, Generics.Collections;
type
// This is FreeSpaaarta! versions =)
TSpartaVersion = (svFreeSparta, svBasic, svStarter, svProfessional);
TCustomer = record
strict private
const
SV_NAMES: array [TSpartaVersion] of string =
('FreeSparta', 'Basic', 'Starter', 'Professional');
public
var
SpartaVersion: TSpartaVersion;
class function Create(SpartaVersion: TSpartaVersion): TCustomer; static;
function ToString: string;
end;
class function TCustomer.Create(SpartaVersion: TSpartaVersion): TCustomer;
begin
Result.SpartaVersion := SpartaVersion;
end;
function TCustomer.ToString: string;
begin
Result := Format('Sparta %s', [SV_NAMES[SpartaVersion]])
end;
var
CustomerQueue: TQueue<TCustomer>;
Customer: TCustomer;
begin
WriteLn('Working with TQueue - buy FreeSparta.com');
WriteLn;
// "Create" turn in sales
CustomerQueue := TQueue<TCustomer>.Create;
// Add a few people in the queue
// Enqueue - puts the item in the queue
CustomerQueue.Enqueue(TCustomer.Create(svFreeSparta));
CustomerQueue.Enqueue(TCustomer.Create(svBasic));
CustomerQueue.Enqueue(TCustomer.Create(svBasic));
CustomerQueue.Enqueue(TCustomer.Create(svBasic));
CustomerQueue.Enqueue(TCustomer.Create(svStarter));
CustomerQueue.Enqueue(TCustomer.Create(svStarter));
CustomerQueue.Enqueue(TCustomer.Create(svProfessional));
CustomerQueue.Enqueue(TCustomer.Create(svProfessional));
// Part of customers served
// Dequeue - remove an element from the queue
// btw if TQueue is TObjectQueue also call Free for object
Customer := CustomerQueue.Dequeue;
Writeln(Format('Sold (Dequeue): %s', [Customer.ToString]));
// Extract - similar to Dequeue, but causes in OnNotify
// Action = cnExtracted instead cnRemoved
Customer := CustomerQueue.Extract;
Writeln(Format('Sold (Extract): %s', [Customer.ToString]));
// For what came next buyer?
// Peek - returns the first element, but does not remove it from the queue
Writeln(Format('Serves customers come for %s',
[CustomerQueue.Peek.ToString]));
// The remaining buyers
Writeln;
Writeln(Format('Buyers left: %d', [CustomerQueue.Count]));
for Customer in CustomerQueue do
Writeln(Customer.ToString);
// We serve all
// Clear - clears the queue
CustomerQueue.Clear;
FreeAndNil(CustomerQueue);
Readln;
end.