Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#1

TForm innerhalb eines TThread-Objektes

  Alt 15. Okt 2007, 19:43
Vorwort:
Dies ist nur ein Testprogramm, in welchem man zur Laufzeit mehrere Threads erstellen kann. Diese Threads unterhalten sich dann mittels TCP/IP. Ich wollte das nur einmal ausprobieren. Das Problem befindet sich in keinem Projekt was jetzt irgendwie gelöst werden muss. Deswegen will ich das Problem auch nicht umgehen, sondern einfach nur wissen: Warum bzw. wo hängts?

Problem:
Damit die Threads sich nicht sinnlos unterhalten gibt es zu jedem Thread eine kleine Eingabemaske über ein Formular (ein paar Buttons, 2 Edits, 1 Label, 1 Memo und 1 Shape).
Das sieht dann in der ExecuteMethode so aus (Das Formular wird also direkt im Thread erstellt):
Delphi-Quellcode:
begin
  handle:=allocatehwnd(wndproc); //Windowhandle um Messages aus dem Socket und von der Clientform zu sammeln
  Clientform:=TClientform.Create(nil);
  Clientform.owner:=handle; //damit die clientform mir auch sagen kann, was sie grad macht
  Clientform.Caption:=clientform.Caption+' #'+inttostr(nummer);
  aktshape; //füllt das Shape auf dem Formular clientform mit rot
  Clientform.Show;
  ClientSocket:=0; //winsock.TSocket
  run; //beinhaltet ausschließlich die Messageschleife (getmessage + translatemessage + dispatchmessage) incl. der Abfrage nach terminated
  clientform.Close;
  clientform.Free;
  deallocatehwnd(handle);
end;
Die Clientform habe ich über die IDE und mit dem OI usw. usf. erstellt. Also ganz normal über "Neues Formular" und die Komponenten schön da drauf platziert.

Das Formular unterhält sich auch nur mit dem Thread. (Und unter den Projekt-Optionen wird es natürlich als nicht "automatsich erzeugen" eingestellt) Es hat also mit dem MainThread nix zu tun.

Auftrentender "Fehler":
Das Programm funktioniert hervorragend, also alles was ich testen wollte klappt. Aber: Die Komponenten auf dem Formular, die ich so schön platziert habe, sind alle ca. 1,5 mal so groß und wurden auch entsprechend verschoben. Also alle Größen (left,top,widht,height) sind etwa um den Faktor 1,5 größer. Da interessiert mich nur das Warum? Ich weis ja, dass VCL-Komponenten und Threads sich beißen. Aber dass die das so machen?
Es kommt kein Fehler und keine Exception. InternalReadComponentRes tut doch nur kurz in den Ressourcen lesen und baut dafür eigens einen Stream auf. Da dürfte doch nix passieren.

Vielleicht liegts auch an meinem Delphi. Hab die Formulare aber schonmal testweise komplett neu gemacht. Und wenn ich das Formular im MainThread initialisiere, sieht auch alles richtig aus.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat