Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wasilissk

    Цитата:
    EurekaLog и madExcept как-то это определяют и не генерят отчет, если исключение возникло в try..except

    эврика генерит (по крайней мере у меня), если только не указать, что данное исключение должно обрабатываться rtl.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:42 09-12-2011
    wasilissk

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt
    EurkaLog 6. Advanced options -> Catch Handled exceptions. Если снять галку, в лог не пишет и диалог не показывает.
    Ладно, спасибо, буду фулсорц искать.

    Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 09:06 09-12-2011
    A1exSun



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Код:
    procedure TForm1.Button12Click(Sender: TObject);
    begin
      if length(Edit1.Text) > 1 then begin
        x := strtofloat(Edit1.Text);
        op := '/';
        Edit1.Clear;
      end
      else ShowMessage('Введите первый операнд.');
    end;
     
    procedure TForm1.Button13Click(Sender: TObject);
    begin
      if length(Edit1.Text) > 1 then begin
        x := strtofloat(Edit1.Text);
        op := '*';
        Edit1.Clear;
      end
      else ShowMessage('Введите первый операнд.');
    end;
     
    procedure TForm1.Button14Click(Sender: TObject);
    begin
      if length(Edit1.Text) > 1 then begin
        x := strtofloat(Edit1.Text);
        op := '-';
        Edit1.Clear;
      end
      else ShowMessage('Введите первый операнд.');
    end;
     
    procedure TForm1.Button15Click(Sender: TObject);
    begin
      if length(Edit1.Text) > 1 then begin
        x := strtofloat(Edit1.Text);
        op := '+';
        Edit1.Clear;
      end
      else ShowMessage('Введите первый операнд.');
    end;

    4 одинаковых процедуры, отличаются только присваиваемым значением op. Можно как-то упростить код?
     
    1. Как сделать копирование текста из Edit1 в буфер при нажатии Ctrl+C? (вставку туда по Ctrl+V, вырезание оттуда по Ctrl+X)
    2. Как сделать очистку Edit1 по нажатию Del?
    3. Как сделать удаление последнего символа по нажатию Backspace?
    4. Как сделать нажатие определенных TButton при нажатии цифр на клавиатуре?

    Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 23:21 09-12-2011 | Исправлено: A1exSun, 23:25 09-12-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    A1exSun

    Цитата:
    4 одинаковых процедуры, отличаются только присваиваемым значением op. Можно как-то упростить код?

    когда "рисуешь" кнопки на форме, заполни поле Tag своими константами (хоть Tag = byte('твой_символ')),
    напиши один общий обработчик-метод
     
    procedure TForm1.internal_ButtonClick(Sender: TObject);
    begin
    ...
    // здесь получаешь op через Tag со всеми необходимыми преобразованиями
       op := (Sender as TButton).Tag;
    ...
    end;
     
    все остальные баттон-обработчики просто зовут его:
     
    procedure TForm1.Button15Click(Sender: TObject);
    begin
      internal_ButtonClick(Sender);
    end;
     
    как проще я не знаю...

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 23:39 09-12-2011 | Исправлено: akaGM, 23:46 09-12-2011
    Corsairs

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Можно без использования Tag - просто передавать в процедуру значение...
     
    procedure BC(s: char);
    begin
     if length(Edit1.Text) > 1
      then
       begin
        x := strtofloat(Edit1.Text);
        op := s;
        Edit1.Clear;
       end
      else
       ShowMessage('Введите первый операнд.');
    end;
     
    procedure TForm1.Button15Click(Sender: TObject);
    begin
     BC('+');
    end;

    Всего записей: 569 | Зарегистр. 30-06-2006 | Отправлено: 23:53 09-12-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    A1exSun
    http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342
    1. А оно не работает?
    2. Напишите ему обработчик нажатий клавиш (OnKey*)
    3. А оно не работает?
    4. Тут два варианта: можно сделать форме KeyPreview=True и написать обработчик нажатий клавиш с учетом текущего сфокусированного контрола. А можно в ActionList понасоздавать экшенов и назначить им те же обработчики что и кнопкам.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 23:54 09-12-2011
    A1exSun



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins

    Цитата:
    1. А оно не работает?

    Цитата:
    3. А оно не работает?

    Edit1 - disable, мне не нужно чтоб там можно было писать/выделять мышкой и т.п.
    То есть я поле использую только для вывода результата, а ввод осуществляется нажатиями кнопок в программе.

    Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 23:58 09-12-2011 | Исправлено: A1exSun, 00:25 10-12-2011
    perceptron

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Упростить МОЖНО:
    Сделать 1 обрабочтк OnClick скажем у Button1
    А всем остальным Button-ам поставить ссылку на этот же обработчик
     
    Внутри проверять имя батона и op ставить который нужно:
     

    Код:
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Sender is Tbutton then
      begin
         if TComponent(Sender).Name = 'Button12' then // можно написать (Sender as Tbutton).Name = 'Button12'
            op := '/'
         else
         if TComponent(Sender).Name = 'Button13' then
            op := '*'
     
       end;
    end;
     

    Всего записей: 433 | Зарегистр. 23-12-2005 | Отправлено: 00:09 10-12-2011
    Corsairs

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    У меня вот такой вот вопрос:
    Я хочу использовать в программе нестандартный диалог. Как я понимаю, для рисования используется редактор ресурсов (кстати, каким лучше всего воспользоваться?), но вот что делать дальше? Как вызвать этот диалог, и как организовать взаимодействие с ним? (т.е. передачу данных в диалог, обработку в диалоге и передачу данных в основную прогу)
     
    Где об этом можно почитать и посмотреть примеры?

    Всего записей: 569 | Зарегистр. 30-06-2006 | Отправлено: 00:10 10-12-2011
    perceptron

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Очистку Edit по Del - делать нужно в OnКeyDown

    Код:
     
    procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
        if (Key = VK_DELETE) then
           Edit1.Text := '';
    end;
     
     

    Всего записей: 433 | Зарегистр. 23-12-2005 | Отправлено: 00:15 10-12-2011 | Исправлено: perceptron, 00:16 10-12-2011
    A1exSun



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins

    Цитата:
    ActionList

    Список действий?
    perceptron

    Цитата:
    OnКeyDown

    При нажатии клавиши?
     
    Где их искать?

    Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 00:18 10-12-2011 | Исправлено: A1exSun, 00:19 10-12-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    A1exSun
    как правильно сказал perceptron, а я забыл упомянуть, у всех обработчиков надо в инспекторе указать обработчиком твой internal_ButtonClick()
    а TForm1.Button15Click() я наверное зря написал...
     
     
    Corsairs
    не
    у тебя сколько баттонов столько и
    procedure TForm1.Button_ххх_Click(Sender: TObject);
    begin
     BC('+');
    end;
    а у меня  -- один...
     
    perceptron
    у меня всё-таки проще, никаких проверок, а поле tag всё равно есть и хранится в ресурсе формы :)

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 00:26 10-12-2011 | Исправлено: akaGM, 00:49 10-12-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Список действий?

    Да, каждому итему списка можно назначить горячую клавишу.
    OnКeyDown есть у всех контролов (по крайней мере в современных делфях). В вашем случае возможно достаточно будет написать этот обработчик только для формы и выставить ей KeyPreview=True. Но вариант со списком действий тоже неплох.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 00:35 10-12-2011
    A1exSun



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    А как сделать чтоб в Edit1 нельзя было вводить с клавиатуры текст, выделять и чтоб не было курсора - Enabled = False?
    Так поле вроде серым становиться, а мне это не нужно.
     
    Добавлено:

    Цитата:
    Да, каждому итему списка можно назначить горячую клавишу.

    Нашел ActionList (называется Events) и в нем OnКeyDown, в него писать имя обработчика? А где сам код клавиши писать?
    А понял вроде.
     
    Добавлено:
    akaGM
    Сделал как ты написал, ag для всех кнопок один. То есть поменял его в Button2, он поменялся везде.
     
    Добавлено:
    Перезапустил дельфи - у всех отдельный. Wtf?
    Итого написал один обработчик, для цифр:

    Код:
    procedure TForm1.ButtonNumClick(Sender: TObject);
    begin
      Area.Text := Area.Text + IntToStr((Sender as TButton).Tag);
    end;

    32 строки кода сэкономлено.
     
    Для прочих клавиш сделаю аналогично.

    Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 00:46 10-12-2011 | Исправлено: A1exSun, 01:37 10-12-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    A1exSun
    то есть?
    в каждом поле надо ввести своё значение, можно любое и в любом порядке...
    что не так?

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 01:46 10-12-2011
    A1exSun



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    Уже все так, то был какой-то глюк, или я что-то наклацал
     
    Как TEdit сделать только для вывода теста, чтоб в него нельзя было писать и выделять в нем? Enabled установить в False, по-другому никак?

    Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 02:13 10-12-2011 | Исправлено: A1exSun, 02:13 10-12-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    A1exSun

    Цитата:
    Как TEdit сделать только для вывода теста, чтоб в него нельзя было писать и выделять в нем? Enabled установить в False, по-другому никак?
    а зачем тогда Едит? :)
    для вывода и лейбла хватит...

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 02:28 10-12-2011
    A1exSun



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    Поле красивее
     
    Как из текста последний символ удалить?
    И еще, как проверить что в тексте не больше одной точки? Есть стандартные функции?

    Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 02:40 10-12-2011 | Исправлено: A1exSun, 02:59 10-12-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    A1exSun

    Цитата:
    Поле красивее

    а в твоём ХРЕ бордюры/бевелы у лейблов ещё не появились?
    тогда сторонний компонент подключай...
     

    Цитата:
    как проверить что в тексте не больше одной точки?
    в строке что ли?
     
    index = pos()
    if index > 0 уже одна есть
      if pos(index...) > 0 больше одной
      else точно одна
    else ниодной
     
    как-то так...
     

    Цитата:
    Как из текста последний символ удалить?

    да что ты текстом называешь, string, pchar, memo?
    в некотрых случаях достаточно setlength(TEXT, length(TEXT)-1)
     
    смотри общие юниты sysutils и strutils
    там всё это есть...
     
    чё-то рано ты из паскаля ушёл...

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 03:31 10-12-2011 | Исправлено: akaGM, 05:32 10-12-2011
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    TPanel прекрасно эмулирует едит. Ловить естессно нажатия клавиш на уровне формы. Кидаешь TLabel на панель, выравнивание справа и уже почти калькулятор, все остальное - просто курение хелпа по работе со строками.  
    Либо у TStaticText тоже можно бордюры задавать.  
    Для многих вопросов достаточно Pos, Delete, Length, Copy, Insert. По крайней мере когда я в свое время делал калькулятор для вычисления истинности логических выражений - я только их использовал.


    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:11 10-12-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru