Einzelnen Beitrag anzeigen

Darkface

Registriert seit: 18. Apr 2008
89 Beiträge
 
Delphi XE Professional
 
#1

Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms

  Alt 9. Dez 2010, 16:56
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:
    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;
Die Ausgabe einer Nachricht auf der MainForm
Delphi-Quellcode:
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;
Jemand eine Idee wo der Fehler/das Problem liegen könnte?

MfG Dark
Alexander
Ich halte Ordnung.
Zum Beispiel mein Schreibtisch: Hier ist alles zeitlich geordnet - was zuletzt kam, liegt oben. (Frank Erhoff)

Geändert von Darkface ( 9. Dez 2010 um 17:10 Uhr)
  Mit Zitat antworten Zitat