老兄:
     谢谢!
     程序我是从delphi的例子改的,因为,只是试着写,所以比较乱,请你耐心点!
unit strmdem;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMStrm,
  ExtDlgs, StdCtrls, Psock, ExtCtrls, ComCtrls,StrUtils, Buttons, Menus,
  OleCtnrs, DB, ADODB;
Type TNodeData=^NodeData;
    NodeData=Record
        Mark:String;
        Key:String;
        ParentKey:string;
        MachIP:string;
        MachName:string;
    end;
type
  TForm1 = class(TForm)
    nmMsg: TNMStrm;
    nmsMsg: TNMStrmServ;
    StatusBar1: TStatusBar;
    OpenDialog1: TOpenDialog;
    tvwMember: TTreeView;
    Splitter1: TSplitter;
    PageControl1: TPageControl;
    tabMsg: TTabSheet;
    tabFileSend: TTabSheet;
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    redtMsgReceive: TRichEdit;
    Splitter2: TSplitter;
    Panel2: TPanel;
    sbtnMsgSend: TSpeedButton;
    mmMsgSend: TMemo;
    tabFileReceiveWord: TTabSheet;
    tabFileReceivePicture: TTabSheet;
    tabFileReceiveOther: TTabSheet;
    Image1: TImage;
    redtReceive: TRichEdit;
    nmFileWord: TNMStrm;
    nmsFileWord: TNMStrmServ;
    redtFileWordSend: TRichEdit;
    munFileWordSend: TPopupMenu;
    munFileWordSendSendFromFile: TMenuItem;
    cntNetUsers: TADOConnection;
    dtDept: TADODataSet;
    dtUsers: TADODataSet;
    munFileWordSendSend: TMenuItem;
    procedure Button1Click(Sender: TObject);
    procedure nmsMsgMSG(Sender: TComponent; const sFrom: String;
      strm: TStream);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure nmMsgMessageSent(Sender: TObject);
    procedure nmMsgConnect(Sender: TObject);
    procedure nmMsgDisconnect(Sender: TObject);
    procedure nmMsgHostResolved(Sender: TComponent);
    procedure nmMsgStatus(Sender: TComponent; Status: String);
    procedure nmMsgPacketSent(Sender: TObject);
    procedure nmMsgInvalidHost(var handled: Boolean);
    procedure nmMsgConnectionFailed(Sender: TObject);
    procedure nmsMsgClientContact(Sender: TObject);
    procedure nmsMsgStatus(Sender: TComponent; Status: String);
    procedure FormCreate(Sender: TObject);
    procedure sbtnMsgSendClick(Sender: TObject);
    procedure nmsFileWordMSG(Sender: TComponent; const sFrom: String;
      strm: TStream);
    procedure mmMsgSendKeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
    procedure munFileWordSendSendFromFileClick(Sender: TObject);
    procedure nmsFilePictureMSG(Sender: TComponent; const sFrom: String;
      strm: TStream);
    procedure tvwMemberMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure munFileWordSendSendClick(Sender: TObject);
  private
    { Private declarations }
    NodeDatas:Array of TNodeData;
    NodeCount:integer;
    NodeIndex:integer;    Function FindParentID(ParentID:String):integer;
    Function SynchronizationChild(mTreeView:TTreeView;SelNode:TTreeNode):Boolean;
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  SaveDialog:TSaveDialog;
implementationuses uSaveDlg;{$R *.DFM}
Function TForm1.SynchronizationChild(mTreeView:TTreeView;SelNode:TTreeNode):Boolean;//change child node'selected
Var
    NodeData:TNodeData;
    NextNode:TTreeNode;
    NextNodeData:TNodeData;
    Selfkey:String;
    CurrentSelected:Boolean;
    NextAgainIsChild:Boolean;
Begin
    NodeData:=SelNode.Data;
    SelfKey:=NodeData.Key;
    CurrentSelected:=SelNode.Selected;
    NextNode:=SelNode.GetNext;
    NextNodeData:=NextNode.Data;
    if NextNodeData.ParentKey =SelfKey then
            Begin
            NextNode.Selected:=CurrentSelected;
            NextAgainIsChild:=true;
            While NextAgainIsChild do
                Begin
                NextAgainIsChild:=false;
                NextNode:=NextNode.GetNext;
                if NextNode=nil then break;
                NextNodeData:=NextNode.Data;
                if NextNodeData.ParentKey =selfkey then
                    Begin
                    NextNode.Selected:=CurrentSelected;
                    NextAgainIsChild:=true;
                    end;
                end;
            end
        Else 
            Begin
            Result:=False;
            end;
