Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 08.08.2012, 22:20
Аватар для Klyaksa
Klyaksa Klyaksa вне форума
Новичок
 
Регистрация: 07.01.2012
Сообщения: 90
Репутация: 10
По умолчанию

Тоже такой фигней страдал вот в итоге что получилосьЧтение wav файла По трасируешь разберешся как он читается. Да кстати он более правильно будет читать моно канал на стерео вроде не ругается, но семплы рисует не правильно.
Вложения
Тип файла: 7z Чтение wav файла.7z (7.6 Кбайт, 12 просмотров)
Ответить с цитированием
  #17  
Старый 09.08.2012, 20:21
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Считывай их так же, как считывал заголовок. Только имей ввиду, что ссылки которые ты привёл подразумевают, что внутри WAV-файла аудио-данные в формате PCM (смотри на картинке AudioFormat=1). А внутри WAV-файла могут быть аудио-данные и в другом формате, например в MP3.
И ещё на этом сайте (delphisources.ru) есть несколько исходников для работы с WAV-файлами - поищи по слову "WAV".
Я пробовал считать sample 1, sample 2 и т.д. но ничего не вышло. Результат выводиться 0. Помогите кто нибудь с кодом. Уже все перепробовал.
Ответить с цитированием
  #18  
Старый 09.08.2012, 21:54
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Я пробовал считать sample 1, sample 2 и т.д. но ничего не вышло. Результат выводиться 0. Помогите кто нибудь с кодом. Уже все перепробовал.
Ты читаешь заголовок и всё нормально читается, но потом читаешь sample 1, sample 2 и "выводиться 0"? Не верю! Ну или там действительно 0.
Ответить с цитированием
  #19  
Старый 09.08.2012, 22:52
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Ты читаешь заголовок и всё нормально читается, но потом читаешь sample 1, sample 2 и "выводиться 0"? Не верю! Ну или там действительно 0.
Так я же прошу о помощи! Программу - исходник я выложил. Ну не получается у меня
Ответить с цитированием
  #20  
Старый 10.08.2012, 02:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Так я же прошу о помощи! Программу - исходник я выложил. Ну не получается у меня
Исходники программы, то я смотрел (Ну той которая в самом первом сообщении здесь прикреплена). Вот только где там попытки прочитать "sample 1, sample 2", которые не читаются и "выводиться 0"? - Нету!

Вот в твоей функции ReadWave (это ведь твоя функция?):
  1. Читаешь заголовок файла и проверяешь, что это действительно RIFF-WAVE-файл
  2. Ищешь чанк 'fmt', читаешь его и выводишь в Memo1 его содержимое
  3. Ищешь чанк 'data' и... выходишь из функции...
А зачем ты выходишь из функции? Самое время читать эти самые "sample 1, sample 2". Чтото типа:
Код:
f.ReadBuffer(sample, SampleSize);

И не забывай освобождать объект в переменной f (Вот попробуй дважды открыть один и тот же wav-файл).
Ответить с цитированием
  #21  
Старый 10.08.2012, 09:47
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Исходники программы, то я смотрел (Ну той которая в самом первом сообщении здесь прикреплена). Вот только где там попытки прочитать "sample 1, sample 2", которые не читаются и "выводиться 0"? - Нету!

Вот в твоей функции ReadWave (это ведь твоя функция?):
  1. Читаешь заголовок файла и проверяешь, что это действительно RIFF-WAVE-файл
  2. Ищешь чанк 'fmt', читаешь его и выводишь в Memo1 его содержимое
  3. Ищешь чанк 'data' и... выходишь из функции...
А зачем ты выходишь из функции? Самое время читать эти самые "sample 1, sample 2". Чтото типа:
Код:
f.ReadBuffer(sample, SampleSize);

И не забывай освобождать объект в переменной f (Вот попробуй дважды открыть один и тот же wav-файл).
Я попробовал что-то сделать, но не получается ввести в программу sample и SampleSize, выдаются ошибки, типа тип не описан, но я ведь его описал. Вот код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, sSkinManager, ImgList, Inifiles;


Const
  noError            = 0;
  ReadError          = 1;
  HeaderError        = 2;
  DataError          = 3;
  FileCorrupt        = 4;
  IncorectFileFormat = 5;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    sSkinManager1: TsSkinManager;
    ImageList1: TImageList;

    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure N12Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
end;
  TWaveHeaderChank = record
    wFormatTag     : Smallint;
    wChannels      : WORD;
    wSamplesPerSec : Cardinal;
    wAvgBytesPerSec: Cardinal;
    wBlockAlign    : WORD;
    wBitsPerSample : WORD;
    wcbSize        : WORD;

  end;

  TWaveResult = record
    ERROR          : WORD;
    wAvgBytesPerSec: Cardinal;
    wBitsPerSample : WORD;
    wChannels      : WORD;
    Data           : TMemoryStream;
    Sample         : WORD;
  end;

