Показаны сообщения с ярлыком delphi. Показать все сообщения
Показаны сообщения с ярлыком delphi. Показать все сообщения

пятница, 9 сентября 2011 г.

Внезапно я снова все пропустил..

.. а именно - вышла новая Delphi - Delphi XE2

В ней наконец (хотя не то, чтоб я сильно страдал из-за отсутствия) и win64, и MacOS

Качаю триал, от нечего делать хочется посмотреть..

среда, 26 января 2011 г.

FizzBuzz

Прочитал тут про задачку, которую дают "тру" программистам при собеседовании: надо написать программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz»

среда, 16 июня 2010 г.

Разгул примеров для программирования..

Действительно, с рапидшары пропал пример для декодирования мр3; поправлю положение, показав еще раз – как использовать библиотеки от ffmpeg для декодирования звукового файла и последующего его кодирования в мр3

Правда я не разбирался никогда с созданием файлов, с наскоку не получилось – поэтому я пишу только мр3 – потому что у файла там структуры никакой – просто фреймы подряд (ну это если тегов нет)

четверг, 29 апреля 2010 г.

ffmpeg..

Я не настолько плох, как оказалось, не работал код с обновленными dll не из-за ошибок в заголовках, а из-за неправильно собранных dll – скачал собранные dll и все заработало; так что надо было обновить еще больше компиляторов и прочей чухни, чтобы оно скомпилилось и заработало и у меня (чужие dll мне не подходят, мне не надо 90% кодеков и 99% форматов, которые поддерживаются, поэтому я собираю “для себя”)

Так что обновленные pas-заголовки для dll из ffmpeg выложил на рапидшару (89 кб)

Несмотря на то, что меняются внутренние структуры (например нет больше типа TCodecType), все собралось без изменений.. тесчу, пока работает..

У меня в почте лежало несколько писем от пользователей, с комментами, багофиксами или пожеланиями; явные баги исправлял, а прочее оставлял “на потом”, но когда дело дошло до “потом”, почта успела потеряться (во время очередной переустановки винды.. как-то решил, что ничего важного в почте нет и не стал переносить письма).. Такой вот “упс..”

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

Про drag-n-drop

"А я все чаще замечаю, что..." в тестовых проектиках для выбора файла нажимать на какую-нибудь кнопку "Browse" и выбирать файл - слишком долго.. Намного быстрее получается перетащить нужный файл (особенно когда надо перепробовать десятки файлов) из окна проводника в свой тестовый проект

Вдруг кому-то пригодится - модуль, облегчающий это действие -несколько шагов, чтобы все заработало:

  • добавить .pas файл в проект или путь к файлу в настройки окружения - кому как нравится
  • добавить в uses формы, которая будет принимать дропы, ссылку на модуль
  • создать 2 обработчика, для реакции на "мышка с обьектом над нами" и "юзер бросил нам обьект"
  • ну и создать собственно экземпляр класса в подходящем месте

Где-то вот так:

...
type
  TfrmMain = class(TForm)
  ...
  private
  ...
    procedure FileDropEvent (Sender: TObject; const Filenames: TWideStrings);
    procedure FileEnterEvent (Sender: TObject; const Filenames: TWideStrings; var Accept: boolean);
  public
    { Public declarations }
  end;
var
  frmMain: TfrmMain;

implementation

uses
  DragDropSupportUnit, ActiveX;

var
  FileDrop: TFileDrop;

{$R *.dfm}

...

procedure TfrmMain.FileEnterEvent(Sender: TObject; const Filenames: TWideStrings; var Accept: boolean);
begin
   // разрешим дропать только файлы по какому-то правилу - скажем только файлы .mp3
  Accept := AnsiLowerCase ( ExtractFileExt ( Filenames [0] ) ) = '.flv';
end;

procedure TfrmMain.FileDropEvent(Sender: TObject; const Filenames: TWideStrings);
begin
  // прореагируем на бросание файлов на контрол (файлов может быть и несколько)
  if Filenames.Count > 1 then
  begin
    MessageBox(Handle, 'Many files - will be used only first', 'Warning', MB_OK + MB_ICONINFORMATION);
  end;
  edSource.Text := Filenames [0];
end;

...

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  ...
  FileDrop := TFileDrop.Create ( FileDropEvent, FileEnterEvent );
  RegisterDragDrop (Handle, FileDrop as IDropTarget);
  ...
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  ...
  RevokeDragDrop(handle);
  ...
end;

Это все: вызов RegisterDragDrop назначает контрол, handle которого передали параметром, приемником драг-дропа (так что это может быть как вся форма, так и к примеру только поле ввода.. дропаем файл на поле ввода и там тут же появляется имя файла), закрывая программу вертаем все взад.

Код собственно полезного модуля (мне лениво в пятницу вечером делать архив, ложить куда-то на рапиду.. скопипастить в ide да сохранить):

// использование: создать обьект, передав ему указатели на обработчики
// OnEnter и OnDrop и зарегистрировать приемник drag-drop-а:
//     RegisterDragDrop (Handle, FFileDrop as IDropTarget);
unit DragDropSupportUnit;

interface

uses
  windows, sysutils, widestrings, ActiveX, shellAPI;

type
  TFileDropEvent = procedure (Sender: TObject; const Filenames: TWideStrings) of object;
  TFileEnterEvent = procedure (Sender: TObject; const Filenames: TWideStrings; var Accept: boolean) of object;

  TFileDrop = class (TInterfacedObject, IDropTarget)
  private
    FDropEvent: TFileDropEvent;
    FEnterEvent: TFileEnterEvent;
    FFilenames: TWideStrings;
    FCanDrop: boolean;
  public
    constructor Create (AOnDrop: TFileDropEvent; AOnEnter: TFileEnterEvent);
    destructor Destroy; override;

    function DragEnter(const dataObj: IDataObject; grfKeyState: Longint;
      pt: TPoint; var dwEffect: Longint): HResult; stdcall;
    function DragOver(grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult; stdcall;
    function DragLeave: HResult; stdcall;
    function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult; stdcall;
  end;


implementation

{ TFileDrop }

constructor TFileDrop.Create(AOnDrop: TFileDropEvent;
  AOnEnter: TFileEnterEvent);
begin
  inherited Create;
  FDropEvent := AOnDrop;
  FEnterEvent := AOnEnter;
  FCanDrop := false;

  FFilenames := TWideStringList.Create;
end;

destructor TFileDrop.Destroy;
begin
  FFilenames.Free;
  inherited;
end;

function TFileDrop.DragEnter(const dataObj: IDataObject;
  grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult;
var
  medium: TStgMedium;
  format: TFormatEtc;
  fn: array [0..MAX_PATH] of char;
  fcount, i: integer;
begin
  dataObj._AddRef;

  format.cfFormat := CF_HDROP;
  format.ptd := nil;
  format.dwAspect := DVASPECT_CONTENT;
  format.lindex := -1;
  format.tymed := TYMED_HGLOBAL;

  if dataObj.GetData (format, medium) = S_OK then
  begin
    fcount := DragQueryFile (medium.hGlobal, $FFFFFFFF, nil, 0);
    if fcount > 0 then
    begin
      for i := 0 to fcount - 1 do
      begin
        DragQueryFile (medium.hGlobal, i, fn, sizeof (fn));
        FFilenames.Add ( string ( fn ) );
      end;
      FCanDrop := true;
    end else
      FFilenames.Clear;
  end;

  if medium.unkForRelease = nil then
    ReleaseStgMedium (medium);
  dataObj._Release;

  if Assigned (FEnterEvent) then
    FEnterEvent (self, FFilenames, FCanDrop);

  if FCanDrop then
    dwEffect := DROPEFFECT_COPY
  else
    dwEffect := DROPEFFECT_NONE;
  Result := S_OK;
end;

function TFileDrop.DragLeave: HResult;
begin
  FFilenames.Clear;
  Result := S_OK;
end;

function TFileDrop.DragOver(grfKeyState: Integer; pt: TPoint;
  var dwEffect: Integer): HResult;
begin
  if FCanDrop then
    dwEffect := DROPEFFECT_COPY
  else
    dwEffect := DROPEFFECT_NONE;
  Result := S_OK;
end;

function TFileDrop.Drop(const dataObj: IDataObject; grfKeyState: Integer;
  pt: TPoint; var dwEffect: Integer): HResult;
begin
  if Assigned (FDropEvent) and FCanDrop then
  begin
    FDropEvent (self, FFilenames);
    dwEffect := DROPEFFECT_COPY;
  end else
    dwEffect := DROPEFFECT_NONE;

  FFilenames.Clear;
  Result := S_OK;
end;

initialization
  OleInitialize(nil);

finalization
  OleUninitialize;

end.

вторник, 12 мая 2009 г.

Пример реализации расширения для показа эскиза файла

В ответ на этот коммент сделал пример - работающий

Код в заметке был скопипастен из рабочего кода и да, не работал - надо было напильником доработать немного для реальной жизни

Но совсем немного.. Вот работающий пример - скачать пример

пятница, 21 ноября 2008 г.

Обновление FFMPEG

Обновил/пересобрал сегодня (21.11.2008) ffmpeg из svn-а, пофиксил хедеры паскалевские, мои проекты как будто бы работают :)

Положил на рапиду архив с готовыми dll-ками и архив с хедерами и некоторыми примерами

Архив с dll (rar, 1959 кб)
Архив с исходниками (rar, 76 кб)

четверг, 9 октября 2008 г.

вторник, 23 сентября 2008 г.

FFMPEG: пример

Вот тут лежит обьяснение азов работы с ffmpeg-ом (блин, ну не с ffmpeg-ом конечно, а с библиотеками из проекта), спортировал пример на паскаль, положил на рапиду архив

Чтобы понять, с какой стороны подойти к сабжу, подойдет - там и чтение файла, и декодирование, и ресемплинг картинки

Отсебятины добавил - swscale вместо imgconvert (ибо deprecated) и процедурку сохранения картинок, чтобы посмотреть на результат

Лежит вот - http://rapidshare.com/files/147700653/testProject.zip.html

четверг, 11 сентября 2008 г.

ffmpeg + Delphi = лежит тут

Выложил на рапидшару последние паскальные заголовки для либ из ffmpeg, вдруг на работе комп ляпнется, svn ляпнется, дома комп ляпнется, svn ляпнется - и что делать? Рапидшара не ляпнется никогда :)

заголовки в pas (обновлено по svn на 24.09.2008)
скомпиленные dll (из svn на 07.10.2008)

вторник, 9 сентября 2008 г.

Delphi 2009

Все пугали-пугали, что когда-то наступит

sizeof (char) <> 1

Похоже наступило это время, вышла новая делфи

четверг, 4 сентября 2008 г.

ffmpeg + lame

Еще про ffmpeg - добавление поддержки lame

Сначала надо скачать исходники собственно lame и положить куда-нибудь - пусть внутрь папки ffmpeg

Дальше надо отсюда (nasm sources) скачать исходники nasm:
Распаковываем архив в c:\msys, заходим в консоль, пишем:

cd c:/msys/nasm-2.03.01
./configure --prefix=/mingw
make
make install

Затем в консоли пишем:

cd c:/ffmpeg/lame-3.97
./configure --prefix=/mingw --disable-shared --enable-nasm
make
make install


Все должно скомпилится и файлы разложиться по правильным полочкам; после чего переходим к исходникам ffmpeg и собираем все (моя цель - получить dll-ки, которые я буду использовать в своей программе):

cd c:/ffmpeg
./configure --enable-memalign-hack --enable-w32threads
--enable-libmp3lame --enable-shared --disable-static --enable-gpl
--enable-swscale --extra-cflags=-I/mingw/include/lame
--extra-ldflags=-L/mingw/lib
make
make install

Все, будто бы работает

Опять ffmpeg...

Мне опять надо пересобрать ffmpeg :( - но я то уже подкован и почти помню свои себе (недописанные правда) инструкции; инструкции обновились:

Идем на SourceForge.net в раздел MinGW - Minimalist GNU for Windows, ищем там MSYS Base System, из которого качаем:
Затем нужны файлы из раздела MinGW Runtime:
Еще нужен файл в разделе MinGW API for MS-Windows:
Из раздела GNU Binutils нужны:
Из GNU Make:
Из GCC Version 3:
Из GCC Version 4:
Делаем папку, скажем c:\msys; в эту папку распаковываем первые 4 архива. Распаковываем в таком порядке, соглашаясь на перезапись файлов; файлы из coreutils норовят распаковаться в отдельную папку - не давать.

Дальше надо в папке msys сделать папку mingw, в которую распаковать остальные архивы.

Когда все файлы на месте, надо поправить msys.bat (в c:\msys) - добавить в него первой строчкой

call "C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"

Строчка нужна, чтобы компилить windows-совместимые dll-ки (ну и студия должна быть установлена конечно для этого)

Следующий шаг - надо открыть файл c:\msys\etc\fstab и добавить в него строку

c:/msys/mingw /mingw

Чтобы не напрягать глаза, пытаясь прочитать вывод консоли, можно еще поправить строку 88 в msys.bat (или 89... смотря как добавлять вот ту строчку выше в этот файл) - вот так например

start ... Courier-16 ... -geometry 100x50 -e /bin/sh --login -i

Ну и в принципе на этом все... Запускаем msys.bat, попадаем в консоль, вводим (если исходники ffmpeg лежат скажем в c:\ffmpeg):

cd c:/ffmpeg
./configure --enable-memalign-hack --cc=gcc-sjlj --enable-libmp3lame --enable-shared
make
make install


Ждем, ждем, ждем, и через какое-то время получаем результат (проверено на "чистой" виртуалке); результат лежит в папке c:\msys\local - в bin лежат ffmpeg.exe и dll файлы (если заказывались), в include лежат *.h файлы, достаточные для использования полученных dll, в lib лежат еще какие-то файлы, которые мне не нужны, ибо пишу в делфи