Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Invalid Windows Handle (mit sourcecode)!!! (https://www.delphipraxis.net/32837-invalid-windows-handle-mit-sourcecode.html)

alleinherrscher 28. Okt 2004 15:26


Invalid Windows Handle (mit sourcecode)!!!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, Leute! Sorry, dass ich meinen Eintrag total neu geschrieben habe, aber ich habe jetzt das eigentliche Problem entdeckt, und werde es jetzt hier kurz beschreiben!

Also:

Ich habe eine Form, von der aus eine 2 Form per Programmtext geöffnet werden soll. Öffne ich diese Form das erste mal manuell, gibt es kein problem und er öffnet die Form jedes mal wieder. Wird die form aber zum ersten mal per Programmtext geöffnet (warum weiß ich noch nicht)...bei mir also durch filestream der übertragen wird, so werden weder buttons, noch memofelder usw. geladen?!?


Will man das Programm beenden gibts die Fehler im Anhang...

Hier noch der Delphi Code:

Delphi-Quellcode:
unit Unit_Client;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ScktComp, IdTCPServer, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, WinSock, IdThreadMgr, IdThreadMgrDefault,
  ShellAPI, Buttons; //Buttons;

type
  TForm1 = class(TForm)
    Bevel1: TBevel;
    IdTCPClient1: TIdTCPClient;
    IdTCPServer1: TIdTCPServer;
    GroupBox1: TGroupBox;
    Edit1: TEdit;
    Label1: TLabel;
    IdThreadMgrDefault1: TIdThreadMgrDefault;
    SaveDialog1: TSaveDialog;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    OpenDialog1: TOpenDialog;
    Memo1: TMemo;
    Bevel2: TBevel;
    function GetIPByName(const HostName: String): String;
    function infobox(caption,untercaption:string):boolean;
    procedure connect();
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
    procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure IdTCPClient1Disconnected(Sender: TObject);

    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private

    verbunden:boolean;

    { Private-Deklarationen }
  public
    mode, message1,filename1:string;
    accept:boolean;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
    mode, message1,strm,datei: string;
  stream: TFileStream;
   streamsend:boolean;
implementation

uses Unit2, Unit3;

{$R *.DFM}

procedure TForm1.connect();
var ip:string;
begin
IdTCPServer1.Active:=False;
ip:=getipbyname(edit1.text);
if ip<>'' then memo1.lines.add('Computer '+edit1.text+' found at '+ip)
          else begin
               memo1.lines.add('Computer '+edit1.text+' is not available');
               exit;
               end;
memo1.lines.add('Trying to connect to '+edit1.text);
IdTcpclient1.Host:=ip;
Try idTcpclient1.Connect(1000)
EXCEPT
memo1.Lines.add('Not able to connect to '+edit1.text);
IDTCPServer1.Active:=True;
exit;
end;
end;

function TForm1.infobox(caption,untercaption:string):boolean;
begin
form2.Label1.caption:=caption;
form2.label2.caption:=untercaption;
form2.ShowModal; //<----- Hier gibts beim öffnen Probleme
result:=accept;
end;

function Tform1.GetIPByName(const HostName: String): String;
type
  TaPInAddr = array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  i: Integer;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  Result := '';
  phe := GetHostByName(PChar(HostName));
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  i := 0;
  while pPtr^[i] <> nil do
  begin
    Result := inet_ntoa(pptr^[i]^);
    Inc(i);
  end;
  WSACleanup;
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
memo1.lines.add('Client connected');
end;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
memo1.Lines.add('Client Disconnected');
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
var
fs:TFilestream;
begin

memo1.lines.add('Connected to '+edit1.text);
if mode='message' then begin
if message1<>'' then
memo1.lines.add('Sending message to the remote Computer');
Idtcpclient1.Writeln(message1);
idtcpclient1.Disconnect;
end;
if (mode='data') and (streamsend=False) then begin
Idtcpclient1.writeln('~fsm'+opendialog1.filename);
idtcpclient1.Disconnect;
streamsend:=true;
idtcpclient1.connect;
end;

if streamsend=True then begin
  memo1.lines.add('Trying to send File '+filename1 + ' to the remote computer');
  with IdTCPClient1 do
  begin


    fs := TFileStream.Create(filename1, fmOpenRead); //Datei in FileStream einlesen
     try
      OpenWriteBuffer; //stellt sicher, dass alle Daten versendet werden
      try
        WriteStream(fs, true, true, 0); {das 2. true ist wichtig!, da es bewirkt, dass die Größe des Streams mittels WriteInteger zuerst verschickt wird}
        CloseWriteBuffer;
      except
        CancelWriteBuffer;
        raise;
      end;
    finally
      Disconnect;
      streamsend:=False;
      fs.Free;
    end;
  end;


 end;





end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var endung,filename,dateiname,text,typ:string;
  fs: TFileStream;
  SizeOfIncomingStream: integer;

begin

if streamsend=False then begin
text:=AThread.Connection.ReadLn();
AThread.connection.disconnect;
typ:=copy(text,0,4);
if typ='~fsm' then begin
dateiname:=extractfilename(copy(text,pos('~fsm',text)+4,length(text)-4));
filename1:=dateiname;
endung:=copy(dateiname,pos('.',dateiname),length(dateiname)-pos('.',dateiname)+1);
SaveDialog1.Filter := endung + ' - Dateien|*' + endung + '|Alle Dateien (*.*)|*.*';
SaveDialog1.FileName := dateiname;
 streamsend:=True;
 exit;
end;
if form3.visible=False then
if messagedlg(text+#13#10+'Would you like to open LAN Message Center',mtConfirmation,[mbyes,mbno],0) = mrYes then
form3.Show; //<- Hier gibts Probleme (wenn sich Form3 öffnen soll, wird eine leere Form angezeigt)
if form3.Visible then form3.Memo1.Lines.Add(text);
exit;
end;

   fs := TFileStream.Create('C:\filestream.tmp', fmCreate or fmShareExclusive);
  with AThread.Connection do
    try
      SizeOfIncomingStream := ReadInteger; //Größe des Streams empfangen
      ReadStream(fs, SizeOfIncomingStream); //und übergeben
    finally
      streamsend:=False;


      Disconnect;
      fs.Free;

      end;
if infobox('Incomming File Transmission',filename1) = True then begin
if not SaveDialog1.Execute then exit;
filename:=savedialog1.filename;
copyfile(PChar('C:\filestream.tmp'),PChar(filename),false);
end;
deletefile('C:\filestream.tmp');




end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IdTCPServer1.Active := FALSE;
IdTCPServer1.Destroy;
IdTCPClient1.Destroy;
end;

procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
memo1.lines.add('Disconnected from '+edit1.text);
IDTCPServer1.Active:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
streamsend:=False;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
form3.show;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if not opendialog1.Execute then exit;
form1.mode:='data';
filename1:=opendialog1.FileName;
connect;

end;

procedure TForm1.FormShow(Sender: TObject);
begin
application.ProcessMessages;

end;

end.

Habt ihr ne Ahnung woran das liegt?

Liebe Grüße und bitte helft mir schnell ich verzweifle hier langsam,

Alleinherrscher

Kawamania 7. Nov 2004 18:34

Re: Invalid Windows Handle (mit sourcecode)!!!
 
Hi,
also ich habe das gleiche Problem und tippe inzwischen schwerstens auf ein Problem in den Indy-Tools. Bei mir ist es so, dass ich u.a. MessageDlg bei Server.Execute aufrufe und dieser Dialog wird einfach nicht eingeblendet. :|
Soweit so schlecht. Beende ich anschliessend das Programm, bekomme ich exakt den gleichen Fehler wie du auch. :P
Beende ich das Programm ohne diese Ereignis-Behandlung gebraucht zu haben, dann kommt der Fehler nicht. :?

Jetzt bin ich zumindest soweit, dass ich statt dem Delphi-Aufruf per MessageDlg Application.MessageBox verwende und schon geht es fehlerfrei. :thumb:

Schau mal hier. Könnte das in diese Richtung gehen?

cu *Uwe*


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz