Autor Beitrag
Smokers
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 29.08.07 22:44 
Also geht um folgendes :
Hab das Standardchat programm von Delphi ( aus den Demos) mal genommen und ein wenig
aufgemotzt um für die Arbeit tauglich zu machen ( wird genehmigt das Ding dann ^^ )
Nun bin ich soweit angekommen das ich aus ner Combobox den Host lese welche vorher mit den namen der Netzwerk-PCs gefüllt wird.
Ich muss zugeben ich hab mich reichlich vorgegebener Beispiele bedient, allerdings gehts soweit auch.

Nun fehlt mir jedoch folgendes Feature, es soll getestet werden ob an dem PC überhaupt mein Programm ( das Chattool) läuft, und wenn nicht soll dieser Netzwerk PC garnicht angezeigt werden.
Ist das möglich ? und wenn ja wie ? Ich weis auch ehrlich nicht gesagt wonach ich bei google suchen soll ^^°
genausowenig wie ich dann vllt noch rausfinden will wer dort gerade angemeldet ist, aber das ist danach dran.


hier der code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
unit Chatmain;

interface

uses
  Classes, Messages, SysUtils, Graphics, Controls, ShellApi,
  Dialogs, Forms, Windows, QControls, QStdCtrls, QExtCtrls, QButtons,
  QForms, Sockets, QMenus, QTypes;


type
  TForm1 = class(TForm)
    memRecv: TMemo;
    Panel1: TPanel;
    memSend: TMemo;
    Panel2: TPanel;
    btnSend: TButton;
    TcpClient1: TTcpClient;
    TcpServer1: TTcpServer;
    Panel3: TPanel;
    Label1: TLabel;
    edtRemoteHost: TEdit;
    combohide: TComboBox;
    btnhide: TButton;
    Label2: TLabel;
    ComboBox1: TComboBox;
    procedure btnSendClick(Sender: TObject);
    procedure TcpServer1Accept(sender: TObject;
      ClientSocket: TCustomIpClient);
    procedure btnActivateServerClick(Sender: TObject);
    procedure memSendKeyPress(Sender: TObject; var Key: Char);

  private
    { Private declarations }
  public
    { Public declarations }

  end;

  // you must create your own thread to synch
  // writing to a gui component
  TClientDataThread = class(TThread)
  private
  public
    ListBuffer :TStringList;
    TargetList :TStrings;
    procedure synchAddDataToControl;
    constructor Create(CreateSuspended: Boolean);
    procedure Execute; override;
    procedure Terminate;
  end;

var
  Form1: TForm1;
  //DataThread: TClientDataThread;

implementation

{$R *.xfm}
//start netcheck()

type 
  PNetResourceArray = ^TNetResourceArray; 
  TNetResourceArray = array[0..100of TNetResource; 
Function CreateNetResourceList(ResourceType: DWord; 
                               NetResource: PNetResource;
                               out Entries: DWord; 
                               out List: PNetResourceArray): Boolean; 
var EnumHandle: THandle; 
    BufSize: DWord; 
    Res: DWord; 
begin 
Result := False; 
List := Nil;
Entries := 0
if WNetOpenEnum(RESOURCE_GLOBALNET, ResourceType,0,NetResource,EnumHandle) =  
NO_ERROR 
then begin 
     try 
      BufSize := $4000;   // 16 kByte 
      GetMem(List, BufSize); 
      try
        repeat
          Entries := DWord(-1); 
          FillChar(List^, BufSize, 0); 
          Res := WNetEnumResource(EnumHandle, Entries, List, BufSize); 
          if Res = ERROR_MORE_DATA 
          then begin 
               ReAllocMem(List, BufSize); 
               end;
        until Res <> ERROR_MORE_DATA; 
        Result := Res = NO_ERROR; 
        if not Result 
        then begin 
             FreeMem(List); 
             List := Nil
             Entries := 0
             end;
      except 
        FreeMem(List); 
        raise
      end
    finally 
      WNetCloseEnum(EnumHandle); 
    end;
  end
end

procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List:  
TStrings); 

procedure ScanLevel(NetResource: PNetResource);
var 
  Entries: DWord; 
  NetResourceList: PNetResourceArray; 
  i: Integer; 
begin 
  if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList)
then try 
    for i := 0 to Integer(Entries) - 1 do begin 
      if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or 
         (NetResourceList[i].dwDisplayType = DisplayType) then begin 
        List.AddObject(NetResourceList[i].lpRemoteName,
                       Pointer(NetResourceList[i].dwDisplayType)); 
      end
      if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then 
        ScanLevel(@NetResourceList[i]); 
    end;
  finally 
    FreeMem(NetResourceList); 
  end
end;

begin 
  ScanLevel(Nil);
end



//endnetcheck()

//------------- TClientDataThread impl -----------------------------------------
constructor TClientDataThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate := true;
  ListBuffer := TStringList.Create;
end;

procedure TClientDataThread.Terminate;
begin
  ListBuffer.Free;
  inherited;
end;

procedure TClientDataThread.Execute;
begin
  Synchronize(synchAddDataToControl);
end;

procedure TClientDataThread.synchAddDataToControl;
begin
 TargetList.AddStrings(ListBuffer);
end;
//------------- end TClientDataThread impl -------------------------------------


procedure TForm1.btnActivateServerClick(Sender: TObject);
var LB : TStringList;
begin
  TcpServer1.LocalPort := '5705' ;
  TcpServer1.Active := True;

//start netcheck()

  LB:= TStringList.Create;
  ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, LB);

  ComboBox1.Items.BeginUpdate;
  ComboBox1.Items.Assign(lb);
  ComboBox1.Items.EndUpdate;

  LB.Free;

//end netcheck ()

end;

procedure TForm1.btnSendClick(Sender: TObject);
var
  I: Integer;
  host:string;
begin
if memsend.Text <> '' then
  begin
  host := combobox1.Text;
    while Pos('\', host) > 0 do
    host[Pos('\', host)] := #0;

    TcpClient1.RemoteHost := host;
    TcpClient1.RemotePort := '5705';
    showmessage(combobox1.Text);
    try
      if TcpClient1.Connect then
        for I := 0 to memSend.Lines.Count - 1 do
        TcpClient1.Sendln(memSend.Lines[I]);
    finally
      TcpClient1.Disconnect;
    end;
    //by Smokers start
    memrecv.Text := memrecv.text + #13+#10 + 'Du sagtest: ' +#13+#10+ memsend.Text;
    memsend.Clear;
    memsend.SetFocus;
  end;
end;

procedure TForm1.TcpServer1Accept(sender: TObject;
  ClientSocket: TCustomIpClient);
var
  s: string;
  DataThread: TClientDataThread;
begin
  // create thread
  DataThread:= TClientDataThread.Create(true);
  // set the TagetList to the gui list that you
  // with to synch with.
  DataThread.TargetList := memRecv.lines;

  // Load the Threads ListBuffer
  DataThread.ListBuffer.Add('__ "'+ClientSocket.LookupHostName(ClientSocket.RemoteHost) + '" schreibt: __');
  s := ClientSocket.Receiveln;
  while s <> '' do
  begin
    DataThread.ListBuffer.Add(s);
    s := ClientSocket.Receiveln;
  end;


  // Call Resume which will execute and synch the
  // ListBuffer with the TargetList
  DataThread.Resume;

end;

procedure TForm1.memSendKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
  begin
    btnsend.Click;
    key:= #0;

  end;

end;

end.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 29.08.07 23:05 
Möglichkeit 1: UDP-Broadcast
Wenn nach einer gewissen Zeit auf diesen Broadcast keine Antwort kam, läuft das Programm vermutlich nicht.

Möglichkeit 2: TCP-Connect auf gefundene Rechner
Einfach probieren zu connecten. Wenn's nicht geht, gab's nen Fehler
NACHTEIL: IST LANGWIERIG, wenn keine Rechner dein Programm gestartet haben!!!!!!!!

Für Hinweise, wie sowas implementiert werden kann, siehe Narses' Netzwerk-Tuts.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.