Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.06.21;
Скачать: [xml.tar.bz2];

Вниз

вопрос по CloseQuery   Найти похожие ветки 

 
Stan   (2009-04-09 01:11) [0]

Я что -то не пойму..
вот для примера сделал простенький проект для теста.
Есть две формы, Form1 и Form2 . В Form2 создаю событие OnCloseQuery и пишу там сообщение ShowMessage("Close Form2").
Т.е. И та и другая форма создаются в autocreate.

Далее запускаю проект, - вижу только Form1, как и должно быть,  и выхожу из сесии Windows - Logoff.  И вылетает Close Form2", т.е. срабатывает OnCloseQuery второй формы.
Так и должно быть?
D 2009


 
Германн ©   (2009-04-09 01:17) [1]


> Так и должно быть?

Да.


 
ZeroDivide ©   (2009-04-09 01:20) [2]

А что смущает?


 
Eraser ©   (2009-04-09 01:29) [3]

> [0] Stan   (09.04.09 01:11)

вообще OnCloseQuery весьма запутанное событие. я бы использовал простой OnClose, а для закрытия сеанса напрямую бы перехватывал сообщение.


 
Stan   (2009-04-09 01:30) [4]

Смущает то, что Form2 ни разу не открывался.
При закрытии программы, OnCloseQuery этой формы не отрабатывает. А при LogOff или рестарте отрабатывает.. Проверил с 5 формами, то же самое, перечисляются все невидимые формы, и вызывается OnCloseQuery  у каждой... при обычном закрытии, все ок..
разве так должно быть?


 
Кто б сомневался ©   (2009-04-09 01:31) [5]

Хм, вот специально подождал что бы кто-то ответил. И так и получилось - верять блин разработчикам, это же компания!

Капец, честно говоря неожидал такого бага от CodeGear.
Нет, такого быть не должно!!
Вообще какой идиот мог допустить подобное...
Сейчас буду у себя проверять в программах это...

По вашему, Герман, при закрытии программы, должны срабатывать всех OnCloseQuery невидимых форм? Слушайте, учиться учиться и еще раз туда же.
Кстати, при закрытии программы, OnCloseQuery невидимых форм не срабатывает, как и положено, а вот при LogOff или рестарте,  вызывается OnCloseQuery всех невидимых форм (создал несколько форм, ни одна из них ни разу не открывалась, но OnCloseQuery отработал). Т.е. если там стоит - "Вы действительно хотите закрыть эту форму" - то это будет ад для юзеров кликать...
Здец.. У меня уже ком. проекты запущены два месяца...


 
Германн ©   (2009-04-09 01:40) [6]


> Кто б сомневался ©   (09.04.09 01:31) [5]
>
> Хм, вот специально подождал что бы кто-то ответил. И так
> и получилось - верять блин разработчикам, это же компания!
>
>
> Капец, честно говоря неожидал такого бага от CodeGear.
> Нет, такого быть не должно!!
> Вообще какой идиот мог допустить подобное...
> Сейчас буду у себя проверять в программах это...
>
> По вашему, Герман, при закрытии программы, должны срабатывать
> всех OnCloseQuery невидимых форм? Слушайте, учиться учиться
> и еще раз туда же.
> Кстати, при закрытии программы, OnCloseQuery невидимых форм
> не срабатывает, как и положено, а вот при LogOff или рестарте,
>   вызывается OnCloseQuery всех невидимых форм (создал несколько
> форм, ни одна из них ни разу не открывалась, но OnCloseQuery
> отработал). Т.е. если там стоит - "Вы действительно хотите
> закрыть эту форму" - то это будет ад для юзеров кликать.
> ..
> Здец.. У меня уже ком. проекты запущены два месяца...

А что есть "невидимые формы"?


 
Кто б сомневался ©   (2009-04-09 01:41) [7]


> А что есть "невидимые формы"?


Ну елки-палки, это формы которые были созданы (в том же автоcreate), но не были показаны юзеру по ShowModal или Show итп.


 
Кто б сомневался ©   (2009-04-09 01:48) [8]

Блин.
Проверяю..
AV поймал в logoff,  cудя по стэку madexcept - как раз в форме которая еще не отображалась, в WM_QUERYENDSESSION >> OnCloseQuery. Оно.  
Пойду ругаться в саппорт..  >:|

P.s. Stan ты не постил еще это баг?


 
Германн ©   (2009-04-09 01:53) [9]


> Кто б сомневался ©   (09.04.09 01:41) [7]
>
>
> > А что есть "невидимые формы"?
>
>
> Ну елки-палки, это формы которые были созданы (в том же
> автоcreate), но не были показаны юзеру по ShowModal или
> Show итп.

А "окна" этих форм были созданы?
А не эти ли окна получают сообщение WM_CLOSE?


 
Кто б сомневался ©   (2009-04-09 01:58) [10]


> Германн ©   (09.04.09 01:53) [9]


Короче, вот шаги:
создаю проект.
Создаю еще 3 формы. т.е. получается всего 4 с главной.

В трех последних формах, я пишу OnCloseQuery и вставляю туда ShowMessage("Закрываем").
Компилирую, запускаю из Windows, делаю Logoff или restart - возбужаются события во всех 3 формах подряд. Если закрыть прогу, такого не происходит.  

как они тестировали?
Да и я тоже как тестировал.... Но я ж не думал..


 
Игорь Шевченко ©   (2009-04-09 02:00) [11]


> Я что -то не пойму..
> вот для примера сделал простенький проект для теста.
> Есть две формы, Form1 и Form2 . В Form2 создаю событие OnCloseQuery
> и пишу там сообщение ShowMessage("Close Form2").
> Т.е. И та и другая форма создаются в autocreate.
>
> Далее запускаю проект, - вижу только Form1, как и должно
> быть,  и выхожу из сесии Windows - Logoff.  И вылетает Close
> Form2", т.е. срабатывает OnCloseQuery второй формы.
> Так и должно быть?


Да, так и должно быть

Читать forms.pas до полного и окончательного просветления:

procedure TCustomForm.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
 Message.Result := Integer(CloseQuery);
end;

(D2006)


 
Кто б сомневался ©   (2009-04-09 02:05) [12]


> Игорь Шевченко ©   (09.04.09 02:00) [11]


Для чего?
и почему только на QueryEndSession, а не на закрытие программы?
И почему для невидимых форм?... И я что то этого в справке не вижу..


 
Кто б сомневался ©   (2009-04-09 02:07) [13]


> И почему для невидимых форм?


Для всех причем.
А ведь обычно туда вставляют - "Вы действительно хотите закрыть итп".
А ведь это не mdi формы.. Для них это еще понятно..


 
Eraser ©   (2009-04-09 02:07) [14]

> [12] Кто б сомневался ©   (09.04.09 02:05)

потому что WM_QUERYENDSESSION рассылается всем окнам верхнего уровня.


 
Кто б сомневался ©   (2009-04-09 02:08) [15]

Просто ответьте на вопрос.
Почему только на QueryEndSession, а не на закрытие программы?


 
Кто б сомневался ©   (2009-04-09 02:09) [16]


> Eraser ©   (09.04.09 02:07) [14]


Да не в тех. плане . Это и так понятно.


 
Eraser ©   (2009-04-09 02:11) [17]

> [16] Кто б сомневался ©   (09.04.09 02:09)

а что тут можно сказать не в тех. плане? так задумано. могу лишь повторить [3].


 
Кто б сомневался ©   (2009-04-09 02:13) [18]


> а что тут можно сказать не в тех. плане? так задумано. могу
> лишь повторить [3].


Ага, еще скажи что это фича..
Побольше б таких "фич" - тогда совсем станет весело..


 
Игорь Шевченко ©   (2009-04-09 02:23) [19]

Я советую немножко изучить как работает операционная система, под которую вы пишете программы. Для облегчения этого процесса есть специальный сайт http://msdn.microsoft.com

В этом случае будет проще избегать непонятных ситуаций, подобных сабжевой.

Да и вообще кругозор расширять весьма полезное занятие


 
Игорь Шевченко ©   (2009-04-09 02:25) [20]


> Для чего?


Для того, чтобы иметь возможность сохранить данные (событие OnCloseQuery преимущественно для этого предназначено)


 
Кто б сомневался ©   (2009-04-09 02:27) [21]


> Для того, чтобы иметь возможность сохранить данные


Ага, во всех формах, даже в тех, которые еще даже не показывались и есть не-ви-ди-мы-е...
Вдумайтесь в последнее слово, потом говорите.


 
Игорь Шевченко ©   (2009-04-09 02:33) [22]

Я тебе простой пример приведу

.dpr

program AutoCreate;

uses
 Forms,
 main in "main.pas" {Form1},
 f2 in "f2.pas" {Form2};

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.CreateForm(TForm2, Form2);
 Application.Run;
end.


main

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation
uses
 f2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 form2.Close;
end;

end.


f2

unit f2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm2 = class(TForm)
   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 ShowMessage("Form2Close");
end;

end.


> Вдумайтесь в последнее слово, потом говорите.


У меня есть привычка - я обычно думаю, когда говорю.
Но если тебе эта привычка кажется странной, то я процитирую справку по Delphi:

"You can use an OnCloseQuery event handler to ask users if they are sure they really want the form closed immediately. For example, you can use the handler to display a message box that prompts the user to save a file before closing the form."


 
Игорь Шевченко ©   (2009-04-09 02:37) [23]

"В последнее время наметилась одна тенденция. Дело в том, что сейчас для того, чтобы выйти на рынок программных средств и занять в нём свою нишу, фирма, а, соответственно, и программисты должны делать продукт как можно быстрее. При этом, естественно, достаточно часто вопросы эффективности, быстродействия, минимизации размера используемой памяти и тому подобные во внимание просто не принимаются. Зачем, дескать, думать о таких «мелочах», если современные компьютеры достаточно мощные и «переваривают» почти любые объёмы. Подумаешь, мегабайт памяти туда, мегабайт сюда… Кроме того, очень сильное влияние на квалификацию программистов оказывают многочисленные средства быстрой разработки, бурное развитие которых наблюдается в последнее время. Средства, предназначенные для повышения производительности труда квалифицированных программистов, заняли на рынке совершенно другое место. Достаточно часто эти средства используются программистами низкой квалификации для того, чтобы в кратчайшее время создать работающую программу, прикладывая при этом минимум усилий. Более того, средства быстрой разработки позволяют программисту скрыть недостаток квалификации, ибо вся черновая работа делается без участия программиста. Вместо того, чтобы овладеть необходимым для профессиональной деятельности минимумом, можно недостаток квалификации скрыть посредством использования программы, которая всё сделает сама. Таким образом, средства быстрой разработки используются превратились в средства создания неэффективных программ неквалифицированными программистами. Что поделаешь, рынок диктует свои условия…

Соответственно, такой подход приводит к тому, что достаточно часто у программистов появляется завышенная самооценка. Раз я могу «накропать» программу за неделю, значит, я – ВЕЛИКИЙ ПРОГРАММИСТ, всё умею, всё могу. Зачем мне чему-то учиться, я (при помощи конкретного средства) всегда сделаю то, что хочу! Появилось даже расхожее определение – «программист, пишущий мышкой»… Но стоит у подобных, с позволения сказать, программистов, забрать средство быстрой разработки, как они становятся беспомощными. Ведь они являются программистами на конкретном средстве! Другими словами, они являются ПОЛЬЗОВАТЕЛЯМИ конкретного средства… А пользователи и программисты – это совершенно различные классы людей, использующих компьютер в своей профессиональной деятельности. И если пользователю необходимо знать только порядок использования и взаимодействие частей одной или нескольких программ (WinWord, бухгалтерская или банковская программы, программа обработки изображений и так далее), то программист помимо всего прочего должен, почти обязан понимать то, как функционирует компьютер, на основе каких принципов построена операционная система, понимать принципы организации данных и быть в состоянии написать эффективную программу, решающую поставленную перед программистом задачу. В том случае, если программист является профессионалом, то использование средств быстрой разработки только поможет ему, позволив сократить время, необходимое для разработки программы, и минимизировать усилия, необходимые для разработки таковой. "

(c) Павел Румянцев
http://www.techbook.ru/rumyantsev.html


 
Кто б сомневался ©   (2009-04-09 02:49) [24]

Послушайте, не надо меня за дурочка считать.
По меркам Windows - это сообщение передается всем окнам верхнего уровня..
Но VCL должна отрабатывать этот вариант, и проверять видимо ли окно или нет. Т.к. по меркам VCL если форма Close, то она может быть и скрыта (Hidden) (те самые варианты caHidenn, caFree итд).
А что здесь получается?
А то, что при закрытии программы, OnCloseQuery не отрабатывает для скрытых форм, а вот при Logoff и рестарте отрабатывает (форма даже еще не показывалась, данные еще даже не инициализировались, а уже просят OnCloseQuery - тут я кстати получил AV, и я думаю не один я, хотя  прекрасно знал как работает QUERYENDSESSION).
что самое интересное OnClose не отрабатывает при скрытой форме никак, втч и при LogOff. Что есть корректно.
Там просто забыли проверить видимо ли окно или нет, именно для QUERYENDSESSION.
Все я не собираюсь спорить над такой очевидной вещью.
С точки зрения API - отсылки сообщения окнам, здесь все ок, с точки зрения постобработки этого сообщения формой VCL - здесь баг. точка.


 
Игорь Шевченко ©   (2009-04-09 03:02) [25]

Кто б сомневался ©   (09.04.09 02:49) [24]


> А то, что при закрытии программы, OnCloseQuery не отрабатывает
> для скрытых форм


Потому что им не приходит сообщение WM_CLOSE и для них не вызывается метод Close.

А WM_QUERYENDSESSION посылается всем окнам верхнего уровня, независимо от наличия у окна в стилях WS_VISIBLE - ну так система устроена, это надо знать и не удивляться срабатыванию события CloseQuery.

в Borland все сделали верно - они не знают, были ли выполнены конкретно в настоящий момент невидимой формой какие-то действия до того момента, как она стала невидимой, требующие уведомления о событии EndSession и честно вызывают это уведомление.


 
Кто б сомневался ©   (2009-04-09 03:04) [26]

Посмотрел в KOL MCK - там все логично и правильно (там OnClose совмещен с OnCloseQuery - т.е. . в OnClose можно указать CanClose (Accept)), даже комментарий есть:

Called before closing the window. It is possible to set Accept        parameter to False to prevent closing the window. This event events     is not called when windows session is finishing (to handle this     event, handle WM_QUERYENDSESSION message, or assign OnQueryEndSession    event to another or the same event handler)

Т.е. KOL как обертка API корректно обрабатывает сообщение.
А вот VCL как обертка, не корректно.


 
Кто б сомневался ©   (2009-04-09 03:06) [27]


> Игорь Шевченко ©   (09.04.09 03:02) [25]


Елки палки, да не надо мне рассказывать технические детали.
Должна быть пост обработка самой обертки (VCL) для логичной работы на уровне форм, а не окон.


 
Игорь Шевченко ©   (2009-04-09 03:15) [28]

Кто б сомневался ©   (09.04.09 03:06) [27]


> Должна быть пост обработка самой обертки (VCL) для логичной
> работы на уровне форм, а не окон.


На уровне форм тоже все логично сделано.


> Called before closing the window. It is possible to set
> Accept        parameter to False to prevent closing the
> window. This event events     is not called when windows
> session is finishing (to handle this     event, handle WM_QUERYENDSESSION
> message, or assign OnQueryEndSession    event to another
> or the same event handler)


У KOL немножко меньше пользователей, чем у VCL, соответственно, меньше и репортов о проблемах, меньше и реакции.
Впрочем, это не единственный недостаток этой библиотеки.

тут важно другое - в VCL есть много свойств, обусловленных ее кодом и дизайном - их просто надо понимать и воспринимать такими, как есть, в случае использования VCL. В обработке сообщения WM_QUERYENDSESSION дизайн совершенно логичен, мне бы, как пользователю, не понравилось бы тихое закрытие окна при завершении сеанса, особенно если я в нем что-то успел сделать. Вводить в VCL возможность отслеживать "а было ли что-то сделано (в частности, была бы форма хотя бы раз показана) и стоит ли выдавать сообщение" - это настолько неуклюже, что даже не обсуждается.


 
Кто б сомневался ©   (2009-04-09 03:24) [29]


> В обработке сообщения WM_QUERYENDSESSION дизайн совершенно
> логичен, мне бы, как пользователю, не понравилось бы тихое
> закрытие окна при завершении сеанса, особенно если я в нем
> что-то успел сделать.
>


Вы что прикидываетесь что-ли?!

Вот например как у меня получилось после моей проверки - на второй форме при закрытии отображается диалог, "сохранить профайл?" в OnCloseQuery. На третей форме - у меня храняться настройки, там также переспрашивается "сохранить?"  Итак я запускаю программу, но не открываю вторую форму и третью, в которой создается профайл и отображаются настройки. Юзеру просто нужно быстро запустить программу по делу.
А теперь он делает LogOff - и что получает, а получает 2 диалога, которые спрашивате у юзера "сохранить профайл?" -а юзер в непонятках конечно. А потом вдруг получает - "сохранить настроки?" . А если бы я бы проверял что то, непроинициализированное, то получил бы AV - это еще лучше.

Итого, юзер получает два вопроса с форм, которые он не запускал, и которые по логике не должны вообще рыпаться, и на которых ничего не изменялось, - т.к. формы не были отображены, а также высокую вероятность AV.


> У KOL немножко меньше пользователей, чем у VCL, соответственно,
>  меньше и репортов о проблемах, меньше и реакции.


Да-да, и комментарий написали тоже случайно, не подумавши..


 
Кто б сомневался ©   (2009-04-09 03:27) [30]

Все, перечитывайте еще раз [27] особенно вторую часть предложения.
Я пойду спать.
И сделайте для себя разницу между окнами и формами, не с тех. точки зрения, а с логической точки зрения VCL.


 
Eraser ©   (2009-04-09 03:33) [31]

> [30] Кто б сомневался ©   (09.04.09 03:27)

еще в делфи можно обращаться к private членам другого класса, объявленного в том же модуле, так что ж теперь хоронить её что ли? ))


 
Кто б сомневался ©   (2009-04-09 03:34) [32]


> еще в делфи можно обращаться к private членам другого класса,
>  объявленного в том же модуле, так что ж теперь хоронить
> её что ли? ))


Можно и не обращаться - strict private. Как видите исправились, косвенно признав этот ньюанс..


 
sniknik ©   (2009-04-09 09:57) [33]

> Вот например как у меня получилось после моей проверки - на второй форме при закрытии отображается диалог, "сохранить профайл?"
> в OnCloseQuery. На третей форме - у меня храняться настройки, там также переспрашивается "сохранить?
у меня тоже так делается... в смысле диалогов о сохранении.

> А теперь он делает LogOff - и что получает, а получает 2 диалога
не получает, если он ничего не менял в данных формы т.е. настройках/профайле, т.к. условие показа диалога на закрытии у меня еще включает изменение контента формы...
т.е. даже если он открыл настройки, посмотрел не трогая их, и закрыл форму диалога не будет (как и во всех нормальных программах (проверь ворд/паинт/любую профессиональную)). не говоря о том чтобы когда ее даже не показывали (также если предварительно нажал "сохранить").
у меня либо по онченж  взводится флаг необходимости (при сохранении/отмене сбрасывается), либо просто сравниваются используемые значения настроек в переменных с меняемыми в контролах.
обычно у меня даже кнопка сохранения задизейблена если нет изменений для сохранения.
и уж кстати, обычно я не рассчитываю на автосоздание (там у меня минимум, датамодули и основная форма) остальное создается по требованию. но даже если их автосоздать все то ни одного диалога не будет.

> Итого, юзер получает два вопроса с форм, которые он не запускал
не получает. если делать нормально.


 
Игорь Шевченко ©   (2009-04-09 10:55) [34]


> И сделайте для себя разницу между окнами и формами, не с
> тех. точки зрения, а с логической точки зрения VCL


С логической точки зрения делает пользователь. И если пользователь вставил обработчик события OnCloseQuery, значит, подразумевал его вызов. Вот он и вызвался. А в тех формах, где пользователь не предусмотрел обработчика события OnCloseQuery, он не вызывался.
Все логично.

Представь себе ситуацию, ты открыл много приложений, в том числе и на delphi, и что-то в них делал. Потом тебе пришло критическое обновление от Microsoft, установилось и попросило перезагрузку.
Все приложения начали закрываться по завершению сеанса.

Неужели приложения на delphi должны тихо умереть, дав возможность пользователю потерять несохраненные данные ?
На мой взгляд, не должны, на взгляд Borland тоже.


 
Anatoly Podgoretsky ©   (2009-04-09 11:50) [35]

> Кто б сомневался  (09.04.2009 2:08:15)  [15]

Потому что это сообщение Виндоус, а не Дельфи и оно действительно посылается всем окнам верхнего уровня.
Иначе странно бы было, как что закрыть или запретить закрытие Виндоус.
А то что программист не отреагировал на эту ситуацию и выдал подобный запрос плохо говорит об его квалификации, это же не запрос на сохранение файлов.


 
Anatoly Podgoretsky ©   (2009-04-09 11:52) [36]

> Кто б сомневался  (09.04.2009 2:13:18)  [18]

Слушай, а ты почему работаешь в Виндоус?


 
Anatoly Podgoretsky ©   (2009-04-09 12:09) [37]

> Кто б сомневался  (09.04.2009 3:34:32)  [32]

Ничего не признали, немного расширили да, но для признания должно быть всегда strict private и без ключевого слова, а как мы видим этого нет.


 
Кто б сомневался ©   (2009-04-09 13:28) [38]

to Игорь Шевченко и Anatoly Podgoretsky

Вчера запостил этот баг уже и он уже в статусе Open.
Вы понимаете что это? Это не Reported как обычно, и не Pending.
Это значит его сразу открыли, и уже работают над ним.


 
Кто б сомневался ©   (2009-04-09 13:31) [39]


> Потому что это сообщение Виндоус, а не Дельфи и оно действительно
> посылается всем окнам верхнего уровня.
> Иначе странно бы было, как что закрыть или запретить закрытие
> Виндоус.


Мне надоело уже повторять очевидные вещи. OnCloseQuery должна получать видимая форма по очевидным и логичным причинам, - я их описал выше. Это баг, т.к. в саппорте его даже в очередь не поставили, а сразу открыли.


 
Кто б сомневался ©   (2009-04-09 13:37) [40]


> А то что программист не отреагировал на эту ситуацию и выдал
> подобный запрос плохо говорит об его квалификации, это же
> не запрос на сохранение файлов.


По меркам VCL скрытая форма- это уже закрытая форма (caHidden).
Какие могут быть события перед закрытием - OnCloseQuery если форма уже закрыта?


 
Игорь Шевченко ©   (2009-04-09 13:48) [41]

Кто б сомневался ©   (09.04.09 13:31) [39]


> OnCloseQuery должна получать видимая форма по очевидным
> и логичным причинам


Ты ошибаешься. VCL не знает, что происходило в форме до момента прихода сообщения WM_QUERYENDSESSION и возлагает принятие решения о необходимых действиях на программиста, пишущего обработчик события OnCloseQuery.


 
Кто б сомневался ©   (2009-04-09 15:08) [42]


> Ты ошибаешься. VCL не знает, что происходило в форме до
> момента прихода сообщения WM_QUERYENDSESSION и возлагает
> принятие решения о необходимых действиях на программиста,
>  пишущего обработчик события OnCloseQuery.


Это ты ошибаешся, и причем не хочешь признавать ошибку, чтобы казаться правым (ну я же гуру).
VCL и не должна знать что происходило на форме, она должна проверять видимая ли форма или нет (т.к.  [40]). Программист, который писал тот код просто забыл (не учел) это сделать.


 
Кто б сомневался ©   (2009-04-09 15:10) [43]

Смысла уже спорить я не вижу, т.к. баг уже открыт и признан саппортом (иначе он был бы Reported или Closed или Pending).


 
Игорь Шевченко ©   (2009-04-09 15:15) [44]


> Это ты ошибаешся


Я не ошибаюсь. Я бы сделал точно также, как сделано в VCL, почему - я уже писал, не вижу смысла повторяться. Невидимая и закрытая форма - это две разные вещи, проще понять эту простую истину и не спорить


> По меркам VCL скрытая форма- это уже закрытая форма (caHidden).


Это неверное утверждение


 
Cobalt ©   (2009-04-09 15:24) [45]


> Кто б сомневался ©   (09.04.09 03:24) [29]


Для того, чтобы спрашивать пользователя о сохранении изменений, эти изменения должны случиться.
Обычно для этого используется один или несколько флагов, которые взводятся при изменении данных на форме пользователем


 
Кто б сомневался ©   (2009-04-09 15:25) [46]


> Я бы сделал точно также, как сделано в VCL, почему - я уже
> писал, не вижу смысла повторяться


Ага, потому что на уровне API рассылается сообщение окнам. хороший аргумент. VCL это не API. Формы это не окна - у них своя логика, которая в данном случае нарушается.
Короче [43]


 
Anatoly Podgoretsky ©   (2009-04-09 15:28) [47]

> Кто б сомневался  (09.04.2009 13:37:40)  [40]

Hidden переводится как невидимая, но никак не закрытая.


 
Игорь Шевченко ©   (2009-04-09 15:28) [48]


> Формы это не окна - у них своя логика, которая в данном
> случае нарушается.


Не вижу какой-то "своей логики" у форм VCL при обработке оконных сообщений.

Если ты полагаешь, что невидимая форма не должна обрабатывать оконных сообщений, то ты глубоко ошибаешься.


 
Кто б сомневался ©   (2009-04-09 15:48) [49]


> Не вижу какой-то "своей логики" у форм VCL при обработке
> оконных сообщений.


Нарушение логики форм 1:
OnCloseQuery должен срабатывает перед OnClose  - я переведу:

Событие ЗапросНаЗакрытие формы должен срабатывать перед событием ПриЗакрытии формы.

Если OnCloseQuery произошел, должен произойти OnClose. чего не происходит в данном случае.


Нарушение логики форм 2:
Help:

> You can use an OnCloseQuery event handler to ask users if
> they are sure they really want the form closed immediately.
>  For example, you can use the handler to display a message
> box that prompts the user to save a file before closing
> the form.


Т.е. если форма видима, и юзер нажал кнопочку, мы решаем, следует ли закрывать (скрывать) форму или нет. Здесь же формы невидима (скрыта) - поэтому все что там делалось на форме, сделано или еще не делалось. Это не надо переводить? Данные которые вводились на форму уже были введены или еще не вводились, т.к. форма не показывалась.

Нарушение логики форм 3:
Если OnCloseQuery на невидимых окнах возбуждается при LogOff (те. при закрытии программы ),  то это должно и происходить при простом закрытии программы. чего не происходит.


 
Кто б сомневался ©   (2009-04-09 15:55) [50]

Нарушение логики форм 4:

При вызове метода Close - форма по умолчанию скрывается.
переведу:
При вызове метода ЗакрытьФорму, форма по умолчанию скрывается.

при вызове ЗапросНаЗакрытие форма уже закрыта (скрыта по идиологии VCL).


 
AndreyV ©   (2009-04-09 15:59) [51]

> [23] Игорь Шевченко ©   (09.04.09 02:37)

На каждый свой пук - писать гневные письма в саппорт, о выявленных багах.:)


 
MsGuns ©   (2009-04-09 17:43) [52]

>Кто б сомневался ©   (09.04.09 13:31) [39]
>OnCloseQuery должна получать видимая форма

Да ? А что делать с многодокументным интерфейсом (например вордом) в случае когда открыто n документов (каждый в "своей" форме) и в каждое внесено изменение, но видна в момент закрытия приложения только одна ?
Капец всем изменениям ?


 
Кто б сомневался ©   (2009-04-13 15:57) [53]


> Да ? А что делать с многодокументным интерфейсом
> но видна в момент закрытия приложения только одна ?


Прежде чем писать подобные речи, следовало бы прочитать пару веток этой темы.
Там черным по русскому написано:
OnCloseQuery НЕ срабатывает при закрытии программы, если форма не видима. Он срабатывает только при LogOff.

кстати, MDI - это уже другая история, которая работает корректно.
Или вы собрались делать ворд без MDI?


 
Игорь Шевченко ©   (2009-04-13 16:32) [54]


> Или вы собрались делать ворд без MDI?


а нефиг делать


 
Eraser ©   (2009-04-13 16:42) [55]

> [53] Кто б сомневался ©   (13.04.09 15:57)

ну криво сделано что поделать то, никто ж не заставляет насильно использовать это событие и не запрещает вручную обрабатывать сообщения.


 
Игорь Шевченко ©   (2009-04-13 17:06) [56]

Eraser ©   (13.04.09 16:42) [55]

А почему криво ? :) Когда при перезагрузке тебя Notepad спрашивает, сохранить ли данные, это тоже криво ? Пусть данные пропадают ?


 
Eraser ©   (2009-04-13 17:14) [57]

> [56] Игорь Шевченко ©   (13.04.09 17:06)


> [53] Кто б сомневался ©   (13.04.09 15:57)


> OnCloseQuery НЕ срабатывает при закрытии программы, если
> форма не видима. Он срабатывает только при LogOff.

в этом кривость. Кто б сомневался не првый новичок, кто наступает на грабли с OnCloseQuery. сплошь и рядом такое.
все таки думаю надо было им сделать отдельное понятное событие OnQueryEndSession (в т.ч. добавить такое же событие для Application), заодно и доп. флаги, передаваемые в WM_QUERYENDSESSION можно было бы предоставлять. А отменить штатное закрытие формы или вывести запрос можно и в OnClose.


 
Игорь Шевченко ©   (2009-04-13 17:19) [58]

Eraser ©   (13.04.09 17:14) [57]


>
> > OnCloseQuery НЕ срабатывает при закрытии программы, если
>
> > форма не видима. Он срабатывает только при LogOff.


А это ерунда


 
Игорь Шевченко ©   (2009-04-13 17:26) [59]

Eraser ©   (13.04.09 17:14) [57]

В дополнение к [58] - OnCloseQuery не срабатывает даже при закрытии программы, если форма видима.

Собстна, код:

main.pas

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Button4: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation
uses
 f2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 form2.Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 PostMessage(Form2.Handle, WM_CLOSE, 0, 0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 Form2.Show;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 Form2.Hide;
end;

end.


f2.pas

unit f2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm2 = class(TForm)
   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 ShowMessage("Form2Close");
end;

end.


.dpr

program AutoCreate;

uses
 Forms,
 main in "main.pas" {Form1},
 f2 in "f2.pas" {Form2};

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.CreateForm(TForm2, Form2);
 Application.Run;
end.


Можешь понажимать на кнопки и убедиться сам.


 
Eraser ©   (2009-04-13 17:48) [60]

> [59] Игорь Шевченко ©   (13.04.09 17:26)


> OnCloseQuery не срабатывает даже при закрытии программы,
> если форма видима.

так о том то и речь, хотя я думал, что если уж видима - то сработает, хотя каюсь сам не проверил. в вашем примере срабатывало при нажатии на кнопки 1, 2 (не зависимо от того видима форма или нет!) и при закрытии 2 формы вручную.
но это еще усугубляет ситуацию. помню лет 9 назад, когда, как раз, занимался батонокидательством не мог понять логики работы OnCloseQuery, то срабатывает, то не срабатывает. о том, что существуют какие-то там сообщения вообще только подозревал. тяжело это для не окрепших умов новичков (да и, как оказалось, не новичков тоже)).

тем более непонятна такая архитектура, если учесть, что все это было придумано во времена 9х, когда с пом. OnCloseQuery можно было легко заблокировать систему так, что помогал только ресет. а если добавить такую программку в автозапуск, можно было достичь интересных эффектов ;-)
именно от не пониманя того, что OnCloseQuery может заблокировать не только закрытие программы, но и завершение работы ОС, до сих пор попадается софт, который сильно тормозит завершение работы системы.


 
Игорь Шевченко ©   (2009-04-13 18:04) [61]

Eraser ©   (13.04.09 17:48) [60]

Собственно, событие срабатывает согласно VCL - если выполняется метод Close для немодальной формы, если выполняется метод CloseModal для модальной формы и если происходит завершение сеанса пользователя, цель одна - дать возможность перехватить момент и отменить закрытие формы/завершение сеанса пользователя.

Иначе пришлось бы вводить событие OnQueryEndSession, что по всей вероятности посчитали излишним.

Кстати, с каким-то компонентами была проблема, то ли с Indy какой-то версии, то ли еще с какими - они обрабатывали это сообщение и запрещали завершение сеанса.


> но это еще усугубляет ситуацию. помню лет 9 назад, когда,
>  как раз, занимался батонокидательством не мог понять логики
> работы OnCloseQuery, то срабатывает, то не срабатывает.
> о том, что существуют какие-то там сообщения вообще только
> подозревал. тяжело это для не окрепших умов новичков (да
> и, как оказалось, не новичков тоже)).


Странно, не испытывал проблем


 
Eraser ©   (2009-04-13 18:39) [62]

> [61] Игорь Шевченко ©   (13.04.09 18:04)


> цель одна - дать возможность перехватить момент и отменить
> закрытие формы/завершение сеанса пользователя.

цель то понятна, но без изучения исходников VCL наступить на грабли с OnCloseQuery проще простого. как-то оно не очень дружественно к пользователям выглядит. в справке тоже почти ничего.
у меня вот в Д2009 все описание события выглядит так
Occurs when close is attempted.
есть еще описание TCloseQueryEvent
TCloseQueryEvent is used for event handlers that are called when a window is about to close.


 
Игорь Шевченко ©   (2009-04-13 18:46) [63]


> цель то понятна, но без изучения исходников VCL наступить
> на грабли с OnCloseQuery проще простого


А собственно, в чем состоят грабли ? VCL рассчитана, что пользователь знает, когда вызывается обработчик (как написано в справке, при попытке закрытия формы)и что он, пользователь, сам определит, нужно ли закрывать форму на основе логики работы своего приложения. А если пользователь будет писать обработчик, как в примере в этой ветке, он получит то, что получает - определит моменты вызова обработчика :)

Граблей не вижу в упор


> как-то оно не очень дружественно к пользователям выглядит


какой ужас


 
Eraser ©   (2009-04-13 19:07) [64]

> [63] Игорь Шевченко ©   (13.04.09 18:46)


> А собственно, в чем состоят грабли ? VCL рассчитана, что
> пользователь знает, когда вызывается обработчик (как написано
> в справке, при попытке закрытия формы)и что он, пользователь,
> сам определит, нужно ли закрывать форму на основе логики
> работы своего приложения. А если пользователь будет писать
> обработчик, как в примере в этой ветке, он получит то, что
> получает - определит моменты вызова обработчика :)

так то оно так, только непонятно, почему обработчик не вызывается при закрытии приложения (кстати, даже если форма2 видима). у меня в 95% случаев формы создаются/уничтожаются динамически или же в них не требуется интерактивное взаимодействие с пользователем при закрытии. но зато именно новички (те кто не использует динамическое создание форм, т.к. не знает как) часто наступают на эти грабли. поэтому масса многоформенных программок тех же студентов грешит багами при закрытии, а еще чаще, при завершении работы системы. я за то, чтобы для обработки завершения работы системы использовать отдельное событие, а не мешать мух с котлетами.


 
Игорь Шевченко ©   (2009-04-13 19:22) [65]

Eraser ©   (13.04.09 19:07) [64]


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


У тебя исходники VCL есть ? :) Посмотри, почему не вызывается.


> но зато именно новички (те кто не использует динамическое
> создание форм, т.к. не знает как) часто наступают на эти
> грабли. поэтому масса многоформенных программок тех же студентов
> грешит багами при закрытии, а еще чаще, при завершении работы
> системы. я за то, чтобы для обработки завершения работы
> системы использовать отдельное событие, а не мешать мух
> с котлетами.


Новички - это отдельный вопрос. Новичкам надо учить матчасть до полного и окончательного просветления, прежде чем кнопки кидать - мое такое мнение.

Насчет события - тебе никто не мешает сделать это так, как ты считаешь - достаточно написать наследника формы с отдельной обработкой сообщения WM_QUERYENDSESSION и все свои формы наследовать от него.

Чем хороша Delphi и VCL - она не запрещает менять тебе ее поведение. А если ты хочешь, чтобы за тебя кто-то исполнил твои же желания, тогда тебе лучше искать золотую рыбку - это по ее части, а вовсе не по части VCL :)


 
Eraser ©   (2009-04-13 19:37) [66]

> [65] Игорь Шевченко ©   (13.04.09 19:22)


> Новичкам надо учить матчасть до полного и окончательного
> просветления, прежде чем кнопки кидать - мое такое мнение.

это правильно, но делфи позиционируется вроде как RAD, т.е. среда не только для профессионалов, но и для, к примеру, рядовых инженеров, которым на скорую руку нужно сколотить приложенице для подсчета чего-то там. ну да ладно, эта тема - отдельный разговор, который сведется в к обсуждению сборщиков муссора :)

> Насчет события - тебе никто не мешает сделать это так, как
> ты считаешь - достаточно написать наследника формы с отдельной
> обработкой сообщения WM_QUERYENDSESSION и все свои формы
> наследовать от него.

так и приходится делать (или почти так - напрямую обрабатывать WM_QUERYENDSESSION, не добавляя новых событий, т.к. чаще всего в приложении достаточно только одного места для обработки WM_QUERYENDSESSION). беда OnCloseQuery именно в половинчатости решения. не нашим не вашим. т.е. событие запроса на заврешение системы и запрос на закрытие окна конечно чем-то схожи, но различий у них больше )


 
MsGuns ©   (2009-04-13 20:08) [67]

Блин, купил чувак коньки, где НЕ написано "для льда !" и давай на них вышивать по асфальту. После двух-трех чебуряхов шавло в три монитора на производителей, дескать надули, гады, туфту гонят.


 
b z   (2009-04-13 20:18) [68]


> шавло
А что это? :)


 
Игорь Шевченко ©   (2009-04-13 20:25) [69]

Eraser ©   (13.04.09 19:37) [66]


> это правильно, но делфи позиционируется вроде как RAD, т.
> е. среда не только для профессионалов, но и для, к примеру,
>  рядовых инженеров, которым на скорую руку нужно сколотить
> приложенице для подсчета чего-то там


Нет, для этих она не позиционируется. Для этих позиционируется Excel. А delphi позиционируется как продвинутый Visual Basic, скорее. Его тоже надо изучать, прежде чем писать на нем что-то.


> т.е. событие запроса на заврешение системы и запрос на закрытие
> окна конечно чем-то схожи, но различий у них больше )


Еще раз - VCL не знает, что происходило с приложением и может ли оно благополучно завершиться при завершении сеанса, поэтому оно дает шанс каждой форме верхнего уровня обработать запрос на завершение сеанса, как бы "закрывая" форму, в надежде на то, что та знает, можно ли ее закрыть.


> т.к. чаще всего в приложении достаточно только одного места
> для обработки WM_QUERYENDSESSION


Далеко не для всех приложений, потому неприемлемо в общем случае.


 
Городской Шаман   (2009-04-13 20:28) [70]


> Кто б сомневался ©   (09.04.09 03:24) [29]


А что вам мешает вставить такой код

if not Visible then Exit;


Ну или вставить его в обработчик сообщения. А далее наследовать все свои формы от данной.

Я в проекте стараюсь вводить одну глобальную форму от которой наследуются все остальные в которой и переопределяю обработку на ту которая мне нравится.


 
Городской Шаман   (2009-04-13 20:40) [71]


> MsGuns ©   (13.04.09 20:08) [67]
>
> Блин, купил чувак коньки, где НЕ написано "для льда !" и
> давай на них вышивать по асфальту. После двух-трех чебуряхов
> шавло в три монитора на производителей, дескать надули,
> гады, туфту гонят.


Угу

Стою на асфальте я в лыжи обутый,
То ли лыжи не те,
То ли я ...ый


 
Кто б сомневался ©   (2009-04-13 20:55) [72]

To all:

Причем здесь новички.
Повторюсь, это не корректная (не логичная) работа с точки зрения VCL форм. C точки зрения окон здесь все логично. Вот эту разницу Игорь и еще некоторые и не могут схватить, хотя уже все подробно расписал в [49] и [50]. В саппорте этот баг не стоит в очереди, а уже открыт (это значит что над ним работают) - а это значит что это баг, хоть с этим фактом любители поспорить не будут спорить?

Еще раз, прочитайте посты 49 и 50 может дойдет.


 
Игорь Шевченко ©   (2009-04-13 21:13) [73]

Кто б сомневался ©   (13.04.09 20:55) [72]

ссылку на QC дай


 
Кто б сомневался ©   (2009-04-13 21:17) [74]


> ссылку на QC дай


А что, так не верится?

http://qc.embarcadero.com/wc/qcmain.aspx?d=72862


 
Игорь Шевченко ©   (2009-04-13 21:19) [75]

Кто б сомневался ©   (13.04.09 20:55) [72]

Кстати, обрати внимание на то, что OnCloseQiery не срабатывает у открытой формы при завершении приложения. Код приведен в посте [59]


 
Игорь Шевченко ©   (2009-04-13 21:20) [76]

Кто б сомневался ©   (13.04.09 21:17) [74]


> А что, так не верится?


мы же не в церкви, это там вопросы веры обсуждают.


 
Игорь Шевченко ©   (2009-04-13 21:27) [77]

теперь там поспорим


 
Eraser ©   (2009-04-13 21:28) [78]

> [72] Кто б сомневался ©   (13.04.09 20:55)

а там как не меняй поведение - правильного решения не будет (то одних будет не устраивать, то других, что и демонстрирует данная ветка). По-хорошему, нужно разделять OnCloseQuery на два отдельных события. Но этого не будет из-за соображений об обратной совместимости :(


 
Игорь Шевченко ©   (2009-04-13 21:42) [79]

Eraser ©   (13.04.09 21:28) [78]

Может, я чего не понимаю, но я не вижу причины разделения на два события. Цель вроде в обоих случаях одна - дать возможность не закрыться втихую, возложить на пользователя решение о том, закрываться или нет, а отчего происходит закрытие - от явного вызова Close, от нажатия на кнопку "Закрыть" в области заголовка, от явной посылки сообщения WM_CLOSE или от завершения сеанса пользователя - а какая разница-то ?


 
Кто б сомневался ©   (2009-04-13 21:46) [80]


> теперь там поспорим


Нет уж, мусорку туда переносить не хочу. Тем более и так все сказано..


 
Кто б сомневался ©   (2009-04-13 21:48) [81]

> теперь там поспорим

Или вы решили поучить CodeGear что такое хорошо, а что такое плохо? :)
Без вас разберутся.


 
Кто б сомневался ©   (2009-04-13 21:53) [82]


> Кстати, обрати внимание на то, что OnCloseQiery не срабатывает
> у открытой формы при завершении приложения. Код приведен
> в посте [59]


Ёлки-палки. Дык об этом и речь ведь!! Я уже говорю об этом все 80 постов... Наконец то дошло..


 
b z   (2009-04-13 21:59) [83]


> а какая разница-то ?
А какая разница во всех этих кейдаунах [пресах, апах] и т.п.? где то и тут оно ...


 
Игорь Шевченко ©   (2009-04-13 22:04) [84]

Кто б сомневался ©   (13.04.09 21:53) [82]

Ты повежливей слегка. Пока я вижу, что ты 80 постов говоришь, что нельзя вызывать OnCloseQuery у невидимой формы.


 
Eraser ©   (2009-04-13 22:19) [85]

> [79] Игорь Шевченко ©   (13.04.09 21:42)

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


 
Игорь Шевченко ©   (2009-04-13 22:23) [86]

Eraser ©   (13.04.09 22:19) [85]


> поэтому я и считаю, что лучший вариант - не решать за пользователя,
>  а предоставить пользователю самому выбирать, когда что
> обрабатывать.


Что собственно и сделано - обработчик OnCloseQuery по умолчанию тихо разрешает форме закрыться, а если пользователь желает изменить это поведение, то он пишет свой обработчик, в котором принимает решение.

Система предоставляет механизм, а политику определяет пользователь.


 
b z   (2009-04-13 23:00) [87]


> Система предоставляет механизм, а политику определяет пользователь.
Поэтому он и платит денежки. :)
Вот действительно, купили вы машину, сразу-же изучаете ее внутренности и как они работают, или нет? Я все к тому, что зачем VCL изучать ... понятно что как проффессионал вы будете крут, но вот скажется ли это на благо-состоянии?


 
b z   (2009-04-13 23:01) [88]


> b z   (13.04.09 23:00) [87]
сори за ошибки.


 
Игорь Шевченко ©   (2009-04-13 23:04) [89]

b z   (13.04.09 23:00) [87]

Да вообще ничего не надо изучать, пустое это занятие. А благосостояние лучше наживать в игровых залах - фишка ляжет, сразу бабла немеряно, понял, да ?


 
b z   (2009-04-13 23:09) [90]


> . А благосостояние лучше наживать в игровых залах - фишка
> ляжет, сразу бабла немеряно, понял, да ?
Пробовали, да ? :)


 
Игорь Шевченко ©   (2009-04-13 23:13) [91]

b z   (13.04.09 23:09) [90]

Завязываем оффтопить


 
Кто б сомневался ©   (2009-04-14 01:46) [92]


> Да вообще ничего не надо изучать, пустое это занятие. А
> благосостояние лучше наживать в игровых залах - фишка ляжет,
>  сразу бабла немеряно, понял, да ?


Как я, так - "Ты повежливей слегка". Как сам, так можно.. :)


 
Германн ©   (2009-04-14 02:04) [93]


> Кто б сомневался ©   (14.04.09 01:46) [92]
>
>
> > Да вообще ничего не надо изучать, пустое это занятие.
> А
> > благосостояние лучше наживать в игровых залах - фишка
> ляжет,
> >  сразу бабла немеряно, понял, да ?
>
>
> Как я, так - "Ты повежливей слегка". Как сам, так можно.
> . :)
>

Эт да! Специфика данного форума.
За это (в том числе) я его и люблю.


 
Cobalt ©   (2009-04-14 14:42) [94]

> Кто б сомневался ©   (13.04.09 20:55) [72]

А ты в деструкторе проверяешь существование объектов перед тем как вызывать их методы?



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2009.06.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.78 MB
Время: 0.008 c
4-1211184805
Barloggg
2008-05-19 12:13
2009.06.21
как отобрать у винды мышь?


2-1240576532
madmech
2009-04-24 16:35
2009.06.21
Проблема с передачей массива в отчет


2-1241599233
Slow
2009-05-06 12:40
2009.06.21
Закрашивание записей в Gridе по условию


15-1239378087
Rouse_
2009-04-10 19:41
2009.06.21
И мне чтоль какую нибудь голосовалку сделать? :)


15-1236615034
Кто б сомневался
2009-03-09 19:10
2009.06.21
Музыка - жанры и стили





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский