FAQ VCL
Разное

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как получить путь к установленному VLC-плееру (с учетом разрядности приложения)?

function GetVLCLibPath: string;
var
  Handle: HKEY;
  RegType: Integer;
  DataSize: Cardinal;
  Key: PWideChar;
begin
  Result := '';
  Key := 'Software\VideoLAN\VLC';
  if RegOpenKeyEx(HKEY_LOCAL_MACHINE, Key, 0, KEY_READ, Handle) = ERROR_SUCCESS then
  begin
    if RegQueryValueEx(Handle, 'InstallDir', nil, @RegType, nil, @DataSize) = ERROR_SUCCESS then
    begin
      SetLength(Result, DataSize);
      RegQueryValueEx(Handle, 'InstallDir', nil, @RegType, PByte(@Result[1]), @DataSize);
      Result[DataSize] := '\';
    end
    else Showmessage('Error on reading registry');
    RegCloseKey(Handle);
    Result := String(PChar(Result));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetVLCLibPath);
end;


Как быстро отсортировать массив целых чисел?

type
  TIntArray = array of Integer;

var
  IntArray: TIntArray = [2, 7, 1, 4, 0, 8, 5, 9, 4, 3];

procedure qSort(var A: TIntArray; min, max: Integer);
var
  i, j, tmp, supp: Integer;
begin
  supp := A[max-((max-min) div 2)];
  i := min;
  j := max;

  while i < j do
  begin
    while A[i] < supp do
      i := i + 1;

    while A[j] > supp do
      j := j - 1;

    if i <= j then
    begin
      tmp := A[i];
      A[i] := A[j];
      A[j] := tmp;

      i := i + 1;
      j := j - 1;
    end;
  end;

  if min < j then
    qSort(A, min, j);

  if i < max then
    qSort(A, i, max);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  i: Integer;
begin
  qSort(IntArray, 0, High(IntArray));

  s := '';

  for i := Low(IntArray) to High(IntArray) do
    s := s + IntToStr(IntArray[i]) + #13;

  ShowMessage(s);
end;


Как определить передан ли программе определенный параметр или нет?

procedure TestFindCmdLineSwitch;
var
  schars: TSysCharSet;
begin
  schars := ['/','.'];
 
  if FindCmdLineSwicth('param1') then 
  begin
    // определит "/param1", "/PARAM1"
    // не определит "param1", ".param1" 
  end;
 
  if FindCmdLineSwitch('param1', False) then
  begin
    // определит "/param1"
    // не определит "param1", ".param1", "/PARAM1"
  end;
 
  if FindCmdLineSwitch('param1', schars, false) then
  begin
    // определит "/param1", ".param1"
    // не определит "param1", "/PARAM1"
  end;
end;


Как использовать TParallel.For?

// Способ первый
uses
  System.Threading;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;

  // Для безопасной модификации сложных типов данных, таких как строки,
  // из разных потоков необходимо использовать средства синхрогизации,
  // такие как TCriticalSection или TMonitor

  TParallel.For(1, 100,
    procedure(i: Integer)
    begin
      // System.TMonitor.Enter(Self);
      // try
        TThread.Queue(TThread.Current,
          procedure
          begin
            Memo1.Lines.Add(i.ToString);
          end
        );
      // finally
      //   System.TMonitor.Exit(Self);
      // end;
    end
  );
end;

// Способ второй
uses
  System.Threading{, System.SyncObjs};

procedure TForm1.Button1Click(Sender: TObject);
// var
//   Lock: TCriticalSection;
begin
  Memo1.Lines.Clear;

  // Для безопасной модификации сложных типов данных, таких как строки,
  // из разных потоков необходимо использовать средства синхрогизации,
  // такие как TCriticalSection или TMonitor

  // Lock := TCriticalSection.Create;
  // try
    TParallel.For(1, 100,
      procedure(i: Integer)
      begin
        // Lock.Enter;
        // try
          TThread.Queue(TThread.Current,
            procedure
            begin
              Memo1.Lines.Add(i.ToString);
            end
          );
        // finally
        //   Lock.Leave;
        // end;
      end
    );
  // finally
  //   Lock.Free;
  // end;
end;

При использовании материала - ссылка на сайт обязательна