![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
утечки памяти. Помогите, пожалуйста
Dy1 © (2008-07-23 14:40:00)пытаюсь уничтожить форму, а она мой дух не отпускает :(
часть кода убрал
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 (2008-08-22 06:23:00) [1]
> FastMM4 сам всё правильно сделает и заменит
> программиста :/ :)
неужели я где-то подобное мог написать? Просто если не использовать FastMM4 и FastMove то Delphi (до определенных версий) - унылое говно в плане производительности. И что такое может MemCheck (насколько я помню - тупо показывает утечки) чего не может FastMM4?
А для новых разработок .Net или Java (первый для той ниши которую занимал delphi, предпочтительнее), только обязательно хотя бы рихтера прочтите - и кроме необходимости таскать framework и простого дизассемблирования минусов вроде не замечено.
Dy1 (2008-08-21 22:48:00) [2]exero, как будто FastMM4 сам всё правильно сделает и заменит программиста :/ :)
exero (2008-08-15 21:31:00) [3]FastMM4 - наш выбор ))
Boguslaw (2008-08-15 19:10:00) [4]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 ?
MTsv DN (2008-07-24 14:04:00) [5]
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;
Dy1 (2008-07-24 13:23:00) [6]там исправил.
запускаю прогу, жму отмену. Окно исчезает, процесс висит в памяти
MTsv DN (2008-07-23 16:23:00) [7]
if msg.message = 563 Then
begin
Result := False;
->
Result := False;
if msg.message = 563 Then
begin
exero (2008-07-23 15:20:00) [8]В упор не вижу что Result := False в KOLForm1Message, для сообщений отличных от 563
Dy1 (2008-07-23 15:00:00) [9]Result := False стоИт, перед Form.Close добавлял OD.Free - глючит, лучше как есть.
У меня такое ощущение, что после вызова Form.Close создание формы продолжается дальше. Кстати Form.Destroy вообще непонятно когда вызывается, даже от фазы Луны не зависит.
exero (2008-07-23 14:54:00) [10]Перед Form.Close добавь OD.Free;
В обработчике сообщений для необрабатываемых сообщений Result := False;