[Delphi] Как вывести диалог из компонента? |

12.05.2010, 10:18
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
С нами:
8582863
Репутация:
69
|
|
[Delphi] Как вывести диалог из компонента?
Всем доброго времени суток! Вопрос такой. Как вывести диалог из компонента, причем вывести так, что выполнение дальнейшего кода продолжится, пока не закроешь диалог? Диалог примерно такой:

|
|
|

12.05.2010, 10:41
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
С нами:
10653446
Репутация:
836
|
|
ShowModal или что-то в таком духе. Дельфи почти забыл. Для форм был такой метод.
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
|
|
|

12.05.2010, 10:58
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
С нами:
8582863
Репутация:
69
|
|
как то не очень то хотелось бы пихать модуль Forms в компоент. Диалог должен состоять из панели.
|
|
|

12.05.2010, 11:25
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
С нами:
10653446
Репутация:
836
|
|
WinAPI?
Панель то ты куда-то должен поместить
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
|
|
|

12.05.2010, 11:35
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
С нами:
8582863
Репутация:
69
|
|
а будет ли грамотно, если в компоненте будет такой код:
Код:
uses frmDialogs;
...
function TidVKClient.Login(): boolean;
begin
{ код логина }
// если капча, показать диалог
Dlg.ShowModal;
{ продолжение выполнения кода }
end;
|
|
|

12.05.2010, 13:46
|
|
Участник форума
Регистрация: 20.12.2008
Сообщений: 277
С нами:
9152955
Репутация:
84
|
|
Не хочешь подключать формс к своему классу - просто создай событие у своего компонента типа TidVKClient.OnCatcha. В обработчик этого события передавай stream с пикчей, а тот кто будет использовать твой компонент извне - будет обрабатывать событие, например либо капчу показать в модальном окне, либо отправить на антигейт и т.п.
|
|
|

12.05.2010, 14:43
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
С нами:
8582863
Репутация:
69
|
|
так ведь надо же еще выполнение код приостановить как то о_О
|
|
|

12.05.2010, 15:53
|
|
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
С нами:
9162683
Репутация:
175
|
|
ShowModal в данном случае будет нормально.
|
|
|

12.05.2010, 15:57
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
С нами:
8582863
Репутация:
69
|
|
так и сделал)) помог следующий код:
Код:
// ---- Вывод диалога ввода кода капчи ----
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; не улыбает вовсе
|
|
|

12.05.2010, 16:38
|
|
Познающий
Регистрация: 25.10.2009
Сообщений: 97
С нами:
8707843
Репутация:
15
|
|
однако меня этот 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;
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|