end;
Function TForm1.FindParentID(ParentID:String):Integer;
Var
    i:integer;
    ParentData:TNodeData;
    ParentIndex:integer;
Begin
    parentIndex:=-1;
    For i:=0 to tvwMember.Items.Count-1 do
        Begin
        parentData:=tvwMember.Items.Item[i].Data;
        if ParentData.Key=parentID then
            Begin
            ParentIndex:=i;
            break;
            end;
        end;
    FindParentID:=ParentIndex;
end;
procedure TForm1.Button1Click(Sender: TObject);
//var
  //MyFStream: TFileStream;
  ////MyStream:TMemoryStream;
begin
  {
  If OpenDialog1.Execute then
  Begin
    NMStrm1.Host := edit2.Text;
    //NMStrm1.FromName := Edit1.Text;
    NMStrm1.FromName:=OpenDialog1.FileName;
    MyFStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
    try
      NMStrm1.PostIt(MyFStream);
    finally
      MyFStream.Free;
    end;
  end;}
end;procedure TForm1.nmsMsgMSG(Sender: TComponent; const sFrom: String;
  strm: TStream);
var
  mMsg:TStrings;
begin
  mMsg:=TStringList.Create;
  try
    redtMsgReceive.Lines.Add('^^^^^^'+sFrom+'^^^^^^');
    mMsg.LoadFromStream(strm);
    redtMsgReceive.Lines.AddStrings(mMsg);
    //redtMsgReceive.CaretPos.Y:=redtMsgReceive.Lines.Count;
  finally
    mMsg.Free;
  end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
    fsavedlg.ShowModal;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
Var
    i:integer;
begin
    For i:=0 to NodeIndex do  //High(NodeDatas)
        Dispose(NodeDatas[i]);
end;procedure TForm1.nmMsgDisconnect(Sender: TObject);
begin
  If StatusBar1 <> nil then
    StatusBar1.SimpleText := 'Disconnected';
end;procedure TForm1.nmMsgHostResolved(Sender: TComponent);
begin
  StatusBar1.SimpleText := 'Host Resolved';
end;procedure TForm1.nmMsgStatus(Sender: TComponent; Status: String);
begin
  If StatusBar1 <> nil then
    StatusBar1.SimpleText := status;
end;procedure TForm1.nmMsgPacketSent(Sender: TObject);
begin
  StatusBar1.SimpleText := IntToStr(NMMsg.BytesSent)+' of '+IntToStr(NMMsg.BytesTotal)+' sent';
end;procedure TForm1.nmMsgInvalidHost(var handled: Boolean);
var
  TmpStr: String;
begin
  If InputQuery('Invalid Host!', 'Specify a new host:', TmpStr) then
  Begin
    NMMsg.Host := TmpStr;
    Handled := TRUE;
  End;
end;procedure TForm1.nmMsgConnectionFailed(Sender: TObject);
begin
  ShowMessage('Connection Failed');
end;

