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

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

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

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

ShIvADeSt



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

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

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

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Разобрало любопытство. Сделал пример по твоему самому первому сценарию. Результат:
    (кол-во хэндлов/кол-во потоков)
    1. 58/1
    2. 59/2
    3. 58/2
    4. 58/2
    5. 61/2 (вызов MessageBox дает нам прирост кол-ва хэндлов в кол-ве 3 штук, причем стабильно. Вероятно, так устроена эта ф-ция)
    6. 58/1
    Иногда если долго не нажимать ОК в MessageBox, то на выходе один хэндл остается не освобожденным, в итоге, например, у меня в п.6 получилось бы 59/1. Но откуда у тебя берутся лишние ~100 штук, мне непонятно.  
    Мне кажется, дело не в работе с отдельной нитью.
    Попробуй сделать то же самое в основном потоке. Интересно, как быдет обстоять дело в этом случае с хэндлами...
     
     
     
    Добавлено:
    И, в принципе, я склонен считать, что Odysseos прав, говоря, что эти хэндлы резирвируются ф-циями API по мере необходимости точно так же как это делает MessageBox. Вот я например, никогда раньше и не догадывался, что MessageBox создает аж 3 хэндла...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 16:30 05-11-2009
    jupiter1976



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Пишу курсовой, помогите плиз найти ошибку. Программа выдает ошибку invalid pointer operation  
     
    в прикрепленном файле проект Скачать файл Делфи.zip

    Всего записей: 201 | Зарегистр. 01-04-2006 | Отправлено: 17:39 05-11-2009 | Исправлено: jupiter1976, 17:40 05-11-2009
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
     
    Ну, с MessageBox-то всё понятно - само окно, кнопка и static text
     
    Добавлено:
    jupiter1976
     
    А в какой момент она её выдаёт? Какие параметры вводить-то надо, чтоб ошибку словить?

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 18:33 05-11-2009
    Aleksandr N

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

    Цитата:
    Попробуйте перед отменой установить ClientDataSet.FileName := '';

    По моему не очень хороший метод, хотя может сработать. А ещё мнения есть???

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 18:39 05-11-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jupiter1976
    Во-первых, в динамических массивах, память под которые выделяется ф-цией SetLength, первый элемент массива имеет индекс 0, последний - N-1, где N - колличество элементов массива
    Во-вторых, после выделения памяти с использованием SetLength, тебе нет необходимости в месте с переменной типа динамический массив передавать в вспомогательные ф-ции еще и размерность массива - максимальный индекс можно определить как High(MyArray), а размерность массива = High(MyArray)+ 1.
    В силу всего сказанного, у тебя везде по тексту идут циклы начиная со второго элемента массива (имеющего индекс 1) и заканчивая несуществующим элементом массива имеющим якобы индекс N (фактически по счету это элемент N+1, под который ты память не распределял!!!), вот тут то и происходит обращение не к твоей памяти, причем компилятор не сразу замечает это...
    Как надо (фрагмент):

    Код:
     
    procedure pol(var a:Tmas);
    var i:integer;
    begin
    randomize;
      for i:=0 to High(a) do
      begin
        a[i]:=random(100)-50;
        {edit4.text:=edit4.text+' '+inttostr(a[i]);
        edit5.text:=edit5.text+' '+inttostr(a[i]); }
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var M:Tmas; i,k:integer;
    begin
      k:=strtoint(edit1.Text);
      setlength(M,k);  
    // после этой строки кол-во элементов массива массива = High(M)+ 1, а максимальный индекс элемента = High(M)
      edit4.Text:='';
      pol(M);
      for i:=0 to High(M) do
        edit4.text:= edit4.text+' '+inttostr(M[i]);
      edit2.Text:='';
      edit3.Text:='';
      puzbIrek(M);
      for i:=0 to High(M) do
        edit2.Text:=edit2.text+' '+inttostr(M[i]);
    end;
     

     
    Добавлено:
    Odysseos
    С MessageBox-то и правда всё понятно просто не задумывался... Хотя тоже... один хэндл из трех иногда не освобождается, по крайней мере, сразу... Но как я говорил, легко убедиться, виновата ли  работа с нитями или нет, попробовав сделать все в основном потоке и проверив, как оно там с хэндлами

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 19:21 05-11-2009 | Исправлено: psa1974, 19:22 05-11-2009
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
    Odysseos
    Да, походу идет резервирование под нужды WinInet. Ну да ладно, главное что при многократном запуске потока дескрипторы как грибы после дождя не растут, сносно вобщем.
     
    Предлагаю решить такую задачку, коль ранее речь зашла про апи (CreateThread заместо BeginThread), значит знаете наверняка и сталкивались, а не толкьо по компонентам лазиете...
    http://webdrive.avtograd.ru/Download/Explorer/CHECKEDLISTBOX.zip
    Вобщем мне необходимо прикрутить к ListBox всплывающую подсказку. Вроде прикрутил, работает, слава яйцам и гуглкоду как говориться. Но есть одна проблема. вот не могу установить вреям задержки через TTM_SETDELAYTIME, почему-то не работает для такого тултипа (нашел сообщение TTN_SHOW в Wm_Notify, но надо как-то наподобие Sleep туда забабахнуть чтобы все не приостанавливалось в отрисовке, но это самый крайний тупой вариант что я смог придумать). Ну и есть неприятный осадок - когда курсор на окне подсказки, то если щелкнуть левой кнопкой мыши по окну подсказки получим сплэш основного окна - потеря и восстановление фокуса - как следствие моргание. Но что интересно при щелчке правой кнопки мыши для вызова контекстного меню (ну я еще прикрутил туда выделение строки как-будто левой кнопкой жмем) такого не происходит. Как побороть эту напасть, что-то очень непонятное.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 20:04 05-11-2009
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Скажите, если у 7z архива другое расширение, то как я смогу однозначно определить, что это именно 7z архив? Достаточно ли для этого только первых двух байтов в файле - "7z"? В смысле, в общем случае, конечно, не достаточно, но что можно применить для уверенности? Сорри, что здесь запостил, но может кто на Дельфи уже это решал.

    Всего записей: 3144 | Зарегистр. 29-09-2005 | Отправлено: 20:47 05-11-2009 | Исправлено: DmitryKz, 20:52 05-11-2009
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
     
    Тут я пас. Я из WinAPI использую именно ядерные функции, а не оконные. Ну, то есть, оконные, конечно, тоже - но по крайней необходимости, в силу их запутанности и непрозрачности для моей думалки.

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 20:49 05-11-2009
    volser

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    Чем плох метод?
     
    DmitryKz
    Сигнатура 7z (4 байта): 0x37 0x7A 0xBC 0xAF

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 20:54 05-11-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Не, это сильно напрягаться нада... Масштаб вопроса великоват... Поиграться готовыми окнами через WinAPI - запросто, а вот писать или разгребать уже написанные окна и проги на чистом WinAPI - неа. Задача минимизации размера приложения как бы никогда передо мной не стояла, и я для себя не вижу повода не использовать VCL (ну разве где-то что-то причесать, подточить, подкрутить).

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 21:36 05-11-2009
    Maks150988



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

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 22:58 05-11-2009
    Aleksandr N

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

    Цитата:
    Чем плох метод?  

    До в принципе ни чем, только есть пару мест где данный способ точно не сработает, точнее неприемлем.

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 00:46 06-11-2009
    RzIzX

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

    Всего записей: 40 | Зарегистр. 27-01-2009 | Отправлено: 10:47 06-11-2009
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RzIzX
     
    А в каком виде эти формулы в БД хранятся?

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 10:50 06-11-2009
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RzIzX
    Думаю, это поможет Модули для рисования математических формул
    Но формулы придется переделать под специальный синтаксис описания формул.

    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 10:55 06-11-2009
    RzIzX

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В любом каком нужно будет ... а вообще текст
     
    Добавлено:
    data man
     
    Но как я понимаю... для отображения одной формулы надо размещать 1 компонент... НО ) подсчитав их надо 180 шт ...

    Всего записей: 40 | Зарегистр. 27-01-2009 | Отправлено: 10:56 06-11-2009
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RzIzX
    Посмотрите исходники demo, почитайте комментарии к статье - там уже все обсуждалось.

    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 11:04 06-11-2009
    Andryshok



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    как сделать такое:
    Как сортировать в дочернем Table, если у него уже задано свойство
    IndexNames и MasterField
    В результате смены индекса в IndexNames меняется значение и в MasterField, например:
    IndexNames= Index1;
    MasterField=Имя_поля1(Index1)->Имя_поля(родительского Table);Меняем Index1 на Index2:
    IndexNames= Index2;
    MasterField=Имя_поля2(Index2)->Имя_поля(родительского Table);И в результате в DBGrid’e пусто!
    Оно-то может и сартируется правильно, только я этого не вижу.  
    Как правильно сортировать?  
    Заранее благодарствую! Query использовать низя

    Всего записей: 649 | Зарегистр. 03-06-2009 | Отправлено: 11:05 06-11-2009
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Скажите, как узнать, что программа запущена из-под сеанса, имеющего административные привилегии? Погуглив, мне встретился такой код:
    Код:
    type  
      PTOKEN_GROUPS = TOKEN_GROUPS^;  
     
    function RunningAsAdministrator(): Boolean;  
    var  
      SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY;  
      psidAdmin: PSID;  
      ptg: PTOKEN_GROUPS = nil;  
      htkThread: Integer; { HANDLE }  
      cbTokenGroups: Longint; { DWORD }  
      iGroup: Longint; { DWORD }  
      bAdmin: Boolean;  
    begin  
      Result := false;  
      if not OpenThreadToken(GetCurrentThread(), // get security token  
        TOKEN_QUERY, FALSE, htkThread) then  
        if GetLastError() = ERROR_NO_TOKEN then  
        begin  
          if not OpenProcessToken(GetCurrentProcess(),  
            TOKEN_QUERY, htkThread) then  
            Exit;  
        end  
        else  
          Exit;  
     
      if GetTokenInformation(htkThread, // get #of groups  
        TokenGroups, nil, 0, cbTokenGroups) then  
        Exit;  
     
      if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then  
        Exit;  
     
      ptg := PTOKEN_GROUPS(getmem(cbTokenGroups));  
      if not Assigned(ptg) then  
        Exit;  
     
      if not GetTokenInformation(htkThread, // get groups  
        TokenGroups, ptg, cbTokenGroups, cbTokenGroups) then  
        Exit;  
     
      if not AllocateAndInitializeSid(SystemSidAuthority,  
        2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,  
        0, 0, 0, 0, 0, 0, psidAdmin) then  
        Exit;  
     
      iGroup := 0;  
      while iGroup < ptg^.GroupCount do // check administrator group  
      begin  
        if EqualSid(ptg^.Groups[iGroup].Sid, psidAdmin) then  
        begin  
          Result := TRUE;  
          break;  
        end;  
        Inc(iGroup);  
      end;  
      FreeSid(psidAdmin);  
    end;

     
    Но он будто выдран откуда-то. Какие модули требует непонятно (ссылается на неопределенные идентификаторы). Посоветуйте, что еще можно использовать.

    Всего записей: 3144 | Зарегистр. 29-09-2005 | Отправлено: 15:19 06-11-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    Проверить, имеем ли мы в системе права администратора:

    Код:
     
    const
       SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
         (Value: (0, 0, 0, 0, 0, 5));
       SECURITY_BUILTIN_DOMAIN_RID = $00000020;
       DOMAIN_ALIAS_RID_ADMINS = $00000220;
     
     function IsAdmin: Boolean;
     var
       hAccessToken: THandle;
       ptgGroups: PTokenGroups;
       dwInfoBufferSize: DWORD;
       psidAdministrators: PSID;
       x: Integer;
       bSuccess: BOOL;
     begin
       Result   := False;
       bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
         hAccessToken);
       if not bSuccess then
       begin
         if GetLastError = ERROR_NO_TOKEN then
           bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
             hAccessToken);
       end;
       if bSuccess then
       begin
         GetMem(ptgGroups, 1024);
         bSuccess := GetTokenInformation(hAccessToken, TokenGroups,
           ptgGroups, 1024, dwInfoBufferSize);
         CloseHandle(hAccessToken);
         if bSuccess then
         begin
           AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
             SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
             0, 0, 0, 0, 0, 0, psidAdministrators);
           {$R-}
           for x := 0 to ptgGroups.GroupCount - 1 do
             if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
             begin
               Result := True;
               Break;
             end;
           {$R+}
           FreeSid(psidAdministrators);
         end;
         FreeMem(ptgGroups);
       end;
     end;
     
     procedure TForm1.Button1Click(Sender: TObject);
     begin
       if isAdmin then
         ShowMessage('Logged in as Administrator');
     end;
     

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 15:43 06-11-2009
       

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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru