Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Пожалуйста закомментируйте программу


Автор: OverloaD 14.5.2006, 14:43
Народ, помогите плз, надо написать курсовую по этой программе, а без комментариев я фиг в ней сам разберусь, программа делает следующее: выбраный wav фаил разбивает на блоки по 256 байт, каждый блок разбивается пополам на байте соответствующем номеру текущего символа ключа в ASCII, эти подблоки меняются местами, то-есть грубо говоря шифрует данный wav фаил, при декодеровке выполняется та же самая процедура. Заранее огромное спасибо! 
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, {Variants, }Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, MMSystem, MPlayer, Buttons, ExtCtrls, Spin;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    SourceFileEdit: TEdit;
    EncodedFileEdit: TEdit;
    DecodedFileEdit: TEdit;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    Button2: TButton;
    Button3: TButton;
    Label2: TLabel;
    KeyEdit: TEdit;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    procedure EnCodeFile(OrigFile, DestFile: string);
    procedure DeCodeFile(OrigFile, DestFile: string);
  public
    { Public declarations }
  end;

const
  WavHeader: integer = 44;
  
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);


function CreateNewWave(NewFileName: string): Boolean;
var
  DeviceID: Word;
  Return: LongInt;
  MciOpen: TMCI_Open_Parms;
  MciRecord: TMCI_Record_Parms;
  MciPlay: TMCI_Play_Parms;
  MciSave: TMCI_SaveParms;
  MCIResult: LongInt;
  Flags: Word;
  TempFileName: array[0..255] of char;
begin
  StrPCopy(TempFileName, NewFileName);
  MciOpen.lpstrDeviceType := 'waveaudio';
  MciOpen.lpstrElementName := '';
  Flags := Mci_Open_Element or Mci_Open_Type;
  MCIResult := MciSendCommand(0, MCI_OPEN, Flags, LongInt(@MciOpen));
  DeviceID := MciOpen.wDeviceId;
  MciRecord.dwTo := 1;
  Flags := Mci_To or Mci_Wait;
  MCIResult := MciSendCommand(DeviceID, Mci_Record, Flags, LongInt(@MciRecord));
  mciPlay.dwFrom := 0;
  Flags := Mci_From or Mci_Wait;
  MciSendCommand(DeviceId, Mci_Play, Flags, LongInt(@MciPlay));
  mciSave.lpfileName := TempFilename;
  Flags := MCI_Save_File or Mci_Wait;
  MCIResult := MciSendCommand(DeviceID, MCI_Save, Flags, LongInt(@MciSave));
  Result := MciSendCommand(DeviceID, Mci_Close, 0, LongInt(nil)) = 0;
end;

var
FirstFile, ShifrFile, SecondFile: file;
size, parts, i, e: integer;
Buffer, ShifrBuffer: array of byte;

begin
  OpenDialog1.Execute;
  CreateNewWave(ExtractFileDir(OpenDialog1.FileName)+'Shifr.wav');
  AssignFile(FirstFile, OpenDialog1.FileName);
  Reset(FirstFile);
  AssignFile(ShifrFile, ExtractFileDir(OpenDialog1.FileName)+'Shifr.wav');
  rewrite(ShifrFile);
  Size:=StrToInt(Edit1.Text);
  Parts:=FileSize(FirstFile) div Size;
  e:=2*parts;
  BlockRead(FirstFile, Buffer, Parts);
  BlockWrite(ShifrFile, Buffer, Parts);
  For i:=2 to parts+1 do
  begin
    if i mod 2 = 0 then
      BlockRead(FirstFile, Buffer, Parts*i-Parts)
    else
      begin
        ShifrBuffer:=Buffer;
        BlockRead(FirstFile, Buffer, Parts*i-Parts);
        BlockWrite(ShifrFile, ShifrBuffer, Parts*i-Parts);
        BlockWrite(ShifrFile, Buffer, Parts*i-Parts);
    end
  end;
  CloseFile(ShifrFile);
  CloseFile(Firstfile);
  {sndPlaySound(ExtractFileDir(OpenDialog1.FileName)+'shifr.wav'), SND_ASYNC);
  sndPlaySound(nil, SND_ASYNC);}
  CreateNewWave(ExtractFileDir(OpenDialog1.FileName)+'Second.wav');
  AssignFile(ShifrFile, ExtractFileDir(OpenDialog1.FileName)+'Shifr.wav');
  Reset(FirstFile);
  AssignFile(SecondFile, ExtractFileDir(OpenDialog1.FileName)+'second.wav');
  Size:=StrToInt(Edit1.Text);
  Parts:=FileSize(ShifrFile) div Size;
  e:=2*parts;
  BlockRead(ShifrFile, Buffer, Parts);
  BlockWrite(SecondFile, Buffer, Parts);
  For i:=2 to parts+1 do
  begin
    if i mod 2 = 0 then
      BlockRead(ShifrFile, Buffer, Parts*i-Parts)
    else
      begin
        ShifrBuffer:=Buffer;
        BlockRead(ShifrFile, Buffer, Parts*i-Parts);
        BlockWrite(SecondFile, Buffer, Parts*i-Parts);
        BlockWrite(SecondFile, ShifrBuffer, Parts*i-Parts);
    end
  end;
  CloseFile(ShifrFile);
  CloseFile(SecondFile);
  {sndPlaySound(ExtractFileDir(OpenDialog1.FileName)+'Second.wav'), SND_ASYNC);
  sndPlaySound(nil, SND_ASYNC);}
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin

  With OpenDialog1 do
  If Execute
  then SourceFileEdit.Text := FileName;

end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin

  With SaveDialog1 do
  If Execute
  then EncodedFileEdit.Text := FileName;

end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin

  With SaveDialog1 do
  If Execute
  then DecodedFileEdit.Text := FileName;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

  If Not FileExists(SourceFileEdit.Text)
  then begin
         MessageDlg('Исходный файл не существует или его имя указано с ошибкой', mtError, [mbOK], 0);
         Exit;
       end;

  If FileExists(EncodedFileEdit.Text)
  then begin

         If MessageDlg('Файл ' + EncodedFileEdit.Text + ' уже существует. Хотите перезаписать его?', mtConfirmation, [mbOK, mbNo], 0) = mrNo
         then Exit;

       end;

  EnCodeFile(SourceFileEdit.Text, EncodedFileEdit.Text);

  MessageDlg('Файл зашифрован!', mtInformation, [mbOk], 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  EncodedFileEdit.Text := ExtractFilePath(Application.ExeName) + 'Encoded.wav';
  DecodedFileEdit.Text := ExtractFilePath(Application.ExeName) + 'Decoded.wav';
  OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName);
  OpenDialog1.Filter := 'Файлы Windows Media|*.Wav';
  SaveDialog1.InitialDir := ExtractFilePath(Application.ExeName);
  SaveDialog1.Filter := 'Файлы Windows Media|*.Wav';
end;

procedure TForm1.EnCodeFile(OrigFile, DestFile: string);
var
  CutPos: integer;
  Readed: integer;
  SFile, EnFile: file;
  Block1, Block2: array of byte;
  KeyString: string;
begin
  AssignFile(SFile, OrigFile);
  Reset(SFile, 1);

  AssignFile(EnFile, DestFile);
  Rewrite(EnFile, 1);

  SetLength(Block1, WavHeader);                      //выделяем место под данные Wav файла (Wav - Header)

  BlockRead(SFile, Block1[0], Length(Block1), Readed);
  BlockWrite(EnFile, Block1[0], Length(Block1));                 //переписываем без изменений

  SetLength(Block1, 255);
  SetLength(Block2, 255);

  KeyString := KeyEdit.Text;

  While Not EOf(SFile) do
  begin
    BlockRead(SFile, Block1[0], Length(Block1), Readed);

    If Readed = Length(Block1)
    then begin
           CutPos := ord(KeyString[1]);                          //выбираем точку разрезания блока
           KeyString := Copy(KeyString, 2, Length(KeyString) - 1) + KeyString[1]; //бесконечный перебор символов ключа

           Move(Block1[CutPos], Block2[0], Length(Block1) - CutPos);                   //перемешиваем
           Move(Block1[0], Block2[Length(Block1) - CutPos], CutPos);
         end
    else begin //достигнут конец файла

           If Readed > 0
           then begin
                  SetLength(Block2, Readed);
                  Move(Block1[0], Block2[0], Readed);
                  BlockWrite(EnFile, Block2[0], Length(Block2));      //записываем в результирующий файл последний блок
                  Break;
                end;

         end;

    BlockWrite(EnFile, Block2[0], Length(Block2));                    //записываем в результирующий файл
  end;

  CloseFile(SFile);
  CloseFile(EnFile);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin

  If FileExists(DecodedFileEdit.Text)
  then begin

         If MessageDlg('Файл ' + DecodedFileEdit.Text + ' уже существует. Хотите перезаписать его?', mtConfirmation, [mbOK, mbNo], 0) = mrNo
         then Exit;

       end;

  DeCodeFile(EncodedFileEdit.Text, DecodedFileEdit.Text);

  MessageDlg('Файл дешифрован!', mtInformation, [mbOk], 0);
end;

procedure TForm1.DeCodeFile(OrigFile, DestFile: string);
var
  CutPos: integer;
  Readed: integer;
  SFile, EnFile: file;
  Block1, Block2: array of byte;
  KeyString: string;
begin
  AssignFile(SFile, OrigFile);
  Reset(SFile, 1);

  AssignFile(EnFile, DestFile);
  Rewrite(EnFile, 1);

  SetLength(Block1, WavHeader);                      //выделяем место под данные Wav файла (Wav - Header)

  BlockRead(SFile, Block1[0], Length(Block1), Readed);
  BlockWrite(EnFile, Block1[0], Length(Block1));                 //переписываем без изменений

  SetLength(Block1, 255);
  SetLength(Block2, 255);

  KeyString := KeyEdit.Text;

  While Not EOf(SFile) do
  begin
    BlockRead(SFile, Block1[0], Length(Block1), Readed);

    If Readed = Length(Block1)
    then begin
           CutPos := ord(KeyString[1]);                          //выбираем точку разрезания блока
           KeyString := Copy(KeyString, 2, Length(KeyString) - 1) + KeyString[1]; //бесконечный перебор символов ключа

           Move(Block1[Length(Block1) - CutPos], Block2[0], CutPos);                   //перемешиваем
           Move(Block1[0], Block2[CutPos], Length(Block1) - CutPos);
         end
    else begin //достигнут конец файла

           If Readed > 0
           then begin
                  SetLength(Block2, Readed);
                  Move(Block1[0], Block2[0], Readed);
                  BlockWrite(EnFile, Block2[0], Length(Block2));      //записываем в результирующий файл последний блок
                  Break;
                end;

         end;

    BlockWrite(EnFile, Block2[0], Length(Block2));                    //записываем в результирующий файл
  end;

  CloseFile(SFile);
  CloseFile(EnFile);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Close;
end;

end.
 

Автор: Sunr1se 14.5.2006, 15:59
Пожалуйста, укажи, какие именно моменты в этом коде тебе не понятны, тогда я их объясню. А на добавление комментариев к каждой строке может уйти куча времени smile
А если ты не знаешь какой-то команды, то воспользуйся справкой - там все очень хорошо описано. 

Автор: OverloaD 14.5.2006, 16:23
ты имеешь ввиду стандартную справку delphi?
а моменты которые не понятны, вот строчка (таких там много)) к примеру значение которой мне не понятно
MCIResult := MciSendCommand(DeviceID, MCI_Save, Flags, LongInt(@MciSave));
 если это всё можно посмотреть в каком-нибудь хелпе напиши плз в каком 
 

Автор: DonPager 14.5.2006, 16:44
Ответ на этот вопрос находится мсдн 

Автор: Sunr1se 14.5.2006, 17:14
Пожалуйста:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_mcisendcommand.asp
Там же (т.е. на msdn.microsoft.com) находится описание других WinAPI-шных команд. 

Автор: OverloaD 15.5.2006, 09:25
2Sunr1se спасиб!  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)