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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Имеется процедура, которая активируется при нажатии на кнопку. Процедура рисует 3 прямоугольника и заполняет Label каким то числом. Лейблы находятся внутри прямоугольников, т.е. и числа получаются внутри них.
     
    Пример:
    http://www.valar.ru/gallery/0512/12.png
     

    Цитата:
     
    Код:
    procedure TForm1.Button1Click(Sender: TObject);
    var ...
    begin
    .....
     
    PaintBox1.Canvas.Rectangle(40,60,100,90);  //1-й квадрат
    Label1.Caption:=IntToStr(a[1]);
     
    PaintBox1.Canvas.Rectangle(245,60,300,90);  //2-й квадрат
    Label2.Caption:=IntToStr(a[1]);
     
    PaintBox2.Canvas.Rectangle(10,110,50,140);  //3-й квадрат
    Label3.Caption:=IntToStr(a[1]);
    end;
     

     
    Что нужно:
    С помощью Ttimer сделать задержку появления квадратов и чисел. Т.е.  сначала появляется первый квадрат и число в label1, затем идет задержка, потом появлется второй квадрат и число в label2, затем задержка, потом появляется третий квадрат и число в label3.
     
    Подскажите пожалуйста, как это выполнить. Т.к. с Ttimer еще не работал =(
    Желательно показать в коде.
     
    p.s. еще подскажите, если такая процедура для полной очистки рабочей области PaintBox.

    Всего записей: 43 | Зарегистр. 26-11-2011 | Отправлено: 23:42 13-05-2012
    Corsairs

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Думаю, проще будет сделать задержку с помощью sleep() Или обязательно надо через таймер?
     
    Просто если делать через Ttimer - тогда надо перенести отрисовку в обработчик таймера, и организовать выбор...

    Всего записей: 569 | Зарегистр. 30-06-2006 | Отправлено: 00:30 14-05-2012
    Simkara

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

    Всего записей: 43 | Зарегистр. 26-11-2011 | Отправлено: 07:42 14-05-2012
    Kmich



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Simkara
    проще сделать 3 таймера (если конечно можно) и в каждом по времени настроить время типа в первом 1000 (1с), втором 3000 (3с) и третьем 5000 (5с).
     
    Если время через которое показывать одинаково то можно сделать в таком виде (при условии что Caption у всех Label будет изначально пустым в начале работы или при новом нажатии на кнопку)
     
    procedure TfrmMain.Timer1Timer(Sender: TObject);
    begin
      timer1.enabled:=false;
      if  Label1.Caption='' then
      begin
        PaintBox1.Canvas.Rectangle(40,60,100,90);  //1-й квадрат  
        Label1.Caption:=IntToStr(a[1]);  
        timer1.enabled:=true;  
      end;
      if  Label2.Caption='' then
      begin
       PaintBox1.Canvas.Rectangle(245,60,300,90);  //2-й квадрат  
       Label2.Caption:=IntToStr(a[1]);  
       timer1.enabled:=true;  
      end;
      if  Label3.Caption='' then
      begin  
       PaintBox2.Canvas.Rectangle(10,110,50,140);  //3-й квадрат  
       Label3.Caption:=IntToStr(a[1]);  
      end;
    end;
     
    а на кнопку навесить  
       timer1.enabled:=true;  
     
    Можно даже время для прорисовки каждого прямоугольника указать если указать его в timer1.interval перед включение таймера timer1.enabled:=true;

    Всего записей: 192 | Зарегистр. 21-01-2005 | Отправлено: 09:00 14-05-2012 | Исправлено: Kmich, 09:04 14-05-2012
    Simkara

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Нет, таймер должен быть один. Т.к. я написал задачку для примера, на самом деле в моей задачке все сложнее и этим методом потребует 52 таймера. А это как то не айс.

    Всего записей: 43 | Зарегистр. 26-11-2011 | Отправлено: 12:07 14-05-2012 | Исправлено: Simkara, 12:08 14-05-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Simkara
    А ничего что квадраты сотрутся как только вы свернете-развернете окно?

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 12:27 14-05-2012
    Eternal_Shield

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Simkara
    Заведите глобальную переменную (пусть будет ShowStage). Пофиг где: в классе или, прям так, в implementation; Пусть она будет отражать текущюю стадию или шаг, без разницы. Не забудьте проинициализировать её нулём, ибо в примере всё с нуля;
     
    И в таймере, соотв., обрабатывайте стадию. После прохождения стадии, инкремент ShowStage. Что-то типа:
     

    Код:
     
    procedure TForm234234.Timer....;
    begin
      case ShowStage of
        0: begin
           { рисуем первый квадрат }
           PaintBox1.Canvas.Rectangle(40,60,100,90);  //1-й квадрат  
           Label1.Caption:=IntToStr(a[1]);
     
           Inc(ShowStage);
        end; // 0
        // =====================
        1: begin
           { рисуем первый и второй квадраты }
           PaintBox1.Canvas.Rectangle(40,60,100,90);  //1-й квадрат  
           Label1.Caption:=IntToStr(a[1]);  
       
           PaintBox1.Canvas.Rectangle(245,60,300,90);  //2-й квадрат  
           Label2.Caption:=IntToStr(a[1]);
     
           Inc(ShowStage);
        end; // 1
        // =====================
        2: begin
           { рисуем  все квадраты }
           PaintBox1.Canvas.Rectangle(40,60,100,90);  //1-й квадрат  
           Label1.Caption:=IntToStr(a[1]);  
       
           PaintBox1.Canvas.Rectangle(245,60,300,90);  //2-й квадрат  
           Label2.Caption:=IntToStr(a[1]);  
       
           PaintBox2.Canvas.Rectangle(10,110,50,140);  //3-й квадрат  
           Label3.Caption:=IntToStr(a[1]);
        end; // 2
        // =====================
      end; // case ShowStage of
    end;
     

     
    В итоге всё будет работать и, даже, перерисовываться; То, о чём написал Frodo_Torbins слегка упростится до моргания; Надеюсь идея ясна, а с оптимизировать сами сможете;
     
    А да, таймер не выключайте, а то всё сделается так, как сказал Frodo_Torbins.
     
     
    З.Ы: когда уже на этом форуме появится нормальная подсветка синтаксиса?!

    Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 15:11 14-05-2012 | Исправлено: Eternal_Shield, 15:18 14-05-2012
    SevereK20

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Может кто-нибудь подскажет. В D7 требуется идея для реализации следующего... Есть карта города, которую надо разрезать на районы (разрезается в фотошопе). Далее картинки вставляются в проект в D7 и требуется, чтобы по нажатию на каждую область открывалась форма с данными по этой области. Основная загвоздка в том, что края областей - не ровные линии, а зигзагообразные.. а картинка вставляется как прямоугольник... и идет наложение одних областей на другие... может компонент специальный есть для подобного?..

    Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 15:12 14-05-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SevereK20
    Есть: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1386

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 18:12 14-05-2012
    SevereK20

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

    Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 18:16 14-05-2012
    Simple Crypt



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Камрады, вопрос такой.
     
    Access2010 MDB с 2-мя таблицами, Delphi7
    SQL-запрос следующий:
     
    UPDATE file_org1 SET [full] = true
    WHERE file_org1.name_file in (
    SELECT file_org1.name_file FROM file_org1, answer_org2  
    WHERE (file_org1.id=answer_org2.org1_file) and (answer_org2.full=true)
    GROUP BY file_org1.name_file HAVING count(file_org1.name_file)=2);
     
    Суть такова - заполнить поле Full каждой строки таблицы file_org1 в случае, если в связаной таблице file_org2 для этой строки таблицы1 есть 2 строки с заполненными полями full.
     
    Как-то так...
     
    А проблема в том, что в Дельфи вот этот кусок
    "WHERE (file_org1.id=answer_org2.org1_file) and (answer_org2.full=true)"
    не хочет отрабатываться. "Неопознанная ошибка".
     
    А из самого Access - всё отлично работает.
    Как и что можно изменить?

    Всего записей: 73 | Зарегистр. 21-10-2003 | Отправлено: 13:30 16-05-2012 | Исправлено: Simple Crypt, 13:31 16-05-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Simple Crypt
    Это же у вас неявный джойн, возможно парсер используемых вами компонент на нем спотыкается. Попробуйте переделайте его на явный.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 15:03 16-05-2012
    Simple Crypt



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

    Цитата:
    Это же у вас неявный джойн, возможно парсер используемых вами компонент на нем спотыкается. Попробуйте переделайте его на явный.

     
    Например? SQL-лем занимаюсь настолько редко...

    Всего записей: 73 | Зарегистр. 21-10-2003 | Отправлено: 15:29 16-05-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Simple Crypt
    Приблизительно так (внутений запрос):
    Код:
    SELECT file_org1.name_file  
    FROM file_org1 INNER JOIN answer_org2 ON file_org1.id=answer_org2.org1_file
    WHERE answer_org2.full=true
    GROUP BY file_org1.name_file  
    HAVING count(file_org1.name_file)=2
    Правда вживую этот вариант я не проверял.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:00 16-05-2012 | Исправлено: Frodo_Torbins, 16:01 16-05-2012
    Simple Crypt



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Та же ошибка.
     
    Строка подключения:
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sDBName + ';Persist Security Info=False;Jet OLEDB:Database Password=xxx'

    Всего записей: 73 | Зарегистр. 21-10-2003 | Отправлено: 16:25 16-05-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Simple Crypt
     
    ParamCheck попробуйте отключить

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 16:29 16-05-2012
    Simple Crypt



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

    Всего записей: 73 | Зарегистр. 21-10-2003 | Отправлено: 14:12 17-05-2012
    diodio



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Добрый день.
    Подскажите, пожалуйста, можно ли как-то быстро удалить n записей в таблице?
    У меня древние DBF-ки через BDE.
    Запрос

    Код:
    Query1.SQL.Clear;
    Query1.SQL.Add(Delete from table_name where zn1 = :param1 and zn2 = :param2);
    Query1.ExecSQL;
    Query1.Close;
     
    выполняется ну оооооооооочень долго, т.к. в таблице порядка нескольких миллионов записей, а удалить тоже нужно под миллион.

    Всего записей: 111 | Зарегистр. 26-12-2006 | Отправлено: 20:58 17-05-2012 | Исправлено: diodio, 20:59 17-05-2012
    Varenik



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    diodio
    а по полю zn1 Индекс есть?

    ----------
    Если нравится, считайте, что получилось…

    Всего записей: 1766 | Зарегистр. 21-07-2001 | Отправлено: 21:35 17-05-2012
    diodio



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Да, создавал так:

    Код:
     
      Table1.Active:=False;
      Table1.Exclusive:=True;
      Table1.Active:=True;
      Table1.AddIndex('ind','zn',[]);
      Table1.Open;

     
    P.s. Может оптимально будет перенести в другую БД, там обработать и вернуть на место? Просто эти данные каждую неделю приносит организация - было бы один раз, поставил бы на ночь и забыл.

    Всего записей: 111 | Зарегистр. 26-12-2006 | Отправлено: 23:57 17-05-2012 | Исправлено: diodio, 00:01 18-05-2012
    Открыть новую тему     Написать ответ в эту тему

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