Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [Delphi] Как вывести диалог из компонента? (https://forum.antichat.xyz/showthread.php?t=203414)

RedFern.89 12.05.2010 10:18

[Delphi] Как вывести диалог из компонента?
 
Всем доброго времени суток! Вопрос такой. Как вывести диалог из компонента, причем вывести так, что выполнение дальнейшего кода продолжится, пока не закроешь диалог? Диалог примерно такой:

http://savepic.ru/1142670.jpg

W!z@rD 12.05.2010 10:41

ShowModal или что-то в таком духе. Дельфи почти забыл. Для форм был такой метод.

RedFern.89 12.05.2010 10:58

как то не очень то хотелось бы пихать модуль Forms в компоент. Диалог должен состоять из панели.

W!z@rD 12.05.2010 11:25

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

так ведь надо же еще выполнение код приостановить как то о_О

Chrome~ 12.05.2010 15:53

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;



Время: 06:51