解决方案 »

  1.   

    procedure TForm1.nmsMsgClientContact(Sender: TObject);
    begin
      NMSMsg.ReportLevel := Status_Basic;
      NMSMsg.TimeOut := 90000;
      StatusBar1.SimpleText := 'Client connected';
    end;procedure TForm1.nmsMsgStatus(Sender: TComponent; Status: String);
    begin
      If StatusBar1 <> nil then
        StatusBar1.SimpleText := status;
    end;procedure TForm1.FormCreate(Sender: TObject);
    Var
        sCn:String;
        sDataBaseName:String;
        sCommText:String;
    begin
        sDataBaseName:=ExtractFilePath(application.ExeName)+'NetUsers.lcw';
        sCn:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
        sCn:=sCn+sDataBaseName+';Persist Security Info=False';
        cntNetUsers.ConnectionString:=sCn;
        cntNetUsers.Connected:=true;    sCommText:='Select * from Depts Order By AppearID';
        dtDept.CommandText:=sCommText;
        dtDept.Active:=true;
        sCommText:='Select * from UserIp Order By DeptID,NodeOrder';
        dtUsers.CommandText:=sCommText;
        dtUsers.Active:=true;
        NodeCount:=dtDept.RecordCount+dtUsers.RecordCount;
    end;procedure TForm1.sbtnMsgSendClick(Sender: TObject);
    var
      MyStream: TMemoryStream;
      i:Integer;
      NodeData:TNodeData;
    Begin
        For i:=0 to tvwMember.Items.Count -1 do
            Begin
            if tvwMember.Items.Item[i].Selected then
                Begin
                NodeData:=tvwMember.Items.Item[i].Data;
                if NodeData.Mark = 'u' then
                    Begin
                    NMMsg.FromName:=edit1.Text;
                    NMMsg.Host := NodeData.MachIP;
                    MyStream:=TMemoryStream.Create;
                    mmMsgSend.Lines.SaveToStream(MyStream);
                    try
                        nmMsg.PostIt(MyStream);
                    Finally
                        MyStream.Free;
                    end;
                    end;
                end;
            end;
    end;
    procedure TForm1.nmsFileWordMSG(Sender: TComponent; const sFrom: String;
      strm: TStream);
    var
      MyFStream: TFileStream;
      NewName:String;
      ExtName:String;
    begin
        NewName:=sFrom;
      If FileExists(sFrom) then
        Begin
        ExtName:=RightStr(sFrom,4);
        NewName:=ExtractFilePath(Application.ExeName) + ExtractFileName(sFrom) +FormatDateTime('mmdd',Date)+ExtName;
        //MessageDlg('文件 '+ sFrom+ '已经存在,新到文件'+sFrom+'保存为'+NewName,mtConfirmation,[mbYes,mbNo],0);
        //fSaveDlg.ShowModal;    end;
        fSaveDlg.ShowModal;
      MyFStream := TFileStream.Create(NewName, fmCreate);
      try
        MyFStream.CopyFrom(strm, strm.size);
      finally
        MYFStream.Free;
       //m.Free;
      end;
      if (ExtName='.bmp') or (ExtName='.ico') or (extName='emf') or (extName='wmf') then
        Begin
        Image1.Picture.LoadFromFile(NewName);
        PageControl1.ActivePageIndex:=3;
        end
      else if (extName= '.rtf') or (ExtName='.txt') then
        Begin
        redtReceive.Lines.LoadFromFile(NewName);
        pageControl1.ActivePageIndex:=2;
        end
      else
        Begin
        end;
      end;procedure TForm1.mmMsgSendKeyPress(Sender: TObject; var Key: Char);
    begin
        if key=#13 then
            begin
            sbtnMsgSend.Click;
            end;
    end;procedure TForm1.FormShow(Sender: TObject);
    Var
        nNode:TTreeNode;
        ParentID,SelfID,SelfText:String;
        ParentIndex:integer;
    begin
        ShowWindow(Application.Handle, SW_HIDE);
        tvwMember.Items.Clear;
        SetLength(NodeDatas,NodeCount);
        dtDept.First;
        NodeIndex:=-1;
        While Not dtDept.Eof do
            Begin
            NodeIndex:=NodeIndex+1;
            New(NodeDatas[NodeIndex]);
            nNode:=tvwMember.Items.Add(nil,dtDept.fieldbyname('DeptName').AsString);
            NodeDatas[NodeIndex].Mark:='d';
            NodeDatas[NodeIndex].Key:=dtDept.fieldbyName('DeptID').AsString;
            nNode.Data:=NodeDatas[NodeIndex];
            dtDept.Next;
            end;
        dtUsers.First;
        While Not dtUsers.Eof do
            Begin
            ParentID:=dtUsers.fieldbyName('DeptID').AsString;
            selfID:=dtUsers.fieldbyname('UserID').AsString;
            selfText:=dtUsers.fieldbyname('UserName').AsString;
            ParentIndex:=FindParentID(ParentID);
            nNode:=tvwMember.Items.AddChild(tvwMember.Items[ParentIndex],selfText);
            NodeIndex:=NodeIndex+1;
            New(NodeDatas[nodeIndex]);
            NodeDatas[NodeIndex].Key:=dtUsers.fieldbyName('UserID').AsString;
            Nodedatas[NodeIndex].Mark:='u';
            NodeDatas[NodeIndex].MachIP:=dtUsers.fieldbyName('MachIP').AsString;
            NodeDatas[NodeIndex].MachName:=dtUsers.fieldbyname('MachName').AsString;
            NodeDatas[NodeIndex].ParentKey:=dtUsers.fieldbyName('DeptID').AsString;
            nNode.Data:=NodeDatas[NodeIndex];
            dtUsers.Next;
            end;
    end;procedure TForm1.munFileWordSendSendFromFileClick(Sender: TObject);
    Var
        MyFStream:TFileStream;
        i:integer;
        NodeData:TNodeData;
        eFileName:String;
    begin
      If OpenDialog1.Execute then
        Begin
        eFileName:=ExtractFileName(OpenDialog1.FileName);
        For i:=0 to tvwMember.Items.Count -1 do
            Begin
            if tvwMember.Items.Item[i].Selected then
                Begin
                NodeData:=tvwMember.Items.Item[i].Data;
                NMFileWord.FromName:=eFileName;
                if NodeData.Mark = 'u' then
                    Begin
                    NMFileWord.Host := NodeData.MachIP;
                    MyFStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
                    try
                        nmFileWord.PostIt(MyFStream);
                    Finally
                        MyFStream.Free;
                    end;
                    end;
                end;
            end;
        end;
    end;procedure TForm1.nmsFilePictureMSG(Sender: TComponent; const sFrom: String;
      strm: TStream);
    var
      MyFStream: TFileStream;
      NewName:String;
      ExtName:String;
      SaveDialog:TSaveDialog;
    begin
        NewName:=sFrom;
      If FileExists(sFrom) then
        Begin
        ExtName:=RightStr(sFrom,4);
        NewName:=ExtractFilePath(Application.ExeName) + ExtractFileName(sFrom) +FormatDateTime('mmdd',Date)+ExtName;
        MessageDlg('文件 '+ sFrom+ '已经存在,新到文件'+sFrom+'保存为'+NewName,mtConfirmation,[mbYes,mbNo],0);
        end;
      MyFStream := TFileStream.Create(NewName, fmCreate);
      try
        MyFStream.CopyFrom(strm, strm.size);
      finally
        MYFStream.Free;
      end;
      Image1.Picture.LoadFromFile(NewName);
      pageControl1.ActivePageIndex:=3;
    end;
    procedure TForm1.tvwMemberMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    Var
        TestHit:THitTests;
        SelNode:TTreeNode;
        i:integer;
    begin
        if ssCtrl in Shift then
            Begin
            TestHit:=tvwMember.GetHitTestInfoAt(x,y);
            if (htOnItem in TestHit) or (htOnLabel in TestHit) then
                    Begin
                    SelNode:=tvwMember.Selected;
                    SynChronizationChild(tvwMember,SelNode);
                    end
                else if (htNoWhere in TestHit) then
                    begin
                    For i:=0 to tvwMember.Items.Count -1 do
                        Begin
                        tvwMember.Items.Item[i].Selected:=false;
                        end;
                    end;
            end;end;procedure TForm1.munFileWordSendSendClick(Sender: TObject);
    Var
        MyStream:TMemoryStream;
        i:integer;
        NodeData:TNodeData;
    begin
        For i:=0 to tvwMember.Items.Count -1 do
            Begin
            if tvwMember.Items.Item[i].Selected then
                Begin
                NodeData:=tvwMember.Items.Item[i].Data;
                if NodeData.Mark = 'u' then
                    Begin
                    NMFileWord.FromName:=edit1.Text;
                    NMFileWord.Host := NodeData.MachIP;
                    MyStream:=TMemoryStream.Create;
                    redtFileWordSend.Lines.SaveToStream(MyStream);
                    try
                        nmFileWord.PostIt(MyStream);
                    Finally
                        MyStream.Free;
                    end;
                    end;
                end;
            end;end;
    end.
      

  2.   

    你把fsavedlg窗口在option中设为不自动生成fsavedlg.ShowModal;改为fsavedlg:=tfsavedlg.create(self);
    fsavedlg.ShowModal;
    试一下
      

  3.   

    你把fsavedlg窗口在option中设为不自动生成fsavedlg.ShowModal;改为fsavedlg:=tfsavedlg.create(self);
    fsavedlg.ShowModal;
    试一下
      

  4.   

    你把fsavedlg窗口在option中设为不自动生成fsavedlg.ShowModal;改为fsavedlg:=tfsavedlg.create(self);
    fsavedlg.ShowModal;
    试一下