Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
64 / 64 / 44
Регистрация: 15.11.2009
Сообщений: 247
1

QDialogs

04.12.2010, 17:46. Показов 3723. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть ли модуль QDialogs в Delphi 10? Я не нашла, если всё же нет, то как можно ввести номер, имея максимальное и минимальное значение? или хотя бы просто целочисленное значение. В QDialogs была overloaded InputQuery, например.
0
12 / 11 / 7
Регистрация: 28.05.2009
Сообщений: 56
04.12.2010, 19:15 2
Насколько я понимаю QDialogs - это класс опен соурсного модуля qtgui на С++. Попробуй скачать и подключить. А вообще юзай Dialogs.dcu
Delphi
1
value := strtoint(InputBox('program', 'введите число', '454545'));
1
64 / 64 / 44
Регистрация: 15.11.2009
Сообщений: 247
04.12.2010, 19:47  [ТС] 3
Немного не так. QDialogs - модуль из Delphi 7.

Классическая InputQuery, та, что ты привел,

Delphi
1
2
function InputQuery(const ACaption, APrompt: WideString;
  var Value: WideString): Boolean;
вводит строку, и если пользователь ввел строку, непереводимую в целочисленное значение, программа вылетит с эксепшеном (или invalid numeric input, или not a valid integer value, не суть). TryStrToInt тоже не подойдет.

Я говорю об этом:
http://www.koders.com/delphi/f... spx?s=hook

А именно:

Delphi
1
2
3
function InputQuery(const ACaption, APrompt: WideString; var Value: Integer;
  Min: Integer = Low(Integer); Max: Integer = High(Integer);
  Increment: Integer = 1): Boolean; overload;
0
12 / 11 / 7
Регистрация: 28.05.2009
Сообщений: 56
04.12.2010, 20:43 4
В чем тогда вообще проблема - у тебя есть этот модуль! Подключи его или вытащи из него целиком функцию и добавь в программу.
1
64 / 64 / 44
Регистрация: 15.11.2009
Сообщений: 247
05.12.2010, 11:39  [ТС] 5
Было бы всё так просто. Он не копмилируется, так как использует какие-то еще модули из седьмой дельфи, которых в десятой нет. А функция сама также выглядит странновато и не компилится:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function InputQuery(const ACaption, APrompt: WideString; var Value: Integer;
  Min: Integer = Low(Integer); Max: Integer = High(Integer);
  Increment: Integer = 1): Boolean;
var
  RetVal: Integer;
  CaptureControl: TControl;
{$IFDEF LINUX}
  SigIntStatus,
  SigQuitStatus: TSignalState;
{$ENDIF}
begin
  CaptureControl := GetCaptureControl;
  try
    SetCaptureControl(nil);
    QForms.Application.ModalStarted(nil);
    try
{$IFDEF LINUX}
      SigIntStatus := InquireSignal(RTL_SIGINT);
      SigQuitStatus := InquireSignal(RTL_SIGQUIT);
      if SigIntStatus = ssHooked then
        UnhookSignal(RTL_SIGINT);
      if SigQuitStatus = ssHooked then
        UnhookSignal(RTL_SIGQUIT);
      try
{$ENDIF}
        RetVal := QInputDialog_getInteger(PWideString(@ACaption),
          PWideString(@APrompt), Value, Min, Max, Increment, @Result, nil, nil);
{$IFDEF LINUX}
      finally
        if SigIntStatus = ssHooked then
          HookSignal(RTL_SIGINT);
        if SigQuitStatus = ssHooked then
          HookSignal(RTL_SIGQUIT);
      end;
{$ENDIF}
      if Result then Value := RetVal;
    finally
      QForms.Application.ModalFinished(nil);
    end;
  finally
    SetCaptureControl(CaptureControl);
  end;
end;
Как я поняла она цепляет классы из QForms, которого в десятке также нет.
0
12 / 11 / 7
Регистрация: 28.05.2009
Сообщений: 56
05.12.2010, 12:58 6
И правда, чтобы добавить эту функцию нужно еще кучу модулей перерыть. Но почему не подходит стандартный InputQuery и TryStrToInt (если ты не хочешь пользоваться модулем SysUtils, то http://parsers.info/2009/05/ob... ka-chislo/), а ошибки всегда можно перехватить с помошью try - except.
1
64 / 64 / 44
Регистрация: 15.11.2009
Сообщений: 247
05.12.2010, 13:05  [ТС] 7
Преподаватель требует, чтобы вводилось сразу число. Ну вот ничего с этим не могу поделать.
Тем более, если использовать try-except, всё равно в дебаг-режиме программа вывалится, а она это ой как не любит.
0
12 / 11 / 7
Регистрация: 28.05.2009
Сообщений: 56
05.12.2010, 13:27 8
Тогда придется скачивать delphi 7 и делать в нем.
А моим преподам все равно как программа написана, главное, чтобы была протестирована черными и белыми ящиками и была защита от дурака.
1
64 / 64 / 44
Регистрация: 15.11.2009
Сообщений: 247
05.12.2010, 13:43  [ТС] 9
Тебе крупно повезло в таком случае Спасибо за помощь
0
379 / 332 / 89
Регистрация: 26.05.2010
Сообщений: 750
05.12.2010, 14:53 10
может просто не париться, а создать собственное окно для ввода с помощью CreateMessageDialog
1
64 / 64 / 44
Регистрация: 15.11.2009
Сообщений: 247
05.12.2010, 15:04  [ТС] 11
Zombi_sib , можно поподробнее?

Добавлено через 2 минуты
Delphi
1
CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons): TForm;
Вроде здесь не предусматривается ввод какого-то значения, насколько я вижу
0
379 / 332 / 89
Регистрация: 26.05.2010
Сообщений: 750
05.12.2010, 15:24 12
да конечно там нет но нам это позволяет произвольное число компонентов добавить в наше диалоговое окно в принципе что захотим вот пример не большой взятый из интернета добавляет checkbox в диалоговое окно

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function CheckMessageDlg(const Msg, Caption, CheckBoxCaption: string;
  var Checked: boolean; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons{;
  DefaultButton: TMsgDlgBtn}): TModalResult;
var
  Dialog: TForm;
  LeftEdge, TopEdge: Integer;
  i: Integer;
  Ctrl: TControl;
  CheckBox: TCheckBox;
begin
  Dialog:= CreateMessageDialog(Msg, DlgType, Buttons{, DefaultButton});
  if not (Caption = '') then
    Dialog.Caption:= Caption;
  LeftEdge:= Dialog.ClientWidth;
  TopEdge:= Dialog.ClientHeight;
  if Dialog.ControlCount > 0 then
    for i := 1 to Dialog.ControlCount - 1 do
    begin
      Ctrl:= Dialog.Controls[i];
      if Ctrl.Left < LeftEdge then LeftEdge:= Ctrl.Left;
      if Ctrl.Top < TopEdge then TopEdge:= Ctrl.Top;
    end
  else
  begin
    LeftEdge:= 10;
    TopEdge:= 10;
  end;
  CheckBox:= TCheckBox.Create(Dialog);
  with CheckBox do
  begin
    Parent:= Dialog;
    Caption:= CheckBoxCaption;
    Checked:= Checked;
    Left:= LeftEdge;
    Top:= Dialog.ClientHeight;
    Width:= Dialog.Canvas.TextWidth(CheckBox.Caption) + 30;
  end;
  Dialog.ClientHeight:= Dialog.ClientHeight + CheckBox.Height + TopEdge;
  if (CheckBox.Width + LeftEdge * 2) > Dialog.ClientWidth then
    Dialog.ClientWidth:= CheckBox.Width + LeftEdge * 2;
  Result:= Dialog.ShowModal;
  Checked:= CheckBox.Checked;
  Dialog.Free;
end;
1
64 / 64 / 44
Регистрация: 15.11.2009
Сообщений: 247
05.12.2010, 15:42  [ТС] 13
Спасибо, разобралась, попробую сделать подобное
0
05.12.2010, 15:42
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru