Social Icons

вторник, 23 июля 2013 г.

CnPack IDE-Мастер: подсветка операторов управления потоком выполнения

В меню CnPack -> Настройки IDE-расширений -> Подсветка синтаксиса появилась новая опция - "Выделять операторы упр. потоком выполнения":
При включенной опции такие конструкции как Exit/Abort/Break/Continue/Raise будут выделены:

четверг, 18 июля 2013 г.

Что бы сделали мы с Delphi XE5/XE6/...

Уважаемые читатели блога и ленты Delphifeeds.ru!

Приглашаю всех неравнодушных к Delphi поучаствовать в следующем опросе. Задача такая - укажите в комментариях от 1 до 3 желаемых или просто необходимых фич в будущих версиях Delphi, которые с Вашей точки зрения способствовали бы развитию всестороннему продукта. Комментарии также могут относится к продукту не напрямую (например, рекомендация "проводить больше вебинаров"). Свои соображения я оставляю первым комментарием.

Старайтесь выражать мысли кратко и лаконично. В начале осени мы подведем итоги и составим "график желаний".

пятница, 5 июля 2013 г.

Как программно завершить работу, сделать перезагрузку, перевести компьютер в ждущий режим или выйти из системы в OS X?

Одним из простых путей является использование объекта Cocoa NSAppleScript для запуска следующего скрипта:
tell application "Finder" to shut down
И, конечно, ‘to shut down’ может быть заменено на ‘to restart’, ‘to sleep’ или ‘to log out’.

В последних версиях Delphi NSAppleScript (или если быть более точным - его интерфейс) объявлен в модуле Macapi.Foundation. Увы, объявлен он не совсем точно (см. здесь), поэтому его необходимо немного подправить следующим образом:
uses
  Macapi.ObjectiveC, Macapi.CocoaTypes, Macapi.Foundation;
 
type
  NSAppleScript = interface(NSObject)
    ['{0AB1D902-25CE-4F0B-A3BE-C4ABEDEB88BC}']
    function compileAndReturnError(errorInfo: Pointer): Boolean; cdecl;
    function executeAndReturnError(errorInfo: Pointer): Pointer; cdecl;
    function executeAppleEvent(event: NSAppleEventDescriptor; error: Pointer): Pointer; cdecl;
    function initWithContentsOfURL(url: NSURL; error: Pointer): Pointer; cdecl;
    function initWithSource(source: NSString): Pointer; cdecl;
    function isCompiled: Boolean; cdecl;
    function source: NSString; cdecl;
  end;

  TNSAppleScript = class(TOCGenericImport<NSAppleScriptClass, NSAppleScript>)  

end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Script: NSAppleScript;
  Error: Pointer;
begin
  Error := nil;
  Script := TNSAppleScript.Wrap(TNSAppleScript.Alloc.initWithSource(
    NSSTR('tell application "Finder" to shut down')));
  try
    if Script.executeAndReturnError(Error) = nil then
      raise EOSError.Create('AppleScript macro failed');
  finally
    Script.release;
  end;
end;
И все работает прекрасно.

Источник: http://delphihaven.wordpress.com/2013/07/04/programmatically-shutting-down-restarting-sleeping-or-logging-off-on-os-x/

четверг, 4 июля 2013 г.

Получение информации о системе в OSX и iOS с помощью Delphi (XE2, XE3, XE4) - Часть 2

Данная статья является продолжением статьи Получение информации о системе в OSX и iOS с помощью Delphi (XE2, XE3, XE4) - Часть 1.

Внутри модуля Posix.SysSysctl (являющимся, как уже было сказано, трансляцией файла sysctl.h) можно обнаружить ряд массивов (CTL_NAMES, CTL_KERN_NAMES, CTL_HW_NAMES, CTL_USER_NAMES, CTL_VM_NAMES), которые содержат идентификаторы системной информации, рассмотренные нами в предыдущей статье. Используя их, можно построить идентификатор (параметр name) для передачи в функцию SysCtlByName.

В качестве примера, составить идентификатор для получения версии ядра можно следующим образом:
Name := PAnsiChar(CTL_NAMES[CTL_KERN].ctl_name + '.' + CTL_KERN_NAMES[KERN_VERSION].ctl_name); // Версия ядра
а затем вызвать SysCtlByName:
function KernelVersion: AnsiString;
var
  res: Integer;
  len: size_t;
  p, Name: PAnsiChar;
begin
  len := SizeOf(Result);
  Name := PAnsiChar(CTL_NAMES[CTL_KERN].ctl_name + '.' + CTL_KERN_NAMES[KERN_VERSION].ctl_name);
  res := SysCtlByName(Name, nil, @len, nil, 0);
    if (len > 0) and (res = 0)  then
    begin
      GetMem(p, len);
      try
        res := SysCtlByName(Name, p, @len, nil, 0);
        if res = 0 then
          Result := p;
      finally
        FreeMem(p);
      end;
    end;
end;
Используя эти массивы, можно получить много полезной, предусмотренной в них информации, попробуйте воспроизвести следующий проект:
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  System.Classes,
  System.Types,
  Posix.Errno,
  Posix.SysTypes,
  Posix.SysSysctl,
  System.SysUtils;
 
function GetsysctlIntValue(mib: TIntegerDynArray) : integer;
var
  len : size_t;
  res : integer;
begin
   len := sizeof(Result);
   res:=sysctl(@mib[0], 2, @Result, @len, nil, 0);
   if res<>0 then
    Result:=-1; // RaiseLastOSError;
end;
 
function GetsysctlInt64Value(mib: TIntegerDynArray) : Int64;
var
  len : size_t;
  res : integer;
begin
   len := sizeof(Result);
   res:=sysctl(@mib[0], 2, @Result, @len, nil, 0);
   if res<>0 then
     Result:=-1; //RaiseLastOSError;
end;
 
function GetsysctlStrValue(mib: TIntegerDynArray) : AnsiString;
var
  len : size_t;
  p   : PAnsiChar;
  res : integer;
begin
   Result:='';
   res:=sysctl(@mib[0], 2, nil, @len, nil, 0);
   if (len>0) and (res=0)  then
   begin
     GetMem(p, len);
     try
       res:=sysctl(@mib[0], 2, p, @len, nil, 0);
       if res=0 then
        Result:=p;
     finally
       FreeMem(p);
     end;
   end;
end;
 
procedure  ListKernelValues;
var
  mib : TIntegerDynArray;
  i   : Integer;
begin
 Writeln('High kernel limits');
 Writeln('------------------');
 for i:=0 to KERN_MAXID-1 do
 begin
    mib:=TIntegerDynArray.Create(CTL_KERN, i);
    case CTL_KERN_NAMES[i].ctl_type of
     CTLTYPE_NODE  :  Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_KERN].ctl_name, CTL_KERN_NAMES[i].ctl_name, '[node]']));
     CTLTYPE_OPAQUE:  Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_KERN].ctl_name, CTL_KERN_NAMES[i].ctl_name, '[structure]']));
     CTLTYPE_INT   :  Writeln(Format('%s.%-18s %d',[CTL_NAMES[CTL_KERN].ctl_name, CTL_KERN_NAMES[i].ctl_name, GetsysctlIntValue(mib)]));
     CTLTYPE_QUAD  :  Writeln(Format('%s.%-18s %d',[CTL_NAMES[CTL_KERN].ctl_name, CTL_KERN_NAMES[i].ctl_name, GetsysctlInt64Value(mib)]));
     CTLTYPE_STRING : Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_KERN].ctl_name, CTL_KERN_NAMES[i].ctl_name, GetsysctlStrValue(mib)]));
    end;
 end;
 Writeln;
end;
 
procedure  ListGenericCPU_IO_Values;
var
  mib : TIntegerDynArray;
  i   : Integer;
begin
 Writeln('Generic CPU, I/O');
 Writeln('-----------------');
 for i:=0 to HW_MAXID-1 do
 begin
    mib:=TIntegerDynArray.Create(CTL_HW, i);
    case CTL_HW_NAMES[i].ctl_type of
     CTLTYPE_NODE  :  Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_HW].ctl_name, CTL_HW_NAMES[i].ctl_name, '[node]']));
     CTLTYPE_OPAQUE:  Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_HW].ctl_name, CTL_HW_NAMES[i].ctl_name, '[structure]']));
     CTLTYPE_INT   :  Writeln(Format('%s.%-18s %d',[CTL_NAMES[CTL_HW].ctl_name, CTL_HW_NAMES[i].ctl_name, GetsysctlIntValue(mib)]));
     CTLTYPE_QUAD  :  Writeln(Format('%s.%-18s %d',[CTL_NAMES[CTL_HW].ctl_name, CTL_HW_NAMES[i].ctl_name, GetsysctlInt64Value(mib)]));
     CTLTYPE_STRING : Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_HW].ctl_name, CTL_HW_NAMES[i].ctl_name, GetsysctlStrValue(mib)]));
    end;
 end;
 Writeln;
end;
 
procedure  ListUserLevelValues;
var
  mib : TIntegerDynArray;
  i   : Integer;
begin
 mib:=TIntegerDynArray.Create(CTL_USER, 0);
 Writeln('User-level');
 Writeln('----------');
 for i:=0 to USER_MAXID-1 do
 begin
    mib[1]:=i;
    case CTL_USER_NAMES[i].ctl_type of
     CTLTYPE_NODE  :  Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_USER].ctl_name, CTL_USER_NAMES[i].ctl_name, '[node]']));
     CTLTYPE_OPAQUE:  Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_USER].ctl_name, CTL_USER_NAMES[i].ctl_name, '[structure]']));
     CTLTYPE_INT   :  Writeln(Format('%s.%-18s %d',[CTL_NAMES[CTL_USER].ctl_name, CTL_USER_NAMES[i].ctl_name, GetsysctlIntValue(mib)]));
     CTLTYPE_QUAD  :  Writeln(Format('%s.%-18s %d',[CTL_NAMES[CTL_USER].ctl_name, CTL_USER_NAMES[i].ctl_name, GetsysctlInt64Value(mib)]));
     CTLTYPE_STRING : Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_USER].ctl_name, CTL_USER_NAMES[i].ctl_name, GetsysctlStrValue(mib)]));
    end;
 end;
 Writeln;
end;
 
procedure  ListVMValues;
var
  mib : TIntegerDynArray;
  i   : Integer;
begin
 Writeln('Virtual memory');
 Writeln('-------------');
 for i:=0 to VM_MAXID-1 do
 begin
    mib:=TIntegerDynArray.Create(CTL_VM, i);
    case CTL_VM_NAMES[i].ctl_type of
     CTLTYPE_NODE  :  Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_VM].ctl_name, CTL_VM_NAMES[i].ctl_name, '[node]']));
     CTLTYPE_OPAQUE:  Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_VM].ctl_name, CTL_VM_NAMES[i].ctl_name, '[structure]']));
     CTLTYPE_INT   :  Writeln(Format('%s.%-18s %d',[CTL_NAMES[CTL_VM].ctl_name, CTL_VM_NAMES[i].ctl_name, GetsysctlIntValue(mib)]));
     CTLTYPE_QUAD  :  Writeln(Format('%s.%-18s %d',[CTL_NAMES[CTL_VM].ctl_name, CTL_VM_NAMES[i].ctl_name, GetsysctlInt64Value(mib)]));
     CTLTYPE_STRING : Writeln(Format('%s.%-18s %s',[CTL_NAMES[CTL_VM].ctl_name, CTL_VM_NAMES[i].ctl_name, GetsysctlStrValue(mib)]));
    end;
 end;
 Writeln;
end;
 
begin
  try
    ListKernelValues;
    ListGenericCPU_IO_Values;
    ListUserLevelValues;
    ListVMValues;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Источник: http://theroadtodelphi.wordpress.com/2013/06/29/getting-system-information-in-osx-and-ios-using-delphi-xe2-xe3-xe4-part-2/

среда, 3 июля 2013 г.

Получение информации о системе в OSX и iOS с помощью Delphi (XE2, XE3, XE4) - Часть 1

В статье будут рассмотрены вопросы использования функций модулей sysctl, sysctlbyname и sysctlnametomib для получения информации о системе (параметры ядра, железа, сети, файловой системы, информации о компьютере и пользователе) в OSX и iOS.

Поделитесь с друзьями!

 

Подписчики

Статистика