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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

ShIvADeSt



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

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

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

     
    И старайтесь, чтобы ваш код не попал сюда

  • Всего записей: 3923 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: data man, 02:45 31-12-2010
    0z0n



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Ок. Согласен книжки есть. Буду читать.

    Всего записей: 317 | Зарегистр. 12-10-2004 | Отправлено: 17:42 25-05-2010
    StalkerSoftware



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hi All,
     
    Delphi 7.1, WinXP SP3 Rus, раскладка клавиатуры по умолчанию "Английская".
     
    Делаю новый проект, и в его обработчик OnCreate помещаю такой код:

    Код:
     
    var
       FOldLayout :Array [0..KL_NAMELENGTH] of Char;
     
     GetKeyboardLayoutName(FOldLayout);
     ShowMessage(FOldLayout);
     

     
    скомилируй его, переключаемся на русский и запускаем эту демку.
    у меня этот код из OnCreate всегда возвращает код раскладки винды по умолчанию, Хотя если в этот проект на форму кинуть кнопку с этим же кодом, то будет возвращаться текущая раскладка.
     
    Вопрос: Почему из OnCreate возвращается не текущая раскладка, а раскладка винды по умолчанию ?
     

    Всего записей: 560 | Зарегистр. 23-06-2008 | Отправлено: 18:19 26-05-2010
    volser

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StalkerSoftware
    Что такое текущая раскладка? Для какого приложения? Для каждого приложения своя текущая раскладка.

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 18:33 26-05-2010
    AviDen



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

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 19:04 26-05-2010
    StalkerSoftware



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

    Цитата:
    Что такое текущая раскладка?
    Это та раскладка, которую выбрал пользователь текущий момент времени в языковой панели (которая возле трея).
     

    Цитата:
    Для каждого приложения своя текущая раскладка.
    А нет ли некой глобальной текущей раскладки в винде ?
     
    AviDen

    Цитата:
    потому что сразу же после создания процесса текущей для него устанавливается раскладка по умолчанию.
    А эту фичу ни как нельзя отключить для своего приложения ?
     
    В общем то вопрос этот возник по следующей причине:
     
    Набирает скажем пользователь в ворде текст на русском языке. Захотелось ему запустить мою программу и набрать некоторые данные там.
    Для запуска моей программы ему нужно ввести пароль на английском языке. Для того, что бы уменьшить вероятность неправильного ввода пароля, я в окне запроса пароля перед его появлением хочу сохранить ту раскладку клавиатуры, которая была до запуска этого окна (до запуска моей программы), а после закрытия окна с паролем вернуть сохраненную раскладку.
     
    Соответственно я рассчитывал, что GetKeyboardLayoutName мне в этом и поможет - вернет текущую раскладку (до запуска моего приложения).
     
    Можно ли все же сделать то, что я описал выше (в причине) или нет ?
     
     

    Всего записей: 560 | Зарегистр. 23-06-2008 | Отправлено: 20:42 26-05-2010 | Исправлено: StalkerSoftware, 20:46 26-05-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StalkerSoftware
    Можно перед созданием своих окон получить текущее активное окно. И потом попробовать узнать его раскладку.
    Правда это будет не совсем стандартное поведение, понравится ли пользователю?

    Всего записей: 2165 | Зарегистр. 24-05-2007 | Отправлено: 21:23 26-05-2010 | Исправлено: Frodo_Torbins, 21:25 26-05-2010
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StalkerSoftware
    Я в своей проге делал так: при запуске устанавливаю программно принудительно русскую раскладку, ибо все данные в проге вводятся в русской раскладке. Если юзер вызывает диалог ввода логина/пароля - запоминаю на всякий текущую раскладку и принудительно меняю раскладку на ангельский язык, показываю диалог, после ввода логина/пароля и закрытия диалога возвращаю раскладку, которую запомнил. Юзеры все просто счасливы
    пример

    ----------
    У программёра есть два состояния: "Втупляю" и "Попёрло"...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 22:41 26-05-2010 | Исправлено: psa1974, 22:46 26-05-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    StalkerSoftware
     
    Просто поменяйте код...
     
    begin
     
     if GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil)) = 67699721 then
     ShowMessage('English')
     else
     ShowMessage('Russian');
    end;

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 22:47 26-05-2010
    mdid

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StalkerSoftware
    мне кажется это лишнее...у меня во всех прогах окно авторизации показывает в Label раскладку клавы выделенную синим цветом с увеличенный шрифтом...на фоне черных букв остальнных данных эти данные выделяются...так что как по мне то вы себе лишнюю работу придумали  

    Всего записей: 1281 | Зарегистр. 13-02-2006 | Отправлено: 08:54 27-05-2010
    AviDen



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

    Исходя из вышесказанного (для каждого приложения имеется своя текущая раскладка), поведение системы по умолчанию уже реализует нужный Вам функционал. Т.е., текущая раскладка в ворде не изменится, вне зависимости от того, какую выберет пользователь в Вашем приложении. Это легко проверить - запустите ворд и ещё какое-л. приложение, скажем, excel, смените в последнем раскладку на другую, переключитсь обратно в ворд - раскладка автоматически переключится на ту, которая была выбрана именно в ворде.

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 11:38 27-05-2010
    StalkerSoftware



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

    Цитата:
    Правда это будет не совсем стандартное поведение, понравится ли пользователю?

    Да нет, тут все как раз пользователю понравится - какая раскладка была до моей программы, такая будет и после ее запуска, пользователь как раз это и просит. Да и ошибок при вводе английского пароля будет гораздо меньше.
     

    Цитата:
    Можно перед созданием своих окон получить текущее активное окно. И потом попробовать узнать его раскладку.
    Это случайно речь не про совет, который дал Bonivur ?
     
    Bonivur

    Цитата:
    Просто поменяйте код.
    Попробовал. Код в принципе работает, кроме случая если приложение запускается их консоли (cmd или far).
    Вопросы:  
     - Где можно посмотреть какие существуют keyboard layout handle, который возвращает GetKeyboardLayout ? В Win32 help от D7 Я их не нашел. Мне например надо еще код для украинского языка.
    - Как я понимаю, потом надо воспользоваться ActivateKeyboardLayout для установки сохраненой раскладки после GetKeyboardLayout  ?
     
    psa1974
    За помощь спасибо, но это не совсем то.
    Из нутри приложения твой кол (как и мой) работает нормально, а вот при старте нет (о чем я в прочем и написал в своих первых двух сообщениях на эту тему).
     
     
     
     
     
     
     
    Добавлено:
     
    Есть еще один вопрос:
     
    Периодически в одной из моих программ у пользователей происходит ошибка типа Access Violation с разными адресами памяти. У себя на компе я их отловить не могу, сам код визуально проверил как мог, но ничего криминального не нашел.
     
    Чем (с помощью какие средств) можно получить более информативное сообщение, чем выдает сама Delphi (D7), при возникновении ошибки типа Access Violation (AV) ?
    Например, что бы в этом сообщении об ошибке было хотя бы имя модуля (Unit'a) где она произошла. В идеале конечно и номер строки не помешает.
     

    Всего записей: 560 | Зарегистр. 23-06-2008 | Отправлено: 14:39 27-05-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StalkerSoftware
    Цитата:
    Это случайно речь не про совет, который дал Bonivur ?  
    Да, именно про него.

    Цитата:
    Чем (с помощью какие средств) можно получить более информативное сообщение, чем выдает сама Delphi (D7), при возникновении ошибки типа Access Violation (AV) ?
    Можно использовать бесплатный JCL, хотя мне больше нравится EurekaLog. Есть еще MadExcept, но его я не пробовал.

    Всего записей: 2165 | Зарегистр. 24-05-2007 | Отправлено: 17:26 27-05-2010 | Исправлено: Frodo_Torbins, 17:27 27-05-2010
    StalkerSoftware



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

    Цитата:
    хотя мне больше нравится EurekaLog

    Нашел его (версия 6.23).
    А есть ли на ru-board топик по нему ? А то я искал, но не нашел. Может искал плохо ...

    Всего записей: 560 | Зарегистр. 23-06-2008 | Отправлено: 17:33 27-05-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StalkerSoftware
    Наверно нету, а чем этот плох? В принципе, если у вас много вопросов, то можно почитать блог Александра Алексеева, после этого большая часть думаю пропадет.

    Всего записей: 2165 | Зарегистр. 24-05-2007 | Отправлено: 18:14 27-05-2010
    Bonivur



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

    Цитата:
    Попробовал. Код в принципе работает, кроме случая если приложение запускается их консоли (cmd или far).  
    Вопросы:  
     - Где можно посмотреть какие существуют keyboard layout handle, который возвращает GetKeyboardLayout ? В Win32 help от D7 Я их не нашел. Мне например надо еще код для украинского языка.


    Код:
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      temp : Integer;
    begin
      temp := GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil));
     case temp of
       67699721 : ShowMessage('English');
       68748313 : ShowMessage('Russian');
       69338146 : ShowMessage('Ukrainian')
             else ShowMessage('Unknown');
     end;
    end;
     

    Скажу по-секрету - берете калькулятор (Виндоузовский). Переключаетесь в Научный вид. Далее меняяте систему счисления на Hex - шестнадатеричную. Вводите простой обычный код раскладки, который вы знаете - только вводите его 2 раза и ставите между ними 0 (ноль). Пример - код для английской раскладки - 409, значит в Hex-режиме вводите - 4090409. Меняете на десятеричную систему (Dec). Вуаля! Получаете нужное вам число - 67699721.
    Насчет ActivateKeyboardLayout - да, им можно воспользоваться, только там код для Win 9x и NT систем различается. Читайте справку Windows SDK в Дельфи.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 18:51 27-05-2010
    AviDen



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

    Цитата:
    Чем (с помощью какие средств) можно получить более информативное сообщение, чем выдает сама Delphi (D7), при возникновении ошибки типа Access Violation (AV) ?  
    Например, что бы в этом сообщении об ошибке было хотя бы имя модуля (Unit'a) где она произошла. В идеале конечно и номер строки не помешает.

    MadExcept
    Выдаст тебе подробную информацию по ошибке, включая кусок кода на asm'е, стек-трейс и номер строки. Ну считая дампов, состояния потоков и кучу всякой статистики. Этого в 95% случаев более чем достаточно.

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 13:03 28-05-2010
    StalkerSoftware



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

    Цитата:
    Наверно нету, а чем этот плох?
    Этот не плох. Просто это общий топик по общим вопросам. И если у меня будут специфические вопросы по EurekaLog, то их ИМНО лучше задавать в специализированном топике.
     

    Цитата:
    В принципе, если у вас много вопросов, то можно почитать блог Александра Алексеева, после этого большая часть думаю пропадет.
    Уже читаю. Спасибо за ссылку.
     
    Есть общий вопрос к тем, кто использует EurekaLog: Может у All есть локализованные (русские или украинские) ресурсы для v 6.x, которыми можно поделится ?  
    На сайте разработчика я таких локализаций не нашел.
     
     
    Bonivur
    Спасибо за помощь. Думаю дальше смогу разобраться сам.
     

    Всего записей: 560 | Зарегистр. 23-06-2008 | Отправлено: 15:36 28-05-2010
    Wahnsinn



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Добрый вечер. Есть ком-сервер на D7, обвязка вся у него стандартная. При вызове из клиента на VS(не нашем) одной из функций иногда происходит ситуация, что HRЕSULT: -2147023170 или если глянуть по поиску кода ошибок в VS
    это тоже самое что 0х800706BЕ - Сбой при удаленном вызове процедуры.  
    сама функция типа
    func_xxx(out p1: WideString; var p2: Integer; var p3: WideString): HResult;
    Куда копать по такой ситуации, причины такого поведения, поможет ли перевод ком-сервера на с++ или же просто, чтобы делали повторный вызов при таком исходе?

    Всего записей: 128 | Зарегистр. 20-01-2007 | Отправлено: 19:17 28-05-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StalkerSoftware
    То, что должен видеть пользователь можно локализовать на свой вкус за 5 минут.
     
    Wahnsinn
    Возможно что внутри этой функции происходит исключение, которое оборачивается в HResult скрытым блоком try/except (он добавляется если ваша функция safecall).

    Всего записей: 2165 | Зарегистр. 24-05-2007 | Отправлено: 19:35 28-05-2010
    Wahnsinn



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Внутри функции все операции завернуты в блоки try/except.

    Всего записей: 128 | Зарегистр. 20-01-2007 | Отправлено: 19:41 28-05-2010
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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

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

    Имя:
    Пароль:
    Сообщение

    Для вставки имени, кликните на нем.

    Опции сообщенияДобавить свою подпись
    Подписаться на получение ответов по e-mail
    Добавить тему в личные закладки
    Разрешить смайлики?
    Запретить коды


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru