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

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

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

ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988

Цитата:
Переделал пример. Теперь нужно просто узнать сепаратор пункта меню.  

Меню динамически создаешь? Если нет, то я просто проверял ItemID и если он был айдишником разделителя, то рисовал разделитель. Так как у меня их было немного, то мне такой способ помог. Насчет полоски слева меню. А она и рисуется кусками для каждого пункта меню В свое время намучился с этой полоской - кстати совет (с этим столкнулся, когда запустил свою программу с другим разрешением), не используй констант при отрисовке пунтков, получай их в программе (в частности, высоту пункта меню).

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:29 30-08-2008
Maks150988



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

Код:
 
              ItemState := GetMenuState( GetMenu(hApp), lpdis.itemID, MF_BYPOSITION );
              if (ItemState and MFT_SEPARATOR <> 0) then
 

Чего-то не работает. Меню загружаю из ресурсов. У всех пунктов стиль овнердрав.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 12:40 30-08-2008
ShIvADeSt



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

Цитата:
 if (ItemState and MFT_SEPARATOR <> 0) then

Эммм попробуй так условие
if (ItemState and MFT_SEPARATOR) <> 0 then  
возможно что приоритет операций косячит
или вот еще код
   GetMenuItemInfo(Menu,i,true,mii);
 
    //Если разделитель, то ставим соответствующее название
    if (mii.fType and MFT_SEPARATOR) = MFT_SEPARATOR then
      Buff:= '[SEPARATOR]'#0;

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 13:29 30-08-2008
Maks150988



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

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 22:42 30-08-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988
Много косяков было, первое - если пункт меню не имеет текста (а это именно разделитель), то у тебя был выход из процедуры отрисовки пункта. Далее, ты пытался получить статус разделитель или не разделитель передавая в функцию GetMenuState ID иконки, но статус получал по позиции, а не по команде. Что конечно в корне не верно, плюс много мелких багов, когда ты рисуешь часть пункта, а потом поверх того, что уже отрисовал рисуешь что то другое. В общем вот рабочий код
Подробнее...
Я просто аккуратненько комментил сверху вниз, отслеживая - когда будут косяки. Дольше всего мучался с этим куском
ItemState := GetMenuState(GetMenu(hApp), lpdis.itemID, MF_BYPOSITION );
if (ItemState and MF_SEPARATOR =MF_SEPARATOR) then
пока внимательно не изучил, что передаешь и как И последний баг был убит.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 06:54 31-08-2008 | Исправлено: ShIvADeSt, 06:55 31-08-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Спасибо. Закомментировал только строки MoveToEx и LineTo (в самом конце кода прорисовки) чтобы линии повторно не рисовались для всех пунктов.
Тогда в догонку собственно еще хотелось бы знать, почему значок в пункте ListBox не отображается. Вместо него изредка мелькает какой-то неизвестный значок. Может нужно что-то ImageList для Listbox использовать? Код по ссылке.
http://webdrive.avtograd.ru/Download/Explorer/Download/listbox_test_draw.rar
P.S. Значок гружу в начале программы и при закрытии удаляю его. Пробовал каждый раз загружать значок при прорисовке - такая же ситуация - ничего не отображается.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 09:52 02-09-2008 | Исправлено: Maks150988, 09:53 02-09-2008
ShIvADeSt



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

Цитата:
Тогда в догонку собственно еще хотелось бы знать, почему значок в пункте ListBox не отображается. Вместо него изредка мелькает какой-то неизвестный значок. Может нужно что-то ImageList для Listbox использовать? Код по ссылке.  

Ай-я-я-яй, кто же догадался   ListIco    : hIcon; сделать локальной переменной? У тебя сразу после инициализации диалога она стала ссылаться хз куда.
Надо объявить тут
var
  hWndPls    : THandle;
 
  BeginDrag  : Integer;
  EndDrag    : Integer;
  IsDragging : Boolean = FALSE;
  DL_Message : DWORD;
  DragBuffer : Array [0..MAX_PATH - 1] of Char;
  DragCursor : hCursor;
  ListIco    : hIcon;
 
а в локальных переменных функции убрать ее, тогда все отлично работает. Красивенько все рисует
и еще, данное сравнение
lpdis.ItemID > -1
всегда истинно, так как ItemID по сути longword, то есть меньше нуля быть не может

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 11:41 02-09-2008 | Исправлено: ShIvADeSt, 11:42 02-09-2008
diodio



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Простите за идиотский вопрос, но все же)
Как при заполнении dbase-овской таблицы данными, обновлять таблицу после занесения каждой записи?
А то данные в таблице появляются только после завершения работы проги (или закрытия таблицы).

Всего записей: 111 | Зарегистр. 26-12-2006 | Отправлено: 12:37 02-09-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
diodio
По идее надо делать либо Refresh либо закрывать и открывать таблицу.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 13:48 02-09-2008
shulum



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
diodio
 
если делается прямо в эту таблицу - типа table.insert; .... table.post;
то, возможно, поможет помещение операций добавления в отдельный поток ..., а если данные попадают в результате каких либо сторонних действий - то только то что порекомендовал ShIvADeSt

Всего записей: 121 | Зарегистр. 11-06-2006 | Отправлено: 17:03 02-09-2008
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
diodio
Что стоит за словами "dbase-овской таблицы" , если файл  
- Paradox, все должно и так работать ошибка гдето в другом  
- если SQL база, то все зависит от используемых компонент доступа
...
В общем повтори вопрос, но подробно.

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 17:47 02-09-2008
Traestan

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
НАрод помогите плиз  
как в Delphi 7 определить кол-во совпадаюших элементов в 2-ух массивах одинаковой размерности! СРОчно !!

Всего записей: 10 | Зарегистр. 08-02-2008 | Отправлено: 20:39 02-09-2008
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Traestan
Вообще-то задание неполное. Например, может ли быть 3 или более совпадений (1 элемент в первом массиве равен 3-м элементам в другом) и как их считать: как одно совпадение или разные?
 
А вообще алгоритм простой:
Сначала отсортировать массивы.
Внутри цикла проверять на совпадение и увеличивать счетчик при выполнении условия.

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 20:48 02-09-2008
Traestan

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Массивы отсартированные и одинаковые такчто надо просто -Внутри цикла проверять на совпадение и увеличивать счетчик при выполнении условия.
А как ето сделать я не знаю!!
 
Добавлено:
Народ ну ктонибуть помогите сравнить два массива одинаковой размерности и найти кол-во совпадаюших элементов! Плиз срочно нада!!!

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
спасибо, как-то не подумал что-то я с этой переменной. Ну а собственно интересно, почему она в никуда при инициализации указывает-то? Вроде ж для функции диалога она, и при появлении диалога должна проиницализироваться. Что-то не пойму.
И кстати что можете посоветовать насчет двойной буферизации если конечно знаете как ее выполнить ну или кто-нибудь тут из собравшихся знает.
Есть код:

Код:
 
    WM_PAINT :
      begin
        GetClientRect(hWndApp, Rect);
        hdcWnd := BeginPaint(hWndApp, PS);
        hbmMem := CreateCompatibleBitmap(hdcWnd, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top);
        hdcMem := CreateCompatibleDC(hdcWnd);
        hbmWnd := SelectObject(hdcMem, hbmMem);
        BitBlt(hbmWnd, 0, 0, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, hdcMem, 0, 0, SRCCOPY);
        SelectObject(hdcMem, hbmWnd);
        DeleteObject(hbmMem);
        DeleteDC(hdcMem);
        EndPaint(hWndApp, PS);
      end;
 

Ну и WM_ERASEBKGND False возвращает. Вроде бы все правильно делаю, а толку ноль. Окно мерцает сильно. Как жеж вообще забуферизировать окно целиком?

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 22:34 02-09-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не туда делаешь BitBlt. Вот код с инета, я в свое время так же делал отрисовку окна, мерцания не было.  
case WM_PAINT:

Код:
 
          hDC = BeginPaint(hDlg,&ps);
          GetClientRect(hDlg,&rect);
         
          hdcMem = CreateCompatibleDC(hDC);
          hbmMem = CreateCompatibleBitmap(hDC,rect.right,rect.bottom);
          hold = SelectObject(hdcMem,hbmMem);
          BitBlt(hdcMem ,0,0,rect.right,rect.bottom,hDC,0,0,SRCCOPY);// копирование фона в hdcMem
           Рисую уже в hdcMem
           ..................................
           ...................................
          после рисования в hdcMem Вывожу содержимое на экран
 
          BitBlt(hDC,0,0,rect.right,rect.bottom,hdcMem,0,0,SRCCOPY);
 
     SelectObject(hdcMem,hold);
     DeleteObject(hbmMem);
     DeleteObject(hdcMem);
 


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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:09 03-09-2008 | Исправлено: ShIvADeSt, 03:11 03-09-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята, подскажите, как можно передать именованные константы в функцию, которая требует параметров типа OleVariant, если они другого типа, например, integer?

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 02:42 04-09-2008
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DmitryKz
Параметры OleVariant объявлены как var? Описать переменную типа OleVariant, присвоить ей значение константы и передать в функцию.
Если не так понял - напиши как у тебя константы описаны и как заголовок функции выглядит.

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 07:56 04-09-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да в принципе ты все правильно пишешь. Код:

Цитата:
interface
uses Word_TLB;
...
implementation
const
wdBrowseHeading = 9;
wdParagraph = 4;
wdExtend = 1;
...
function CreateSectionsList(PWordApp: WordApplication): Boolean;
 
begin
  PWordApp.Selection.Start := 0;
  PWordApp.Selection.End_ := 0;
  PWordApp.Browser.Target := wdBrowseHeading;
  PWordApp.Browser.Next;
  PWordApp.Selection.MoveDown(wdParagraph, 1, wdExtend);
...

В сгенерированном средой модуле Word_TLB функция MoveDown описывается как:

Цитата:
unit Word_TLB;
...
function MoveDown(var Unit_: OleVariant; var Count: OleVariant; var Extend: OleVariant): Integer; safecall;

Через IDispatch (позднее связывание) работать не хоу - никакого контроля типов при вводе кода. Просто некоторые функции требуют не одного, не двух параметров и вводить буферные переменный и назначать им каждый раз значения констант для передачи в параметры, тоже как-то не особо хотца. Ну раз другого пути нет...

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 09:27 04-09-2008
diodio



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
2 V1s1ter
 
Таблица парадоксовская.
 Вот
Код:
 
    Table2.append;
    Table2.fieldbyname('IM_FILE').asString:=SearchRec.name;
    Table2.fieldbyname('NOMER_KSA').asString:=s3;
    Table2.fieldbyname('VIG_N').asString:='GOOD';
    Table2.fieldbyname('DATE').AsDateTime := now;
    Table2.fieldbyname('DATE_FILE').AsDateTime := StrToDate(s+'.'+s2);
    Table2.fieldbyname('OTDELEN').asString:=s5;
    Table2.fieldbyname('FROM').asString:=Dir;
    Table2.post;  

 
Добавляю
Код:
 
   Table2.Active := false;  
   Table2.Active := true;  

 - все пашет. Но это не правильно как-то, моя думай )

Всего записей: 111 | Зарегистр. 26-12-2006 | Отправлено: 13:32 04-09-2008
   

Страницы: 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 (все версии) - часть 4
ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru