Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Try...Except besser verwenden? (https://www.delphipraxis.net/140093-try-except-besser-verwenden.html)

Paul0703 11. Sep 2009 16:36


Try...Except besser verwenden?
 
Hallo!
Ich habe folgendes Problem:
Ich rufe Werte aus einem Quelltext einer Internetseite ab und verwende diese dann weiter.
Wenn aber kein Zugriff auf das Internet möglich ist,also wenn die Werte leer sind, dann stürzt das Programm ab.

Es geht um folgende Procedure:
Delphi-Quellcode:
procedure TForm1.ThreadedTimer1Timer(Sender: TObject);
var HTMLCode: String;
    TextMessage: TArrayOfString;
    User: TArrayOfString;
    Time: TArrayOfString;
    NameColor: TArrayOfString;
    i: Integer;
    R: Integer;
    G: Integer;
    B: Integer;
    ShortTime: String;
    UserNameColor: TColor;
begin
  Try
    HTMLCode := idHTTP1.Get('http://forum.quicklink.me/chat.php');
    FindInString(HTMLCode, 'class="content" style="min-height: 0px;">', '</div>', False, TextMessage);
    FindInString(HTMLCode, 'class="username-coloured">', '</a></dt>', False, User);
    FindInString(HTMLCode, 'margin: 0px !important;">', '</p>', False, Time);
    FindInString(HTMLCode, '" style="color: ', ';"', False, NameColor);
    LockwindowUpdate(jvRichedit1.Handle);
    Try
      jvRichEdit1.Clear;
      for i := 0 to 9 do
      begin
        If not Form2.CheckBox2.Checked then ShortTime := Copy(Time[i], 17, 7);
        R := StrToInt('$' + Copy(NameColor[i], 2, 2));
        G := StrToInt('$' + Copy(NameColor[i], 4, 2));
        B := StrToInt('$' + Copy(NameColor[i], 6, 2));
        UserNameColor := RGB2TColor(R, G, B);
        If (jvRichEdit1.Color = clblack) and (R = $00) and (G = $00) and (B = $00) then UserNameColor := clwhite;
        If not Form2.CheckBox2.Checked then jvRichEdit1.AddFormatText(User[i] + ' (' + ShortTime + ')' + #13#10, [fsbold, fsUnderline], 'Comic Sans MS', UserNameColor, -12);
        If Form2.CheckBox2.Checked then jvRichEdit1.AddFormatText(User[i] + ' (' + Time[i] + ')' + #13#10, [fsbold], 'Comic Sans MS', UserNameColor, -12);
        If jvRichEdit1.Color = clblack then jvRichEdit1.AddFormatText(UTF8ToAnsi(TextMessage[i]) + #13#10, [], 'Comic Sans MS', clsilver);
        If jvRichEdit1.Color = clwhite then jvRichEdit1.AddFormatText(UTF8ToAnsi(TextMessage[i]) + #13#10, [], 'Comic Sans MS', clblack);
        //Form1.jvRichEdit1.Lines[i] := StringReplace(Form1.jvRichEdit1.Lines[i],' ','BBBBBBBBBBB',[rfreplaceall]);
      end;
    Finally
      LockWindowUpdate(0);
      //Form1.jvRichEdit1.Text := StringReplace(Form1.jvRichEdit1.Text,'a','BBBBBBBBBBB',[rfreplaceall]);
    end;
    If not (CompareString = jvRichEdit1.Lines[0]) then
    if Length(CompareString) > 0 then SoundTime := SoundTime + 1;
    CompareString := jvRichEdit1.Lines[0];
    If SoundTime = StrToInt(Form2.Edit4.Text) then
    begin
      If Form2.RadioButton1.Checked then CoolTrayIcon1.ShowBalloonHint('Q-Chat', 'Neue Nachrichten empfangen!', bitInfo, 10);
      If Form2.RadioButton2.Checked then beep;
      SoundTime := 0;
    end;
  Except
    ShowErrorMessage;
    Form1.Close;
  end;
    TestStatus;
end;
Wenn die Werte die am Anfang abgerufen werden, nicht vefügbar sind, dann stürzt das Programm ab.
Außerdem verursacht dieser Code ein Speicherleck.
Ich denke, ich habe den Code auch falsch aufgebaut mit Try...Execpet, aber ich weiß auch nicht, wie ich das besser machen kann.

Ich hoffe, ihr könnt mir da helfen :)

Namenloser 11. Sep 2009 16:59

Re: Try...Except besser verwenden?
 
Alles was ein Speicherleck auslösen könnte, wird von einem Try-Finally-Block umgeben. Vor dem Try werden die Objekte erzeugt und in Finally freigegeben. Wenn zwischendrin ein Objekt erzeugt wird, baust du an dieser Stelle einen weiteren Try-Finally-Block ein. Für die Fehlerbehandlung kannst du die Blöcke verschachteln, also einen Try-Except-Block in einen Try-Finally-Block einfügen.

SirThornberry 11. Sep 2009 16:59

Re: Try...Except besser verwenden?
 
Mir fällt als erstes auf das du bei betreten des Timerevents den Timer nicht ausschaltest. Zumindest beim normalen Timer kann es dadurch passieren das die Timerprocedure erneut aufgerufen wird bevor sie fertig abgearbeitet wurde. Und in diesem Fall wird versucht "globale" TIdHttp nochmals verwenden obwohl es vielleicht gerade dabei ist Arbeit zu verrichten.

himitsu 11. Sep 2009 17:03

Re: Try...Except besser verwenden?
 
Typen für Speicherlecks kann ich hier eigentlich nicht finden, da bei Strings und dynamischen Arrays eigentlich Delphi für's aufräumen sorgt.
Ich würde da erstmal das Speicherleck in den anderen Funktionen/Klassen sehen, welche hier aufgerufen werden.

Was das "dann stürzt das Programm ab" angeht.
Trenne die Internetverbindung und gehe diesen Code im Einzelschritt durch und schau wo er abstürtzt.

Paul0703 11. Sep 2009 17:54

Re: Try...Except besser verwenden?
 
Danke für die vielen Antworten!
Ich habe jetzt mal am Anfang der TimerProcedure den Timer ausgeschlaltet und am Ende wieder an. Jetzt stürzt das Programm zwar nicht ab, aber es kommt auch keine Fehlermeldung, also es passiert gar nichts :gruebel:

Und FastMM hat jetzt folgende Meldung gebracht, als ich es über die IDE gestartet habe(nur dann) und der prozess blieb jedes Mal offen.

---------------------------
Project1.exe: Memory Leak Detected
---------------------------
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):



21 - 28 bytes: TCriticalSection x 1



Note: To obtain a log file containing detail on memory leaks, enable the "FullDebugMode" and "LogMemoryLeakDetailToFile" conditional defines. To disable this memory leak check, undefine "EnableMemoryLeakReporting".


---------------------------
OK
---------------------------

Wenn ich den Timer abstelle, geht alles, dann ist auch das leck weg, nur brauche ich ja den Timer und alles was er ausführt :angel2:
Vielleicht könnt ihr nochmal erklären, wie ich das verschachteln kann :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.

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