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

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

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

    Цитата:
    могу порекомендовать список TStringList
    +1
    тогда для данных
    Цитата:
    Как бы теперь расчленить вот эту строку из масива  
    {92D58719-BBC1-4CC3-A08B-56C9E884CC2C},{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A},1  
    на отдельные элементы  
    {92D58719-BBC1-4CC3-A08B-56C9E884CC2C}  
    {D7BF3B76-EEF9-4868-9B2B-42ABF60B279A}  
    1  
    var SLData : TStringList;
    ... SLData.text := StringReplace(SLData.text, ',', #13#10,[rfReplaceAll]);
    ну и обработка

    Код:
     
    ... for i:=0 to (SLData.count div 3)-1 do
        payloadid := SLData.strings[i*3];  
        payloadidb := SLData.strings[i*3+1];  
        typeid := StrToIntDef(SLData.strings[i*3+2], 0);  
     


    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 10:52 09-08-2010 | Исправлено: greenpc, 11:07 09-08-2010
    Sergey_Demchuk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Поскольку в Дельфи 7 функции posex не оказалось,  я вот сделал так
     
    AssignFile(f, 'dependencies.txt');
    Reset(f);  // открыть для чтения
       // чтение из файла
    arr:=0; arrLength:=100; SetLength(myarr,100);
       while not EOF(f) do
         begin
            readln(f, buf);       // прочитать строку из файла
            myarr[arr]:=buf;
            if (arrLength-arr)<=1 then
              begin
              SetLength(myarr, arrLength+100);
              arrLength:=arrLength+100;
              end;
            arr:=arr+1;
            PP1:=Copy(buf,0,Pos(',',buf)-1);
            PP2:=Copy(buf,SymPos(buf,1)+1,SymPos(buf,2)-SymPos(buf,1)-1);
            PP3:=Copy(buf,SymPos(buf,2)+1,Length(buf)-SymPos(buf,2));
            Dependencies(PP1,PP2,StrToInt(PP3));
    //        ShowMessage(PP2);
         end;
    CloseFile(f); // закрыть файл
     
    где функция SymPos выглядит так (заменяет posex)
     
    function SymPos(str : String; posit:Integer) : integer;
    var
      i : integer;
      j : integer;
    begin
      result := 0;
      j := 0;
      for i := 0 to Length(str) do
      if str[i] = ',' then begin
          inc(j);
          if j = posit then begin
            result := i;
            break;
          end;
      end;
    end;
     
    Правда выполнение сего кода с занесением в базу (  Dependencies(PP1,PP2,StrToInt(PP3));  ) заняло аж минуту или более даже, многовато...

    Всего записей: 3551 | Зарегистр. 16-12-2002 | Отправлено: 12:14 09-08-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sergey_Demchuk
    Попробуйте вычислять результаты функций SymPos(buf,2) и SymPos(buf,1) только один раз за итерацию.
    Кроме того вы ведь сами управляете форматом своего файла. Можно сделать чтобы было по одному элементу в строке, тогда у вас будет три readln и ни одного Copy.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 12:39 09-08-2010 | Исправлено: Frodo_Torbins, 12:40 09-08-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sergey_Demchuk
    а зачем используется массив, если данные заносятся после парса из строчных переменных ?

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 13:06 09-08-2010
    ShIvADeSt



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

    Цитата:
    Кроме того вы ведь сами управляете форматом своего файла. Можно сделать чтобы было по одному элементу в строке, тогда у вас будет три readln и ни одного Copy.

    Можно использовать типизированный файл и будет 1 Read для каждой записи Или (что мне более нравится так как один фиг юзается БД) - загнать все эти параметры из текстового файла в таблицу - тогда скорость работы увеличится. Один раз отпарсить той же Дельфи текстовый файл, чтобы загнать в таблицу и потом наслаждаться скоростью.

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

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:45 10-08-2010
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    1. PosEx "лежит" в StrUtils
    2. Со строками нужно работать с 1 элемента, а не с 0
    3. Много время убивается на расширение массива
    4. Можно (если очень хочеться использовать массив, хотя ОН АБСОЛЮТНО тут не нужен) первой строкой записать количество элементов в массиве и сразу выставить размер.

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 13:04 10-08-2010
    greenpc

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

    Цитата:
    первой строкой записать количество элементов в массиве и сразу выставить размер
    Вы не правы. тогда уж

    Код:
    type
    TMyRec = record  
      S1, S2: string;
      S3 : integer;
     end;
    const
    MyRecs: array [0..<максзначение>] of TMyRec = (
    (S1: 'первое значение в строке';
    S2: 'второе значение';  
    S3: 5),
    ... и так далее
    );  
     
    for i:= low(MyRecs) to high(MyRecs) do
    Dependencies(ResRecs[i].S1, ResRecs[i].S2, ResRecs[i].S3);
     

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 14:52 10-08-2010 | Исправлено: greenpc, 14:53 10-08-2010
    salexn1



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

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 15:01 10-08-2010
    greenpc

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

    Цитата:
    речь велась про то, чтобы иметь в файле все данные

    посмотрите предыдущюю страницу- изначально данные были в программе

    Цитата:
    Если использовать динамичесике массивы, то лучше выставлять или весь размер
     
    если я знаю весь размер то зачем мне динамика ? учтите в динамике нет контроля за выходом за границы массива

    Цитата:
    или выделять память большими порциями

    сейчас это не актуально, а раньше часто можно было получить EOutOfMemory

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 15:15 10-08-2010 | Исправлено: greenpc, 15:17 10-08-2010
    Sergey_Demchuk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    А вообще кто то работал с базами sqlite? Я нашел готовый примерчик и делаю его под себя. Нужная база в формате sqlite у меня есть. Я что делаю, открываю ее Sqlite Expert, выбираю нужную таблицу и експортирую ее в текстовый файл. Данные сохраняются в файле в виде  
    {92D58719-BBC1-4CC3-A08B-56C9E884CC2C},{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A},1  
    Может конечно и быстрее будет напрямую переносить данные из существующей таблицы в новую, но я не знаю каким образом.

    Всего записей: 3551 | Зарегистр. 16-12-2002 | Отправлено: 15:25 10-08-2010
    greenpc

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

    Цитата:
    переносить данные из существующей таблицы в новую

    если один в один думаю так -
    Код:
    create table test_clon as select * from test

    но с потерей индексов, ключей ..

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 15:35 10-08-2010
    Sergey_Demchuk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Надо чтобы записи просто заменялм аналогичные если они есть либо перезаписывались. Но чтобы те что есть, оставались на месте. По твоему методу так работать будет?
    Я делаю так.
    ...
      sldb := TSQLiteDatabase.Create('cache.db');
      try
        if not sldb.TableExists('domain_data') then
           sldb.ExecSQL('CREATE TABLE domain_data (domain TEXT, subDomain TEXT, key TEXT, value TEXT)');
    ...
     
    А потом уже наполняю таблицу.
    ...
    procedure InsertTab (Domain: string; SubDom: string; key:string; val:string);
    begin
      sltb := sldb.GetTable('select domain from domain_data where subdomain="' + SubDom + '"' + ' and key="' + key + '"');
        if sltb.ColCount > 0 then
        begin
        sldb.ExecSQL('update domain_data set domain="' + Domain + '",subdomain="' + SubDom + '",key="' + key + '",value="' + val + '" where subdomain="' + SubDom + '" and  key="' + key + '"');
        end
        else
        begin
        sldb.ExecSQL('insert into domain_data (domain,subdomain,key,value) values("'+ Domain +'","' + subdom + '","' + key + '","' + val + '")');
        end;
        sltb.Free;
    end;
    ...
    InsertTab('1','922988070434023647144890','SLRTIME','2010-05-15T15:52:45Z')
     
    Добавлено:
    Да и еще, переносить таблицы надо из одной БД в другую БД, которую сотворяем где-либо, а не в пределах одной БД

    Всего записей: 3551 | Зарегистр. 16-12-2002 | Отправлено: 16:41 10-08-2010 | Исправлено: Sergey_Demchuk, 16:44 10-08-2010
    Granmer



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Есть приложение главное окно - вверху окно, под ним табшит с вкладками. Все дочерние окна - mdichild, каждому окну создаётся вкладка и при создании оно разворачивается во всю главную форму. Но при этом в главное меню программы добавляются кнопки "свернуть, восстановить, закрыть". А мне их не надо, точнее они даже мешают, т.к. кнопка закрыть окно есть на табшите. Подскажите, пожалуйста, как убрать из главного меню эти дополнительные кнопки от mdi-окон? Если существенно, то использую компоненты Developer Express. Поиск в гугле дал только код для убирания заголовка mdi-окна, но кнопки при этом всё-равно остаются.

    Всего записей: 236 | Зарегистр. 20-08-2003 | Отправлено: 17:57 10-08-2010
    Sergey_Demchuk



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

    Цитата:
    StrUtils

    Не смог подключить в свою Delphi7_Lite

    Всего записей: 3551 | Зарегистр. 16-12-2002 | Отправлено: 18:04 10-08-2010
    Czechoslovak



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Granmer
    установи BorderIcons biSystemMenu := False

    Всего записей: 175 | Зарегистр. 27-06-2007 | Отправлено: 18:40 10-08-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Granmer
    Зачем вам при таком раскладе вообще сдались MDI-формы? Их вполне можно заменить обычными, или даже фреймами.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 20:19 10-08-2010
    Granmer



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

    Цитата:
    установи BorderIcons biSystemMenu := False

    Установил, кнопки исчезли, но вместе с ними и возможность развернуть child-окно на весь экран тоже. Теперь при создании окна оно разворачивается на всё родительское, но при переключении с одного окна на другое - восстанавливаются в размере, как в design-time. При попытке вручную максимизировать - игнорирует.
    Frodo_Torbins
    Про фреймы много начитал в инете, пугают большими утечками памяти и глючностью работы. Решил не брать. А обычные формы тут, как мне кажется не очень удобно было бы приспособить... Хотя, может, я не умею их готовить. Если подскажете как их можно привязать к табшиту, чтобы было красиво и правильно буду признателен.

    Всего записей: 236 | Зарегистр. 20-08-2003 | Отправлено: 23:32 10-08-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sergey_Demchuk
    никогда не работал с SQLite, но задите на сайт. почитайте доку и увидите великолепную команду, которая решает все ваши проблемы
    _http://www.sqlite.org/lang_replace.html
    открываете всю таблицу с данными которые хотите занести и в новую таблицу

    Код:
    insert or replace into t (a, b, c) values ('a', 'b', 'c');

    не забудьте создать ункальный индекс (для вас по предыдущему посту он будет subdomain+key ... или так create unique index idx1 on t (subdomain, key);)

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 08:09 11-08-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Granmer
    Приблизительно так:
    Код:
      Form2 := TForm2.Create(Self);
      Form2.Parent := TabSheet1;
      Form2.WindowState := wsMaximized;
      Form2.BorderStyle := bsNone; //по желанию
      Form2.Show;
    Хотя я не в курсе ваших критериев удобства.
     
    добавлено:
    Czechoslovak
    У того компонента немного другая идеология. Там к стандартному MDI добавляется панелька с кнопками, которая позволяет переключатся между окнами. При этом все баги и причуды MDI полностью сохраняются.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 10:12 11-08-2010 | Исправлено: Frodo_Torbins, 10:19 11-08-2010
    Czechoslovak



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Granmer
    Ну так поставь форме свойство WindowsState := wsMaximized
     
    Кстати в соседней ветке тот же Frodo_Torbins предлагал  
     

    Цитата:
    Я вот когдато переделывал MDITab Michal Mutl-я: http://www.mikolatorbins.narod.ru/MDITab1.7.exe Компонент правда под AlphaControls заточен, но это легко исправить, достаточно в коде заменить TsCustomTabControl на TCustomTabControl и выкинуть ненужные юниты.


    Всего записей: 175 | Зарегистр. 27-06-2007 | Отправлено: 10:13 11-08-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