Icons. Collections

icons8

Posted in Без рубрики | Comments Off on Icons. Collections

DesignPatterns. Iterator

Простой пример итератора для коллекции

program IteratorPattern;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  uIterator in 'uIterator.pas';

var
  c: TCollection;
  i: TCustomIterator;

begin
  c := TCollection.Create();
  try
    c.Add(TStrObjForTest.Create('obj 1'));
    c.Add(TStrObjForTest.Create('obj 2'));
    c.Add(TStrObjForTest.Create('obj 3'));
    // iteration
    i := TCustomIterator.Create(c);
    try
      Writeln(TStrObjForTest(i.First).Value);
      while not i.IsDone do
        Writeln(TStrObjForTest(i.Next).Value);
      Readln;
    finally
      i.Free();
    end;
  finally
    c.Free();
  end;
end.
Continue reading
Posted in Без рубрики | Comments Off on DesignPatterns. Iterator

Delphi. UniGUI. Как отключить меню с сортировкой в гриде?

UniDBTreeGrid -> Columns -> Column[xxx] -> Menu -> MenuEnabled = False

Спасибо Delphi Developer с форума UniGUI!

Posted in Без рубрики | Comments Off on Delphi. UniGUI. Как отключить меню с сортировкой в гриде?

Delphi. Соответствие типов С и Delphi

C Type    | Pascal    | Description  
---------------------------------------------- 
LPSTR       PAnsiChar;  String >pointer  
LPCSTR      PAnsiChar;  String >pointer  
DWORD       Integer;    Whole numbers  
BOOL        LongBool;   Boolean values  
PBOOL       ^BOOL;      Pointer to a Boolean value  
Pbyte       ^Byte;      Pointer to a byte value  
PINT        ^Integer;   Pointer to an integer value  
Psingle     ^Single;    Pointer to a single (floating point) value  
PWORD       ^Word;      Pointer to a 16-bit value  
PDWORD      ^DWORD;     Pointer to a 32-bit value  
LPDWORD     PDWORD;     Pointer to a 32-bit value  
UCHAR       Byte;       8-bit values (can represent characters)  
PUCHAR      ^Byte;      Pointer to 8-bit values  
SHORT       Smallint;   16-bit whole numbers  
UINT        Integer;    32-bit whole numbers. Traditionally,  
                        this was used to represent unsigned integers,  
                        but Object Pascal does not have a true  
                        unsigned integer data type.  
PUINT       ^UINT;      Pointer to 32-bit whole numbers  
ULONG       Longint;    32-bit whole numbers. Traditionally,  
                        this was used to represent unsigned integers,  
                        but Object Pascal does not have a true  
                        unsigned integer data type.  
PULONG      ^ULONG;     Pointer to 32-bit whole numbers  
PLongint    ^Longint;   Pointer to 32-bit values  
PInteger    ^Integer;   Pointer to 32-bit values  
PSmallInt   ^Smallint;  Pointer to 16-bit values  
PDouble     ^Double;    Pointer to double (floating point) values  
LCID        DWORD;      A local identifier  
LANGID      Word;       A language identifier  
THandle     Integer;    An object handle. Many Windows API functions return a value  
                        of type THandle, which identobject ifies that object within  
                        Windows'internal object tracking tables.  
PHandle     ^THandle;   A pointer to a handle  
WPARAM      Longint;    A 32-bit message parameter. Under earlier versions of Windows,  
                        this was a 16-bit data type.  
LPARAM      Longint;    A 32-bit message parameter  
LRESULT     Longint;    A 32-bit function return value  
HWND        Integer;    A handle to a window. All windowed controls, child windows,  
                        main windows, etc., have a corresponding window handle that  
                        identifies them within Windows'internal tracking tables.  
HHOOK       Integer;    A handle to an installed Windows system hook  
ATOM        Word;       An index into the local or global atom table for a string  
HGLOBAL     THandle;    A handle identifying a globally allocated dynamic memory object.  
                        Under 32-bit Windows, there is no distinction between globally  
                        and locally allocated memory.  
HLOCAL      THandle;    A handle identifying a locally allocated dynamic memory object.  
                        Under 32-bit Windows, there is no distinction between globally  
                        and locally allocated memory.  
FARPROC     Pointer;    A pointer to a procedure, usually used as a parameter type in  
                        functions that require a callback function  
HGDIOBJ     Integer;    A handle to a GDI object. Pens, device contexts, brushes, etc.,  
                        all have a handle of this type that identifies them within  
                        Windows'internal tracking tables.  
HBITMAP     Integer;    A handle to a Windows bitmap object  
HBRUSH      Integer;    A handle to a Windows brush object  
HDC         Integer;    A handle to a device context  
HENHMETAFILE  Integer;  A handle to a Windows enhanced metafile object  
HFONT       Integer;    A handle to a Windows logical font object  
HICON       Integer;    A handle to a Windows icon object  
HMENU       Integer;    A handle to a Windows menu object  
HMETAFILE   Integer;    A handle to a Windows metafile object  
HINST       Integer;    A handle to an instance object  
HMODULE     HINST;      A handle to a module  
HPALETTE    Integer;    A handle to a Windows color palette  
HPEN        Integer;    A handle to a Windows pen object  
HRGN        Integer;    A handle to a Windows region object  
HRSRC       Integer;    A handle to a Windows resource object  
HKL         Integer;    A handle to a keyboard layout  
HFILE       Integer;    A handle to an open file  
HCURSOR     HICON;      A handle to a Windows mouse cursor object  
COLORREF    DWORD;      A Windows color reference value, containing values  
                        for the red, green, and of ;bsp;blue components of a color 

Источник

Posted in Без рубрики | Comments Off on Delphi. Соответствие типов С и Delphi

Delphi. UniGUI. PopupMenu

Подключим всплывающее меню. Выглядеть это может так

Само подключение всплывающего меню происходит в коде, в событии OnCellContextClick

procedure TMainForm.UniDBGrid1CellContextClick(Column: TUniDBGridColumn; X, Y: Integer);
begin
  if ClientDataSet.State in dsEditModes then
    UniPopupMenu2.Popup(X, Y, UniDBGrid1)
  else
    UniPopupMenu1.Popup(X, Y, UniDBGrid1);
end;

Само Popup меню один в один с традиционным дельфийским аналогом. Нам просто нужно разместить его на форме и настроить в дизайнере.

Ну и обработка некоторых событий наших меню

TMainForm.Cancel1Click(Sender: TObject);
begin
  if ClientDataSet.State in dsEditModes then
    ClientDataSet.Cancel;
end;

procedure TMainForm.DeleteRowClick(Sender: TObject);
begin
  ClientDataSet.Delete;
end;

procedure TMainForm.EditClick(Sender: TObject);
begin
  ClientDataSet.Edit;
end;

procedure TMainForm.InsertRowClick(Sender: TObject);
begin
  ClientDataSet.Insert;
end;

procedure TMainForm.PostClick(Sender: TObject);
begin
  if ClientDataSet.State in dsEditModes then
    ClientDataSet.Post;
end;
Posted in Без рубрики | Comments Off on Delphi. UniGUI. PopupMenu

DesignPatterns. Mediator

Объекты связаны друг с другом через посредника. Так называемая слабая связанность.

program MediatorPattern;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  uMediator in 'uMediator.pas';

var
  Stas: TColleague;
  Masha: TColleague;
  chat: TMediator;

begin
  chat := TMediator.Create();
  chat.AddParticipant(TColleague.Create(1, 'Stas'));
  chat.AddParticipant(TColleague.Create(2, 'Masha'));
  Stas := chat.Colleague[0];
  Masha := chat.Colleague[1];
  try
    Stas.Send('Привет, Маша, пойдем гулять?', Masha);
    Masha.Send('Привет, Стас, конечно!', Stas);
    ReadLn;
  finally
    chat.Free();
  end;
end.
Continue reading
Posted in Без рубрики | Comments Off on DesignPatterns. Mediator

DesignPatterns. ChainOfResponsibilities

Есть цепочка объектов. Одно звено выполняет одни операции, другое – другие.

program ChainsOfResponsibilities;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  uChainsOfResponsibilities in 'uChainsOfResponsibilities.pas';

var
  d: TDirector;
  m: TManager;
  w: TWorker;
  p: TPurchase;

begin
  d := TDirector.Create();
  m := TManager.Create();
  w := TWorker.Create();
  p := TPurchase.Create(5);
  try
    w.SetNextApprover(m);
    m.SetNextApprover(d);
    w.ProcessRequest(p); // trying to buy
    Readln;
  finally
    d.Free();
    m.Free();
    w.Free();
    p.Free();
  end;
end.
Continue reading
Posted in Без рубрики | Comments Off on DesignPatterns. ChainOfResponsibilities

DesignPatterns. Proxy

Для распределения нагрузки. Есть интерфейс, который поддерживает основной класс и его заместитель. Легкие операции может выполнять заместитель, а тяжелые – основной класс.

program Proxy;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  uProxy in 'uProxy.pas';

var
  server: TServer;
  si: IServerInterface;

begin
  server := TServer.Create();
  si := TProxy.Create(server);
  try
    si.LightOperation();
    si.HeavyOperation();
    Readln;
  finally
    server.Free();
  end;
end.
Continue reading
Posted in Без рубрики | Comments Off on DesignPatterns. Proxy

DesignPatterns. Flyweight

“Приспособленец”. Если объект с такими признаками есть, в нашей коллекции, берем его, если нет, создаем. Работает совместно с фабрикой

program Flyweight;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  uFlyweight in 'uFlyweight.pas';

var
  bookFactory: TBookFactory;

begin
  bookFactory := TBookFactory.Create();
  try
    bookFactory.GetBookToRead('Alice in wonderland');
    bookFactory.GetBookToRead('Flying on Cooko''s nest');
    bookFactory.GetBookToRead('Delphi Cookbook');
    bookFactory.GetBookToRead('Delphi Cookbook');
    Readln;
  finally
    bookFactory.Free();
  end;
end.
Continue reading
Posted in Без рубрики | Comments Off on DesignPatterns. Flyweight

Delphi. UniGUI. PagedGrid with summary

UniGUI позволяет разбивать dataset на страницы, для этого нужно включить в свойствах грида WebOptions -> Paged := true

Выглядеть это может так

Предыдущий способ подсчета итоговых результатов не подойдет, потому что сумма будет посчитана только по тем записям, которые видны. Итак, что же делать в этом случае? Для этого нам их просто надо посчитать в другом месте, например так

procedure TMainForm.CalcTotals;
var
  B : TBookmark;
begin
  if not FInited then Exit;
  ClientDataSet1.DisableControls;
  B := ClientDataSet1.GetBookmark;
  try
    GTotal := 0;
    GTotalPrice := 0.0;

    ClientDataSet1.First;
    while not ClientDataSet1.Eof do
    begin
      GTotal := GTotal + ClientDataSet1.FieldByName('Quantity').AsInteger;
      GTotalPrice := GTotalPrice +
                    ( ClientDataSet1.FieldByName('UnitPrice').AsFloat * ClientDataSet1.FieldByName('Quantity').AsInteger );

      ClientDataSet1.Next;
    end;
  finally
    ClientDataSet1.GotoBookmark(B);
    ClientDataSet1.FreeBookmark(B);
    ClientDataSet1.EnableControls;
  end;
end;

А в OnColumnSummaryResult грида сделать следующее

procedure TMainForm.UniDBGrid1ColumnSummaryResult(Column: TUniDBGridColumn;
  GroupFieldValue: Variant; Attribs: TUniCellAttribs; var Result: string);
begin
  if SameText(Column.FieldName, 'quantity') then
  begin
    Result:=Format('Total Units: %d', [GTotal]);
    Attribs.Font.Style:=[fsBold];
    Attribs.Font.Color:=clGreen;
  end
  else if SameText(Column.FieldName, 'unitprice') then
  begin
    Result:='Total Cost: '+FormatCurr('0,0.00 ', GTotalPrice) + FmtSettings.CurrencyString;
    Attribs.Font.Style:=[fsBold];
    Attribs.Font.Color:=clNavy;
  end;
end;

Где GTotal у нас объявлена как поле. Оно в принципе и понятно, считаем результаты, закидываем их в поля, а в выводе результатов берем информацию из полей.

Posted in Без рубрики | Comments Off on Delphi. UniGUI. PagedGrid with summary