var
  Form1: TForm1;
  TxtFile : TextFile;
  i : integer;
  Ini:Tinifile;
  language:string;
implementation

{$R *.dfm}
{$R WindowsXP.res}

uses math, Unit2;

Function ReadWave(FileName : AnsiString) : TWaveResult;
var
  f             : TFileStream;
  wFileSize     : Cardinal;
  wChankSize    : Cardinal;
  wSampleSize   : Cardinal;
  ID            : array[0..3] of Char;
  Header        : TWaveHeaderChank;

Begin
  FillChar(Result, SizeOf(Result), 0);

  Try
    f := TFileStream.Create(FileName, fmOpenRead);
    f.Seek(0, soFromBeginning);
    f.ReadBuffer(ID[0], 4);
  If String(ID) <> 'RIFF'
    then
      Begin
        Result.ERROR := IncorectFileFormat;



        exit;
      end;
  Form1.memo1.Lines.Add(String(ID));

     f.ReadBuffer(wFileSize, 4);

      Form1.memo1.Lines.Add('' + intToStr(wFileSize));

    if f.size <> (wFileSize + 8)
    then
      Begin
        Result.ERROR := FileCorrupt;



        exit;
      end;

    f.ReadBuffer(ID[0], 4);

      Form1.memo1.Lines.Add(String(ID));

    if String(ID) <> 'WAVE'
    then
      Begin
        Result.ERROR := IncorectFileFormat;



        exit;
      end;

    wChankSize := 0;
    repeat
      f.Seek(wChankSize, soFromCurrent);
      f.ReadBuffer(ID[0], 4);


        Form1.memo1.Lines.Add(String(ID));
      f.ReadBuffer(wChankSize, 4);

      if wChankSize > High(integer)
      then
        Begin
          Result.ERROR := DataError;



          exit;
        end;

        Form1.memo1.Lines.Add('' + intToStr(wChankSize));
    until  (String(ID)='fmt ') or (String(ID)='data');

    if String(ID)='data'
    then
      Begin
        Result.ERROR := HeaderError;

//Попытка считать хоть один Сэмпл//

       f.ReadBuffer(wSampleSize, );
       Form1.memo1.Lines.Add(''   + intToStr(Sample.wSampleSize));
        exit;
      end;



    f.ReadBuffer(Header, Min(wChankSize, SizeOf(TWaveHeaderChank)));

      Form1.memo1.Lines.Add(''   + intToStr(Header.wFormatTag));
      Form1.memo1.Lines.Add(''   + intToStr(Header.wChannels));
      Form1.memo1.Lines.Add(''   + intToStr(Header.wSamplesPerSec));
      Form1.memo1.Lines.Add(''   + intToStr(Header.wAvgBytesPerSec));
      Form1.memo1.Lines.Add(''   + intToStr(Header.wBlockAlign));
      Form1.memo1.Lines.Add(''   + intToStr(Header.wBitsPerSample));

    if wChankSize > SizeOf(TWaveHeaderChank)
    then
      f.Seek(wChankSize - SizeOf(TWaveHeaderChank), soFromCurrent);

    if wChankSize >= SizeOf(TWaveHeaderChank)
    then

        Form1.memo1.Lines.Add('wcbSize '        + intToStr(Header.wcbSize));

    wChankSize := 0;
    repeat
      f.Seek(wChankSize, soFromCurrent);
      f.ReadBuffer(ID[0], 4);

        Form1.memo1.Lines.Add(String(ID));
      f.ReadBuffer(wChankSize, 4);

        Form1.memo1.Lines.Add(''    + intToStr(wChankSize));
    until  String(ID)='data';

Except
    Result.ERROR := ReadError;
  end;
end;




procedure  TForm1.Button1Click(Sender: TObject);
var
  r : TWaveResult;
begin
  if opendialog1.Execute
  then
    r := ReadWave(opendialog1.FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Form1.Memo1.Lines.SaveToFile(Form1.SaveDialog1.FileName + '.txt');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Memo1.Clear;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
language:=Ini.ReadString('Language','CurrentLang','');
Ini.Free;
Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'/Language/'+language+'.lng');

Form1.Caption:=Ini.ReadString('TForm1','Read Information From WAV','');
Form2.Caption:=Ini.ReadString('TForm2','About','');
N1.Caption:=Ini.ReadString('TForm1','File','');
N2.Caption:=Ini.ReadString('TForm1','Open','');
N3.Caption:=Ini.ReadString('TForm1','Exit','');
N4.Caption:=Ini.ReadString('TForm1','Help','');
N5.Caption:=Ini.ReadString('TForm1','About...','');
N6.Caption:=Ini.ReadString('TForm1','Save','');
N7.Caption:=Ini.ReadString('TForm1','Language','');
N8.Caption:=Ini.ReadString('TForm1','Russian','');
N9.Caption:=Ini.ReadString('TForm1','English','');
N10.Caption:=Ini.ReadString('TForm1','Ukrainian','');
N11.Caption:=Ini.ReadString('TForm1','French','');
N12.Caption:=Ini.ReadString('TForm1','German','');
Button1.Caption:=Ini.ReadString('TForm1','Open WAV file','');
Button2.Caption:=Ini.ReadString('TForm1','Save the values in TXT file','');
Button3.Caption:=Ini.ReadString('TForm1','Clear','');
Ini.Free;
end;


procedure TForm1.N2Click(Sender: TObject);
begin
button1.OnClick(self);
end;
procedure TForm1.N3Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.N5Click(Sender: TObject);
begin
AnimateWindow(form2.Handle, 500, aw_blend);
Form2.Show;
end;
procedure TForm1.N6Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Form1.Memo1.Lines.SaveToFile(Form1.SaveDialog1.FileName + '.txt');
end;
procedure TForm1.N8Click(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
 Ini.WriteString('Language','CurrentLang','russian');
 Ini.Free;
 FormShow(Self);
end;
procedure TForm1.N9Click(Sender: TObject);
begin
 Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
 Ini.WriteString('Language','CurrentLang','english');
 Ini.Free;
 FormShow(Self);
end;
procedure TForm1.N10Click(Sender: TObject);
begin
 Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
 Ini.WriteString('Language','CurrentLang','ukrainian');
 Ini.Free;
 FormShow(Self);
end;
procedure TForm1.N11Click(Sender: TObject);
begin
 Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
 Ini.WriteString('Language','CurrentLang','french');
 Ini.Free;
 FormShow(Self);
end;
procedure TForm1.N12Click(Sender: TObject);
begin
 Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
 Ini.WriteString('Language','CurrentLang','german');
 Ini.Free;
 FormShow(Self);
end;
end.
Что тут не так. И еще одно: тип должен быть именно Sample, ведь именно его программа видит в файле, или... и вообще за каким принципом читаются данные?
Ответить с цитированием
  #22  
Старый 10.08.2012, 11:19
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Я попробовал что-то сделать, но не получается ввести в программу sample и SampleSize, выдаются ошибки, типа тип не описан, но я ведь его описал. Вот код:
...
Что тут не так. И еще одно: тип должен быть именно Sample, ведь именно его программа видит в файле, или... и вообще за каким принципом читаются данные?
Ты же пытаешься читать сэмплы в том месте где должен читаться чанк "fmt". Читать нужно когда уже найден чанк "data" - в твоём коде это перед словом Exception:
Код:
    until  String(ID)='data';

    <-- Вот тут

Except
    Result.ERROR := ReadError;
  end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (10.08.2012)
  #23  
Старый 10.08.2012, 11:50
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Вот наваял пример (будешь должен ):
Код:
var
...
  sample: Int64;
  SampleSize, chanel, n, i: Integer;
  s: String;
...
    if Header.wFormatTag<>1 then
    begin
      Form1.Memo1.Lines.Add('ОШИБКА! Я умею читать wav-файлы только в формате PCM, а этот файл в формате 0x'+IntToHex(Header.wFormatTag, 4));
      // Можешь вместо числового значения выдавать текстом взятым например отсюда: http://wiki.multimedia.cx/index.php?title=TwoCC
      Exit;
    end;

    SampleSize:=(Header.wBitsPerSample+7) div 8;
    if SampleSize>SizeOf(sample) then
    begin
      Form1.Memo1.Lines.Add('ОШИБКА! Слишком большой размер сэмпла ('+IntToStr(SampleSize)+' байт)');
      Exit;
    end;

    if Header.wChannels=0 then
    begin
      Form1.Memo1.Lines.Add('ОШИБКА! Нет каналов');
      Exit;
    end;

    Form1.Memo1.WordWrap:=False;
    Form1.Memo1.ScrollBars:=ssBoth;
    sample:=0;
    i:=0;
    while wChankSize>=(SampleSize*Header.wChannels) do
    begin
      if Header.wBlockAlign>0 then
      begin
        n:=f.Position mod Header.wBlockAlign;
        if n>0 then
        begin
          f.Seek(wChankSize, soFromCurrent);
          Dec(wChankSize, n);
          if wChankSize<(SampleSize*Header.wChannels) then Break;
        end;
      end;

      Inc(i);
      s:='Сэмпл '+IntToStr(i);
      for chanel := 1 to Header.wChannels do
      begin
        f.ReadBuffer(sample, SampleSize);
        Dec(wChankSize, SampleSize);
        s:=s+', Канал '+IntToStr(chanel)+': '+IntToHex(sample, SampleSize*2);
      end;
      Form1.Memo1.Lines.Add(s);
    end;
Писал на скорую руку - могут быть ошибки, так что проверяй.
Если и после этого тебе будет не ясно как читать PCM-сэмплы - убью
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (10.08.2012)
  #24  
Старый 10.08.2012, 11:52
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Ты же пытаешься читать сэмплы в том месте где должен читаться чанк "fmt". Читать нужно когда уже найден чанк "data" - в твоём коде это перед словом Exception:
Код:
    until  String(ID)='data';

    <-- Вот тут

Except
    Result.ERROR := ReadError;
  end;
Теперь вроде бы получилось! Только сколько сэмплов надо читать? Их там что, бесконечно? И можно ли как-то сделать все одной строчкой, чтобы не писать:
Код:
    Sample0        : WORD;
    Sample1        : WORD;
    Sample2        : WORD;
    Sample3        : WORD;
    Sample4        : WORD;
    Sample5        : WORD;
    Sample6        : WORD;
    Sample7        : WORD;
    Sample8        : WORD;

А потом еще и:
Код:
     f.ReadBuffer(Header, Min(wChankSize, SizeOf(TWaveHeaderChank)));
       Form1.memo1.Lines.Add(''   + intToStr(Header.Sample0));
       Form1.memo1.Lines.Add(''   + intToStr(Header.Sample1));
       Form1.memo1.Lines.Add(''   + intToStr(Header.Sample2));
       Form1.memo1.Lines.Add(''   + intToStr(Header.Sample3));
       Form1.memo1.Lines.Add(''   + intToStr(Header.Sample4));
       Form1.memo1.Lines.Add(''   + intToStr(Header.Sample5));
       Form1.memo1.Lines.Add(''   + intToStr(Header.Sample6));
       Form1.memo1.Lines.Add(''   + intToStr(Header.Sample7));
       Form1.memo1.Lines.Add(''   + intToStr(Header.Sample8));
И верны ли эти цифры? Содержаться ли они в wav'е или это просто от фонаря как то?
Вот программа:
Вложения
Тип файла: rar Read inf From WAV.rar (528.8 Кбайт, 7 просмотров)
Ответить с цитированием
  #25  
Старый 10.08.2012, 11:58
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Теперь вроде бы получилось! Только сколько сэмплов надо читать? Их там что, бесконечно? И можно ли как-то сделать все одной строчкой, чтобы не писать:
Смотри выше я привёл полностью рабочий код.
Ответить с цитированием
  #26  
Старый 10.08.2012, 12:21
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Смотри выше я привёл полностью рабочий код.
Спасибо огромное!!!! Очень помогло. И ошибок нету в твоем "коде на скорую руку"!
Ответить с цитированием
  #27  
Старый 10.08.2012, 12:24
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Смотри выше я привёл полностью рабочий код.
И еще один вопрос: значения сэмплов выводятся в двоичном или шестнадцатеричном коде?
Ответить с цитированием
  #28  
Старый 10.08.2012, 12:35
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
И еще один вопрос: значения сэмплов выводятся в двоичном или шестнадцатеричном коде?
Выводится функцией IntToHex. В каком по-твоему виде?
Ответить с цитированием
  #29  
Старый 10.08.2012, 12:37
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Выводится функцией IntToHex. В каком по-твоему виде?
Понятно! Просто я в код не заглядывал детально.
Ответить с цитированием
  #30  
Старый 10.08.2012, 13:28
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Понятно! Просто я в код не заглядывал детально.
Хм... Интересно ты программы пишешь...
Кстати пару ошибок я таки нашёл. Правда они редко будут проявляться, может даже почти никогда, но всё-же лучше без них
Вот здесь:
Код:
        if n>0 then
        begin
          f.Seek(wChankSize, soFromCurrent);
          Dec(wChankSize, n);
          if wChankSize<(SampleSize*Header.wChannels) then Break;
        end;
Должно быть так:
Код:
        if n>0 then
        begin
          n:=Header.wBlockAlign-n;
          f.Seek(n, soFromCurrent);
          Dec(wChankSize, n);
          if wChankSize<(SampleSize*Header.wChannels) then Break;
        end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (10.08.2012)
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram