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

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



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Maks150988
    Ох, я уж обрадовался, что это универсальное "лекарство". Ладно уж пусть хоть на XP без мерцания будет

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

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 09:59 11-07-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Можно ограничится одним единственным "SetDoubleBuffer(PageControl1.Handle);", но конечно на виндах ниже XP это работать не будет. Выше - работает.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 12:52 11-07-2010 | Исправлено: Frodo_Torbins, 12:54 11-07-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Frodo_Torbins
    А что делать в случае с системами ниже XP?

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

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 13:26 11-07-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Может пусть мигает?

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 14:30 11-07-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Так?
    Не знаю, на обычных элементах управления должно сработать, если только прорисовка не через свою хрень сделана в VCL.
     
    У меня вопрос кстати. В моем приложении требуется изменять высоту главного окна через кнопочку. Собственно простой и расширенный режимы окна сделал. Нижняя граница главного окна должна быть по нижней границе статусной строки. Я вот все хочу как-то оптимальнее код написать, но покане понимаю как корректнее всего подогнать значения. Ведь на висте и семерке это вообще вендекапец какой-то из-за за аеро стиля, пустая облать между нижними границами образуется, потому что высота рассчитывается больше чем ожидалось. Я уж не знаю какие метрики у GetSystemMetrics использовать. Или через одно место какое-нибудь преобразование дочерних координат статусной строки по отношению к главному окну делать может быть. Подскажите как корректно вычислять iHeight при BST_CHECKED. Этот код испоьзуется когда приходит сообщение о смене темы, даже в классическом оформлении высота окна обрубается так что статусная строка наполовину не видна.
     

    Код:
     
              dwRet := SendMessageW(GetDlgItem(hWnd, IDC_MAIN_WINDOW_MODE),
                BM_GETCHECK, 0, 0);
     
              GetWindowRect(hWnd, rect);
              iWidth := rect.Right - rect.Left;
     
              if (dwRet = BST_CHECKED) then
              begin
     
                GetWindowRect(GetDlgItem(hWnd, IDC_MAIN_STATUSBAR_INFO), rect);
                MapWindowPoints(0, hWnd, rect, 2);
     
                iHeight := rect.Bottom + GetSystemMetrics(SM_CYCAPTION) +
                  GetSystemMetrics(SM_CXFRAME) * 2 - 1;
     
              end
              else
              begin
     
                GetWindowRect(GetDlgItem(hWnd, IDC_MAIN_WINDOW_MODE), rect);
                MapWindowPoints(0, hWnd, rect, 2);
     
                iHeight := rect.Bottom + GetSystemMetrics(SM_CYCAPTION) +
                  GetSystemMetrics(SM_CXFRAME) * 2 + 5;
     
              end;
     
              dwRet := SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE;
              SetWindowPos(hWnd, 0, 0, 0, iWidth, iHeight, dwRet);
     
     

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 20:17 11-07-2010 | Исправлено: Maks150988, 21:32 11-07-2010
    4t

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть ли функция, которая по элементу массива, выдаст индекс этого элемента?

    Всего записей: 120 | Зарегистр. 08-01-2007 | Отправлено: 22:06 12-07-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    4t
     
    Ого, ну если только перебором от Low до High инкрементировать самому значение и если строка в массиве по такому-то индеку сойдется, значит делаем Break в цикле.
     

    Код:
    Result := FALSE;
    i := 0;
    for index := Low(Массив) to High(Массив) do
    begin
      s := Array[index];
      if (s = Строка) then
      begin
        Result := TRUE;
        Break;
      end;
      Inc(i)
    end;

     
    Наверное, это то что вам нужно. Вобщем-то, код от балды напсиан, не знаю, все ли подводные камни учтены здесь, массив может быть разной длинны, да и в статическом массиве индексы можно по разному задать. Все ранво допиливать надо под свои нужды скорее всего вариант.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 22:19 12-07-2010 | Исправлено: Maks150988, 22:22 12-07-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    4t
     
    Можно так
    только замените string на ваш тип массива.

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

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 22:32 12-07-2010 | Исправлено: Bonivur, 22:33 12-07-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Попробуйте в обработчике WM_NCCalcSize размеры запоминать. А вообще чтобы виста говорила вам правильные размеры, нужно компилировать приложение особым образом, указывая параметр SubSystem=6.0 в PE-заголовке. В новых версиях делфи для этого есть опция компилятора "--pesubsysversion".

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 22:46 12-07-2010 | Исправлено: Frodo_Torbins, 22:48 12-07-2010
    Maks150988



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

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 00:08 13-07-2010
    4t

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988, Bonivur, нуда, что-т вроде того ... и все же я думал, что есть готовая функция как на С#, Dictionary...  
     
    В общем дело такое, строку нужно разложить на индексы позиций символов.
    Получилось вот так:

    Код:
     
    const
    alphabet := 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
    Var
    byt1 : array [0..15] of byte;
    ind, ic : integer;
    sym : char;
    // data : string 16 символов
    begin
    for ind := 0 to 15 do byt1[ind]:= 0; // очистка массива  
    iс := 0;
     
    while ic <> 16 do
    begin
      sym := data[ic+1]; // + 1 потому что позиция первого символа строки  
      for ind := 0 to 31 do
        begin
          if sym = alphabet[ind] then
            begin
              byt1[ic] := ind;
              Break;
            end;
         end;
      inc (ic);
    end;
    ...
     

     
    Теперь такой вопрос:  
    Константа или переменная типа string явно заданна (в данном случае alphabet ), можно задать чтобы индекс первого элемента начинался не с 1 что по умолчанию для строк, а с 0. Или придется делать массив: array [0..31] of char = ('_тутсимволы_') ?

    Всего записей: 120 | Зарегистр. 08-01-2007 | Отправлено: 00:16 13-07-2010 | Исправлено: 4t, 00:21 13-07-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    4t
    Ну так бы сразу и сказал. Я думал у тебя массив строк или еще чего. А для отдельных символов есть такая функция. Pos называется.  
     
    function Pos(const substr: string; const str: string): Integer;  
     
    выдает порядковый номер вхождения символа или строки substr в строке str.  Короче, создай новый проект. Кинь на форму одну Button и один ListBox. Далее пишешь код  (после implementation) -
     

    Код:
     
    const
      alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
     
    function GetPosition(const letter:Char):Integer;
    begin
      Result := Pos(letter,alphabet);
    end;
     

     
    создаешь обработчик OnClick для Button'a и в нем пишешь -
     

    Код:
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      data : string;
      I: Integer;
    begin
      data := UpperCase('THIS IS A TEST'); //это если строка будет состоять из букв разных регистров
      for I := 1 to Length(data) do
        ListBox1.Items.Add(IntToStr (GetPosition(data[i])));
    end;
     
     

     
    P.S. ты алфавит не полный написал. Я дополнил. И еще можно сделать проверку на пробел - если пробел, то пропускать не выводить ничего. Можно вместо ListBox'a выводить в сообщении ShowMessage (правда, так много сообщений придется выводить .

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

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 01:26 13-07-2010 | Исправлено: Bonivur, 01:35 13-07-2010
    4t

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Код походу самое оно, то что доктор прописал, вечером опробую.  
     

    Цитата:
    P.S. ты алфавит не полный написал. Я дополнил.

    Не, это не опечатка, мне полный алфавит не нужен, такой как в примере. Переписываю код с С и столкнулся с такими загвоздками... Почему сразу на С не пишу, потому что не особо в нём рублю )
     
    А с этим что делать, критично чтоб индекс alphabet начинался с 0. Иначе много кода придется переделывать (.  
    4t

    Цитата:
    Константа или переменная типа string явно заданна (в данном случае alphabet ), можно задать чтобы индекс первого элемента начинался не с 1 что по умолчанию для строк, а с 0. Или придется делать массив: array [0..31] of char = ('_тутсимволы_') ?


    Всего записей: 120 | Зарегистр. 08-01-2007 | Отправлено: 12:50 13-07-2010
    Bonivur



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

    Цитата:
    А с этим что делать, критично чтоб индекс alphabet начинался с 0. Иначе много кода придется переделывать (.  

    Первый символ строки в Дельфи имеет индекс 1 и тут ничего не поделаешь. А зачем тебе нужно "переделывать много кода"? Ты загадками не говори, а лучше сразу поставь задачу - что надо сделать и зачем. Может есть способ, о котором ты даже и не догадываешься, и он в сто раз лучше. Правильно заданный вопрос и подробное описание задачи - способствует получению быстрого и точного ответа!  
     

    Цитата:
    Или придется делать массив: array [0..31] of char = ('_тутсимволы_') ?

    Что-то я такого массива не увидел в твоем коде. Для чего он? Для чего тебе нужно, чтобы индекс первого элемента начинался с нуля?

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

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 18:08 13-07-2010
    4t

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

    Цитата:
    Правильно заданный вопрос и подробное описание задачи - способствует получению быстрого и точного ответа!
     
    Эх, золотые слова.  Надо будет запомнить.
     
    4t

    Цитата:
    Или придется делать массив: array [0..31] of char = ('_тутсимволы_') ?

    Bonivur

    Цитата:
    Что-то я такого массива не увидел в твоем коде. Для чего он? Для чего тебе нужно, чтобы индекс первого элемента начинался с нуля?

    Я имел ввиду, что если нельзя объявить константу или переменную alphabet : 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' типа string с первым нулевым индексом, то можно сделать массив типа char с требуемыми символами и нулевым индексом: array [0..31] of char = (A,B,C,D,E,D и тд.)
    По поводу для чего нужен нулевой индекс. Как уже упомянул переписываю код с Си. В Си коде "alphabet" с нулевым индексом, с индексами далее идут мат. операции и следовательно, если будет сдвиг +1 - результат на выходе будет другой. И варианты решения 1.)установить "alphabet" с нулевым индексом, что гораздо проще 2.) добавить ко всем обращениям к "alphabet" и "ИндексПозицииСимвола" смещение -1, что гораздо геморней. Вот по-этому индекс и хочу нулевой )
     

    Всего записей: 120 | Зарегистр. 08-01-2007 | Отправлено: 00:14 15-07-2010
    EugeneBoss3



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Знатоки, помогите решить проблему. Для исключения мерцания пытаюсь по таймеру задержать отрисовку компонента, но не знаю как и в какой процедуре запустить таймер? У меня получается, что задержка срабатывает не ДО а ПОСЛЕ отрисовки компонента.
    Код Что я делаю не так?

    Всего записей: 247 | Зарегистр. 15-09-2009 | Отправлено: 02:15 15-07-2010
    Bonivur



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

    Цитата:
    Я имел ввиду, что если нельзя объявить константу или переменную alphabet : 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' типа string с первым нулевым индексом, то можно сделать массив типа char с требуемыми символами и нулевым индексом: array [0..31] of char = (A,B,C,D,E,D и тд.)

    Если ты сделаешь вместо строковой константы массив символов Char, то не сможешь прменить функцию Pos. Она работает со строками. А в твоем случае не придется добавлять по всему коду смещение -1. Достаточно добавить его в одном месте, в функции GetPostion (которую я давал выше)
     

    Код:
     
    function GetPosition(const letter:Char):Integer;
    begin
      Result := Pos(letter,alphabet)-1;
    end;
     

     
    как видишь теперь эта функция вернет для буквы 'A' (например) значение "0". Для "B" - 1. Для символа, которого нет в строковой константе она вернет  "-1" и.т.д. Думаю, это то, что тебе нужно.

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

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 09:24 15-07-2010 | Исправлено: Bonivur, 09:26 15-07-2010
    mdid

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    EugeneBoss3
    не совсем понятно что вы хотите сделать...как вариант перехватывать OnPaint компонента

    Всего записей: 1298 | Зарегистр. 13-02-2006 | Отправлено: 13:28 15-07-2010
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    >EugeneBoss3
    А что должен делать компонент? Из того куска кода, ничего не понятно.

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 14:14 15-07-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    4t
    На вашем месте я бы остановился на варианте с массивом. Тем более что вариант с простым циклом должен быть эффективнее в плане быстродействия чем функция Pos. Хотя вы вполне можете использовать и ее т. к. компилятор может спокойно преобразовать массив чаров в строку в коде типа "Pos('R', alphabet)".

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 00:12 16-07-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 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