Конференция "KOL" » Закрытие формы\контролов [Delphi, Windows]
 
  • QAZ (18.09.14 15:05) [0]
    почему реализовано так
    procedure TControl.Close;
    begin
     PostMessage( Handle, WM_CLOSE, 0, 0 );
    end;


    а не вот так
    procedure TControl.Close;
    begin
     SendMessage( Handle, WM_CLOSE, 0, 0 );
    end;


    ???
    это же полигонище для ошибок
  • Rouse__ (18.09.14 17:58) [1]
    Какого плана ошибок?
  • L`Autour (19.09.14 06:11) [2]
    Видимо:
    Когда в Control есть обращение к ресурсу, который в программе уничтожается  после Control.Close. Но при этом может оказаться так, что это произойдет раньше, чем дойдет очередь до WM_CLOSE для Control. Следовательно  есть вероятность обращения Control к несуществующему ресурсу.
  • Rouse_ © (19.09.14 17:44) [3]

    > L`Autour   (19.09.14 06:11) [2]

    Как-то сумбурно.

    Попробуем по шагам:
    1. Control.Close
    2. SomeObject.Free
    х1. работаем с SomeObject
    3. Process WM_CLOSE - (Control - разрушен)

    и

    1. Control.Close
    х2. работаем с SomeObject
    2. Process WM_CLOSE - (Control - разрушен)
    3. SomeObject.Free

    где может произойти доступ к SomeObject, в пункте "Х1"?
  • QAZ (19.09.14 20:08) [4]

    > Rouse_ ©   (19.09.14 17:44) [3]

    уже и в коле пытаешься экспертничать?

    все просто, берем 2 формы (напомню КОЛ), где в Онклозе высвобождаются всяки бяки
    в Онклозе главной вызываем клозе второй ииииии та уничтожается без вызова Онклозе

    кроме того существует простая логика, если вызвал функцию - значит действие должно выполниться до следующей строки, а не встать в очередь
  • Rouse_ © (19.09.14 20:34) [5]

    > уже и в коле пытаешься экспертничать?

    Влад - даже не собираюсь, я просто пытаюсь уточнить логику возникновения ошибки. Пока что оба варианта обьяснения меня не впечатлили, а значит либо я что-то недопонимаю либо ... :)
  • QAZ (19.09.14 20:43) [6]

    > Rouse_ ©   (19.09.14 20:34) [5]

    а логики нет, есть ошибка, именно как я описал, замена form2.form.close на SendMessage( form2.form.Handle, WM_CLOSE, 0, 0 ) проблему решает
    но скрытый геморроидальный потенциал от использования PostMessage остается огромным и что главное, необъяснимым для тех людей кто не проверяет библиотечные исходники
    кароч КОЛ<>VCL

    если спросишь точней откуда у меня рук растет, может распишу
  • Rouse_ © (19.09.14 20:54) [7]
    Проще просто выложить демоприложение, демонстрирующее ошибку :)
    Биологическое происхождение конечностей, пожалуй стоит опустить :)
  • QAZ (20.09.14 13:27) [8]
    ну зацени :)
    https://yadi.sk/d/dBlq-gJabZwqT
    думаю все понятно и наглядно
  • QAZ (20.09.14 13:45) [9]
    https://yadi.sk/d/hRUQjbu5bZxRT
    "фастмм" чет странный какой-то, под делфей палит утечку, а на живую в винде нет, наверно сам за собой убирает
  • NoUser © (20.09.14 19:45) [10]
    QAZ, a почему реализовано так:

    procedure TForm2.KOLForm1FormCreate(Sender: PObj);
    begin
     Writeln('Form2Create');
     bmp:=NewDIBBitmap(2000,2000,pf24bit);  
    end;

    procedure TForm2.KOLForm1Close(Sender: PObj; var Accept: Boolean);
    begin
     Writeln('Form2Close');
     bmp.Free;                   // ???
    end;

    procedure TForm2.KOLForm1Destroy(Sender: PObj);
    begin
     Writeln('Form2Destroy');
    end;



    а не вот так

    procedure TForm2.KOLForm1FormCreate(Sender: PObj);
    begin
     Writeln('Form2Create');
     bmp:=NewDIBBitmap(2000,2000,pf24bit);
    end;

    procedure TForm2.KOLForm1Show(Sender: PObj);
    begin
     Writeln('Form2Show');
    end;

    procedure TForm2.KOLForm1Close(Sender: PObj; var Accept: Boolean);
    begin
     Writeln('Form2Close');
    end;

    procedure TForm2.KOLForm1Destroy(Sender: PObj);
    begin
     bmp.Free;                 //!!!
     Writeln('Form2Destroy');
    end;



    ???
    это же полигонище для ошибок! ;)
  • Rouse_ © (20.09.14 20:09) [11]

    > думаю все понятно и наглядно

    Ой-ёй :)
    А это уже культура программирования :)
    Выстрелить в ногу можно гораздо проще ;)
  • QAZ (20.09.14 20:32) [12]

    > NoUser ©   (20.09.14 19:45) [10]

    че за бред ты несешь?

    > Rouse_ ©   (20.09.14 20:09) [11]

    при чем тут культура-мультура ?
    делай что написано и смотри в консоли что происходит
  • Rouse_ © (20.09.14 20:44) [13]

    > делай что написано и смотри в консоли что происходит

    Влад - не кипятись.
    Ты вклинился в порядок очереди и по сути принудительно вызвал обработчик закрытия второй формы.

    1 вариант:
    Form2Create
    Form1Close
    Form1Destroy
    Form2Destroy



    и второй:
    Form2Create
    Form1Close
    Form2Close <<< !!!!
    Form1Destroy
    Form2Destroy



    что есть нарушение концепции (слегка) но причин возникновения ошибок пока что не вижу :)
  • Rouse_ © (20.09.14 20:46) [14]
    ЗЫ: попробую навести на мысль - закрытие формы не всегда означает заее разрушения и технически мы в любой момент можем сделать Show закрытому экземпляру формы, нес-па?.
  • QAZ (20.09.14 21:21) [15]

    > Влад - не кипятись.Ты вклинился в порядок очереди и по сути
    > принудительно вызвал обработчик закрытия второй формы.

    да я не влад :)
    и никуда не вклинивался :)
    и почему я не могу закрыть форму програмно ?

    > ЗЫ: попробую навести на мысль - закрытие формы не всегда
    > означает заее разрушения и технически мы в любой момент
    > можем сделать Show закрытому экземпляру формы, нес-па?.

    на мысли наводить ненад, есть простая концепция если окно закрывается, значит оно должно сдохнуть полностью освободив все что с ним связано, а не скрыться
  • Rouse_ © (20.09.14 22:21) [16]

    > да я не влад :)

    Ой пардон, у меня почему-то данный ник, за Владом Ошиным закрепился.
    Дико извиняюсь :)


    > есть простая концепция если окно закрывается, значит оно
    > должно сдохнуть полностью освободив все что с ним связано

    Это неправильная концепция :)
    Вот смотри, дельфи приложение при старте может создавать кучу форм, прямо из DPR, но видно то изначально будет только главная форма :)
    О чем это говорит?
    О том что, ты конечно можешь контролировать время формы как ты хочешь, но не нужно смешивать понятия закрытия формы с вызовом ее деструктора :)
  • NoUser © (21.09.14 11:26) [17]
    QAZ   (20.09.14 20:32) [12]
    >> NoUser ©   (20.09.14 19:45) [10]
    >че за бред ты несешь?


    Rouse_ ©   (20.09.14 22:21) [16]
    >... не нужно смешивать понятия закрытия формы с вызовом ее деструктора
  • QAZ (21.09.14 12:08) [18]

    > О том что, ты конечно можешь контролировать время формы
    > как ты хочешь, но не нужно смешивать понятия закрытия формы
    > с вызовом ее деструктора :)

    вот опять, ниразу не юзал КОЛ, а все пишешь ВКЛьные советики
    если ты глубже попользуешься моей шедевральной демкой, то поймешь что дестрой всех форм происходит только при закрытии всей программы
    если же принудительно делать уничтожение в коде, то начнется такая гемороидальная шиза с которой сам автор КОЛА решил несвязываться, раз при закрытии окна в системе уничтожаются, а сам объект формы остается существовать
    об это собственно была моя соседняя тема
    поэтому реально без гемора можно использовать только онклоз как событие уничтожения, а чтоб его коректно получать и нужен SendMessage а не PostMessage
 
Конференция "KOL" » Закрытие формы\контролов [Delphi, Windows]
Есть новые Нет новых   [118420   +47][b:0][p:0.002]