Просмотр полной версии : [Delphi] Как вывести диалог из компонента?
RedFern.89
12.05.2010, 10:18
Всем доброго времени суток! Вопрос такой. Как вывести диалог из компонента, причем вывести так, что выполнение дальнейшего кода продолжится, пока не закроешь диалог? Диалог примерно такой:
http://savepic.ru/1142670.jpg
ShowModal или что-то в таком духе. Дельфи почти забыл. Для форм был такой метод.
RedFern.89
12.05.2010, 10:58
как то не очень то хотелось бы пихать модуль Forms в компоент. Диалог должен состоять из панели.
WinAPI?
Панель то ты куда-то должен поместить
RedFern.89
12.05.2010, 11:35
а будет ли грамотно, если в компоненте будет такой код:
uses frmDialogs;
...
function TidVKClient.Login(): boolean;
begin
{ код логина }
// если капча, показать диалог
Dlg.ShowModal;
{ продолжение выполнения кода }
end;
GhostOnline
12.05.2010, 13:46
Не хочешь подключать формс к своему классу - просто создай событие у своего компонента типа TidVKClient.OnCatcha. В обработчик этого события передавай stream с пикчей, а тот кто будет использовать твой компонент извне - будет обрабатывать событие, например либо капчу показать в модальном окне, либо отправить на антигейт и т.п.
RedFern.89
12.05.2010, 14:43
так ведь надо же еще выполнение код приостановить как то о_О
ShowModal в данном случае будет нормально.
RedFern.89
12.05.2010, 15:57
так и сделал)) помог следующий код:
// ---- Вывод диалога ввода кода капчи ----
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; не улыбает вовсе
Jingo Bo
12.05.2010, 16:38
однако меня этот uses Forms; не улыбает вовсе
Раз не нравится сделай панель в памяти по данным dfm файла твоего диалога(всё ручками), потом с winapi создавай обычное окно без заголовка и через Windows.SetParent на то окно лепи панельку.
P.S. Если уж делаешь компонент, то делай универсальнее и более гибкий код. Кстати вышеуказаный код должен быть в таким;)
// ---- Вывод диалога ввода кода капчи ----
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, или нет.
GhostOnline
12.05.2010, 17:54
Chrome~ при чем здесь инди :confused: ?
Jpg.LoadFromStream(ms);
И сигнатура кстати похожая на Indy все же у Get
Chrome~ при чем здесь инди :confused: ?
И сигнатура кстати похожая на Indy все же у Get
Ты ничего не понял просто.
Блок
try
finally
end;
не есть обязательным, так как не факт, что в нем произойдет exception. Может быть функция Get всегда возвращает правильный результат автору? ))
GhostOnline
12.05.2010, 18:15
Имхо наоборот, ты ничего не понял
Вот что пишет Джинго Бо:
Jpg.LoadFromStream(ms); {при не правльных данных здесь может вылезть эксцепшн}
Если в Ms не содержится пикча то будет экспешн, да. Генерирует этот экспешн JpgImage или как там класс называется не помню
е есть обязательным, так как не факт, что в нем произойдет exception. Может быть функция Get всегда возвращает правильный результат автору? ))
Всегда возвращает правильный результат, тем более при работе с сетью - такого не бывает. И причин этого может быть сколько угодно. Что она вернет если вырубиться инет на машине? Правильный результат? А если дохлый прокси будет?
Сорри, сглупил. Не дочитал код и не обратил внимание.
RedFern.89
12.05.2010, 22:37
Метод GET я сделал на winapi))) эксепшенов быть не должно))) всем спасибо за помощь))
Jingo Bo, как сделать такую панель? можно какнить кодом показать?))) буду очень благодарен))
Jingo Bo
12.05.2010, 23:30
Я 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-формами.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot