Конференция "KOL" » утечки памяти. Помогите, пожалуйста
 
  • Dy1 (23.07.08 14:40) [0]
    пытаюсь уничтожить форму, а она мой дух не отпускает :(
    часть кода убрал
    procedure TForm1.KOLForm1FormCreate(Sender: PObj);
    var Mouse: TMouseEventData;
    begin
    LoadIni;
    DFind( TV.TVInsert( TV.TVRoot, 0, ExcludeTrailingPathDelimiter(PathStalk)), PathStalk);
    end;

    procedure TForm1.LoadIni;
    var
    ini: PIniFile;
    OD: POpenDirDialog;
    x: integer;
    begin
    if FileExists(GetStartDir + 'settings.ini') Then
    и т.п.

    if not DirectoryExists( PathStalk + '\gamedata\sounds\')then
    begin
      OD := NewOpenDirDialog('', [odEditBox, odNewDialogStyle]);
      OD.InitialPath := 'C:\';
      Repeat
        if OD.Execute Then
          PathStalk := OD.Path
        Else
        begin
          Form.Close; // как правильно в этот момент закрыть программу?
        end;
      Until DirectoryExists( PathStalk + '\gamedata\sounds\');
      OD.Free;
    end;
    end;

    function TForm1.KOLForm1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
    var
    Filename: array [0..259] of char;
    Count, i, n: Cardinal;
    fname, STpath: string;
    Mouse: TMouseEventData;
    begin
    if msg.message = 563 Then
    begin
      Result := False;
      Count := DragQueryFile( msg.WParam, $FFFFFFFF, Filename, SizeOf(Filename));

      for i := 0 to Count - 1 do
      begin
        DragQueryFile( msg.WParam, i, Filename, SizeOf(Filename));
        fname := ExtractFileName(string(Filename));
        if LV.LVIndexOf(fname) >= 0 Then // если найдено
        begin
          STpath := IncludeTrailingPathDelimiter(TV.TVItemPath(TV.TVSelected, '\'));
          n := 0;
          While LV.LVIndexOf(fname + '.bak' + int2str(n) ) >= 0 Do
            n := n + 1;
          CopyMoveFiles( STpath + fname, STpath + fname + '.bak' + int2str(n), True);
          CopyMoveFiles( string(Filename), STpath + fname, False);
        end;
      end;
      DragFinish(Msg.WParam);
      Result := True;
    end;
    end;

  • exero © (23.07.08 14:54) [1]
    Перед Form.Close добавь OD.Free;
    В обработчике сообщений для необрабатываемых сообщений Result := False;
  • Dy1 (23.07.08 15:00) [2]
    Result := False стоИт, перед Form.Close добавлял OD.Free - глючит, лучше как есть.
    У меня такое ощущение, что после вызова Form.Close создание формы продолжается дальше. Кстати Form.Destroy вообще непонятно когда вызывается, даже от фазы Луны не зависит.
  • exero © (23.07.08 15:20) [3]
    В упор не вижу что Result := False в KOLForm1Message, для сообщений отличных от 563
  • MTsv DN (23.07.08 16:23) [4]
    if msg.message = 563 Then
    begin
     Result := False;


    ->
    Result := False;
    if msg.message = 563 Then
    begin

  • Dy1 (24.07.08 13:23) [5]
    там исправил.
    запускаю прогу, жму отмену. Окно исчезает, процесс висит в памяти
  • MTsv DN (24.07.08 14:04) [6]
    if not DirectoryExists( PathStalk + '\gamedata\sounds\')then
    begin
     OD := NewOpenDirDialog('', [odEditBox, odNewDialogStyle]);
     OD.InitialPath := 'C:\';
     Repeat
       if OD.Execute Then
         PathStalk := OD.Path
       Else
       begin
         Form.Close; // как правильно в этот момент закрыть программу?
       end;
     Until DirectoryExists( PathStalk + '\gamedata\sounds\');
     OD.Free;
    end;
    end;


    Странно, я мож че не понимаю, а при чем тут KOL. Элементарно неправильный код...

    Варианты:
    1.
    Form.Close; // как правильно в этот момент закрыть программу


    ->
    OD.Free;
    Form.Close;
    exit;


    2.
    Form.Close; // как правильно в этот момент закрыть программу


    ->
    OD.Free;
    SendMessage(Form.Handle, WM_CLOSE, 0, 0);
    exit;


    3.
    Form.Close; // как правильно в этот момент закрыть программу


    ->
    OD.Free;
    halt;

  • Boguslaw (15.08.08 19:10) [7]
    Maybe someone is willing to help me convert MemCheck to KOL ? I have a compilable version but it seems to not working as should. Vladimir ?
  • exero (15.08.08 21:31) [8]
    FastMM4 - наш выбор ))
  • Dy1 (21.08.08 22:48) [9]
    exero, как будто FastMM4 сам всё правильно сделает и заменит программиста :/ :)
  • exero (22.08.08 06:23) [10]

    > FastMM4 сам всё правильно сделает и заменит
    > программиста :/ :)

    неужели я где-то подобное мог написать? Просто если не использовать FastMM4 и FastMove то Delphi (до определенных версий) - унылое говно в плане производительности. И что такое может MemCheck (насколько я помню - тупо показывает утечки) чего не может FastMM4?
    А для новых разработок .Net или Java (первый для той ниши которую занимал delphi, предпочтительнее), только обязательно хотя бы рихтера прочтите - и кроме необходимости таскать framework и простого дизассемблирования минусов вроде не замечено.
 
Конференция "KOL" » утечки памяти. Помогите, пожалуйста
Есть новые Нет новых   [134432   +18][b:0][p:0.002]