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

Форум АНТИЧАТ (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;


Chrome~ 12.05.2010 16:59

Jingo Bo, немножечко ошибаешься. RedFern.89 не использует Indy, для работы с инетом, а работает с помощью своих функций.

Так что ему виднее, будет ли exception, или нет.

GhostOnline 12.05.2010 17:54

Chrome~ при чем здесь инди :confused: ?
Цитата:

Jpg.LoadFromStream(ms);
И сигнатура кстати похожая на Indy все же у Get

Chrome~ 12.05.2010 18:01

Цитата:

Сообщение от GhostOnline
Chrome~ при чем здесь инди :confused: ?

И сигнатура кстати похожая на Indy все же у Get

Ты ничего не понял просто.

Блок
Код:

  try
  finally 
  end;

не есть обязательным, так как не факт, что в нем произойдет exception. Может быть функция Get всегда возвращает правильный результат автору? ))

GhostOnline 12.05.2010 18:15

Имхо наоборот, ты ничего не понял
Вот что пишет Джинго Бо:
Цитата:

Jpg.LoadFromStream(ms); {при не правльных данных здесь может вылезть эксцепшн}
Если в Ms не содержится пикча то будет экспешн, да. Генерирует этот экспешн JpgImage или как там класс называется не помню
Цитата:

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

Chrome~ 12.05.2010 18:20

Сорри, сглупил. Не дочитал код и не обратил внимание.

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-формами.


Время: 00:28