Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

БезТемы

397
21 июля 2007 года
SergPas
527 / / 03.02.2007
Первый вопрос: Почему при попытке вывести надписи на кнопках панели инструментов выводится примерно следующее:
«New», «яяяя», «Open», «Save», «Cut», «яяяя», «Copy», «Paste», «Stat»
Должно быть так:
«New», «Open», «Save», «Cut», «Copy», «Paste», «Stat», «Freq», «Exit».
Код написан на Delphi и имеет следующий вид:
Код:
Var str:array[0..8] of string=('New', 'Open', 'Save',
                                'Cut', 'Copy','Paste',
                                'Stat', 'Freq', 'Exit');
i:integer;
ToolBar:HWND;
tbb:array[0..11] of TTBBUTTON;
function WndProc(wnd:HWND; msg, wParam, lParam:longint):longint; stdcall;
begin
case msg of
WM_CREATE: begin
                           //заполняю массив типа TTBBUTTON
                         tbb[0].iBitmap:=0;
                         tbb[0].idCommand:=101;
                         tbb[0].fsState:=TBSTATE_ENABLED;
                         tbb[0].fsStyle:=TBSTYLE_BUTTON;
                         tbb[0].iString:=0;

                         tbb[1].iBitmap:=1;
                         tbb[1].idCommand:=102;
                         tbb[1].fsState:=TBSTATE_ENABLED;
                         tbb[1].fsStyle:=TBSTYLE_BUTTON;
                         tbb[1].iString:=1;

                         tbb[2].iBitmap:=2;
                         tbb[2].idCommand:=103;
                         tbb[2].fsState:=TBSTATE_ENABLED;
                         tbb[2].fsStyle:=TBSTYLE_BUTTON;
                         tbb[2].iString:=2;

                         tbb[3].fsStyle:=TBSTYLE_SEP;

                         tbb[4].iBitmap:=3;
                         tbb[4].idCommand:=109;
                         tbb[4].fsState:=TBSTATE_ENABLED;
                         tbb[4].fsStyle:=TBSTYLE_BUTTON;
                         tbb[4].iString:=3;

                         tbb[5].iBitmap:=4;
                         tbb[5].idCommand:=110;
                         tbb[5].fsState:=TBSTATE_ENABLED;
                         tbb[5].fsStyle:=TBSTYLE_BUTTON;
                         tbb[5].iString:=4;

                        tbb[6].iBitmap:=5;
                        tbb[6].idCommand:=111;
                        tbb[6].fsState:=TBSTATE_ENABLED;
                        tbb[6].fsStyle:=TBSTYLE_BUTTON;
                        tbb[6].iString:=5;

                        tbb[7].fsStyle:=TBSTYLE_SEP;

                        tbb[8].iBitmap:=6;
                        tbb[8].idCommand:=115;
                        tbb[8].fsState:=TBSTATE_ENABLED;
                        tbb[8].fsStyle:=TBSTYLE_BUTTON;
                        tbb[8].iString:=6;

                        tbb[9].iBitmap:=7;
                        tbb[9].idCommand:=116;
                        tbb[9].fsState:=TBSTATE_ENABLED;
                        tbb[9].fsStyle:=TBSTYLE_BUTTON;
                        tbb[9].iString:=7;

                        tbb[10].fsStyle:=TBSTYLE_SEP;

                        tbb[11].iBitmap:=8;
                        tbb[11].idCommand:=107;
                        tbb[11].fsState:=TBSTATE_ENABLED;
                        tbb[11].fsStyle:=TBSTYLE_BUTTON;
                        tbb[11].iString:=8;
                 //Далее создаю панель инструментов
                 ToolBar:=CreateToolBarEx(wnd, WS_CHILD or WS_VISIBLE or
                                                    TBSTYLE_TOOLTIPS or WS_DLGFRAME
                                    or CCS_ADJUSTABLE, 1, 6, hInstance, 1000, @tbb,   12, 16, 16, 16, 16,
                                    SizeOf(TTBBUTTON));
                //И только теперь добавляю надпись к кнопкам
              for i:=0 to 8 do
              SendMessage(ToolBar, TB_ADDSTRING, 0, longint(PAnsiChar(str)));
                           end;
end;
end;

Все попытки исправить надписи ни к чему не привели! В частности пробовал объявить массив str следующим образом:
 
Код:
Var str:array[0..11] of string=('New', 'Open', 'Save',’’,
                                                 'Cut', 'Copy','Paste',’’,
                                                 'Stat', 'Freq', ‘ ‘, 'Exit');
…………….
for i:=0 to 11 do
SendMessage(ToolBar, TB_ADDSTRING, 0, longint(PAnsiChar(str)));

Но и это не привело к ожидаемому результату!
И второй вопрос: панель инструментов считается не клиентской частью окна или клиентской? Каким образом можно получить координаты курсора мыши над панелью инструментов при щелчке на ней правой кнопкой мыши? Пробовал писать следующее:
Код:
Var xPos, yPos: integer;
Function WndProc(wnd:HWND; msg, wParam, lParam:longint):longint; stdcall;
Begin
case msg of
WM_NCRBUTTONDOWN: begin
                  xPos:=PPoint(lParam).X;
                  yPos:=PPoint(lParam).Y;
                  end;
case PNMTOOLBAR(lParam).hdr.code of
           NM_RCLICK: TrackPopupMenu(PopupMenu, 0, xPos, yPos, 0, wnd, nil);
end;
end;
end;

При щелчке правой кнопкой мыши по панели инструментов показывается контекстное меню с координатами (0;0); а если щёлкнуть по главному меню появляется ошибка «Exception EAccessViolation in module ‘Project1.exe’ at 000091CF». Что я делаю неправильно?
247
21 июля 2007 года
wanja
1.2K / / 03.02.2003
?????
19K
21 июля 2007 года
Rost
45 / / 05.07.2007
Цитата: SergPas
IMG]http://D:\ToolBar[/IMG]


баги в форумах ищем чтоли :D

397
22 июля 2007 года
SergPas
527 / / 03.02.2007
Уважаемые господа программисты! !!!
Если объявить стринговый массив таким образом:
 
Код:
Var str:array[0..8] of string=
('New', 'Open', 'Save',
'Cut', 'Copy','Paste',
'Stat', 'Freq', 'Exit');

то работать будет неправильно (см. рисунок)!
Если же он будет объявлен таким образом:
 
Код:
Var str:array[0..8] of string=
                                ('New ','Open','Save',
                                 'Cut ','Copy','Paste',
                                 'Stat','Freq','Exit');

или таким:
 
Код:
Var str:array[0..8] of string=
                                ('New'#0,'Open','Save',
                                 'Cut'#0,'Copy','Paste',
                                 'Stat','Freq','Exit');

то названия кнопок будут соответствовать элементам массива, и никаких названий типа "яяяя" отображаться не будет! Обратите особое внимание на разницу в элементах массивов! И элемент-строка 'New' должна заканчиваться нулём ('New'#0) и элемент-строка 'Cut' также заканчивается нулём ('Cut'#0). Только в этом случае будет работать правильно!!!
Итак, завершающие нуль (#0) надо ставить в конце каждой строки!
Одна проблема решена! Может кто-нибудь поможет со второй?
10
22 июля 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: SergPas
Итак, завершающие нуль (#0) надо ставить в конце каждой строки!


А что мешало описать массив как array of PChar? Пусть компилятор работает, нули добавляет - он электронный.

Не понял, почему ошибка. У тебя что, "Huge strings" {$H+} в настройках компилятора отключены?

397
22 июля 2007 года
SergPas
527 / / 03.02.2007
К сожалению тип PChar в данном случае использовать нельзя. По непонятной мне причине надписи на кнопках появляются в следующем порядке: "New" "Open" "Open" "Save" "Cut" "Copy" "Copy" "Past" "Stat"
Согласитесь, получается белиберда... Именно поэтому пишем array of string и добавляем символ конца строки!!! И ещё, причём здесь "Huge strings"{$H+} ???
19K
23 июля 2007 года
Rost
45 / / 05.07.2007
Цитата: SergPas
К сожалению тип PChar в данном случае использовать нельзя. По непонятной мне причине надписи на кнопках появляются в следующем порядке: "New" "Open" "Open" "Save" "Cut" "Copy" "Copy" "Past" "Stat"
Согласитесь, получается белиберда... Именно поэтому пишем array of string и добавляем символ конца строки!!! И ещё, причём здесь "Huge strings"{$H+} ???


Не причем, т.к. строки у тебя меньше 256. Мне думается что проблемма здесь в том что нужно под все слова выделить одинакового размера строки, а не разные как это почемуто происходит в дельфях (:... делается это помойму так

 
Код:
Var str:array[0..8] of string[COLOR="Red"][32][/COLOR]=('New', 'Open', 'Save',
                                'Cut', 'Copy','Paste',
                                'Stat', 'Freq', 'Exit');
397
24 июля 2007 года
SergPas
527 / / 03.02.2007
Можно и так объявить, но не рекомендую... В C++ несколько проще работать со строками... Если его так объявить, то на практике получим следующее "Cut" "Copy" и т.д. В файле справки по панели инструментов говорится, что каждая строка должна заканчиваться нулём, а последняя- 2-мя нулями.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог