Всем доброго времени суток! Вопрос такой. Как вывести диалог из компонента, причем вывести так, что выполнение дальнейшего кода продолжится, пока не закроешь диалог? Диалог примерно такой:
а будет ли грамотно, если в компоненте будет такой код: Code: uses frmDialogs; ... function TidVKClient.Login(): boolean; begin { код логина } // если капча, показать диалог Dlg.ShowModal; { продолжение выполнения кода } end;
Не хочешь подключать формс к своему классу - просто создай событие у своего компонента типа TidVKClient.OnCatcha. В обработчик этого события передавай stream с пикчей, а тот кто будет использовать твой компонент извне - будет обрабатывать событие, например либо капчу показать в модальном окне, либо отправить на антигейт и т.п.
так и сделал)) помог следующий код: Code: // ---- Вывод диалога ввода кода капчи ---- procedure TidVKClient.ShowCaptchaDialog(const captcha_sid: string); var MS : TMemoryStream; Jpg : TJpegImage; begin Ms := TMemoryStream.Create; Jpg := TJpegImage.Create; Get('http://vkontakte.ru/captcha.php?s=1&sid=' + captcha_sid, Ms); Ms.Position := 0; Jpg.LoadFromStream(ms); DlgForm.imgKey.Picture.Graphic := Jpg; Jpg.Free; Ms.Free; DlgForm.Caption := 'Enter Code'; DlgForm.ShowModal; end; однако меня этот uses Forms; не улыбает вовсе
Раз не нравится сделай панель в памяти по данным dfm файла твоего диалога(всё ручками), потом с winapi создавай обычное окно без заголовка и через Windows.SetParent на то окно лепи панельку. P.S. Если уж делаешь компонент, то делай универсальнее и более гибкий код. Кстати вышеуказаный код должен быть в таким Code: // ---- Вывод диалога ввода кода капчи ---- procedure TidVKClient.ShowCaptchaDialog(const captcha_sid: string; const notice : String = 'Enter Code'); var MS : TMemoryStream; Jpg : TJpegImage; begin Ms := TMemoryStream.Create; Jpg := TJpegImage.Create; try Get('http://vkontakte.ru/captcha.php?s=1&sid=' + captcha_sid, Ms); Ms.Position := 0; Jpg.LoadFromStream(ms); {при не правльных данных здесь может вылезть эксцепшн} //DlgForm.imgKey.Picture.Graphic := Jpg; {не верно, нужно делать через Assign, ибо будет утечка памяти и при хз что будет когда Jpg сделают Free} DlgForm.imgKey.Picture.Assign(Jpg); {Делфи под боком нет, так что не помню, на Graphic или сразу на Picture Assign делать)} finally Jpg.Free; Ms.Free; end; DlgForm.Caption := notice; DlgForm.ShowModal; end;
Jingo Bo, немножечко ошибаешься. RedFern.89 не использует Indy, для работы с инетом, а работает с помощью своих функций. Так что ему виднее, будет ли exception, или нет.
Ты ничего не понял просто. Блок Code: try finally end; не есть обязательным, так как не факт, что в нем произойдет exception. Может быть функция Get всегда возвращает правильный результат автору? ))
Имхо наоборот, ты ничего не понял Вот что пишет Джинго Бо: Если в Ms не содержится пикча то будет экспешн, да. Генерирует этот экспешн JpgImage или как там класс называется не помню Всегда возвращает правильный результат, тем более при работе с сетью - такого не бывает. И причин этого может быть сколько угодно. Что она вернет если вырубиться инет на машине? Правильный результат? А если дохлый прокси будет?
Метод GET я сделал на winapi))) эксепшенов быть не должно))) всем спасибо за помощь)) Jingo Bo, как сделать такую панель? можно какнить кодом показать?))) буду очень благодарен))
Я try-finally поставил из-за того что при загрузке jpg может вылезть exception, а растянул до get потому что не знал может она создать exception или нет. По поводу кода могу сказать вот что. Создаёшь в какой нить програмке для ресурсов диалог, сохраняешь в rc-файл. Потом берешь прогу из набора delphi - BRCC32.EXE(находится там же где и exe delphi). В командной строке прописываешь : <путь к BRCC32> <путь к твоему RC файлу> Прога тебе выдаст файл ресурсов для delphi. Кидаешь в свой проект, подключаешь в исходниках {$R твой тот файл.res} И делаешь как в статье http://www.delphisources.ru/pages/faq/base/write_win32api_apps.html Кода получится не много и без forms Хотя смысла его не использовать я не вижу, т.к. юзаться код полюбому будет с vcl-формами.