Einzelnen Beitrag anzeigen

Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#3

Re: "Ungültiges Fensterhandle (Code 1400)" wegen i

  Alt 28. Okt 2006, 20:47
Göttliche Eingebung!
In habe schon vor geraumer Zeit gelesen, dass Indy v10 pro Client mehr als nur einen Thread zum Empfangen von Daten verwendet (ACHTUNG: Die damaligen IdPeerThreads gibt es nicht mehr!). So stammen die Events (Hinweis: Events sind asynchron, obgleich sie eine Procedure der Mainform sind!) OnUserLogin und OnConnect aus 2 verschiedenen Threads, obwohl beide zu demselben Client gehören. Diese können also unabhängig voneinander und vom MainThread selbst aufgerufen werden.
In jedem Thread wurde diese Procedure ausgeführt:
Delphi-Quellcode:
procedure TF_Server.Log(const s: string);
begin
  LB_Log.Items.Add(s);
  SendMessage(LB_Log.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
end;
Bevor die MainForm nicht mind. einmal vor dem Benutzen dieser Procedure angezeigt wurde, verursachten die beiden Zeilen sofort oder erst beim Beenden des gesamten Programms die o.g. Fehlermeldung.
Nachdem ich die beiden Zeilen mithilfe einer eigenen Message nun wirklich im MainThread ausführen lassen, d.h. synchronisiere, funktioniert alles ohne Fehlermeldung.
Delphi-Quellcode:
procedure TF_Server.proc_WM_LOG(var Msg: TMessage);
var
  StrP: PString;
begin
  StrP := PString(Msg.WParam);
  try
    LB_Log.Items.Add(StrP^);
    SendMessage(LB_Log.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
  finally
    Dispose(StrP);
  end;
end;

procedure TF_Server.Log(const s: string);
var
  StrP: PString;
begin
  New(StrP);
  StrP^ := s;
  SendMessage(self.Handle, WM_LOG, Integer(StrP), 0); // Length(s)
end;
Wieso dieser Fehler nur dann auftritt, wenn ich die Form noch nie angezeigt habe, verstehe ich nicht so ganz. Vllt kann mir das ja noch mal jemand erklären, aber für's erste bin ich wieder glücklich

Gruß Nogge
  Mit Zitat antworten Zitat