Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[13949] 이 소스를 수정해 주시면 감사하겠습니다.
김수정 [] 1989 읽음    2011-11-29 15:48
아래 소스는 인터넷을 뒤져서 가져온 소스입니다.



전 Indy10을 사용하고 있어서
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
이부분에서 AData가 TStream형이 아니고 TBytes; 형이거든요.

idUDPClient1.SendBuffer(p,len); 이 부분에서도    
p:array [0..1023] of byte; 이렇게 선언되어 있지만
p : TBytes; 형으로 선언이 되어야 하고요.


말씀드렸다 시피 전 프로그래머도 아니고
단지 회사에서 제 담당 업무(영업지원업무)를 프로그램으로 개발할때 옆에서 자잘한 심부름을 해주고
개발하시는 분께서 기초지식 정도는 있어야 인계받을 수 있을꺼라며 잠시 가르쳐 주셔서 배운것이 전부입니다.

학교에서 베이직과 C를 1학기씩 배우기는 했지만 그것은 도움도 안되고요.

하지만 회사에서는 제가 뭐 대단한 줄 알고 있고 저 역시 단순히 창 하나 만들어 파일만 전송해주면 되는
그런 간단한 정도는 만들 수 있으리라고 생각하고 대들었는데 그게 쉬운게 아니네요.


인터넷 아무리 찾아도 실마리조차 잡지 못하고 있다가 간신히 아래 소스코드를 받아 이젠 되었다 싶어서 그대로 옮겨 봤는데 안되더라구요.

소스코드를 한 문장 한 문장 따라가다 보니 인수의 형식이 틀리고
이것을 구글에서 이리 저리 찾아보니 Indy9에서 Indy10으로 넘어오면서 TStream형이 TBytes형으로 바뀐것을 알게 되었지만 이것을 어떻게 변환해야 하는지를 찾을 수가 없어 도움을 청합니다.




unit Unit1;

interface

uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer,idsockethandle,
     Gauges;

type
  TForm1 = class(TForm)
    IdUDPServer1: TIdUDPServer;
    SaveDialog1: TSaveDialog;
    Gauge1: TGauge;
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
    ABinding: TIdSocketHandle);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FileName:string;
    FileSize:integer;
    mem:tFileStream;
      { Private declarations }
  public
      { Public declarations }
  end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
     str:string;
begin
     aData.Seek(0,0);
     setLength(str,aData.size);
     aData.Read(str[1],aData.Size);
     if pos('Send File:File name:',str) > 0 then begin
          delete(str,1,length('Send File:File name:'));
          fileName:=str;
          str:='Received File ok';
          abinding.SendTo(aBinding.PeerIP,aBindIng.PeerPort,str[1],length(str));
     end
     else
     if pos('File Length:',str) > 0 then
     begin
          delete(str,1,length('File Length:'));
          FileSize:=strToIntDef(str,0);
          SaveDialog1.FileName:=fileName;
          if saveDialog1.Execute then
          begin
               FileName:=saveDialog1.FileName;
               if FileExists(filename) then deleteFile(filename);
               if mem<>nil then
               begin
                    mem.Free;
                    mem:=nil;
               end;
               if not fileExists(FileName) then
                    mem:=TFileStream.Create(FileName,sysutils.fmOpenReadWrite or fmCreate)
               else
                    mem:=TFileStream.Create(FileName,fmopenReadWrite);

               str:='get file Length ok';
               aBinding.SendTo(aBinding.PeerIP,aBinding.PeerPort,str[1],length(str));
          end
          else
          begin    //saveDialog1.execute
               str:='received File cancel';
               aBinding.SendTo(aBinding.PeerIP,aBinding.PeerPort,str[1],length(str));
          end;
     end
     else
     if pos('File Send End',str) > 0 then
     begin
          if mem<>nil then
          begin
               mem.Free;
               mem:=nil;
               str := 'Received File Successed';
               aBinding.SendTo(aBinding.PeerIP,aBinding.PeerPort,str[1],length(str));
               filename:='';
               fileSize:=0;
          end;
     end
     else
     begin
          if mem <> nil then
          begin
               mem.Seek(0,2);
               aData.Seek(0,0);
               mem.CopyFrom(aData,aData.Size);
               gauge1.Progress:=round(mem.size/fileSize*100);
               str := 'received ok';
               abinding.SendTo(aBinding.PeerIP,aBinding.PeerPort,str[1],length(str));
               application.ProcessMessages;
          end;
     end;

end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     if mem<>nil then mem.Free;
end;

end.

=====================================



unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Gauges, IdBaseComponent, IdComponent, IdUDPBase,
  IdUDPClient;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    IdUDPClient1: TIdUDPClient;
    Gauge1: TGauge;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
     receivedString : string;
     mem:tfileStream;
     posi,len : integer;
     p:array [0..1023] of byte;
begin
     if opendialog1.Execute then
     begin
          idUDPClient1.Host:=edit1.Text;
          idUDPClient1.Active:=true;
          idUDPClient1.Send('Send File:File name:'+opendialog1.FileName);
          ReceivedString:=idUDPClient1.ReceiveString;
          if uppercase(Receivedstring)=upperCase('Received File ok') then
          begin
               mem:=tfileStream.Create(opendialog1.FileName,fmOpenRead);
               try
                    posi:=0;
                    idUDPclient1.Send('File Length:'+IntToStr(mem.Size));
                    receivedString:=idUDPClient1.ReceiveString();
                    if uppercase(receivedString)=upperCase('get file Length ok') then
                    begin
                         while posi < mem.Size  do
                         begin
                              len:=1024;
                              if mem.Size < 1024 then len:=mem.Size;
                              mem.Read(p,len);
                              idUDPClient1.SendBuffer(p,len);
                              inc(posi,len);
                              gauge1.Progress:=round(posi/mem.size*100);
                              receivedString:=idUDPClient1.ReceiveString();
                              if upperCase(ReceivedString)<>upperCase('received ok') then break;
                              application.ProcessMessages;
                         end;
                         idUDPClient1.Send('File Send End');
                         if idUdpClient1.ReceiveString()='Received File Successed' then showmessage('文件成功?送');
                    end
                    else
                    Begin
                         showmessage('cancel');
                    End;
               finally
                    mem.Free;
               end;
          end;
     end;
end;

end.

+ -

관련 글 리스트
13949 이 소스를 수정해 주시면 감사하겠습니다. 김수정 1989 2011/11/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.