![]() |
Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms
Hiho DP'ler,
Ich bin gerade etwas ratlos und hoffe ihr habt eine Idee zur Lösung meines Problems :). Ich habe ein kleines IRC Client Programm per Indy TidIRC geschrieben. Es hat eine (Main)Form, dort wird die Verbindung aufgebaut und ein kleines Status Fenster zeigt an wie der Connection-Status ist. Nun soll für jeden Channel dem ich beitrete ein weiteres Fenster aufgehen. Auf diese dynamisch zur Laufzeit erstellen Forms haue ich noch je ein Panel und ein Memo drauf. Später will ich dann jede Nachricht die ankommt dem richtigen Fenster zuweisen und in dessen Memo ausgeben. Doch schon davor gibt es ein Problem. Bisher werden nur die Fenster+Panel+Memo erstellt, die Nachrichten die ankommen werden noch im "Main-Form-Memo" ausgegeben. Sobald die Fenster erstellt sind friert das Programm ein. Wenn ich zum Beispiel eines der Fenster verschieben möchte passiert nichts. Sobald jedoch eine Nachricht hereinkommt und ausgegeben wird werden alle Bewegungen vollzogen, danach friert wieder alles ein bis zur nächsten Nachricht. Wie kann ich das verhindern und ein verschieben der Forms sofort vollziehen? TidAntiFreeze macht seinem Namen nicht alle Ehre und bringt hier nichts. Ein wenig Code...: Das hier steht in einer Schleife, die dynamische Erstellung der benötigten Fenster.
Delphi-Quellcode:
Die Ausgabe einer Nachricht auf der MainForm
setlength(Forms,length(Forms)+1);
Forms[length(Forms)-1]:=TForm.Create(self); with Forms[length(Forms)-1] do begin ClientWidth:=Form1.ClientWidth; ClientHeight:=Form1.ClientHeight; Color:=clGreen; Caption:='Immer wieder Sonntags...'; Visible:=True; Show; end; setlength(Panels,length(Panels)+1); Panels[length(Panels)-1]:=TPanel.Create(Forms[length(Forms)-1]); with Panels[length(Panels)-1] do begin Width:=Forms[length(Forms)-1].ClientWidth; Height:=Forms[length(Forms)-1].ClientHeight; Color:=clGreen; Enabled:=True; Visible:=True; Parent:=Forms[length(Forms)-1]; end; setlength(Memos,length(Memos)+1); Memos[length(Memos)-1]:=TMemo.Create(Panels[length(Panels)-1]); with Memos[length(Memos)-1] do begin Width:=Forms[length(Forms)-1].ClientWidth; Height:=Forms[length(Forms)-1].ClientHeight; Color:=clGreen; Visible:=True; Parent:=Panels[length(Panels)-1]; end;
Delphi-Quellcode:
Jemand eine Idee wo der Fehler/das Problem liegen könnte?
procedure TForm1.PrivMsg(ASender: TIdContext; const ANicknameFrom, AHost, ANicknameTo, AMessage: string);
var Nickname, Nachricht:string; begin Application.ProcessMessages; Nickname:=ANicknameFrom; delete(Nickname,1,1); //Nickname von LEERZEICHEN befreien Nachricht:=copy(MsgText,2,pos(' :',MsgText)-1); //MsgText wird in TForm1.ReciveRaw befüllt delete(MsgText,1,pos(' :',MsgText)+1); //und bearbeitet Ausgabe.Lines.Add(ANicknameTo +' / '+Nickname +': ' +MsgText); //Ausgabe ist ein TMemo end; MfG Dark |
AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms
Alle Indy Komponenten arbeiten im Blocking-Modus. Solange sie auf eine Message warten, ist die Anwendung gerne mal blockiert. Schaue Dir doch mal TIdAntiFreeze an oder verlege die Indy-Komponenten in einen eigenen Thread.
|
AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms
Zitat:
|
AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms
Zitat:
Zitat:
|
AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms
Hi,
Zitat:
Hast Du schonmal bei Deinem Antifreeze die Eigenschaft ApplicationHasPriority=true und OnlyWhenIdle=false gesetzt ? Die definitiv bessere Variante ist wie schon weiter oben vorgeschlagen die Kommunikation des Clients in einen Thread auszulagern. Greetz Data |
AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms
Hi,
Parent ist m.M. nicht gesetzt. Nach dem Erstellen einer Komponente muß die ja irgendwo eingehängt werden. Parent.Panel = kreierte Form, Parent der Form = MainForm. |
AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms
Zitat:
Zitat:
|
AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms
Tja ich musste gerade feststellen das es an den dynamischen Forms liegt :(. Hau ich die Raus läuft das Programm freeze-frei - egal ob ich IdIRC auslager oder nicht. Sobald ich die Forms erstelle gehts steil bergab. Wie kann ich das lösen? Die Forms in einen eigenen Thread hauen geht wohl angeblich nicht weil die VCL nicht Threadsafe ist (hab ich gelesen). Kann das jemand bestätigen?
EDIT: Mit neuen zur Designzeit erstellten Forms freezt es leider genauso. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 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