Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi 2

Автор: dmit000
Дата сообщения: 20.09.2006 14:23
OdesitVadim
Для эмитации работы
Автор: OdesitVadim
Дата сообщения: 20.09.2006 15:59
dmit000
Человек может различать от 12 до 20 кадров в секунду. поэтому в кинематографе используется 24 кадра. Поэтому человек будет видеть, как изменяются десятые доли, а вот сотые - будут сливаться. Смело можеш ити с шагом в 0,04с и пользователь не заметит.
Можеш поставить эксперемент и убедиться.
Автор: Zver1992
Дата сообщения: 20.09.2006 16:35
Хотелось бы узнать, как проиграть mp3 файл из .res файла? Я компилирую его, получаеться одна программа (всё в одном файле, включая звук). Способ, исопльзуемый в статьях для .wav - не работает
Автор: Erazer
Дата сообщения: 20.09.2006 16:42
эсть прблема.... есть такой BladeMP3EncDLL.h, есть его реализация на делфях, НО с ней проги не хотят писать VBR заголовок мр3 файлу, есть догадка что из-за того что структра BE_CONFIG передаваемая lame_enc.dll на с++ передается размером в 331 байт , а из делфей 329 байт... естественно в паскалевком варианте присутствуют все поля оригинальной структуры .есть мысли ? есть задумка что тут может помочь "выравнивание структур"

Добавлено:
Zver1992 а чем ты его декодируешь?
Автор: Zver1992
Дата сообщения: 20.09.2006 16:53
Erazer
Хм. Есть обычный mp3 файл. 64кб/сек. Пишу в скрипт 1.rc
Intro RCDATA 1.mp3, компилирую через brcc32.exe, получаю 1.res. Подгружаю, а как проиграть?
Автор: OdesitVadim
Дата сообщения: 20.09.2006 17:28
Erazer
Переводил структуру сам? возможно либо неугадал соответствие типов, либо необходимо запись объявлять как packet record
Автор: GTA3
Дата сообщения: 20.09.2006 20:05

Цитата:

SERGE_BLIZNUK

при выводе строки преобразуй в число, дополняй нулями спереди (если нужно)
и наращивай Inc(MyID)

покажи как именно это сделать...и в каком месте...
Автор: wader
Дата сообщения: 20.09.2006 21:43
GTA3
Да тут ничего сложного. Добавляешь переменную, как показал SERGE_BLIZNUK.
А свой обработчик изменяешь следующим образом.

[more=весь исходник]
Изменения выделены.

Код:
procedure TForm2.Button1Click(Sender: TObject);
var
z,s: string;
begin
DateTimeToString(s,'mmdd',now);
DateTimeToString(z,'yyyymmdd',now);

memo1.Lines.Text:='TUTDF' +chr(9)+ '1.0r' +chr(9)+
'20050701' +chr(9)+ 'S401BB000001' +chr(9)+ ''+chr(9)+
'' +z+ '' +chr(9)+ 'M3b2gGta' +chr(9)+
'is a sample comment' +chr(13)+ //перевели каретку на новую строку

Format('ID%.2d',[MyID]) +chr(9)+ '' +chr(9)+ 'serNomer' +chr(9)+
datevidanpassport.Field.Text+ '' +chr(9)+ '' +Kemvidan.Text+ '' +chr(9)+
'' +gdevidan.Field.Text+
chr(13)+ 'NA01' +chr(9)+;
Inc(MyID);
end;
Автор: vserd
Дата сообщения: 21.09.2006 13:29
Erazer
Цитата:
НО с ней проги не хотят писать VBR заголовок мр3 файлу, есть догадка что из-за того что структра BE_CONFIG  передаваемая lame_enc.dll на с++ передается размером в 331 байт , а из делфей 329 байт... естественно в паскалевком варианте присутствуют все поля оригинальной структуры

Попробуй сравнить передаваемое значение в С++ и в DELPHI.
Если у тебя передается меньше байт, тогда либо где-то не правильно указал размер строки, либо не угадал с размером целого типа. разница на два байта, так что смотри на 2-х байтовые, 4-х байтовые типы.
Автор: Erazer
Дата сообщения: 21.09.2006 13:52
Zver1992 точно не скажу, но как минимум твоя проблема в том что тебе нужно его чем нить декодировать, а уж потом проигрывать.... кажись дома у меня лежит рецепт как мр3 вывести на mci... пагодь немнога, еще: Mpg123 is an excellent MPEG decoder.
Автор: RomanTim
Дата сообщения: 21.09.2006 15:23
Erazer

Цитата:
структра BE_CONFIG передаваемая lame_enc.dll на с++ передается размером в 331 байт , а из делфей 329 байт

Странно, что у тебя получилось меньше - у меня с ходу получилось больше, но с этим справился, установив выравнивание полей структур в 1... посмотри как в паскаль перевли тип BOOL - это не Boolean (1 байт), а LongBool (4 байта)
Автор: Erazer
Дата сообщения: 21.09.2006 15:31
mpglib.dll
Decoding library for MPEG Layer III and Layer II.

Добавлено:
Походу суть проблемы в том что передается след структура
LHV1 = packed record
                        dwStructVersion : DWORD;
                        dwStructSize : DWORD;
// BASIC ENCODER SETTINGS
dwSampleRate : DWORD;        // SAMPLERATE OF INPUT FILE
dwReSampleRate : DWORD;        // DOWNSAMPLERATE, 0=ENCODER DECIDES
nMode : LongInt;                // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO
dwBitrate : DWORD;            // CBR bitrate, VBR min bitrate
dwMaxBitrate : DWORD;        // CBR ignored, VBR Max bitrate
nPreset : LongInt;            // Quality preset, use one of the settings of the LAME_QUALITY_PRESET enum
dwMpegVersion : DWORD;        // FUTURE USE, MPEG-1 OR MPEG-2
dwPsyModel : DWORD;            // FUTURE USE, SET TO 0
dwEmphasis : DWORD;            // FUTURE USE, SET TO 0

// BIT STREAM SETTINGS
bPrivate : BOOL;            // Set Private Bit (TRUE/FALSE)
bCRC : BOOL;                // Insert CRC (TRUE/FALSE)
bCopyright : BOOL;            // Set Copyright Bit (TRUE/FALSE)
bOriginal : BOOL;            // Set Original Bit (TRUE/FALSE)

// VBR STUFF
bWriteVBRHeader : BOOL;    // WRITE XING VBR HEADER (TRUE/FALSE)
bEnableVBR : BOOL;            // USE VBR ENCODING (TRUE/FALSE)
nVBRQuality : integer;        // VBR QUALITY 0..9
dwVbrAbr_bps : DWORD;        // Use ABR in stead of nVBRQuality
nVbrMethod : VBRMETHOD;
bNoRes : BOOL;                // Disable Bit resorvoir (TRUE/FALSE)

// MISC SETTINGS
bStrictIso : BOOL;            // Use strict ISO encoding rules (TRUE/FALSE)
nQuality : WORD;            // Quality Setting, HIGH BYTE should be NOT LOW byte, otherwhise quality=5

// FUTURE USE, SET TO 0, align strucutre to 331 bytes
btReserved : array[0..237 + 2] of BYTE;
// btReserved : array[0..237] of BYTE;
end;
и все в ней передается как надо, тока вот bWriteVBRHeader : BOOL; передается lame_enc.dll как false, а не true, это удалось выяснить включением записи логов того что получает lame_enc.dll.
не могу я вкурить почему этот бит на выходе из проги TRUE а на входе в lame FALSE, притом что ни один другой параметр не теряется...

Добавлено:

Цитата:
как в паскаль перевли тип BOOL - это не Boolean (1 байт), а LongBool (4 байта)

шото торможу не могу понять фразы...
Автор: RomanTim
Дата сообщения: 21.09.2006 16:22
Erazer

Цитата:
шото торможу не могу понять фразы...

Посмотри - как у тебя описан тип BOOL (родного то в делфи такого нету) - как Boolean или как LongBool

Вот такое описание дает положенные 331 байт - [more]
type
BE_CONFIG_FORMAT_MP3 = packed record
dwSampleRate: Cardinal;    // 48000, 44100 and 32000 allowed
byMode: Byte;            // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO
wBitrate: Word;        // 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256 and 320 allowed
bPrivate: LongBool;
bCRC: LongBool;
bCopyright: LongBool;
bOriginal: LongBool;
end;

BE_CONFIG_FORMAT_LHV1 = packed record
// STRUCTURE INFORMATION
dwStructVersion: Cardinal;
dwStructSize: Cardinal;

// BASIC ENCODER SETTINGS
dwSampleRate: Cardinal;    // SAMPLERATE OF INPUT FILE
dwReSampleRate: Cardinal;    // DOWNSAMPLERATE, 0=ENCODER DECIDES
nMode: Integer;            // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO
dwBitrate: Cardinal;        // CBR bitrate, VBR min bitrate
dwMaxBitrate: Cardinal;    // CBR ignored, VBR Max bitrate
nPreset: Integer;        // Quality preset, use one of the settings of the LAME_QUALITY_PRESET enum
dwMpegVersion: Cardinal;    // FUTURE USE, MPEG-1 OR MPEG-2
dwPsyModel: Cardinal;        // FUTURE USE, SET TO 0
dwEmphasis: Cardinal;        // FUTURE USE, SET TO 0

// BIT STREAM SETTINGS
bPrivate: LongBool;        // Set Private Bit (TRUE/FALSE)
bCRC: LongBool;            // Insert CRC (TRUE/FALSE)
bCopyright: LongBool;        // Set Copyright Bit (TRUE/FALSE)
bOriginal: LongBool;        // Set Original Bit (TRUE/FALSE)

// VBR STUFF
bWriteVBRHeader: LongBool;    // WRITE XING VBR HEADER (TRUE/FALSE)
bEnableVBR: LongBool;            // USE VBR ENCODING (TRUE/FALSE)
nVBRQuality: Integer;        // VBR QUALITY 0..9
dwVbrAbr_bps: Cardinal;        // Use ABR in stead of nVBRQuality
bNoRes: LongBool;                // Disable Bit resorvoir

btReserved: array [0..255-2*sizeof(Cardinal)-1] of Byte;    // FUTURE USE, SET TO 0
end;

BE_CONFIG_FORMAT_AAC = packed record
dwSampleRate: Cardinal;
byMode: Byte;
wBitrate: Word;
byEncodingMethod: Byte;
end;

BE_CONFIG = packed record
dwConfig: Cardinal;
case Integer of
0: (mp3: BE_CONFIG_FORMAT_MP3);
1: (LHV1: BE_CONFIG_FORMAT_LHV1);
2: (aac: BE_CONFIG_FORMAT_AAC);
end;

PBE_CONFIG = ^BE_CONFIG;[/more]
Автор: xitsmex
Дата сообщения: 21.09.2006 20:08
RomanTim
Не помогает установка фокуса обратно. Эх. Не все так просто.
Автор: GTA3
Дата сообщения: 21.09.2006 20:13
wader
нет так не получается при шелче на кнопку
Id все время увеличивается
а мне надо так
если в компоненте Edit есть данные то созать строку
в начале строки должен быть ID + следующий номер
например
если в первой строке ID01
то в следующей должно быть ID02

а тут идет наращивание одной переменной примерно так

ID01
ID01

нажали на событие шелчек мышки они оба перерастают в:
ID02
ID02


Автор: wader
Дата сообщения: 21.09.2006 20:36
GTA3
Ясно. Просто из начального вопроса это было непонятно
Счас придумаем что-нибудь.
Автор: RomanTim
Дата сообщения: 21.09.2006 22:18
xitsmex
А как именно не помогает? Я сейчас попробовал - фокус на листвью не переходит, только Edit.SetFocus надо делать обязательно до raise - иначе на него не попадешь.
Правда, при этом тот итем, по которому кликаешь выделяется, чтобы это задавить можно сделать так:
procedure TForm1.ListView1Changing(Sender: TObject; Item: TListItem;
Change: TItemChange; var AllowChange: Boolean);
begin
if Change = ctState then
AllowChange := Edit1.Text <> '1';
end;
Автор: xitsmex
Дата сообщения: 22.09.2006 08:51
RomanTim
Наверное, у тебя MultiSelect = false. Если true - по listview начинает бегать прямоугольник выделения элементов.
Автор: deadbitch
Дата сообщения: 22.09.2006 09:24
Непонятки с Canvas.StretchDraw

Имеется такая штука: через Picture.LoadFromFile грузится emf, затем этот emf через Image.Canvas.StretchDraw рисуется. И так несколько рисунков подряд (по очереди). После показа рисунка делаю Canvas.FillRect. Image.Alignt = alClient. Рисунки сменяются по клику мышью. Так вот, первый рисунок стречится нормально в границы формы, а остальные рисуются без стречинга В чём может быть проблема? Между рисунками делаю этой отдельной Picture Free, а затем её заново создаю.
Автор: wader
Дата сообщения: 22.09.2006 09:31
deadbitch
приведи код
Автор: deadbitch
Дата сообщения: 22.09.2006 09:42
wader

Цитата:
deadbitch
приведи код


Первая картинка грузится так (в OnShow формы):

Цитата:

var
rect: TRect;
begin

pic := TPicture.Create;
rect.Left := 0;
rect.Top := 0;
rect.Right := Form1.Width;
rect.Bottom := Form1.Height;

pic.LoadFromFile(ExePath + 'EMF\'+map);
Image1.Canvas.StretchDraw(rect, pic.Graphic);
Image1.Refresh;


Остальные так:

Цитата:

pic.Free;
pic := TPicture.Create;
Image1.Canvas.Brush.Color := clBtnFace;
Image1.Canvas.FillRect(Rect);
Pic.LoadFromFile(ExePath+'EMF\'+img);
Image1.Canvas.StretchDraw(rect, pic.Graphic);
//rect тут тот же
Автор: wader
Дата сообщения: 22.09.2006 11:31
deadbitch
1. Выкини нафиг Image1.
2. Не надо постоянно создавать и уничтожать pic. Не надо. Создай ее один раз, например в OnCreate формы.А уничтожай в OnDestroy.
3. И rect тоже выкинь. Воспользуйся ClientRect формы.

Примерно что получилось:
[more=исходник]
Код:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Pic.LoadFromFile(ExePath+'EMF\'+img);
Invalidate;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
pic := TPicture.Create; // Лучше перенести в OnCreate.
pic.LoadFromFile(ExePath + 'EMF\'+map);
Invalidate;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(Rect);
Canvas.StretchDraw(ClientRect,pic.Graphic);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
Invalidate;
end;
Автор: RomanTim
Дата сообщения: 22.09.2006 12:21
xitsmex
Прямоугольник выделения бегает и скроллинг бегает, но элементы то не выделяются - так что все равно пользователь никуда не денется...
Eсли хочется, чтобы ListView вообще не реагировал на мышь - делай ему Enable/Disable в OnChange событии едита
Автор: deadbitch
Дата сообщения: 22.09.2006 14:13
wader

Цитата:
deadbitch
1. Выкини нафиг Image1.
2. Не надо постоянно создавать и уничтожать pic. Не надо. Создай ее один раз, например в OnCreate формы.А уничтожай в OnDestroy.
3. И rect тоже выкинь. Воспользуйся ClientRect формы.


Слушай, этими фокусами я хотел выиграть в скорости от Image.Picture.LoadFromFile, но фактически ничего не выиграл Поскоку также тормозно
Автор: vshersh
Дата сообщения: 22.09.2006 14:50
Hi All!
Может быть у кого-нибудь есть готовое решение для следующей проблемки:
Пытаюсь открыть файл для записи в эксклюзивном режиме (TFileStream.Create('...', fmOpenWrite or fmShareExclusive)), в это же время в этот файл пишет другой процесс - и я получаю исключение.
Как проще всего определить, какой именно процесс заблокировал файл?
Автор: wader
Дата сообщения: 22.09.2006 15:11
deadbitch
Может расскажешь, что у тебя за задача. А так код можно долго переделывать.
Что ты такое интересное делаешь?
Автор: GTA3
Дата сообщения: 22.09.2006 15:16
wader
идей нету насчет моей проблемы?
Автор: RomanTim
Дата сообщения: 22.09.2006 15:46
GTA3
Ты напиши по-человечески - что ты хочешь от своей программы... судя по тому, что у тебя на нажатие Button1 стоит
Memo1.Lines.Text := ...
каждый раз содержимое мемо будет создаваться заново, или имеется в виду Memo1.Lines.Add('IDxx'...), и если мема пустая, то перовй строкой добавить 'TUTDF'... ?
Автор: Erazer
Дата сообщения: 22.09.2006 17:01
короче проблема вот в чем "I investigated that
this was due to the difference in boolean types in
Delphi/C. A 32 bit boolean in Delphi is either all 0's
or all 1's while the C value TRUE is 1 (only 1 bit
set). In BladeMP3EncDLL.c the intialisation routine
perfoms a check
TRUE == lameConfig.format.LHV1.bWriteVBRHeader
This check fails for the Delphi 32-bit boolean true."
иными словами дельфийский boolean не катит Lame_enc.dll написанному на С++, ибо в с он представлен 1 битом, а в делфях 32 битами среди которых либо все 0 либо 1 единичка, в отличии от с где на это выделен 1 бит... шо ж мине робить ? падскажить люди добрыя....
Автор: RomanTim
Дата сообщения: 22.09.2006 17:13
Erazer

Цитата:
иными словами дельфийский boolean не катит Lame_enc.dll написанному на С++, ибо в с он представлен 1 битом, а в делфях 32 битами среди которых либо все 0 либо 1 единичка, в отличии от с где на это выделен 1 бит... шо ж мине робить ? падскажить люди добрыя....

2 варианта:
- поправить в заголовочном файле в описании поля BOOL на Integer и задавать не False/True, а 0/1
- задавать значение не lameConfig.format.LHV1.bWriteVBRHeader := True, а Integer(lameConfig.format.LHV1.bWriteVBRHeader) := 1

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.